ZGlmZiAtLWdpdCBhL2NzaGFycC8uZ2l0aWdub3JlIGIvY3NoYXJwLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjNDE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNDAgQEAKKyMKKyMgCVVudHJhY2tlZCBkaXJlY3RvcmllcworIworc3JjL0FkZHJlc3NCb29rL2Jpbgorc3JjL0FkZHJlc3NCb29rL29iagorc3JjL1Byb3RvY29sQnVmZmVycy9iaW4vCitzcmMvUHJvdG9jb2xCdWZmZXJzL29iai8KK3NyYy9Qcm90b2NvbEJ1ZmZlcnMvb2JqQ0YKK3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9iaW4vCitzcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3Qvb2JqLworc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9iaW4vCitzcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L29iai8KK3NyYy9Qcm90b0JlbmNoL2Jpbi8KK3NyYy9Qcm90b0JlbmNoL29iai8KK3NyYy9Qcm90b0R1bXAvYmluLworc3JjL1Byb3RvRHVtcC9vYmovCitzcmMvUHJvdG9HZW4vYmluLworc3JjL1Byb3RvR2VuL29iai8KK3NyYy9Qcm90b0dlbi5UZXN0L2Jpbi8KK3NyYy9Qcm90b0dlbi5UZXN0L29iai8KK3NyYy9Qcm90b011bmdlL2Jpbi8KK3NyYy9Qcm90b011bmdlL29iai8KK21vbm8vYmluCittb25vL3RtcAorbW9uby9wcm90b2MKK2J1aWxkX291dHB1dAorYnVpbGRfdGVtcAorYnVpbGQvbXNidWlsZCoubG9nCisKKyMKKyMgCVVudHJhY2tlZCBmaWxlcworIworKi51c2VyCisqLnN1bworX1JlU2hhcnBlci4qCisqLnNsbi5jYWNoZQorbW9uby9UZXN0UmVzdWx0LnhtbAorbW9uby8ubGlicworbW9uby8qLmV4ZQorbW9uby8qLmRsbApkaWZmIC0tZ2l0IGEvY3NoYXJwLy5oZ2lnbm9yZSBiL2NzaGFycC8uaGdpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4ZDE4MwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC8uaGdpZ25vcmUKQEAgLTAsMCArMSwyMyBAQAorc3ludGF4OiBnbG9iDQorDQorYnVpbGRfb3V0cHV0Lw0KK2J1aWxkX3RlbXAvDQorYmluLw0KK29iai8NCisqLmNhY2hlDQorX1JlU2hhcnBlci4qDQorKi51c2VyDQorKi5zdW8NCisqLmJhdA0KKyouemlwDQorKi5Eb3RTZXR0aW5ncw0KK2J1aWxkLyoubG9nDQorQmVuY2htYXJrUmVzdWx0cy50eHQNCisNCitsaWIvTlVuaXQvdG9vbHMvbnVuaXQtY29uc29sZS5leGUuY29uZmlnDQorDQorc3ludGF4OiByZWdleHANCitidWlsZC9cZHsxLDN9XC5cZHsxLDN9XC5cZHsxLDN9XC5cZHsxLDV9Lw0KKw0KKyMgSWdub3JlIFJvc2x5biBmaWxlcw0KK15zcmMvLipcLnNsblwuaWRlLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9DSEFOR0VTLnR4dCBiL2NzaGFycC9DSEFOR0VTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGU5ZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL0NIQU5HRVMudHh0CkBAIC0wLDAgKzEsMTQ0IEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitXZWxjb21lIHRvIHRoZSBDIyBwb3J0IG9mIEdvb2dsZSBQcm90b2NvbCBCdWZmZXJzLCB3cml0dGVuIGJ5IEpvbiBTa2VldAorKHNrZWV0QHBvYm94LmNvbSkgYmFzZWQgb24gdGhlIHdvcmsgb2YgbWFueSB0YWxlbnRlZCBwZW9wbGUuCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcG9ydCwgdmlzaXQgaXRzIGhvbWVwYWdlOgoraHR0cDovL3Byb3RvYnVmLWNzaGFycC1wb3J0Lmdvb2dsZWNvZGUuY29tCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IFByb3RvY29sIEJ1ZmZlcnMgaW4gZ2VuZXJhbCwgdmlzaXQgdGhlIHByb2plY3QgcGFnZSAKK2ZvciB0aGUgQysrLCBKYXZhIGFuZCBQeXRob24gcHJvamVjdDoKK2h0dHA6Ly9wcm90b2J1Zi5nb29nbGVjb2RlLmNvbQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUkVMRUFTRSBOT1RFUyAtIFZlcnNpb24gMi40LjEuNTU1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NoYW5nZXM6CistIFVwZ3JhZGUgc29sdXRpb24gZm9ybWF0IHRvIFZpc3VhbCBTdHVkaW8gMjAxMi4KKy0gQWRkIHRoZSBhYmlsaXR5IHRvIHByaW50IGEgYnVpbGRlciAobm90IGp1c3QgYSBtZXNzYWdlKQorLSBUZXh0R2VuZXJhdG9yIGludHJvZHVjZXMgYSBuZXcgb3ZlcmxvYWQgb2YgUHJpbnRUbworLSBNdW5nZSBwcm90b2MncyBlcnJvciBmb3JtYXQgaW50byBhIFZTLUMjLWNvbXBhdGlibGUgb3V0cHV0IGZvcm1hdC4KKy0gV29yayB0byBtYWtlIFByb3RvR2VuIGNsb25lIHRoYXQgYWN0cyBhcyBhIHByb3RvYy5leGUgcGx1Z2luLgorLSBBZGRlZCB0aGUgQWxsb3dQYXJ0aWFsbHlUcnVzdGVkQ2FsbGVycyBhdHRyaWJ1dGUKKy0gT3B0aW1pemVkIGVudW0gcGFyc2luZy4KKworRml4ZXM6CistIEZpeCBmb3IgYnVnIGluIGxpbWl0ZWQgaW5wdXQgc3RyZWFtJ3MgUG9zaXRpb24sIEludHJvZHVjZWQgUG9zaXRpb24gb24gCisgIG91dHB1dCBzdHJlYW0KKy0gRml4IGZvciB3cml0aW5nIGEgY2hhcmFjdGVyIHRvIGEgSlNPTiBvdXRwdXQgb3ZlcmZsb3dzIGFsbG9jYXRlZCBidWZmZXIKKy0gT3B0aW1pemUgRnJvbUJhc2U2NFN0cmluZyB0byByZXR1cm4gRW1wdHkgd2hlbiBwcmVzZW50ZWQgd2l0aCBlbXB0eSBzdHJpbmcuCistIFVzZSBzdHJpbmcuQ29uY2F0IGluc3RlYWQgb2Ygb3BlcmF0b3IgdG8gYXZvaWQgcG90ZW50aWFsIGltcG9ydCBwcm9ibGVtcworLSBJc3N1ZSA4MTogcXVvdGluZyBmb3IgTlVuaXQgcGFyYW1ldGVycy4KKy0gSXNzdWUgNTY6IE51R2V0IHBhY2thZ2UgaXMgbm9pc3kKKy0gSXNzdWUgNzA6IFBvcnRhYmxlIGxpYnJhcnkgcHJvamVjdCBoYXMgc29tZSBpbnZhbGlkIE51bml0LWJhc2VkIGNvZGUuCistIElzc3VlIDcxOiBDb2RlZElucHV0U3RyZWFtLlJlYWRCeXRlcyBnbyB0byBzbG93IHBhdGggdW5uZWNlc3NhcmlseQorLSBJc3N1ZSA4NDogd2FybmluZyBDUzAyMTk6IFRoZSB2YXJpYWJsZSBgc2l6ZScgaXMgYXNzaWduZWQgYnV0IG5ldmVyIHVzZWQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUkVMRUFTRSBOT1RFUyAtIFZlcnNpb24gMi40LjEuNTIxCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NoYW5nZXM6CistIEFkZCBnZW5lcmF0ZWRfY29kZV9hdHRyaWJ1dGVzIG9wdGlvbiwgZGVmYXVsdGVkIHRvIGZhbHNlCistIEFkZGVkIHN1cHBvcnQgZm9yIFBvcnRhYmxlIGxpYnJhcnkKKy0gQWRkZWQgJ1Vuc2FmZScgc3RhdGljIHR5cGUgaW4gQnl0ZVN0cmluZyB0byBhbGxvdyBkaXJlY3QgYnVmZmVyIGFjY2VzcworCitGaXhlczoKKy0gSXNzdWUgNTA6IFRoZSBYTUwgc2VyaWFsaXplciB3aWxsIGZhaWwgdG8gZGVzZXJpYWxpemUgYSBtZXNzYWdlIHdpdGggZW1wdHkgCisgIGNoaWxkIG1lc3NhZ2UKKy0gSXNzdWUgNDU6IFVzZSBvZiAnaXRlbScgYXMgYSBmaWVsZCBuYW1lIGNhdXNlcyBBbWJpZ3VvdXNNYXRjaEV4Y2VwdGlvbgorLSBJc3N1ZSA0OTogR2VuZXJhdGVkIG5lc3RlZCBzdGF0aWMgVHlwZXMgY2xhc3Mgc2hvdWxkIGJlIHBhcnRpYWwKKy0gSXNzdWUgMzg6IERpc2FibGUgQ0xTQ29tcGxpYW50IHdhcm5pbmdzICgzMDIxKQorLSBJc3N1ZSA0MDogcHJvdG9fcGF0aCBkb2VzIG5vdCB3b3JrIGZvciBjb21tYW5kLWxpbmUgZmlsZSBuYW1lcworLSBJc3N1ZSA1NDogc2hvdWxkIHJldGlyZSBhbGwgYnl0ZXMgaW4gYnVmZmVyIChidWZmZXJTaXplKQorLSBJc3N1ZSA0MzogRml4IHRvIGNvcnJlY3QgaWRlbnRpY2FsICd1bWJyZWxsYV9jbGFzc25hbWUnIG9wdGlvbnMgZnJvbSB0cnlpbmcgCisgIHRvIHdyaXRlIHRvIHRoZSBzYW1lIGZpbGVuYW1lLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSRUxFQVNFIE5PVEVTIC0gVmVyc2lvbiAyLjQuMS40NzMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRmVhdHVyZXM6CistIEFkZGVkIG9wdGlvbiBzZXJ2aWNlX2dlbmVyYXRvcl90eXBlIHRvIGNvbnRyb2wgc2VydmljZSBnZW5lcmF0aW9uIHdpdGgKKyAgTk9ORSwgR0VORVJJQywgSU5URVJGQUNFLCBvciBJUlBDRElTUEFUQ0gKKy0gQWRkZWQgaW50ZXJmYWNlcyBJUnBjRGlzcGF0Y2ggYW5kIElScGNTZXJ2ZXJTdHViIHRvIHByb3ZpZGUgZm9yIGJsb2NraW5nCisgIHNlcnZpY2VzIGFuZCBpbXBsZW1lbnRhdGlvbnMuCistIEFkZGVkIFByb3RvR2VuLmV4ZSBjb21tYW5kLWxpbmUgYXJndW1lbnQgIi0tcHJvdG9jX2Rpcj0iIHRvIHNwZWNpZnkgdGhlIAorICBsb2NhdGlvbiBvZiBwcm90b2MuZXhlLgorLSBFeHRyYWN0ZWQgaW50ZXJmYWNlcyBmb3IgSUNvZGVkSW5wdXRTdHJlYW0gYW5kIElDb2RlZE91dHB1dFN0cmVhbSB0byBhbGxvdworICBjdXN0b20gaW1wbGVtZW50YXRpb24gb2Ygd3JpdGVycyB3aXRoIGJvdGggc3BlZWQgYW5kIHNpemUgb3B0aW1pemF0aW9ucy4KKy0gQWRkaXRpb24gb2YgdGhlICJHb29nbGUuUHJvdG9CdWZmZXJzLlNlcmlhbGl6YXRpb24iIGFzc2VtYmx5IHRvIHN1cHBvcnQKKyAgcmVhZGluZyBhbmQgd3JpdGluZyBtZXNzYWdlcyB0by9mcm9tIFhNTCwgSlNPTiwgSURpY3Rpb25hcnk8LD4gYW5kIG90aGVycy4KKy0gU2V2ZXJhbCBwZXJmb3JtYW5jZSByZWxhdGVkIGZpeGVzIGFuZCB0d2Vla3MKKy0gSXNzdWUgMzoJQWRkIG9wdGlvbiB0byBtYXJrIGdlbmVyYXRlZCBjb2RlIHdpdGggYXR0cmlidXRlCistIElzc3VlIDIwOglTdXBwb3J0IGZvciBkZWNvcmF0aW5nIGNsYXNzZXMgW1NlcmlhbGl6YWJsZV0KKy0gSXNzdWUgMjE6CURlY29yYXRlIGZpZWxkcyB3aXRoIFtkZXByZWNhdGVkPXRydWVdIGFzIFtTeXN0ZW0uT2Jzb2xldGVdCistIElzc3VlIDIyOglSZXVzYWJsZSBCdWlsZGVyIGNsYXNzZXMKKy0gSXNzdWUgMjQ6CVN1cHBvcnQgZm9yIHVzaW5nIEpzb24vWG1sIGZvcm1hdHMgd2l0aCBJQ29kZWRJbnB1dFN0cmVhbQorLSBJc3N1ZSAyNTogQWRkZWQgc3VwcG9ydCBmb3IgTnVHZXQgcGFja2FnZXMKKy0gSXNzdWUgMzE6IFVwZ3JhZGVkIHByb3RvYy5leGUgYW5kIGRlc2NyaXB0b3IgdG8gMi40LjEKKworRml4ZXM6CistIElzc3VlIDEzOglNZXNzYWdlIHdpdGggRmllbGQgc2FtZSBuYW1lIGFzIG1lc3NhZ2UgY2F1c2VzIHVuY29tcGlsYWJsZSAuY3MKKy0gSXNzdWUgMTY6CURvZXMgbm90IGludGVncmF0ZSB3ZWxsIHdpdGggb3RoZXIgdG9vbGluZworLSBJc3N1ZSAxOToJU3VwcG9ydCBmb3IgbmVnYXRpdmUgZW51bSB2YWx1ZXMKKy0gSXNzdWUgMjY6CUFkZFJhbmdlIGluIEdlbmVyYXRlZEJ1aWxkZXIgaXRlcmF0ZXMgdHdpY2UuCistIElzc3VlIDI3OglSZW1vdmUgWE1MIGRvY3VtZW50YXRpb24gb3V0cHV0IGZyb20gdGVzdCBwcm9qZWN0cyB0byBjbGVhciAKKyAgd2FybmluZ3MvZXJyb3JzLgorLSBJc3N1ZSAyODogQ2lyY3VsYXIgbWVzc2FnZSBkZXBlbmRlbmNpZXMgcmVzdWx0IGluIG51bGwgZGVmYXVsdCB2YWx1ZXMgZm9yIAorICBNZXNzYWdlIGZpZWxkcy4KKy0gSXNzdWUgMjk6IE1lc3NhZ2UgY2xhc3NlcyBnZW5lcmF0ZWQgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgWW91CisgIGNhbiBkaXNhYmxlIHByaXZhdGUgY3RvciBnZW5lcmF0aW9uIHdpdGggdGhlIG9wdGlvbiBnZW5lcmF0ZV9wcml2YXRlX2N0b3IuCistIElzc3VlIDM1OiBGaXhlZCBhIGJ1ZyBpbiBQcm90b0dlbiBoYW5kbGluZyBvZiBhcmd1bWVudHMgd2l0aCB0cmFpbGluZyBcCistIEJpZy1lbmRpYW4gc3VwcG9ydCBmb3IgZmxvYXQsIGFuZCBkb3VibGUgb24gU2lsdmVybGlnaHQKKy0gUGFja2VkIGFuZCBVbnBhY2tlZCBwYXJzaW5nIGFsbG93IGZvciBhbGwgcmVwZWF0ZWQsIGFzIHBlciB2ZXJzaW9uIDIuMworLSBGaXggZm9yIGxlYXZpbmcgQnVpbGRlciBhIHB1YmxpYyBjdG9yIG9uIGludGVybmFsIGNsYXNzZXMgZm9yIHVzZSB3aXRoCisgIGdlbmVyaWMgIndoZXJlIFQ6IG5ldygpIiBjb25zdHJhaW50cy4KKworT3RoZXI6CistIENoYW5nZWQgdGhlIGNvZGUgc2lnbmluZyBrZXkgdG8gYSBwcml2YXRlbHkgaGVsZCBrZXkKKy0gUmVmb3JtYXR0ZWQgYWxsIGNvZGUgYW5kIGxpbmUtZW5kaW5ncyB0byBDIyBkZWZhdWx0cworLSBSZXdvcmtpbmcgb2YgcGVyZm9ybWFuY2UgYmVuY2htYXJrcyB0byBwcm9kdWNlIHJlbGlhYmxlIHJlc3VsdHMsIG9wdGlvbiAvdjIKKy0gSXNzdWUgMzQ6IFNpbHZlcmxpZ2h0IGFzc2VtYmxpZXMgYXJlIG5vdyB1bml0IHRlc3RlZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSRUxFQVNFIE5PVEVTIC0gVmVyc2lvbiAyLjMuMC4yNzcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRmVhdHVyZXM6CistIEFkZGVkIGNsc19jb21wbGlhbmNlIG9wdGlvbiB0byBnZW5lcmF0ZSBhdHRyaWJ1dGVzIGluZGljYXRpbmcgCisgIG5vbi1DTFMtY29tcGxpYW5jZS4KKy0gQWRkZWQgZmlsZV9leHRlbnNpb24gb3B0aW9uIHRvIGNvbnRyb2wgdGhlIGdlbmVyYXRlZCBvdXRwdXQgZmlsZSdzIGV4dGVuc2lvbi4KKy0gQWRkZWQgdW1icmVsbGFfbmFtZXNwYWNlIG9wdGlvbiB0byBwbGFjZSB0aGUgdW1icmVsbGEgY2xhc3MgaW50byBhIG5lc3RlZAorICBuYW1lc3BhY2UgdG8gYWRkcmVzcyBpc3N1ZXMgd2l0aCBwcm90byBmaWxlcyBoYXZpbmcgdGhlIHNhbWUgbmFtZSBhcyBhIAorICBtZXNzYWdlIGl0IGNvbnRhaW5zLgorLSBBZGRlZCBvdXRwdXRfZGlyZWN0b3J5IG9wdGlvbiB0byBzZXQgdGhlIG91dHB1dCBwYXRoIGZvciB0aGUgc291cmNlIGZpbGUocykuCistIEFkZGVkIGlnbm9yZV9nb29nbGVfcHJvdG9idWYgb3B0aW9uIHRvIGF2b2lkIGdlbmVyYXRpbmcgY29kZSBmb3IgaW5jbHVkZXMgCisgIGZyb20gdGhlIGdvb2dsZS5wcm90b2J1ZiBwYWNrYWdlLgorLSBBZGRlZCB0aGUgTElURSBmcmFtZXdvcmsgKEdvb2dsZS5Qcm90b0J1ZmZlcnNMaXRlLmRsbCkgYW5kIHRoZSBhYmlsaXR5IHRvCisgIGdlbmVyYXRlIGNvZGUgd2l0aCAib3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsiLgorLSBBZGRlZCBhYmlsaXR5IHRvIGludm9rZSBwcm90b2MuZXhlIGZyb20gd2l0aGluIFByb3RvR2VuLmV4ZS4KKy0gVXBncmFkZWQgdG8gcHJvdG9jLmV4ZSAoMi4zKSBjb21waWxlci4KKworRml4ZXM6CistIElzc3VlIDk6CUNsYXNzIGNhbm5vdCBiZSBzdGF0aWMgYW5kIHNlYWxlZCBlcnJvcgorLSBJc3N1ZSAxMjoJZGVmYXVsdCB2YWx1ZSBmb3IgZW51bWVyYXRlIGZpZWxkcyBtdXN0IGJlIGZpbGxlZCBvdXQKKworT3RoZXI6CistIFJld3JpdGUgb2YgYnVpbGQgdXNpbmcgTVNCYnVpbGQgaW5zdGVhZCBvZiBOQW50CistIE1vdmVkIHRvIE5Vbml0IFZlcnNpb24gMi4yLjguMAorLSBDaGFuZ2VkIHRvIHVzaW5nIHNlY3VyZSAuc25rIGZvciByZWxlYXNlcworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSRUxFQVNFIE5PVEVTIC0gVmVyc2lvbiAwLjkuMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaXhlczoKKy0gaXNzdWUgMTA6CUluY29ycmVjdCBlbmNvZGluZyBvZiBwYWNrZWQgZmllbGRzIHdoZW4gc2VyaWFsaXplZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSRUxFQVNFIE5PVEVTIC0gVmVyc2lvbiAwLjkuMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCistIEluaXRpYWwgcmVsZWFzZQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL1JFQURNRS5tZCBiL2NzaGFycC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0NDA2MgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9SRUFETUUubWQKQEAgLTAsMCArMSwxMiBAQAorVGhpcyByZXBvIHdhcyBvcmlnaW5hbGx5IGV4cG9ydGVkIGZyb20gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLWNzaGFycC1wb3J0LAorYW5kIHJlcHJlc2VudHMgdGhlIGxhdGVzdCAibGVnYWN5IiB2ZXJzaW9uIG9mIHByb3RvYnVmLWNzaGFycC1wb3J0LgorCitUaGlzIHByb2plY3QgaGFzIG5vdyBiZWVuIGZvbGRlZCBpbnRvIHRoZSBbbWFpbiBHb29nbGUgUHJvdG9jb2wgQnVmZmVycyBwcm9qZWN0XShodHRwOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYpLAorYW5kIGlzIGJlaW5nIHJldmFtcGVkIHRvIHN1cHBvcnQgcHJvdG8zLiBJdCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgZnVsbHkgYmFja3dhcmRseS1jb21wYXRpYmxlIHdpdGgKK3RoZSBjb2RlIGluIHRoaXMgcmVwbyAtIGluIHBhcnRpY3VsYXIsIHNvbWUgb2YgdGhlIEMjLXNwZWNpZmljIG9wdGlvbnMgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgaW4gdGhlIG5ldworY29kZWJhc2UsIGFuZCBzb21lIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSBtYXkgZGlmZmVyLiBBIG5ldyBtYWpvciB2ZXJzaW9uIG9mZmVycyBhbiBvcHBvcnR1bml0eSB0byBzcHJpbmctY2xlYW4sCithcyBpdCB3ZXJlLgorCitUaGlzIHJlcG8gZXhpc3RzIGFzIGFuIGFja25vd2xlZGdlbWVudCB0aGF0IG5vdCBldmVyeW9uZSB3aWxsIHdhbnQgdG8gaW1tZWRpYXRlbHkgdXNlIHRoZSBuZXdlciBjb2RlYmFzZSwKK2FuZCB0aGF0IHRoZXkgbWF5IHdpc2ggdG8gbWFrZSBjaGFuZ2VzIHRvIHRoZSBsZWdhY3kgY29kZWJhc2UuIEkgZG8gbm90IGV4cGVjdCB0byBtYWtlIGFueSBjaGFuZ2VzIHdpdGhpbiB0aGlzCityZXBvLCBidXQgaXQgY2FuIGJlIGZvcmtlZCBmb3IgZnVydGhlciBjaGFuZ2VzLgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2J1aWxkL0J1aWxkQWxsLmJhdCBiL2NzaGFycC9idWlsZC9CdWlsZEFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlZTczYwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9idWlsZC9CdWlsZEFsbC5iYXQKQEAgLTAsMCArMSw4IEBACitAZWNobyBvZmYNCitTRVQgQlVJTERfVEFSR0VUPSV+MQ0KK1NFVCBCVUlMRF9DT05GSUc9JX4yDQorDQorSUYgIiVCVUlMRF9UQVJHRVQlIj09IiIgU0VUIEJVSUxEX1RBUkdFVD1SZWJ1aWxkDQorSUYgIiVCVUlMRF9DT05GSUclIj09IiIgU0VUIEJVSUxEX0NPTkZJRz1EZWJ1Zw0KKw0KK0NNRC5leGUgL1EgL0MgIkNEICV+ZHAwICYmICVXSU5ESVIlXE1pY3Jvc29mdC5ORVRcRnJhbWV3b3JrXHY0LjAuMzAzMTlcTVNCdWlsZC5leGUgL25vbG9nbyBidWlsZC5jc3Byb2ogL3Q6JUJVSUxEX1RBUkdFVCUgL3Rvb2xzdmVyc2lvbjo0LjAgIi9wOkNvbmZpZ3VyYXRpb249JUJVSUxEX0NPTkZJRyUiICUzICU0ICU1ICU2DQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2J1aWxkL0NvbW1vbi50YXJnZXRzIGIvY3NoYXJwL2J1aWxkL0NvbW1vbi50YXJnZXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTc0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvYnVpbGQvQ29tbW9uLnRhcmdldHMKQEAgLTAsMCArMSwxMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVGFyZ2V0cyBGb3IgQ2xlYW4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDxUYXJnZXQgTmFtZT0iX0NsZWFuRm9sZGVyIj4KKyAgICA8TWVzc2FnZSBJbXBvcnRhbmNlPSJub3JtYWwiIFRleHQ9IlJlbW92aW5nIHRlbXBvcmFyeSBkaXJlY3RvcnkgJyQoQ2xlYW5Gb2xkZXJEaXJlY3RvcnkpJyIvPgorICAgIDxFcnJvciBUZXh0PSJDYW4gbm90IHJlbW92ZSBlbXB0eSBkaXJlY3RvcnkgbmFtZS4iIENvbmRpdGlvbj0iICckKENsZWFuRm9sZGVyRGlyZWN0b3J5KScgPT0gJycgIiAvPgorCisgICAgPEV4ZWMgV29ya2luZ0RpcmVjdG9yeT0iJChNU0J1aWxkUHJvamVjdERpcmVjdG9yeSkiIENvbmRpdGlvbj0iRXhpc3RzKCQoQ2xlYW5Gb2xkZXJEaXJlY3RvcnkpKSIgT3V0cHV0cz0iQChJZ25vcmUpIgorICAgICAgQ29tbWFuZD0iTU9WRSAvWSAmcXVvdDskKENsZWFuRm9sZGVyRGlyZWN0b3J5KSZxdW90OyAmcXVvdDskKENsZWFuRm9sZGVyRGlyZWN0b3J5KS1kZWxldGVkJnF1b3Q7ID4gTlVMIiAvPgorICAgIAorICAgIDxSZW1vdmVEaXIgRGlyZWN0b3JpZXM9IiQoQ2xlYW5Gb2xkZXJEaXJlY3RvcnkpLWRlbGV0ZWQiIENvbmRpdGlvbj0iRXhpc3RzKCckKENsZWFuRm9sZGVyRGlyZWN0b3J5KS1kZWxldGVkJykiIC8+CisgIDwvVGFyZ2V0PgorCisgIDxUYXJnZXQgTmFtZT0iX0NsZWFuVGVtcE91dHB1dCI+CisgICAgPE1TQnVpbGQgUHJvamVjdHM9IiQoTVNCdWlsZFByb2plY3RGdWxsUGF0aCkiIFByb3BlcnRpZXM9IkNsZWFuRm9sZGVyRGlyZWN0b3J5PSUoVGVtcEJ1aWxkRm9sZGVyLklkZW50aXR5KTsiIFRhcmdldHM9Il9DbGVhbkZvbGRlciIgLz4KKyAgPC9UYXJnZXQ+CisgIAorICA8VGFyZ2V0IE5hbWU9Il9DbGVhbkFsbCIgRGVwZW5kc09uVGFyZ2V0cz0iX0NsZWFuVGVtcE91dHB1dCI+CisgICAgPE1ha2VEaXIgRGlyZWN0b3JpZXM9IiQoQnVpbGRUZW1wRGlyZWN0b3J5KSIgLz4KKyAgICA8TWFrZURpciBEaXJlY3Rvcmllcz0iJChCdWlsZE91dHB1dERpcmVjdG9yeSkiIC8+CisgIDwvVGFyZ2V0PgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1RhcmdldHMgRm9yIEJ1aWxkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8VGFyZ2V0IE5hbWU9Il9Db21waWxlQWxsIj4KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iJChNU0J1aWxkUHJvamVjdEZ1bGxQYXRoKSIgUHJvcGVydGllcz0iU29sdXRpb25UYXJnZXQ9UmVidWlsZDsiIFRhcmdldHM9Il9CdWlsZEFsbENvbmZpZ3VyYXRpb25zIiAvPgorICA8L1RhcmdldD4KKworICA8VGFyZ2V0IE5hbWU9Il9CdWlsZEFsbENvbmZpZ3VyYXRpb25zIj4KKyAgICA8TVNCdWlsZCBQcm9wZXJ0aWVzPSJUYXJnZXRWZXJzaW9uPWNmMjA7Q29uZmlndXJhdGlvbj0kKENvbmZpZ3VyYXRpb24pO1BsYXRmb3JtPSQoUGxhdGZvcm0pOyIgVGFyZ2V0cz0iJChTb2x1dGlvblRhcmdldCkiIFByb2plY3RzPSIkKE1TQnVpbGRQcm9qZWN0RGlyZWN0b3J5KVx0YXJnZXQuY3Nwcm9qIiAvPgorICAgIDxNU0J1aWxkIFByb3BlcnRpZXM9IlRhcmdldFZlcnNpb249Y2YzNTtDb25maWd1cmF0aW9uPSQoQ29uZmlndXJhdGlvbik7UGxhdGZvcm09JChQbGF0Zm9ybSk7IiBUYXJnZXRzPSIkKFNvbHV0aW9uVGFyZ2V0KSIgUHJvamVjdHM9IiQoTVNCdWlsZFByb2plY3REaXJlY3RvcnkpXHRhcmdldC5jc3Byb2oiIC8+CisgICAgPE1TQnVpbGQgUHJvcGVydGllcz0iVGFyZ2V0VmVyc2lvbj1uZXQyMDtDb25maWd1cmF0aW9uPSQoQ29uZmlndXJhdGlvbik7UGxhdGZvcm09JChQbGF0Zm9ybSk7IiBUYXJnZXRzPSIkKFNvbHV0aW9uVGFyZ2V0KSIgUHJvamVjdHM9IiQoTVNCdWlsZFByb2plY3REaXJlY3RvcnkpXHRhcmdldC5jc3Byb2oiIC8+CisgICAgPE1TQnVpbGQgUHJvcGVydGllcz0iVGFyZ2V0VmVyc2lvbj1uZXQzNTtDb25maWd1cmF0aW9uPSQoQ29uZmlndXJhdGlvbik7UGxhdGZvcm09JChQbGF0Zm9ybSk7IiBUYXJnZXRzPSIkKFNvbHV0aW9uVGFyZ2V0KSIgUHJvamVjdHM9IiQoTVNCdWlsZFByb2plY3REaXJlY3RvcnkpXHRhcmdldC5jc3Byb2oiIC8+CisgICAgPE1TQnVpbGQgUHJvcGVydGllcz0iVGFyZ2V0VmVyc2lvbj1uZXQ0MDtDb25maWd1cmF0aW9uPSQoQ29uZmlndXJhdGlvbik7UGxhdGZvcm09JChQbGF0Zm9ybSk7IiBUYXJnZXRzPSIkKFNvbHV0aW9uVGFyZ2V0KSIgUHJvamVjdHM9IiQoTVNCdWlsZFByb2plY3REaXJlY3RvcnkpXHRhcmdldC5jc3Byb2oiIC8+CisgICAgPE1TQnVpbGQgUHJvcGVydGllcz0iVGFyZ2V0VmVyc2lvbj1zbDIwO0NvbmZpZ3VyYXRpb249JChDb25maWd1cmF0aW9uKTtQbGF0Zm9ybT0kKFBsYXRmb3JtKTsiIFRhcmdldHM9IiQoU29sdXRpb25UYXJnZXQpIiBQcm9qZWN0cz0iJChNU0J1aWxkUHJvamVjdERpcmVjdG9yeSlcdGFyZ2V0LmNzcHJvaiIgLz4KKyAgICA8TVNCdWlsZCBQcm9wZXJ0aWVzPSJUYXJnZXRWZXJzaW9uPXNsMzA7Q29uZmlndXJhdGlvbj0kKENvbmZpZ3VyYXRpb24pO1BsYXRmb3JtPSQoUGxhdGZvcm0pOyIgVGFyZ2V0cz0iJChTb2x1dGlvblRhcmdldCkiIFByb2plY3RzPSIkKE1TQnVpbGRQcm9qZWN0RGlyZWN0b3J5KVx0YXJnZXQuY3Nwcm9qIiAvPgorICAgIDxNU0J1aWxkIFByb3BlcnRpZXM9IlRhcmdldFZlcnNpb249c2w0MDtDb25maWd1cmF0aW9uPSQoQ29uZmlndXJhdGlvbik7UGxhdGZvcm09JChQbGF0Zm9ybSk7IiBUYXJnZXRzPSIkKFNvbHV0aW9uVGFyZ2V0KSIgUHJvamVjdHM9IiQoTVNCdWlsZFByb2plY3REaXJlY3RvcnkpXHRhcmdldC5jc3Byb2oiIC8+CisgICAgPE1TQnVpbGQgUHJvcGVydGllcz0iVGFyZ2V0VmVyc2lvbj1wbDQwO0NvbmZpZ3VyYXRpb249JChDb25maWd1cmF0aW9uKTtQbGF0Zm9ybT0kKFBsYXRmb3JtKTsiIFRhcmdldHM9IiQoU29sdXRpb25UYXJnZXQpIiBQcm9qZWN0cz0iJChNU0J1aWxkUHJvamVjdERpcmVjdG9yeSlcdGFyZ2V0LmNzcHJvaiIgLz4KKyAgPC9UYXJnZXQ+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVGFyZ2V0cyBGb3IgVG9vbHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDxUYXJnZXQgTmFtZT0iX0J1aWxkVG9vbHMiPgorICAgIAorICAgIDxNU0J1aWxkIFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjMuNSIgUHJvamVjdHM9IiQoUHJvamVjdERpcmVjdG9yeSlcc3JjXFByb3RvY29sQnVmZmVycy5zbG4iIFByb3BlcnRpZXM9IkNvbmZpZ3VyYXRpb249UmVsZWFzZTtQbGF0Zm9ybT1BbnkgQ1BVOyIgLz4KKyAgICA8Q29weSBTb3VyY2VGaWxlcz0iJShUb29sc091dHB1dEl0ZW0uSWRlbnRpdHkpIiBEZXN0aW5hdGlvbkZvbGRlcj0iJChCdWlsZE91dHB1dERpcmVjdG9yeSlcdG9vbHMiIC8+CisKKyAgICA8Q29weSBTb3VyY2VGaWxlcz0iJChMaWJEaXJlY3RvcnkpXE5Vbml0LWNvbmZpZ1xudW5pdC1jb25zb2xlLnYyLjAuY29uZmlnIiBEZXN0aW5hdGlvbkZpbGVzPSIkKE5Vbml0RXhlUGF0aCkuY29uZmlnIiAvPgorICAgIDxFeGVjIAorICAgICAgV29ya2luZ0RpcmVjdG9yeT0iJShUb29sc1Rlc3RDb250YWluZXIuUm9vdERpciklKFRvb2xzVGVzdENvbnRhaW5lci5EaXJlY3RvcnkpIgorICAgICAgQ29tbWFuZD0iJnF1b3Q7JChOVW5pdEV4ZVBhdGgpJnF1b3Q7IC9ub2xvZ28gL25vc2hhZG93ICZxdW90OyUoVG9vbHNUZXN0Q29udGFpbmVyLklkZW50aXR5KSZxdW90OyAveG1sOiZxdW90OyQoQnVpbGRUZW1wRGlyZWN0b3J5KVwlKFRvb2xzVGVzdENvbnRhaW5lci5GaWxlbmFtZSkueG1sJnF1b3Q7IiAvPgorICAgIAorICA8L1RhcmdldD4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUYXJnZXRzIEZvciBHZW5lcmF0ZVNvdXJjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPFRhcmdldCBOYW1lPSJfR2VuZXJhdGVQcm9qZWN0cyI+CisgICAgPEV4ZWMgQ29tbWFuZD0iJnF1b3Q7JChDc1Byb2plY3RQcm9qZWN0b3IpJnF1b3Q7IGNzcHJval90ZW1wbGF0ZXMgc3JjXFByb3RvY29sQnVmZmVyc0xpYnJhcnkuc2xuIiBXb3JraW5nRGlyZWN0b3J5PSIkKFByb2plY3REaXJlY3RvcnkpIiAvPgorICA8L1RhcmdldD4KKyAgCisgIDxUYXJnZXQgTmFtZT0iX0NsZWFuVGVtcFNvdXJjZSI+CisgICAgPE1TQnVpbGQgUHJvamVjdHM9IiQoTVNCdWlsZFByb2plY3RGdWxsUGF0aCkiIFByb3BlcnRpZXM9IkNsZWFuRm9sZGVyRGlyZWN0b3J5PSQoU291cmNlVGVtcERpcmVjdG9yeSk7IiBUYXJnZXRzPSJfQ2xlYW5Gb2xkZXIiIC8+CisgICAgPE1ha2VEaXIgRGlyZWN0b3JpZXM9IiQoU291cmNlVGVtcERpcmVjdG9yeSkiIC8+CisgIDwvVGFyZ2V0PgorICAKKyAgPFRhcmdldCBOYW1lPSJfR2VuZXJhdGVTb3VyY2UiIERlcGVuZHNPblRhcmdldHM9Il9DbGVhblRlbXBTb3VyY2UiPgorICAgIDxNZXNzYWdlIEltcG9ydGFuY2U9ImhpZ2giIFRleHQ9IkdlbmVyYXRpbmcgc291cmNlIGZyb20gcHJvdG8gZmlsZXMiIC8+CisgICAgPEV4ZWMgQ29tbWFuZD0iJnF1b3Q7JChQcm90b2NFeGVQYXRoKSZxdW90OyAtLXByb3RvX3BhdGg9JChQcm90b3NEaXJlY3RvcnkpIC0tZGVzY3JpcHRvcl9zZXRfb3V0PWNvbXBpbGVkLnBiIEAoUHJvdG9zLT4nJShSZWxhdGl2ZURpciklKEZpbGVuYW1lKSUoRXh0ZW5zaW9uKScsICcgJykiIFdvcmtpbmdEaXJlY3Rvcnk9IiQoU291cmNlVGVtcERpcmVjdG9yeSkiIC8+CisgICAgPEV4ZWMgQ29tbWFuZD0iJnF1b3Q7JChQcm90b2dlbkV4ZVBhdGgpJnF1b3Q7IGNvbXBpbGVkLnBiIiBXb3JraW5nRGlyZWN0b3J5PSIkKFNvdXJjZVRlbXBEaXJlY3RvcnkpIiAvPgorICA8L1RhcmdldD4KKworICA8VGFyZ2V0IE5hbWU9Il9Db3B5R2VuZXJhdGVkU291cmNlIiBEZXBlbmRzT25UYXJnZXRzPSJfR2VuZXJhdGVTb3VyY2UiPgorICAgIDxDb3B5IFNvdXJjZUZpbGVzPSIlKEdlbmVyYXRlZFNvdXJjZS5JZGVudGl0eSkiIERlc3RpbmF0aW9uRmlsZXM9IiUoR2VuZXJhdGVkU291cmNlLlRhcmdldERpcmVjdG9yeSlcJShHZW5lcmF0ZWRTb3VyY2UuRmlsZW5hbWUpJShHZW5lcmF0ZWRTb3VyY2UuRXh0ZW5zaW9uKSIgLz4KKyAgPC9UYXJnZXQ+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVGFyZ2V0cyBGb3IgUGFja2FnZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPFRhcmdldCBOYW1lPSJfUGFja2FnZUFsbCI+CisgICAgPE1TQnVpbGQgUHJvamVjdHM9IiQoTVNCdWlsZFByb2plY3RGdWxsUGF0aCkiIFByb3BlcnRpZXM9IlNvbHV0aW9uVGFyZ2V0PV9QdWJsaXNoOyIgVGFyZ2V0cz0iX0J1aWxkQWxsQ29uZmlndXJhdGlvbnMiIC8+CisgIDwvVGFyZ2V0PgorCisgIDxUYXJnZXQgTmFtZT0iX0dlbmVyYXRlUGFja2FnZSI+CisgICAgPENvcHkgU291cmNlRmlsZXM9IkAoU3RhdGljUGFja2FnZUl0ZW0pIiBEZXN0aW5hdGlvbkZvbGRlcj0iJChCdWlsZE91dHB1dFBhY2thZ2UpXCUoU3RhdGljUGFja2FnZUl0ZW0uVGFyZ2V0RGlyZWN0b3J5KVwlKFN0YXRpY1BhY2thZ2VJdGVtLlJlY3Vyc2l2ZURpcikiIC8+CisgICAgPEV4ZWMgQ29tbWFuZD0iJnF1b3Q7JChaaXBFeGVQYXRoKSZxdW90OyBhIC10emlwICQoQnVpbGRUZW1wRGlyZWN0b3J5KVwkKFBhY2thZ2VOYW1lKS1iaW5hcmllcy56aXAgKiAteCEqLnBkYiAtciIgV29ya2luZ0RpcmVjdG9yeT0iJChCdWlsZE91dHB1dFBhY2thZ2UpIiAvPgorICAgIDxFeGVjIENvbW1hbmQ9IiZxdW90OyQoWmlwRXhlUGF0aCkmcXVvdDsgYSAtdHppcCAkKEJ1aWxkVGVtcERpcmVjdG9yeSlcJChQYWNrYWdlTmFtZSktc3ltYm9scy56aXAgKiAtciIgV29ya2luZ0RpcmVjdG9yeT0iJChCdWlsZE91dHB1dFBhY2thZ2UpIiAvPgorICA8L1RhcmdldD4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUYXJnZXRzIEZvciBCZW5jaG1hcmsKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDxUYXJnZXQgTmFtZT0iX1J1bkJlbmNobWFya3MiPgorICAgIDxJdGVtR3JvdXA+CisgICAgICA8QmVuY2htYXJrUGFyYW1ldGVyIEluY2x1ZGU9Ikdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTEsUHJvdG9CZW5jaCIgLz4KKyAgICAgIDxCZW5jaG1hcmtQYXJhbWV0ZXIgSW5jbHVkZT0iZ29vZ2xlX21lc3NhZ2UxLmRhdCIgLz4KKyAgICAgIDxCZW5jaG1hcmtQYXJhbWV0ZXIgSW5jbHVkZT0iR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTEsUHJvdG9CZW5jaCIgLz4KKyAgICAgIDxCZW5jaG1hcmtQYXJhbWV0ZXIgSW5jbHVkZT0iZ29vZ2xlX21lc3NhZ2UxLmRhdCIgLz4KKyAgICAgIDxCZW5jaG1hcmtQYXJhbWV0ZXIgSW5jbHVkZT0iR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMixQcm90b0JlbmNoIiAvPgorICAgICAgPEJlbmNobWFya1BhcmFtZXRlciBJbmNsdWRlPSJnb29nbGVfbWVzc2FnZTIuZGF0IiAvPgorICAgICAgPEJlbmNobWFya1BhcmFtZXRlciBJbmNsdWRlPSJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMixQcm90b0JlbmNoIiAvPgorICAgICAgPEJlbmNobWFya1BhcmFtZXRlciBJbmNsdWRlPSJnb29nbGVfbWVzc2FnZTIuZGF0IiAvPgorICAgIDwvSXRlbUdyb3VwPgorCisgICAgPE1lc3NhZ2UgVGV4dD0iUnVubmluZyBQcm90b0JlbmNoLmV4ZSIgLz4KKyAgICA8RXhlYyBDb21tYW5kPSJQcm90b0JlbmNoLmV4ZSAkKEJlbmNobWFya0FyZ3MpIEAoQmVuY2htYXJrUGFyYW1ldGVyLT4nJShJZGVudGl0eSknLCAnICcpICZxdW90Oy9sb2c6JChCZW5jaG1hcmtPdXRwdXRGaWxlKSZxdW90OyIKKyAgICAgICAgICBXb3JraW5nRGlyZWN0b3J5PSIkKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9CZW5jaFxiaW5cTkVUMzVcUmVsZWFzZSIgLz4KKworICA8L1RhcmdldD4KKworPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9idWlsZC9Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLm51c3BlYyBiL2NzaGFycC9idWlsZC9Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLm51c3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzU1Y2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2J1aWxkL0dvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMubnVzcGVjCkBAIC0wLDAgKzEsNTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHBhY2thZ2UgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249Im51c3BlYy54c2QiPgorICA8bWV0YWRhdGE+CisgICAgPGlkPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L2lkPgorICAgIDx2ZXJzaW9uPiR2ZXJzaW9uJDwvdmVyc2lvbj4KKyAgICA8b3duZXJzPkpvbiBTa2VldDwvb3duZXJzPgorICAgIDxhdXRob3JzPkpvbiBTa2VldDwvYXV0aG9ycz4KKyAgICA8bGljZW5zZVVybD5odHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYtY3NoYXJwLXBvcnQvc291cmNlL2Jyb3dzZS9saWNlbnNlLnR4dDwvbGljZW5zZVVybD4KKyAgICA8cHJvamVjdFVybD5odHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYtY3NoYXJwLXBvcnQvPC9wcm9qZWN0VXJsPgorICAgIDxyZXF1aXJlTGljZW5zZUFjY2VwdGFuY2U+ZmFsc2U8L3JlcXVpcmVMaWNlbnNlQWNjZXB0YW5jZT4KKyAgICA8Y29weXJpZ2h0PkNvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY29weXJpZ2h0PgorICAgIDx0YWdzPlByb3RvY29sIEJ1ZmZlcnMgQmluYXJ5IFNlcmlhbGl6YXRpb24gRm9ybWF0IEdvb2dsZTwvdGFncz4KKworICAgIDx0aXRsZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC90aXRsZT4KKyAgICA8c3VtbWFyeT5BIG1hbmFnZWQgY29kZSBnZW5lcmF0b3IgYW5kIGxpYnJhcnkgZm9yIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ljwvc3VtbWFyeT4KKyAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCitQcm90b2NvbCBCdWZmZXJzIGlzIGEgYmluYXJ5IHNlcmlhbGl6YXRpb24gZm9ybWF0IGFuZCB0ZWNobm9sb2d5LCByZWxlYXNlZCB0byB0aGUgb3BlbiBzb3VyY2UgY29tbXVuaXR5IGJ5IEdvb2dsZSBpbiAyMDA4LiAgCitJdHMgcHJpbWFyeSB1c2UgaXMgdG8gcHJvZHVjZSBzbWFsbCBmYXN0IGJpbmFyeSByZXByZXNlbnRhdGlvbnMgb2YgYSAnbWVzc2FnZScgb3Igb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIG9yIHRyYW5zcG9ydGF0aW9uLgorVGhlcmUgYXJlIHZhcmlvdXMgaW1wbGVtZW50YXRpb25zIG9mIFByb3RvY29sIEJ1ZmZlcnMgaW4gLk5FVC4gVGhpcyBwcm9qZWN0IGlzIGEgZmFpcmx5IGNsb3NlIHBvcnQgb2YgdGhlIEdvb2dsZSBKYXZhIGltcGxlbWVudGF0aW9uLgorCitUaGVyZSBhcmUgdHdvIG1haW4gcGFydHM6CisKK3Rvb2xzL3Byb3RvYy5leGUsIHdoaWNoIHRha2VzIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm90b2NvbCBidWZmZXIgYW5kIHR1cm5zIGl0IGludG8gYSBiaW5hcnkgcmVwcmVzZW50YXRpb24gZm9yIHVzZSB3aXRoIFByb3RvR2VuLmV4ZS4KK3Rvb2xzL1Byb3RvR2VuLmV4ZSwgd2hpY2ggdGFrZXMgYmluYXJ5IHJlcHJlc2VudGF0aW9ucyBvZiBwcm90b2NvbCBidWZmZXIgZGVzY3JpcHRvcnMgKGFzIGdlbmVyYXRlZCBieSB0aGUgInN0b2NrIiBwcm90b2MgYmluYXJ5IHN1cHBsaWVkIGJ5IEdvb2dsZSkgYW5kIGNyZWF0ZXMgQyMgc291cmNlIGNvZGUuIFRoaXMgaXMgb25seSByZXF1aXJlZCBhdCBidWlsZCB0aW1lLgorCitsaWIvKi9Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLmRsbCwgd2hpY2ggaXMgYSBzdXBwb3J0aW5nIGxpYnJhcnkuIFRoaXMgaXMgcmVxdWlyZWQgYXQgZXhlY3V0aW9uIHRpbWUuCitsaWIvKi9Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uZGxsLCBhIHN1cHBsZW1lbnRhcnkgbGlicmFyeSB0aGF0IHByb3ZpZGVzIGV4dGVuc2lvbnMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgcHJvdG9jb2wgYnVmZmVycyB0byB4bWwsIGpzb24sIGFuZCBvdGhlcnMuCisKK0xJTktTOgorCitQcm9qZWN0IEhvbWUgICAgLSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYtY3NoYXJwLXBvcnQKK09ubGluZSBIZWxwICAgICAtIGh0dHA6Ly9oZWxwLnByb3RvYnVmZmVycy5uZXQKK0RldmVsb3BlciBHdWlkZSAtIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYXBpcy9wcm90b2NvbGJ1ZmZlcnMvZG9jcy9vdmVydmlldy5odG1sCitMYW5ndWFnZSBHdWlkZSAgLSBodHRwOi8vY29kZS5nb29nbGUuY29tL2FwaXMvcHJvdG9jb2xidWZmZXJzL2RvY3MvcHJvdG8uaHRtbAorCisgICAgXV0+PC9kZXNjcmlwdGlvbj4KKwkKKyAgICA8cmVmZXJlbmNlcz4KKyAgICAgIDxyZWZlcmVuY2UgZmlsZT0iR29vZ2xlLlByb3RvY29sQnVmZmVycy5kbGwiLz4KKyAgICAgIDxyZWZlcmVuY2UgZmlsZT0iR29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLmRsbCIvPgorICAgIDwvcmVmZXJlbmNlcz4KKyAgCisgIDwvbWV0YWRhdGE+CisgIDxmaWxlcz4KKyAgICA8IS0tIFJlbGVhc2UgQmluYXJpZXMgLS0+CisgICAgPGZpbGUgc3JjPSIuLlxidWlsZF9vdXRwdXRcUmVsZWFzZVwqKlxHb29nbGUuUHJvdG9jb2xCdWZmZXJzLj8/PyIgdGFyZ2V0PSJsaWJcIiAvPgorICAgIDxmaWxlIHNyYz0iLi5cYnVpbGRfb3V0cHV0XFJlbGVhc2VcKipcR29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLj8/PyIgdGFyZ2V0PSJsaWJcIiAvPgorICAgIDwhLS0gVG9vbHMgLS0+CisgICAgPGZpbGUgc3JjPSIuLlxidWlsZF9vdXRwdXRcdG9vbHNcKipcKiIgdGFyZ2V0PSJ0b29sc1wiIC8+CisgICAgPGZpbGUgc3JjPSIuLlxidWlsZF9vdXRwdXRccHJvdG9zXCoqXCoiIHRhcmdldD0idG9vbHNcIiAvPgorICAgIDwhLS0gQ29udGVudCAtLT4KKyAgICA8ZmlsZSBzcmM9Ii4uXGJ1aWxkX291dHB1dFxDSEFOR0VTLnR4dCIgdGFyZ2V0PSJ0b29sc1wiLz4KKyAgICA8ZmlsZSBzcmM9Ii4uXGJ1aWxkX291dHB1dFxsaWNlbnNlLnR4dCIgdGFyZ2V0PSJ0b29sc1wiLz4KKyAgICA8ZmlsZSBzcmM9Ii4uXGJ1aWxkX291dHB1dFx0b29sc1xwcm90b2MtbGljZW5zZS50eHQiIHRhcmdldD0idG9vbHNcIi8+CisgICAgPCEtLSBTb3VyY2UgLS0+CisgICAgPGZpbGUgc3JjPSIuLlxzcmNcUHJvdG9jb2xCdWZmZXJzXCoqXCouY3MiIHRhcmdldD0ic3JjXFByb3RvY29sQnVmZmVyc1wiLz4KKyAgICA8ZmlsZSBzcmM9Ii4uXHNyY1xQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblwqKlwqLmNzIiB0YXJnZXQ9InNyY1xQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblwiLz4KKyAgPC9maWxlcz4KKzwvcGFja2FnZT4KZGlmZiAtLWdpdCBhL2NzaGFycC9idWlsZC9Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5udXNwZWMgYi9jc2hhcnAvYnVpbGQvR29vZ2xlLlByb3RvY29sQnVmZmVyc0xpdGUubnVzcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOTEwN2YKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvYnVpbGQvR29vZ2xlLlByb3RvY29sQnVmZmVyc0xpdGUubnVzcGVjCkBAIC0wLDAgKzEsNjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHBhY2thZ2UgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249Im51c3BlYy54c2QiPgorICA8bWV0YWRhdGE+CisgICAgPGlkPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9pZD4KKyAgICA8dmVyc2lvbj4kdmVyc2lvbiQ8L3ZlcnNpb24+CisgICAgPG93bmVycz5Kb24gU2tlZXQ8L293bmVycz4KKyAgICA8YXV0aG9ycz5Kb24gU2tlZXQ8L2F1dGhvcnM+CisgICAgPGxpY2Vuc2VVcmw+aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLWNzaGFycC1wb3J0L3NvdXJjZS9icm93c2UvbGljZW5zZS50eHQ8L2xpY2Vuc2VVcmw+CisgICAgPHByb2plY3RVcmw+aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLWNzaGFycC1wb3J0LzwvcHJvamVjdFVybD4KKyAgICA8cmVxdWlyZUxpY2Vuc2VBY2NlcHRhbmNlPmZhbHNlPC9yZXF1aXJlTGljZW5zZUFjY2VwdGFuY2U+CisgICAgPGNvcHlyaWdodD5Db3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NvcHlyaWdodD4KKyAgICA8dGFncz5Qcm90b2NvbCBCdWZmZXJzIEJpbmFyeSBTZXJpYWxpemF0aW9uIEZvcm1hdCBHb29nbGU8L3RhZ3M+CisKKyAgICA8dGl0bGU+R29vZ2xlLlByb3RvY29sQnVmZmVyc0xpdGU8L3RpdGxlPgorICAgIDxzdW1tYXJ5PkEgbWFuYWdlZCBjb2RlIGdlbmVyYXRvciBhbmQgbGlicmFyeSBmb3IgR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQuPC9zdW1tYXJ5PgorICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKK1Byb3RvY29sIEJ1ZmZlcnMgaXMgYSBiaW5hcnkgc2VyaWFsaXphdGlvbiBmb3JtYXQgYW5kIHRlY2hub2xvZ3ksIHJlbGVhc2VkIHRvIHRoZSBvcGVuIHNvdXJjZSBjb21tdW5pdHkgYnkgR29vZ2xlIGluIDIwMDguICAKK0l0cyBwcmltYXJ5IHVzZSBpcyB0byBwcm9kdWNlIHNtYWxsIGZhc3QgYmluYXJ5IHJlcHJlc2VudGF0aW9ucyBvZiBhICdtZXNzYWdlJyBvciBvYmplY3QgZm9yIHNlcmlhbGl6YXRpb24gb3IgdHJhbnNwb3J0YXRpb24uCitUaGVyZSBhcmUgdmFyaW91cyBpbXBsZW1lbnRhdGlvbnMgb2YgUHJvdG9jb2wgQnVmZmVycyBpbiAuTkVULiBUaGlzIHByb2plY3QgaXMgYSBmYWlybHkgY2xvc2UgcG9ydCBvZiB0aGUgR29vZ2xlIEphdmEgaW1wbGVtZW50YXRpb24uCisKK1RoZXJlIGFyZSB0d28gbWFpbiBwYXJ0czoKKwordG9vbHMvcHJvdG9jLmV4ZSwgd2hpY2ggdGFrZXMgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3RvY29sIGJ1ZmZlciBhbmQgdHVybnMgaXQgaW50byBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBmb3IgdXNlIHdpdGggUHJvdG9HZW4uZXhlLgordG9vbHMvUHJvdG9HZW4uZXhlLCB3aGljaCB0YWtlcyBiaW5hcnkgcmVwcmVzZW50YXRpb25zIG9mIHByb3RvY29sIGJ1ZmZlciBkZXNjcmlwdG9ycyAoYXMgZ2VuZXJhdGVkIGJ5IHRoZSAic3RvY2siIHByb3RvYyBiaW5hcnkgc3VwcGxpZWQgYnkgR29vZ2xlKSBhbmQgY3JlYXRlcyBDIyBzb3VyY2UgY29kZS4gVGhpcyBpcyBvbmx5IHJlcXVpcmVkIGF0IGJ1aWxkIHRpbWUuCisKK2xpYi8qL0dvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLmRsbCwgd2hpY2ggaXMgYSBzdXBwb3J0aW5nIGxpYnJhcnkuIFRoaXMgaXMgcmVxdWlyZWQgYXQgZXhlY3V0aW9uIHRpbWUuCitsaWIvKi9Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLmRsbCwgYSBzdXBwbGVtZW50YXJ5IGxpYnJhcnkgdGhhdCBwcm92aWRlcyBleHRlbnNpb25zIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHByb3RvY29sIGJ1ZmZlcnMgdG8geG1sLCBqc29uLCBhbmQgb3RoZXJzLgorCitMSU5LUzoKKworUHJvamVjdCBIb21lICAgIC0gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLWNzaGFycC1wb3J0CitPbmxpbmUgSGVscCAgICAgLSBodHRwOi8vaGVscC5wcm90b2J1ZmZlcnMubmV0CitEZXZlbG9wZXIgR3VpZGUgLSBodHRwOi8vY29kZS5nb29nbGUuY29tL2FwaXMvcHJvdG9jb2xidWZmZXJzL2RvY3Mvb3ZlcnZpZXcuaHRtbAorTGFuZ3VhZ2UgR3VpZGUgIC0gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hcGlzL3Byb3RvY29sYnVmZmVycy9kb2NzL3Byb3RvLmh0bWwKKworICAgIF1dPjwvZGVzY3JpcHRpb24+CisJCisgICAgPHJlZmVyZW5jZXM+CisgICAgICA8cmVmZXJlbmNlIGZpbGU9Ikdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLmRsbCIvPgorICAgICAgPHJlZmVyZW5jZSBmaWxlPSJHb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLmRsbCIvPgorICAgIDwvcmVmZXJlbmNlcz4KKyAgCisgIDwvbWV0YWRhdGE+CisKKyAgPGZpbGVzPgorICAgIDwhLS0gUmVsZWFzZSBCaW5hcmllcyAtLT4KKyAgICA8ZmlsZSBzcmM9Ii4uXGJ1aWxkX291dHB1dFxSZWxlYXNlXCoqXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLj8/PyIgdGFyZ2V0PSJsaWJcIiAvPgorICAgIDxmaWxlIHNyYz0iLi5cYnVpbGRfb3V0cHV0XFJlbGVhc2VcKipcR29vZ2xlLlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi4/Pz8iIHRhcmdldD0ibGliXCIgLz4KKyAgICA8IS0tIFRvb2xzIC0tPgorICAgIDxmaWxlIHNyYz0iLi5cYnVpbGRfb3V0cHV0XHRvb2xzXCoqXCoiIHRhcmdldD0idG9vbHNcIiAvPgorICAgIDxmaWxlIHNyYz0iLi5cYnVpbGRfb3V0cHV0XHByb3Rvc1wqKlwqIiB0YXJnZXQ9InRvb2xzXCIgLz4KKyAgICA8IS0tIENvbnRlbnQgLS0+CisgICAgPGZpbGUgc3JjPSIuLlxidWlsZF9vdXRwdXRcQ0hBTkdFUy50eHQiIHRhcmdldD0idG9vbHNcIi8+CisgICAgPGZpbGUgc3JjPSIuLlxidWlsZF9vdXRwdXRcbGljZW5zZS50eHQiIHRhcmdldD0idG9vbHNcIi8+CisgICAgPGZpbGUgc3JjPSIuLlxidWlsZF9vdXRwdXRcdG9vbHNccHJvdG9jLWxpY2Vuc2UudHh0IiB0YXJnZXQ9InRvb2xzXCIvPgorICAgIDwhLS0gU291cmNlIC0tPgorICAgIDxmaWxlIHNyYz0iLi5cc3JjXFByb3RvY29sQnVmZmVyc1wqKlwqLmNzIiB0YXJnZXQ9InNyY1xQcm90b2NvbEJ1ZmZlcnNcIi8+CisgICAgPGZpbGUgc3JjPSIuLlxzcmNcUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cKipcKi5jcyIgdGFyZ2V0PSJzcmNcUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cIi8+CisgIDwvZmlsZXM+Cis8L3BhY2thZ2U+CmRpZmYgLS1naXQgYS9jc2hhcnAvYnVpbGQvUnVuQmVuY2htYXJrcy5iYXQgYi9jc2hhcnAvYnVpbGQvUnVuQmVuY2htYXJrcy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlNjUwMQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9idWlsZC9SdW5CZW5jaG1hcmtzLmJhdApAQCAtMCwwICsxLDIgQEAKK0BlY2hvIG9mZg0KK0NNRC5leGUgL1EgL0MgIkNEICV+ZHAwICYmICVXSU5ESVIlXE1pY3Jvc29mdC5ORVRcRnJhbWV3b3JrXHY0LjAuMzAzMTlcTVNCdWlsZC5leGUgL25vbG9nbyBidWlsZC5jc3Byb2ogL3Rvb2xzdmVyc2lvbjo0LjAgL3Q6UnVuQmVuY2htYXJrcyAlMSAlMiAlMyAlNA0KZGlmZiAtLWdpdCBhL2NzaGFycC9idWlsZC9idWlsZC5iYXQgYi9jc2hhcnAvYnVpbGQvYnVpbGQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkN2JkMmEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvYnVpbGQvYnVpbGQuYmF0CkBAIC0wLDAgKzEsMjAgQEAKK0BlY2hvIG9mZg0KK1NFVCBCVUlMRF9WRVJTSU9OPSV+MQ0KK1NFVCBCVUlMRF9UQVJHRVQ9JX4yDQorU0VUIEJVSUxEX0NPTkZJRz0lfjMNCisNCitJRiBOT1QgIiVCVUlMRF9WRVJTSU9OJSI9PSIiIEdPVE8gUlVODQorRUNITy4NCitFQ0hPIFVzYWdlOiBidWlsZC5iYXQgcGxhdGZvcm0gW3RhcmdldF0gW2NvbmZpZ10gW21zYnVpbGQgYXJndW1lbnRzXQ0KK0VDSE8uDQorRUNITyAtIHBsYXRmb3JtOiAgQ0YyMCwgQ0YzNSwgTkVUMjAsIE5FVDM1LCBORVQ0MCwgUEw0MCwgU0wyMCwgU0wzMCwgb3IgU0w0MA0KK0VDSE8gLSBbdGFyZ2V0XTogIFJlYnVpbGQsIENsZWFuLCBCdWlsZCwgVGVzdCwgb3IgUHVibGlzaA0KK0VDSE8gLSBbY29uZmlnXTogIERlYnVnIG9yIFJlbGVhc2UNCitFQ0hPLg0KK0VYSVQgL0IgMQ0KKw0KKzpSVU4NCitJRiAiJUJVSUxEX1RBUkdFVCUiPT0iIiBTRVQgQlVJTERfVEFSR0VUPVJlYnVpbGQNCitJRiAiJUJVSUxEX0NPTkZJRyUiPT0iIiBTRVQgQlVJTERfQ09ORklHPURlYnVnDQorDQorQ01ELmV4ZSAvUSAvQyAiQ0QgJX5kcDAgJiYgJVdJTkRJUiVcTWljcm9zb2Z0Lk5FVFxGcmFtZXdvcmtcdjQuMC4zMDMxOVxNU0J1aWxkLmV4ZSAvbm9sb2dvIHRhcmdldC5jc3Byb2ogL3Rvb2xzdmVyc2lvbjo0LjAgJTQgJTUgJTYgIi90OiVCVUlMRF9UQVJHRVQlIiAiL3A6Q29uZmlndXJhdGlvbj0lQlVJTERfQ09ORklHJTtUYXJnZXRWZXJzaW9uPSVCVUlMRF9WRVJTSU9OJSINCmRpZmYgLS1naXQgYS9jc2hhcnAvYnVpbGQvYnVpbGQuY3Nwcm9qIGIvY3NoYXJwL2J1aWxkL2J1aWxkLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzhiMmVmCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2J1aWxkL2J1aWxkLmNzcHJvagpAQCAtMCwwICsxLDI0MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKworICA8IS0tIGJ1aWxkIHRhcmdldHMgLS0+CisgIDxUYXJnZXQgTmFtZT0iQ2xlYW4iIERlcGVuZHNPblRhcmdldHM9Il9DbGVhbkFsbCIgLz4KKyAgPFRhcmdldCBOYW1lPSJCdWlsZFRvb2xzIiBEZXBlbmRzT25UYXJnZXRzPSJfQnVpbGRUb29scyIgLz4KKyAgPFRhcmdldCBOYW1lPSJHZW5lcmF0ZVByb2plY3RzIiBEZXBlbmRzT25UYXJnZXRzPSJfR2VuZXJhdGVQcm9qZWN0cyIgLz4KKyAgPFRhcmdldCBOYW1lPSJHZW5lcmF0ZVNvdXJjZSIgRGVwZW5kc09uVGFyZ2V0cz0iX0dlbmVyYXRlU291cmNlO19Db3B5R2VuZXJhdGVkU291cmNlIiAvPgorICA8VGFyZ2V0IE5hbWU9IlJlYnVpbGRTb3VyY2UiIERlcGVuZHNPblRhcmdldHM9IkNsZWFuO0J1aWxkVG9vbHM7R2VuZXJhdGVTb3VyY2UiIC8+CisgIDxUYXJnZXQgTmFtZT0iQnVpbGQiIERlcGVuZHNPblRhcmdldHM9IkdlbmVyYXRlUHJvamVjdHM7QnVpbGRUb29scztHZW5lcmF0ZVNvdXJjZTtfQ29tcGlsZUFsbCIgLz4KKyAgPFRhcmdldCBOYW1lPSJSZWJ1aWxkIiBEZXBlbmRzT25UYXJnZXRzPSJDbGVhbjtCdWlsZCIgLz4KKyAgPFRhcmdldCBOYW1lPSJHZW5lcmF0ZVBhY2thZ2UiIERlcGVuZHNPblRhcmdldHM9Il9QYWNrYWdlQWxsO19HZW5lcmF0ZVBhY2thZ2UiIC8+CisgIDxUYXJnZXQgTmFtZT0iRnVsbEJ1aWxkIiBEZXBlbmRzT25UYXJnZXRzPSJSZWJ1aWxkO0dlbmVyYXRlUGFja2FnZSIgLz4KKyAgPCEtLSBtaXNjIHRhcmdldHMgLS0+CisgIDxUYXJnZXQgTmFtZT0iUnVuQmVuY2htYXJrcyIgRGVwZW5kc09uVGFyZ2V0cz0iX0NsZWFuQWxsO19CdWlsZFRvb2xzO19SdW5CZW5jaG1hcmtzIiAvPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcm9qZWN0TmFtZT5Qcm90b2NvbCBCdWZmZXJzPC9Qcm9qZWN0TmFtZT4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55IENQVTwvUGxhdGZvcm0+CisgICAgCisgICAgPCEtLURpcmVjdG9yeSBQYXRocy0tPgorICAgIDxQcm9qZWN0RGlyZWN0b3J5PiQoTVNCdWlsZFByb2plY3REaXJlY3RvcnkpXC4uPC9Qcm9qZWN0RGlyZWN0b3J5PgorICAgIDxTb3VyY2VEaXJlY3Rvcnk+JChQcm9qZWN0RGlyZWN0b3J5KVxzcmM8L1NvdXJjZURpcmVjdG9yeT4KKyAgICA8TGliRGlyZWN0b3J5PiQoUHJvamVjdERpcmVjdG9yeSlcbGliPC9MaWJEaXJlY3Rvcnk+CisgICAgPFByb3Rvc0RpcmVjdG9yeT4kKFByb2plY3REaXJlY3RvcnkpXHByb3RvczwvUHJvdG9zRGlyZWN0b3J5PgorCisgICAgPFNvdXJjZVRlbXBEaXJlY3Rvcnk+JChQcm9qZWN0RGlyZWN0b3J5KVxidWlsZF90ZW1wXEdlbmVyYXRlZFNvdXJjZTwvU291cmNlVGVtcERpcmVjdG9yeT4KKyAgICA8QnVpbGRUZW1wRGlyZWN0b3J5PiQoUHJvamVjdERpcmVjdG9yeSlcYnVpbGRfdGVtcDwvQnVpbGRUZW1wRGlyZWN0b3J5PgorICAgIDxCdWlsZE91dHB1dERpcmVjdG9yeT4kKFByb2plY3REaXJlY3RvcnkpXGJ1aWxkX291dHB1dDwvQnVpbGRPdXRwdXREaXJlY3Rvcnk+CisgICAgPEJ1aWxkT3V0cHV0UGFja2FnZT4kKEJ1aWxkT3V0cHV0RGlyZWN0b3J5KTwvQnVpbGRPdXRwdXRQYWNrYWdlPgorCisgICAgPEJlbmNobWFya0FyZ3M+L3YyIC9mYXN0IC9mb3JtYXRzPC9CZW5jaG1hcmtBcmdzPgorICAgIDxCZW5jaG1hcmtPdXRwdXRGaWxlPiQoQnVpbGRUZW1wRGlyZWN0b3J5KVwuLlxCZW5jaG1hcmtSZXN1bHRzLnR4dDwvQmVuY2htYXJrT3V0cHV0RmlsZT4KKyAgICA8QmVuY2htYXJrUHJvdG9zRGlyZWN0b3J5PiQoUHJvamVjdERpcmVjdG9yeSlcYmVuY2htYXJrczwvQmVuY2htYXJrUHJvdG9zRGlyZWN0b3J5PgorCisgICAgPFBhY2thZ2VOYW1lIENvbmRpdGlvbj0iICckKFBhY2thZ2VOYW1lKScgPT0gJycgIj4kKENvbmZpZ3VyYXRpb24pPC9QYWNrYWdlTmFtZT4KKyAgICAKKyAgICA8IS0tVG9vbCBQYXRocy0tPgorICAgIDxQcm90b2NFeGVQYXRoPiQoQnVpbGRPdXRwdXREaXJlY3RvcnkpXHRvb2xzXHByb3RvYy5leGU8L1Byb3RvY0V4ZVBhdGg+CisgICAgPFByb3RvZ2VuRXhlUGF0aD4kKEJ1aWxkT3V0cHV0RGlyZWN0b3J5KVx0b29sc1xwcm90b2dlbi5leGU8L1Byb3RvZ2VuRXhlUGF0aD4KKyAgICA8TlVuaXRFeGVQYXRoPiQoTGliRGlyZWN0b3J5KVxOVW5pdFx0b29sc1xudW5pdC1jb25zb2xlLmV4ZTwvTlVuaXRFeGVQYXRoPgorICAgIDxDc1Byb2plY3RQcm9qZWN0b3I+JChMaWJEaXJlY3RvcnkpXENzUHJvamVjdFByb2plY3RvclxDc1Byb2plY3RQcm9qZWN0b3IuZXhlPC9Dc1Byb2plY3RQcm9qZWN0b3I+CisgICAgPFppcEV4ZVBhdGg+JChMaWJEaXJlY3RvcnkpXDctWmlwIDkuMjBcN3phLmV4ZTwvWmlwRXhlUGF0aD4KKyAgCis8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEltcG9ydCBQcm9qZWN0PSJDb21tb24udGFyZ2V0cyIvPgorCisgIDwhLS0gUHJvdG8gRmlsZXMgLS0+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb3RvcyBJbmNsdWRlPSIkKFByb3Rvc0RpcmVjdG9yeSlcZXh0ZXN0XHVuaXR0ZXN0X2lzc3Vlcy5wcm90byIgLz4KKyAgICA8UHJvdG9zIEluY2x1ZGU9IiQoUHJvdG9zRGlyZWN0b3J5KVxleHRlc3RcdW5pdHRlc3RfZXh0cmFzLnByb3RvIiAvPgorICAgIDxQcm90b3MgSW5jbHVkZT0iJChQcm90b3NEaXJlY3RvcnkpXGV4dGVzdFx1bml0dGVzdF9leHRyYXNfZnVsbC5wcm90byIgLz4KKyAgICA8UHJvdG9zIEluY2x1ZGU9IiQoUHJvdG9zRGlyZWN0b3J5KVxleHRlc3RcdW5pdHRlc3RfZXh0cmFzX2xpdGUucHJvdG8iIC8+CisgICAgPFByb3RvcyBJbmNsdWRlPSIkKFByb3Rvc0RpcmVjdG9yeSlcZXh0ZXN0XHVuaXR0ZXN0X2V4dHJhc194bWx0ZXN0LnByb3RvIiAvPgorICAgIDxQcm90b3MgSW5jbHVkZT0iJChQcm90b3NEaXJlY3RvcnkpXGV4dGVzdFx1bml0dGVzdF9nZW5lcmljX3NlcnZpY2VzLnByb3RvIiAvPgorICAgIDxQcm90b3MgSW5jbHVkZT0iJChQcm90b3NEaXJlY3RvcnkpXGV4dGVzdFx1bml0dGVzdF9ycGNfaW50ZXJvcC5wcm90byIgLz4KKyAgICA8UHJvdG9zIEluY2x1ZGU9IiQoUHJvdG9zRGlyZWN0b3J5KVxleHRlc3RcdW5pdHRlc3RfcnBjX2ludGVyb3BfbGl0ZS5wcm90byIgLz4KKyAgICA8UHJvdG9zIEluY2x1ZGU9IiQoUHJvdG9zRGlyZWN0b3J5KVxnb29nbGVccHJvdG9idWZcZGVzY3JpcHRvci5wcm90byIgLz4KKyAgICA8UHJvdG9zIEluY2x1ZGU9IiQoUHJvdG9zRGlyZWN0b3J5KVxnb29nbGVccHJvdG9idWZcY3NoYXJwX29wdGlvbnMucHJvdG8iIC8+CisgICAgPFByb3RvcyBJbmNsdWRlPSIkKFByb3Rvc0RpcmVjdG9yeSlcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0LnByb3RvIiAvPgorICAgIDxQcm90b3MgSW5jbHVkZT0iJChQcm90b3NEaXJlY3RvcnkpXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9jc2hhcnBfb3B0aW9ucy5wcm90byIgLz4KKyAgICA8UHJvdG9zIEluY2x1ZGU9IiQoUHJvdG9zRGlyZWN0b3J5KVxnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8iIC8+CisgICAgPFByb3RvcyBJbmNsdWRlPSIkKFByb3Rvc0RpcmVjdG9yeSlcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90byIgLz4KKyAgICA8UHJvdG9zIEluY2x1ZGU9IiQoUHJvdG9zRGlyZWN0b3J5KVxnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfZW1wdHkucHJvdG8iIC8+CisgICAgPFByb3RvcyBJbmNsdWRlPSIkKFByb3Rvc0RpcmVjdG9yeSlcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydC5wcm90byIgLz4KKyAgICA8UHJvdG9zIEluY2x1ZGU9IiQoUHJvdG9zRGlyZWN0b3J5KVxnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8iIC8+CisgICAgPFByb3RvcyBJbmNsdWRlPSIkKFByb3Rvc0RpcmVjdG9yeSlcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2xpdGUucHJvdG8iIC8+CisgICAgPFByb3RvcyBJbmNsdWRlPSIkKFByb3Rvc0RpcmVjdG9yeSlcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnByb3RvIiAvPgorICAgIDxQcm90b3MgSW5jbHVkZT0iJChQcm90b3NEaXJlY3RvcnkpXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9tc2V0LnByb3RvIiAvPgorICAgIDxQcm90b3MgSW5jbHVkZT0iJChQcm90b3NEaXJlY3RvcnkpXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnByb3RvIiAvPgorICAgIDxQcm90b3MgSW5jbHVkZT0iJChQcm90b3NEaXJlY3RvcnkpXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9vcHRpbWl6ZV9mb3IucHJvdG8iIC8+CisgICAgPFByb3RvcyBJbmNsdWRlPSIkKFByb3Rvc0RpcmVjdG9yeSlcZ29vZ2xlXHRlc3RcZ29vZ2xlX3NpemUucHJvdG8iIC8+CisgICAgPFByb3RvcyBJbmNsdWRlPSIkKFByb3Rvc0RpcmVjdG9yeSlcZ29vZ2xlXHRlc3RcZ29vZ2xlX3NwZWVkLnByb3RvIiAvPgorICAgIDxQcm90b3MgSW5jbHVkZT0iJChQcm90b3NEaXJlY3RvcnkpXHR1dG9yaWFsXGFkZHJlc3Nib29rLnByb3RvIiAvPgorICAgIDwhLS0gZm9yIGJlbmNobWFyayAtLT4KKyAgICA8UHJvdG9zIEluY2x1ZGU9IiQoUHJvdG9zRGlyZWN0b3J5KVxiZW5jaG1hcmtzXGdvb2dsZV9zaXplLnByb3RvIiAvPgorICAgIDxQcm90b3MgSW5jbHVkZT0iJChQcm90b3NEaXJlY3RvcnkpXGJlbmNobWFya3NcZ29vZ2xlX3NwZWVkLnByb3RvIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPCEtLSBHZW5lcmF0ZWQgU291cmNlIC0tPgorICA8SXRlbUdyb3VwPgorICAgIDwhLS0gTWFpbiBwcm90b3MgLS0+CisgICAgPEdlbmVyYXRlZFNvdXJjZSBJbmNsdWRlPSIkKFNvdXJjZVRlbXBEaXJlY3RvcnkpXENTaGFycE9wdGlvbnMuY3MiPgorICAgICAgPFRhcmdldERpcmVjdG9yeT4kKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzXERlc2NyaXB0b3JQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcRGVzY3JpcHRvclByb3RvRmlsZS5jcyI+CisgICAgICA8VGFyZ2V0RGlyZWN0b3J5PiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnNcRGVzY3JpcHRvclByb3RvczwvVGFyZ2V0RGlyZWN0b3J5PgorICAgIDwvR2VuZXJhdGVkU291cmNlPgorICAgICAgICAKKyAgICA8IS0tIEFkZHJlc3MgYm9vayBzYW1wbGUgLS0+CisgICAgPEdlbmVyYXRlZFNvdXJjZSBJbmNsdWRlPSIkKFNvdXJjZVRlbXBEaXJlY3RvcnkpXEFkZHJlc3NCb29rUHJvdG9zLmNzIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+JChTb3VyY2VEaXJlY3RvcnkpXEFkZHJlc3NCb29rPC9UYXJnZXREaXJlY3Rvcnk+CisgICAgPC9HZW5lcmF0ZWRTb3VyY2U+CisgICAgPCEtLSBVbml0IHRlc3QgLS0+CisgICAgPEdlbmVyYXRlZFNvdXJjZSBJbmNsdWRlPSIkKFNvdXJjZVRlbXBEaXJlY3RvcnkpXFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLmNzIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+JChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RFeHRyYXNJc3N1ZXNQcm90b0ZpbGUuY3MiPgorICAgICAgPFRhcmdldERpcmVjdG9yeT4kKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzLlRlc3RcVGVzdFByb3RvczwvVGFyZ2V0RGlyZWN0b3J5PgorICAgIDwvR2VuZXJhdGVkU291cmNlPgorICAgIDxHZW5lcmF0ZWRTb3VyY2UgSW5jbHVkZT0iJChTb3VyY2VUZW1wRGlyZWN0b3J5KVxVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLmNzIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+JChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RDU2hhcnBPcHRpb25zUHJvdG9GaWxlLmNzIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+JChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmNzIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+JChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RFbWJlZE9wdGltaXplRm9yUHJvdG9GaWxlLmNzIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+JChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RFbXB0eVByb3RvRmlsZS5jcyI+CisgICAgICA8VGFyZ2V0RGlyZWN0b3J5PiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxUZXN0UHJvdG9zPC9UYXJnZXREaXJlY3Rvcnk+CisgICAgPC9HZW5lcmF0ZWRTb3VyY2U+CisgICAgPEdlbmVyYXRlZFNvdXJjZSBJbmNsdWRlPSIkKFNvdXJjZVRlbXBEaXJlY3RvcnkpXFVuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZS5jcyI+CisgICAgICA8VGFyZ2V0RGlyZWN0b3J5PiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxUZXN0UHJvdG9zPC9UYXJnZXREaXJlY3Rvcnk+CisgICAgPC9HZW5lcmF0ZWRTb3VyY2U+ICAKKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuY3MiPgorICAgICAgPFRhcmdldERpcmVjdG9yeT4kKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzLlRlc3RcVGVzdFByb3RvczwvVGFyZ2V0RGlyZWN0b3J5PgorICAgIDwvR2VuZXJhdGVkU291cmNlPgorICAgIDxHZW5lcmF0ZWRTb3VyY2UgSW5jbHVkZT0iJChTb3VyY2VUZW1wRGlyZWN0b3J5KVxVbml0VGVzdE1lc3NhZ2VTZXRQcm90b0ZpbGUuY3MiPgorICAgICAgPFRhcmdldERpcmVjdG9yeT4kKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzLlRlc3RcVGVzdFByb3RvczwvVGFyZ2V0RGlyZWN0b3J5PgorICAgIDwvR2VuZXJhdGVkU291cmNlPgorICAgIDxHZW5lcmF0ZWRTb3VyY2UgSW5jbHVkZT0iJChTb3VyY2VUZW1wRGlyZWN0b3J5KVxVbml0VGVzdE5vR2VuZXJpY1NlcnZpY2VzUHJvdG9GaWxlLmNzIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+JChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RPcHRpbWl6ZUZvclByb3RvRmlsZS5jcyI+CisgICAgICA8VGFyZ2V0RGlyZWN0b3J5PiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxUZXN0UHJvdG9zPC9UYXJnZXREaXJlY3Rvcnk+CisgICAgPC9HZW5lcmF0ZWRTb3VyY2U+CisgICAgPEdlbmVyYXRlZFNvdXJjZSBJbmNsdWRlPSIkKFNvdXJjZVRlbXBEaXJlY3RvcnkpXFVuaXRUZXN0UHJvdG9GaWxlLmNzIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+JChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RScGNJbnRlcm9wLmNzIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+JChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RScGNJbnRlcm9wTGl0ZS5jcyI+CisgICAgICA8VGFyZ2V0RGlyZWN0b3J5PiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3RcVGVzdFByb3RvczwvVGFyZ2V0RGlyZWN0b3J5PgorICAgIDwvR2VuZXJhdGVkU291cmNlPgorICAgIDxHZW5lcmF0ZWRTb3VyY2UgSW5jbHVkZT0iJChTb3VyY2VUZW1wRGlyZWN0b3J5KVxVbml0VGVzdEdlbmVyaWNTZXJ2aWNlcy5jcyI+CisgICAgICA8VGFyZ2V0RGlyZWN0b3J5PiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxUZXN0UHJvdG9zPC9UYXJnZXREaXJlY3Rvcnk+CisgICAgPC9HZW5lcmF0ZWRTb3VyY2U+CisgICAgPCEtLSBMaXRlIHVuaXQgdGVzdCAtLT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLmNzIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+JChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVyc0xpdGUuVGVzdFxUZXN0UHJvdG9zPC9UYXJnZXREaXJlY3Rvcnk+CisgICAgPC9HZW5lcmF0ZWRTb3VyY2U+CisgICAgPEdlbmVyYXRlZFNvdXJjZSBJbmNsdWRlPSIkKFNvdXJjZVRlbXBEaXJlY3RvcnkpXFVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5jcyI+CisgICAgICA8VGFyZ2V0RGlyZWN0b3J5PiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3RcVGVzdFByb3RvczwvVGFyZ2V0RGlyZWN0b3J5PgorICAgIDwvR2VuZXJhdGVkU291cmNlPgorICAgIDxHZW5lcmF0ZWRTb3VyY2UgSW5jbHVkZT0iJChTb3VyY2VUZW1wRGlyZWN0b3J5KVxVbml0VGVzdEltcG9ydExpdGVQcm90b0ZpbGUuY3MiPgorICAgICAgPFRhcmdldERpcmVjdG9yeT4kKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XFRlc3RQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuY3MiPgorICAgICAgPFRhcmdldERpcmVjdG9yeT4kKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XFRlc3RQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RMaXRlSW1wb3J0Tm9uTGl0ZVByb3RvRmlsZS5jcyI+CisgICAgICA8VGFyZ2V0RGlyZWN0b3J5PiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3RcVGVzdFByb3RvczwvVGFyZ2V0RGlyZWN0b3J5PgorICAgIDwvR2VuZXJhdGVkU291cmNlPgorICAgIDxHZW5lcmF0ZWRTb3VyY2UgSW5jbHVkZT0iJChTb3VyY2VUZW1wRGlyZWN0b3J5KVxVbml0VGVzdExpdGVQcm90b0ZpbGUuY3MiPgorICAgICAgPFRhcmdldERpcmVjdG9yeT4kKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XFRlc3RQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RQcm90b0ZpbGUuY3MiPgorICAgICAgPFRhcmdldERpcmVjdG9yeT4kKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XFRlc3RQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RHb29nbGVTaXplUHJvdG9GaWxlLmNzIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+JChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RHb29nbGVTcGVlZFByb3RvRmlsZS5jcyI+CisgICAgICA8VGFyZ2V0RGlyZWN0b3J5PiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxUZXN0UHJvdG9zPC9UYXJnZXREaXJlY3Rvcnk+CisgICAgPC9HZW5lcmF0ZWRTb3VyY2U+CisgICAgPEdlbmVyYXRlZFNvdXJjZSBJbmNsdWRlPSIkKFNvdXJjZVRlbXBEaXJlY3RvcnkpXEdvb2dsZVNpemVQcm90b0ZpbGUuY3MiPgorICAgICAgPFRhcmdldERpcmVjdG9yeT4kKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9CZW5jaFxUZXN0UHJvdG9zPC9UYXJnZXREaXJlY3Rvcnk+CisgICAgPC9HZW5lcmF0ZWRTb3VyY2U+CisgICAgPEdlbmVyYXRlZFNvdXJjZSBJbmNsdWRlPSIkKFNvdXJjZVRlbXBEaXJlY3RvcnkpXEdvb2dsZVNwZWVkUHJvdG9GaWxlLmNzIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+JChTb3VyY2VEaXJlY3RvcnkpXFByb3RvQmVuY2hcVGVzdFByb3RvczwvVGFyZ2V0RGlyZWN0b3J5PgorICAgIDwvR2VuZXJhdGVkU291cmNlPgorICAgIDxHZW5lcmF0ZWRTb3VyY2UgSW5jbHVkZT0iJChTb3VyY2VUZW1wRGlyZWN0b3J5KVxVbml0VGVzdEltcG9ydFByb3RvRmlsZS5jcyI+CisgICAgICA8VGFyZ2V0RGlyZWN0b3J5PiQoU291cmNlRGlyZWN0b3J5KVxQcm90b0JlbmNoXFRlc3RQcm90b3M8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L0dlbmVyYXRlZFNvdXJjZT4KKyAgICA8R2VuZXJhdGVkU291cmNlIEluY2x1ZGU9IiQoU291cmNlVGVtcERpcmVjdG9yeSlcVW5pdFRlc3RQcm90b0ZpbGUuY3MiPgorICAgICAgPFRhcmdldERpcmVjdG9yeT4kKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9CZW5jaFxUZXN0UHJvdG9zPC9UYXJnZXREaXJlY3Rvcnk+CisgICAgPC9HZW5lcmF0ZWRTb3VyY2U+CisgIDwvSXRlbUdyb3VwPgorICA8IS0tIFBhY2thZ2UgSXRlbXMgLS0+CisgIDxJdGVtR3JvdXA+CisgICAgPFN0YXRpY1BhY2thZ2VJdGVtIEluY2x1ZGU9IiQoUHJvamVjdERpcmVjdG9yeSlcQ0hBTkdFUy50eHQiIC8+CisgICAgPFN0YXRpY1BhY2thZ2VJdGVtIEluY2x1ZGU9IiQoUHJvamVjdERpcmVjdG9yeSlcbGljZW5zZS50eHQiIC8+CisgICAgPFN0YXRpY1BhY2thZ2VJdGVtIEluY2x1ZGU9IiQoUHJvamVjdERpcmVjdG9yeSlccHJvdG9zXGdvb2dsZVxwcm90b2J1ZlxkZXNjcmlwdG9yLnByb3RvIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+XHByb3Rvc1xnb29nbGVccHJvdG9idWY8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L1N0YXRpY1BhY2thZ2VJdGVtPgorICAgIDxTdGF0aWNQYWNrYWdlSXRlbSBJbmNsdWRlPSIkKFByb2plY3REaXJlY3RvcnkpXHByb3Rvc1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJccGx1Z2luLnByb3RvIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+XHByb3Rvc1xnb29nbGVccHJvdG9idWZcY29tcGlsZXI8L1RhcmdldERpcmVjdG9yeT4KKyAgICA8L1N0YXRpY1BhY2thZ2VJdGVtPgorICAgIDxTdGF0aWNQYWNrYWdlSXRlbSBJbmNsdWRlPSIkKFByb2plY3REaXJlY3RvcnkpXHByb3Rvc1xnb29nbGVccHJvdG9idWZcY3NoYXJwX29wdGlvbnMucHJvdG8iPgorICAgICAgPFRhcmdldERpcmVjdG9yeT5ccHJvdG9zXGdvb2dsZVxwcm90b2J1ZjwvVGFyZ2V0RGlyZWN0b3J5PgorICAgIDwvU3RhdGljUGFja2FnZUl0ZW0+CisgICAgPFN0YXRpY1BhY2thZ2VJdGVtIEluY2x1ZGU9IiQoUHJvamVjdERpcmVjdG9yeSlccHJvdG9zXHR1dG9yaWFsXGFkZHJlc3Nib29rLnByb3RvIj4KKyAgICAgIDxUYXJnZXREaXJlY3Rvcnk+XHByb3Rvc1x0dXRvcmlhbDwvVGFyZ2V0RGlyZWN0b3J5PgorICAgIDwvU3RhdGljUGFja2FnZUl0ZW0+CisgIDwvSXRlbUdyb3VwPgorICA8IS0tIFRvb2xzIC0tPgorICA8SXRlbUdyb3VwPgorICAgIDxUb29sc1Rlc3RDb250YWluZXIgSW5jbHVkZT0iJChTb3VyY2VEaXJlY3RvcnkpXFByb3RvR2VuLlRlc3RcYmluXE5FVDM1XFJlbGVhc2VcR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbi5UZXN0LmRsbCIgLz4KKworICAgIDxUb29sc091dHB1dEl0ZW0gSW5jbHVkZT0iJChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVyc1xiaW5cTkVUMzVcUmVsZWFzZVxHb29nbGUuUHJvdG9jb2xCdWZmZXJzLmRsbCIgLz4KKyAgICA8VG9vbHNPdXRwdXRJdGVtIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxiaW5cTkVUMzVcUmVsZWFzZVxHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uZGxsIiAvPgorICAgIDxUb29sc091dHB1dEl0ZW0gSW5jbHVkZT0iJChTb3VyY2VEaXJlY3RvcnkpXFByb3RvR2VuXGJpblxORVQzNVxSZWxlYXNlXFByb3RvR2VuLmV4ZSIgLz4KKyAgICA8VG9vbHNPdXRwdXRJdGVtIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b0dlblxiaW5cTkVUMzVcUmVsZWFzZVxQcm90b0dlbi5leGUuY29uZmlnIiAvPgorICAgIDxUb29sc091dHB1dEl0ZW0gSW5jbHVkZT0iJChTb3VyY2VEaXJlY3RvcnkpXFByb3RvTXVuZ2VcYmluXE5FVDM1XFJlbGVhc2VcUHJvdG9NdW5nZS5leGUiIC8+CisgICAgPFRvb2xzT3V0cHV0SXRlbSBJbmNsdWRlPSIkKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9EdW1wXGJpblxORVQzNVxSZWxlYXNlXFByb3RvRHVtcC5leGUiIC8+CisgICAgPFRvb2xzT3V0cHV0SXRlbSBJbmNsdWRlPSIkKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9CZW5jaFxiaW5cTkVUMzVcUmVsZWFzZVxQcm90b0JlbmNoLmV4ZSIgLz4KKyAgICA8VG9vbHNPdXRwdXRJdGVtIEluY2x1ZGU9IiQoTGliRGlyZWN0b3J5KVxwcm90b2MuZXhlIiAvPgorICAgIDxUb29sc091dHB1dEl0ZW0gSW5jbHVkZT0iJChMaWJEaXJlY3RvcnkpXHByb3RvYy1saWNlbnNlLnR4dCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDwhLS0gVGVtcG9yYXJ5IERpcmVjdG9yaWVzIC0tPgorICA8SXRlbUdyb3VwPgorICAgIDxUZW1wQnVpbGRGb2xkZXIgSW5jbHVkZT0iJChCdWlsZFRlbXBEaXJlY3RvcnkpIiAvPgorICAgIDxUZW1wQnVpbGRGb2xkZXIgSW5jbHVkZT0iJChCdWlsZE91dHB1dERpcmVjdG9yeSkiIC8+CisgICAgPFRlbXBCdWlsZEZvbGRlciBJbmNsdWRlPSIkKFNvdXJjZURpcmVjdG9yeSlcQWRkcmVzc0Jvb2tcb2JqIiAvPgorICAgIDxUZW1wQnVpbGRGb2xkZXIgSW5jbHVkZT0iJChTb3VyY2VEaXJlY3RvcnkpXEFkZHJlc3NCb29rXGJpbiIgLz4KKyAgICA8VGVtcEJ1aWxkRm9sZGVyIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b0JlbmNoXG9iaiIgLz4KKyAgICA8VGVtcEJ1aWxkRm9sZGVyIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b0JlbmNoXGJpbiIgLz4KKyAgICA8VGVtcEJ1aWxkRm9sZGVyIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnNcb2JqIiAvPgorICAgIDxUZW1wQnVpbGRGb2xkZXIgSW5jbHVkZT0iJChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVyc1xiaW4iIC8+CisgICAgPFRlbXBCdWlsZEZvbGRlciBJbmNsdWRlPSIkKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cb2JqIiAvPgorICAgIDxUZW1wQnVpbGRGb2xkZXIgSW5jbHVkZT0iJChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXGJpbiIgLz4KKyAgICA8VGVtcEJ1aWxkRm9sZGVyIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxvYmoiIC8+CisgICAgPFRlbXBCdWlsZEZvbGRlciBJbmNsdWRlPSIkKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzLlRlc3RcYmluIiAvPgorICAgIDxUZW1wQnVpbGRGb2xkZXIgSW5jbHVkZT0iJChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVyc0xpdGUuVGVzdFxvYmoiIC8+CisgICAgPFRlbXBCdWlsZEZvbGRlciBJbmNsdWRlPSIkKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XGJpbiIgLz4KKyAgICA8VGVtcEJ1aWxkRm9sZGVyIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b0R1bXBcb2JqIiAvPgorICAgIDxUZW1wQnVpbGRGb2xkZXIgSW5jbHVkZT0iJChTb3VyY2VEaXJlY3RvcnkpXFByb3RvRHVtcFxiaW4iIC8+CisgICAgPFRlbXBCdWlsZEZvbGRlciBJbmNsdWRlPSIkKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9HZW5cb2JqIiAvPgorICAgIDxUZW1wQnVpbGRGb2xkZXIgSW5jbHVkZT0iJChTb3VyY2VEaXJlY3RvcnkpXFByb3RvR2VuXGJpbiIgLz4KKyAgICA8VGVtcEJ1aWxkRm9sZGVyIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b0dlbi5UZXN0XG9iaiIgLz4KKyAgICA8VGVtcEJ1aWxkRm9sZGVyIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b0dlbi5UZXN0XGJpbiIgLz4KKyAgICA8VGVtcEJ1aWxkRm9sZGVyIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b011bmdlXG9iaiIgLz4KKyAgICA8VGVtcEJ1aWxkRm9sZGVyIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b011bmdlXGJpbiIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9jc2hhcnAvYnVpbGQvZ29vZ2xlY29kZV91cGxvYWQucHkgYi9jc2hhcnAvYnVpbGQvZ29vZ2xlY29kZV91cGxvYWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkNWY5NwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9idWlsZC9nb29nbGVjb2RlX3VwbG9hZC5weQpAQCAtMCwwICsxLDI0OCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA2LCAyMDA3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIEF1dGhvcjogZGFuZGVyc29uQGdvb2dsZS5jb20gKERhdmlkIEFuZGVyc29uKQorIworIyBTY3JpcHQgZm9yIHVwbG9hZGluZyBmaWxlcyB0byBhIEdvb2dsZSBDb2RlIHByb2plY3QuCisjCisjIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgYm90aCBhIHVzZWZ1bCBzY3JpcHQgZm9yIHBlb3BsZSB3aG8gd2FudCB0bworIyBzdHJlYW1saW5lIHByb2plY3QgdXBsb2FkcyBhbmQgYSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZm9yCisjIHVwbG9hZGluZyBmaWxlcyB0byBHb29nbGUgQ29kZSBwcm9qZWN0cy4KKyMKKyMgVG8gdXBsb2FkIGEgZmlsZSB0byBHb29nbGUgQ29kZSwgeW91IG5lZWQgdG8gcHJvdmlkZSBhIHBhdGggdG8gdGhlCisjIGZpbGUgb24geW91ciBsb2NhbCBtYWNoaW5lLCBhIHNtYWxsIHN1bW1hcnkgb2Ygd2hhdCB0aGUgZmlsZSBpcywgYQorIyBwcm9qZWN0IG5hbWUsIGFuZCBhIHZhbGlkIGFjY291bnQgdGhhdCBpcyBhIG1lbWJlciBvciBvd25lciBvZiB0aGF0CisjIHByb2plY3QuICBZb3UgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBhIGxpc3Qgb2YgbGFiZWxzIHRoYXQgYXBwbHkgdG8KKyMgdGhlIGZpbGUuICBUaGUgZmlsZSB3aWxsIGJlIHVwbG9hZGVkIHVuZGVyIHRoZSBzYW1lIG5hbWUgdGhhdCBpdCBoYXMKKyMgaW4geW91ciBsb2NhbCBmaWxlc3lzdGVtICh0aGF0IGlzLCB0aGUgImJhc2VuYW1lIiBvciBsYXN0IHBhdGgKKyMgY29tcG9uZW50KS4gIFJ1biB0aGUgc2NyaXB0IHdpdGggJy0taGVscCcgdG8gZ2V0IHRoZSBleGFjdCBzeW50YXgKKyMgYW5kIGF2YWlsYWJsZSBvcHRpb25zLgorIworIyBOb3RlIHRoYXQgdGhlIHVwbG9hZCBzY3JpcHQgcmVxdWVzdHMgdGhhdCB5b3UgZW50ZXIgeW91cgorIyBnb29nbGVjb2RlLmNvbSBwYXNzd29yZC4gIFRoaXMgaXMgTk9UIHlvdXIgR21haWwgYWNjb3VudCBwYXNzd29yZCEKKyMgVGhpcyBpcyB0aGUgcGFzc3dvcmQgeW91IHVzZSBvbiBnb29nbGVjb2RlLmNvbSBmb3IgY29tbWl0dGluZyB0bworIyBTdWJ2ZXJzaW9uIGFuZCB1cGxvYWRpbmcgZmlsZXMuICBZb3UgY2FuIGZpbmQgeW91ciBwYXNzd29yZCBieSBnb2luZworIyB0byBodHRwOi8vY29kZS5nb29nbGUuY29tL2hvc3Rpbmcvc2V0dGluZ3Mgd2hlbiBsb2dnZWQgaW4gd2l0aCB5b3VyCisjIEdtYWlsIGFjY291bnQuIElmIHlvdSBoYXZlIGFscmVhZHkgY29tbWl0dGVkIHRvIHlvdXIgcHJvamVjdCdzCisjIFN1YnZlcnNpb24gcmVwb3NpdG9yeSwgdGhlIHNjcmlwdCB3aWxsIGF1dG9tYXRpY2FsbHkgcmV0cmlldmUgeW91cgorIyBjcmVkZW50aWFscyBmcm9tIHRoZXJlICh1bmxlc3MgZGlzYWJsZWQsIHNlZSB0aGUgb3V0cHV0IG9mICctLWhlbHAnCisjIGZvciBkZXRhaWxzKS4KKyMKKyMgSWYgeW91IGFyZSBsb29raW5nIGF0IHRoaXMgc2NyaXB0IGFzIGEgcmVmZXJlbmNlIGZvciBpbXBsZW1lbnRpbmcKKyMgeW91ciBvd24gR29vZ2xlIENvZGUgZmlsZSB1cGxvYWRlciwgdGhlbiB5b3Ugc2hvdWxkIHRha2UgYSBsb29rIGF0CisjIHRoZSB1cGxvYWQoKSBmdW5jdGlvbiwgd2hpY2ggaXMgdGhlIG1lYXQgb2YgdGhlIHVwbG9hZGVyLiAgWW91CisjIGJhc2ljYWxseSBuZWVkIHRvIGJ1aWxkIGEgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBQT1NUIHJlcXVlc3Qgd2l0aCB0aGUKKyMgcmlnaHQgZmllbGRzIGFuZCBzZW5kIGl0IHRvIGh0dHBzOi8vUFJPSkVDVC5nb29nbGVjb2RlLmNvbS9maWxlcyAuCisjIEF1dGhlbnRpY2F0ZSB0aGUgcmVxdWVzdCB1c2luZyBIVFRQIEJhc2ljIGF1dGhlbnRpY2F0aW9uLCBhcyBpcworIyBzaG93biBiZWxvdy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjA6CisjICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgUXVlc3Rpb25zLCBjb21tZW50cywgZmVhdHVyZSByZXF1ZXN0cyBhbmQgcGF0Y2hlcyBhcmUgbW9zdCB3ZWxjb21lLgorIyBQbGVhc2UgZGlyZWN0IGFsbCBvZiB0aGVzZSB0byB0aGUgR29vZ2xlIENvZGUgdXNlcnMgZ3JvdXA6CisjICBodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvZ29vZ2xlLWNvZGUtaG9zdGluZworCisiIiJHb29nbGUgQ29kZSBmaWxlIHVwbG9hZGVyIHNjcmlwdC4KKyIiIgorCitfX2F1dGhvcl9fID0gJ2RhbmRlcnNvbkBnb29nbGUuY29tIChEYXZpZCBBbmRlcnNvbiknCisKK2ltcG9ydCBodHRwbGliCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgZ2V0cGFzcworaW1wb3J0IGJhc2U2NAoraW1wb3J0IHN5cworCisKK2RlZiB1cGxvYWQoZmlsZSwgcHJvamVjdF9uYW1lLCB1c2VyX25hbWUsIHBhc3N3b3JkLCBzdW1tYXJ5LCBsYWJlbHM9Tm9uZSk6CisgICIiIlVwbG9hZCBhIGZpbGUgdG8gYSBHb29nbGUgQ29kZSBwcm9qZWN0J3MgZmlsZSBzZXJ2ZXIuCisKKyAgQXJnczoKKyAgICBmaWxlOiBUaGUgbG9jYWwgcGF0aCB0byB0aGUgZmlsZS4KKyAgICBwcm9qZWN0X25hbWU6IFRoZSBuYW1lIG9mIHlvdXIgcHJvamVjdCBvbiBHb29nbGUgQ29kZS4KKyAgICB1c2VyX25hbWU6IFlvdXIgR29vZ2xlIGFjY291bnQgbmFtZS4KKyAgICBwYXNzd29yZDogVGhlIGdvb2dsZWNvZGUuY29tIHBhc3N3b3JkIGZvciB5b3VyIGFjY291bnQuCisgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIE5PVCB5b3VyIGdsb2JhbCBHb29nbGUgQWNjb3VudCBwYXNzd29yZCEKKyAgICBzdW1tYXJ5OiBBIHNtYWxsIGRlc2NyaXB0aW9uIGZvciB0aGUgZmlsZS4KKyAgICBsYWJlbHM6IGFuIG9wdGlvbmFsIGxpc3Qgb2YgbGFiZWwgc3RyaW5ncyB3aXRoIHdoaWNoIHRvIHRhZyB0aGUgZmlsZS4KKworICBSZXR1cm5zOiBhIHR1cGxlOgorICAgIGh0dHBfc3RhdHVzOiAyMDEgaWYgdGhlIHVwbG9hZCBzdWNjZWVkZWQsIHNvbWV0aGluZyBlbHNlIGlmIGFuCisgICAgICAgICAgICAgICAgIGVycm9yIG9jY3VyZWQuCisgICAgaHR0cF9yZWFzb246IFRoZSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGh0dHBfc3RhdHVzCisgICAgZmlsZV91cmw6IElmIHRoZSB1cGxvYWQgc3VjY2VlZGVkLCB0aGUgVVJMIG9mIHRoZSBmaWxlIG9uIEdvb2dsZQorICAgICAgICAgICAgICBDb2RlLCBOb25lIG90aGVyd2lzZS4KKyAgIiIiCisgICMgVGhlIGxvZ2luIGlzIHRoZSB1c2VyIHBhcnQgb2YgdXNlckBnbWFpbC5jb20uIElmIHRoZSBsb2dpbiBwcm92aWRlZAorICAjIGlzIGluIHRoZSBmdWxsIHVzZXJAZG9tYWluIGZvcm0sIHN0cmlwIGl0IGRvd24uCisgIGlmIHVzZXJfbmFtZS5lbmRzd2l0aCgnQGdtYWlsLmNvbScpOgorICAgIHVzZXJfbmFtZSA9IHVzZXJfbmFtZVs6dXNlcl9uYW1lLmluZGV4KCdAZ21haWwuY29tJyldCisKKyAgZm9ybV9maWVsZHMgPSBbKCdzdW1tYXJ5Jywgc3VtbWFyeSldCisgIGlmIGxhYmVscyBpcyBub3QgTm9uZToKKyAgICBmb3JtX2ZpZWxkcy5leHRlbmQoWygnbGFiZWwnLCBsLnN0cmlwKCkpIGZvciBsIGluIGxhYmVsc10pCisKKyAgY29udGVudF90eXBlLCBib2R5ID0gZW5jb2RlX3VwbG9hZF9yZXF1ZXN0KGZvcm1fZmllbGRzLCBmaWxlKQorCisgIHVwbG9hZF9ob3N0ID0gJyVzLmdvb2dsZWNvZGUuY29tJyAlIHByb2plY3RfbmFtZQorICB1cGxvYWRfdXJpID0gJy9maWxlcycKKyAgYXV0aF90b2tlbiA9IGJhc2U2NC5iNjRlbmNvZGUoJyVzOiVzJyUgKHVzZXJfbmFtZSwgcGFzc3dvcmQpKQorICBoZWFkZXJzID0geworICAgICdBdXRob3JpemF0aW9uJzogJ0Jhc2ljICVzJyAlIGF1dGhfdG9rZW4sCisgICAgJ1VzZXItQWdlbnQnOiAnR29vZ2xlY29kZS5jb20gdXBsb2FkZXIgdjAuOS40JywKKyAgICAnQ29udGVudC1UeXBlJzogY29udGVudF90eXBlLAorICAgIH0KKworICBzZXJ2ZXIgPSBodHRwbGliLkhUVFBTQ29ubmVjdGlvbih1cGxvYWRfaG9zdCkKKyAgc2VydmVyLnJlcXVlc3QoJ1BPU1QnLCB1cGxvYWRfdXJpLCBib2R5LCBoZWFkZXJzKQorICByZXNwID0gc2VydmVyLmdldHJlc3BvbnNlKCkKKyAgc2VydmVyLmNsb3NlKCkKKworICBpZiByZXNwLnN0YXR1cyA9PSAyMDE6CisgICAgbG9jYXRpb24gPSByZXNwLmdldGhlYWRlcignTG9jYXRpb24nLCBOb25lKQorICBlbHNlOgorICAgIGxvY2F0aW9uID0gTm9uZQorICByZXR1cm4gcmVzcC5zdGF0dXMsIHJlc3AucmVhc29uLCBsb2NhdGlvbgorCisKK2RlZiBlbmNvZGVfdXBsb2FkX3JlcXVlc3QoZmllbGRzLCBmaWxlX3BhdGgpOgorICAiIiJFbmNvZGUgdGhlIGdpdmVuIGZpZWxkcyBhbmQgZmlsZSBpbnRvIGEgbXVsdGlwYXJ0IGZvcm0gYm9keS4KKworICBmaWVsZHMgaXMgYSBzZXF1ZW5jZSBvZiAobmFtZSwgdmFsdWUpIHBhaXJzLiBmaWxlIGlzIHRoZSBwYXRoIG9mCisgIHRoZSBmaWxlIHRvIHVwbG9hZC4gVGhlIGZpbGUgd2lsbCBiZSB1cGxvYWRlZCB0byBHb29nbGUgQ29kZSB3aXRoCisgIHRoZSBzYW1lIGZpbGUgbmFtZS4KKworICBSZXR1cm5zOiAoY29udGVudF90eXBlLCBib2R5KSByZWFkeSBmb3IgaHR0cGxpYi5IVFRQIGluc3RhbmNlCisgICIiIgorICBCT1VOREFSWSA9ICctLS0tLS0tLS0tR29vZ2xlY29kZV9ib3VuZGFyeV9yZWluZGVlcl9mbG90aWxsYScKKyAgQ1JMRiA9ICdcclxuJworCisgIGJvZHkgPSBbXQorCisgICMgQWRkIHRoZSBtZXRhZGF0YSBhYm91dCB0aGUgdXBsb2FkIGZpcnN0CisgIGZvciBrZXksIHZhbHVlIGluIGZpZWxkczoKKyAgICBib2R5LmV4dGVuZCgKKyAgICAgIFsnLS0nICsgQk9VTkRBUlksCisgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJXMiJyAlIGtleSwKKyAgICAgICAnJywKKyAgICAgICB2YWx1ZSwKKyAgICAgICBdKQorCisgICMgTm93IGFkZCB0aGUgZmlsZSBpdHNlbGYKKyAgZmlsZV9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlX3BhdGgpCisgIGYgPSBvcGVuKGZpbGVfcGF0aCwgJ3JiJykKKyAgZmlsZV9jb250ZW50ID0gZi5yZWFkKCkKKyAgZi5jbG9zZSgpCisKKyAgYm9keS5leHRlbmQoCisgICAgWyctLScgKyBCT1VOREFSWSwKKyAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iZmlsZW5hbWUiOyBmaWxlbmFtZT0iJXMiJworICAgICAlIGZpbGVfbmFtZSwKKyAgICAgIyBUaGUgdXBsb2FkIHNlcnZlciBkZXRlcm1pbmVzIHRoZSBtaW1lLXR5cGUsIG5vIG5lZWQgdG8gc2V0IGl0LgorICAgICAnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAorICAgICAnJywKKyAgICAgZmlsZV9jb250ZW50LAorICAgICBdKQorCisgICMgRmluYWxpemUgdGhlIGZvcm0gYm9keQorICBib2R5LmV4dGVuZChbJy0tJyArIEJPVU5EQVJZICsgJy0tJywgJyddKQorCisgIHJldHVybiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JXMnICUgQk9VTkRBUlksIENSTEYuam9pbihib2R5KQorCisKK2RlZiB1cGxvYWRfZmluZF9hdXRoKGZpbGVfcGF0aCwgcHJvamVjdF9uYW1lLCBzdW1tYXJ5LCBsYWJlbHM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIHVzZXJfbmFtZT1Ob25lLCBwYXNzd29yZD1Ob25lLCB0cmllcz0zKToKKyAgIiIiRmluZCBjcmVkZW50aWFscyBhbmQgdXBsb2FkIGEgZmlsZSB0byBhIEdvb2dsZSBDb2RlIHByb2plY3QncyBmaWxlIHNlcnZlci4KKworICBmaWxlX3BhdGgsIHByb2plY3RfbmFtZSwgc3VtbWFyeSwgYW5kIGxhYmVscyBhcmUgcGFzc2VkIGFzLWlzIHRvIHVwbG9hZC4KKworICBBcmdzOgorICAgIGZpbGVfcGF0aDogVGhlIGxvY2FsIHBhdGggdG8gdGhlIGZpbGUuCisgICAgcHJvamVjdF9uYW1lOiBUaGUgbmFtZSBvZiB5b3VyIHByb2plY3Qgb24gR29vZ2xlIENvZGUuCisgICAgc3VtbWFyeTogQSBzbWFsbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGZpbGUuCisgICAgbGFiZWxzOiBhbiBvcHRpb25hbCBsaXN0IG9mIGxhYmVsIHN0cmluZ3Mgd2l0aCB3aGljaCB0byB0YWcgdGhlIGZpbGUuCisgICAgY29uZmlnX2RpcjogUGF0aCB0byBTdWJ2ZXJzaW9uIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5LCAnbm9uZScsIG9yIE5vbmUuCisgICAgdXNlcl9uYW1lOiBZb3VyIEdvb2dsZSBhY2NvdW50IG5hbWUuCisgICAgdHJpZXM6IEhvdyBtYW55IGF0dGVtcHRzIHRvIG1ha2UuCisgICIiIgorCisgIHdoaWxlIHRyaWVzID4gMDoKKyAgICBpZiB1c2VyX25hbWUgaXMgTm9uZToKKyAgICAgICMgUmVhZCB1c2VybmFtZSBpZiBub3Qgc3BlY2lmaWVkIG9yIGxvYWRlZCBmcm9tIHN2biBjb25maWcsIG9yIG9uCisgICAgICAjIHN1YnNlcXVlbnQgdHJpZXMuCisgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdQbGVhc2UgZW50ZXIgeW91ciBnb29nbGVjb2RlLmNvbSB1c2VybmFtZTogJykKKyAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgdXNlcl9uYW1lID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkucnN0cmlwKCkKKyAgICBpZiBwYXNzd29yZCBpcyBOb25lOgorICAgICAgIyBSZWFkIHBhc3N3b3JkIGlmIG5vdCBsb2FkZWQgZnJvbSBzdm4gY29uZmlnLCBvciBvbiBzdWJzZXF1ZW50IHRyaWVzLgorICAgICAgcHJpbnQgJ1BsZWFzZSBlbnRlciB5b3VyIGdvb2dsZWNvZGUuY29tIHBhc3N3b3JkLicKKyAgICAgIHByaW50ICcqKiBOb3RlIHRoYXQgdGhpcyBpcyBOT1QgeW91ciBHbWFpbCBhY2NvdW50IHBhc3N3b3JkISAqKicKKyAgICAgIHByaW50ICdJdCBpcyB0aGUgcGFzc3dvcmQgeW91IHVzZSB0byBhY2Nlc3MgU3VidmVyc2lvbiByZXBvc2l0b3JpZXMsJworICAgICAgcHJpbnQgJ2FuZCBjYW4gYmUgZm91bmQgaGVyZTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9ob3N0aW5nL3NldHRpbmdzJworICAgICAgcGFzc3dvcmQgPSBnZXRwYXNzLmdldHBhc3MoKQorCisgICAgc3RhdHVzLCByZWFzb24sIHVybCA9IHVwbG9hZChmaWxlX3BhdGgsIHByb2plY3RfbmFtZSwgdXNlcl9uYW1lLCBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnksIGxhYmVscykKKyAgICAjIFJldHVybnMgNDAzIEZvcmJpZGRlbiBpbnN0ZWFkIG9mIDQwMSBVbmF1dGhvcml6ZWQgZm9yIGJhZAorICAgICMgY3JlZGVudGlhbHMgYXMgb2YgMjAwNy0wNy0xNy4KKyAgICBpZiBzdGF0dXMgaW4gW2h0dHBsaWIuRk9SQklEREVOLCBodHRwbGliLlVOQVVUSE9SSVpFRF06CisgICAgICAjIFJlc3QgZm9yIGFub3RoZXIgdHJ5LgorICAgICAgdXNlcl9uYW1lID0gcGFzc3dvcmQgPSBOb25lCisgICAgICB0cmllcyA9IHRyaWVzIC0gMQorICAgIGVsc2U6CisgICAgICAjIFdlJ3JlIGRvbmUuCisgICAgICBicmVhaworCisgIHJldHVybiBzdGF0dXMsIHJlYXNvbiwgdXJsCisKKworZGVmIG1haW4oKToKKyAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdlPSdnb29nbGVjb2RlLXVwbG9hZC5weSAtcyBTVU1NQVJZICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctcCBQUk9KRUNUIFtvcHRpb25zXSBGSUxFJykKKyAgcGFyc2VyLmFkZF9vcHRpb24oJy1zJywgJy0tc3VtbWFyeScsIGRlc3Q9J3N1bW1hcnknLAorICAgICAgICAgICAgICAgICAgICBoZWxwPSdTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgZmlsZScpCisgIHBhcnNlci5hZGRfb3B0aW9uKCctcCcsICctLXByb2plY3QnLCBkZXN0PSdwcm9qZWN0JywKKyAgICAgICAgICAgICAgICAgICAgaGVscD0nR29vZ2xlIENvZGUgcHJvamVjdCBuYW1lJykKKyAgcGFyc2VyLmFkZF9vcHRpb24oJy11JywgJy0tdXNlcicsIGRlc3Q9J3VzZXInLAorICAgICAgICAgICAgICAgICAgICBoZWxwPSdZb3VyIEdvb2dsZSBDb2RlIHVzZXJuYW1lJykKKyAgcGFyc2VyLmFkZF9vcHRpb24oJy13JywgJy0tcGFzc3dvcmQnLCBkZXN0PSdwYXNzd29yZCcsCisgICAgICAgICAgICAgICAgICAgIGhlbHA9J1lvdXIgR29vZ2xlIENvZGUgcGFzc3dvcmQnKQorICBwYXJzZXIuYWRkX29wdGlvbignLWwnLCAnLS1sYWJlbHMnLCBkZXN0PSdsYWJlbHMnLAorICAgICAgICAgICAgICAgICAgICBoZWxwPSdBbiBvcHRpb25hbCBsaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBsYWJlbHMgdG8gYXR0YWNoICcKKyAgICAgICAgICAgICAgICAgICAgJ3RvIHRoZSBmaWxlJykKKworICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgIGlmIG5vdCBvcHRpb25zLnN1bW1hcnk6CisgICAgcGFyc2VyLmVycm9yKCdGaWxlIHN1bW1hcnkgaXMgbWlzc2luZy4nKQorICBlbGlmIG5vdCBvcHRpb25zLnByb2plY3Q6CisgICAgcGFyc2VyLmVycm9yKCdQcm9qZWN0IG5hbWUgaXMgbWlzc2luZy4nKQorICBlbGlmIGxlbihhcmdzKSA8IDE6CisgICAgcGFyc2VyLmVycm9yKCdGaWxlIHRvIHVwbG9hZCBub3QgcHJvdmlkZWQuJykKKyAgZWxpZiBsZW4oYXJncykgPiAxOgorICAgIHBhcnNlci5lcnJvcignT25seSBvbmUgZmlsZSBtYXkgYmUgc3BlY2lmaWVkLicpCisKKyAgZmlsZV9wYXRoID0gYXJnc1swXQorCisgIGlmIG9wdGlvbnMubGFiZWxzOgorICAgIGxhYmVscyA9IG9wdGlvbnMubGFiZWxzLnNwbGl0KCcsJykKKyAgZWxzZToKKyAgICBsYWJlbHMgPSBOb25lCisKKyAgc3RhdHVzLCByZWFzb24sIHVybCA9IHVwbG9hZF9maW5kX2F1dGgoZmlsZV9wYXRoLCBvcHRpb25zLnByb2plY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3VtbWFyeSwgbGFiZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVzZXIsIG9wdGlvbnMucGFzc3dvcmQpCisgIGlmIHVybDoKKyAgICBwcmludCAnVGhlIGZpbGUgd2FzIHVwbG9hZGVkIHN1Y2Nlc3NmdWxseS4nCisgICAgcHJpbnQgJ1VSTDogJXMnICUgdXJsCisgICAgcmV0dXJuIDAKKyAgZWxzZToKKyAgICBwcmludCAnQW4gZXJyb3Igb2NjdXJyZWQuIFlvdXIgZmlsZSB3YXMgbm90IHVwbG9hZGVkLicKKyAgICBwcmludCAnR29vZ2xlIENvZGUgdXBsb2FkIHNlcnZlciBzYWlkOiAlcyAoJXMpJyAlIChyZWFzb24sIHN0YXR1cykKKyAgICByZXR1cm4gMQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL2NzaGFycC9idWlsZC9udXNwZWMueHNkIGIvY3NoYXJwL2J1aWxkL251c3BlYy54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI3NDRkMQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9idWlsZC9udXNwZWMueHNkCkBAIC0wLDAgKzEsNzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPCEtLSBvcmlnaW5hbCBsb2NhdGlvbjogaHR0cHM6Ly9oZzAxLmNvZGVwbGV4LmNvbS9udWdldC9yYXctZmlsZS90aXAvc3JjL0NvcmUvQXV0aG9yaW5nL251c3BlYy54c2QgLS0+DQorPHhzOnNjaGVtYSBpZD0ibnVzcGVjIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYWNrYWdlIj4NCisgICAgICAgIDx4czpjb21wbGV4VHlwZT4NCisgICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQorICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Im1ldGFkYXRhIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSI+DQorICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaWQiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiB0eXBlPSJ4czpzdHJpbmciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InZlcnNpb24iIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiB0eXBlPSJ4czpzdHJpbmciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InRpdGxlIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHM6c3RyaW5nIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhdXRob3JzIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgdHlwZT0ieHM6c3RyaW5nIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvd25lcnMiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4czpzdHJpbmciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImxpY2Vuc2VVcmwiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4czphbnlVUkkiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InByb2plY3RVcmwiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4czphbnlVUkkiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Imljb25VcmwiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4czphbnlVUkkiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJlcXVpcmVMaWNlbnNlQWNjZXB0YW5jZSIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzOmJvb2xlYW4iIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgdHlwZT0ieHM6c3RyaW5nIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzdW1tYXJ5IiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHM6c3RyaW5nIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZWxlYXNlTm90ZXMiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4czpzdHJpbmciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvcHlyaWdodCIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzOnN0cmluZyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibGFuZ3VhZ2UiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImVuLVVTIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ0YWdzIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHM6c3RyaW5nIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJkZXBlbmRlbmNpZXMiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImRlcGVuZGVuY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czplbGVtZW50Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJmcmFtZXdvcmtBc3NlbWJsaWVzIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJmcmFtZXdvcmtBc3NlbWJseSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhc3NlbWJseU5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRhcmdldEZyYW1ld29yayIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czplbGVtZW50Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJlZmVyZW5jZXMiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJlZmVyZW5jZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4NCisgICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQorICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4NCisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmlsZXMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+DQorICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJmaWxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNyYyIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB1c2U9Im9wdGlvbmFsIiB0eXBlPSJ4czpzdHJpbmciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlIiB1c2U9Im9wdGlvbmFsIiB0eXBlPSJ4czpzdHJpbmciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCisgICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQorICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4NCisgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCisgICAgPC94czplbGVtZW50Pg0KKzwveHM6c2NoZW1hPg0KZGlmZiAtLWdpdCBhL2NzaGFycC9idWlsZC9wdWJsaXNoLmNzcHJvaiBiL2NzaGFycC9idWlsZC9wdWJsaXNoLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmU3MWRmCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2J1aWxkL3B1Ymxpc2guY3Nwcm9qCkBAIC0wLDAgKzEsMTg2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJQdWJsaXNoIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorDQorICA8IS0tIGJ1aWxkIHRhcmdldHMgLS0+DQorICA8VGFyZ2V0IE5hbWU9IkNsZWFuIiBEZXBlbmRzT25UYXJnZXRzPSJfQ2xlYW4iIC8+DQorICA8VGFyZ2V0IE5hbWU9IkJ1aWxkIiBEZXBlbmRzT25UYXJnZXRzPSJfQ2xlYW47X1ByZXJlcXVpc2l0ZXM7X1N0YW1wVmVyc2lvbjtfR2VuZXJhdGVTb3VyY2U7X0J1aWxkIiAvPg0KKyAgPFRhcmdldCBOYW1lPSJMYWJlbCIgRGVwZW5kc09uVGFyZ2V0cz0iX0hnTGFiZWwiIC8+DQorICA8VGFyZ2V0IE5hbWU9IlBhY2thZ2UiIERlcGVuZHNPblRhcmdldHM9Il9IZ1BhY2s7X051Z2V0UGFjayIgLz4NCisgIDxUYXJnZXQgTmFtZT0iUHJlcGFyZSIgRGVwZW5kc09uVGFyZ2V0cz0iQ2xlYW47QnVpbGQ7TGFiZWw7UGFja2FnZSIgLz4NCisgIDxUYXJnZXQgTmFtZT0iUHVzaEFsbCIgRGVwZW5kc09uVGFyZ2V0cz0iX0hnUHVzaDtfTnVnZXRQdXNoIiAvPg0KKyAgPFRhcmdldCBOYW1lPSJQdWJsaXNoIiBEZXBlbmRzT25UYXJnZXRzPSJQcmVwYXJlO1B1c2hBbGwiIC8+DQorDQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPFByb2plY3ROYW1lPlByb3RvY29sIEJ1ZmZlcnM8L1Byb2plY3ROYW1lPg0KKyAgICA8VmVyc2lvbk1ham9yPjI8L1ZlcnNpb25NYWpvcj4NCisgICAgPFZlcnNpb25NaW5vcj40PC9WZXJzaW9uTWlub3I+DQorICAgIDxWZXJzaW9uQnVpbGQ+MTwvVmVyc2lvbkJ1aWxkPg0KKyAgICA8VmVyc2lvblJldmlzaW9uPjwvVmVyc2lvblJldmlzaW9uPg0KKyAgICA8VmVyc2lvbkxhYmVsPjwvVmVyc2lvbkxhYmVsPg0KKw0KKyAgICA8UGFja2FnZVByZWZpeD5wcm90b2J1Zi1jc2hhcnAtcG9ydC08L1BhY2thZ2VQcmVmaXg+DQorICAgIDxQdWJsaXNoRGVidWc+ZmFsc2U8L1B1Ymxpc2hEZWJ1Zz4NCisgICAgDQorICAgIDxHb29nbGVVc2VybmFtZT48L0dvb2dsZVVzZXJuYW1lPg0KKyAgICA8R29vZ2xlUGFzc3dvcmQ+PC9Hb29nbGVQYXNzd29yZD4NCisgICAgDQorICAgIDwhLS1EaXJlY3RvcnkgUGF0aHMtLT4NCisgICAgPFByb2plY3REaXJlY3Rvcnk+JChNU0J1aWxkUHJvamVjdERpcmVjdG9yeSlcLi48L1Byb2plY3REaXJlY3Rvcnk+DQorICAgIDxCdWlsZFRlbXBEaXJlY3Rvcnk+JChQcm9qZWN0RGlyZWN0b3J5KVxidWlsZF90ZW1wPC9CdWlsZFRlbXBEaXJlY3Rvcnk+DQorICAgIDxCdWlsZE91dHB1dERpcmVjdG9yeT4kKFByb2plY3REaXJlY3RvcnkpXGJ1aWxkX291dHB1dDwvQnVpbGRPdXRwdXREaXJlY3Rvcnk+DQorICAgIDxTb3VyY2VEaXJlY3Rvcnk+JChQcm9qZWN0RGlyZWN0b3J5KVxzcmM8L1NvdXJjZURpcmVjdG9yeT4NCisgICAgPExpYkRpcmVjdG9yeT4kKFByb2plY3REaXJlY3RvcnkpXGxpYjwvTGliRGlyZWN0b3J5Pg0KKyAgICANCisgICAgPCEtLSBGaWxlIFBhdGhzIC0tPg0KKyAgICA8U2lnbmluZ0tleT4kKFByb2plY3REaXJlY3RvcnkpXHJlbGVhc2Uta2V5XEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9TaWduaW5nS2V5Pg0KKyAgICANCisgICAgPCEtLVRvb2wgUGF0aHMtLT4NCisgICAgPEhnVG9vbD5oZy5leGU8L0hnVG9vbD4NCisgICAgPFB5dGhvbj5DOlxQeXRob24yNVxweXRob24uZXhlPC9QeXRob24+DQorICAgIDxTblRvb2w+JChyZWdpc3RyeTpIS0VZX0xPQ0FMX01BQ0hJTkVcU09GVFdBUkVcTWljcm9zb2Z0XE1pY3Jvc29mdCBTREtzXFdpbmRvd3NcdjcuMEFASW5zdGFsbGF0aW9uRm9sZGVyKUJpblxzbi5leGU8L1NuVG9vbD4NCisgICAgPFN0YW1wVmVyPiQoTGliRGlyZWN0b3J5KVxTdGFtcFZlcnNpb24uZXhlPC9TdGFtcFZlcj4NCisgICAgPFppcEV4ZVBhdGg+JChMaWJEaXJlY3RvcnkpXDctWmlwIDkuMjBcN3phLmV4ZTwvWmlwRXhlUGF0aD4NCisgICAgPE51R2V0PiQoTGliRGlyZWN0b3J5KVxOdUdldC5leGU8L051R2V0Pg0KKyAgICA8UHJvdG9nZW5FeGVQYXRoPiQoQnVpbGRPdXRwdXREaXJlY3RvcnkpXHRvb2xzXHByb3RvZ2VuLmV4ZTwvUHJvdG9nZW5FeGVQYXRoPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgDQorICA8IS0tIEltcG9ydCB1c2VyIHNldHRpbmdzIC0tPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRQcm9qZWN0RnVsbFBhdGgpLnVzZXIiIENvbmRpdGlvbj0iRXhpc3RzKCckKE1TQnVpbGRQcm9qZWN0RnVsbFBhdGgpLnVzZXInKSIgLz4NCisNCisgIDwhLS0gRmlsZXMgLS0+DQorICA8SXRlbUdyb3VwPg0KKyAgPC9JdGVtR3JvdXA+DQorICANCisgIDwhLS0gVGFza3MgLS0+DQorDQorICA8VGFyZ2V0IE5hbWU9Il9QcmVyZXF1aXNpdGVzIiBEZXBlbmRzT25UYXJnZXRzPSJfQ2hlY2tFbnZpcm9ubWVudDtfUmVhZFZlcnNpb24iIC8+DQorICANCisgIDxUYXJnZXQgTmFtZT0iX0NsZWFuIj4NCisgICAgPE1TQnVpbGQgUHJvcGVydGllcz0iQ29uZmlndXJhdGlvbj1EZWJ1ZzsiIFRhcmdldHM9IkNsZWFuIiBQcm9qZWN0cz0iJChNU0J1aWxkUHJvamVjdERpcmVjdG9yeSlcdGFyZ2V0LmNzcHJvaiIgLz4NCisgICAgPE1TQnVpbGQgUHJvcGVydGllcz0iQ29uZmlndXJhdGlvbj1SZWxlYXNlOyIgVGFyZ2V0cz0iQ2xlYW4iIFByb2plY3RzPSIkKE1TQnVpbGRQcm9qZWN0RGlyZWN0b3J5KVx0YXJnZXQuY3Nwcm9qIiAvPg0KKyAgICA8TWFrZURpciBEaXJlY3Rvcmllcz0iJChCdWlsZFRlbXBEaXJlY3RvcnkpIiAvPg0KKyAgICA8TWFrZURpciBEaXJlY3Rvcmllcz0iJChCdWlsZE91dHB1dERpcmVjdG9yeSkiIC8+DQorICA8L1RhcmdldD4NCisNCisgIDxUYXJnZXQgTmFtZT0iX1dyaXRlVXNlckNvbmZpZyI+DQorICAgIDxJdGVtR3JvdXA+DQorICAgICAgPExpbmVzIEluY2x1ZGU9IiZsdDtQcm9qZWN0IHhtbG5zPSdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMnPiIgLz4NCisgICAgICA8TGluZXMgSW5jbHVkZT0iICAmbHQ7UHJvcGVydHlHcm91cD4iLz4NCisgICAgICA8TGluZXMgSW5jbHVkZT0iICAgICZsdDtHb29nbGVVc2VybmFtZT4gKEVudGVyIHlvdXIgZ29vZ2xlLWNvZGUgdXNlci9wYXNzd29yZCBoZXJlKSAmbHQ7L0dvb2dsZVVzZXJuYW1lPiIvPg0KKyAgICAgIDxMaW5lcyBJbmNsdWRlPSIgICAgJmx0O0dvb2dsZVBhc3N3b3JkPiZsdDsvR29vZ2xlUGFzc3dvcmQ+Ii8+DQorICAgICAgPExpbmVzIEluY2x1ZGU9IiAgJmx0Oy9Qcm9wZXJ0eUdyb3VwPiIgLz4NCisgICAgICA8TGluZXMgSW5jbHVkZT0iJmx0Oy9Qcm9qZWN0PiIgLz4NCisgICAgPC9JdGVtR3JvdXA+DQorICAgIDxXcml0ZUxpbmVzVG9GaWxlIEZpbGU9IiQoTVNCdWlsZFByb2plY3RGdWxsUGF0aCkudXNlciIgTGluZXM9IkAoTGluZXMpIiBPdmVyd3JpdGU9InRydWUiIENvbmRpdGlvbj0iIUV4aXN0cygnJChNU0J1aWxkUHJvamVjdEZ1bGxQYXRoKS51c2VyJykiIC8+DQorICAgIDxFeGVjIENvbW1hbmQ9Ik5vdGVwYWQuZXhlICQoTVNCdWlsZFByb2plY3RGdWxsUGF0aCkudXNlciIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgDQorICA8VGFyZ2V0IE5hbWU9Il9DaGVja0Vudmlyb25tZW50Ij4NCisgICAgPCEtLSBSZXF1aXJlIGdvb2dsZSBjcmVkZW50aWFscyAtLT4NCisgICAgPENhbGxUYXJnZXQgVGFyZ2V0cz0iX1dyaXRlVXNlckNvbmZpZyIgQ29uZGl0aW9uPSIgJyQoR29vZ2xlUGFzc3dvcmQpJyA9PSAnJyAiIC8+DQorICAgIDxFcnJvciBUZXh0PSJSZXN0YXJ0IGFmdGVyIHlvdSB2ZXJpZnkgeW91ciBjcmVkZW50aWFscyBpbiAkKE1TQnVpbGRQcm9qZWN0RnVsbFBhdGgpLnVzZXIiIENvbmRpdGlvbj0iICckKEdvb2dsZVBhc3N3b3JkKScgPT0gJycgIiAvPg0KKyAgICA8IS0tIFJlcXVpcmUgV2luNy4wQSBTREsgdG8gdmVyaWZ5IHN0cm9uZy1uYW1lIC0tPg0KKyAgICA8RXJyb3IgVGV4dD0iVW5hYmxlIHRvIGxvY2F0ZSBXaW43U0RLIFRvb2xzOiAkKFNuVG9vbCkiIENvbmRpdGlvbj0iIUV4aXN0cygkKFNuVG9vbCkpIiAvPg0KKyAgICA8IS0tIFJlcXVpcmUgUHl0aG9uIDIuNSBpbnN0YWxsZWQgLS0+DQorICAgIDwhLS0gRXJyb3IgVGV4dD0iVW5hYmxlIHRvIGxvY2F0ZSBQeXRob24gMi41OiAkKFB5dGhvbikiIENvbmRpdGlvbj0iIUV4aXN0cygkKFB5dGhvbikpIiAvIC0tPg0KKyAgICA8IS0tIFJlcXVpcmUgcHJvZHVjdGlvbiBzaWduaW5nIGtleSAtLT4NCisgICAgPEV4ZWMgQ29tbWFuZD0iJChIZ1Rvb2wpIGNsb25lIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9ya25hcHAvcHJvdG9idWYtY3NoYXJwLXBvcnQta2V5ZmlsZSAkKFByb2plY3REaXJlY3RvcnkpXHJlbGVhc2Uta2V5IiBDb25kaXRpb249IiFFeGlzdHMoJyQoU2lnbmluZ0tleSknKSIgLz4NCisgICAgPEVycm9yIFRleHQ9IlVuYWJsZSB0byBsb2NhdGUgcmVsZWFzZSBzaWduaW5nIGtleTogJChTaWduaW5nS2V5KSIgQ29uZGl0aW9uPSIhRXhpc3RzKCQoU2lnbmluZ0tleSkpIiAvPg0KKyAgPC9UYXJnZXQ+DQorDQorICA8VGFyZ2V0IE5hbWU9Il9SZWFkVmVyc2lvbiIgQ29uZGl0aW9uPSIgJyQoVmVyc2lvbkxhYmVsKScgPT0gJycgIj4NCisgICAgPEV4ZWMgQ29tbWFuZD0iJChIZ1Rvb2wpIGxvZyAtbCAxIC0tdGVtcGxhdGUgJnF1b3Q7e3Jldn0mcXVvdDsgPiAmcXVvdDskKEJ1aWxkVGVtcERpcmVjdG9yeSlccmV2aXNpb24udHh0JnF1b3Q7Ij48L0V4ZWM+DQorICAgIDxSZWFkTGluZXNGcm9tRmlsZSBGaWxlPSIkKEJ1aWxkVGVtcERpcmVjdG9yeSlccmV2aXNpb24udHh0Ij4NCisgICAgICA8T3V0cHV0IFRhc2tQYXJhbWV0ZXI9IkxpbmVzIiBQcm9wZXJ0eU5hbWU9IlZlcnNpb25SZXZpc2lvbiIvPg0KKyAgICA8L1JlYWRMaW5lc0Zyb21GaWxlPg0KKw0KKyAgICA8UHJvcGVydHlHcm91cD4NCisgICAgICA8VmVyc2lvbkxhYmVsPiQoVmVyc2lvbk1ham9yKS4kKFZlcnNpb25NaW5vcikuJChWZXJzaW9uQnVpbGQpLiQoVmVyc2lvblJldmlzaW9uKTwvVmVyc2lvbkxhYmVsPg0KKyAgICA8L1Byb3BlcnR5R3JvdXA+DQorICAgIA0KKyAgICA8TWVzc2FnZSBUZXh0PSJCdWlsZGluZyB2ZXJzaW9uICQoVmVyc2lvbkxhYmVsKSIgSW1wb3J0YW5jZT0iaGlnaCIgLz4NCisgIDwvVGFyZ2V0Pg0KKw0KKyAgPFRhcmdldCBOYW1lPSJfU3RhbXBWZXJzaW9uIiBEZXBlbmRzT25UYXJnZXRzPSJfUHJlcmVxdWlzaXRlcyI+DQorICAgIDxFeGVjIENvbW1hbmQ9IiQoU3RhbXBWZXIpIC9tYWpvcjokKFZlcnNpb25NYWpvcikgL21pbm9yOiQoVmVyc2lvbk1pbm9yKSAvYnVpbGQ6JChWZXJzaW9uQnVpbGQpIC9yZXZpc2lvbjokKFZlcnNpb25SZXZpc2lvbikiIFdvcmtpbmdEaXJlY3Rvcnk9IiQoU291cmNlRGlyZWN0b3J5KSIgLz4NCisgICAgPEV4ZWMgQ29tbWFuZD0iRklORCAmcXVvdDskKFZlcnNpb25MYWJlbCkmcXVvdDsgUHJvdG9jb2xCdWZmZXJzXFByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiBXb3JraW5nRGlyZWN0b3J5PSIkKFNvdXJjZURpcmVjdG9yeSkiIC8+DQorICA8L1RhcmdldD4NCisNCisgIDxUYXJnZXQgTmFtZT0iX0dlbmVyYXRlU291cmNlIiBEZXBlbmRzT25UYXJnZXRzPSJfUHJlcmVxdWlzaXRlcyI+DQorICAgIDxNU0J1aWxkIFByb3BlcnRpZXM9IkNvbmZpZ3VyYXRpb249UmVsZWFzZTtBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPSQoU2lnbmluZ0tleSkiIFRhcmdldHM9IkdlbmVyYXRlUHJvamVjdHM7QnVpbGRUb29scztHZW5lcmF0ZVNvdXJjZSIgUHJvamVjdHM9IiQoTVNCdWlsZFByb2plY3REaXJlY3RvcnkpXGJ1aWxkLmNzcHJvaiIgLz4NCisgICAgPEV4ZWMgQ29tbWFuZD0iJnF1b3Q7JChTblRvb2wpJnF1b3Q7IC1UICZxdW90OyQoUHJvdG9nZW5FeGVQYXRoKSZxdW90OyA+IHNpZ25rZXkudHh0IiBXb3JraW5nRGlyZWN0b3J5PSIkKEJ1aWxkVGVtcERpcmVjdG9yeSkiIC8+DQorICAgIDwhLS0gTWFrZSBzdXJlIHdlIGFyZSBzaWduaW5nIHdpdGggdGhlIGNvcnJlY3Qga2V5IC0tPg0KKyAgICA8RXhlYyBDb21tYW5kPSJGSU5EICZxdW90OzU1ZjcxMjUyMzRiZWI1ODkmcXVvdDsgc2lnbmtleS50eHQiIFdvcmtpbmdEaXJlY3Rvcnk9IiQoQnVpbGRUZW1wRGlyZWN0b3J5KSIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgDQorICA8VGFyZ2V0IE5hbWU9Il9CdWlsZCIgRGVwZW5kc09uVGFyZ2V0cz0iX1ByZXJlcXVpc2l0ZXMiPg0KKyAgICA8IS0tIFJlbGVhc2UgQnVpbGQgLS0+DQorICAgIDxNU0J1aWxkIFByb3BlcnRpZXM9IkNvbmZpZ3VyYXRpb249UmVsZWFzZTtBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPSQoU2lnbmluZ0tleSkiIFRhcmdldHM9Il9Db21waWxlQWxsIiBQcm9qZWN0cz0iJChNU0J1aWxkUHJvamVjdERpcmVjdG9yeSlcYnVpbGQuY3Nwcm9qIiAvPg0KKyAgICA8TVNCdWlsZCBQcm9wZXJ0aWVzPSJDb25maWd1cmF0aW9uPVJlbGVhc2U7QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT0kKFNpZ25pbmdLZXkpO1BhY2thZ2VOYW1lPSQoUGFja2FnZVByZWZpeCkkKFZlcnNpb25MYWJlbCktcmVsZWFzZSIgVGFyZ2V0cz0iR2VuZXJhdGVQYWNrYWdlIiBQcm9qZWN0cz0iJChNU0J1aWxkUHJvamVjdERpcmVjdG9yeSlcYnVpbGQuY3Nwcm9qIiAvPg0KKyAgICA8IS0tIERlYnVnIEJ1aWxkIC0tPg0KKyAgICA8TVNCdWlsZCBDb25kaXRpb249IiAnJChQdWJsaXNoRGVidWcpJyA9PSAndHJ1ZScgIiBQcm9wZXJ0aWVzPSJDb25maWd1cmF0aW9uPURlYnVnO0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU9JChTaWduaW5nS2V5KSIgVGFyZ2V0cz0iX0NvbXBpbGVBbGwiIFByb2plY3RzPSIkKE1TQnVpbGRQcm9qZWN0RGlyZWN0b3J5KVxidWlsZC5jc3Byb2oiIC8+DQorICAgIDxNU0J1aWxkIENvbmRpdGlvbj0iICckKFB1Ymxpc2hEZWJ1ZyknID09ICd0cnVlJyAiIFByb3BlcnRpZXM9IkNvbmZpZ3VyYXRpb249RGVidWc7QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT0kKFNpZ25pbmdLZXkpO1BhY2thZ2VOYW1lPSQoUGFja2FnZVByZWZpeCkkKFZlcnNpb25MYWJlbCktZnVsbCIgVGFyZ2V0cz0iR2VuZXJhdGVQYWNrYWdlIiBQcm9qZWN0cz0iJChNU0J1aWxkUHJvamVjdERpcmVjdG9yeSlcYnVpbGQuY3Nwcm9qIiAvPg0KKyAgPC9UYXJnZXQ+DQorDQorICA8VGFyZ2V0IE5hbWU9Il9IZ1BhY2siIERlcGVuZHNPblRhcmdldHM9Il9QcmVyZXF1aXNpdGVzIj4NCisgICAgPEV4ZWMgQ29tbWFuZD0iJChIZ1Rvb2wpIGFyY2hpdmUgJChCdWlsZFRlbXBEaXJlY3RvcnkpXCQoUGFja2FnZVByZWZpeCkkKFZlcnNpb25MYWJlbCktc291cmNlLnppcCIgV29ya2luZ0RpcmVjdG9yeT0iJChQcm9qZWN0RGlyZWN0b3J5KSIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgDQorICA8VGFyZ2V0IE5hbWU9Il9IZ0xhYmVsIiBEZXBlbmRzT25UYXJnZXRzPSJfUHJlcmVxdWlzaXRlcyI+DQorICAgIDxFeGVjIENvbW1hbmQ9IiQoSGdUb29sKSBjb21taXQgLW0gJnF1b3Q7dmVyc2lvbiAkKFZlcnNpb25MYWJlbCkmcXVvdDsiIFdvcmtpbmdEaXJlY3Rvcnk9IiQoUHJvamVjdERpcmVjdG9yeSkiIC8+DQorICAgIDxFeGVjIENvbW1hbmQ9IiQoSGdUb29sKSB0YWcgJChWZXJzaW9uTGFiZWwpIiBXb3JraW5nRGlyZWN0b3J5PSIkKFByb2plY3REaXJlY3RvcnkpIiAvPg0KKyAgPC9UYXJnZXQ+DQorICANCisgIDxUYXJnZXQgTmFtZT0iX0hnUHVzaCIgRGVwZW5kc09uVGFyZ2V0cz0iX1ByZXJlcXVpc2l0ZXMiPg0KKyAgICA8RXhlYyBDb21tYW5kPSIkKEhnVG9vbCkgcHVzaCIgV29ya2luZ0RpcmVjdG9yeT0iJChQcm9qZWN0RGlyZWN0b3J5KSIgLz4NCisgIDwvVGFyZ2V0Pg0KKw0KKyAgPFRhcmdldCBOYW1lPSJfUGtnUHVzaCIgRGVwZW5kc09uVGFyZ2V0cz0iX1ByZXJlcXVpc2l0ZXMiPg0KKyAgICA8UHJvcGVydHlHcm91cD4NCisgICAgICA8VXBsb2FkUGFja2FnZT4kKFB5dGhvbikgIiQoTVNCdWlsZFByb2plY3REaXJlY3RvcnkpXGdvb2dsZWNvZGVfdXBsb2FkLnB5IiAtLXByb2plY3QgcHJvdG9idWYtY3NoYXJwLXBvcnQgLS11c2VyICIkKEdvb2dsZVVzZXJuYW1lKSIgLS1wYXNzd29yZCAiJChHb29nbGVQYXNzd29yZCkiPC9VcGxvYWRQYWNrYWdlPg0KKyAgICAgIA0KKyAgICAgIDxTb3VyY2VQYWNrYWdlPiQoQnVpbGRUZW1wRGlyZWN0b3J5KVwkKFBhY2thZ2VQcmVmaXgpJChWZXJzaW9uTGFiZWwpLXNvdXJjZS56aXA8L1NvdXJjZVBhY2thZ2U+DQorICAgICAgPFJlbGVhc2VQYWNrYWdlQmluPiQoQnVpbGRUZW1wRGlyZWN0b3J5KVwkKFBhY2thZ2VQcmVmaXgpJChWZXJzaW9uTGFiZWwpLXJlbGVhc2UtYmluYXJpZXMuemlwPC9SZWxlYXNlUGFja2FnZUJpbj4NCisgICAgICA8UmVsZWFzZVBhY2thZ2VTeWI+JChCdWlsZFRlbXBEaXJlY3RvcnkpXCQoUGFja2FnZVByZWZpeCkkKFZlcnNpb25MYWJlbCktcmVsZWFzZS1zeW1ib2xzLnppcDwvUmVsZWFzZVBhY2thZ2VTeWI+DQorICAgICAgPERlYnVnUGFja2FnZUJpbj4kKEJ1aWxkVGVtcERpcmVjdG9yeSlcJChQYWNrYWdlUHJlZml4KSQoVmVyc2lvbkxhYmVsKS1mdWxsLWJpbmFyaWVzLnppcDwvRGVidWdQYWNrYWdlQmluPg0KKyAgICAgIDxEZWJ1Z1BhY2thZ2VTeWI+JChCdWlsZFRlbXBEaXJlY3RvcnkpXCQoUGFja2FnZVByZWZpeCkkKFZlcnNpb25MYWJlbCktZnVsbC1zeW1ib2xzLnppcDwvRGVidWdQYWNrYWdlU3liPg0KKyAgICA8L1Byb3BlcnR5R3JvdXA+DQorDQorICAgIDxFcnJvciBDb25kaXRpb249IiFFeGlzdHMoJyQoU291cmNlUGFja2FnZSknKSIgVGV4dD0iRmlsZSBub3QgZm91bmQ6ICQoU291cmNlUGFja2FnZSkiIC8+DQorICAgIDxFcnJvciBDb25kaXRpb249IiFFeGlzdHMoJyQoUmVsZWFzZVBhY2thZ2VCaW4pJykiIFRleHQ9IkZpbGUgbm90IGZvdW5kOiAkKFJlbGVhc2VQYWNrYWdlQmluKSIgLz4NCisgICAgPEVycm9yIENvbmRpdGlvbj0iIUV4aXN0cygnJChSZWxlYXNlUGFja2FnZVN5YiknKSIgVGV4dD0iRmlsZSBub3QgZm91bmQ6ICQoUmVsZWFzZVBhY2thZ2VTeWIpIiAvPg0KKyAgICA8RXJyb3IgQ29uZGl0aW9uPSInJChQdWJsaXNoRGVidWcpJyA9PSAndHJ1ZScgQW5kICFFeGlzdHMoJyQoRGVidWdQYWNrYWdlQmluKScpIiBUZXh0PSJGaWxlIG5vdCBmb3VuZDogJChEZWJ1Z1BhY2thZ2VCaW4pIiAvPg0KKyAgICA8RXJyb3IgQ29uZGl0aW9uPSInJChQdWJsaXNoRGVidWcpJyA9PSAndHJ1ZScgQW5kICFFeGlzdHMoJyQoRGVidWdQYWNrYWdlU3liKScpIiBUZXh0PSJGaWxlIG5vdCBmb3VuZDogJChEZWJ1Z1BhY2thZ2VTeWIpIiAvPg0KKw0KKyAgICA8RXhlYyBXb3JraW5nRGlyZWN0b3J5PSIkKFByb2plY3REaXJlY3RvcnkpIg0KKyAgICAgICAgICBDb21tYW5kPSIkKFVwbG9hZFBhY2thZ2UpIC0tbGFiZWxzIFR5cGUtU291cmNlLEZlYXR1cmVkIC0tc3VtbWFyeSAmcXVvdDtWZXJzaW9uICQoVmVyc2lvbkxhYmVsKSBzb3VyY2UmcXVvdDsgJChTb3VyY2VQYWNrYWdlKSIgLz4NCisgICAgDQorICAgIDxFeGVjIFdvcmtpbmdEaXJlY3Rvcnk9IiQoUHJvamVjdERpcmVjdG9yeSkiDQorICAgICAgICAgIENvbW1hbmQ9IiQoVXBsb2FkUGFja2FnZSkgLS1sYWJlbHMgVHlwZS1FeGVjdXRhYmxlLEZlYXR1cmVkIC0tc3VtbWFyeSAmcXVvdDtWZXJzaW9uICQoVmVyc2lvbkxhYmVsKSByZWxlYXNlIGJpbmFyaWVzIG9ubHkmcXVvdDsgJChSZWxlYXNlUGFja2FnZUJpbikiIC8+DQorICAgIDxFeGVjIFdvcmtpbmdEaXJlY3Rvcnk9IiQoUHJvamVjdERpcmVjdG9yeSkiDQorICAgICAgICAgIENvbW1hbmQ9IiQoVXBsb2FkUGFja2FnZSkgLS1sYWJlbHMgVHlwZS1FeGVjdXRhYmxlLEZlYXR1cmVkIC0tc3VtbWFyeSAmcXVvdDtWZXJzaW9uICQoVmVyc2lvbkxhYmVsKSByZWxlYXNlIGJpbmFyaWVzIGFuZCBzeW1ib2xzJnF1b3Q7ICQoUmVsZWFzZVBhY2thZ2VTeWIpIiAvPg0KKw0KKyAgICA8RXhlYyBXb3JraW5nRGlyZWN0b3J5PSIkKFByb2plY3REaXJlY3RvcnkpIiBDb25kaXRpb249IiAnJChQdWJsaXNoRGVidWcpJyA9PSAndHJ1ZScgIg0KKyAgICAgICAgICBDb21tYW5kPSIkKFVwbG9hZFBhY2thZ2UpIC0tbGFiZWxzIFR5cGUtRXhlY3V0YWJsZSxGZWF0dXJlZCAtLXN1bW1hcnkgJnF1b3Q7VmVyc2lvbiAkKFZlcnNpb25MYWJlbCkgYWxsIGJpbmFyaWVzJnF1b3Q7ICQoRGVidWdQYWNrYWdlQmluKSIgLz4NCisgICAgPEV4ZWMgV29ya2luZ0RpcmVjdG9yeT0iJChQcm9qZWN0RGlyZWN0b3J5KSIgQ29uZGl0aW9uPSIgJyQoUHVibGlzaERlYnVnKScgPT0gJ3RydWUnICINCisgICAgICAgICAgQ29tbWFuZD0iJChVcGxvYWRQYWNrYWdlKSAtLWxhYmVscyBUeXBlLUV4ZWN1dGFibGUsRmVhdHVyZWQgLS1zdW1tYXJ5ICZxdW90O1ZlcnNpb24gJChWZXJzaW9uTGFiZWwpIGFsbCBiaW5hcmllcyBhbmQgc3ltYm9scyZxdW90OyAkKERlYnVnUGFja2FnZVN5YikiIC8+DQorICA8L1RhcmdldD4NCisNCisgIDxUYXJnZXQgTmFtZT0iX051Z2V0UGFjayIgRGVwZW5kc09uVGFyZ2V0cz0iX1ByZXJlcXVpc2l0ZXMiPg0KKyAgICA8RXhlYyBXb3JraW5nRGlyZWN0b3J5PSIkKE1TQnVpbGRQcm9qZWN0RGlyZWN0b3J5KSINCisgICAgICBDb21tYW5kPSIkKE51R2V0KSB1cGRhdGUgLXNlbGYiIC8+DQorICAgIDxFeGVjIFdvcmtpbmdEaXJlY3Rvcnk9IiQoTVNCdWlsZFByb2plY3REaXJlY3RvcnkpIg0KKyAgICAgIENvbW1hbmQ9IiQoTnVHZXQpIHBhY2sgR29vZ2xlLlByb3RvY29sQnVmZmVycy5udXNwZWMgLVN5bWJvbHMgLVZlcnNpb24gJChWZXJzaW9uTGFiZWwpIC1Ob1BhY2thZ2VBbmFseXNpcyAtT3V0cHV0RGlyZWN0b3J5ICQoQnVpbGRUZW1wRGlyZWN0b3J5KSIgLz4NCisgICAgPEV4ZWMgV29ya2luZ0RpcmVjdG9yeT0iJChNU0J1aWxkUHJvamVjdERpcmVjdG9yeSkiDQorICAgICAgQ29tbWFuZD0iJChOdUdldCkgcGFjayBHb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5udXNwZWMgLVN5bWJvbHMgLVZlcnNpb24gJChWZXJzaW9uTGFiZWwpIC1Ob1BhY2thZ2VBbmFseXNpcyAtT3V0cHV0RGlyZWN0b3J5ICQoQnVpbGRUZW1wRGlyZWN0b3J5KSIgLz4NCisgIDwvVGFyZ2V0Pg0KKw0KKyAgPFRhcmdldCBOYW1lPSJfTnVnZXRQdXNoIiBEZXBlbmRzT25UYXJnZXRzPSJfUHJlcmVxdWlzaXRlcyI+DQorICAgIDxFeGVjIFdvcmtpbmdEaXJlY3Rvcnk9IiQoQnVpbGRUZW1wRGlyZWN0b3J5KSIgQ29tbWFuZD0iJChOdUdldCkgcHVzaCBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLiQoVmVyc2lvbkxhYmVsKS5udXBrZyIgQ29udGludWVPbkVycm9yPSJ0cnVlIiAvPg0KKyAgICA8RXhlYyBXb3JraW5nRGlyZWN0b3J5PSIkKEJ1aWxkVGVtcERpcmVjdG9yeSkiIENvbW1hbmQ9IiQoTnVHZXQpIHB1c2ggR29vZ2xlLlByb3RvY29sQnVmZmVyc0xpdGUuJChWZXJzaW9uTGFiZWwpLm51cGtnIiBDb250aW51ZU9uRXJyb3I9InRydWUiIC8+DQorDQorICAgIDxFeGVjIFdvcmtpbmdEaXJlY3Rvcnk9IiQoQnVpbGRUZW1wRGlyZWN0b3J5KSIgQ29tbWFuZD0iJChOdUdldCkgcHVzaCBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLiQoVmVyc2lvbkxhYmVsKS5zeW1ib2xzLm51cGtnIiBDb250aW51ZU9uRXJyb3I9InRydWUiIC8+DQorICAgIDxFeGVjIFdvcmtpbmdEaXJlY3Rvcnk9IiQoQnVpbGRUZW1wRGlyZWN0b3J5KSIgQ29tbWFuZD0iJChOdUdldCkgcHVzaCBHb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS4kKFZlcnNpb25MYWJlbCkuc3ltYm9scy5udXBrZyIgQ29udGludWVPbkVycm9yPSJ0cnVlIiAvPg0KKyAgPC9UYXJnZXQ+DQorICANCis8L1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2J1aWxkL3RhcmdldC5jc3Byb2ogYi9jc2hhcnAvYnVpbGQvdGFyZ2V0LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWE5ZDUwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2J1aWxkL3RhcmdldC5jc3Byb2oKQEAgLTAsMCArMSwxNjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorSGlnaC1sZXZlbCBUYXJnZXRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8VGFyZ2V0IE5hbWU9IkNsZWFuIiBEZXBlbmRzT25UYXJnZXRzPSJfQ2xlYW4iIC8+CisgIDxUYXJnZXQgTmFtZT0iQnVpbGQiIERlcGVuZHNPblRhcmdldHM9Il9Db21waWxlO19UZXN0IiAvPgorICA8VGFyZ2V0IE5hbWU9IlRlc3QiIERlcGVuZHNPblRhcmdldHM9Il9UZXN0IiAvPgorICA8VGFyZ2V0IE5hbWU9IlJlYnVpbGQiIERlcGVuZHNPblRhcmdldHM9IkNsZWFuO0J1aWxkIiAvPgorICA8VGFyZ2V0IE5hbWU9IlB1Ymxpc2giIERlcGVuZHNPblRhcmdldHM9IkNsZWFuO0J1aWxkO19QdWJsaXNoIiAvPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUHJvcGVydGllcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnkgQ1BVPC9QbGF0Zm9ybT4KKyAgICA8VGFyZ2V0VmVyc2lvbiBDb25kaXRpb249IiAnJChUYXJnZXRWZXJzaW9uKScgPT0gJycgIj5ORVQyMDwvVGFyZ2V0VmVyc2lvbj4KKyAgICA8QnVpbGRQYXJhbXM+PC9CdWlsZFBhcmFtcz4KKworICAgIDwhLS1EaXJlY3RvcnkgUGF0aHMtLT4KKyAgICA8UHJvamVjdERpcmVjdG9yeT4kKE1TQnVpbGRQcm9qZWN0RGlyZWN0b3J5KVwuLjwvUHJvamVjdERpcmVjdG9yeT4KKyAgICA8U291cmNlRGlyZWN0b3J5PiQoUHJvamVjdERpcmVjdG9yeSlcc3JjPC9Tb3VyY2VEaXJlY3Rvcnk+CisgICAgPExpYkRpcmVjdG9yeT4kKFByb2plY3REaXJlY3RvcnkpXGxpYjwvTGliRGlyZWN0b3J5PgorCisgICAgPCEtLUZpbGUgUGF0aHMtLT4KKyAgICA8QnVpbGRUZW1wRGlyZWN0b3J5PiQoUHJvamVjdERpcmVjdG9yeSlcYnVpbGRfdGVtcFwkKENvbmZpZ3VyYXRpb24pXCQoVGFyZ2V0VmVyc2lvbik8L0J1aWxkVGVtcERpcmVjdG9yeT4KKyAgICA8QnVpbGRPdXRwdXREaXJlY3Rvcnk+JChQcm9qZWN0RGlyZWN0b3J5KVxidWlsZF9vdXRwdXRcJChDb25maWd1cmF0aW9uKVwkKFRhcmdldFZlcnNpb24pPC9CdWlsZE91dHB1dERpcmVjdG9yeT4KKyAgICA8U29sdXRpb25GaWxlPiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnNMaWJyYXJ5LiQoVGFyZ2V0VmVyc2lvbikuc2xuPC9Tb2x1dGlvbkZpbGU+CisKKyAgICA8IS0tVG9vbCBQYXRocy0tPgorICAgIDxOVW5pdEV4ZVBhdGg+JChMaWJEaXJlY3RvcnkpXE5Vbml0XHRvb2xzXG51bml0LWNvbnNvbGUuZXhlPC9OVW5pdEV4ZVBhdGg+CisgICAgPFN0YXRMaWdodEV4ZVBhdGg+JChMaWJEaXJlY3RvcnkpXFN0YXRMaWdodFx0b29sc1xTdGF0TGlnaHQuZXhlPC9TdGF0TGlnaHRFeGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVGFyZ2V0IFZlcnNpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChUYXJnZXRWZXJzaW9uKScgPT0gJ05FVDIwJyAiPgorICAgIDxCdWlsZFRvb2xzPjMuNTwvQnVpbGRUb29scz4KKyAgICA8VGVzdEZyYW1ld29yaz5OVU5JVDwvVGVzdEZyYW1ld29yaz4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52Mi4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKFRhcmdldFZlcnNpb24pJyA9PSAnTkVUMzUnICI+CisgICAgPEJ1aWxkVG9vbHM+My41PC9CdWlsZFRvb2xzPgorICAgIDxUZXN0RnJhbWV3b3JrPk5VTklUPC9UZXN0RnJhbWV3b3JrPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoVGFyZ2V0VmVyc2lvbiknID09ICdORVQ0MCcgIj4KKyAgICA8QnVpbGRUb29scz40LjA8L0J1aWxkVG9vbHM+CisgICAgPFRlc3RGcmFtZXdvcms+TlVOSVQ8L1Rlc3RGcmFtZXdvcms+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChUYXJnZXRWZXJzaW9uKScgPT0gJ0NGMjAnICI+CisgICAgPEJ1aWxkVG9vbHM+My41PC9CdWlsZFRvb2xzPgorICAgIDxUZXN0RnJhbWV3b3JrPk5PTkU8L1Rlc3RGcmFtZXdvcms+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djIuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChUYXJnZXRWZXJzaW9uKScgPT0gJ0NGMzUnICI+CisgICAgPEJ1aWxkVG9vbHM+My41PC9CdWlsZFRvb2xzPgorICAgIDxUZXN0RnJhbWV3b3JrPk5PTkU8L1Rlc3RGcmFtZXdvcms+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChUYXJnZXRWZXJzaW9uKScgPT0gJ1NMMjAnICI+CisgICAgPEJ1aWxkVG9vbHM+My41PC9CdWlsZFRvb2xzPgorICAgIDxUZXN0RnJhbWV3b3JrPlNJTFZFUkxJR0hUPC9UZXN0RnJhbWV3b3JrPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYyLjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoVGFyZ2V0VmVyc2lvbiknID09ICdTTDMwJyAiPgorICAgIDxCdWlsZFRvb2xzPjMuNTwvQnVpbGRUb29scz4KKyAgICA8VGVzdEZyYW1ld29yaz5TSUxWRVJMSUdIVDwvVGVzdEZyYW1ld29yaz4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKFRhcmdldFZlcnNpb24pJyA9PSAnU0w0MCcgIj4KKyAgICA8QnVpbGRUb29scz40LjA8L0J1aWxkVG9vbHM+CisgICAgPFRlc3RGcmFtZXdvcms+U0lMVkVSTElHSFQ8L1Rlc3RGcmFtZXdvcms+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChUYXJnZXRWZXJzaW9uKScgPT0gJ1BMNDAnICI+CisgICAgPEJ1aWxkVG9vbHM+NC4wPC9CdWlsZFRvb2xzPgorICAgIDxUZXN0RnJhbWV3b3JrPlNJTFZFUkxJR0hUPC9UZXN0RnJhbWV3b3JrPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEJ1aWxkT3V0cHV0RGlyZWN0b3J5PiQoUHJvamVjdERpcmVjdG9yeSlcYnVpbGRfb3V0cHV0XCQoQ29uZmlndXJhdGlvbilccG9ydGFibGUtbmV0NDArc2w0K3NsNSt3cDcrd3A4K3dpbjg8L0J1aWxkT3V0cHV0RGlyZWN0b3J5PgorICA8L1Byb3BlcnR5R3JvdXA+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRmlsZSBHcm91cHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFdvcmtpbmdEaXJlY3RvcmllcyBJbmNsdWRlPSIkKEJ1aWxkVGVtcERpcmVjdG9yeSkiIC8+CisgICAgPFdvcmtpbmdEaXJlY3RvcmllcyBJbmNsdWRlPSIkKEJ1aWxkT3V0cHV0RGlyZWN0b3J5KSIgLz4KKyAgICAKKyAgICA8VGVzdENvbnRhaW5lciBJbmNsdWRlPSIkKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzLlRlc3RcYmluXCQoVGFyZ2V0VmVyc2lvbilcJChDb25maWd1cmF0aW9uKVxHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3QuZGxsIiAvPgorICAgIDxUZXN0Q29udGFpbmVyIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3RcYmluXCQoVGFyZ2V0VmVyc2lvbilcJChDb25maWd1cmF0aW9uKVxHb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0LmRsbCIgLz4KKyAgICA8VGVzdENvbnRhaW5lciBJbmNsdWRlPSIkKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XGJpblwkKFRhcmdldFZlcnNpb24pXCQoQ29uZmlndXJhdGlvbilcR29vZ2xlLlByb3RvY29sQnVmZmVyc01peGVkTGl0ZS5UZXN0LmRsbCIgLz4KKworICAgIDxTdGF0TGlnaHRUZXN0Q29udGFpbmVyIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxiaW5cJChUYXJnZXRWZXJzaW9uKVwkKENvbmZpZ3VyYXRpb24pXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdC54YXAiIC8+CisgICAgPFN0YXRMaWdodFRlc3RDb250YWluZXIgSW5jbHVkZT0iJChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVyc0xpdGUuVGVzdFxiaW5cJChUYXJnZXRWZXJzaW9uKVwkKENvbmZpZ3VyYXRpb24pXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QueGFwIiAvPgorICAgIDxTdGF0TGlnaHRUZXN0Q29udGFpbmVyIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3RcYmluXCQoVGFyZ2V0VmVyc2lvbilcJChDb25maWd1cmF0aW9uKVxHb29nbGUuUHJvdG9jb2xCdWZmZXJzTWl4ZWRMaXRlLlRlc3QueGFwIiAvPgorCisgICAgPFB1Ymxpc2hJdGVtIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnNcYmluXCQoVGFyZ2V0VmVyc2lvbilcJChDb25maWd1cmF0aW9uKVxHb29nbGUuUHJvdG9jb2xCdWZmZXJzLmRsbCIgLz4KKyAgICA8UHVibGlzaEl0ZW0gSW5jbHVkZT0iJChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVyc1xiaW5cJChUYXJnZXRWZXJzaW9uKVwkKENvbmZpZ3VyYXRpb24pXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMucGRiIiAvPgorICAgIDxQdWJsaXNoSXRlbSBJbmNsdWRlPSIkKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzXGJpblwkKFRhcmdldFZlcnNpb24pXCQoQ29uZmlndXJhdGlvbilcR29vZ2xlLlByb3RvY29sQnVmZmVycy54bWwiIC8+CisgICAgPFB1Ymxpc2hJdGVtIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnNcYmluXCQoVGFyZ2V0VmVyc2lvbilcJChDb25maWd1cmF0aW9uKVxHb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5kbGwiIC8+CisgICAgPFB1Ymxpc2hJdGVtIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnNcYmluXCQoVGFyZ2V0VmVyc2lvbilcJChDb25maWd1cmF0aW9uKVxHb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5wZGIiIC8+CisgICAgPFB1Ymxpc2hJdGVtIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnNcYmluXCQoVGFyZ2V0VmVyc2lvbilcJChDb25maWd1cmF0aW9uKVxHb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS54bWwiIC8+CisgICAgPFB1Ymxpc2hJdGVtIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxiaW5cJChUYXJnZXRWZXJzaW9uKVwkKENvbmZpZ3VyYXRpb24pXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5kbGwiIC8+CisgICAgPFB1Ymxpc2hJdGVtIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxiaW5cJChUYXJnZXRWZXJzaW9uKVwkKENvbmZpZ3VyYXRpb24pXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5wZGIiIC8+CisgICAgPFB1Ymxpc2hJdGVtIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxiaW5cJChUYXJnZXRWZXJzaW9uKVwkKENvbmZpZ3VyYXRpb24pXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi54bWwiIC8+CisgICAgPFB1Ymxpc2hJdGVtIEluY2x1ZGU9IiQoU291cmNlRGlyZWN0b3J5KVxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxiaW5cJChUYXJnZXRWZXJzaW9uKVwkKENvbmZpZ3VyYXRpb24pXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24uZGxsIiAvPgorICAgIDxQdWJsaXNoSXRlbSBJbmNsdWRlPSIkKFNvdXJjZURpcmVjdG9yeSlcUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cYmluXCQoVGFyZ2V0VmVyc2lvbilcJChDb25maWd1cmF0aW9uKVxHb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLnBkYiIgLz4KKyAgICA8UHVibGlzaEl0ZW0gSW5jbHVkZT0iJChTb3VyY2VEaXJlY3RvcnkpXFByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXGJpblwkKFRhcmdldFZlcnNpb24pXCQoQ29uZmlndXJhdGlvbilcR29vZ2xlLlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi54bWwiIC8+CisgIDwvSXRlbUdyb3VwPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1RhcmdldHMgRm9yIEJ1aWxkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8VGFyZ2V0IE5hbWU9Il9Db25maWd1cmVkIj4KKyAgICA8TWVzc2FnZSBUZXh0PSJCdWlsZGluZyAkKFRhcmdldFZlcnNpb24pIGZvciBjb25maWd1cmF0aW9uICQoQ29uZmlndXJhdGlvbiksIHBsYXRmb3JtICQoUGxhdGZvcm0pIiBJbXBvcnRhbmNlPSJub3JtYWwiIC8+CisgICAgPEVycm9yIFRleHQ9IlVua25vd24gb3IgbWlzc2luZyB2YWx1ZSBmb3IgVGFyZ2V0VmVyc2lvbj1bdmFsdWVdIiBDb25kaXRpb249IiAnJChCdWlsZFRvb2xzKScgPT0gJycgIiAvPgorICA8L1RhcmdldD4KKyAgCisgIDxUYXJnZXQgTmFtZT0iX0NsZWFuIiBEZXBlbmRzT25UYXJnZXRzPSJfQ29uZmlndXJlZCI+CisgICAgPFJlbW92ZURpciBEaXJlY3Rvcmllcz0iQChXb3JraW5nRGlyZWN0b3JpZXMpIiBDb25kaXRpb249IkV4aXN0cyglKFdvcmtpbmdEaXJlY3Rvcmllcy5JZGVudGl0eSkpIiAvPgorICAgIDxNU0J1aWxkIFRhcmdldHM9IkNsZWFuIiBQcm9qZWN0cz0iJChTb2x1dGlvbkZpbGUpIiBUb29sc1ZlcnNpb249IiQoQnVpbGRUb29scykiCisgICAgICAgICAgICAgUHJvcGVydGllcz0iQ29uZmlndXJhdGlvbj0kKENvbmZpZ3VyYXRpb24pO1BsYXRmb3JtPSQoUGxhdGZvcm0pOyIKKyAgICAgICAgICAgICAvPgorICA8L1RhcmdldD4KKworICA8VGFyZ2V0IE5hbWU9Il9Db21waWxlIiBEZXBlbmRzT25UYXJnZXRzPSJfQ29uZmlndXJlZCI+CisgICAgPE1TQnVpbGQgVGFyZ2V0cz0iQnVpbGQiIFByb2plY3RzPSIkKFNvbHV0aW9uRmlsZSkiIFRvb2xzVmVyc2lvbj0iJChCdWlsZFRvb2xzKSIKKyAgICAgICAgICAgICBQcm9wZXJ0aWVzPSJDb25maWd1cmF0aW9uPSQoQ29uZmlndXJhdGlvbik7UGxhdGZvcm09JChQbGF0Zm9ybSk7JChCdWlsZFBhcmFtcykiCisgICAgICAgICAgICAgLz4KKyAgPC9UYXJnZXQ+CisKKyAgPFRhcmdldCBOYW1lPSJfUHVibGlzaCIgRGVwZW5kc09uVGFyZ2V0cz0iX0NvbmZpZ3VyZWQiPgorICAgIDxNYWtlRGlyIERpcmVjdG9yaWVzPSIkKEJ1aWxkT3V0cHV0RGlyZWN0b3J5KSIgLz4KKyAgICA8Q29weSBTb3VyY2VGaWxlcz0iQChQdWJsaXNoSXRlbSkiIERlc3RpbmF0aW9uRm9sZGVyPSIkKEJ1aWxkT3V0cHV0RGlyZWN0b3J5KSIgLz4KKyAgPC9UYXJnZXQ+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVGFyZ2V0cyBGb3IgVGVzdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPFRhcmdldCBOYW1lPSJfVGVzdCIgRGVwZW5kc09uVGFyZ2V0cz0iX0NvbmZpZ3VyZWQiPgorICAgIDxNYWtlRGlyIERpcmVjdG9yaWVzPSIkKEJ1aWxkVGVtcERpcmVjdG9yeSkiIC8+CisgICAgPENhbGxUYXJnZXQgVGFyZ2V0cz0iX1J1bk51bml0IiBDb25kaXRpb249IiAnJChUZXN0RnJhbWV3b3JrKSc9PSdOVU5JVCcgIiAvPgorICAgIDxDYWxsVGFyZ2V0IFRhcmdldHM9Il9SdW5TdGF0TGlnaHQiIENvbmRpdGlvbj0iICckKFRlc3RGcmFtZXdvcmspJz09J1NJTFZFUkxJR0hUJyAiIC8+CisgIDwvVGFyZ2V0PgorCisgIDxUYXJnZXQgTmFtZT0iX1J1bk51bml0Ij4KKyAgICA8Q29weSBTb3VyY2VGaWxlcz0iJChMaWJEaXJlY3RvcnkpXE5Vbml0LWNvbmZpZ1xudW5pdC1jb25zb2xlLiQoVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbikuY29uZmlnIiBEZXN0aW5hdGlvbkZpbGVzPSIkKE5Vbml0RXhlUGF0aCkuY29uZmlnIiAvPgorICAgIDxFeGVjIENvbW1hbmQ9IiZxdW90OyQoTlVuaXRFeGVQYXRoKSZxdW90OyAvbm9sb2dvIC9ub3NoYWRvdyAmcXVvdDslKFRlc3RDb250YWluZXIuSWRlbnRpdHkpJnF1b3Q7IC94bWw6JnF1b3Q7JChCdWlsZFRlbXBEaXJlY3RvcnkpXCUoVGVzdENvbnRhaW5lci5GaWxlbmFtZSkueG1sJnF1b3Q7IiAvPgorICA8L1RhcmdldD4KKworICA8VGFyZ2V0IE5hbWU9Il9SdW5TdGF0TGlnaHQiPgorICAgIDxFeGVjCisgICAgICBDb21tYW5kPSImcXVvdDskKFN0YXRMaWdodEV4ZVBhdGgpJnF1b3Q7IC14ICUoU3RhdExpZ2h0VGVzdENvbnRhaW5lci5JZGVudGl0eSkgLS1SZXBvcnRPdXRwdXRGaWxlVHlwZT1OVW5pdCAtLVJlcG9ydE91dHB1dEZpbGU9JChCdWlsZFRlbXBEaXJlY3RvcnkpXCUoU3RhdExpZ2h0VGVzdENvbnRhaW5lci5GaWxlbmFtZSkueG1sIiAvPgorICA8L1RhcmdldD4KKworPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2NzcHJval90ZW1wbGF0ZXMvQ0YyMC5jc3Byb2ogYi9jc2hhcnAvY3Nwcm9qX3RlbXBsYXRlcy9DRjIwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTY4NDEyCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2NzcHJval90ZW1wbGF0ZXMvQ0YyMC5jc3Byb2oKQEAgLTAsMCArMSw0MSBAQAor77u/PFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiBUb29sc1ZlcnNpb249IjMuNSI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNPTVBBQ1RfRlJBTUVXT1JLPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+Q0YyMDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+ezRENjI4QjVCLTJGQkMtNEFBNi04QzE2LTE5NzI0MkFFQjg4NH07e0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYyLjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxQbGF0Zm9ybUZhbWlseU5hbWU+U21hcnRwaG9uZTwvUGxhdGZvcm1GYW1pbHlOYW1lPg0KKyAgICA8UGxhdGZvcm1JRD5mMjdkYTMyOS0zMjY5LTQxOTEtOThlMC1jODdkM2Q3ZjFkYjk8L1BsYXRmb3JtSUQ+DQorICAgIDwhLS08T1NWZXJzaW9uPjUuMjwvT1NWZXJzaW9uPi0tPg0KKyAgICA8IS0tPERlcGxveURpclN1ZmZpeD5DRjIwPC9EZXBsb3lEaXJTdWZmaXg+LS0+DQorICAgIDwhLS08TmF0aXZlUGxhdGZvcm1OYW1lPldpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLPC9OYXRpdmVQbGF0Zm9ybU5hbWU+LS0+DQorICAgIDwhLS08Rm9ybUZhY3RvcklEPjwvRm9ybUZhY3RvcklEPi0tPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxPdXRwdXRQYXRoPmJpblxDRjIwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcQ0YyMFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+JChEZWZpbmVDb25zdGFudHMpO05PU0VSSUFMSVpBQkxFO05PRklMRVZFUlNJT047Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxPdXRwdXRQYXRoPmJpblxDRjIwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxDRjIwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPiQoRGVmaW5lQ29uc3RhbnRzKTtOT1NFUklBTElaQUJMRTtOT0ZJTEVWRVJTSU9OO05PRVhURU5TSU9OUzwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5Db21wYWN0RnJhbWV3b3JrLkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8VmlzdWFsU3R1ZGlvPg0KKyAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9IntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9Ij4NCisgICAgICAgIDxIb3N0aW5nUHJvY2VzcyBkaXNhYmxlPSIxIiAvPg0KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4NCisgICAgPC9WaXN1YWxTdHVkaW8+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2NzcHJval90ZW1wbGF0ZXMvQ0YzNS5jc3Byb2ogYi9jc2hhcnAvY3Nwcm9qX3RlbXBsYXRlcy9DRjM1LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWU4NjZmCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2NzcHJval90ZW1wbGF0ZXMvQ0YzNS5jc3Byb2oKQEAgLTAsMCArMSw0NCBAQAor77u/PFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiBUb29sc1ZlcnNpb249IjMuNSI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNPTVBBQ1RfRlJBTUVXT1JLPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+Q0YzNTwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+ezRENjI4QjVCLTJGQkMtNEFBNi04QzE2LTE5NzI0MkFFQjg4NH07e0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxQbGF0Zm9ybUZhbWlseU5hbWU+U21hcnRwaG9uZTwvUGxhdGZvcm1GYW1pbHlOYW1lPg0KKyAgICA8UGxhdGZvcm1JRD5mMjdkYTMyOS0zMjY5LTQxOTEtOThlMC1jODdkM2Q3ZjFkYjk8L1BsYXRmb3JtSUQ+DQorICAgIDwhLS08T1NWZXJzaW9uPjUuMjwvT1NWZXJzaW9uPi0tPg0KKyAgICA8IS0tPERlcGxveURpclN1ZmZpeD5DRjM1PC9EZXBsb3lEaXJTdWZmaXg+LS0+DQorICAgIDwhLS08TmF0aXZlUGxhdGZvcm1OYW1lPldpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLPC9OYXRpdmVQbGF0Zm9ybU5hbWU+LS0+DQorICAgIDwhLS08Rm9ybUZhY3RvcklEPjwvRm9ybUZhY3RvcklEPi0tPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxPdXRwdXRQYXRoPmJpblxDRjM1XERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcQ0YzNVxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+JChEZWZpbmVDb25zdGFudHMpO05PU0VSSUFMSVpBQkxFO05PRklMRVZFUlNJT048L0RlZmluZUNvbnN0YW50cz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPE91dHB1dFBhdGg+YmluXENGMzVcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXENGMzVcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+JChEZWZpbmVDb25zdGFudHMpO05PU0VSSUFMSVpBQkxFO05PRklMRVZFUlNJT048L0RlZmluZUNvbnN0YW50cz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ29tcGFjdEZyYW1ld29yay5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSI+DQorICAgICAgICA8SG9zdGluZ1Byb2Nlc3MgZGlzYWJsZT0iMSIgLz4NCisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+DQorICAgIDwvVmlzdWFsU3R1ZGlvPg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9jc3Byb2pfdGVtcGxhdGVzL05FVDIwLmNzcHJvaiBiL2NzaGFycC9jc3Byb2pfdGVtcGxhdGVzL05FVDIwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWU5MzkyCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2NzcHJval90ZW1wbGF0ZXMvTkVUMjAuY3Nwcm9qCkBAIC0wLDAgKzEsMTcgQEAKK++7vzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyIgVG9vbHNWZXJzaW9uPSIzLjUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DTElFTlRQUk9GSUxFPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+TkVUMjA8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYyLjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDIwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMjBcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPiQoRGVmaW5lQ29uc3RhbnRzKTtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQyMFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMjBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+JChEZWZpbmVDb25zdGFudHMpO05PRVhURU5TSU9OUzwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvY3Nwcm9qX3RlbXBsYXRlcy9ORVQzNS5jc3Byb2ogYi9jc2hhcnAvY3Nwcm9qX3RlbXBsYXRlcy9ORVQzNS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlZjY5YQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9jc3Byb2pfdGVtcGxhdGVzL05FVDM1LmNzcHJvagpAQCAtMCwwICsxLDIwIEBACivvu788UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiIFRvb2xzVmVyc2lvbj0iMy41Ij4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q0xJRU5UUFJPRklMRTwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPk5FVDM1PC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDM1XERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz4kKERlZmluZUNvbnN0YW50cyk8L0RlZmluZUNvbnN0YW50cz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+JChEZWZpbmVDb25zdGFudHMpPC9EZWZpbmVDb25zdGFudHM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9jc3Byb2pfdGVtcGxhdGVzL05FVDQwLmNzcHJvaiBiL2NzaGFycC9jc3Byb2pfdGVtcGxhdGVzL05FVDQwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTE4NDVhCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2NzcHJval90ZW1wbGF0ZXMvTkVUNDAuY3Nwcm9qCkBAIC0wLDAgKzEsMjAgQEAKK++7vzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyIgVG9vbHNWZXJzaW9uPSI0LjAiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DTElFTlRQUk9GSUxFPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+TkVUNDA8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDQwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUNDBcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPiQoRGVmaW5lQ29uc3RhbnRzKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDQwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQ0MFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz4kKERlZmluZUNvbnN0YW50cyk8L0RlZmluZUNvbnN0YW50cz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2NzcHJval90ZW1wbGF0ZXMvUEw0MC5jc3Byb2ogYi9jc2hhcnAvY3Nwcm9qX3RlbXBsYXRlcy9QTDQwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjE4YTc5Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2NzcHJval90ZW1wbGF0ZXMvUEw0MC5jc3Byb2oKQEAgLTAsMCArMSw1MSBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgDQorICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyINCisgICAgICAgICB4bWxuczpjcz0idXJuOnNjaGVtYXMtY3NoYXJwLXByb2plY3Q6dGVtcGxhdGUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbj4xMC4wPC9NaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbj4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPlBPUlRBQkxFX0xJQlJBUlk8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5QTDQwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57Nzg2QzgzMEYtMDdBMS00MDhCLUJEN0YtNkVFMDQ4MDlENkRCfTt7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPFRhcmdldEZyYW1ld29ya1Byb2ZpbGU+UHJvZmlsZTE8L1RhcmdldEZyYW1ld29ya1Byb2ZpbGU+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPE91dHB1dFBhdGg+YmluXFBMNDBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxQTDQwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz4kKERlZmluZUNvbnN0YW50cyk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cUEw0MFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcUEw0MFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz4kKERlZmluZUNvbnN0YW50cyk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IGNzOlByZWNvbmRpdGlvbj0iICckKEVudmlyb25tZW50UHJvamVjdFR5cGUpJyAhPSAnVEVTVCcgIg0KKyAgICAgICAgICBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcUG9ydGFibGVcJChUYXJnZXRGcmFtZXdvcmtWZXJzaW9uKVxNaWNyb3NvZnQuUG9ydGFibGUuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFBvcnRhYmxlIExpYnJhcnkgd2lsbCBiZSB0ZXN0ZWQgYXMgc2lsdmVybGlnaHQgLS0+DQorICA8UHJvcGVydHlHcm91cCBjczpQcmVjb25kaXRpb249IiAnJChFbnZpcm9ubWVudFByb2plY3RUeXBlKScgPT0gJ1RFU1QnICI+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9O3tmYWUwNGVjMC0zMDFmLTExZDMtYmY0Yi0wMGMwNGY3OWVmYmN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8VmFsaWRhdGVYYW1sPmZhbHNlPC9WYWxpZGF0ZVhhbWw+DQorICAgIDxUaHJvd0Vycm9yc0luVmFsaWRhdGlvbj5mYWxzZTwvVGhyb3dFcnJvcnNJblZhbGlkYXRpb24+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlIC8+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8Y3M6SW1wb3J0IFByb2plY3Q9IlNMVGVzdC50YXJnZXRzIiBjczpQcmVjb25kaXRpb249IiAnJChFbnZpcm9ubWVudFByb2plY3RUeXBlKScgPT0gJ1RFU1QnICIgLz4NCisgIDxJbXBvcnQgY3M6UHJlY29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRQcm9qZWN0VHlwZSknID09ICdURVNUJyAiDQorICAgICAgICAgIFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoMzIpXE1pY3Jvc29mdFxTaWx2ZXJsaWdodFwkKFNpbHZlcmxpZ2h0VmVyc2lvbilcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucyBjczpQcmVjb25kaXRpb249IiAnJChFbnZpcm9ubWVudFByb2plY3RUeXBlKScgPT0gJ1RFU1QnICI+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn0iPg0KKyAgICAgICAgPFNpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXMgLz4NCisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+DQorICAgIDwvVmlzdWFsU3R1ZGlvPg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2NzcHJval90ZW1wbGF0ZXMvU0wyMC5jc3Byb2ogYi9jc2hhcnAvY3Nwcm9qX3RlbXBsYXRlcy9TTDIwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWJiMTA0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2NzcHJval90ZW1wbGF0ZXMvU0wyMC5jc3Byb2oKQEAgLTAsMCArMSw0NCBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgDQorICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyINCisgICAgICAgICB4bWxuczpjcz0idXJuOnNjaGVtYXMtY3NoYXJwLXByb2plY3Q6dGVtcGxhdGUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5TSUxWRVJMSUdIVDwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPlNMMjA8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9O3tmYWUwNGVjMC0zMDFmLTExZDMtYmY0Yi0wMGMwNGY3OWVmYmN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52Mi4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8U2lsdmVybGlnaHRBcHBsaWNhdGlvbj5mYWxzZTwvU2lsdmVybGlnaHRBcHBsaWNhdGlvbj4NCisgICAgPFZhbGlkYXRlWGFtbD5mYWxzZTwvVmFsaWRhdGVYYW1sPg0KKyAgICA8VGhyb3dFcnJvcnNJblZhbGlkYXRpb24+ZmFsc2U8L1Rocm93RXJyb3JzSW5WYWxpZGF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDIwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0wyMFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+JChEZWZpbmVDb25zdGFudHMpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPE91dHB1dFBhdGg+YmluXFNMMjBcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXFNMMjBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+JChEZWZpbmVDb25zdGFudHMpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPCEtLSBQcmVwcm9jZXNzIGluY2x1ZGUgb2Ygc2lsdmVybGlnaHQgdGVzdGluZyAtLT4NCisgIDxjczpJbXBvcnQgUHJvamVjdD0iU0xUZXN0LnRhcmdldHMiIGNzOlByZWNvbmRpdGlvbj0iICckKEVudmlyb25tZW50UHJvamVjdFR5cGUpJyA9PSAnVEVTVCcgIiAvPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcU2lsdmVybGlnaHRcdjIuMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8VmlzdWFsU3R1ZGlvPg0KKyAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9IntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9Ij4NCisgICAgICAgIDxTaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgICAgICA8U3RhcnRBY3Rpb24+T2ZmbGluZUFwcGxpY2F0aW9uPC9TdGFydEFjdGlvbj4NCisgICAgICAgIDwvU2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+DQorICAgIDwvVmlzdWFsU3R1ZGlvPg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2NzcHJval90ZW1wbGF0ZXMvU0wzMC5jc3Byb2ogYi9jc2hhcnAvY3Nwcm9qX3RlbXBsYXRlcy9TTDMwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmVhOWE4Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2NzcHJval90ZW1wbGF0ZXMvU0wzMC5jc3Byb2oKQEAgLTAsMCArMSw0NyBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgDQorICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyINCisgICAgICAgICB4bWxuczpjcz0idXJuOnNjaGVtYXMtY3NoYXJwLXByb2plY3Q6dGVtcGxhdGUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5TSUxWRVJMSUdIVDwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPlNMMzA8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9O3tmYWUwNGVjMC0zMDFmLTExZDMtYmY0Yi0wMGMwNGY3OWVmYmN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8U2lsdmVybGlnaHRBcHBsaWNhdGlvbj5mYWxzZTwvU2lsdmVybGlnaHRBcHBsaWNhdGlvbj4NCisgICAgPFZhbGlkYXRlWGFtbD5mYWxzZTwvVmFsaWRhdGVYYW1sPg0KKyAgICA8VGhyb3dFcnJvcnNJblZhbGlkYXRpb24+ZmFsc2U8L1Rocm93RXJyb3JzSW5WYWxpZGF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDMwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0wzMFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+JChEZWZpbmVDb25zdGFudHMpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cU0wzMFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0wzMFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz4kKERlZmluZUNvbnN0YW50cyk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDwhLS0gUHJlcHJvY2VzcyBpbmNsdWRlIG9mIHNpbHZlcmxpZ2h0IHRlc3RpbmcgLS0+DQorICA8Y3M6SW1wb3J0IFByb2plY3Q9IlNMVGVzdC50YXJnZXRzIiBjczpQcmVjb25kaXRpb249IiAnJChFbnZpcm9ubWVudFByb2plY3RUeXBlKScgPT0gJ1RFU1QnICIgLz4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0XHYzLjBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfSI+DQorICAgICAgICA8U2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICAgICAgPFN0YXJ0QWN0aW9uPk9mZmxpbmVBcHBsaWNhdGlvbjwvU3RhcnRBY3Rpb24+DQorICAgICAgICA8L1NpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9jc3Byb2pfdGVtcGxhdGVzL1NMNDAuY3Nwcm9qIGIvY3NoYXJwL2NzcHJval90ZW1wbGF0ZXMvU0w0MC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzOGUzZAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9jc3Byb2pfdGVtcGxhdGVzL1NMNDAuY3Nwcm9qCkBAIC0wLDAgKzEsNDggQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIA0KKyAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiDQorICAgICAgICAgeG1sbnM6Y3M9InVybjpzY2hlbWFzLWNzaGFycC1wcm9qZWN0OnRlbXBsYXRlIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+U0lMVkVSTElHSFQ8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5TTDQwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfTt7ZmFlMDRlYzAtMzAxZi0xMWQzLWJmNGItMDBjMDRmNzllZmJjfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPFNpbHZlcmxpZ2h0QXBwbGljYXRpb24+ZmFsc2U8L1NpbHZlcmxpZ2h0QXBwbGljYXRpb24+DQorICAgIDxWYWxpZGF0ZVhhbWw+ZmFsc2U8L1ZhbGlkYXRlWGFtbD4NCisgICAgPFRocm93RXJyb3JzSW5WYWxpZGF0aW9uPmZhbHNlPC9UaHJvd0Vycm9yc0luVmFsaWRhdGlvbj4NCisgICAgPFNpbHZlcmxpZ2h0VmVyc2lvbj4kKFRhcmdldEZyYW1ld29ya1ZlcnNpb24pPC9TaWx2ZXJsaWdodFZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPE91dHB1dFBhdGg+YmluXFNMNDBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDQwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz4kKERlZmluZUNvbnN0YW50cyk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDQwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDQwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPiQoRGVmaW5lQ29uc3RhbnRzKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPCEtLSBQcmVwcm9jZXNzIGluY2x1ZGUgb2Ygc2lsdmVybGlnaHQgdGVzdGluZyAtLT4NCisgIDxjczpJbXBvcnQgUHJvamVjdD0iU0xUZXN0LnRhcmdldHMiIGNzOlByZWNvbmRpdGlvbj0iICckKEVudmlyb25tZW50UHJvamVjdFR5cGUpJyA9PSAnVEVTVCcgIiAvPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcU2lsdmVybGlnaHRcJChTaWx2ZXJsaWdodFZlcnNpb24pXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn0iPg0KKyAgICAgICAgPFNpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgICAgIDxTdGFydEFjdGlvbj5PZmZsaW5lQXBwbGljYXRpb248L1N0YXJ0QWN0aW9uPg0KKyAgICAgICAgPC9TaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4NCisgICAgPC9WaXN1YWxTdHVkaW8+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvY3Nwcm9qX3RlbXBsYXRlcy9TTFRlc3QudGFyZ2V0cyBiL2NzaGFycC9jc3Byb2pfdGVtcGxhdGVzL1NMVGVzdC50YXJnZXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZGEyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvY3Nwcm9qX3RlbXBsYXRlcy9TTFRlc3QudGFyZ2V0cwpAQCAtMCwwICsxLDM0IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiANCisgICAgICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIg0KKyAgICAgICAgIHhtbG5zOmNzPSJ1cm46c2NoZW1hcy1jc2hhcnAtcHJvamVjdDp0ZW1wbGF0ZSI+DQorDQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPFNpbHZlcmxpZ2h0QXBwbGljYXRpb24+dHJ1ZTwvU2lsdmVybGlnaHRBcHBsaWNhdGlvbj4NCisgICAgPFhhcE91dHB1dHM+dHJ1ZTwvWGFwT3V0cHV0cz4NCisgICAgPEdlbmVyYXRlU2lsdmVybGlnaHRNYW5pZmVzdD50cnVlPC9HZW5lcmF0ZVNpbHZlcmxpZ2h0TWFuaWZlc3Q+DQorICAgIDxYYXBGaWxlbmFtZT4kKEFzc2VtYmx5TmFtZSkueGFwPC9YYXBGaWxlbmFtZT4NCisgICAgPFNpbHZlcmxpZ2h0TWFuaWZlc3RUZW1wbGF0ZT5Qcm9wZXJ0aWVzXEFwcE1hbmlmZXN0LnhtbDwvU2lsdmVybGlnaHRNYW5pZmVzdFRlbXBsYXRlPg0KKyAgICA8U2lsdmVybGlnaHRBcHBFbnRyeT4kKFJvb3ROYW1lc3BhY2UpLkFwcDwvU2lsdmVybGlnaHRBcHBFbnRyeT4NCisgICAgPFRlc3RQYWdlRmlsZU5hbWU+VGVzdFBhZ2UuaHRtbDwvVGVzdFBhZ2VGaWxlTmFtZT4NCisgICAgPENyZWF0ZVRlc3RQYWdlPnRydWU8L0NyZWF0ZVRlc3RQYWdlPg0KKyAgICA8U2lsdmVybGlnaHRWZXJzaW9uPiQoVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbik8L1NpbHZlcmxpZ2h0VmVyc2lvbj4NCisgICAgPE91dE9mQnJvd3NlclNldHRpbmdzRmlsZT5Qcm9wZXJ0aWVzXE91dE9mQnJvd3NlclNldHRpbmdzLnhtbDwvT3V0T2ZCcm93c2VyU2V0dGluZ3NGaWxlPg0KKyAgICA8RW5hYmxlT3V0T2ZCcm93c2VyPnRydWU8L0VuYWJsZU91dE9mQnJvd3Nlcj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldpbmRvd3MiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldpbmRvd3MuQnJvd3NlciIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXBwLnhhbWwuY3MiPg0KKyAgICAgIDxEZXBlbmRlbnRVcG9uPkFwcC54YW1sPC9EZXBlbmRlbnRVcG9uPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxOb25lIEluY2x1ZGU9IlByb3BlcnRpZXNcQXBwTWFuaWZlc3QueG1sIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXE91dE9mQnJvd3NlclNldHRpbmdzLnhtbCIgLz4NCisgICAgPEFwcGxpY2F0aW9uRGVmaW5pdGlvbiBJbmNsdWRlPSJBcHAueGFtbCI+DQorICAgICAgPEdlbmVyYXRvcj5NU0J1aWxkOkNvbXBpbGU8L0dlbmVyYXRvcj4NCisgICAgICA8U3ViVHlwZT5EZXNpZ25lcjwvU3ViVHlwZT4NCisgICAgPC9BcHBsaWNhdGlvbkRlZmluaXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIA0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAva2V5cy9Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuayBiL2NzaGFycC9rZXlzL0dvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYmZjOTAKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAva2V5cy9Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuawpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAva2V5cy9nZW5lcmF0ZV9uZXdfa2V5LmJhdCBiL2NzaGFycC9rZXlzL2dlbmVyYXRlX25ld19rZXkuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTljMDcKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAva2V5cy9nZW5lcmF0ZV9uZXdfa2V5LmJhdApAQCAtMCwwICsxLDEzIEBACitARUNITyBPRkYNCitJRiBFWElTVCAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU0RLc1xXaW5kb3dzXHY3LjBcQmluXHNuLmV4ZSIgR09UTyBGT1VORA0KK2dvdG8gVVNFUEFUSA0KKw0KKzpGT1VORA0KKyJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTREtzXFdpbmRvd3NcdjcuMFxCaW5cc24uZXhlIiAtayAlfmRwMFxHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuayANCitHT1RPIEVYSVQNCisNCis6VVNFUEFUSA0KK3NuLmV4ZSAtayAlfmRwMFxHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuayANCitHT1RPIEVYSVQNCisNCis6RVhJVApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvNy1aaXAgOS4yMC83LXppcC5jaG0gYi9jc2hhcnAvbGliLzctWmlwIDkuMjAvNy16aXAuY2htCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTRkZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliLzctWmlwIDkuMjAvNy16aXAuY2htCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvNy1aaXAgOS4yMC83emEuZXhlIGIvY3NoYXJwL2xpYi83LVppcCA5LjIwLzd6YS5leGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2YmY4NgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvNy1aaXAgOS4yMC83emEuZXhlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvNy1aaXAgOS4yMC9saWNlbnNlLnR4dCBiL2NzaGFycC9saWIvNy1aaXAgOS4yMC9saWNlbnNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzBmZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi83LVppcCA5LjIwL2xpY2Vuc2UudHh0CkBAIC0wLDAgKzEsMjkgQEAKKyAgICAgIDctWmlwIENvbW1hbmQgbGluZSB2ZXJzaW9uCisgICAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICAgICAgTGljZW5zZSBmb3IgdXNlIGFuZCBkaXN0cmlidXRpb24KKyAgICAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKyAgICAgIDctWmlwIENvcHlyaWdodCAoQykgMTk5OS0yMDEwIElnb3IgUGF2bG92LgorCisgICAgICA3emEuZXhlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgTEdQTCBsaWNlbnNlCisKKyAgICAgIE5vdGVzOiAKKyAgICAgICAgWW91IGNhbiB1c2UgNy1aaXAgb24gYW55IGNvbXB1dGVyLCBpbmNsdWRpbmcgYSBjb21wdXRlciBpbiBhIGNvbW1lcmNpYWwgCisgICAgICAgIG9yZ2FuaXphdGlvbi4gWW91IGRvbid0IG5lZWQgdG8gcmVnaXN0ZXIgb3IgcGF5IGZvciA3LVppcC4KKworCisgICAgICBHTlUgTEdQTCBpbmZvcm1hdGlvbgorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICAgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgICAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgICAgIFlvdSBjYW4gcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIAorICAgICAgICBodHRwOi8vd3d3LmdudS5vcmcvCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliLzctWmlwIDkuMjAvcmVhZG1lLnR4dCBiL2NzaGFycC9saWIvNy1aaXAgOS4yMC9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTQyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliLzctWmlwIDkuMjAvcmVhZG1lLnR4dApAQCAtMCwwICsxLDQxIEBACis3LVppcCBDb21tYW5kIGxpbmUgdmVyc2lvbiA5LjIwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzctWmlwIGlzIGEgZmlsZSBhcmNoaXZlciB3aXRoIGhpZ2ggY29tcHJlc3Npb24gcmF0aW8uCis3emEuZXhlIGlzIGEgc3RhbmRhbG9uZSBjb21tYW5kIGxpbmUgdmVyc2lvbiBvZiA3LVppcC4KKworNy1aaXAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMTAgSWdvciBQYXZsb3YuCisKK0ZlYXR1cmVzIG9mIDd6YS5leGU6IAorICAtIEhpZ2ggY29tcHJlc3Npb24gcmF0aW8gaW4gbmV3IDd6IGZvcm1hdAorICAtIFN1cHBvcnRlZCBmb3JtYXRzOgorICAgICAgLSBQYWNraW5nIC8gdW5wYWNraW5nOiA3eiwgeHosIFpJUCwgR1pJUCwgQlpJUDIgYW5kIFRBUiAKKyAgICAgIC0gVW5wYWNraW5nIG9ubHk6IFosIGx6bWEKKyAgLSBIaWdoZXN0IGNvbXByZXNzaW9uIHJhdGlvIGZvciBaSVAgYW5kIEdaSVAgZm9ybWF0cy4KKyAgLSBGYXN0IGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCisgIC0gU3Ryb25nIEFFUy0yNTYgZW5jcnlwdGlvbiBpbiA3eiBhbmQgWklQIGZvcm1hdHMuCisKKzd6YS5leGUgaXMgYSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgTEdQTC4KK1JlYWQgbGljZW5zZS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK1NvdXJjZSBjb2RlIG9mIDd6YS5leGUgYW5kIDctWmlwIGNhbiBiZSBmb3VuZCBhdAoraHR0cDovL3d3dy43LXppcC5vcmcvCisKKzd6YS5leGUgY2FuIHdvcmsgaW4gV2luZG93cyA5NS85OC9NRS9OVC8yMDAwLzIwMDMvMjAwOC9YUC9WaXN0YS83LgorCitUaGVyZSBpcyBhbHNvIHBvcnQgb2YgN3phLmV4ZSBmb3IgUE9TSVggc3lzdGVtcyBsaWtlIFVuaXggKExpbnV4LCBTb2xhcmlzLCBPcGVuQlNELCAKK0ZyZWVCU0QsIEN5Z3dpbiwgQUlYLCAuLi4pLCBNYWNPUyBYIGFuZCBCZU9TOgorCitodHRwOi8vcDd6aXAuc291cmNlZm9yZ2UubmV0LworCisKKyAgVGhpcyBkaXN0cmlidXRpdmUgcGFja2V0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisKKyAgN3phLmV4ZSAgICAgICAtIDctWmlwIHN0YW5kYWxvbmUgY29tbWFuZCBsaW5lIHZlcnNpb24uCisgIHJlYWRtZS50eHQgICAgLSBUaGlzIGZpbGUuCisgIGxpY2Vuc2UudHh0ICAgLSBMaWNlbnNlIGluZm9ybWF0aW9uLgorICA3LXppcC5jaG0gICAgIC0gVXNlcidzIE1hbnVhbCBpbiBIVE1MIEhlbHAgZm9ybWF0LgorCisKKy0tLQorRW5kIG9mIGRvY3VtZW50CmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL0NzUHJvamVjdFByb2plY3Rvci9Dc1Byb2plY3RQcm9qZWN0b3IuZXhlIGIvY3NoYXJwL2xpYi9Dc1Byb2plY3RQcm9qZWN0b3IvQ3NQcm9qZWN0UHJvamVjdG9yLmV4ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDM4ZTgwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9Dc1Byb2plY3RQcm9qZWN0b3IvQ3NQcm9qZWN0UHJvamVjdG9yLmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nL0FwcmlsMjAxMC9FVUxBLnJ0ZiBiL2NzaGFycC9saWIvTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcvQXByaWwyMDEwL0VVTEEucnRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MDdkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nL0FwcmlsMjAxMC9FVUxBLnJ0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nL0FwcmlsMjAxMC9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5kbGwgYi9jc2hhcnAvbGliL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nL0FwcmlsMjAxMC9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5kbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2ZGYxOAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcvQXByaWwyMDEwL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLmRsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nL0FwcmlsMjAxMC9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5leHRtYXAueG1sIGIvY3NoYXJwL2xpYi9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy9BcHJpbDIwMTAvTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuZXh0bWFwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTJkNDg3Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy9BcHJpbDIwMTAvTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuZXh0bWFwLnhtbApAQCAtMCwwICsxLDEyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4NCis8bWFuaWZlc3QgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgDQorICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KKyAgPGFzc2VtYmx5Pg0KKyAgICA8bmFtZT5NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZzwvbmFtZT4NCisgICAgPHZlcnNpb24+Mi4wLjUuMDwvdmVyc2lvbj4NCisgICAgPHB1YmxpY2tleXRva2VuPjMxYmYzODU2YWQzNjRlMzU8L3B1YmxpY2tleXRva2VuPg0KKyAgICA8cmVscGF0aD5NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5kbGw8L3JlbHBhdGg+DQorICAgIDxleHRlbnNpb24gZG93bmxvYWRVcmk9Ik1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLnppcCIgLz4NCisgIDwvYXNzZW1ibHk+DQorDQorPC9tYW5pZmVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nL0FwcmlsMjAxMC9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5wZGIgYi9jc2hhcnAvbGliL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nL0FwcmlsMjAxMC9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5wZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2MTE5YwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcvQXByaWwyMDEwL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLnBkYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nL0FwcmlsMjAxMC9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy54bWwgYi9jc2hhcnAvbGliL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nL0FwcmlsMjAxMC9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3Y2U3MAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcvQXByaWwyMDEwL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLnhtbApAQCAtMCwwICsxLDE0Nzk2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4NCis8ZG9jPg0KKyAgICA8YXNzZW1ibHk+DQorICAgICAgICA8bmFtZT5NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZzwvbmFtZT4NCisgICAgPC9hc3NlbWJseT4NCisgICAgPG1lbWJlcnM+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVGVzdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBjbGFzcyBjb250YWluaW5nIGFuIEFzc2VydCBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVGVzdC5Jc05vdE51bGwiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBNZXRob2RJbmZvIG9iamVjdCB1c2VkIHRvIGludm9rZSBBc3NlcnQuSXNOb3ROdWxsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3QuQXJlTm90U2FtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIE1ldGhvZEluZm8gb2JqZWN0IHVzZWQgdG8gaW52b2tlIEFzc2VydC5BcmVOb3RTYW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4gICAgICAgIA0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVGVzdC5BcmVOb3RFcXVhbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIE1ldGhvZEluZm8gb2JqZWN0IHVzZWQgdG8gaW52b2tlIEFzc2VydC5BcmVOb3RFcXVhbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+ICAgICAgICANCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3QuQXJlU2FtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIE1ldGhvZEluZm8gb2JqZWN0IHVzZWQgdG8gaW52b2tlIEFzc2VydC5BcmVTYW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3QuQXJlRXF1YWwiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBNZXRob2RJbmZvIG9iamVjdCB1c2VkIHRvIGludm9rZSBBc3NlcnQuQXJlRXF1YWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVGVzdC5Jc051bGwiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBNZXRob2RJbmZvIG9iamVjdCB1c2VkIHRvIGludm9rZSBBc3NlcnQuSXNOdWxsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3QuSXNGYWxzZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIE1ldGhvZEluZm8gb2JqZWN0IHVzZWQgdG8gaW52b2tlIEFzc2VydC5Jc0ZhbHNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3QuSXNUcnVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgTWV0aG9kSW5mbyBvYmplY3QgdXNlZCB0byBpbnZva2UgQXNzZXJ0LklzVHJ1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UZXN0LkZpbmRBbm9ueW1vdXNUeXBlRXhwcmVzc2lvbkluU3RyaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBpZGVudGlmaWVzIGEgcGF0dGVybiBzaWduaWZ5aW5nIGFuIA0KKyAgICAgICAgICAgIGFub255bW91cyB0eXBlLiAgVGhpcyBwYXR0ZXJuIGlzIGVtaXR0ZWQgYnkgdGhlIEV4cHJlc3Npb24gb2JqZWN0IA0KKyAgICAgICAgICAgIHdoZW4gaXQgY29udmVydHMgYW4gYW5vbnltb3VzIHR5cGUgdG8gYSBzdHJpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVGVzdC5GaW5kVHJhbnNwYXJlbnRJZGVudGlmaWVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBpZGVudGlmaWVzIGEgcGF0dGVybiBlbWl0dGVkIGJ5IGFuDQorICAgICAgICAgICAgRXhwcmVzc2lvbiBvYmplY3Qgd2hlbiBpdCBjb252ZXJ0cyBhbiBhbm9ueW1vdXMgdHlwZSB0byBhDQorICAgICAgICAgICAgc3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3QuQXNzZXJ0KFN5c3RlbS5MaW5xLkV4cHJlc3Npb25zLkV4cHJlc3Npb257U3lzdGVtLkZ1bmN7U3lzdGVtLkJvb2xlYW59fSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgYSBjb25kaXRpb24gaXMgdHJ1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InByZWRpY2F0ZSI+VGhlIGNvbmRpdGlvbiB0aGF0IG11c3QgYmUgdHJ1ZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVGVzdC5Bc3NlcnQoU3lzdGVtLkxpbnEuRXhwcmVzc2lvbnMuRXhwcmVzc2lvbntTeXN0ZW0uRnVuY3tTeXN0ZW0uQm9vbGVhbn19LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIGEgY29uZGl0aW9uIGlzIHRydWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwcmVkaWNhdGUiPlRoZSBjb25kaXRpb24gdGhhdCBtdXN0IGJlIHRydWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIHdoZW4gdGhlIHRlc3QgZmFpbHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3QuR2V0TWVzc2FnZUV4cHJlc3Npb24oU3lzdGVtLkxpbnEuRXhwcmVzc2lvbnMuRXhwcmVzc2lvbixTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2VuZXJhdGVzIGFuIGFzc2VydCBmYWlsdXJlIG1lc3NhZ2UgdXNpbmcgdGhlIGNvZGUgYmxvY2sNCisgICAgICAgICAgICByZXNwb25zaWJsZSBmb3IgdGhlIGZhaWx1cmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHByZXNzaW9uIj5UaGUgcHJlZGljYXRlIHRoYXQgZmFpbHMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIHVzZXItcHJvdmlkZWQgYXNzZXJ0aW9uIGZhaWx1cmUgbWVzc2FnZS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkEgY29uc3RhbnQgZXhwcmVzc2lvbiBjb250YWluaW5nIHRoZSB1c2VyLXByb3ZpZGVkIGZhaWx1cmUNCisgICAgICAgICAgICBtZXNzYWdlIG9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGV4cHJlc3Npb24gdGhhdCBmYWlsZWQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVGVzdC5DcmVhdGVBc3NlcnRFeHByZXNzaW9uQWN0aW9uKFN5c3RlbS5MaW5xLkV4cHJlc3Npb25zLkV4cHJlc3Npb24sU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFuYWx5emVzIHRoZSBleHByZXNzaW9uIGFuZCBjcmVhdGVzIGFuIGFjdGlvbiB3aGljaCBjYWxscyB0aGUgDQorICAgICAgICAgICAgY29ycmVjdCBhc3NlcnQgbWV0aG9kIGJhc2VkIG9uIGl0cyBjb250ZW50cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cHJlc3Npb24iPlRoZSBwcmVkaWNhdGUgZXhwcmVzc2lvbi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGlmIGFuIGFzc2VydGlvbiBmYWlscy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkFuIGFjdGlvbiB3aGljaCBjYWxscyB0aGUgY29ycmVjdCBhc3NlcnQgbWV0aG9kLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3QuQXNzZXJ0RXhwcmVzc2lvbmBgMShTeXN0ZW0uTGlucS5FeHByZXNzaW9ucy5FeHByZXNzaW9ue1N5c3RlbS5GdW5je1N5c3RlbS5Cb29sZWFufX0sU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFuYWx5emVzIGEgcHJlZGljYXRlIGV4cHJlc3Npb24gYW5kIGludm9rZXMgdGhlIGNvcnJlY3QgYXNzZXJ0IA0KKyAgICAgICAgICAgIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgdHlwZSBvZiB0aGUgYXJndW1lbnQgdG8gdGhlIHByZWRpY2F0ZS4NCisgICAgICAgICAgICA8L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icHJlZGljYXRlIj5BIHByZWRpY2F0ZSB0byBiZSBjb252ZXJ0ZWQgaW50byBhbiANCisgICAgICAgICAgICBhc3NlcnQgc3RhdGVtZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBhc3NlcnRpb24gbWVzc2FnZS48L3BhcmFtPiANCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3QuQ3JlYXRlQmluYXJ5RXhwcmVzc2lvbkFjdGlvbihTeXN0ZW0uTGlucS5FeHByZXNzaW9ucy5CaW5hcnlFeHByZXNzaW9uLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGVzIGFuIGFjdGlvbiBmcm9tIGNlcnRhaW4gdHlwZXMgb2Ygc3VwcG9ydGVkIGJpbmFyeSBleHByZXNzaW9uDQorICAgICAgICAgICAgcGF0dGVybnMuICBJZiBubyBzdXBwb3J0ZWQgcGF0dGVybiBpcyBmb3VuZCBudWxsIGlzIHJldHVybmVkLiAgQmFzZWQNCisgICAgICAgICAgICBvbiBhbmFseXppbmcgdGhlIHByZWRpY2F0ZSB0aGUgYWN0aW9uIGludm9rZXMgdGhlIGNvcnJlY3QgQXNzZXJ0DQorICAgICAgICAgICAgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYmluYXJ5RXhwcmVzc2lvbiI+QSBiaW5hcnkgZXhwcmVzc2lvbiBleHRyYWN0ZWQgZnJvbSBhDQorICAgICAgICAgICAgcHJlZGljYXRlIGV4cHJlc3Npb24uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiB0aGUgYXNzZXJ0aW9uIA0KKyAgICAgICAgICAgIGZhaWxzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+QW4gYWN0aW9uIHRoYXQgaW52b2tlcyBhbiBBc3NlcnQgbWV0aG9kLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkFzeW5jaHJvbm91c0F0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTWFyayB0aGUgdGVzdCBtZXRob2QgYXMgb25lIHdoaWNoIGV4cGVjdHMgYXN5bmNocm9ub3VzIGV4ZWN1dGlvbi4gDQorICAgICAgICAgICAgSXQgaXMgaW1wb3J0YW50IHRvIGNhbGwgVGVzdENvbXBsZXRlKCkgb25jZSBpdCBpcyByZWFkeSBvciB5b3VyIA0KKyAgICAgICAgICAgIHRlc3Qgd2lsbCBuZXZlciBjb250aW51ZS90aW1lb3V0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkJ1Z0F0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQW4gYXR0cmlidXRlIHRoYXQgY29udGFpbnMga25vd24gYnVnIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGxvZ2dlZCANCisgICAgICAgICAgICBkdXJpbmcgYSB1bml0IHRlc3QgcnVuLiANCisgICAgICAgICAgICANCisgICAgICAgICAgICBXaGVuIGFwcGxpZWQgdG8gYSB0ZXN0IG1ldGhvZCwgaXQgd2lsbCBpbnZlcnQgdGhlIHJlc3VsdC4gVGhpcyBtYWtlcyBpdCANCisgICAgICAgICAgICBwb3NzaWJsZSB0byBwZXJmb3JtIGF1dG9tYXRlZCBydW5zIGFuZCBjb250aW51b3VzIGludGVncmF0aW9uIHdoaWxlIA0KKyAgICAgICAgICAgIHZhbGlkYXRpbmcgYW5kIHRyYWNraW5nIGtub3duIGlzc3Vlcy4NCisgICAgICAgICAgICANCisgICAgICAgICAgICBUaGUgYXR0cmlidXRlIHNob3VsZCBoYXZlIHRoZSBGaXhlZCBib29sIHNldCB0byBUcnVlLCBvciBiZSByZW1vdmVkLCANCisgICAgICAgICAgICBvbmNlIHRoZSBpc3N1ZSBpcyByZXNvbHZlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5CdWdBdHRyaWJ1dGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIG5ldyBCdWdBdHRyaWJ1dGUgd2l0aCBubyBidWcgZGVzY3JpcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQnVnQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSBuZXcgQnVnQXR0cmlidXRlIHdpdGggYSBidWcgZGVzY3JpcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiI+S25vd24gaXNzdWUgdGV4dC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQnVnQXR0cmlidXRlLlRvU3RyaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm4gdGhlIGJ1ZyBpbmZvcm1hdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+S25vd24gaXNzdWUgYXMgYSBzdHJpbmcuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQnVnQXR0cmlidXRlLkRlc2NyaXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBidWcgZGVzY3JpcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQnVnQXR0cmlidXRlLkZpeGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGtub3duIGlzc3VlIGhhcyBiZWVuIA0KKyAgICAgICAgICAgIGZpeGVkLiBJZiBpdCBoYXMsIHRoZSBhdHRyaWJ1dGUgaXMgaWdub3JlZCBhbmQgd2lsbCBub3QgYWZmZWN0IA0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuQWR2YW5jZWRCdXR0b24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcHJlc2VudHMgYSBjb250cm9sIHRoYXQgYnVpbGRzIG9uIHRvcCBvZiB0aGUgc3RhbmRhcmQgcGxhdGZvcm0gQnV0dG9uLA0KKyAgICAgICAgICAgIG9mZmVyaW5nIHRoZSBhYmlsaXR5IHRvIG1vZGlmeSB0aGUgY29ybmVyIHJhZGlpIG9yIGV2ZW4gdXNlIHNwZWNpYWwNCisgICAgICAgICAgICBidXR0b24gbW9kZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkFkdmFuY2VkQnV0dG9uLlNlY29uZGFyeVZpc2liaWxpdHlQcm9wZXJ0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWRlbnRpZmllcyB0aGUgU2Vjb25kYXJ5VmlzaWJpbGl0eSBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5BZHZhbmNlZEJ1dHRvbi5Db3JuZXJSYWRpdXNQcm9wZXJ0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWRlbnRpZmllcyB0aGUgQ29ybmVyUmFkaXVzIGRlcGVuZGVuY3kgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkFkdmFuY2VkQnV0dG9uLlNlY29uZGFyeVZpc2liaWxpdHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdmlzaWJpbGl0eSBvZiBhIHNlY29uZGFyeSBzZXQgb2YgdmlzdWFscyBpbiB0aGUNCisgICAgICAgICAgICB0ZW1wbGF0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuQWR2YW5jZWRCdXR0b24uQ29ybmVyUmFkaXVzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIGNvcm5lciByYWRpdXMgdG8gdXNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5CcnVzaFNlbGVjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIGNvbG9yIHNlbGVjdGlvbiBjb252ZXJ0ZXIgZm9yIHRyYW5zbGF0aW5nIGEgYm9vbCByZXN1bHQgaW50bw0KKyAgICAgICAgICAgIGEgY29sb3IuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkJydXNoU2VsZWN0b3IuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBDb2xvclNlbGVjdG9yQ29udmVydGVyIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkJydXNoU2VsZWN0b3IuQ29udmVydChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5UeXBlLFN5c3RlbS5PYmplY3QsU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb252ZXJ0IGEgYm9vbGVhbiB2YWx1ZSB0byBhIENvbG9yIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YXJnZXRUeXBlIj5UaGUgdGFyZ2V0IHBhcmFtZXRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXIiPkNvbnZlcnRlclBhcmFtZXRlciBpcyBvZiB0eXBlIFZpc2liaWxpdHkuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3VsdHVyZSI+VGhlIGN1bHR1cmUgcGFyYW1ldGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgb2JqZWN0LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5CcnVzaFNlbGVjdG9yLkNvbnZlcnRCYWNrKFN5c3RlbS5PYmplY3QsU3lzdGVtLlR5cGUsU3lzdGVtLk9iamVjdCxTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mbykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN1cHBvcnQgMi13YXkgZGF0YWJpbmRpbmcgb2YgdGhlIFZpc2liaWxpdHlDb252ZXJ0ZXIsIGNvbnZlcnRpbmcgDQorICAgICAgICAgICAgVmlzaWJpbGl0eSB0byBhIGJvb2xlYW4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRhcmdldFR5cGUiPlRoZSB0YXJnZXQgcGFyYW1ldGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlciI+Q29udmVydGVyUGFyYW1ldGVyIGlzIG9mIHR5cGUgVmlzaWJpbGl0eS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjdWx0dXJlIj5UaGUgY3VsdHVyZSBwYXJhbWV0ZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRoZSBvYmplY3QuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkJydXNoU2VsZWN0b3IuVHJ1ZUJydXNoIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIGNvbG9yIHRvIHVzZSBmb3IgdHJ1ZSB2YWx1ZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkJydXNoU2VsZWN0b3IuRmFsc2VCcnVzaCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBjb2xvciB0byB1c2UgZm9yIGZhbHNlIHZhbHVlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5Db2xsZWN0aW9uSGVscGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHNldCBvZiBleHRlbnNpb24gbWV0aG9kcyBmb3IgbWFuaXB1bGF0aW5nIGNvbGxlY3Rpb25zLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8UXVhbGl0eUJhbmQ+RXhwZXJpbWVudGFsPC9RdWFsaXR5QmFuZD4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkNvbGxlY3Rpb25IZWxwZXIuSXNSZWFkT25seShTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIGEgY29sbGVjdGlvbiBpcyByZWFkLW9ubHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5UaGUgY29sbGVjdGlvbiB0byBleGFtaW5lLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+QSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBjb2xsZWN0aW9uIGlzIHJlYWQtb25seS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5Db2xsZWN0aW9uSGVscGVyLkNhbkluc2VydChTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSB2YWx1ZSBJbmRpY2F0aW5nIHdoZXRoZXIgYW4gaXRlbSBjYW4gYmUgaW5zZXJ0ZWQgaW4gYSANCisgICAgICAgICAgICBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+VGhlIGNvbGxlY3Rpb24uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIGl0ZW0gdG8gYmUgaW5zZXJ0ZWQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5BIHZhbHVlIEluZGljYXRpbmcgd2hldGhlciBhbiBpdGVtIGNhbiBiZSBpbnNlcnRlZCBpbiBhIA0KKyAgICAgICAgICAgIGNvbGxlY3Rpb24uPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuQ29sbGVjdGlvbkhlbHBlci5JbnNlcnQoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5JbnQzMixTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5zZXJ0cyBhbiBpdGVtIGludG8gdGhlIGNvbGxlY3Rpb24gYXQgYW4gaW5kZXguDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5UaGUgY29sbGVjdGlvbi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbmRleCI+VGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgaXRlbS48L3BhcmFtPiANCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIGl0ZW0gdG8gYmUgaW5zZXJ0ZWQuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkNvbGxlY3Rpb25IZWxwZXIuQ291bnQoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+VGhlIGNvbGxlY3Rpb24uPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkNvbGxlY3Rpb25IZWxwZXIuQWRkKFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQWRkcyBhbiBpdGVtIHRvIHRoZSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+VGhlIGNvbGxlY3Rpb24uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIGl0ZW0gdG8gYmUgYWRkZWQuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkNvbGxlY3Rpb25IZWxwZXIuUmVtb3ZlKFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5UaGUgY29sbGVjdGlvbi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgaXRlbSB0byBiZSByZW1vdmVkLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5Db2xsZWN0aW9uSGVscGVyLlJlbW92ZUF0KFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZW1vdmVzIGFuIGl0ZW0gYXQgYSBnaXZlbiBpbmRleCBmcm9tIHRoZSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+VGhlIGNvbGxlY3Rpb24uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5kZXgiPlRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBiZSByZW1vdmVkLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuQ29sb3JTZWxlY3RvckNvbnZlcnRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBjb2xvciBzZWxlY3Rpb24gY29udmVydGVyIGZvciB0cmFuc2xhdGluZyBhIGJvb2wgcmVzdWx0IGludG8NCisgICAgICAgICAgICBhIGNvbG9yLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Db2xvclNlbGVjdG9yQ29udmVydGVyLkRlZmF1bHRUcnVlQ29sb3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRydWUgY29sb3IuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkNvbG9yU2VsZWN0b3JDb252ZXJ0ZXIuRGVmYXVsdEZhbHNlQ29sb3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBkZWZhdWx0IGZhbHNlIGNvbG9yLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Db2xvclNlbGVjdG9yQ29udmVydGVyLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQ29sb3JTZWxlY3RvckNvbnZlcnRlciB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Db2xvclNlbGVjdG9yQ29udmVydGVyLkNvbnZlcnQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5HbG9iYWxpemF0aW9uLkN1bHR1cmVJbmZvKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29udmVydCBhIGJvb2xlYW4gdmFsdWUgdG8gYSBDb2xvciB2YWx1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGFyZ2V0VHlwZSI+VGhlIHRhcmdldCBwYXJhbWV0ZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVyIj5Db252ZXJ0ZXJQYXJhbWV0ZXIgaXMgb2YgdHlwZSBWaXNpYmlsaXR5LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImN1bHR1cmUiPlRoZSBjdWx0dXJlIHBhcmFtZXRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgdGhlIG9iamVjdC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuQ29sb3JTZWxlY3RvckNvbnZlcnRlci5Db252ZXJ0QmFjayhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5UeXBlLFN5c3RlbS5PYmplY3QsU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdXBwb3J0IDItd2F5IGRhdGFiaW5kaW5nIG9mIHRoZSBWaXNpYmlsaXR5Q29udmVydGVyLCBjb252ZXJ0aW5nIA0KKyAgICAgICAgICAgIFZpc2liaWxpdHkgdG8gYSBib29sZWFuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YXJnZXRUeXBlIj5UaGUgdGFyZ2V0IHBhcmFtZXRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXIiPkNvbnZlcnRlclBhcmFtZXRlciBpcyBvZiB0eXBlIFZpc2liaWxpdHkuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3VsdHVyZSI+VGhlIGN1bHR1cmUgcGFyYW1ldGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgb2JqZWN0LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Db2xvclNlbGVjdG9yQ29udmVydGVyLlRydWVDb2xvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBjb2xvciB0byB1c2UgZm9yIHRydWUgdmFsdWVzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Db2xvclNlbGVjdG9yQ29udmVydGVyLkZhbHNlQ29sb3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgY29sb3IgdG8gdXNlIGZvciBmYWxzZSB2YWx1ZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuRW51bWVyYWJsZUV4dGVuc2lvbnMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgc2V0IG9mIGV4dGVuc2lvbiBtZXRob2RzIGZvciB0aGUgc2VxdWVuY2UgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pjtkc2YNCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkVudW1lcmFibGVFeHRlbnNpb25zLkl0ZXJhdGVgYDEoYGAwLFN5c3RlbS5GdW5je2BgMCxgYDB9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvZHVjZXMgYSBzZXF1ZW5jZSBvZiBpdGVtcyB1c2luZyBhIHNlZWQgdmFsdWUgYW5kIGl0ZXJhdGlvbiANCisgICAgICAgICAgICBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIHR5cGUgb2YgdGhlIHNlcXVlbmNlLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIGluaXRpYWwgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibmV4dCI+VGhlIGl0ZXJhdGlvbiBmdW5jdGlvbi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkEgc2VxdWVuY2Ugb2YgaXRlbXMgdXNpbmcgYSBzZWVkIHZhbHVlIGFuZCBpdGVyYXRpb24gDQorICAgICAgICAgICAgbWV0aG9kLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkVudW1lcmFibGVFeHRlbnNpb25zLlByZXBlbmRgYDEoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUVudW1lcmFibGV7YGAwfSxgYDApIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcmVwZW5kIGFuIGl0ZW0gdG8gYSBzZXF1ZW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgdHlwZSBvZiB0aGUgc2VxdWVuY2UuPC90eXBlcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRoYXQiPlRoZSBzZXF1ZW5jZSB0byBhcHBlbmQgdGhlIGl0ZW0gdG8uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBpdGVtIHRvIGFwcGVuZCB0byB0aGUgc2VxdWVuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5BIG5ldyBzZXF1ZW5jZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5FbnVtZXJhYmxlRXh0ZW5zaW9ucy5aaXBgYDMoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUVudW1lcmFibGV7YGAwfSxTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRW51bWVyYWJsZXtgYDF9LFN5c3RlbS5GdW5je2BgMCxgYDEsYGAyfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFjY2VwdHMgdHdvIHNlcXVlbmNlcyBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIA0KKyAgICAgICAgICAgIHZhbHVlcyBpbiB0aGUgdHdvIHNlcXVlbmNlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUMCI+VGhlIHR5cGUgb2YgdGhlIGZpcnN0IHNlcXVlbmNlLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVDEiPlRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgc2VxdWVuY2UuPC90eXBlcGFyYW0+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJSIj5UaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbnVtZXJhYmxlMCI+VGhlIGZpcnN0IHNlcXVlbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVudW1lcmFibGUxIj5UaGUgc2Vjb25kIHNlcXVlbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZ1bmMiPlRoZSBmdW5jdGlvbiB0byBhcHBseSB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMNCisgICAgICAgICAgICBmcm9tIHRoZSB0d28gc2VxdWVuY2VzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+QSBzZXF1ZW5jZSBvZiB0cmFuc2Zvcm1lZCB2YWx1ZXMgZnJvbSBib3RoIHNlcXVlbmNlcy48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuRm9udFdlaWdodENvbnZlcnRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBjb252ZXJ0ZXIgZm9yIG1vZGlmeWluZyB0aGUgZm9udCB3ZWlnaHQgYmFzZWQgb24gYSBwYXJhbWV0ZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkZvbnRXZWlnaHRDb252ZXJ0ZXIuQ29udmVydChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5UeXBlLFN5c3RlbS5PYmplY3QsU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb252ZXJ0IGEgYm9vbGVhbiB2YWx1ZSB0byBhIEZvbnRXZWlnaHQgdmFsdWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YXJnZXRUeXBlIj5UaGUgdGFyZ2V0IHBhcmFtZXRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXIiPkNvbnZlcnRlclBhcmFtZXRlciBpcyBvZiB0eXBlIFZpc2liaWxpdHkuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3VsdHVyZSI+VGhlIGN1bHR1cmUgcGFyYW1ldGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgb2JqZWN0LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Gb250V2VpZ2h0Q29udmVydGVyLkNvbnZlcnRCYWNrKFN5c3RlbS5PYmplY3QsU3lzdGVtLlR5cGUsU3lzdGVtLk9iamVjdCxTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mbykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN1cHBvcnQgMi13YXkgZGF0YWJpbmRpbmcgb2YgdGhlIFZpc2liaWxpdHlDb252ZXJ0ZXIsIGNvbnZlcnRpbmcgDQorICAgICAgICAgICAgVmlzaWJpbGl0eSB0byBhIGJvb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YXJnZXRUeXBlIj5UaGUgdGFyZ2V0IHBhcmFtZXRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXIiPkNvbnZlcnRlclBhcmFtZXRlciBpcyBvZiB0eXBlIFZpc2liaWxpdHkuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3VsdHVyZSI+VGhlIGN1bHR1cmUgcGFyYW1ldGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgb2JqZWN0LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Gb250V2VpZ2h0Q29udmVydGVyLkdldEZvbnRXZWlnaHRNb2RlKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZXRlcm1pbmUgdGhlIHZpc2liaWxpdHkgbW9kZSBiYXNlZCBvbiBhIGNvbnZlcnRlciBwYXJhbWV0ZXIuIFRoaXMNCisgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBWaXNpYmlsaXR5LCBhbmQgc3BlY2lmaWVzIHdoYXQgdmlzaWJpbGl0eSB2YWx1ZQ0KKyAgICAgICAgICAgIHRvIHJldHVybiB3aGVuIHRoZSBib29sZWFuIHZhbHVlIGlzIHRydWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXIiPlRoZSBwYXJhbWV0ZXIgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIEZvbnRXZWlnaHQgdmFsdWUuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkZvbnRXZWlnaHRDb252ZXJ0ZXIuSXNGb250V2VpZ2h0SW52ZXJ0ZWQoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZWlnaHQgaXMgaW52ZXJ0ZWQgYmFzZWQgb24gYSBjb252ZXJ0ZXINCisgICAgICAgICAgICBwYXJhbWV0ZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXIiPlRoZSBwYXJhbWV0ZXIgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpbnN0YW5jZSBpcyANCisgICAgICAgICAgICBpbnZlcnRpbmcuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuRnVuY3Rpb25hbFByb2dyYW1taW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyBmb3IgZnVuY3Rpb25hbCBwcm9ncmFtbWluZyB0YXNrcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5GdW5jdGlvbmFsUHJvZ3JhbW1pbmcuVHJhdmVyc2VCcmVhZHRoRmlyc3RgYDEoYGAwLFN5c3RlbS5GdW5je2BgMCxTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRW51bWVyYWJsZXtgYDB9fSxTeXN0ZW0uRnVuY3tgYDAsU3lzdGVtLkJvb2xlYW59KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVHJhdmVyc2VzIGEgdHJlZSBieSBhY2NlcHRpbmcgYW4gaW5pdGlhbCB2YWx1ZSBhbmQgYSBmdW5jdGlvbiB0aGF0IA0KKyAgICAgICAgICAgIHJldHJpZXZlcyB0aGUgY2hpbGQgbm9kZXMgb2YgYSBub2RlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSB0eXBlIG9mIHRoZSBzdHJlYW0uPC90eXBlcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImluaXRpYWxOb2RlIj5UaGUgaW5pdGlhbCBub2RlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImdldENoaWxkTm9kZXMiPkEgZnVuY3Rpb24gdGhhdCByZXRyaWV2ZXMgdGhlIGNoaWxkDQorICAgICAgICAgICAgbm9kZXMgb2YgYSBub2RlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRyYXZlcnNlUHJlZGljYXRlIj5BIHByZWRpY2F0ZSB0aGF0IGV2YWx1YXRlcyBhIG5vZGUNCisgICAgICAgICAgICBhbmQgcmV0dXJucyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGF0IG5vZGUgYW5kIGl0J3MgY2hpbGRyZW4NCisgICAgICAgICAgICBzaG91bGQgYmUgdHJhdmVyc2VkLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+QSBzdHJlYW0gb2Ygbm9kZXMuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkhlYWRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3QgcmVzdWx0cyBoZWFkZXIgY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuSGVhZGVyLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgSGVhZGVyIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkhlYWRlci5Jbml0aWFsaXplQ29tcG9uZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplQ29tcG9uZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkludmVydGVkVHlwZU5hbWVWaXNpYmlsaXR5Q29udmVydGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHZhbHVlIGNvbnZlcnRlciBmb3IgY29sbGFwc2luZyBvciBzaG93aW5nIGVsZW1lbnRzIGJhc2VkIG9uIHRoZSBib3VuZA0KKyAgICAgICAgICAgIG9iamVjdCdzIHR5cGUgbmFtZS4gRG9lcyBub3Qgd2FsayB0aGUgaGllcmFyY2h5IC0gaXQgaXMgZXhwbGljaXQgdG8gdGhlDQorICAgICAgICAgICAgbW9zdCBzcGVjaWZpYyBjbGFzcyBmb3IgdGhlIHZhbHVlLiBUaGlzIGNsYXNzLA0KKyAgICAgICAgICAgIEludmVydGVkVHlwZU5hbWVWaXNpYmlsaXR5Q29udmVydGVyLCBvZmZlcnMgdGhlIG9wcG9zaXRlIGJlaGF2aW9yIG9mIHRoZQ0KKyAgICAgICAgICAgIFR5cGVOYW1lVmlzaWJpbGl0eUNvbnZlcnRlciBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVHlwZU5hbWVWaXNpYmlsaXR5Q29udmVydGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHZhbHVlIGNvbnZlcnRlciBmb3IgY29sbGFwc2luZyBvciBzaG93aW5nIGVsZW1lbnRzIGJhc2VkIG9uIHRoZSBib3VuZA0KKyAgICAgICAgICAgIG9iamVjdCdzIHR5cGUgbmFtZS4gRG9lcyBub3Qgd2FsayB0aGUgaGllcmFyY2h5IC0gaXQgaXMgZXhwbGljaXQgdG8gdGhlDQorICAgICAgICAgICAgbW9zdCBzcGVjaWZpYyBjbGFzcyBmb3IgdGhlIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UeXBlTmFtZVZpc2liaWxpdHlDb252ZXJ0ZXIuQ29udmVydChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5UeXBlLFN5c3RlbS5PYmplY3QsU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb252ZXJ0IGEgdmFsdWUgYmFzZWQgb24gQ0xSIHR5cGUgdG8gYSBWaXNpYmlsaXR5IHZhbHVlLiBEb2VzIG5vdA0KKyAgICAgICAgICAgIHdhbGsgdGhlIHR5cGUgdHJlZSwgaG93ZXZlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgdmFsdWUgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGFyZ2V0VHlwZSI+VGhlIHRhcmdldCBwYXJhbWV0ZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVyIj5Db252ZXJ0ZXJQYXJhbWV0ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHR5cGUsDQorICAgICAgICAgICAgYm90aCBzaG9ydCBhbmQgZnVsbCBuYW1lcyBhcmUgY2hlY2tlZCwgc2hvcnQgbmFtZSBmaXJzdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjdWx0dXJlIj5UaGUgY3VsdHVyZSBwYXJhbWV0ZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRoZSBvYmplY3QuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlR5cGVOYW1lVmlzaWJpbGl0eUNvbnZlcnRlci5Db252ZXJ0QmFjayhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5UeXBlLFN5c3RlbS5PYmplY3QsU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb252ZXJ0IGJhY2ssIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzIHZhbHVlIGNvbnZlcnRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgdmFsdWUgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGFyZ2V0VHlwZSI+VGhlIHRhcmdldCBwYXJhbWV0ZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVyIj5Db252ZXJ0ZXJQYXJhbWV0ZXIgaXMgb2YgdHlwZSBWaXNpYmlsaXR5LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImN1bHR1cmUiPlRoZSBjdWx0dXJlIHBhcmFtZXRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgdGhlIG9iamVjdC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVHlwZU5hbWVWaXNpYmlsaXR5Q29udmVydGVyLklzSW52ZXJ0ZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHZpc2liaWxpdHkgdmFsdWUgc2hvdWxkIGJlDQorICAgICAgICAgICAgaW52ZXJ0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkludmVydGVkVHlwZU5hbWVWaXNpYmlsaXR5Q29udmVydGVyLklzSW52ZXJ0ZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHZpc2liaWxpdHkgdmFsdWUgc2hvdWxkIGJlDQorICAgICAgICAgICAgaW52ZXJ0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSXRlbXNDb250cm9sRXh0ZW5zaW9ucyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvdmlkZXMgdXNlZnVsIGV4dGVuc2lvbnMgdG8gSXRlbXNDb250cm9sIGluc3RhbmNlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPFF1YWxpdHlCYW5kPkV4cGVyaW1lbnRhbDwvUXVhbGl0eUJhbmQ+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JdGVtc0NvbnRyb2xFeHRlbnNpb25zLkdldEl0ZW1zSG9zdChTeXN0ZW0uV2luZG93cy5Db250cm9scy5JdGVtc0NvbnRyb2wpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBQYW5lbCB0aGF0IGNvbnRhaW5zIHRoZSBjb250YWluZXJzIG9mIGFuIEl0ZW1zQ29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbnRyb2wiPlRoZSBJdGVtc0NvbnRyb2wuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgUGFuZWwgdGhhdCBjb250YWlucyB0aGUgY29udGFpbmVycyBvZiBhbiBJdGVtc0NvbnRyb2wsIG9yIG51bGwNCisgICAgICAgICAgICBpZiB0aGUgUGFuZWwgY291bGQgbm90IGJlIGZvdW5kLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImNvbnRyb2wiIC8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JdGVtc0NvbnRyb2xFeHRlbnNpb25zLkdldFNjcm9sbEhvc3QoU3lzdGVtLldpbmRvd3MuQ29udHJvbHMuSXRlbXNDb250cm9sKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgU2Nyb2xsVmlld2VyIHRoYXQgY29udGFpbnMgdGhlIGNvbnRhaW5lcnMgb2YgYW4NCisgICAgICAgICAgICBJdGVtc0NvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb250cm9sIj5UaGUgSXRlbXNDb250cm9sLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIFNjcm9sbFZpZXdlciB0aGF0IGNvbnRhaW5zIHRoZSBjb250YWluZXJzIG9mIGFuIEl0ZW1zQ29udHJvbCwgb3INCisgICAgICAgICAgICBudWxsIGlmIGEgU2Nyb2xsVmlld2VyIGNvdWxkIG5vdCBiZSBmb3VuZC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJjb250cm9sIiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSXRlbXNDb250cm9sRXh0ZW5zaW9ucy5HZXRDb250YWluZXJzKFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLkl0ZW1zQ29udHJvbCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgaXRlbSBjb250YWluZXJzIG9mIGFuIEl0ZW1zQ29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbnRyb2wiPlRoZSBJdGVtc0NvbnRyb2wuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgaXRlbSBjb250YWluZXJzIG9mIGFuIEl0ZW1zQ29udHJvbC48L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJjb250cm9sIiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSXRlbXNDb250cm9sRXh0ZW5zaW9ucy5HZXRDb250YWluZXJzYGAxKFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLkl0ZW1zQ29udHJvbCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgaXRlbSBjb250YWluZXJzIG9mIGFuIEl0ZW1zQ29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUQ29udGFpbmVyIj4NCisgICAgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgaXRlbSBjb250YWluZXJzLg0KKyAgICAgICAgICAgIDwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb250cm9sIj5UaGUgSXRlbXNDb250cm9sLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIGl0ZW0gY29udGFpbmVycyBvZiBhbiBJdGVtc0NvbnRyb2wuPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iY29udHJvbCIgLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkl0ZW1zQ29udHJvbEV4dGVuc2lvbnMuR2V0Q29udGFpbmVyc0l0ZXJhdG9yYGAxKFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLkl0ZW1zQ29udHJvbCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgaXRlbSBjb250YWluZXJzIG9mIGFuIEl0ZW1zQ29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUQ29udGFpbmVyIj4NCisgICAgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgaXRlbSBjb250YWluZXJzLg0KKyAgICAgICAgICAgIDwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb250cm9sIj5UaGUgSXRlbXNDb250cm9sLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIGl0ZW0gY29udGFpbmVycyBvZiBhbiBJdGVtc0NvbnRyb2wuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSXRlbXNDb250cm9sRXh0ZW5zaW9ucy5HZXRJdGVtc0FuZENvbnRhaW5lcnMoU3lzdGVtLldpbmRvd3MuQ29udHJvbHMuSXRlbXNDb250cm9sKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSBpdGVtcyBhbmQgaXRlbSBjb250YWluZXJzIG9mIGFuIEl0ZW1zQ29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbnRyb2wiPlRoZSBJdGVtc0NvbnRyb2wuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgaXRlbXMgYW5kIGl0ZW0gY29udGFpbmVycyBvZiBhbiBJdGVtc0NvbnRyb2wuPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iY29udHJvbCIgLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkl0ZW1zQ29udHJvbEV4dGVuc2lvbnMuR2V0SXRlbXNBbmRDb250YWluZXJzYGAxKFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLkl0ZW1zQ29udHJvbCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgaXRlbXMgYW5kIGl0ZW0gY29udGFpbmVycyBvZiBhbiBJdGVtc0NvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVENvbnRhaW5lciI+DQorICAgICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIGl0ZW0gY29udGFpbmVycy4NCisgICAgICAgICAgICA8L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29udHJvbCI+VGhlIEl0ZW1zQ29udHJvbC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRoZSBpdGVtcyBhbmQgaXRlbSBjb250YWluZXJzIG9mIGFuIEl0ZW1zQ29udHJvbC48L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJjb250cm9sIiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSXRlbXNDb250cm9sRXh0ZW5zaW9ucy5HZXRJdGVtc0FuZENvbnRhaW5lcnNJdGVyYXRvcmBgMShTeXN0ZW0uV2luZG93cy5Db250cm9scy5JdGVtc0NvbnRyb2wpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIGl0ZW1zIGFuZCBpdGVtIGNvbnRhaW5lcnMgb2YgYW4gSXRlbXNDb250cm9sLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlRDb250YWluZXIiPg0KKyAgICAgICAgICAgIFRoZSB0eXBlIG9mIHRoZSBpdGVtIGNvbnRhaW5lcnMuDQorICAgICAgICAgICAgPC90eXBlcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbnRyb2wiPlRoZSBJdGVtc0NvbnRyb2wuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgaXRlbXMgYW5kIGl0ZW0gY29udGFpbmVycyBvZiBhbiBJdGVtc0NvbnRyb2wuPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iY29udHJvbCIgLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkl0ZW1zQ29udHJvbEV4dGVuc2lvbnMuQ2FuQWRkSXRlbShTeXN0ZW0uV2luZG93cy5Db250cm9scy5JdGVtc0NvbnRyb2wsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gaXRlbSBjYW4gYmUgYWRkZWQgdG8gYW4NCisgICAgICAgICAgICBJdGVtc0NvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0aGF0Ij5UaGUgSXRlbXNDb250cm9sIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Iml0ZW0iPlRoZSBpdGVtIHRvIGJlIGFkZGVkLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+QSB2YWx1ZSBJbmRpY2F0aW5nIHdoZXRoZXIgYW4gaXRlbSBjYW4gYmUgYWRkZWQgdG8gYW4NCisgICAgICAgICAgICBJdGVtc0NvbnRyb2wuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSXRlbXNDb250cm9sRXh0ZW5zaW9ucy5DYW5SZW1vdmVJdGVtKFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLkl0ZW1zQ29udHJvbCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gaXRlbSBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZQ0KKyAgICAgICAgICAgIEl0ZW1zQ29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRoYXQiPlRoZSBpdGVtcyBjb250cm9sLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+QSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gaXRlbSBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZQ0KKyAgICAgICAgICAgIEl0ZW1zQ29udHJvbC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JdGVtc0NvbnRyb2xFeHRlbnNpb25zLkluc2VydEl0ZW0oU3lzdGVtLldpbmRvd3MuQ29udHJvbHMuSXRlbXNDb250cm9sLFN5c3RlbS5JbnQzMixTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5zZXJ0cyBhbiBpdGVtIGludG8gYW4gSXRlbXNDb250cm9sLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGhhdCI+VGhlIEl0ZW1zQ29udHJvbCBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbmRleCI+VGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgaXRlbS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgaXRlbSB0byBiZSBpbnNlcnRlZC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSXRlbXNDb250cm9sRXh0ZW5zaW9ucy5BZGRJdGVtKFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLkl0ZW1zQ29udHJvbCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQWRkcyBhbiBpdGVtIHRvIGFuIEl0ZW1zQ29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRoYXQiPlRoZSBJdGVtc0NvbnRyb2wgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIGl0ZW0gdG8gYmUgaW5zZXJ0ZWQuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkl0ZW1zQ29udHJvbEV4dGVuc2lvbnMuUmVtb3ZlSXRlbShTeXN0ZW0uV2luZG93cy5Db250cm9scy5JdGVtc0NvbnRyb2wsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlbW92ZXMgYW4gaXRlbSBmcm9tIGFuIEl0ZW1zQ29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRoYXQiPlRoZSBJdGVtc0NvbnRyb2wgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIGl0ZW0gdG8gYmUgcmVtb3ZlZC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSXRlbXNDb250cm9sRXh0ZW5zaW9ucy5SZW1vdmVJdGVtQXRJbmRleChTeXN0ZW0uV2luZG93cy5Db250cm9scy5JdGVtc0NvbnRyb2wsU3lzdGVtLkludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVtb3ZlcyBhbiBpdGVtIGZyb20gYW4gSXRlbXNDb250cm9sLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGhhdCI+VGhlIEl0ZW1zQ29udHJvbCBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbmRleCI+VGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGJlIHJlbW92ZWQuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkl0ZW1zQ29udHJvbEV4dGVuc2lvbnMuR2V0SXRlbUNvdW50KFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLkl0ZW1zQ29udHJvbCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhbiBJdGVtc0NvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0aGF0Ij5UaGUgSXRlbXNDb250cm9sIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgSXRlbXNDb250cm9sLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5MYXlvdXRUcmFuc2Zvcm1lciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVwcmVzZW50cyBhIGNvbnRyb2wgdGhhdCBhcHBsaWVzIGEgbGF5b3V0IHRyYW5zZm9ybWF0aW9uIHRvIGl0cyBDb250ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8UXVhbGl0eUJhbmQ+UHJldmlldzwvUXVhbGl0eUJhbmQ+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTGF5b3V0VHJhbnNmb3JtZXIuVHJhbnNmb3JtUm9vdE5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE5hbWUgb2YgdGhlIFRyYW5zZm9ybVJvb3QgdGVtcGxhdGUgcGFydC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTGF5b3V0VHJhbnNmb3JtZXIuUHJlc2VudGVyTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTmFtZSBvZiB0aGUgUHJlc2VudGVyIHRlbXBsYXRlIHBhcnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkxheW91dFRyYW5zZm9ybWVyLkFjY2VwdGFibGVEZWx0YSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQWNjZXB0YWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGRvdWJsZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkxheW91dFRyYW5zZm9ybWVyLkRlY2ltYWxzQWZ0ZXJSb3VuZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTnVtYmVyIG9mIGRlY2ltYWxzIHRvIHJvdW5kIHRoZSBNYXRyaXggdG8uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkxheW91dFRyYW5zZm9ybWVyLkxheW91dFRyYW5zZm9ybVByb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJZGVudGlmaWVzIHRoZSBMYXlvdXRUcmFuc2Zvcm0gRGVwZW5kZW5jeVByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5MYXlvdXRUcmFuc2Zvcm1lci5fdHJhbnNmb3JtUm9vdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUm9vdCBlbGVtZW50IGZvciBwZXJmb3JtaW5nIHRyYW5zZm9ybWF0aW9ucy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTGF5b3V0VHJhbnNmb3JtZXIuX2NvbnRlbnRQcmVzZW50ZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnRlbnRQcmVzZW50ZXIgZWxlbWVudCBmb3IgZGlzcGxheWluZyB0aGUgY29udGVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTGF5b3V0VHJhbnNmb3JtZXIuX21hdHJpeFRyYW5zZm9ybSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVuZGVyVHJhbnNmb3JtL01hdHJpeFRyYW5zZm9ybSBhcHBsaWVkIHRvIF90cmFuc2Zvcm1Sb290Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5MYXlvdXRUcmFuc2Zvcm1lci5fdHJhbnNmb3JtYXRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRyYW5zZm9ybWF0aW9uIG1hdHJpeCBjb3JyZXNwb25kaW5nIHRvIF9tYXRyaXhUcmFuc2Zvcm0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkxheW91dFRyYW5zZm9ybWVyLl9jaGlsZEFjdHVhbFNpemUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFjdHVhbCBEZXNpcmVkU2l6ZSBvZiBDaGlsZCBlbGVtZW50ICh0aGUgdmFsdWUgaXQgcmV0dXJuZWQgZnJvbSBpdHMgTWVhc3VyZU92ZXJyaWRlIG1ldGhvZCkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkxheW91dFRyYW5zZm9ybWVyLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgTGF5b3V0VHJhbnNmb3JtZXIgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkxheW91dFRyYW5zZm9ybWVyLk9uQXBwbHlUZW1wbGF0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQnVpbGRzIHRoZSB2aXN1YWwgdHJlZSBmb3IgdGhlIExheW91dFRyYW5zZm9ybWVyIGNvbnRyb2wgd2hlbiBhIG5ldyANCisgICAgICAgICAgICB0ZW1wbGF0ZSBpcyBhcHBsaWVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5MYXlvdXRUcmFuc2Zvcm1lci5MYXlvdXRUcmFuc2Zvcm1DaGFuZ2VkKFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QsU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeVByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZXMgY2hhbmdlcyB0byB0aGUgVHJhbnNmb3JtIERlcGVuZGVuY3lQcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im8iPlNvdXJjZSBvZiB0aGUgY2hhbmdlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3MuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5MYXlvdXRUcmFuc2Zvcm1lci5BcHBseUxheW91dFRyYW5zZm9ybSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbGllcyB0aGUgbGF5b3V0IHRyYW5zZm9ybSBvbiB0aGUgTGF5b3V0VHJhbnNmb3JtZXIgY29udHJvbCBjb250ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBPbmx5IHVzZWQgaW4gYWR2YW5jZWQgc2NlbmFyaW9zIChsaWtlIGFuaW1hdGluZyB0aGUgTGF5b3V0VHJhbnNmb3JtKS4gDQorICAgICAgICAgICAgU2hvdWxkIGJlIHVzZWQgdG8gbm90aWZ5IHRoZSBMYXlvdXRUcmFuc2Zvcm1lciBjb250cm9sIHRoYXQgc29tZSBhc3BlY3QgDQorICAgICAgICAgICAgb2YgaXRzIFRyYW5zZm9ybSBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4gDQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkxheW91dFRyYW5zZm9ybWVyLlByb2Nlc3NUcmFuc2Zvcm0oU3lzdGVtLldpbmRvd3MuTWVkaWEuVHJhbnNmb3JtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvY2Vzc2VzIHRoZSBUcmFuc2Zvcm0gdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZXNwb25kaW5nIE1hdHJpeC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRyYW5zZm9ybSI+VHJhbnNmb3JtIHRvIHByb2Nlc3MuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5MYXlvdXRUcmFuc2Zvcm1lci5HZXRUcmFuc2Zvcm1NYXRyaXgoU3lzdGVtLldpbmRvd3MuTWVkaWEuVHJhbnNmb3JtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV2Fsa3MgdGhlIFRyYW5zZm9ybShHcm91cCkgYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgTWF0cml4Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idHJhbnNmb3JtIj5UcmFuc2Zvcm0oR3JvdXApIHRvIHdhbGsuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5Db21wdXRlZCBNYXRyaXguPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkxheW91dFRyYW5zZm9ybWVyLk1lYXN1cmVPdmVycmlkZShTeXN0ZW0uV2luZG93cy5TaXplKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvdmlkZXMgdGhlIGJlaGF2aW9yIGZvciB0aGUgIk1lYXN1cmUiIHBhc3Mgb2YgbGF5b3V0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXZhaWxhYmxlU2l6ZSI+VGhlIGF2YWlsYWJsZSBzaXplIHRoYXQgdGhpcyBlbGVtZW50IGNhbiBnaXZlIHRvIGNoaWxkIGVsZW1lbnRzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIHNpemUgdGhhdCB0aGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBpdCBuZWVkcyBkdXJpbmcgbGF5b3V0LCBiYXNlZCBvbiBpdHMgY2FsY3VsYXRpb25zIG9mIGNoaWxkIGVsZW1lbnQgc2l6ZXMuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkxheW91dFRyYW5zZm9ybWVyLkFycmFuZ2VPdmVycmlkZShTeXN0ZW0uV2luZG93cy5TaXplKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvdmlkZXMgdGhlIGJlaGF2aW9yIGZvciB0aGUgIkFycmFuZ2UiIHBhc3Mgb2YgbGF5b3V0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmluYWxTaXplIj5UaGUgZmluYWwgYXJlYSB3aXRoaW4gdGhlIHBhcmVudCB0aGF0IHRoaXMgZWxlbWVudCBzaG91bGQgdXNlIHRvIGFycmFuZ2UgaXRzZWxmIGFuZCBpdHMgY2hpbGRyZW4uPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgYWN0dWFsIHNpemUgdXNlZC48L3JldHVybnM+DQorICAgICAgICAgICAgPHJlbWFya3M+DQorICAgICAgICAgICAgVXNpbmcgdGhlIFdQRiBwYXJhbWF0ZXIgbmFtZSBmaW5hbFNpemUgaW5zdGVhZCBvZiBTaWx2ZXJsaWdodCdzIGZpbmFsU2l6ZSBmb3IgY2xhcml0eQ0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5MYXlvdXRUcmFuc2Zvcm1lci5Db21wdXRlTGFyZ2VzdFRyYW5zZm9ybWVkU2l6ZShTeXN0ZW0uV2luZG93cy5TaXplKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29tcHV0ZSB0aGUgbGFyZ2VzdCB1c2FibGUgc2l6ZSAoZ3JlYXRlc3QgYXJlYSkgYWZ0ZXIgYXBwbHlpbmcgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgYm91bmRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJyYW5nZUJvdW5kcyI+QXJyYW5nZSBib3VuZHMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5MYXJnZXN0IFNpemUgcG9zc2libGUuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkxheW91dFRyYW5zZm9ybWVyLklzU2l6ZVNtYWxsZXIoU3lzdGVtLldpbmRvd3MuU2l6ZSxTeXN0ZW0uV2luZG93cy5TaXplKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyB0cnVlIGlmIFNpemUgYSBpcyBzbWFsbGVyIHRoYW4gU2l6ZSBiIGluIGVpdGhlciBkaW1lbnNpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhIj5TZWNvbmQgU2l6ZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJiIj5GaXJzdCBTaXplLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBpZiBTaXplIGEgaXMgc21hbGxlciB0aGFuIFNpemUgYiBpbiBlaXRoZXIgZGltZW5zaW9uLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5MYXlvdXRUcmFuc2Zvcm1lci5Sb3VuZE1hdHJpeChTeXN0ZW0uV2luZG93cy5NZWRpYS5NYXRyaXgsU3lzdGVtLkludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUm91bmRzIHRoZSBub24tb2Zmc2V0IGVsZW1lbnRzIG9mIGEgTWF0cml4IHRvIGF2b2lkIGlzc3VlcyBkdWUgdG8gZmxvYXRpbmcgcG9pbnQgaW1wcmVjaXNpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtYXRyaXgiPk1hdHJpeCB0byByb3VuZC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWNpbWFscyI+TnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIHJvdW5kIHRvLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+Um91bmRlZCBNYXRyaXguPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkxheW91dFRyYW5zZm9ybWVyLlJlY3RUcmFuc2Zvcm0oU3lzdGVtLldpbmRvd3MuUmVjdCxTeXN0ZW0uV2luZG93cy5NZWRpYS5NYXRyaXgpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbXBsZW1lbnRzIFdQRidzIFJlY3QuVHJhbnNmb3JtIG9uIFNpbHZlcmxpZ2h0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icmVjdCI+UmVjdCB0byB0cmFuc2Zvcm0uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWF0cml4Ij5NYXRyaXggdG8gdHJhbnNmb3JtIHdpdGguPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5Cb3VuZGluZyBib3ggb2YgdHJhbnNmb3JtZWQgUmVjdC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTGF5b3V0VHJhbnNmb3JtZXIuTWF0cml4TXVsdGlwbHkoU3lzdGVtLldpbmRvd3MuTWVkaWEuTWF0cml4LFN5c3RlbS5XaW5kb3dzLk1lZGlhLk1hdHJpeCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEltcGxlbWVudHMgV1BGJ3MgTWF0cml4Lk11bHRpcGx5IG9uIFNpbHZlcmxpZ2h0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWF0cml4MSI+Rmlyc3QgbWF0cml4LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1hdHJpeDIiPlNlY29uZCBtYXRyaXguPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5NdWx0aXBsaWNhdGlvbiByZXN1bHQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkxheW91dFRyYW5zZm9ybWVyLk1hdHJpeEhhc0ludmVyc2UoU3lzdGVtLldpbmRvd3MuTWVkaWEuTWF0cml4KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW1wbGVtZW50cyBXUEYncyBNYXRyaXguSGFzSW52ZXJzZSBvbiBTaWx2ZXJsaWdodC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1hdHJpeCI+TWF0cml4IHRvIGNoZWNrIGZvciBpbnZlcnNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBpZiB0aGUgTWF0cml4IGhhcyBhbiBpbnZlcnNlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5MYXlvdXRUcmFuc2Zvcm1lci5EaWFnbm9zdGljV3JpdGVMaW5lKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBPdXRwdXRzIGRpYWdub3N0aWMgaW5mbyBpZiBESUFHTk9TVElDV1JJVEVMSU5FIGlzIGRlZmluZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5EaWFnbm9zdGljIG1lc3NhZ2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5MYXlvdXRUcmFuc2Zvcm1lci5MYXlvdXRUcmFuc2Zvcm0iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgbGF5b3V0IHRyYW5zZm9ybSB0byBhcHBseSBvbiB0aGUgTGF5b3V0VHJhbnNmb3JtZXIgDQorICAgICAgICAgICAgY29udHJvbCBjb250ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBDb3JyZXNwb25kcyB0byBVSUVsZW1lbnQuTGF5b3V0VHJhbnNmb3JtLg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5MYXlvdXRUcmFuc2Zvcm1lci5DaGlsZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgY2hpbGQgZWxlbWVudCBiZWluZyB0cmFuc2Zvcm1lZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlU3RhcnR1cCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIFRhZ0VkaXRvciBjb250cm9sIHByb3ZpZGVzIGEgYnJpZWYgdXNlciBpbnRlcmZhY2UgYWxsb3dpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIHNlbGVjdGlvbiBvZiBhIHNldCBvZiB0ZXN0cywgdXNlZCB0byBmaWx0ZXIgdGhlIHRlc3QgcnVuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Nb2JpbGVTdGFydHVwLlRhZ0hpc3RvcnlLZXkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEtleSB1c2VkIHRvIGxvb2t1cCB0aGUgVGFnSGlzdG9yeSBzaXRlIHNldHRpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk1vYmlsZVN0YXJ0dXAuU2Vjb25kc1RvV2FpdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcnVubmluZyB0aGUgdGVzdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlU3RhcnR1cC4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFRhZ0VkaXRvciB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5pdGlhbFRhZ0V4cHJlc3Npb24iPlRoZSB0YWcgZXhwcmVzc2lvbiB0byB1c2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Nb2JpbGVTdGFydHVwLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgVGFnRWRpdG9yIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk1vYmlsZVN0YXJ0dXAuT25Db21wbGV0ZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGFnRXhwcmVzc2lvbkV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZpcmVzIHRoZSBDb21wbGV0ZSBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBldmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Nb2JpbGVTdGFydHVwLk9uVG91Y2hUb0VudGVyVGV4dENsaWNrKFN5c3RlbS5PYmplY3QsU3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlIHRvdWNoIG9mIHRoZSBidXR0b24gdG8gZGlzcGxheSB0aGUgdGV4dCBib3guDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRhZyBidXR0b24uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlU3RhcnR1cC5PblRhZ0J1dHRvbkNsaWNrZWQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIYW5kbGUgc2VsZWN0aW9uIG9mIGEgdGFnIGJ1dHRvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGFnIGJ1dHRvbi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Nb2JpbGVTdGFydHVwLk9uVGFnVG91Y2hlZChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5XaW5kb3dzLlJvdXRlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZSBjaGFuZ2VzIHRvIHRoZSBUYWcgdGV4dC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGFnIFRleHRCb3guPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlU3RhcnR1cC5PblJ1bkNsaWNrZWQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIYW5kbGUgY2xpY2tzIHRvIHRoZSBSdW4gYnV0dG9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5SdW4gQnV0dG9uLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk1vYmlsZVN0YXJ0dXAuT25UaW1lclRpY2soU3lzdGVtLk9iamVjdCxTeXN0ZW0uRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlIHRpbWVyIHRpY2tzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgdGltZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlU3RhcnR1cC5TdG9wVGltZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN0b3AgdGhlIHRpbWVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Nb2JpbGVTdGFydHVwLlJ1blRlc3RzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSdW4gdGhlIHVuaXQgdGVzdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk1vYmlsZVN0YXJ0dXAuT25DYW5jZWxDbGlja2VkKFN5c3RlbS5PYmplY3QsU3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2FuY2VscyB0aGUgc2VsZWN0aW9uIG9mIGEgdGFnIGV4cHJlc3Npb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBzb3VyY2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBldmVudCBkYXRhLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlU3RhcnR1cC5Jbml0aWFsaXplQ29tcG9uZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplQ29tcG9uZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk1vYmlsZVN0YXJ0dXAuVGltZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdGltZXIgdXNlZCB0byBhdXRvbWF0aWNhbGx5IHJ1biB0ZXN0cyBpZiBubyB0YWcgaXMNCisgICAgICAgICAgICBlbnRlcmVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Nb2JpbGVTdGFydHVwLlNlY29uZHNXYWl0ZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgYWxyZWFkeSB3YWl0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk1vYmlsZVN0YXJ0dXAuVGFnSGlzdG9yeSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSB0YWcgaGlzdG9yeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlU3RhcnR1cC5Db21wbGV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQW4gZXZlbnQgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFnIGVkaXRvciBpcyBjb21wbGV0ZS4gVGhpcyBjYW4gYmUNCisgICAgICAgICAgICBpbiByZXNwb25zZSB0byBtYW55IGFjdGlvbnM6IHRoZSB1c2VyIGVudGVyaW5nIGEgdGFnIGV4cHJlc3Npb24sIHRoZQ0KKyAgICAgICAgICAgIHRpbWUgZXhwaXJpbmcgYW5kIHRoZSBkZWZhdWx0IGJlaW5nIHNlbGVjdGVkLCBvciB0aGUgc2VsZWN0aW9uIGJlaW5nDQorICAgICAgICAgICAgY2FuY2VsZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk1vYmlsZVRlc3RFeGNlcHRpb25EZXRhaWxzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNb2JpbGUgdGVzdCBleGNlcHRpb25zIHBhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk1vYmlsZVRlc3RFeGNlcHRpb25EZXRhaWxzLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcGFnZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlVGVzdEV4Y2VwdGlvbkRldGFpbHMuSW5pdGlhbGl6ZUNvbXBvbmVudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZUNvbXBvbmVudA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Nb2JpbGVUZXN0TWV0aG9kRGV0YWlscyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTW9iaWxlIHRlc3QgbWV0aG9kIGRldGFpbHMgcGFnZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlVGVzdE1ldGhvZERldGFpbHMuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBwYWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Nb2JpbGVUZXN0TWV0aG9kRGV0YWlscy5Jbml0aWFsaXplQ29tcG9uZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplQ29tcG9uZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk1vYmlsZVRlc3RQYWdlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHVzZXIgY29udHJvbCBkZXNpZ25lZCBmb3IgbW9iaWxlIHBsYXRmb3Jtcy4gVGhlIGNvbnRyb2wgc2hvdWxkIGJlIHVzZWQNCisgICAgICAgICAgICBhcyB0aGUgcm9vdCB2aXN1YWwgZm9yIGEgU2lsdmVybGlnaHQgcGx1Z2luIGlmIGRldmVsb3BlcnMgd291bGQgbGlrZSB0byANCisgICAgICAgICAgICB1c2UgdGhlIGFkdmFuY2VkIFRlc3RTdXJmYWNlIGZ1bmN0aW9uYWxpdHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSVRlc3RQYWdlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBbiBpbnRlcmZhY2UgZm9yIGFueSB0ZXN0IHBhZ2UgaW5zdGFuY2VzIHRvIGltcGxlbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5JVGVzdFBhZ2UuVGVzdFBhbmVsIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB0ZXN0IHBhbmVsIGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLklNb2JpbGVUZXN0UGFnZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQW4gaW50ZXJmYWNlIGZvciBhbnkgdGVzdCBwYWdlIGluc3RhbmNlcyB0byBpbXBsZW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSU1vYmlsZVRlc3RQYWdlLk5hdmlnYXRlQmFjayI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVxdWVzdHMgbmF2aWdhdGlvbiBiYWNrIGEgcGFnZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+QSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlVGVzdFBhZ2UuX3NsaWRlcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29udGFpbnMgdGhlIHNsaWRlIG1hbmFnZXIgZm9yIHRoZSBwcmltaXRpdmUgdXNlciBpbnRlcmZhY2UNCisgICAgICAgICAgICBuYXZpZ2F0aW9uIHN5c3RlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlVGVzdFBhZ2UuX2hhcm5lc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIHRoZSB1bml0IHRlc3QgaGFybmVzcyBpbnN0YW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlVGVzdFBhZ2UuX2RlbGF5ZWRJbml0aWFsaXphdGlvblRpbWVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCYWNraW5nIGZpZWxkIGZvciB0aGUgc3RhcnR1cCB0aW1lci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlVGVzdFBhZ2UuX21vZGVsIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCYWNraW5nIGZpZWxkIGZvciB0aGUgbW9kZWwgbWFuYWdlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlVGVzdFBhZ2UuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBNb2JpbGVUZXN0UGFnZSBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlVGVzdFBhZ2UuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyB0aGUgTW9iaWxlVGVzdFBhZ2Ugb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaGFybmVzcyI+VGhlIHRlc3QgaGFybmVzcyBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk1vYmlsZVRlc3RQYWdlLk9uRGVsYXllZEluaXRpYWxpemF0aW9uVGljayhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXYWl0cyBmb3IgdGhlIFNldHRpbmdzIHRvIGJlY29tZSBhdmFpbGFibGUsIGVpdGhlciBieSB0aGUgc2VydmljZSBvcg0KKyAgICAgICAgICAgIHN5c3RlbSBzZXR0aW5nIHRoZSBpbnN0YW5jZSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNvdXJjZSB0aW1lci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlVGVzdFBhZ2UuQ3JlYXRlQW5kSW5zZXJ0U2xpZGUoU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyBhIG5ldyBzbGlkZSBhbmQgaW5zZXJ0cyBpdCBpbnRvIHRoZSBzbGlkZSBtYW5hZ2VyLCBwbHVzDQorICAgICAgICAgICAgdmlzdWFsIHRyZWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJoZWFkZXIiPlRoZSB0ZXh0IGhlYWRlciB0byB1c2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29udGVudCI+VGhlIGNvbnRlbnQgdG8gaW5zaWRlIHRoZSBzbGlkZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgdGhlIG5ldyBTbGlkZSBpbnN0YW5jZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlVGVzdFBhZ2UuT25UYWdFeHByZXNzaW9uU2VsZWN0ZWQoU3lzdGVtLk9iamVjdCxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGFnRXhwcmVzc2lvbkV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZXMgdGhlIGNvbXBsZXRpb24gZXZlbnQgb24gdGhlIHRhZyBleHByZXNzaW9uIGVkaXRvciB0byBiZWdpbg0KKyAgICAgICAgICAgIHRoZSB0ZXN0IHJ1biB1c2luZyB0aGUgdXNlci1wcm92aWRlZCBzZXR0aW5ncy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk1vYmlsZVRlc3RQYWdlLlN0YXJ0VGVzdFJ1biI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3RhcnRzIHRoZSB0ZXN0IHJ1bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlVGVzdFBhZ2UuT25UZXN0SGFybmVzc0NvbXBsZXRlZChTeXN0ZW0uT2JqZWN0LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEhhcm5lc3NDb21wbGV0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIYW5kbGVzIHRoZSB0ZXN0IGhhcm5lc3MgY29tcGxldGUgZXZlbnQsIHRvIGRpc3BsYXkgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGRhdGEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Nb2JpbGVUZXN0UGFnZS5Pbk1vdmVCYWNrVG9UZXN0QXNzZW1ibGllc0NsaWNrKFN5c3RlbS5PYmplY3QsU3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlcyB0aGUgbW92ZW1lbnQgYmFjayB0byB0aGUgdGVzdCBhc3NlbWJsaWVzIGxpc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBzb3VyY2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBldmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Nb2JpbGVUZXN0UGFnZS5Pbk1vdmVCYWNrVG9UZXN0Q2xhc3Nlc0NsaWNrKFN5c3RlbS5PYmplY3QsU3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlcyB0aGUgbW92ZW1lbnQgYmFjayB0byB0aGUgdGVzdCBjbGFzc2VzIGxpc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBzb3VyY2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBldmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Nb2JpbGVUZXN0UGFnZS5Pbk1vdmVCYWNrVG9UZXN0TWV0aG9kc0NsaWNrKFN5c3RlbS5PYmplY3QsU3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlcyB0aGUgbW92ZW1lbnQgYmFjayB0byB0aGUgdGVzdCBtZXRob2RzIGxpc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBzb3VyY2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBldmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Nb2JpbGVUZXN0UGFnZS5PblRlc3RBc3NlbWJseVNlbGVjdGlvbkNoYW5nZWQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5Db250cm9scy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlcyB0aGUgc2VsZWN0aW9uIG9mIGEgdGVzdCBhc3NlbWJseS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk1vYmlsZVRlc3RQYWdlLk9uVGVzdENsYXNzU2VsZWN0aW9uQ2hhbmdlZChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLlNlbGVjdGlvbkNoYW5nZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIYW5kbGVzIHRoZSBzZWxlY3Rpb24gb2YgYSB0ZXN0IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgc291cmNlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlVGVzdFBhZ2UuT25UZXN0TWV0aG9kc1NlbGVjdGlvbkNoYW5nZWQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5Db250cm9scy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlcyB0aGUgc2VsZWN0aW9uIG9mIGEgdGVzdCBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBzb3VyY2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBldmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Nb2JpbGVUZXN0UGFnZS5OYXZpZ2F0ZUJhY2siPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcXVlc3RzIG5hdmlnYXRpb24gYmFjayBhIHBhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk1vYmlsZVRlc3RQYWdlLkluaXRpYWxpemVDb21wb25lbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVDb21wb25lbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTW9iaWxlVGVzdFBhZ2UuVGVzdFBhbmVsIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB0ZXN0IHN1cmZhY2UsIGEgZHluYW1pYyBQYW5lbCB0aGF0IHJlbW92ZXMgaXRzIGNoaWxkcmVuIA0KKyAgICAgICAgICAgIGVsZW1lbnRzIGFmdGVyIGVhY2ggdGVzdCBjb21wbGV0ZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk1vYmlsZVRlc3RQYWdlLlVuaXRUZXN0SGFybmVzcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdW5pdCB0ZXN0IGhhcm5lc3MgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlJlc3VsdHNUcmVlVmlldyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBkZXJpdmVkIFRyZWVWaWV3IGNvbnRyb2wgc3BlY2lmaWMgdG8gdGhlIGFwcGxpY2F0aW9uIG5lZWRzIGZvcg0KKyAgICAgICAgICAgIHNob3dpbmcgcmVzdWx0cyBpbiByZWFsLXRpbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcHJlc2VudHMgYSBjb250cm9sIHRoYXQgZGlzcGxheXMgaGllcmFyY2hpY2FsIGRhdGEgaW4gYSB0cmVlIHN0cnVjdHVyZQ0KKyAgICAgICAgICAgIHRoYXQgaGFzIGl0ZW1zIHRoYXQgY2FuIGV4cGFuZCBhbmQgY29sbGFwc2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5TdGFibGU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSVVwZGF0ZVZpc3VhbFN0YXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgSVVwZGF0ZVZpc3VhbFN0YXRlIGludGVyZmFjZSBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlDQorICAgICAgICAgICAgSW50ZXJhY3Rpb25IZWxwZXIgd2l0aCBhY2Nlc3MgdG8gdGhlIHR5cGUncyBVcGRhdGVWaXN1YWxTdGF0ZSBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSVVwZGF0ZVZpc3VhbFN0YXRlLlVwZGF0ZVZpc3VhbFN0YXRlKFN5c3RlbS5Cb29sZWFuKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVXBkYXRlIHRoZSB2aXN1YWwgc3RhdGUgb2YgdGhlIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ1c2VUcmFuc2l0aW9ucyI+DQorICAgICAgICAgICAgQSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0cmFuc2l0aW9ucyB0bw0KKyAgICAgICAgICAgIHRoZSBuZXcgc3RhdGUsIG9yIGluc3RhbnRseSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgc3RhdGUuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Ll9hbGxvd1dyaXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBhIHJlYWQtb25seSBkZXBlbmRlbmN5IHByb3BlcnR5IGNoYW5nZQ0KKyAgICAgICAgICAgIGhhbmRsZXIgc2hvdWxkIGFsbG93IHRoZSB2YWx1ZSB0byBiZSBzZXQuICBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlDQorICAgICAgICAgICAgdGhhdCByZWFkLW9ubHkgcHJvcGVydGllcyBjYW5ub3QgYmUgY2hhbmdlZCB2aWEgU2V0VmFsdWUsIGV0Yy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5faWdub3JlUHJvcGVydHlDaGFuZ2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBwcm9wZXJ0eSBjaGFuZ2UgaGFuZGxlcg0KKyAgICAgICAgICAgIHNob3VsZCBpZ25vcmUgdGhlIG5leHQgY2hhbmdlIG5vdGlmaWNhdGlvbi4gIFRoaXMgaXMgdXNlZCB0byByZXNldA0KKyAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiBwcm9wZXJ0aWVzIHdpdGhvdXQgcGVyZm9ybWluZyBhbnkgb2YgdGhlIGFjdGlvbnMgaW4NCisgICAgICAgICAgICB0aGVpciBjaGFuZ2UgaGFuZGxlcnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuU2VsZWN0ZWRJdGVtUHJvcGVydHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIElkZW50aWZpZXMgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LlNlbGVjdGVkSXRlbSIgLz4NCisgICAgICAgICAgICBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5TZWxlY3RlZEl0ZW0iIC8+DQorICAgICAgICAgICAgcHJvcGVydHkuDQorICAgICAgICAgICAgPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Lk9uU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VkKFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QsU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeVByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNlbGVjdGVkSXRlbVByb3BlcnR5IHByb3BlcnR5IGNoYW5nZWQgaGFuZGxlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImQiPlRyZWVWaWV3IHRoYXQgY2hhbmdlZCBpdHMgU2VsZWN0ZWRJdGVtLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuU2VsZWN0ZWRWYWx1ZVByb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJZGVudGlmaWVzIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5TZWxlY3RlZFZhbHVlIiAvPg0KKyAgICAgICAgICAgIGRlcGVuZGVuY3kgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT4NCisgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBmb3IgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LlNlbGVjdGVkVmFsdWUiIC8+DQorICAgICAgICAgICAgZGVwZW5kZW5jeSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuT25TZWxlY3RlZFZhbHVlUHJvcGVydHlDaGFuZ2VkKFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QsU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeVByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNlbGVjdGVkVmFsdWVQcm9wZXJ0eSBwcm9wZXJ0eSBjaGFuZ2VkIGhhbmRsZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkIj5UcmVlVmlldyB0aGF0IGNoYW5nZWQgaXRzIFNlbGVjdGVkVmFsdWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5TZWxlY3RlZFZhbHVlUGF0aFByb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJZGVudGlmaWVzIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5TZWxlY3RlZFZhbHVlUGF0aCIgLz4NCisgICAgICAgICAgICBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5TZWxlY3RlZFZhbHVlUGF0aCIgLz4NCisgICAgICAgICAgICBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5PblNlbGVjdGVkVmFsdWVQYXRoUHJvcGVydHlDaGFuZ2VkKFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QsU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeVByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNlbGVjdGVkVmFsdWVQYXRoUHJvcGVydHkgcHJvcGVydHkgY2hhbmdlZCBoYW5kbGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZCI+VHJlZVZpZXcgdGhhdCBjaGFuZ2VkIGl0cyBTZWxlY3RlZFZhbHVlUGF0aC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Lkl0ZW1Db250YWluZXJTdHlsZVByb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJZGVudGlmaWVzIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5JdGVtQ29udGFpbmVyU3R5bGUiIC8+DQorICAgICAgICAgICAgZGVwZW5kZW5jeSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPg0KKyAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIGZvciB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuSXRlbUNvbnRhaW5lclN0eWxlIiAvPg0KKyAgICAgICAgICAgIGRlcGVuZGVuY3kgcHJvcGVydHkuDQorICAgICAgICAgICAgPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Lk9uSXRlbUNvbnRhaW5lclN0eWxlUHJvcGVydHlDaGFuZ2VkKFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QsU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeVByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEl0ZW1Db250YWluZXJTdHlsZVByb3BlcnR5IHByb3BlcnR5IGNoYW5nZWQgaGFuZGxlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImQiPg0KKyAgICAgICAgICAgIFRyZWVWaWV3IHRoYXQgY2hhbmdlZCBpdHMgSXRlbUNvbnRhaW5lclN0eWxlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldyIgLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuT25DcmVhdGVBdXRvbWF0aW9uUGVlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuVHJlZVZpZXdBdXRvbWF0aW9uUGVlciIgLz4NCisgICAgICAgICAgICBmb3IgdXNlIGJ5IHRoZSBTaWx2ZXJsaWdodCBhdXRvbWF0aW9uIGluZnJhc3RydWN0dXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuVHJlZVZpZXdBdXRvbWF0aW9uUGVlciIgLz4NCisgICAgICAgICAgICBmb3IgdGhlIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldyIgLz4gY29udHJvbC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5PbkFwcGx5VGVtcGxhdGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJ1aWxkcyB0aGUgdmlzdWFsIHRyZWUgZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldyIgLz4gY29udHJvbCB3aGVuIGEgbmV3DQorICAgICAgICAgICAgY29udHJvbCB0ZW1wbGF0ZSBpcyBhcHBsaWVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Lk1pY3Jvc29mdCNTaWx2ZXJsaWdodCNUZXN0aW5nI0NvbnRyb2xzI0lVcGRhdGVWaXN1YWxTdGF0ZSNVcGRhdGVWaXN1YWxTdGF0ZShTeXN0ZW0uQm9vbGVhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVwZGF0ZSB0aGUgdmlzdWFsIHN0YXRlIG9mIHRoZSBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InVzZVRyYW5zaXRpb25zIj4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0byB1c2UgdHJhbnNpdGlvbnMgd2hlbiB1cGRhdGluZyB0aGUNCisgICAgICAgICAgICB2aXN1YWwgc3RhdGUuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LkdldENvbnRhaW5lckZvckl0ZW1PdmVycmlkZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyBhIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+IHRvDQorICAgICAgICAgICAgZGlzcGxheSBjb250ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+IHRvIHVzZSBhcyBhDQorICAgICAgICAgICAgY29udGFpbmVyIGZvciBjb250ZW50Lg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LklzSXRlbUl0c093bkNvbnRhaW5lck92ZXJyaWRlKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVtIGlzIGENCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtIiAvPiwgd2hpY2ggaXMgdGhlDQorICAgICAgICAgICAgZGVmYXVsdCBjb250YWluZXIgZm9yIGl0ZW1zIGluIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldyIgLz4gY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Iml0ZW0iPlRoZSBvYmplY3QgdG8gZXZhbHVhdGUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUcnVlIGlmIHRoZSBpdGVtIGlzIGENCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtIiAvPjsgb3RoZXJ3aXNlLA0KKyAgICAgICAgICAgIGZhbHNlLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LlByZXBhcmVDb250YWluZXJGb3JJdGVtT3ZlcnJpZGUoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJlcGFyZXMgdGhlIGNvbnRhaW5lciBlbGVtZW50IHRvIGRpc3BsYXkgdGhlIHNwZWNpZmllZCBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+DQorICAgICAgICAgICAgVGhlIGNvbnRhaW5lciBlbGVtZW50IHVzZWQgdG8gZGlzcGxheSB0aGUgc3BlY2lmaWVkIGl0ZW0uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIGl0ZW0gdG8gZGlzcGxheS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuQ2xlYXJDb250YWluZXJGb3JJdGVtT3ZlcnJpZGUoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVtb3ZlcyBhbGwgdGVtcGxhdGVzLCBzdHlsZXMsIGFuZCBiaW5kaW5ncyBmb3IgdGhlIG9iamVjdCBkaXNwbGF5ZWQNCisgICAgICAgICAgICBhcyBhIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+DQorICAgICAgICAgICAgVGhlIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+IGVsZW1lbnQgdG8NCisgICAgICAgICAgICBjbGVhci4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj4NCisgICAgICAgICAgICBUaGUgaXRlbSB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtIiAvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuT25JdGVtc0NoYW5nZWQoU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLk5vdGlmeUNvbGxlY3Rpb25DaGFuZ2VkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTWFrZXMgYWRqdXN0bWVudHMgdG8gdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3IiAvPiBjb250cm9sIHdoZW4gdGhlDQorICAgICAgICAgICAgdmFsdWUgb2YgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkl0ZW1zQ29udHJvbC5JdGVtcyIgLz4gcHJvcGVydHkNCisgICAgICAgICAgICBjaGFuZ2VzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+DQorICAgICAgICAgICAgQQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpTeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQuTm90aWZ5Q29sbGVjdGlvbkNoYW5nZWRFdmVudEFyZ3MiIC8+DQorICAgICAgICAgICAgdGhhdCBjb250YWlucyBkYXRhIGFib3V0IHRoZSBjaGFuZ2UuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LkNoZWNrRm9yU2VsZWN0ZWREZXNjZW5kZW50cyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZWxlY3QgYW55IGRlc2NlbmRlbnRzIHdoZW4gYWRkaW5nIG5ldyBUcmVlVmlld0l0ZW1zIHRvIGEgVHJlZVZpZXcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgYWRkZWQgaXRlbS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuUHJvcGFnYXRlS2V5RG93bihTeXN0ZW0uV2luZG93cy5JbnB1dC5LZXlFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm9wYWdhdGUgT25LZXlEb3duIG1lc3NhZ2VzIGZyb20gdGhlIHJvb3QgVHJlZVZpZXdJdGVtcyB0byB0aGVpcg0KKyAgICAgICAgICAgIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJlbWFya3M+DQorICAgICAgICAgICAgQmVjYXVzZSBTaWx2ZXJsaWdodCdzIFNjcm9sbFZpZXdlciBzd2FsbG93cyBtYW55IHVzZWZ1bCBrZXkgZXZlbnRzDQorICAgICAgICAgICAgKHdoaWNoIGl0IGNhbiBpZ25vcmUgb24gV1BGIGlmIHlvdSBvdmVycmlkZSBIYW5kbGVzU2Nyb2xsaW5nIG9yIHVzZQ0KKyAgICAgICAgICAgIGFuIGludGVybmFsIG9ubHkgdmFyaWFibGUgaW4gU2lsdmVybGlnaHQpLCB0aGUgcm9vdCBUcmVlVmlld0l0ZW1zDQorICAgICAgICAgICAgZXhwbGljaXRseSBwcm9wYWdhdGUgS2V5RG93biBldmVudHMgdG8gdGhlaXIgcGFyZW50IFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Lk9uS2V5RG93bihTeXN0ZW0uV2luZG93cy5JbnB1dC5LZXlFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBoYW5kbGluZyBmb3IgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJFOlN5c3RlbS5XaW5kb3dzLlVJRWxlbWVudC5LZXlEb3duIiAvPiBldmVudCB3aGVuIGEga2V5DQorICAgICAgICAgICAgaXMgcHJlc3NlZCB3aGlsZSB0aGUgY29udHJvbCBoYXMgZm9jdXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj4NCisgICAgICAgICAgICBBIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5JbnB1dC5LZXlFdmVudEFyZ3MiIC8+IHRoYXQgY29udGFpbnMNCisgICAgICAgICAgICB0aGUgZXZlbnQgZGF0YS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iZSAiIC8+aXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LkhhbmRsZVNjcm9sbEtleXMoU3lzdGVtLldpbmRvd3MuSW5wdXQuS2V5KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlIGtleXMgcmVsYXRlZCB0byBzY3JvbGxpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJrZXkiPlRoZSBrZXkgdG8gaGFuZGxlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+QSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGtleSB3YXMgaGFuZGxlZC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5IYW5kbGVTY3JvbGxCeVBhZ2UoU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIYW5kbGUgc2Nyb2xsaW5nIGEgcGFnZSB1cCBvciBkb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idXAiPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYWdlIHNob3VsZCBiZSBzY3JvbGxlZCB1cC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzY3JvbGwgd2FzIGhhbmRsZWQuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuT25LZXlVcChTeXN0ZW0uV2luZG93cy5JbnB1dC5LZXlFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBoYW5kbGluZyBmb3IgdGhlIEtleVVwIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5Pbk1vdXNlRW50ZXIoU3lzdGVtLldpbmRvd3MuSW5wdXQuTW91c2VFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBoYW5kbGluZyBmb3IgdGhlIE1vdXNlRW50ZXIgZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Lk9uTW91c2VMZWF2ZShTeXN0ZW0uV2luZG93cy5JbnB1dC5Nb3VzZUV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb3ZpZGVzIGhhbmRsaW5nIGZvciB0aGUgTW91c2VMZWF2ZSBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuT25Nb3VzZU1vdmUoU3lzdGVtLldpbmRvd3MuSW5wdXQuTW91c2VFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBoYW5kbGluZyBmb3IgdGhlIE1vdXNlTW92ZSBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuT25Nb3VzZUxlZnRCdXR0b25Eb3duKFN5c3RlbS5XaW5kb3dzLklucHV0Lk1vdXNlQnV0dG9uRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvdmlkZXMgaGFuZGxpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iRTpTeXN0ZW0uV2luZG93cy5VSUVsZW1lbnQuTW91c2VMZWZ0QnV0dG9uRG93biIgLz4NCisgICAgICAgICAgICBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPg0KKyAgICAgICAgICAgIEEgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLklucHV0Lk1vdXNlQnV0dG9uRXZlbnRBcmdzIiAvPiB0aGF0DQorICAgICAgICAgICAgY29udGFpbnMgdGhlIGV2ZW50IGRhdGEuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Lk9uTW91c2VMZWZ0QnV0dG9uVXAoU3lzdGVtLldpbmRvd3MuSW5wdXQuTW91c2VCdXR0b25FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBoYW5kbGluZyBmb3IgdGhlIE1vdXNlTGVmdEJ1dHRvblVwIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5IYW5kbGVNb3VzZUJ1dHRvbkRvd24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb3ZpZGVzIGhhbmRsaW5nIGZvciBtb3VzZSBidXR0b24gZXZlbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5BIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXZlbnQgd2FzIGhhbmRsZWQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuT25Hb3RGb2N1cyhTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBoYW5kbGluZyBmb3IgdGhlIEdvdEZvY3VzIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5Pbkxvc3RGb2N1cyhTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBoYW5kbGluZyBmb3IgdGhlIExvc3RGb2N1cyBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuT25TZWxlY3RlZEl0ZW1DaGFuZ2VkKFN5c3RlbS5XaW5kb3dzLlJvdXRlZFByb3BlcnR5Q2hhbmdlZEV2ZW50QXJnc3tTeXN0ZW0uT2JqZWN0fSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJhaXNlcyB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IkU6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuU2VsZWN0ZWRJdGVtQ2hhbmdlZCIgLz4NCisgICAgICAgICAgICBldmVudCB3aGVuIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5TZWxlY3RlZEl0ZW0iIC8+DQorICAgICAgICAgICAgcHJvcGVydHkgdmFsdWUgY2hhbmdlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPg0KKyAgICAgICAgICAgIEEgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLlJvdXRlZFByb3BlcnR5Q2hhbmdlZEV2ZW50QXJnc2AxIiAvPg0KKyAgICAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGV2ZW50IGRhdGEuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LkNoYW5nZVNlbGVjdGlvbihTeXN0ZW0uT2JqZWN0LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSxTeXN0ZW0uQm9vbGVhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENoYW5nZSB3aGV0aGVyIGEgVHJlZVZpZXdJdGVtIGlzIHNlbGVjdGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbU9yQ29udGFpbmVyIj4NCisgICAgICAgICAgICBJdGVtIHdob3NlIHNlbGVjdGlvbiBpcyBjaGFuZ2luZy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb250YWluZXIiPg0KKyAgICAgICAgICAgIENvbnRhaW5lciBvZiB0aGUgaXRlbSB3aG9zZSBzZWxlY3Rpb24gaXMgY2hhbmdpbmcuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VsZWN0ZWQiPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBUcmVlVmlld0l0ZW0gaXMgc2VsZWN0ZWQuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LlVwZGF0ZVNlbGVjdGVkVmFsdWUoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVwZGF0ZSB0aGUgc2VsZWN0ZWQgdmFsdWUgb2YgdGhlIG9mIHRoZSBUcmVlVmlldyBiYXNlZCBvbiB0aGUgdmFsdWUNCisgICAgICAgICAgICBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIFRyZWVWaWV3SXRlbSBhbmQgdGhlIFNlbGVjdGVkVmFsdWVQYXRoLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+DQorICAgICAgICAgICAgVmFsdWUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LlNlbGVjdEZpcnN0SXRlbSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2VsZWN0IHRoZSBmaXJzdCBpdGVtIG9mIHRoZSBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5Gb2N1c0ZpcnN0SXRlbSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRm9jdXMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5BIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgaXRlbSB3YXMgZm9jdXNlZC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5Gb2N1c0xhc3RJdGVtIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGb2N1cyB0aGUgbGFzdCBpdGVtIGluIHRoZSBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+QSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGl0ZW0gd2FzIGZvY3VzZWQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuU2VsZWN0ZWRJdGVtIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBzZWxlY3RlZCBpdGVtIGluIGENCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXciIC8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIG9yIG51bGwgaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4gVGhlDQorICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5TZWxlY3RlZFZhbHVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuU2VsZWN0ZWRJdGVtIiAvPg0KKyAgICAgICAgICAgIHByb3BlcnR5IHRoYXQgaXMgc3BlY2lmaWVkIGJ5IHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5TZWxlY3RlZFZhbHVlUGF0aCIgLz4NCisgICAgICAgICAgICBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPg0KKyAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuU2VsZWN0ZWRJdGVtIiAvPg0KKyAgICAgICAgICAgIHByb3BlcnR5IHRoYXQgaXMgc3BlY2lmaWVkIGJ5IHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5TZWxlY3RlZFZhbHVlUGF0aCIgLz4NCisgICAgICAgICAgICBwcm9wZXJ0eSwgb3IgbnVsbCBpZiBubyBpdGVtIGlzIHNlbGVjdGVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5TZWxlY3RlZFZhbHVlUGF0aCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBwcm9wZXJ0eSBwYXRoIHRoYXQgaXMgdXNlZCB0byBnZXQgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LlNlbGVjdGVkVmFsdWUiIC8+DQorICAgICAgICAgICAgcHJvcGVydHkgb2YgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LlNlbGVjdGVkSXRlbSIgLz4NCisgICAgICAgICAgICBwcm9wZXJ0eSBpbiBhIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldyIgLz4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT4NCisgICAgICAgICAgICBUaGUgcHJvcGVydHkgcGF0aCB0aGF0IGlzIHVzZWQgdG8gZ2V0IHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5TZWxlY3RlZFZhbHVlIiAvPg0KKyAgICAgICAgICAgIHByb3BlcnR5IG9mIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5TZWxlY3RlZEl0ZW0iIC8+DQorICAgICAgICAgICAgcHJvcGVydHkgaW4gYSA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXciIC8+LiBUaGUNCisgICAgICAgICAgICBkZWZhdWx0IHZhbHVlIGlzIDxzZWUgY3JlZj0iRjpTeXN0ZW0uU3RyaW5nLkVtcHR5IiAvPi4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuSXRlbUNvbnRhaW5lclN0eWxlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5TdHlsZSIgLz4gdGhhdCBpcw0KKyAgICAgICAgICAgIGFwcGxpZWQgdG8gdGhlIGNvbnRhaW5lciBlbGVtZW50IGdlbmVyYXRlZCBmb3IgZWFjaCBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVGhlIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5TdHlsZSIgLz4gYXBwbGllZCB0byB0aGUgY29udGFpbmVyDQorICAgICAgICAgICAgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGVhY2ggaXRlbS4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuU2VsZWN0ZWRDb250YWluZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBUcmVlVmlld0l0ZW0gY29udGFpbmVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LklzU2VsZWN0ZWRDb250YWluZXJIb29rZWRVcCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIFRyZWVWaWV3SXRlbQ0KKyAgICAgICAgICAgIGNvbnRhaW5lciBpcyBwcm9wZXJseSBob29rZWQgdXAgdG8gdGhlIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LklzU2VsZWN0aW9uQ2hhbmdlQWN0aXZlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNlbGVjdGVkIGl0ZW0gaXMNCisgICAgICAgICAgICBjdXJyZW50bHkgYmVpbmcgY2hhbmdlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5JdGVtc0NvbnRyb2xIZWxwZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIEl0ZW1zQ29udHJvbEhlbHBlciB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuSW50ZXJhY3Rpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGhlbHBlciB0aGF0IHByb3ZpZGVzIGFsbCBvZiB0aGUgc3RhbmRhcmQNCisgICAgICAgICAgICBpbnRlcmFjdGlvbiBmdW5jdGlvbmFsaXR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LklzQ29udHJvbEtleURvd24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIENvbnRyb2wga2V5IGlzIGN1cnJlbnRseQ0KKyAgICAgICAgICAgIHByZXNzZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcuSXNTaGlmdEtleURvd24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFNoaWZ0IGtleSBpcyBjdXJyZW50bHkgcHJlc3NlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldy5TZWxlY3RlZEl0ZW1DaGFuZ2VkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBPY2N1cnMgd2hlbiB0aGUgdmFsdWUgb2YgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LlNlbGVjdGVkSXRlbSIgLz4NCisgICAgICAgICAgICBwcm9wZXJ0eSBjaGFuZ2VzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5SZXN1bHRzVHJlZVZpZXcuR2V0Q29udGFpbmVyRm9ySXRlbU92ZXJyaWRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBPdmVycmlkZXMgdGhlIGl0ZW0gdG8gYWxsb3cgZm9yIHNpbXBsZSBiaW5kaW5nIHRvIHRoZSBleHBhbmRlZA0KKyAgICAgICAgICAgIHByb3BlcnR5IG9uIHRoZSBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgbmV3IGNvbnRhaW5lciBmb3IgYW4gaXRlbS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuUmVzdWx0c1RyZWVWaWV3LkdldFNoYXJlZENvbnRhaW5lciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgY29udGFpbmVyIHdpdGggYW4gZXhwYW5kZWQgYmluZGluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgY29udGFpbmVyIHdpdGggYW4gZXhwYW5kZWQgYmluZGluZy48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuUmVzdWx0c1RyZWVWaWV3SXRlbSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBkZXJpdmVkIFRyZWVWaWV3SXRlbSBmb3IgSXNFeHBhbmRlZCBiaW5kaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvdmlkZXMgYSBzZWxlY3RhYmxlIGl0ZW0gZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldyIgLz4gY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPFF1YWxpdHlCYW5kPlN0YWJsZTwvUXVhbGl0eUJhbmQ+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVwcmVzZW50cyBhIGNvbnRyb2wgdGhhdCBjb250YWlucyBhIGNvbGxlY3Rpb24gb2YgaXRlbXMgYW5kIGEgaGVhZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8UXVhbGl0eUJhbmQ+U3RhYmxlPC9RdWFsaXR5QmFuZD4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhlYWRlcmVkSXRlbXNDb250cm9sLkhlYWRlclByb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJZGVudGlmaWVzIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbC5IZWFkZXIiIC8+DQorICAgICAgICAgICAgZGVwZW5kZW5jeSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPg0KKyAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIGZvciB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSGVhZGVyZWRJdGVtc0NvbnRyb2wuSGVhZGVyIiAvPg0KKyAgICAgICAgICAgIGRlcGVuZGVuY3kgcHJvcGVydHkuDQorICAgICAgICAgICAgPC92YWx1ZT4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBOb3RlOiBXUEYgZGVmaW5lcyB0aGlzIHByb3BlcnR5IHZpYSBhIGNhbGwgdG8gQWRkT3duZXIgb2YNCisgICAgICAgICAgICBIZWFkZXJlZENvbnRlbnRDb250cm9sJ3MgSGVhZGVyUHJvcGVydHkuDQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSGVhZGVyZWRJdGVtc0NvbnRyb2wuT25IZWFkZXJQcm9wZXJ0eUNoYW5nZWQoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCxTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5UHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGVhZGVyUHJvcGVydHkgcHJvcGVydHkgY2hhbmdlZCBoYW5kbGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZCI+DQorICAgICAgICAgICAgSGVhZGVyZWRJdGVtc0NvbnRyb2wgdGhhdCBjaGFuZ2VkIGl0cyBIZWFkZXIuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbC5IZWFkZXJUZW1wbGF0ZVByb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJZGVudGlmaWVzIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbC5IZWFkZXJUZW1wbGF0ZSIgLz4NCisgICAgICAgICAgICBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbC5IZWFkZXJUZW1wbGF0ZSIgLz4NCisgICAgICAgICAgICBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICAgICAgPHJlbWFya3M+DQorICAgICAgICAgICAgTm90ZTogV1BGIGRlZmluZXMgdGhpcyBwcm9wZXJ0eSB2aWEgYSBjYWxsIHRvIEFkZE93bmVyIG9mDQorICAgICAgICAgICAgSGVhZGVyZWRDb250ZW50Q29udHJvbCdzIEhlYWRlclRlbXBsYXRlUHJvcGVydHkuDQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSGVhZGVyZWRJdGVtc0NvbnRyb2wuT25IZWFkZXJUZW1wbGF0ZVByb3BlcnR5Q2hhbmdlZChTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5T2JqZWN0LFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIZWFkZXJUZW1wbGF0ZVByb3BlcnR5IHByb3BlcnR5IGNoYW5nZWQgaGFuZGxlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImQiPg0KKyAgICAgICAgICAgIEhlYWRlcmVkSXRlbXNDb250cm9sIHRoYXQgY2hhbmdlZCBpdHMgSGVhZGVyVGVtcGxhdGUuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbC5JdGVtQ29udGFpbmVyU3R5bGVQcm9wZXJ0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWRlbnRpZmllcyB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSGVhZGVyZWRJdGVtc0NvbnRyb2wuSXRlbUNvbnRhaW5lclN0eWxlIiAvPg0KKyAgICAgICAgICAgIGRlcGVuZGVuY3kgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT4NCisgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBmb3IgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhlYWRlcmVkSXRlbXNDb250cm9sLkl0ZW1Db250YWluZXJTdHlsZSIgLz4NCisgICAgICAgICAgICBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbC5Pbkl0ZW1Db250YWluZXJTdHlsZVByb3BlcnR5Q2hhbmdlZChTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5T2JqZWN0LFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJdGVtQ29udGFpbmVyU3R5bGVQcm9wZXJ0eSBwcm9wZXJ0eSBjaGFuZ2VkIGhhbmRsZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkIj4NCisgICAgICAgICAgICBIZWFkZXJlZEl0ZW1zQ29udHJvbCB0aGF0IGNoYW5nZWQgaXRzIEl0ZW1Db250YWluZXJTdHlsZS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhlYWRlcmVkSXRlbXNDb250cm9sLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSGVhZGVyZWRJdGVtc0NvbnRyb2wiIC8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhlYWRlcmVkSXRlbXNDb250cm9sLk9uSGVhZGVyQ2hhbmdlZChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhlYWRlcmVkSXRlbXNDb250cm9sLkhlYWRlciIgLz4NCisgICAgICAgICAgICBwcm9wZXJ0eSBjaGFuZ2VzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ib2xkSGVhZGVyIj4NCisgICAgICAgICAgICBUaGUgb2xkIHZhbHVlIG9mIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbC5IZWFkZXIiIC8+DQorICAgICAgICAgICAgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibmV3SGVhZGVyIj4NCisgICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbC5IZWFkZXIiIC8+DQorICAgICAgICAgICAgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhlYWRlcmVkSXRlbXNDb250cm9sLk9uSGVhZGVyVGVtcGxhdGVDaGFuZ2VkKFN5c3RlbS5XaW5kb3dzLkRhdGFUZW1wbGF0ZSxTeXN0ZW0uV2luZG93cy5EYXRhVGVtcGxhdGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhlYWRlcmVkSXRlbXNDb250cm9sLkhlYWRlclRlbXBsYXRlIiAvPg0KKyAgICAgICAgICAgIHByb3BlcnR5IGNoYW5nZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJvbGRIZWFkZXJUZW1wbGF0ZSI+DQorICAgICAgICAgICAgVGhlIG9sZCB2YWx1ZSBvZiB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSGVhZGVyZWRJdGVtc0NvbnRyb2wuSGVhZGVyVGVtcGxhdGUiIC8+DQorICAgICAgICAgICAgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibmV3SGVhZGVyVGVtcGxhdGUiPg0KKyAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhlYWRlcmVkSXRlbXNDb250cm9sLkhlYWRlclRlbXBsYXRlIiAvPg0KKyAgICAgICAgICAgIHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbC5PbkFwcGx5VGVtcGxhdGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJ1aWxkcyB0aGUgdmlzdWFsIHRyZWUgZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbCIgLz4gd2hlbiBhDQorICAgICAgICAgICAgbmV3IHRlbXBsYXRlIGlzIGFwcGxpZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSGVhZGVyZWRJdGVtc0NvbnRyb2wuUHJlcGFyZUNvbnRhaW5lckZvckl0ZW1PdmVycmlkZShTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5T2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcmVwYXJlcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gZGlzcGxheSB0aGUgc3BlY2lmaWVkIGl0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij4NCisgICAgICAgICAgICBUaGUgY29udGFpbmVyIGVsZW1lbnQgdXNlZCB0byBkaXNwbGF5IHRoZSBzcGVjaWZpZWQgaXRlbS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgY29udGVudCB0byBkaXNwbGF5LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbC5QcmVwYXJlUHJlcGFyZUhlYWRlcmVkSXRlbXNDb250cm9sQ29udGFpbmVyRm9ySXRlbU92ZXJyaWRlKFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QsU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5Db250cm9scy5JdGVtc0NvbnRyb2wsU3lzdGVtLldpbmRvd3MuU3R5bGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcmVwYXJlcyB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciB0byBkaXNwbGF5IHRoZSBzcGVjaWZpZWQgaXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnQiPg0KKyAgICAgICAgICAgIENvbnRhaW5lciBlbGVtZW50IHVzZWQgdG8gZGlzcGxheSB0aGUgc3BlY2lmaWVkIGl0ZW0uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+U3BlY2lmaWVkIGl0ZW0gdG8gZGlzcGxheS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJlbnQiPlRoZSBwYXJlbnQgSXRlbXNDb250cm9sLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmVudEl0ZW1Db250YWluZXJTdHlsZSI+DQorICAgICAgICAgICAgVGhlIEl0ZW1Db250YWluZXJTdHlsZSBmb3IgdGhlIHBhcmVudCBJdGVtc0NvbnRyb2wuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhlYWRlcmVkSXRlbXNDb250cm9sLlByZXBhcmVIZWFkZXJlZEl0ZW1zQ29udHJvbENvbnRhaW5lcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbCxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLkl0ZW1zQ29udHJvbCxTeXN0ZW0uV2luZG93cy5TdHlsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByZXBhcmUgYSBQcmVwYXJlSGVhZGVyZWRJdGVtc0NvbnRyb2xDb250YWluZXIgY29udGFpbmVyIGZvciBhbg0KKyAgICAgICAgICAgIGl0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb250cm9sIj5Db250YWluZXIgdG8gcHJlcGFyZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5JdGVtIHRvIGJlIHBsYWNlZCBpbiB0aGUgY29udGFpbmVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmVudEl0ZW1zQ29udHJvbCI+VGhlIHBhcmVudCBJdGVtc0NvbnRyb2wuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyZW50SXRlbUNvbnRhaW5lclN0eWxlIj4NCisgICAgICAgICAgICBUaGUgSXRlbUNvbnRhaW5lclN0eWxlIGZvciB0aGUgcGFyZW50IEl0ZW1zQ29udHJvbC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSGVhZGVyZWRJdGVtc0NvbnRyb2wuSGFzRGVmYXVsdFZhbHVlKFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLkNvbnRyb2wsU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeVByb3BlcnR5KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2hlY2sgd2hldGhlciBhIGNvbnRyb2wgaGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29udHJvbCI+VGhlIGNvbnRyb2wgdG8gY2hlY2suPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icHJvcGVydHkiPlRoZSBwcm9wZXJ0eSB0byBjaGVjay48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRydWUgaWYgdGhlIHByb3BlcnR5IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZTsgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhlYWRlcmVkSXRlbXNDb250cm9sLkhlYWRlcklzSXRlbSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBIZWFkZXIgcHJvcGVydHkgaGFzIGJlZW4NCisgICAgICAgICAgICBzZXQgdG8gdGhlIGl0ZW0gb2YgYW4gSXRlbXNDb250cm9sLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhlYWRlcmVkSXRlbXNDb250cm9sLkhlYWRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBpdGVtIHRoYXQgbGFiZWxzIHRoZSBjb250cm9sLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVGhlIGl0ZW0gdGhhdCBsYWJlbHMgdGhlIGNvbnRyb2wuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG51bGwuDQorICAgICAgICAgICAgPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhlYWRlcmVkSXRlbXNDb250cm9sLkhlYWRlclRlbXBsYXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSBkYXRhIHRlbXBsYXRlIHRoYXQgaXMgdXNlZCB0byBkaXNwbGF5IHRoZSBjb250ZW50cyBvZg0KKyAgICAgICAgICAgIHRoZSBjb250cm9sJ3MgaGVhZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIGEgZGF0YSB0ZW1wbGF0ZSB0aGF0IGlzIHVzZWQgdG8gZGlzcGxheSB0aGUgY29udGVudHMgb2YNCisgICAgICAgICAgICB0aGUgY29udHJvbCdzIGhlYWRlci4gVGhlIGRlZmF1bHQgaXMgbnVsbC4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSGVhZGVyZWRJdGVtc0NvbnRyb2wuSXRlbUNvbnRhaW5lclN0eWxlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5TdHlsZSIgLz4gdGhhdCBpcw0KKyAgICAgICAgICAgIGFwcGxpZWQgdG8gdGhlIGNvbnRhaW5lciBlbGVtZW50IGdlbmVyYXRlZCBmb3IgZWFjaCBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVGhlIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5TdHlsZSIgLz4gdGhhdCBpcyBhcHBsaWVkIHRvIHRoZQ0KKyAgICAgICAgICAgIGNvbnRhaW5lciBlbGVtZW50IGdlbmVyYXRlZCBmb3IgZWFjaCBpdGVtLiBUaGUgZGVmYXVsdCBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbC5JdGVtc0NvbnRyb2xIZWxwZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIEl0ZW1zQ29udHJvbEhlbHBlciB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLkV4cGFuZGVyQnV0dG9uTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIEV4cGFuZGVyQnV0dG9uIHRlbXBsYXRlIHBhcnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLkhlYWRlck5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBIZWFkZXIgdGVtcGxhdGUgcGFydC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uX2V4cGFuZGVyQnV0dG9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgRXhwYW5kZXJCdXR0b24gdGVtcGxhdGUgcGFydCBpcyB1c2VkIHRvIGV4cGFuZCBhbmQgY29sbGFwc2UgdGhlDQorICAgICAgICAgICAgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5faGVhZGVyRWxlbWVudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIEhlYWRlciB0ZW1wbGF0ZSBwYXJ0IGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIGJvdW5kIEhlYWRlcg0KKyAgICAgICAgICAgIGNvbnRlbnQgb2YgdGhlIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uX2V4cGFuc2lvblN0YXRlR3JvdXAiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBFeHBhbnNpb25TdGF0ZXMgdmlzdWFsIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5fYWxsb3dXcml0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgYSByZWFkLW9ubHkgZGVwZW5kZW5jeSBwcm9wZXJ0eSBjaGFuZ2UNCisgICAgICAgICAgICBoYW5kbGVyIHNob3VsZCBhbGxvdyB0aGUgdmFsdWUgdG8gYmUgc2V0LiAgVGhpcyBpcyB1c2VkIHRvIGVuc3VyZQ0KKyAgICAgICAgICAgIHRoYXQgcmVhZC1vbmx5IHByb3BlcnRpZXMgY2Fubm90IGJlIGNoYW5nZWQgdmlhIFNldFZhbHVlLCBldGMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLkhhc0l0ZW1zUHJvcGVydHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIElkZW50aWZpZXMgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5IYXNJdGVtcyIgLz4NCisgICAgICAgICAgICBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uSGFzSXRlbXMiIC8+DQorICAgICAgICAgICAgZGVwZW5kZW5jeSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLk9uSGFzSXRlbXNQcm9wZXJ0eUNoYW5nZWQoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCxTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5UHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFzSXRlbXNQcm9wZXJ0eSBwcm9wZXJ0eSBjaGFuZ2VkIGhhbmRsZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkIj5UcmVlVmlld0l0ZW0gdGhhdCBjaGFuZ2VkIGl0cyBIYXNJdGVtcy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Jc0V4cGFuZGVkUHJvcGVydHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIElkZW50aWZpZXMgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Jc0V4cGFuZGVkIiAvPg0KKyAgICAgICAgICAgIGRlcGVuZGVuY3kgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT4NCisgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBmb3IgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Jc0V4cGFuZGVkIiAvPg0KKyAgICAgICAgICAgIGRlcGVuZGVuY3kgcHJvcGVydHkuDQorICAgICAgICAgICAgPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5PbklzRXhwYW5kZWRQcm9wZXJ0eUNoYW5nZWQoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCxTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5UHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSXNFeHBhbmRlZFByb3BlcnR5IHByb3BlcnR5IGNoYW5nZWQgaGFuZGxlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImQiPlRyZWVWaWV3SXRlbSB0aGF0IGNoYW5nZWQgaXRzIElzRXhwYW5kZWQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uSXNTZWxlY3RlZFByb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJZGVudGlmaWVzIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uSXNTZWxlY3RlZCIgLz4NCisgICAgICAgICAgICBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uSXNTZWxlY3RlZCIgLz4NCisgICAgICAgICAgICBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uT25Jc1NlbGVjdGVkUHJvcGVydHlDaGFuZ2VkKFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QsU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeVByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIElzU2VsZWN0ZWRQcm9wZXJ0eSBwcm9wZXJ0eSBjaGFuZ2VkIGhhbmRsZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkIj5UcmVlVmlld0l0ZW0gdGhhdCBjaGFuZ2VkIGl0cyBJc1NlbGVjdGVkLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLklzU2VsZWN0aW9uQWN0aXZlUHJvcGVydHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIElkZW50aWZpZXMgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Jc1NlbGVjdGlvbkFjdGl2ZSIgLz4NCisgICAgICAgICAgICBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uSXNTZWxlY3Rpb25BY3RpdmUiIC8+DQorICAgICAgICAgICAgZGVwZW5kZW5jeSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLk9uSXNTZWxlY3Rpb25BY3RpdmVQcm9wZXJ0eUNoYW5nZWQoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCxTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5UHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSXNTZWxlY3Rpb25BY3RpdmVQcm9wZXJ0eSBwcm9wZXJ0eSBjaGFuZ2VkIGhhbmRsZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkIj5UcmVlVmlld0l0ZW0gdGhhdCBjaGFuZ2VkIGl0cyBJc1NlbGVjdGlvbkFjdGl2ZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5fcGFyZW50SXRlbXNDb250cm9sIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IEl0ZW1zQ29udHJvbCBvZiBhIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5PbkNyZWF0ZUF1dG9tYXRpb25QZWVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGENCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuQXV0b21hdGlvbi5QZWVycy5UcmVlVmlld0l0ZW1BdXRvbWF0aW9uUGVlciIgLz4NCisgICAgICAgICAgICBmb3IgdXNlIGJ5IHRoZSBTaWx2ZXJsaWdodCBhdXRvbWF0aW9uIGluZnJhc3RydWN0dXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuVHJlZVZpZXdJdGVtQXV0b21hdGlvblBlZXIiIC8+DQorICAgICAgICAgICAgb2JqZWN0IGZvciB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtIiAvPi4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uT25BcHBseVRlbXBsYXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCdWlsZHMgdGhlIHZpc3VhbCB0cmVlIGZvciB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtIiAvPiBjb250cm9sIHdoZW4gYQ0KKyAgICAgICAgICAgIG5ldyBjb250cm9sIHRlbXBsYXRlIGlzIGFwcGxpZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLk9uRXhwYW5zaW9uU3RhdGVHcm91cFN0YXRlQ2hhbmdlZChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5XaW5kb3dzLlZpc3VhbFN0YXRlQ2hhbmdlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb3ZpZGVzIGhhbmRsaW5nIGZvciB0aGUgRXhwYW5zaW9uU3RhdGVzIEN1cnJlbnRDaGFuZ2VkIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgRXhwYW5zaW9uU3RhdGUgVmlzdWFsU3RhdGVHcm91cC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5CcmluZ0ludG9WaWV3Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTY3JvbGwgdGhlIFRyZWVWaWV3SXRlbSBpbnRvIHZpZXcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLk1pY3Jvc29mdCNTaWx2ZXJsaWdodCNUZXN0aW5nI0NvbnRyb2xzI0lVcGRhdGVWaXN1YWxTdGF0ZSNVcGRhdGVWaXN1YWxTdGF0ZShTeXN0ZW0uQm9vbGVhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVwZGF0ZSB0aGUgdmlzdWFsIHN0YXRlIG9mIHRoZSBjb250cm9sLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idXNlVHJhbnNpdGlvbnMiPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgdHJhbnNpdGlvbnMgdG8NCisgICAgICAgICAgICB0aGUgbmV3IHN0YXRlLCBvciBpbnN0YW50bHkgdHJhbnNpdGlvbiB0byB0aGUgbmV3IHN0YXRlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uVXBkYXRlVmlzdWFsU3RhdGUoU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBVcGRhdGUgdGhlIHZpc3VhbCBzdGF0ZSBvZiB0aGUgY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InVzZVRyYW5zaXRpb25zIj4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHRyYW5zaXRpb25zIHRvDQorICAgICAgICAgICAgdGhlIG5ldyBzdGF0ZSwgb3IgaW5zdGFudGx5IHRyYW5zaXRpb24gdG8gdGhlIG5ldyBzdGF0ZS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLkdldENvbnRhaW5lckZvckl0ZW1PdmVycmlkZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyBhIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+IHRvDQorICAgICAgICAgICAgZGlzcGxheSBjb250ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+IHRvIHVzZSBhcyBhDQorICAgICAgICAgICAgY29udGFpbmVyIGZvciBjb250ZW50Lg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Jc0l0ZW1JdHNPd25Db250YWluZXJPdmVycmlkZShTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIG9iamVjdCBpcyBhDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSIgLz4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgb2JqZWN0IHRvIGV2YWx1YXRlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVHJ1ZSBpZiA8cGFyYW1yZWYgbmFtZT0iaXRlbSIgLz4gaXMgYQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+OyBvdGhlcndpc2UsDQorICAgICAgICAgICAgZmFsc2UuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLlByZXBhcmVDb250YWluZXJGb3JJdGVtT3ZlcnJpZGUoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJlcGFyZXMgdGhlIHNwZWNpZmllZCBjb250YWluZXIgZWxlbWVudCB0byBkaXNwbGF5IHRoZSBzcGVjaWZpZWQNCisgICAgICAgICAgICBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+DQorICAgICAgICAgICAgQ29udGFpbmVyIGVsZW1lbnQgdXNlZCB0byBkaXNwbGF5IHRoZSBzcGVjaWZpZWQgaXRlbS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgaXRlbSB0byBkaXNwbGF5LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uQ2xlYXJDb250YWluZXJGb3JJdGVtT3ZlcnJpZGUoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVtb3ZlcyBhbGwgdGVtcGxhdGVzLCBzdHlsZXMsIGFuZCBiaW5kaW5ncyBmb3IgdGhlIG9iamVjdCBkaXNwbGF5ZWQNCisgICAgICAgICAgICBhcyBhIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+DQorICAgICAgICAgICAgVGhlIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+IGVsZW1lbnQgdG8NCisgICAgICAgICAgICBjbGVhci4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj4NCisgICAgICAgICAgICBUaGUgaXRlbSB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtIiAvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLk9uSXRlbXNDaGFuZ2VkKFN5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5Ob3RpZnlDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1ha2VzIGFkanVzdG1lbnRzIHRvIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+IHdoZW4gdGhlIHZhbHVlDQorICAgICAgICAgICAgb2YgdGhlIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JdGVtc0NvbnRyb2wuSXRlbXMiIC8+DQorICAgICAgICAgICAgcHJvcGVydHkgY2hhbmdlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPg0KKyAgICAgICAgICAgIEENCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6U3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkLk5vdGlmeUNvbGxlY3Rpb25DaGFuZ2VkRXZlbnRBcmdzIiAvPg0KKyAgICAgICAgICAgIHRoYXQgY29udGFpbnMgZGF0YSBhYm91dCB0aGUgY2hhbmdlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uUmFpc2VFdmVudChTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEhhbmRsZXIsU3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmFpc2UgYSBSb3V0ZWRFdmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImhhbmRsZXIiPkV2ZW50IGhhbmRsZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uT25FeHBhbmRlZChTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSYWlzZXMgYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IkU6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLkV4cGFuZGVkIiAvPiBldmVudA0KKyAgICAgICAgICAgIHdoZW4gdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Jc0V4cGFuZGVkIiAvPg0KKyAgICAgICAgICAgIHByb3BlcnR5IGNoYW5nZXMgZnJvbSBmYWxzZSB0byB0cnVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+DQorICAgICAgICAgICAgQSA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzIiAvPiB0aGF0IGNvbnRhaW5zIHRoZQ0KKyAgICAgICAgICAgIGV2ZW50IGRhdGEuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5PbkNvbGxhcHNlZChTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSYWlzZXMgYQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iRTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uQ29sbGFwc2VkIiAvPg0KKyAgICAgICAgICAgIGV2ZW50IHdoZW4gdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Jc0V4cGFuZGVkIiAvPg0KKyAgICAgICAgICAgIHByb3BlcnR5IGNoYW5nZXMgZnJvbSB0cnVlIHRvIGZhbHNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+DQorICAgICAgICAgICAgQSA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzIiAvPiB0aGF0IGNvbnRhaW5zIHRoZQ0KKyAgICAgICAgICAgIGV2ZW50IGRhdGEuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Ub2dnbGVFeHBhbmRlZChTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEhhbmRsZXIsU3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlIGNoYW5nZXMgdG8gdGhlIElzRXhwYW5kZWQgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJoYW5kbGVyIj5FdmVudCBoYW5kbGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLk9uU2VsZWN0ZWQoU3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmFpc2VzIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iRTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uU2VsZWN0ZWQiIC8+IGV2ZW50DQorICAgICAgICAgICAgd2hlbiB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLklzU2VsZWN0ZWQiIC8+DQorICAgICAgICAgICAgcHJvcGVydHkgY2hhbmdlcyBmcm9tIGZhbHNlIHRvIHRydWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj4NCisgICAgICAgICAgICBBIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEFyZ3MiIC8+IHRoYXQgY29udGFpbnMgdGhlDQorICAgICAgICAgICAgZXZlbnQgZGF0YS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLk9uVW5zZWxlY3RlZChTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSYWlzZXMgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJFOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5VbnNlbGVjdGVkIiAvPg0KKyAgICAgICAgICAgIGV2ZW50IHdoZW4gdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Jc1NlbGVjdGVkIiAvPg0KKyAgICAgICAgICAgIHByb3BlcnR5IGNoYW5nZXMgZnJvbSB0cnVlIHRvIGZhbHNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+DQorICAgICAgICAgICAgQSA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzIiAvPiB0aGF0IGNvbnRhaW5zIHRoZQ0KKyAgICAgICAgICAgIGV2ZW50IGRhdGEuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5PbkdvdEZvY3VzKFN5c3RlbS5XaW5kb3dzLlJvdXRlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb3ZpZGVzIGhhbmRsaW5nIGZvciB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IkU6U3lzdGVtLldpbmRvd3MuVUlFbGVtZW50LkdvdEZvY3VzIiAvPiBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPg0KKyAgICAgICAgICAgIEEgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLlJvdXRlZEV2ZW50QXJncyIgLz4gdGhhdCBjb250YWlucyB0aGUNCisgICAgICAgICAgICBldmVudCBkYXRhLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uT25Mb3N0Rm9jdXMoU3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvdmlkZXMgaGFuZGxpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iRTpTeXN0ZW0uV2luZG93cy5VSUVsZW1lbnQuTG9zdEZvY3VzIiAvPiBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPg0KKyAgICAgICAgICAgIEEgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLlJvdXRlZEV2ZW50QXJncyIgLz4gdGhhdCBjb250YWlucyB0aGUNCisgICAgICAgICAgICBldmVudCBkYXRhLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uT25FeHBhbmRlckdvdEZvY3VzKFN5c3RlbS5PYmplY3QsU3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlIHRoZSBFeHBhbmRlckJ1dHRvbidzIEdvdEZvY3VzIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgRXhwYW5kZXJCdXR0b24uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgQXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uT25Nb3VzZUVudGVyKFN5c3RlbS5XaW5kb3dzLklucHV0Lk1vdXNlRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvdmlkZXMgaGFuZGxpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iRTpTeXN0ZW0uV2luZG93cy5VSUVsZW1lbnQuTW91c2VFbnRlciIgLz4gZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj4NCisgICAgICAgICAgICBBIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5JbnB1dC5Nb3VzZUV2ZW50QXJncyIgLz4gdGhhdCBjb250YWlucw0KKyAgICAgICAgICAgIHRoZSBldmVudCBkYXRhLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uT25Nb3VzZUxlYXZlKFN5c3RlbS5XaW5kb3dzLklucHV0Lk1vdXNlRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvdmlkZXMgaGFuZGxpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iRTpTeXN0ZW0uV2luZG93cy5VSUVsZW1lbnQuTW91c2VMZWF2ZSIgLz4gZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj4NCisgICAgICAgICAgICBBIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5JbnB1dC5Nb3VzZUV2ZW50QXJncyIgLz4gdGhhdCBjb250YWlucw0KKyAgICAgICAgICAgIHRoZSBldmVudCBkYXRhLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uT25IZWFkZXJNb3VzZUxlZnRCdXR0b25Eb3duKFN5c3RlbS5PYmplY3QsU3lzdGVtLldpbmRvd3MuSW5wdXQuTW91c2VCdXR0b25FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBoYW5kbGluZyBmb3IgdGhlIEhlYWRlcidzIE1vdXNlTGVmdEJ1dHRvbkRvd24gZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBIZWFkZXIgdGVtcGxhdGUgcGFydC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5PbkV4cGFuZGVyQ2xpY2soU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBoYW5kbGluZyBmb3IgdGhlIEV4cGFuZGVyQnV0dG9uJ3MgQ2xpY2sgZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBFeHBhbmRlckJ1dHRvbi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBBcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Pbk1vdXNlTGVmdEJ1dHRvbkRvd24oU3lzdGVtLldpbmRvd3MuSW5wdXQuTW91c2VCdXR0b25FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBoYW5kbGluZyBmb3IgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJFOlN5c3RlbS5XaW5kb3dzLlVJRWxlbWVudC5Nb3VzZUxlZnRCdXR0b25Eb3duIiAvPiBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPg0KKyAgICAgICAgICAgIEEgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLklucHV0Lk1vdXNlQnV0dG9uRXZlbnRBcmdzIiAvPiB0aGF0DQorICAgICAgICAgICAgY29udGFpbnMgdGhlIGV2ZW50IGRhdGEuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Pbk1vdXNlTGVmdEJ1dHRvblVwKFN5c3RlbS5XaW5kb3dzLklucHV0Lk1vdXNlQnV0dG9uRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvdmlkZXMgaGFuZGxpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iRTpTeXN0ZW0uV2luZG93cy5VSUVsZW1lbnQuTW91c2VMZWZ0QnV0dG9uVXAiIC8+IGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+DQorICAgICAgICAgICAgQSA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuSW5wdXQuTW91c2VCdXR0b25FdmVudEFyZ3MiIC8+IHRoYXQNCisgICAgICAgICAgICBjb250YWlucyB0aGUgZXZlbnQgZGF0YS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLk9uS2V5RG93bihTeXN0ZW0uV2luZG93cy5JbnB1dC5LZXlFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBoYW5kbGluZyBmb3IgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJFOlN5c3RlbS5XaW5kb3dzLlVJRWxlbWVudC5LZXlEb3duIiAvPiBldmVudCB3aGVuIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+IGhhcyBmb2N1cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPg0KKyAgICAgICAgICAgIEEgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLklucHV0LktleUV2ZW50QXJncyIgLz4gdGhhdCBjb250YWlucw0KKyAgICAgICAgICAgIHRoZSBldmVudCBkYXRhLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uSGFuZGxlRG93bktleSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVHJ5IG1vdmluZyB0aGUgZm9jdXMgZG93biBmcm9tIHRoZSBzZWxlY3RlZCBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZm9jdXMgd2FzIHN1Y2Nlc3NmdWxseSBtb3ZlZC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uT25LZXlVcChTeXN0ZW0uV2luZG93cy5JbnB1dC5LZXlFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBoYW5kbGluZyBmb3IgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJFOlN5c3RlbS5XaW5kb3dzLlVJRWxlbWVudC5LZXlVcCIgLz4gZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj4NCisgICAgICAgICAgICBBIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5JbnB1dC5LZXlFdmVudEFyZ3MiIC8+IHRoYXQgY29udGFpbnMNCisgICAgICAgICAgICB0aGUgZXZlbnQgZGF0YS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLkhhbmRsZVVwS2V5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUcnkgbW92aW5nIHRoZSBmb2N1cyB1cCBmcm9tIHRoZSBzZWxlY3RlZCBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZm9jdXMgd2FzIHN1Y2Nlc3NmdWxseSBtb3ZlZC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uSGFuZGxlU2Nyb2xsQnlQYWdlKFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLlNjcm9sbFZpZXdlcixTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlQCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZSBzY3JvbGxpbmcgYSBwYWdlIHVwIG9yIGRvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ1cCI+DQorICAgICAgICAgICAgQSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhZ2Ugc2hvdWxkIGJlIHNjcm9sbGVkIHVwLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNjcm9sbEhvc3QiPlRoZSBTY3JvbGxWaWV3ZXIgYmVpbmcgc2Nyb2xsZWQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlld3BvcnRIZWlnaHQiPlRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRvcCI+VGhlIHRvcCBvZiBpdGVtIHRvIHN0YXJ0IGZyb20uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYm90dG9tIj5UaGUgYm90dG9tIG9mIHRoZSBpdGVtIHRvIHN0YXJ0IGZyb20uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3VycmVudERlbHRhIj5UaGUgaGVpZ2h0IG9mIHRoaXMgaXRlbS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzY3JvbGwgd2FzIGhhbmRsZWQuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLkNhbGN1bGF0ZURlbHRhKFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5XaW5kb3dzLkZyYW1ld29ya0VsZW1lbnQsU3lzdGVtLldpbmRvd3MuQ29udHJvbHMuU2Nyb2xsVmlld2VyLFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlQCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIFRyZWVWaWV3SXRlbSBhbmQgdGhlIGl0ZW0gYmVpbmcNCisgICAgICAgICAgICBwYWdlZCBmcm9tLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idXAiPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYWdlIHNob3VsZCBiZSBzY3JvbGxlZCB1cC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij5UaGUgZWxlbWVudCBiZWluZyBwYWdlZCBmcm9tLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNjcm9sbEhvc3QiPlRoZSBTY3JvbGxWaWV3ZXIgYmVpbmcgc2Nyb2xsZWQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idG9wIj5UaGUgdG9wIG9mIGl0ZW0gdG8gc3RhcnQgZnJvbS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJib3R0b20iPlRoZSBib3R0b20gb2YgdGhlIGl0ZW0gdG8gc3RhcnQgZnJvbS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjbG9zZUVkZ2UiPg0KKyAgICAgICAgICAgIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0b3AvYm90dG9tIG9mIG9uZSBpdGVtIHRvIHRoZSBvdGhlci4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzY3JvbGwgd2FzIGhhbmRsZWQuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLlNlbGVjdChTeXN0ZW0uQm9vbGVhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENoYW5nZSB0aGUgc2VsZWN0ZWQgc3RhdHVzIG9mIHRoZSBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZWxlY3RlZCI+DQorICAgICAgICAgICAgQSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFRyZWVWaWV3SXRlbSBpcyBzZWxlY3RlZC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLlVwZGF0ZUNvbnRhaW5zU2VsZWN0aW9uKFN5c3RlbS5Cb29sZWFuKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVXBkYXRlIHRoZSBhbmNlc3RvcnMgb2YgdGhpcyBpdGVtIHdoZW4gaXQgY2hhbmdlcyBzZWxlY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZWxlY3RlZCI+DQorICAgICAgICAgICAgQSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGl0ZW0gaXMgc2VsZWN0ZWQuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBVbnNlbGVjdGlvbiB1cGRhdGVzIG5lZWQgdG8gb2NjdXIgYmVmb3JlIHNlbGVjdGlvbiB1cGRhdGVzIGJlY2F1c2UNCisgICAgICAgICAgICB0aGUgb2xkIGFuZCBuZXcgc2VsZWN0ZWQgaXRlbXMgbWF5IHNoYXJlIGEgcGFydGlhbCBwYXRoLg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5BbGxvd0tleUhhbmRsZUV2ZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZXRlcm1pbmUgd2hldGhlciB0aGUgVHJlZVZpZXdJdGVtIHNob3VsZCBiZSBhbGxvd2VkIHRvIGhhbmRsZSBhIGtleQ0KKyAgICAgICAgICAgIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUga2V5IGV2ZW50IHNob3VsZCBiZSBoYW5kbGVkLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Gb2N1c0Rvd24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE5hdmlnYXRlIHRoZSBmb2N1cyB0byB0aGUgbmV4dCBUcmVlVmlld0l0ZW0gYmVsb3cgdGhpcyBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZm9jdXMgd2FzIG5hdmlnYXRlZC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uRm9jdXNJbnRvIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBOYXZpZ2F0ZSB0aGUgZm9jdXMgdG8gdGhlIHZlcnkgbGFzdCBUcmVlVmlld0l0ZW0gZGVzY2VuZGVudCBvZiB0aGUNCisgICAgICAgICAgICB0aGlzIGl0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmb2N1cyB3YXMgbmF2aWdhdGVkLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5GaW5kTmV4dEZvY3VzYWJsZUl0ZW0oU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGaW5kIHRoZSBuZXh0IGZvY3VzYWJsZSBUcmVlVmlld0l0ZW0gYmVsb3cgdGhpcyBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icmVjdXJzZSI+DQorICAgICAgICAgICAgQSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGl0ZW0gc2hvdWxkIHJlY3Vyc2UgaW50byBpdHMgY2hpbGQNCisgICAgICAgICAgICBpdGVtcyB3aGVuIHNlYXJjaGluZyBmb3IgdGhlIG5leHQgZm9jdXNhYmxlIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRoZSBuZXh0IGZvY3VzYWJsZSBUcmVlVmlld0l0ZW0gYmVsb3cgdGhpcyBpdGVtLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5GaW5kTGFzdEZvY3VzYWJsZUl0ZW0iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZpbmQgdGhlIGxhc3QgZm9jdXNhYmxlIFRyZWVWaWV3SXRlbSBjb250YWluZWQgYnkgdGhpcyBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgbGFzdCBmb2N1c2FibGUgVHJlZVZpZXdJdGVtIGNvbnRhaW5lZCBieSB0aGlzIGl0ZW0uDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLkZpbmRQcmV2aW91c0ZvY3VzYWJsZUl0ZW0iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZpbmQgdGhlIHByZXZpb3VzIGZvY3VzYWJsZSBUcmVlVmlld0l0ZW0gYWJvdmUgdGhpcyBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgcHJldmlvdXMgZm9jdXNhYmxlIFRyZWVWaWV3SXRlbSBhYm92ZSB0aGlzIGl0ZW0uDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLkV4cGFuZGVyQnV0dG9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIEV4cGFuZGVyQnV0dG9uIHRlbXBsYXRlIHBhcnQgaXMgdXNlZCB0byBleHBhbmQgYW5kDQorICAgICAgICAgICAgY29sbGFwc2UgdGhlIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uSGVhZGVyRWxlbWVudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgSGVhZGVyIHRlbXBsYXRlIHBhcnQgdGhhdCBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSBib3VuZA0KKyAgICAgICAgICAgIEhlYWRlciBjb250ZW50IG9mIHRoZSBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLkV4cGFuc2lvblN0YXRlR3JvdXAiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgRXhwYW5zaW9uU3RhdGVzIHZpc3VhbCBzdGF0ZSBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uSWdub3JlUHJvcGVydHlDaGFuZ2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBhIGRlcGVuZGVuY3kgcHJvcGVydHkgY2hhbmdlDQorICAgICAgICAgICAgaGFuZGxlciBzaG91bGQgaWdub3JlIHRoZSBuZXh0IGNoYW5nZSBub3RpZmljYXRpb24uICBUaGlzIGlzIHVzZWQgdG8NCisgICAgICAgICAgICByZXNldCB0aGUgdmFsdWUgb2YgcHJvcGVydGllcyB3aXRob3V0IHBlcmZvcm1pbmcgYW55IG9mIHRoZSBhY3Rpb25zDQorICAgICAgICAgICAgaW4gdGhlaXIgY2hhbmdlIGhhbmRsZXJzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5IYXNJdGVtcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGlzDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSIgLz4gY29udGFpbnMNCisgICAgICAgICAgICBpdGVtcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPg0KKyAgICAgICAgICAgIFRydWUgaWYgdGhpcyA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtIiAvPg0KKyAgICAgICAgICAgIGNvbnRhaW5zIGl0ZW1zOyBvdGhlcndpc2UsIGZhbHNlLiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLklzRXhwYW5kZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSXRlbXNDb250cm9sLkl0ZW1zIiAvPg0KKyAgICAgICAgICAgIGNvbnRhaW5lZCBieSB0aGlzDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSIgLz4gYXJlIGV4cGFuZGVkDQorICAgICAgICAgICAgb3IgY29sbGFwc2VkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVHJ1ZSB0byBpbmRpY2F0ZSB0aGUgY29udGVudHMgb2YgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkl0ZW1zQ29udHJvbC5JdGVtcyIgLz4NCisgICAgICAgICAgICBjb2xsZWN0aW9uIGFyZSBleHBhbmRlZDsgZmFsc2UgdG8gaW5kaWNhdGUgdGhlIGl0ZW1zIGFyZSBjb2xsYXBzZWQuDQorICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgZmFsc2UuDQorICAgICAgICAgICAgPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Jc1NlbGVjdGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcw0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+IGlzIHNlbGVjdGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVHJ1ZSBpZiB0aGlzIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+DQorICAgICAgICAgICAgaXMgc2VsZWN0ZWQ7IG90aGVyd2lzZSwgZmFsc2UuIFRoZSBkZWZhdWx0IGlzIGZhbHNlLg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uSXNTZWxlY3Rpb25BY3RpdmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSIgLz4gaGFzIGZvY3VzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVHJ1ZSBpZiB0aGlzIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+DQorICAgICAgICAgICAgaGFzIGZvY3VzOyBvdGhlcndpc2UsIGZhbHNlLiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLkludGVyYWN0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBoZWxwZXIgdGhhdCBwcm92aWRlcyBhbGwgb2YgdGhlIHN0YW5kYXJkDQorICAgICAgICAgICAgaW50ZXJhY3Rpb24gZnVuY3Rpb25hbGl0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uQ29udGFpbnNTZWxlY3Rpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgVHJlZVZpZXcncyBjdXJyZW50bHkNCisgICAgICAgICAgICBzZWxlY3RlZCBpdGVtIGlzIGEgZGVzY2VuZGVudCBvZiB0aGlzIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uQ2FuY2VsR290Rm9jdXNCdWJibGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgVHJlZVZpZXdJdGVtIHNob3VsZA0KKyAgICAgICAgICAgIGlnbm9yZSB0aGUgbmV4dCBHb3RGb2N1cyBldmVudCBpdCByZWNlaXZlcyBiZWNhdXNlIGl0IGhhcyBhbHJlYWR5DQorICAgICAgICAgICAgYmVlbiBoYW5kbGVkIGJ5IG9uZSBvZiBpdHMgY2hpbGRyZW4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLlJlcXVpcmVzQ29udGFpbnNTZWxlY3Rpb25VcGRhdGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBjaGVja2luZyBDb250YWluc1NlbGVjdGlvbg0KKyAgICAgICAgICAgIHNob3VsZCBhY3R1YWxseSBwZXJmb3JtIHRoZSB1cGRhdGUgbm90aWZpY2F0aW9ucyBiZWNhdXNlIHRoZSBpdGVtDQorICAgICAgICAgICAgd2FzIHNlbGVjdGVkIGJlZm9yZSBpdCB3YXMgaW4gdGhlIHZpc3VhbCB0cmVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Vc2VySW5pdGlhdGVkRXhwYW5zaW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgYSB1c2VyIGluaXRpYXRlZCBhY3Rpb24NCisgICAgICAgICAgICBjYXVzZWQgdGhlIElzRXhwYW5kZWQgcHJvcGVydHkgdG8gYmUgc2V0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5QYXJlbnRJdGVtc0NvbnRyb2wiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IEl0ZW1zQ29udHJvbCBvZiBhDQorICAgICAgICAgICAgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5QYXJlbnRUcmVlVmlld0l0ZW0iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBUcmVlVmlld0l0ZW0gb2YgdGhpcyBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLlBhcmVudFRyZWVWaWV3Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgVHJlZVZpZXcgb2YgdGhlIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uSXNSb290Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgVHJlZVZpZXdJdGVtIGlzIGEgcm9vdCBvZiB0aGUNCisgICAgICAgICAgICBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uQ2FuRXhwYW5kT25JbnB1dCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgVHJlZVZpZXdJdGVtIGNhbiBleHBhbmQgd2hlbiBpdA0KKyAgICAgICAgICAgIHJlY2VpdmVzIGFwcHJvcHJpYXRlIHVzZXIgaW5wdXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkU6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLkNvbGxhcHNlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgT2NjdXJzIHdoZW4gdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Jc0V4cGFuZGVkIiAvPg0KKyAgICAgICAgICAgIHByb3BlcnR5IGNoYW5nZXMgZnJvbSB0cnVlIHRvIGZhbHNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJFOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5FeHBhbmRlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgT2NjdXJzIHdoZW4gdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Jc0V4cGFuZGVkIiAvPg0KKyAgICAgICAgICAgIHByb3BlcnR5IGNoYW5nZXMgZnJvbSBmYWxzZSB0byB0cnVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJFOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5TZWxlY3RlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgT2NjdXJzIHdoZW4gdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Jc1NlbGVjdGVkIiAvPg0KKyAgICAgICAgICAgIHByb3BlcnR5IG9mIGEgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSIgLz4NCisgICAgICAgICAgICBjaGFuZ2VzIGZyb20gZmFsc2UgdG8gdHJ1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0uVW5zZWxlY3RlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgT2NjdXJzIHdoZW4gdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbS5Jc1NlbGVjdGVkIiAvPg0KKyAgICAgICAgICAgIHByb3BlcnR5IG9mIGEgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSIgLz4NCisgICAgICAgICAgICBjaGFuZ2VzIGZyb20gdHJ1ZSB0byBmYWxzZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuUmVzdWx0c1RyZWVWaWV3SXRlbS5HZXRDb250YWluZXJGb3JJdGVtT3ZlcnJpZGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE92ZXJyaWRlcyB0aGUgaXRlbSB0byBhbGxvdyBmb3Igc2ltcGxlIGJpbmRpbmcgdG8gdGhlIGV4cGFuZGVkDQorICAgICAgICAgICAgcHJvcGVydHkgb24gdGhlIGl0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSBuZXcgY29udGFpbmVyIGZvciBhbiBpdGVtLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5SZXN1bHRzVHJlZVZpZXdJdGVtLk9uS2V5RG93bihTeXN0ZW0uV2luZG93cy5JbnB1dC5LZXlFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBPdmVycmlkZXMgdGhlIGtleSBkb3duIGV2ZW50IHRvIGFsbG93IHRvZ2dsaW5nIHRoZSBzcGFjZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBrZXkgZXZlbnQgYXJndW1lbnRzIGRhdGEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBzcGVjaWFsaXplZCBjb250ZW50IGNvbnRyb2wgdGhhdCBjb250YWlucyBhIGZpeGVkIGhlYWRlciwgYSBzdGFuZGFyZA0KKyAgICAgICAgICAgIGhlYWRlciBjb250ZW50IHByb3BlcnR5LCBwbHVzIGNvbnRlbnQuIEl0IGlzIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3INCisgICAgICAgICAgICBhICJzbGlkZS1iYXNlZCIgdXNlciBpbnRlcmZhY2UgZm9yIHNpbXBsZSB1c2VyIGludGVyZmFjZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlLkdyb3VwUG9zaXRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB2aXN1YWwgc3RhdGUgZ3JvdXAgbmFtZSBmb3Igc2xpZGUgcG9zaXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlLlN0YXRlUG9zaXRpb25MZWZ0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdmlzdWFsIHN0YXRlIG5hbWUgZm9yIGxlZnQgcG9zaXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlLlN0YXRlUG9zaXRpb25SaWdodCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHZpc3VhbCBzdGF0ZSBuYW1lIGZvciByaWdodCBwb3NpdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGUuU3RhdGVQb3NpdGlvbk5vcm1hbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIG5vcm1hbCB2aXN1YWwgc3RhdGUgbmFtZSBmb3IgcG9zaXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlLlBhcnRDb250ZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgY29udGVudCB0ZW1wbGF0ZSBwYXJ0IG5hbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlLlBhcnRIZWFkZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBoZWFkZXIgdGVtcGxhdGUgcGFydCBuYW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZS5QYXJ0Rml4ZWRIZWFkZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBmaXhlZCBoZWFkZXIgdGVtcGxhdGUgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGUuX3BhcmVudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIG1hbmFnZXIgb2YgdGhlIHNsaWRlIGFuZCBpdHMgc2libGluZ3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlLkhlYWRlclByb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJZGVudGlmaWVzIHRoZSBIZWFkZXIgZGVwZW5kZW5jeSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGUuRml4ZWRIZWFkZXJQcm9wZXJ0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWRlbnRpZmllcyB0aGUgRml4ZWRIZWFkZXIgZGVwZW5kZW5jeSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGUuUG9zaXRpb25Qcm9wZXJ0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWRlbnRpZmllcyB0aGUgUG9zaXRpb24gZGVwZW5kZW5jeSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGUuT25Qb3NpdGlvblByb3BlcnR5Q2hhbmdlZChTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5T2JqZWN0LFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQb3NpdGlvblByb3BlcnR5IHByb3BlcnR5IGNoYW5nZWQgaGFuZGxlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImQiPlNsaWRlIHRoYXQgY2hhbmdlZCBpdHMgUG9zaXRpb24uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTbGlkZSBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGUuUmVtb3ZlRnJvbU1hbmFnZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlbW92ZSB0aGUgc2xpZGUgZnJvbSB0aGUgcGFyZW50IG1hbmFnZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlLk9uQXBwbHlUZW1wbGF0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTG9jYXRlIHRlbXBsYXRlIHBhcnRzIGFuZCBhc3NpZ24gaW5zdGFuY2VzIHRvIGZpZWxkcyBkdXJpbmcgdGVtcGxhdGUNCisgICAgICAgICAgICBhcHBsaWNhdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGUuT25TbGlkZUNoYW5nZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZpcmVzIHRoZSBzbGlkZSBjaGFuZ2VkIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZS5PbkN1cnJlbnRTdGF0ZUNoYW5nZWQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5WaXN1YWxTdGF0ZUNoYW5nZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGaXJlcyB0aGUgY3VycmVudCBzdGF0ZSBjaGFuZ2VkIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgc291cmNlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGUuVG9TdHJpbmciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhlbHBzIGRlYnVnZ2luZyBieSBwcm92aWRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNsaWRlIG5hbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHNsaWRlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZS5VcGRhdGVWaXN1YWxTdGF0ZShTeXN0ZW0uQm9vbGVhbixNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGVQb3NpdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVwZGF0ZXMgdGhlIHZpc3VhbCBzdGF0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InVzZVRyYW5zaXRpb25zIj5BIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0byB1c2UNCisgICAgICAgICAgICB2aXN1YWwgdHJhbnNpdGlvbnMgZm9yIHRoZSBzdGF0ZSBjaGFuZ2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3AiPlRoZSBzbGlkZSBwb3NpdGlvbiB0byB1c2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJFOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZS5TbGlkZUNoYW5nZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEV2ZW50IGZpcmVkIHdoZW4gdGhlIGN1cnJlbnQgc2xpZGUgY2hhbmdlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGUuSGVhZGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIHByaW1hcnkgaGVhZGVyIGNvbnRlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlLkZpeGVkSGVhZGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIGZpeGVkIGhlYWRlciBjb250ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZS5Qb3NpdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlLlNsaWRlTWFuYWdlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBzbGlkZSBtYW5hZ2VyIGZvciB0aGUgc2xpZGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlTWFuYWdlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBoZWxwZXIgY2xhc3MgdG8gbWFuYWdpbmcgc2V0cyBvZiBzbGlkZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlTWFuYWdlci4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFNsaWRlTWFuYWdlciBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGVNYW5hZ2VyLl9jdXJyZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdG9yZXMgdGhlIGxpbmtlZCBsaXN0IG5vZGUgZm9yIHRoZSBjdXJyZW50IHNsaWRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZU1hbmFnZXIuX3NsaWRlcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFja2luZyBmaWVsZCBmb3IgdGhlIHNldCBvZiBzbGlkZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlTWFuYWdlci5BZGQoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlW10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBZGRzIGEgc2xpZGUgb3IgYW4gYXJyYXkgb2Ygc2xpZGVzIHRvIHRoZSBtYW5hZ2VkIHNsaWRlIHNldC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNsaWRlcyI+VGhlIHNsaWRlcyB0byBtYW5hZ2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZU1hbmFnZXIuSW5pdGlhbGl6ZVBvc2l0aW9uKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZSxTeXN0ZW0uQm9vbGVhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGUgYmFzZWQgb24gbG9jYXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzbGlkZSI+VGhlIHNsaWRlIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImlzRmlyc3QiPkEgcHJvcGVydHkgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzbGlkZSBpcyB0aGUNCisgICAgICAgICAgICBmaXJzdCB0byBiZSBtYW5hZ2VkLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGVNYW5hZ2VyLkluc2VydEFmdGVyKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZSxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNYW5hZ2VzIGEgbmV3IHNsaWRlLCBpbnNlcnRpbmcgaXQgYWZ0ZXIgYW4gZXhpc3Rpbmcgc2xpZGUgbm9kZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImJlZm9yZSI+VGhlIG5vZGUgdG8gaW5zZXJ0IGFmdGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5ld1NsaWRlIj5UaGUgbmV3IHNsaWRlIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgbGlua2VkIGxpc3Qgbm9kZSB0aGF0IGlzIGluc2VydGVkLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZU1hbmFnZXIuSW5zZXJ0Rmlyc3QoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5zZXJ0cyBhIHNsaWRlIGFzIHRoZSBmaXJzdCBpbiB0aGUgbGlua2VkIGxpc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJuZXdTbGlkZSI+VGhlIG5ldyBzbGlkZSBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgdGhlIGxpbmtlZCBsaXN0IG5vZGUuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlNsaWRlTWFuYWdlci5JbnNlcnRBZnRlcihTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaW5rZWRMaXN0Tm9kZXtNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGV9LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluc2VydCBhIHNsaWRlIGFmdGVyIGEgcHJvdmlkZWQgbGlua2VkIGxpc3Qgbm9kZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImJlZm9yZSI+VGhlIG5vZGUgdG8gaW5zZXJ0IGFmdGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5ld1NsaWRlIj5UaGUgbmV3IHNsaWRlIHRvIGluc2VydC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgdGhlIG5ldyBsaW5rZWQgbGlzdCBub2RlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZU1hbmFnZXIuUmVtb3ZlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlbW92ZSBhIHNsaWRlIGZyb20gbWFuYWdlbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNsaWRlIj5UaGUgc2xpZGUgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZU1hbmFnZXIuUHJldmlvdXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1vdmUgdG8gdGhlIHByZXZpb3VzIHNsaWRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZU1hbmFnZXIuTmV4dCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTW92ZSB0byB0aGUgbmV4dCBzbGlkZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGVNYW5hZ2VyLk1vdmVUbyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNb3ZlcyB0byBhIHNwZWNpZmljIHNsaWRlLCBtb3ZpbmcgdGhlIG90aGVycyB0byB0aGUgYXBwcm9wcmlhdGUNCisgICAgICAgICAgICBkaXJlY3Rpb24gb24gc2NyZWVuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2xpZGUiPlRoZSBzbGlkZSB0byBtb3ZlIHRvLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGVNYW5hZ2VyLk1vdmUoU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNb3ZlIGluIGEgZGlyZWN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZm9yd2FyZCI+QSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGRpcmVjdGlvbiB0bw0KKyAgICAgICAgICAgIG1vdmUgaXMgZm9yd2FyZCBvciBub3QuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZU1hbmFnZXIuQ3VycmVudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgY3VycmVudCBzbGlkZSBpbnN0YW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGVQb3NpdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5kaWNhdGVzIHRoZSBwb3NpdGlvbiB0aGF0IHRoZSBzbGlkZSBzaG91bGQgaGF2ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGVQb3NpdGlvbi5Ob3JtYWwiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE5vcm1hbCBwb3NpdGlvbiwgY2VudGVyZWQgb24gdGhlIHNjcmVlbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuU2xpZGVQb3NpdGlvbi5MZWZ0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUbyB0aGUgbGVmdCBvZiB0aGUgc2NyZWVuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5TbGlkZVBvc2l0aW9uLlJpZ2h0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUbyB0aGUgcmlnaHQgb2YgdGhlIHNjcmVlbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGFnRWRpdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgVGFnRWRpdG9yIGNvbnRyb2wgcHJvdmlkZXMgYSBicmllZiB1c2VyIGludGVyZmFjZSBhbGxvd2luZyBmb3IgdGhlDQorICAgICAgICAgICAgc2VsZWN0aW9uIG9mIGEgc2V0IG9mIHRlc3RzLCB1c2VkIHRvIGZpbHRlciB0aGUgdGVzdCBydW4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRhZ0VkaXRvci5UYWdIaXN0b3J5S2V5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBLZXkgdXNlZCB0byBsb29rdXAgdGhlIFRhZ0hpc3Rvcnkgc2l0ZSBzZXR0aW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UYWdFZGl0b3IuVGFnTGFzdFJ1bkhpc3RvcnlLZXkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEtleSB1c2VkIHRvIGxvb2t1cCB3aGV0aGVyIHRoZSBsYXN0IHJ1biB1c2VkIHRhZyBleHByZXNzaW9ucy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGFnRWRpdG9yLlNlY29uZHNUb1dhaXQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHJ1bm5pbmcgdGhlIHRlc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRhZ0VkaXRvci5fbGFzdFJ1blVzZWRFeHByZXNzaW9ucyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFja2luZyBmaWVsZCBmb3IgdGhlIGxhc3QgcnVuIHVzZWQgdmFsdWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRhZ0VkaXRvci4jY3RvcihTeXN0ZW0uU3RyaW5nLFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0e1N5c3RlbS5TdHJpbmd9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFRhZ0VkaXRvciB0eXBlLiBBbHNvIGluY2x1ZGVzIGENCisgICAgICAgICAgICBzZXQgb2Ygc2FtcGxlIHRhZ3MgZm9yIGRpc3BsYXkgdG8gdGhlIGVuZCB1c2VyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5pdGlhbFRhZ0V4cHJlc3Npb24iPlRoZSB0YWcgZXhwcmVzc2lvbiB0byB1c2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2FtcGxlVGFncyI+U2FtcGxlIHRhZ3MgdG8gZGlzcGxheS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRhZ0VkaXRvci4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFRhZ0VkaXRvciB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5pdGlhbFRhZ0V4cHJlc3Npb24iPlRoZSB0YWcgZXhwcmVzc2lvbiB0byB1c2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UYWdFZGl0b3IuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBUYWdFZGl0b3IgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGFnRWRpdG9yLk9uS2V5RG93bihTeXN0ZW0uV2luZG93cy5JbnB1dC5LZXlFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIYW5kbGVzIHRoZSBrZXkgZG93biBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBrZXkgZXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGFnRWRpdG9yLk9uQ29tcGxldGUoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRhZ0V4cHJlc3Npb25FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGaXJlcyB0aGUgQ29tcGxldGUgZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGFnRWRpdG9yLkNyZWF0ZVRhZ0J1dHRvbihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyBhIG5ldyBidXR0b24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb250ZW50Ij5UaGUgYnV0dG9uIGNvbnRlbnQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgbmV3IEJ1dHRvbiBpbnN0YW5jZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGFnRWRpdG9yLk9uVGFnQnV0dG9uQ2xpY2tlZChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5XaW5kb3dzLlJvdXRlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZSBzZWxlY3Rpb24gb2YgYSB0YWcgYnV0dG9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UYWcgYnV0dG9uLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRhZ0VkaXRvci5PblRhZ1RvdWNoZWQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIYW5kbGUgY2hhbmdlcyB0byB0aGUgVGFnIHRleHQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRhZyBUZXh0Qm94LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRhZ0VkaXRvci5PblJ1bkNsaWNrZWQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIYW5kbGUgY2xpY2tzIHRvIHRoZSBSdW4gYnV0dG9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5SdW4gQnV0dG9uLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRhZ0VkaXRvci5PblRpbWVyVGljayhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIYW5kbGUgdGltZXIgdGlja3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSB0aW1lci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UYWdFZGl0b3IuU3RvcFRpbWVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdG9wIHRoZSB0aW1lci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGFnRWRpdG9yLlJ1blRlc3RzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSdW4gdGhlIHVuaXQgdGVzdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRhZ0VkaXRvci5PbkNhbmNlbENsaWNrZWQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDYW5jZWxzIHRoZSBzZWxlY3Rpb24gb2YgYSB0YWcgZXhwcmVzc2lvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGRhdGEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UYWdFZGl0b3IuSW5pdGlhbGl6ZUNvbXBvbmVudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZUNvbXBvbmVudA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UYWdFZGl0b3IuVGltZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdGltZXIgdXNlZCB0byBhdXRvbWF0aWNhbGx5IHJ1biB0ZXN0cyBpZiBubyB0YWcgaXMNCisgICAgICAgICAgICBlbnRlcmVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UYWdFZGl0b3IuU2Vjb25kc1dhaXRlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhbHJlYWR5IHdhaXRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGFnRWRpdG9yLlRhZ0hpc3RvcnkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdGFnIGhpc3RvcnkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkU6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRhZ0VkaXRvci5Db21wbGV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQW4gZXZlbnQgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFnIGVkaXRvciBpcyBjb21wbGV0ZS4gVGhpcyBjYW4gYmUNCisgICAgICAgICAgICBpbiByZXNwb25zZSB0byBtYW55IGFjdGlvbnM6IHRoZSB1c2VyIGVudGVyaW5nIGEgdGFnIGV4cHJlc3Npb24sIHRoZQ0KKyAgICAgICAgICAgIHRpbWUgZXhwaXJpbmcgYW5kIHRoZSBkZWZhdWx0IGJlaW5nIHNlbGVjdGVkLCBvciB0aGUgc2VsZWN0aW9uIGJlaW5nDQorICAgICAgICAgICAgY2FuY2VsZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRhZ0V4cHJlc3Npb25FdmVudEFyZ3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgY2xhc3MgZm9yIHN0b3JpbmcgZXZlbnQgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gYSB1c2VyJ3Mgc2VsZWN0ZWQNCisgICAgICAgICAgICB0YWcgZXhwcmVzc2lvbiBmb3IgYSB0ZXN0IHJ1bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGFnRXhwcmVzc2lvbkV2ZW50QXJncy4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFRhZ0V4cHJlc3Npb24gZXZlbnQgYXJndW1lbnRzDQorICAgICAgICAgICAgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YWdFeHByZXNzaW9uIj5UaGUgdGFnIGV4cHJlc3Npb24uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UYWdFeHByZXNzaW9uRXZlbnRBcmdzLlRhZ0V4cHJlc3Npb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHRhZyBleHByZXNzaW9uIHN0b3JlZCBpbiB0aGUgZXZlbnQgYXJndW1lbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UYWdFeHByZXNzaW9uRXZlbnRBcmdzLkhhc1RhZ0V4cHJlc3Npb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgYSB0YWcgZXhwcmVzc2lvbiBoYXMgYmVlbiBzZXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RFeGNlcHRpb25EZXRhaWxzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBhbnkgZXhjZXB0aW9ucyBsaXN0ZWQgaW4gdGhlIHJlc3VsdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RFeGNlcHRpb25EZXRhaWxzLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgVGVzdEV4Y2VwdGlvbkRldGFpbHMgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RFeGNlcHRpb25EZXRhaWxzLkluaXRpYWxpemVDb21wb25lbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVDb21wb25lbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERldGFpbHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERldGFpbHMgdmlldyBmb3IgdGVzdCBtZXRob2QgZGF0YS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERldGFpbHMuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBUZXN0TWV0aG9kRGV0YWlscyBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERldGFpbHMuSW5pdGlhbGl6ZUNvbXBvbmVudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZUNvbXBvbmVudA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UaW1lSGVscGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHNldCBvZiBzaW1wbGUgdGltZSBoZWxwZXIgbWV0aG9kcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGltZUhlbHBlci5FbGFwc2VkUmVhZGFibGVUaW1lKFN5c3RlbS5EYXRlVGltZSxTeXN0ZW0uRGF0ZVRpbWUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZm9ybWF0dGluZyBvZiB0aGUgdGltZSBkaWZmZXJlbnQgYmV0d2VlbiANCisgICAgICAgICAgICB0d28gRGF0ZVRpbWUgaW5zdGFuY2VzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3RhcnQiPlRoZSBzdGFydGluZyB0aW1lLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbmlzaCI+VGhlIGZpbmlzaGluZyB0aW1lLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZy48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGltZUhlbHBlci5FbGFwc2VkUmVhZGFibGVUaW1lKFN5c3RlbS5UaW1lU3BhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBmb3JtYXR0aW5nIG9mIHRoZSB0aW1lIGRpZmZlcmVudCBiZXR3ZWVuIA0KKyAgICAgICAgICAgIHR3byBEYXRlVGltZSBpbnN0YW5jZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0cyI+VGhlIHRpbWUgc3BhbiBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRpbWVIZWxwZXIuUGx1cmFsKFN5c3RlbS5TdHJpbmcsU3lzdGVtLkludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBwbHVyYWwgJ3MnIGFzIHRoZSBzdWZmaXgsIHdoZW4gbm90IGVxdWFsIHRvIG9uZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgc3RyaW5nIHZhbHVlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im51bWJlciI+VGhlIG51bWJlciB0byBjaGVjay48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9yIHRoZSBFbmdsaXNoIHBsdXJhbCAncycuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdDb25uZWN0aW5nTGluZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgaW5mcmFzdHJ1Y3R1cmUgdG8gZW5hYmxlIGRyYXdpbmcgY29ubmVjdGluZw0KKyAgICAgICAgICAgIGxpbmVzIGJldHdlZW4gdGhlIFRyZWVWaWV3SXRlbXMgaW4gYSBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPFF1YWxpdHlCYW5kPkV4cGVyaW1lbnRhbDwvUXVhbGl0eUJhbmQ+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0Nvbm5lY3RpbmdMaW5lcy5HZXRDb25uZWN0aW5nTGluZUluZm8oTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdmFsdWUgb2YgdGhlIENvbm5lY3RpbmdMaW5lSW5mbyBhdHRhY2hlZCBwcm9wZXJ0eSBmb3IgYQ0KKyAgICAgICAgICAgIHNwZWNpZmllZCBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij4NCisgICAgICAgICAgICBUaGUgVHJlZVZpZXdJdGVtIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHJlYWQuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgQ29ubmVjdGluZ0xpbmVJbmZvIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Q29ubmVjdGluZ0xpbmVzLkNvbm5lY3RpbmdMaW5lSW5mb1Byb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJZGVudGlmaWVzIHRoZSBDb25uZWN0aW5nTGluZUluZm8gZGVwZW5kZW5jeSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0Nvbm5lY3RpbmdMaW5lcy5HZXRJc1ZlcnRpY2FsQ29ubmVjdGluZ0xpbmVPZihTeXN0ZW0uV2luZG93cy5TaGFwZXMuTGluZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBJc1ZlcnRpY2FsQ29ubmVjdGluZ0xpbmVPZiBhdHRhY2hlZCBwcm9wZXJ0eQ0KKyAgICAgICAgICAgIGZvciBhIHNwZWNpZmllZCBMaW5lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+VGhlIExpbmUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgcmVhZC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRoZSBJc1ZlcnRpY2FsQ29ubmVjdGluZ0xpbmVPZiBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIExpbmUuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdDb25uZWN0aW5nTGluZXMuU2V0SXNWZXJ0aWNhbENvbm5lY3RpbmdMaW5lT2YoU3lzdGVtLldpbmRvd3MuU2hhcGVzLkxpbmUsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0cyB0aGUgdmFsdWUgb2YgdGhlIElzVmVydGljYWxDb25uZWN0aW5nTGluZU9mIGF0dGFjaGVkIHByb3BlcnR5IHRvIGEgc3BlY2lmaWVkIExpbmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij5UaGUgTGluZSB0byB3aGljaCB0aGUgYXR0YWNoZWQgcHJvcGVydHkgaXMgd3JpdHRlbi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIG5lZWRlZCBJc1ZlcnRpY2FsQ29ubmVjdGluZ0xpbmVPZiB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdDb25uZWN0aW5nTGluZXMuSXNWZXJ0aWNhbENvbm5lY3RpbmdMaW5lT2ZQcm9wZXJ0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWRlbnRpZmllcyB0aGUgSXNWZXJ0aWNhbENvbm5lY3RpbmdMaW5lT2YgZGVwZW5kZW5jeSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0Nvbm5lY3RpbmdMaW5lcy5PbklzVmVydGljYWxDb25uZWN0aW5nTGluZU9mUHJvcGVydHlDaGFuZ2VkKFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QsU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeVByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIElzVmVydGljYWxDb25uZWN0aW5nTGluZU9mUHJvcGVydHkgcHJvcGVydHkgY2hhbmdlZCBoYW5kbGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZCI+DQorICAgICAgICAgICAgTGluZSB0aGF0IGNoYW5nZWQgaXRzIElzVmVydGljYWxDb25uZWN0aW5nTGluZU9mIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Q29ubmVjdGluZ0xpbmVzLkdldElzSG9yaXpvbnRhbENvbm5lY3RpbmdMaW5lT2YoU3lzdGVtLldpbmRvd3MuU2hhcGVzLkxpbmUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgSXNIb3Jpem9udGFsQ29ubmVjdGluZ0xpbmVPZiBhdHRhY2hlZCBwcm9wZXJ0eQ0KKyAgICAgICAgICAgIGZvciBhIHNwZWNpZmllZCBMaW5lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+DQorICAgICAgICAgICAgVGhlIExpbmUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgcmVhZC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRoZSBJc0hvcml6b250YWxDb25uZWN0aW5nTGluZU9mIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgTGluZS4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0Nvbm5lY3RpbmdMaW5lcy5TZXRJc0hvcml6b250YWxDb25uZWN0aW5nTGluZU9mKFN5c3RlbS5XaW5kb3dzLlNoYXBlcy5MaW5lLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBJc0hvcml6b250YWxDb25uZWN0aW5nTGluZU9mIGF0dGFjaGVkIHByb3BlcnR5DQorICAgICAgICAgICAgdG8gYSBzcGVjaWZpZWQgTGluZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnQiPg0KKyAgICAgICAgICAgIFRoZSBMaW5lIHRvIHdoaWNoIHRoZSBhdHRhY2hlZCBwcm9wZXJ0eSBpcyB3cml0dGVuLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj4NCisgICAgICAgICAgICBUaGUgbmVlZGVkIElzSG9yaXpvbnRhbENvbm5lY3RpbmdMaW5lT2YgdmFsdWUuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Q29ubmVjdGluZ0xpbmVzLklzSG9yaXpvbnRhbENvbm5lY3RpbmdMaW5lT2ZQcm9wZXJ0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWRlbnRpZmllcyB0aGUgSXNIb3Jpem9udGFsQ29ubmVjdGluZ0xpbmVPZiBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Q29ubmVjdGluZ0xpbmVzLk9uSXNIb3Jpem9udGFsQ29ubmVjdGluZ0xpbmVPZlByb3BlcnR5Q2hhbmdlZChTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5T2JqZWN0LFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJc0hvcml6b250YWxDb25uZWN0aW5nTGluZU9mUHJvcGVydHkgcHJvcGVydHkgY2hhbmdlZCBoYW5kbGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZCI+DQorICAgICAgICAgICAgTGluZSB0aGF0IGNoYW5nZWQgaXRzIElzSG9yaXpvbnRhbENvbm5lY3RpbmdMaW5lT2YgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdDb25uZWN0aW5nTGluZXMuR2V0SXNFeHBhbmRlckJ1dHRvbk9mKFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLlByaW1pdGl2ZXMuVG9nZ2xlQnV0dG9uKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdmFsdWUgb2YgdGhlIElzRXhwYW5kZXJCdXR0b25PZiBhdHRhY2hlZCBwcm9wZXJ0eSBmb3IgYQ0KKyAgICAgICAgICAgIHNwZWNpZmllZCBUb2dnbGVCdXR0b24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij4NCisgICAgICAgICAgICBUaGUgVG9nZ2xlQnV0dG9uIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHJlYWQuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgSXNFeHBhbmRlckJ1dHRvbk9mIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgVG9nZ2xlQnV0dG9uLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Q29ubmVjdGluZ0xpbmVzLlNldElzRXhwYW5kZXJCdXR0b25PZihTeXN0ZW0uV2luZG93cy5Db250cm9scy5QcmltaXRpdmVzLlRvZ2dsZUJ1dHRvbixNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgSXNFeHBhbmRlckJ1dHRvbk9mIGF0dGFjaGVkIHByb3BlcnR5IHRvIGENCisgICAgICAgICAgICBzcGVjaWZpZWQgVG9nZ2xlQnV0dG9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+DQorICAgICAgICAgICAgVGhlIFRvZ2dsZUJ1dHRvbiB0byB3aGljaCB0aGUgYXR0YWNoZWQgcHJvcGVydHkgaXMgd3JpdHRlbi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIG5lZWRlZCBJc0V4cGFuZGVyQnV0dG9uT2YgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Q29ubmVjdGluZ0xpbmVzLklzRXhwYW5kZXJCdXR0b25PZlByb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJZGVudGlmaWVzIHRoZSBJc0V4cGFuZGVyQnV0dG9uT2YgZGVwZW5kZW5jeSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0Nvbm5lY3RpbmdMaW5lcy5PbklzRXhwYW5kZXJCdXR0b25PZlByb3BlcnR5Q2hhbmdlZChTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5T2JqZWN0LFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJc0V4cGFuZGVyQnV0dG9uT2ZQcm9wZXJ0eSBwcm9wZXJ0eSBjaGFuZ2VkIGhhbmRsZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkIj4NCisgICAgICAgICAgICBUb2dnbGVCdXR0b24gdGhhdCBjaGFuZ2VkIGl0cyBJc0V4cGFuZGVyQnV0dG9uT2YgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdDb25uZWN0aW5nTGluZXMuR2V0SXNIZWFkZXJPZihTeXN0ZW0uV2luZG93cy5GcmFtZXdvcmtFbGVtZW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdmFsdWUgb2YgdGhlIElzSGVhZGVyT2YgYXR0YWNoZWQgcHJvcGVydHkgZm9yIGEgc3BlY2lmaWVkDQorICAgICAgICAgICAgRnJhbWV3b3JrRWxlbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnQiPg0KKyAgICAgICAgICAgIFRoZSBGcmFtZXdvcmtFbGVtZW50IGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHJlYWQuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgSXNIZWFkZXJPZiBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIEZyYW1ld29ya0VsZW1lbnQuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdDb25uZWN0aW5nTGluZXMuU2V0SXNIZWFkZXJPZihTeXN0ZW0uV2luZG93cy5GcmFtZXdvcmtFbGVtZW50LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBJc0hlYWRlck9mIGF0dGFjaGVkIHByb3BlcnR5IHRvIGEgc3BlY2lmaWVkDQorICAgICAgICAgICAgRnJhbWV3b3JrRWxlbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnQiPg0KKyAgICAgICAgICAgIFRoZSBGcmFtZXdvcmtFbGVtZW50IHRvIHdoaWNoIHRoZSBhdHRhY2hlZCBwcm9wZXJ0eSBpcyB3cml0dGVuLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgbmVlZGVkIElzSGVhZGVyT2YgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Q29ubmVjdGluZ0xpbmVzLklzSGVhZGVyT2ZQcm9wZXJ0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWRlbnRpZmllcyB0aGUgSXNIZWFkZXJPZiBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3Q29ubmVjdGluZ0xpbmVzLk9uSXNIZWFkZXJPZlByb3BlcnR5Q2hhbmdlZChTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5T2JqZWN0LFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJc0hlYWRlck9mUHJvcGVydHkgcHJvcGVydHkgY2hhbmdlZCBoYW5kbGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZCI+DQorICAgICAgICAgICAgRnJhbWV3b3JrRWxlbWVudCB0aGF0IGNoYW5nZWQgaXRzIElzSGVhZGVyT2YgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyB1c2VmdWwgZXh0ZW5zaW9ucyB0byBUcmVlVmlldyBhbmQgVHJlZVZpZXdJdGVtIGluc3RhbmNlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPFF1YWxpdHlCYW5kPkV4cGVyaW1lbnRhbDwvUXVhbGl0eUJhbmQ+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuR2V0UGFyZW50SXRlbXNDb250cm9sKFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIHBhcmVudCBJdGVtc0NvbnRyb2wgb2YgYW4gZWxlbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnQiPlRoZSBlbGVtZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIHBhcmVudCBJdGVtc0NvbnRyb2wgb2YgYW4gZWxlbWVudCwgb3IgbnVsbCBpZiBub3QgZm91bmQuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkdldEFuY2VzdG9ySXRlbXNDb250cm9scyhTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5T2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSBhbmNlc3RvciBJdGVtc0NvbnRyb2xzIG9mIGFuIGVsZW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij5UaGUgZWxlbWVudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRoZSBhbmNlc3RvciBJdGVtc0NvbnRyb2xzIG9mIGFuIGVsZW1lbnQuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkdldFBhcmVudFRyZWVWaWV3SXRlbShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIHBhcmVudCBUcmVlVmlld0l0ZW0gb2YgYSBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgVHJlZVZpZXdJdGVtLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIHBhcmVudCBUcmVlVmlld0l0ZW0gaWYgZm91bmQsIG90aGVyd2lzZSBudWxsLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9Iml0ZW0iIC8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuR2V0UGFyZW50VHJlZVZpZXcoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSBwYXJlbnQgVHJlZVZpZXcgb2YgYSBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgVHJlZVZpZXdJdGVtLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIHBhcmVudCBUcmVlVmlldyBpZiBmb3VuZCwgb3RoZXJ3aXNlIG51bGwuPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iaXRlbSIgLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3RXh0ZW5zaW9ucy5HZXRDb250YWluZXJzKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSBUcmVlVmlld0l0ZW0gY29udGFpbmVycyBvZiBhIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlldyI+VGhlIFRyZWVWaWV3LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIFRyZWVWaWV3SXRlbSBjb250YWluZXJzIG9mIGEgVHJlZVZpZXcuPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0idmlldyIgLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3RXh0ZW5zaW9ucy5HZXRDb250YWluZXJzKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgY2hpbGQgVHJlZVZpZXdJdGVtIGNvbnRhaW5lcnMgb2YgYSBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgVHJlZVZpZXdJdGVtLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIGNoaWxkIFRyZWVWaWV3SXRlbSBjb250YWluZXJzIG9mIGEgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9Iml0ZW0iIC8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuR2V0SXRlbXNBbmRDb250YWluZXJzKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSBpdGVtcyBhbmQgVHJlZVZpZXdJdGVtIGNvbnRhaW5lcnMgb2YgYSBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZpZXciPlRoZSBUcmVlVmlldy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRoZSBpdGVtcyBhbmQgVHJlZVZpZXdJdGVtIGNvbnRhaW5lcnMgb2YgYSBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJ2aWV3IiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkdldEl0ZW1zQW5kQ29udGFpbmVycyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIGl0ZW1zIGFuZCBUcmVlVmlld0l0ZW0gY29udGFpbmVycyBvZiBhIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Iml0ZW0iPlRoZSBUcmVlVmlld0l0ZW0uPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgaXRlbXMgYW5kIFRyZWVWaWV3SXRlbSBjb250YWluZXJzIG9mIGEgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9Iml0ZW0iIC8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuR2V0RGVzY2VuZGFudENvbnRhaW5lcnMoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIFRyZWVWaWV3SXRlbSBjb250YWluZXJzIG9mIGEgVHJlZVZpZXcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2aWV3Ij5UaGUgVHJlZVZpZXcuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgVHJlZVZpZXdJdGVtIGNvbnRhaW5lcnMgb2YgYSBUcmVlVmlldy48L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJ2aWV3IiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkdldERlc2NlbmRhbnRDb250YWluZXJzKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgZGVzY2VuZGFudCBUcmVlVmlld0l0ZW0gY29udGFpbmVycyBvZiBhIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Iml0ZW0iPlRoZSBUcmVlVmlld0l0ZW0uPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgZGVzY2VuZGFudCBUcmVlVmlld0l0ZW0gY29udGFpbmVycyBvZiBhIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJpdGVtIiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkdldERlc2NlbmRhbnRJdGVtc0FuZENvbnRhaW5lcnMoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIGRlc2NlbmRhbnQgaXRlbXMgYW5kIFRyZWVWaWV3SXRlbSBjb250YWluZXJzIG9mIGEgVHJlZVZpZXcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2aWV3Ij5UaGUgVHJlZVZpZXcuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgZGVzY2VuZGFudCBpdGVtcyBhbmQgVHJlZVZpZXdJdGVtIGNvbnRhaW5lcnMgb2YgYSBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJ2aWV3IiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkdldERlc2NlbmRhbnRJdGVtc0FuZENvbnRhaW5lcnMoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSBkZXNjZW5kYW50IGl0ZW1zIGFuZCBUcmVlVmlld0l0ZW0gY29udGFpbmVycyBvZiBhDQorICAgICAgICAgICAgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIFRyZWVWaWV3SXRlbS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRoZSBkZXNjZW5kYW50IGl0ZW1zIGFuZCBUcmVlVmlld0l0ZW0gY29udGFpbmVycyBvZiBhIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJpdGVtIiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkdldERlc2NlbmRhbnRJdGVtc0FuZENvbnRhaW5lcnNJdGVyYXRvcihTeXN0ZW0uV2luZG93cy5Db250cm9scy5JdGVtc0NvbnRyb2wpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIGl0ZW1zIGFuZCBUcmVlVmlld0l0ZW0gY29udGFpbmVycyBvZiBhIFRyZWVWaWV3IG9yDQorICAgICAgICAgICAgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29udHJvbCI+VGhlIFRyZWVWaWV3IG9yIFRyZWVWaWV3SXRlbS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRoZSBpdGVtcyBhbmQgVHJlZVZpZXdJdGVtIGNvbnRhaW5lcnMgb2YgYSBUcmVlVmlldyBvciBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkdldFNpYmxpbmdJdGVtc0FuZENvbnRhaW5lcnMoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSBzaWJsaW5nIGl0ZW1zIGFuZCBjb250YWluZXJzIG9mIHRoZSBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIFRyZWVWaWV3SXRlbS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRoZSBzaWJsaW5nIGl0ZW1zIGFuZCBjb250YWluZXJzIG9mIHRoZSBpdGVtLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3RXh0ZW5zaW9ucy5HZXRDb250YWluZXJzRnJvbUl0ZW0oTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgVHJlZVZpZXdJdGVtcyBhbHJlYWR5IGNyZWF0ZWQgdGhhdCBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlDQorICAgICAgICAgICAgZ2l2ZW4gaXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZpZXciPlRoZSBUcmVlVmlldy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgaXRlbSBiZWluZyByZXByZXNlbnRlZC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgc2VxdWVuY2Ugb2YgVHJlZVZpZXdJdGVtcyB0aGF0IHJlcHJlc2VudCB0aGUgZ2l2ZW4gaXRlbSwgb3IgYW4NCisgICAgICAgICAgICBlbXB0eSBzZXF1ZW5jZSBpZiBub25lIHdlcmUgZm91bmQuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0idmlldyIgLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3RXh0ZW5zaW9ucy5HZXRDb250YWluZXJGcm9tSXRlbShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldyxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSBUcmVlVmlld0l0ZW0gYWxyZWFkeSBjcmVhdGVkIHRoYXQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlDQorICAgICAgICAgICAgZ2l2ZW4gaXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZpZXciPlRoZSBUcmVlVmlldy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgaXRlbSBiZWluZyByZXByZXNlbnRlZC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRoZSBUcmVlVmlld0l0ZW1zIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gaXRlbSwgb3IgbnVsbCBpZiBubw0KKyAgICAgICAgICAgIGNvbnRhaW5lciB3YXMgZm91bmQuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIElmIG11bHRpcGxlIFRyZWVWaWV3SXRlbXMgcmVwcmVzZW50IHRoZSBzYW1lIGl0ZW0sIHRoZSBmaXJzdCBpdGVtDQorICAgICAgICAgICAgZm91bmQgdmlhIGEgYnJlYWR0aC1maXJzdCBzZWFyY2ggd2lsbCBiZSB1c2VkLg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9InZpZXciIC8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuR2V0UGF0aChNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgcGF0aCBvZiBpdGVtcyBhbmQgVHJlZVZpZXdJdGVtIGNvbnRhaW5lcnMgZnJvbSB0aGUNCisgICAgICAgICAgICBUcmVlVmlld0l0ZW0gdG8gdGhlIHJvb3Qgb2YgdGhlIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIFRyZWVWaWV3SXRlbS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgcGF0aCBvZiBpdGVtcyBhbmQgVHJlZVZpZXdJdGVtIGNvbnRhaW5lcnMgZnJvbSB0aGUgVHJlZVZpZXdJdGVtIHRvDQorICAgICAgICAgICAgdGhlIHJvb3Qgb2YgdGhlIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9Iml0ZW0iIC8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuR2V0UGF0aEl0ZXJhdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSBwYXRoIG9mIGl0ZW1zIGFuZCBUcmVlVmlld0l0ZW0gY29udGFpbmVycyBmcm9tIHRoZQ0KKyAgICAgICAgICAgIFRyZWVWaWV3SXRlbSB0byB0aGUgcm9vdCBvZiB0aGUgVHJlZVZpZXcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgVHJlZVZpZXdJdGVtLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgQSBwYXRoIG9mIGl0ZW1zIGFuZCBUcmVlVmlld0l0ZW0gY29udGFpbmVycyBmcm9tIHRoZSBUcmVlVmlld0l0ZW0gdG8NCisgICAgICAgICAgICB0aGUgcm9vdCBvZiB0aGUgVHJlZVZpZXcuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkdldEl0ZW0oTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSBpdGVtIHdyYXBwZWQgYnkgdGhpcyBjb250YWluZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgVHJlZVZpZXdJdGVtLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIGl0ZW0gd3JhcHBlZCBieSB0aGUgY29udGFpbmVyLCBvciBudWxsIGlmIG5vdCBmb3VuZC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJpdGVtIiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkdldFBhcmVudEl0ZW0oTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgaXRlbSBvZiB0aGUgcGFyZW50IGNvbnRhaW5lciBmb3IgYSBzcGVjaWZpZWQNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iaXRlbSIgLz4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2aWV3Ij4NCisgICAgICAgICAgICBUaGUgVHJlZVZpZXcgY29udGFpbmluZyB0aGUgPHBhcmFtcmVmIG5hbWU9Iml0ZW0iIC8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Iml0ZW0iPlRoZSBjaGlsZCBpdGVtLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIGl0ZW0gb2YgdGhlIHBhcmVudCBjb250YWluZXIgZm9yIHRoZSBzcGVjaWZpZWQNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iaXRlbSIgLz4sIG9yIG51bGwgaWYgbm90IGZvdW5kLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3RXh0ZW5zaW9ucy5HZXRJc1Jvb3QoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgVHJlZVZpZXdJdGVtIGlzIGEgcm9vdCBvZiBpdHMNCisgICAgICAgICAgICBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Iml0ZW0iPlRoZSBUcmVlVmlld0l0ZW0uPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgVHJlZVZpZXdJdGVtIGlzIGEgcm9vdCBvZiBpdHMNCisgICAgICAgICAgICBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJpdGVtIiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkdldElzTGVhZihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBUcmVlVmlld0l0ZW0gaXMgYSBsZWFmIGluIGl0cw0KKyAgICAgICAgICAgIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIFRyZWVWaWV3SXRlbS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBUcmVlVmlld0l0ZW0gaXMgYSBsZWFmIGluIGl0cw0KKyAgICAgICAgICAgIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9Iml0ZW0iIC8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuR2V0RGVwdGgoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgZGVwdGggb2YgYSBUcmVlVmlld0l0ZW0gaW4gaXRzIFRyZWVWaWV3ICh1c2luZyBhIHplcm8tYmFzZWQNCisgICAgICAgICAgICBpbmRleCkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgVHJlZVZpZXdJdGVtLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIGRlcHRoIG9mIGEgVHJlZVZpZXdJdGVtIGluIGl0cyBUcmVlVmlldyAodXNpbmcgYSB6ZXJvLWJhc2VkDQorICAgICAgICAgICAgaW5kZXgpLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9Iml0ZW0iIC8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9Iml0ZW0iIC8+IGlzIG5vdCBpbiBhIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkdldFNlbGVjdGVkQ29udGFpbmVyKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSBzZWxlY3RlZCBUcmVlVmlld0l0ZW0gaW4gYSBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZpZXciPlRoZSBUcmVlVmlldy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRoZSBzZWxlY3RlZCBUcmVlVmlld0l0ZW0sIG9yIG51bGwgaWYgbm8gc2VsZWN0ZWQgaXRlbSBmb3VuZC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJ2aWV3IiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLlNldFNlbGVjdGVkQ29udGFpbmVyKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNldHMgdGhlIHNlbGVjdGVkIFRyZWVWaWV3SXRlbSBvZiBhIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlldyI+VGhlIFRyZWVWaWV3LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Iml0ZW0iPlRoZSBUcmVlVmlld0l0ZW0gdG8gc2VsZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJ2aWV3IiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkNsZWFyU2VsZWN0aW9uKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2xlYXIgdGhlIHNlbGVjdGlvbiBvZiB0aGUgVHJlZVZpZXcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2aWV3Ij5UaGUgVHJlZVZpZXcuPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9InZpZXciIC8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuU2VsZWN0SXRlbShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldyxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2VsZWN0IGFuIGl0ZW0gaW4gdGhlIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlldyI+VGhlIFRyZWVWaWV3LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Iml0ZW0iPlRoZSBpdGVtIHRvIHNlbGVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpdGVtIHdhcyBzdWNjZXNzZnVsbHkgc2V0IGFzIHRoZQ0KKyAgICAgICAgICAgIFRyZWVWaWV3J3MgU2VsZWN0ZWRJdGVtLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9InZpZXciIC8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuR2V0U2VsZWN0ZWRQYXRoKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgcGF0aCB0byB0aGUgVHJlZVZpZXcncyBzZWxlY3RlZCBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlldyI+VGhlIFRyZWVWaWV3LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIHBhdGggdG8gdGhlIFRyZWVWaWV3J3Mgc2VsZWN0ZWQgaXRlbS48L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJ2aWV3IiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkV4cGFuZE9yQ29sbGFwc2VBbGwoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5JbnQzMixTeXN0ZW0uTnVsbGFibGV7U3lzdGVtLkludDMyfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlY3Vyc2l2ZWx5IGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgVHJlZVZpZXdJdGVtIGFuZCBhbGwgb2YgaXRzDQorICAgICAgICAgICAgZGVzY2VuZGFudHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgVHJlZVZpZXdJdGVtLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGFuZCI+DQorICAgICAgICAgICAgQSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gZXhwYW5kIG9yIGNvbGxhcHNlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlcHRoIj4NCisgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGxldmVscyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGNvbGxhcHNlZCBvciBleHBhbmRlZC4NCisgICAgICAgICAgICBUaGlzIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgb3B0aW9uYWwgbWF4aW11bURlcHRoIHRvIG9ubHkNCisgICAgICAgICAgICBleHBhbmQgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGxheWVycy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtYXhpbXVtRGVwdGgiPg0KKyAgICAgICAgICAgIEFuIG9wdGlvbmFsIGRlcHRoIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGxheWVycyB0byBleHBhbmQgb3INCisgICAgICAgICAgICBjb2xsYXBzZS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkV4cGFuZE9yQ29sbGFwc2VBbGwoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcsU3lzdGVtLkJvb2xlYW4sU3lzdGVtLk51bGxhYmxle1N5c3RlbS5JbnQzMn0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeHBhbmQgb3IgY29sbGFwc2UgYWxsIG9mIHRoZSBkZXNjZW5kYW50cyBvZiB0aGUgVHJlZVZpZXcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2aWV3Ij5UaGUgVHJlZVZpZXcuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwYW5kIj4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0byBleHBhbmQgb3IgY29sbGFwc2UuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWF4aW11bURlcHRoIj4NCisgICAgICAgICAgICBBbiBvcHRpb25hbCBkZXB0aCB0aGF0IGRlZmluZXMgdGhlIG51bWJlciBvZiBsYXllcnMgdG8gZXhwYW5kIG9yDQorICAgICAgICAgICAgY29sbGFwc2UuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3RXh0ZW5zaW9ucy5FeHBhbmRBbGwoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeHBhbmQgYWxsIG9mIHRoZSBpdGVtcyBpbiBhIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlldyI+VGhlIFRyZWVWaWV3LjwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJ2aWV3IiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkNvbGxhcHNlQWxsKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29sbGFwc2UgYWxsIG9mIHRoZSBpdGVtcyBpbiBhIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlldyI+VGhlIFRyZWVWaWV3LjwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJ2aWV3IiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkV4cGFuZFRvRGVwdGgoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcsU3lzdGVtLkludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRXhwYW5kIGEgc3BlY2lmaWVkIG51bWJlciBvZiBsYXllcnMgaW4gYSBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZpZXciPlRoZSBUcmVlVmlldy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZXB0aCI+VGhlIG51bWJlciBvZiBsYXllcnMgdG8gZXhwYW5kLjwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJ2aWV3IiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkV4cGFuZFBhdGhUb1Jvb3QoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtLFN5c3RlbS5Cb29sZWFuKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRXhwYW5kIGEgcGF0aCBmcm9tIHRoZSBnaXZlbiBpdGVtIHRvIHRoZSByb290IG9mIGl0J3MgVHJlZVZpZXcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgVHJlZVZpZXdJdGVtLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxhcHNlU2libGluZ3MiPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGNvbGxhcHNlIHNpYmxpbmdzIHdoaWxlIGV4cGFuZGluZyB0aGUNCisgICAgICAgICAgICBwYXRoLiAgVGhpcyB3aWxsIHJlc3VsdCBpbiBvbmx5IHRoZSBwYXRoIGZyb20gdGhlIGl0ZW0gdG8gdGhlIHJvb3QNCisgICAgICAgICAgICBiZWluZyBleHBhbmRlZC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkV4cGFuZFBhdGgoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRXhwYW5kIGEgcGF0aCBmcm9tIHRoZSBUcmVlVmlld0l0ZW0gdG8gdGhlIHJvb3Qgb2YgdGhlIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIFRyZWVWaWV3SXRlbS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iaXRlbSIgLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3RXh0ZW5zaW9ucy5FeHBhbmRTZWxlY3RlZFBhdGgoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeHBhbmQgdGhlIHBhdGggZnJvbSB0aGUgU2VsZWN0ZWRJdGVtIHRvIHRoZSByb290IG9mIHRoZSBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZpZXciPlRoZSBUcmVlVmlldy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0idmlldyIgLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3RXh0ZW5zaW9ucy5Db2xsYXBzZUFsbEJ1dFNlbGVjdGVkUGF0aChNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbGxhcHNlIGFsbCBUcmVlVmlld0l0ZW1zIGV4Y2VwdCB0aG9zZSBhbG9uZyB0aGUgcGF0aCBmcm9tIHRoZQ0KKyAgICAgICAgICAgIFRyZWVWaWV3J3MgU2VsZWN0ZWRJdGVtIHRvIHRoZSByb290IG9mIHRoZSBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZpZXciPlRoZSBUcmVlVmlldy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0idmlldyIgLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3RXh0ZW5zaW9ucy5FeHBhbmRQYXRoKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEV4cGFuZCB0aGUgZ2l2ZW4gcGF0aCBvZiBpdGVtcyBzdGFydGluZyBmcm9tIHRoZSBUcmVlVmlldydzIHJvb3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2aWV3Ij5UaGUgVHJlZVZpZXcuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbXMiPg0KKyAgICAgICAgICAgIFRoZSBzZXF1ZW5jZSBvZiBpdGVtcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXRoIHRvIGV4cGFuZC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0idmlldyIgLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9Iml0ZW1zIiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkV4cGFuZFBhdGhgYDEoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcsU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUVudW1lcmFibGV7YGAwfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEV4cGFuZCB0aGUgZ2l2ZW4gcGF0aCBvZiBpdGVtcyBzdGFydGluZyBmcm9tIHRoZSBUcmVlVmlldydzIHJvb3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVCI+DQorICAgICAgICAgICAgVGhlIHR5cGUgb2YgaXRlbXMgcHJvdmlkZWQgaW4gPHBhcmFtcmVmIG5hbWU9Iml0ZW1zIiAvPi4NCisgICAgICAgICAgICA8L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlldyI+VGhlIFRyZWVWaWV3LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Iml0ZW1zIj4NCisgICAgICAgICAgICBUaGUgc2VxdWVuY2Ugb2YgaXRlbXMgY29ycmVzcG9uZGluZyB0byB0aGUgcGF0aCB0byBleHBhbmQuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9InZpZXciIC8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJpdGVtcyIgLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3RXh0ZW5zaW9ucy5FeHBhbmRQYXRoYGAxKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3LFN5c3RlbS5GdW5je1N5c3RlbS5PYmplY3QsYGAwfSxgYDBbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEV4cGFuZCB0aGUgZ2l2ZW4gcGF0aCBvZiBpdGVtcyBzdGFydGluZyBmcm9tIHRoZSBUcmVlVmlldydzIHJvb3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVCI+DQorICAgICAgICAgICAgVGhlIHR5cGUgb2YgaXRlbXMgcHJvdmlkZWQgaW4gPHBhcmFtcmVmIG5hbWU9Iml0ZW1zIiAvPi4NCisgICAgICAgICAgICA8L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlldyI+VGhlIFRyZWVWaWV3LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbXBhcmlzb25TZWxlY3RvciI+DQorICAgICAgICAgICAgQSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgVHJlZVZpZXdJdGVtJ3MgaXRlbSBhbmQgcmV0dXJucyBhIHZhbHVlIHRvDQorICAgICAgICAgICAgY29tcGFyZSBhZ2FpbnN0IGVsZW1lbnRzIG9mIHRoZSBnaXZlbiA8cGFyYW1yZWYgbmFtZT0iaXRlbXMiIC8+Lg0KKyAgICAgICAgICAgIFRoZSBpdGVtIGl0c2VsZiB3aWxsIGJlIHVzZWQgaWYgDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImNvbXBhcmlzb25TZWxlY3RvciIgLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtcyI+DQorICAgICAgICAgICAgVGhlIHNlcXVlbmNlIG9mIGl0ZW1zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhdGggdG8gZXhwYW5kLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJ2aWV3IiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iaXRlbXMiIC8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuRXhwYW5kUGF0aGBgMShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldyxTeXN0ZW0uRnVuY3tTeXN0ZW0uT2JqZWN0LGBgMH0sU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUVudW1lcmFibGV7YGAwfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEV4cGFuZCB0aGUgZ2l2ZW4gcGF0aCBvZiBpdGVtcyBzdGFydGluZyBmcm9tIHRoZSBUcmVlVmlldydzIHJvb3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVCI+DQorICAgICAgICAgICAgVGhlIHR5cGUgb2YgaXRlbXMgcHJvdmlkZWQgaW4gPHBhcmFtcmVmIG5hbWU9Iml0ZW1zIiAvPi4NCisgICAgICAgICAgICA8L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlldyI+VGhlIFRyZWVWaWV3LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbXBhcmlzb25TZWxlY3RvciI+DQorICAgICAgICAgICAgQSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgVHJlZVZpZXdJdGVtJ3MgaXRlbSBhbmQgcmV0dXJucyBhIHZhbHVlIHRvDQorICAgICAgICAgICAgY29tcGFyZSBhZ2FpbnN0IGVsZW1lbnRzIG9mIHRoZSBnaXZlbiA8cGFyYW1yZWYgbmFtZT0iaXRlbXMiIC8+Lg0KKyAgICAgICAgICAgIFRoZSBpdGVtIGl0c2VsZiB3aWxsIGJlIHVzZWQgaWYgDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImNvbXBhcmlzb25TZWxlY3RvciIgLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtcyI+DQorICAgICAgICAgICAgVGhlIHNlcXVlbmNlIG9mIGl0ZW1zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhdGggdG8gZXhwYW5kLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJ2aWV3IiAvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iaXRlbXMiIC8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuR2V0SXNDaGVja2VkKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBJc0NoZWNrZWQgYXR0YWNoZWQgcHJvcGVydHkgZm9yIGEgc3BlY2lmaWVkDQorICAgICAgICAgICAgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+DQorICAgICAgICAgICAgVGhlIFRyZWVWaWV3SXRlbSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyByZWFkLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIElzQ2hlY2tlZCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuU2V0SXNDaGVja2VkKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSxTeXN0ZW0uTnVsbGFibGV7U3lzdGVtLkJvb2xlYW59KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0cyB0aGUgdmFsdWUgb2YgdGhlIElzQ2hlY2tlZCBhdHRhY2hlZCBwcm9wZXJ0eSB0byBhIHNwZWNpZmllZA0KKyAgICAgICAgICAgIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnQiPg0KKyAgICAgICAgICAgIFRoZSBUcmVlVmlld0l0ZW0gdG8gd2hpY2ggdGhlIGF0dGFjaGVkIHByb3BlcnR5IGlzIHdyaXR0ZW4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBuZWVkZWQgSXNDaGVja2VkIHZhbHVlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuSXNDaGVja2VkUHJvcGVydHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIElkZW50aWZpZXMgdGhlIElzQ2hlY2tlZCBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3RXh0ZW5zaW9ucy5PbklzQ2hlY2tlZFByb3BlcnR5Q2hhbmdlZChTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5T2JqZWN0LFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJc0NoZWNrZWRQcm9wZXJ0eSBwcm9wZXJ0eSBjaGFuZ2VkIGhhbmRsZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkIj5UaGUgVHJlZVZpZXdJdGVtIHRoYXQgY2hhbmdlZCBJc0NoZWNrZWQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuR2V0QXNzb2NpYXRlZENoZWNrQm94KE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBBc3NvY2lhdGVkQ2hlY2tCb3ggYXR0YWNoZWQgcHJvcGVydHkgZm9yIGENCisgICAgICAgICAgICBzcGVjaWZpZWQgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+DQorICAgICAgICAgICAgVGhlIFRyZWVWaWV3SXRlbSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyByZWFkLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIEFzc29jaWF0ZWRDaGVja0JveCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuU2V0QXNzb2NpYXRlZENoZWNrQm94KE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW1DaGVja0JveCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBBc3NvY2lhdGVkQ2hlY2tCb3ggYXR0YWNoZWQgcHJvcGVydHkgdG8gYQ0KKyAgICAgICAgICAgIHNwZWNpZmllZCBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij4NCisgICAgICAgICAgICBUaGUgVHJlZVZpZXdJdGVtIHRvIHdoaWNoIHRoZSBhdHRhY2hlZCBwcm9wZXJ0eSBpcyB3cml0dGVuLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgbmVlZGVkIEFzc29jaWF0ZWRDaGVja0JveCB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkFzc29jaWF0ZWRDaGVja0JveFByb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJZGVudGlmaWVzIHRoZSBBc3NvY2lhdGVkQ2hlY2tCb3ggZGVwZW5kZW5jeSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0V4dGVuc2lvbnMuT25Bc3NvY2lhdGVkQ2hlY2tCb3hQcm9wZXJ0eUNoYW5nZWQoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCxTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5UHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzb2NpYXRlZENoZWNrQm94UHJvcGVydHkgcHJvcGVydHkgY2hhbmdlZCBoYW5kbGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZCI+DQorICAgICAgICAgICAgVGhlIFRyZWVWaWV3SXRlbSB0aGF0IGNoYW5nZWQgaXRzIEFzc29jaWF0ZWRDaGVja0JveC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3RXh0ZW5zaW9ucy5HZXRDaGVja2VkSXRlbXNBbmRDb250YWluZXJzKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSBzZXF1ZW5jZSBvZiBpdGVtcyBhbmQgY29udGFpbmVycyB3aXRoIHRoZWlyIElzQ2hlY2tlZA0KKyAgICAgICAgICAgIHByb3BlcnR5IHNldCB0byBUcnVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlldyI+VGhlIFRyZWVWaWV3LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIHNlcXVlbmNlIG9mIGl0ZW1zIGFuZCBjb250YWluZXJzIHdpdGggdGhlaXIgSXNDaGVja2VkIHByb3BlcnR5DQorICAgICAgICAgICAgc2V0IHRvIFRydWUuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0idmlldyIvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkdldENoZWNrZWRJdGVtc0FuZENvbnRhaW5lcnMoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXcsU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIHNlcXVlbmNlIG9mIGl0ZW1zIGFuZCBjb250YWluZXJzIHdpdGggdGhlaXIgSXNDaGVja2VkDQorICAgICAgICAgICAgcHJvcGVydHkgc2V0IHRvIFRydWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2aWV3Ij5UaGUgVHJlZVZpZXcuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5jbHVkZUluZGV0ZXJtaW5hdGUiPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGluY2x1ZGUgVHJlZVZpZXdJdGVtcyB3aXRoIGFuDQorICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZSBJc0NoZWNrZWQgdmFsdWUuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgc2VxdWVuY2Ugb2YgaXRlbXMgYW5kIGNvbnRhaW5lcnMgd2l0aCB0aGVpciBJc0NoZWNrZWQgcHJvcGVydHkNCisgICAgICAgICAgICBzZXQgdG8gVHJ1ZSBvciBhbHNvIHNldCB0byBudWxsIGlmIGluZGV0ZXJtaW5hdGUgdmFsdWVzIGFyZQ0KKyAgICAgICAgICAgIGluY2x1ZGVkLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9InZpZXciLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3RXh0ZW5zaW9ucy5DYW5jZWxJc0NoZWNrZWRDaGFuZ2VkQnViYmxpbmciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciByZWN1cnNpdmUgY2FsbHMgdG8NCisgICAgICAgICAgICBPbklzQ2hlY2tlZFByb3BlcnR5Q2hhbmdlZCBzaG91bGQgaWdub3JlIHRoZWlyIG5vdGlmaWNhdGlvbnMgb3INCisgICAgICAgICAgICBwcm9jZXNzIHRoZW0gYWNjb3JkaW5nbHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdFeHRlbnNpb25zLkNhbmNlbElzQ2hlY2tlZENoYW5nZWRDaGlsZE5vdGlmaWNhdGlvbnMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciByZWN1cnNpdmUgY2FsbHMgdG8NCisgICAgICAgICAgICBPbklzQ2hlY2tlZFByb3BlcnR5Q2hhbmdlZCBzaG91bGQgdXBkYXRlIHRoZWlyIGNoaWxkcmVuIHdoZW4gdGhlaXINCisgICAgICAgICAgICBJc0NoZWNrZWQgdmFsdWUgaGFzIGNoYW5nZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtQ2hlY2tCb3giPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcHJlc2VudHMgYSBDaGVja0JveCB3aG9zZSB2YWx1ZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlDQorICAgICAgICAgICAgVHJlZVZpZXdFeHRlbnNpb25zLklzQ2hlY2tlZCBhdHRhY2hlZCBwcm9wZXJ0eSBvZiBUcmVlVmlld0l0ZW1zLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8UXVhbGl0eUJhbmQ+RXhwZXJpbWVudGFsPC9RdWFsaXR5QmFuZD4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbUNoZWNrQm94Ll9wYXJlbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBwYXJlbnQgVHJlZVZpZXdJdGVtIG9mIHRoZSBDaGVja0JveC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW1DaGVja0JveC4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFRyZWVWaWV3SXRlbUNoZWNrQm94IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbUNoZWNrQm94LkFzc29jaWF0ZVBhcmVudFRyZWVWaWV3SXRlbSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzb2NpYXRlIHRoZSBwYXJlbnQgVHJlZVZpZXdJdGVtIHdpdGggdGhlIENoZWNrQm94Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbUNoZWNrQm94Lk9uSXNDaGVja2VkQ2hhbmdlZChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5XaW5kb3dzLlJvdXRlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVwZGF0ZSB0aGUgVHJlZVZpZXdJdGVtJ3MgSXNDaGVja2VkIHByb3BlcnR5IHdoZW4gdGhpcyBJc0NoZWNrZWQNCisgICAgICAgICAgICBwcm9wZXJ0eSBpcyBjaGFuZ2VkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgQ2hlY2tCb3guPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW1DaGVja0JveC5QYXJlbnRUcmVlVmlld0l0ZW0iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHBhcmVudCBUcmVlVmlld0l0ZW0gb2YgdGhlIENoZWNrQm94Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbUNvbm5lY3RpbmdMaW5lSW5mbyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVwcmVzZW50cyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGRyYXcgY29ubmVjdGluZyBsaW5lcyBpbiBhDQorICAgICAgICAgICAgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8UXVhbGl0eUJhbmQ+RXhwZXJpbWVudGFsPC9RdWFsaXR5QmFuZD4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbUNvbm5lY3RpbmdMaW5lSW5mby4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgVHJlZVZpZXdJdGVtQ29ubmVjdGluZ0xpbmVJbmZvDQorICAgICAgICAgICAgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgVHJlZVZpZXdJdGVtLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW1Db25uZWN0aW5nTGluZUluZm8uUG9zaXRpb25Db25uZWN0aW5nTGluZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFBvc2l0aW9uIHRoZSBjb25uZWN0aW5nIGxpbmVzIGluIHRoZSBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtQ29ubmVjdGluZ0xpbmVJbmZvLlBvc2l0aW9uVmVydGljYWxDb25uZWN0aW5nTGluZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUG9zaXRpb24gdGhlIHZlcnRpY2FsIGNvbm5lY3RpbmcgbGluZSBpbiB0aGUgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbUNvbm5lY3RpbmdMaW5lSW5mby5JdGVtIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtQ29ubmVjdGluZ0xpbmVJbmZvLlZlcnRpY2FsQ29ubmVjdGluZ0xpbmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdmVydGljYWwgY29ubmVjdGluZyBsaW5lIG9mIHRoZSBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtQ29ubmVjdGluZ0xpbmVJbmZvLkhvcml6b250YWxDb25uZWN0aW5nTGluZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBob3Jpem9udGFsIGNvbm5lY3RpbmcgbGluZSBvZiB0aGUgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbUNvbm5lY3RpbmdMaW5lSW5mby5FeHBhbmRlckJ1dHRvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBleHBhbmRlciBidXR0b24gb2YgdGhlIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW1Db25uZWN0aW5nTGluZUluZm8uSGVhZGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIGhlYWRlciBvZiB0aGUgVHJlZVZpZXdJdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbUluZGVudGF0aW9uQ29udmVydGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBVc2VkIHRvIGNvbnZlcnQgVHJlZVZpZXdJdGVtcyBpbnRvIGEgdmFsdWUgYmFzZWQgb24gdGhlaXIgZGVwdGggaW4NCisgICAgICAgICAgICB0aGUgVHJlZVZpZXcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5FeHBlcmltZW50YWw8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtSW5kZW50YXRpb25Db252ZXJ0ZXIuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBUcmVlVmlld0l0ZW1JbmRlbnRhdGlvbkNvbnZlcnRlcg0KKyAgICAgICAgICAgIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbUluZGVudGF0aW9uQ29udmVydGVyLkNvbnZlcnQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5HbG9iYWxpemF0aW9uLkN1bHR1cmVJbmZvKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29udmVydCBhIFRyZWVWaWV3SXRlbSBpbnRvIGEgdmFsdWUgYmFzZWQgb24gdGhlIGRlcHRoIG9mIHRoZSBpdGVtDQorICAgICAgICAgICAgaW4gdGhlIFRyZWVWaWV3Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBUcmVlVmlld0l0ZW0uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGFyZ2V0VHlwZSI+DQorICAgICAgICAgICAgVGhlIGluZGVudGF0aW9uIHR5cGUgdG8gY29udmVydCB0byAoc3VjaCBhcyBUaGlja25lc3Mgb3IgZG91YmxlKS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXIiPg0KKyAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcGl4ZWxzIHRvIGluZGVudCBlYWNoIGxldmVsIG9mIHRoZSBUcmVlVmlldy4gIEENCisgICAgICAgICAgICBkZWZhdWx0IHZhbHVlIG9mIDE1LjAgd2lsbCBiZSB1c2VkIGlmIG5vIHBhcmFtZXRlciBpcyBwcm92aWRlZC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjdWx0dXJlIj4NCisgICAgICAgICAgICBUaGUgY3VsdHVyZSB1c2VkIHRvIGNvbnZlcnQgdGhlIFRyZWVWaWV3SXRlbS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgdmFsdWUgYmFzZWQgb24gdGhlIGRlcHRoIG9mIHRoZSBpdGVtIGluIHRoZSBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW1JbmRlbnRhdGlvbkNvbnZlcnRlci5XcmFwSW5kZW50YXRpb24oU3lzdGVtLkRvdWJsZSxTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyYXAgdGhlIGluZGVudGF0aW9uIGluIHRoZSBkZXNpcmVkIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbmRlbnRhdGlvbiI+DQorICAgICAgICAgICAgVGhlIG51bWJlciBvZiBwaXhlbHMgdG8gaW5kZW50IHRoZSBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGFyZ2V0VHlwZSI+DQorICAgICAgICAgICAgVGhlIGluZGVudGF0aW9uIHR5cGUgdG8gY29udmVydCB0byAoc3VjaCBhcyBUaGlja25lc3Mgb3IgZG91YmxlKS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgdmFsdWUgYmFzZWQgb24gdGhlIGRlcHRoIG9mIHRoZSBpdGVtIGluIHRoZSBUcmVlVmlldy4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW1JbmRlbnRhdGlvbkNvbnZlcnRlci5Db252ZXJ0QmFjayhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5UeXBlLFN5c3RlbS5PYmplY3QsU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb252ZXJ0IGFuIGluZGVudGF0aW9uIGJhY2sgaW50byBhIFRyZWVWaWV3SXRlbS4gIFRoaXMgYWx3YXlzIHRocm93cw0KKyAgICAgICAgICAgIGEgTm90U3VwcG9ydGVkRXhjZXB0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBpbmRlbnRhdGlvbi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YXJnZXRUeXBlIj5UaGUgdHlwZSBvZiB0aGUgaW5kZW50YXRpb24uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVyIj4NCisgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHBpeGVscyB0byBpbmRlbnQgZWFjaCBsZXZlbCBvZiB0aGUgVHJlZVZpZXcuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3VsdHVyZSI+DQorICAgICAgICAgICAgVGhlIGN1bHR1cmUgdXNlZCB0byBjb252ZXJ0IHRoZSBUcmVlVmlld0l0ZW0uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5BbHdheXMgdGhyb3dzIGEgTm90U3VwcG9ydGVkRXhjZXB0aW9uLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5WYWxpZGF0ZUV4dGVuc2lvbnMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgc2V0IG9mIHNpbXBsZSBleHRlbnNpb24gbWV0aG9kcyBmb3IgYXBwbGljYXRpb25zLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5WYWxpZGF0ZUV4dGVuc2lvbnMuSWZBcHBsaWNhdGlvbkhvc3QoU3lzdGVtLldpbmRvd3MuQXBwbGljYXRpb24pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDaGVja3Mgd2hldGhlciB0aGUgYXBwbGljYXRpb24gaG9zdCBvYmplY3QgaXMgbm90IG51bGwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcHAiPlRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG9iamVjdCBpcyBub3QgbnVsbC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVmFsaWRhdGVFeHRlbnNpb25zLklmQXBwbGljYXRpb25Ib3N0U291cmNlKFN5c3RlbS5XaW5kb3dzLkFwcGxpY2F0aW9uKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2hlY2tzIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGhvc3QgYW5kIGl0cyBzb3VyY2Ugb2JqZWN0IGlzIG5vdA0KKyAgICAgICAgICAgIG51bGwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcHAiPlRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG9iamVjdCBpcyBub3QgbnVsbC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVmlzaWJpbGl0eUNvbnZlcnRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB2YWx1ZSBjb252ZXJ0ZXIgZm9yIGNvbGxhcHNpbmcgb3Igc2hvd2luZyBlbGVtZW50cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVmlzaWJpbGl0eUNvbnZlcnRlci5Db252ZXJ0KFN5c3RlbS5PYmplY3QsU3lzdGVtLlR5cGUsU3lzdGVtLk9iamVjdCxTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mbykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnZlcnQgYSBib29sZWFuIHZhbHVlIHRvIGEgVmlzaWJpbGl0eSB2YWx1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgdmFsdWUgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGFyZ2V0VHlwZSI+VGhlIHRhcmdldCBwYXJhbWV0ZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVyIj5Db252ZXJ0ZXJQYXJhbWV0ZXIgaXMgb2YgdHlwZSBWaXNpYmlsaXR5LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImN1bHR1cmUiPlRoZSBjdWx0dXJlIHBhcmFtZXRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgdGhlIG9iamVjdC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVmlzaWJpbGl0eUNvbnZlcnRlci5Db252ZXJ0QmFjayhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5UeXBlLFN5c3RlbS5PYmplY3QsU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdXBwb3J0IHR3by13YXkgZGF0YWJpbmRpbmcgb2YgdGhlIFZpc2liaWxpdHlDb252ZXJ0ZXIsIGNvbnZlcnRpbmcgDQorICAgICAgICAgICAgVmlzaWJpbGl0eSB0byBhIGJvb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRhcmdldFR5cGUiPlRoZSB0YXJnZXQgcGFyYW1ldGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlciI+Q29udmVydGVyUGFyYW1ldGVyIGlzIG9mIHR5cGUgVmlzaWJpbGl0eS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjdWx0dXJlIj5UaGUgY3VsdHVyZSBwYXJhbWV0ZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRoZSBvYmplY3QuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlZpc2liaWxpdHlDb252ZXJ0ZXIuR2V0VmlzaWJpbGl0eU1vZGUoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERldGVybWluZSB0aGUgdmlzaWJpbGl0eSBtb2RlIGJhc2VkIG9uIGEgY29udmVydGVyIHBhcmFtZXRlci4gVGhpcw0KKyAgICAgICAgICAgIHBhcmFtZXRlciBpcyBvZiB0eXBlIFZpc2liaWxpdHksYW5kIHNwZWNpZmllcyB3aGF0IHZpc2liaWxpdHkgdmFsdWUNCisgICAgICAgICAgICB0byByZXR1cm4gd2hlbiB0aGUgYm9vbGVhbiB2YWx1ZSBpcyB0cnVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVyIj5UaGUgcGFyYW1ldGVyIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSBWaXNpYmlsaXR5IHZhbHVlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5WaXNpYmlsaXR5Q29udmVydGVyLklzVmlzaWJpbGl0eUludmVydGVkKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZXRlcm1pbmUgd2hldGhlciBvciBub3QgdmlzaWJpbGl0eSBpcyBpbnZlcnRlZCBiYXNlZCBvbiBhIGNvbnZlcnRlcg0KKyAgICAgICAgICAgIHBhcmFtZXRlci4gV2hlbiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBhcyBDb2xsYXBzZWQsIHRoYXQgbWVhbnMNCisgICAgICAgICAgICB0aGF0IHdoZW4gdGhlIGJvb2xlYW4gdmFsdWUgaXMgdHJ1ZSwgd2Ugc2hvdWxkIHJldHVybiBDb2xsYXBzZWQsDQorICAgICAgICAgICAgd2hpY2ggaXMgaW52ZXJ0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXIiPlRoZSBwYXJhbWV0ZXIgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmlzaWJpbGl0eSBpcyANCisgICAgICAgICAgICBpbnZlcnRlZC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVmlzdWFsU3RhdGVzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWaXN1YWwgc3RhdGVzIGhlbHBlciBjb2RlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5WaXN1YWxTdGF0ZXMuR2V0SW1wbGVtZW50YXRpb25Sb290KFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBpbXBsZW1lbnRhdGlvbiByb290IG9mIHRoZSBDb250cm9sLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVwZW5kZW5jeU9iamVjdCI+VGhlIERlcGVuZGVuY3lPYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBJbXBsZW1lbnRzIFNpbHZlcmxpZ2h0J3MgY29ycmVzcG9uZGluZyBpbnRlcm5hbCBwcm9wZXJ0eSBvbiBDb250cm9sLg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiByb290IG9yIG51bGwuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlZpc3VhbFN0YXRlcy5UcnlHZXRWaXN1YWxTdGF0ZUdyb3VwKFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoaXMgbWV0aG9kIHRyaWVzIHRvIGdldCB0aGUgbmFtZWQgVmlzdWFsU3RhdGVHcm91cCBmb3IgdGhlIA0KKyAgICAgICAgICAgIGRlcGVuZGVuY3kgb2JqZWN0LiBUaGUgcHJvdmlkZWQgb2JqZWN0J3MgSW1wbGVtZW50YXRpb25Sb290IHdpbGwgYmUgDQorICAgICAgICAgICAgbG9va2VkIHVwIGluIHRoaXMgY2FsbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlcGVuZGVuY3lPYmplY3QiPlRoZSBkZXBlbmRlbmN5IG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJncm91cE5hbWUiPlRoZSB2aXN1YWwgc3RhdGUgZ3JvdXAncyBuYW1lLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBudWxsIG9yIHRoZSBWaXN1YWxTdGF0ZUdyb3VwIG9iamVjdC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxUcmVlRXh0ZW5zaW9ucyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvdmlkZXMgdXNlZnVsIGV4dGVuc2lvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgdmlzdWFsIHRyZWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIFNpbmNlIG1hbnkgb2YgdGhlc2UgZXh0ZW5zaW9uIG1ldGhvZHMgYXJlIGRlY2xhcmVkIG9uIHR5cGVzIGxpa2UNCisgICAgICAgICAgICBEZXBlbmRlbmN5T2JqZWN0IGhpZ2ggdXAgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeSwgd2UndmUgcGxhY2VkIHRoZW0gaW4NCisgICAgICAgICAgICB0aGUgUHJpbWl0aXZlcyBuYW1lc3BhY2Ugd2hpY2ggaXMgbGVzcyBsaWtlbHkgdG8gYmUgaW1wb3J0ZWQgZm9yIG5vcm1hbA0KKyAgICAgICAgICAgIHNjZW5hcmlvcy4NCisgICAgICAgICAgICA8L3JlbWFya3M+DQorICAgICAgICAgICAgPFF1YWxpdHlCYW5kPkV4cGVyaW1lbnRhbDwvUXVhbGl0eUJhbmQ+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxUcmVlRXh0ZW5zaW9ucy5HZXRWaXN1YWxBbmNlc3RvcnMoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgdmlzdWFsIHRyZWUgYW5jZXN0b3JzIG9mIGFuIGVsZW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij5UaGUgZWxlbWVudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRoZSB2aXN1YWwgdHJlZSBhbmNlc3RvcnMgb2YgdGhlIGVsZW1lbnQuPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iZWxlbWVudCIvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsVHJlZUV4dGVuc2lvbnMuR2V0VmlzdWFsQW5jZXN0b3JzQW5kU2VsZihTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5T2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSB2aXN1YWwgdHJlZSBhbmNlc3RvcnMgb2YgYW4gZWxlbWVudCBhbmQgdGhlIGVsZW1lbnQgaXRzZWxmLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+VGhlIGVsZW1lbnQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgdmlzdWFsIHRyZWUgYW5jZXN0b3JzIG9mIGFuIGVsZW1lbnQgYW5kIHRoZSBlbGVtZW50IGl0c2VsZi4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJlbGVtZW50Ii8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxUcmVlRXh0ZW5zaW9ucy5HZXRWaXN1YWxBbmNlc3RvcnNBbmRTZWxmSXRlcmF0b3IoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgdmlzdWFsIHRyZWUgYW5jZXN0b3JzIG9mIGFuIGVsZW1lbnQgYW5kIHRoZSBlbGVtZW50IGl0c2VsZi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnQiPlRoZSBlbGVtZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIHZpc3VhbCB0cmVlIGFuY2VzdG9ycyBvZiBhbiBlbGVtZW50IGFuZCB0aGUgZWxlbWVudCBpdHNlbGYuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsVHJlZUV4dGVuc2lvbnMuR2V0VmlzdWFsQ2hpbGRyZW4oU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgdmlzdWFsIHRyZWUgY2hpbGRyZW4gb2YgYW4gZWxlbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnQiPlRoZSBlbGVtZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIHZpc3VhbCB0cmVlIGNoaWxkcmVuIG9mIGFuIGVsZW1lbnQuPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iZWxlbWVudCIvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsVHJlZUV4dGVuc2lvbnMuR2V0VmlzdWFsQ2hpbGRyZW5BbmRTZWxmKFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIHZpc3VhbCB0cmVlIGNoaWxkcmVuIG9mIGFuIGVsZW1lbnQgYW5kIHRoZSBlbGVtZW50IGl0c2VsZi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnQiPlRoZSBlbGVtZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIHZpc3VhbCB0cmVlIGNoaWxkcmVuIG9mIGFuIGVsZW1lbnQgYW5kIHRoZSBlbGVtZW50IGl0c2VsZi4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJlbGVtZW50Ii8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxUcmVlRXh0ZW5zaW9ucy5HZXRWaXN1YWxDaGlsZHJlbkFuZFNlbGZJdGVyYXRvcihTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5T2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSB2aXN1YWwgdHJlZSBjaGlsZHJlbiBvZiBhbiBlbGVtZW50IGFuZCB0aGUgZWxlbWVudCBpdHNlbGYuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij5UaGUgZWxlbWVudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRoZSB2aXN1YWwgdHJlZSBjaGlsZHJlbiBvZiBhbiBlbGVtZW50IGFuZCB0aGUgZWxlbWVudCBpdHNlbGYuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsVHJlZUV4dGVuc2lvbnMuR2V0VmlzdWFsRGVzY2VuZGFudHMoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgdmlzdWFsIHRyZWUgZGVzY2VuZGFudHMgb2YgYW4gZWxlbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnQiPlRoZSBlbGVtZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIHZpc3VhbCB0cmVlIGRlc2NlbmRhbnRzIG9mIGFuIGVsZW1lbnQuPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iZWxlbWVudCIvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsVHJlZUV4dGVuc2lvbnMuR2V0VmlzdWFsRGVzY2VuZGFudHNBbmRTZWxmKFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIHZpc3VhbCB0cmVlIGRlc2NlbmRhbnRzIG9mIGFuIGVsZW1lbnQgYW5kIHRoZSBlbGVtZW50DQorICAgICAgICAgICAgaXRzZWxmLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+VGhlIGVsZW1lbnQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgdmlzdWFsIHRyZWUgZGVzY2VuZGFudHMgb2YgYW4gZWxlbWVudCBhbmQgdGhlIGVsZW1lbnQgaXRzZWxmLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImVsZW1lbnQiLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFRyZWVFeHRlbnNpb25zLkdldFZpc3VhbERlc2NlbmRhbnRzQW5kU2VsZkl0ZXJhdG9yKFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIHZpc3VhbCB0cmVlIGRlc2NlbmRhbnRzIG9mIGFuIGVsZW1lbnQgYW5kIHRoZSBlbGVtZW50DQorICAgICAgICAgICAgaXRzZWxmLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+VGhlIGVsZW1lbnQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgdmlzdWFsIHRyZWUgZGVzY2VuZGFudHMgb2YgYW4gZWxlbWVudCBhbmQgdGhlIGVsZW1lbnQgaXRzZWxmLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFRyZWVFeHRlbnNpb25zLkdldFZpc3VhbFNpYmxpbmdzKFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIHZpc3VhbCB0cmVlIHNpYmxpbmdzIG9mIGFuIGVsZW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij5UaGUgZWxlbWVudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRoZSB2aXN1YWwgdHJlZSBzaWJsaW5ncyBvZiBhbiBlbGVtZW50LjwvcmV0dXJucz4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImVsZW1lbnQiLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFRyZWVFeHRlbnNpb25zLkdldFZpc3VhbFNpYmxpbmdzQW5kU2VsZihTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5T2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSB2aXN1YWwgdHJlZSBzaWJsaW5ncyBvZiBhbiBlbGVtZW50IGFuZCB0aGUgZWxlbWVudCBpdHNlbGYuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij5UaGUgZWxlbWVudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRoZSB2aXN1YWwgdHJlZSBzaWJsaW5ncyBvZiBhbiBlbGVtZW50IGFuZCB0aGUgZWxlbWVudCBpdHNlbGYuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iZWxlbWVudCIvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsVHJlZUV4dGVuc2lvbnMuR2V0Qm91bmRzUmVsYXRpdmVUbyhTeXN0ZW0uV2luZG93cy5GcmFtZXdvcmtFbGVtZW50LFN5c3RlbS5XaW5kb3dzLlVJRWxlbWVudCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgYm91bmRzIG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gYW5vdGhlciBlbGVtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+VGhlIGVsZW1lbnQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ib3RoZXJFbGVtZW50Ij4NCisgICAgICAgICAgICBUaGUgZWxlbWVudCByZWxhdGl2ZSB0byB0aGUgb3RoZXIgZWxlbWVudC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRoZSBib3VuZHMgb2YgdGhlIGVsZW1lbnQgcmVsYXRpdmUgdG8gYW5vdGhlciBlbGVtZW50LCBvciBudWxsIGlmDQorICAgICAgICAgICAgdGhlIGVsZW1lbnRzIGFyZSBub3QgcmVsYXRlZC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJlbGVtZW50Ii8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJvdGhlckVsZW1lbnQiLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFRyZWVFeHRlbnNpb25zLkludm9rZU9uTGF5b3V0VXBkYXRlZChTeXN0ZW0uV2luZG93cy5GcmFtZXdvcmtFbGVtZW50LFN5c3RlbS5BY3Rpb24pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQZXJmb3JtIGFuIGFjdGlvbiB3aGVuIHRoZSBlbGVtZW50J3MgTGF5b3V0VXBkYXRlZCBldmVudCBmaXJlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnQiPlRoZSBlbGVtZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdGlvbiI+VGhlIGFjdGlvbiB0byBwZXJmb3JtLjwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJlbGVtZW50Ii8+IGlzIG51bGwuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3Rpb24iLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFRyZWVFeHRlbnNpb25zLkdldExvZ2ljYWxDaGlsZHJlbihTeXN0ZW0uV2luZG93cy5GcmFtZXdvcmtFbGVtZW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0cmlldmVzIGFsbCB0aGUgbG9naWNhbCBjaGlsZHJlbiBvZiBhIGZyYW1ld29yayBlbGVtZW50IHVzaW5nIGEgDQorICAgICAgICAgICAgYnJlYWR0aC1maXJzdCBzZWFyY2guIEZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoaXMgbWV0aG9kIG1hbnVhbGx5IA0KKyAgICAgICAgICAgIG1hbmFnZXMgdGhlIHN0YWNrIGluc3RlYWQgb2YgdXNpbmcgcmVjdXJzaW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyZW50Ij5UaGUgcGFyZW50IGZyYW1ld29yayBlbGVtZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIGxvZ2ljYWwgY2hpbGRyZW4gb2YgdGhlIGZyYW1ld29yayBlbGVtZW50LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFRyZWVFeHRlbnNpb25zLkdldExvZ2ljYWxEZXNjZW5kZW50cyhTeXN0ZW0uV2luZG93cy5GcmFtZXdvcmtFbGVtZW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0cmlldmVzIGFsbCB0aGUgbG9naWNhbCBkZXNjZW5kZW50cyBvZiBhIGZyYW1ld29yayBlbGVtZW50IHVzaW5nIGEgDQorICAgICAgICAgICAgYnJlYWR0aC1maXJzdCBzZWFyY2guIEZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoaXMgbWV0aG9kIG1hbnVhbGx5IA0KKyAgICAgICAgICAgIG1hbmFnZXMgdGhlIHN0YWNrIGluc3RlYWQgb2YgdXNpbmcgcmVjdXJzaW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyZW50Ij5UaGUgcGFyZW50IGZyYW1ld29yayBlbGVtZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIGxvZ2ljYWwgY2hpbGRyZW4gb2YgdGhlIGZyYW1ld29yayBlbGVtZW50LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvZGVDb3ZlcmFnZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIENvZGVDb3ZlcmFnZSBjbGFzcyBpcyB1c2VkIHRvIGNvbGxlY3QgY29kZSBjb3ZlcmFnZSBpbmZvcm1hdGlvbiBmcm9tDQorICAgICAgICAgICAgYXNzZW1ibGllcyB0aGF0IGhhdmUgYmVlbiBpbnN0cnVtZW50ZWQgdG8gY2FsbCB0aGUgVmlzaXQgZnVuY3Rpb24gYXQgdGhlDQorICAgICAgICAgICAgYmVnaW5uaW5nIG9mIGV2ZXJ5IGJhc2ljIGJsb2NrLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvZGVDb3ZlcmFnZS5fYmxvY2tzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIGJpdCBhcnJheSB1c2VkIHRvIHRyYWNrIHdoaWNoIGJhc2ljIGJsb2NrcyBoYXZlIGJlZW4gZXhlY3V0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29kZUNvdmVyYWdlLl9oaXRCbG9ja3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgY291bnRlciBvZiB0aGUgaGl0IGJsb2Nrcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db2RlQ292ZXJhZ2UuVmlzaXQoU3lzdGVtLlVJbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlY29yZCB0aGF0IGEgYmFzaWMgYmxvY2sgaXMgYmVpbmcgZXhlY3V0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpZCI+SWQgb2YgdGhlIGJhc2ljIGJsb2NrLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db2RlQ292ZXJhZ2UuR2V0Q292ZXJhZ2VEYXRhIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIGNvdmVyYWdlIGRhdGEgc2VyaWFsaXplZCBhcyBhIHN0cmluZyBmb3IgZWFzeSB0cmFuc3BvcnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZW1hcmtzPlByZXZpb3VzIHJlbGVhc2VzIG9mIHRoZSBmcmFtZXdvcmsgdXNlZCBhIHNpbXBsaXN0aWMgYml0DQorICAgICAgICAgICAgbGlzdCwgdGhpcyByZWxlYXNlIHVwZGF0ZXMgdGhlIGNvdmVyYWdlIHJlcG9ydGluZyBlbmRwb2ludCB0byBhbg0KKyAgICAgICAgICAgIGFsdGVybmF0ZSB2ZXJzaW9uIHRoYXQgZW5kcyBpbiBiYXNlIDY0LiBUaGlzIG1haW50YWlucyB0ZXN0IHJ1bm5lcg0KKyAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyBvZmZpY2lhbCByZWxlYXNlcy48L3JlbWFya3M+DQorICAgICAgICAgICAgPHJldHVybnM+Q292ZXJhZ2UgZGF0YSBzZXJpYWxpemVkIGFzIGEgc3RyaW5nLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvZGVDb3ZlcmFnZS5IaXRCbG9ja0NvdW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBjdXJyZW50IG51bWJlciBvZiBoaXQgYmxvY2tzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvZGVDb3ZlcmFnZS5CbG9ja0NvdW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGJsb2NrcyBjb3VudGVyLiBUaGlzIGlzIG5vdCBhY3R1YWxseSANCisgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGhpdCBibG9ja3MsIGJ1dCBpdCBzaG91bGQgcmV0dXJuIDAgYWx3YXlzIGV4Y2VwdCANCisgICAgICAgICAgICB3aGVuIGF0IGxlYXN0IG9uZSBibG9jayBpcyBoaXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ3VzdG9tRnJhbWV3b3JrVW5pdFRlc3QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhc2UgY2xhc3MgZm9yIHRlc3QgY2FzZXMgdGhhdCB1c2Ugc3BlY2lhbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSANCisgICAgICAgICAgICBNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZyB1bml0IHRlc3QgZnJhbWV3b3JrLg0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIFRlc3RzIHRoYXQgZGVyaXZlIGZyb20gQ3VzdG9tVGVzdCBpbiBtb3N0IGNhc2VzIHdpbGwgbm90IGJlIHNvdXJjZS0gb3IgDQorICAgICAgICAgICAgZnVuY3Rpb25hbGl0eS0gY29tcGF0aWJsZSB3aXRoIHRoZSBtb3JlIGFkdmFuY2VkIGRlc2t0b3AgVmlzdWFsIFN0dWRpbyANCisgICAgICAgICAgICBUZXN0IFRlYW0gZW52aXJvbm1lbnQgYW5kIGhhcm5lc3Nlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DdXN0b21GcmFtZXdvcmtVbml0VGVzdC5IYW5kbGVFeGNlcHRpb24oU3lzdGVtLkV4Y2VwdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb2Nlc3MgYW4gZXhjZXB0aW9uIHVzaW5nIHRoZSB0ZXN0IGVuZ2luZSBsb2dpYyBmb3IgDQorICAgICAgICAgICAgRXhwZWN0ZWRFeGNlcHRpb25zIGFuZCBsb2dnaW5nIHRoZSBleGNlcHRpb24gaWYgbmVlZGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXgiPkV4Y2VwdGlvbiBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkN1c3RvbUZyYW1ld29ya1VuaXRUZXN0LkludGVyY2VwdFVuaGFuZGxlZEV4Y2VwdGlvbnMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBnbG9iYWwgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgDQorICAgICAgICAgICAgc2hvdWxkIGJlIGludGVyY2VwdGVkIGJ5IHRoZSB0ZXN0IGhhcm5lc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ3VzdG9tRnJhbWV3b3JrVW5pdFRlc3QuVW5pdFRlc3RIYXJuZXNzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIHVuaXQgdGVzdCBoYXJuZXNzIGluc3RhbmNlLiAgSGlkZGVuIGZyb20gdGhlIFZTIA0KKyAgICAgICAgICAgIGJyb3dzZXIgYXMgdGVzdCBkZXZlbG9wZXJzIHNob3VsZCBub3QgbmVlZCB0byB1c2UgdGhpcyBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DdXN0b21GcmFtZXdvcmtVbml0VGVzdC5Xb3JrSXRlbUNvbnRhaW5lciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgY3VycmVudCB0ZXN0IHRhc2sgY29udGFpbmVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgY3VycmVudCBjb250YWluZXIgZm9yIHRoZSB0ZXN0J3MgdGFza3MuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkRhdGFNYW5hZ2VyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNYW5hZ2VzIHRoZSB1bml0IHRlc3Qgc3RhdHVzIGFuZCBtb2RlbCBieSBhdHRhY2hpbmcgdG8gdGhlIHVuaXQgdGVzdA0KKyAgICAgICAgICAgIGhhcm5lc3MgaW5zdGFuY2UuIFZhbGlkYXRlcyB0aGF0IGFsbCBrZXkgbG9nZ2luZyBjYW4gYmUgZG9uZSB3aXRob3V0DQorICAgICAgICAgICAgc3BlY2lhbCBob29rcyBpbnNpZGUgb2YgdGhlIHVuaXQgdGVzdCBoYXJuZXNzIGltcGxlbWVudGF0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5EYXRhTWFuYWdlci5faCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHVuaXQgdGVzdCBoYXJuZXNzIGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5EYXRhTWFuYWdlci5fZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3QgcnVuIGRhdGEuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkRhdGFNYW5hZ2VyLl9hc3NlbWJseURhdGEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1hcCBhc3NlbWJseSBtZXRhZGF0YSB0byBkYXRhIG9iamVjdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkRhdGFNYW5hZ2VyLl9jbGFzc0RhdGEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1hcCB0ZXN0IGNsYXNzIG1ldGFkYXRhIHRvIGRhdGEgb2JqZWN0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuRGF0YU1hbmFnZXIuX21ldGhvZERhdGEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1hcCB0ZXN0IG1ldGFkYXRhIHRvIGRhdGEgb2JqZWN0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuRGF0YU1hbmFnZXIuX2xhc3RSZXN1bHQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIHRoZSBsYXN0IHJlc3VsdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuRGF0YU1hbmFnZXIuX2xhc3RGYWlsaW5nUmVzdWx0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCYWNraW5nIGZpZWxkIGZvciB0aGUgbGFzdCBmYWlsaW5nIHJlc3VsdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuRGF0YU1hbmFnZXIuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRGF0YU1hbmFnZXIgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imhhcm5lc3MiPlRoZSB1bml0IHRlc3QgaGFybmVzcyBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkRhdGFNYW5hZ2VyLkNyZWF0ZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBEYXRhTWFuYWdlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imhhcm5lc3MiPlRoZSB1bml0IHRlc3QgaGFybmVzcyBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgYSBEYXRhTWFuYWdlciBjbGFzcy48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuRGF0YU1hbmFnZXIuSG9vayI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29ubmVjdCB0byB1bml0IHRlc3QgaGFybmVzcyBldmVudHMgZm9yIHByb2Nlc3NpbmcgYW5kIHVwZGF0aW5nIHRoZQ0KKyAgICAgICAgICAgIHVuZGVybHlpbmcgdW5pdCB0ZXN0IHJ1biBtb2RlbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuRGF0YU1hbmFnZXIuVW5ob29rIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBVbmhvb2sgZnJvbSB0aGUgdW5pdCB0ZXN0IGhhcm5lc3MgZXZlbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5EYXRhTWFuYWdlci5PblRlc3RSdW5TdGFydGluZyhTeXN0ZW0uT2JqZWN0LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFJ1blN0YXJ0aW5nRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvY2VzcyB0aGUgc3RhcnRpbmcgb2YgdGhlIHRlc3QgcnVuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgc291cmNlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgZGF0YS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkRhdGFNYW5hZ2VyLk9uVGVzdENsYXNzU3RhcnRpbmcoU3lzdGVtLk9iamVjdCxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc1N0YXJ0aW5nRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvY2VzcyB0aGUgdGVzdCBjbGFzcyBzdGFydGluZyBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGRhdGEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5EYXRhTWFuYWdlci5PblRlc3RDbGFzc0NvbXBsZXRlZChTeXN0ZW0uT2JqZWN0LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdENsYXNzQ29tcGxldGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvY2VzcyB0aGUgdGVzdCBjbGFzcyBjb21wbGV0ZSBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGRhdGEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5EYXRhTWFuYWdlci5PblRlc3RNZXRob2RTdGFydGluZyhTeXN0ZW0uT2JqZWN0LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE1ldGhvZFN0YXJ0aW5nRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvY2VzcyB0aGUgc3RhcnQgb2YgYSB0ZXN0IG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGRhdGEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5EYXRhTWFuYWdlci5PblRlc3RNZXRob2RDb21wbGV0ZWQoU3lzdGVtLk9iamVjdCxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RDb21wbGV0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm9jZXNzIHRoZSBjb21wbGV0aW9uIG9mIHRlc3QgbWV0aG9kcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGRhdGEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5EYXRhTWFuYWdlci5Qcm9jZXNzUmVzdWx0KE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuU2NlbmFyaW9SZXN1bHQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm9jZXNzIGEgcmVzdWx0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icmVzdWx0Ij5UaGUgcmVzdWx0IGRhdGEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5EYXRhTWFuYWdlci5HZXRBc3NlbWJseU1vZGVsKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklBc3NlbWJseSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3IgY3JlYXRlcyB0aGUgZGF0YSBtb2RlbCBvYmplY3QgZm9yIGFuIGFzc2VtYmx5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXNzZW1ibHkiPlRoZSB0ZXN0IGFzc2VtYmx5LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgZGF0YSBvYmplY3QuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkRhdGFNYW5hZ2VyLkdldENsYXNzTW9kZWwoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RDbGFzcykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3IgY3JlYXRlcyB0aGUgZGF0YSBtb2RlbCBvYmplY3QgZm9yIGEgdGVzdCBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RDbGFzcyI+VGhlIHRlc3QgY2xhc3MuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRoZSBkYXRhIG9iamVjdC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuRGF0YU1hbmFnZXIuR2V0TWV0aG9kTW9kZWwoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2QsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RDbGFzc0RhdGEpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIGNyZWF0ZXMgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IGZvciBhIHRlc3QgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdE1ldGhvZCI+VGhlIHRlc3QgbWV0aG9kLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmVudFRlc3RDbGFzcyI+VGhlIHBhcmVudCB0ZXN0IGNsYXNzIGRhdGEgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgZGF0YSBvYmplY3QuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkRhdGFNYW5hZ2VyLlVuaXRUZXN0SGFybmVzcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdW5pdCB0ZXN0IGhhcm5lc3MgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkRhdGFNYW5hZ2VyLkRhdGEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHVuaXQgdGVzdCBtb2RlbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdEFzc2VtYmx5RGF0YSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBkYXRhIG9iamVjdCBzdG9yaW5nIHRoZSBoaWVyYXJjaGljYWwgcmVzdWx0cyBmb3IgYSB0ZXN0IGFzc2VtYmx5IGluIGENCisgICAgICAgICAgICB0ZXN0IHJ1bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuUHJvcGVydHlDaGFuZ2VkQmFzZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBiYXNlIGNsYXNzIGZvciBtb2RlbCBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZSBwcm9wZXJ0eQ0KKyAgICAgICAgICAgIGNoYW5nZWQgaW50ZXJmYWNlLCB0byBzaW1wbGlmeSBjYWxsaW5nIHRoZSBjaGFuZ2UgaGFuZGxlcnMsDQorICAgICAgICAgICAgYW5kIGNhY2hlIHRoZSB1bmRlcmx5aW5nIGV2ZW50IGFyZ3VtZW50IGluc3RhbmNlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuUHJvcGVydHlDaGFuZ2VkQmFzZS5fYXJndW1lbnRJbnN0YW5jZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgc3RhdGljIHNldCBvZiBjaGFuZ2UgYXJndW1lbnQgaW5zdGFuY2VzLCBldmVudHVhbGx5DQorICAgICAgICAgICAgc3RvcmluZyBvbmUgYXJndW1lbnQgaW5zdGFuY2UgZm9yIGVhY2ggcHJvcGVydHkgbmFtZSB0bw0KKyAgICAgICAgICAgIHJlZHVjZSBjaHVybiBhdCBydW50aW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Qcm9wZXJ0eUNoYW5nZWRCYXNlLk5vdGlmeVByb3BlcnR5Q2hhbmdlZChTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTm90aWZ5IGFueSBsaXN0ZW5lcnMgdGhhdCB0aGUgcHJvcGVydHkgdmFsdWUgaGFzIGNoYW5nZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwcm9wZXJ0eU5hbWUiPlRoZSBwcm9wZXJ0eSBuYW1lLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuUHJvcGVydHlDaGFuZ2VkQmFzZS5Qcm9wZXJ0eUNoYW5nZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBjaGFuZ2VkIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5JUHJvdmlkZVJlc3VsdFJlcG9ydHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgdHlwZSB0aGF0IHByb3ZpZGVzIGEgc3RyaW5nIHJlc3VsdCByZXBvcnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LklQcm92aWRlUmVzdWx0UmVwb3J0cy5HZXRSZXN1bHRSZXBvcnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdlbmVyYXRlcyBhIHNpbXBsZSB0ZXh0IHJlc3VsdCByZXBvcnQgZm9yIHRoZSBtZXRhZGF0YS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+UmVwb3J0cyBhIHRleHQgcmVwb3J0LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0QXNzZW1ibHlEYXRhLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklBc3NlbWJseSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBUZXN0QXNzZW1ibHlEYXRhIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0QXNzZW1ibHkiPlRoZSB0ZXN0IGFzc2VtYmx5IG1ldGFkYXRhLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdEFzc2VtYmx5RGF0YS5fZXhwYW5kZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIHRoZSBleHBhbmRlZCBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdEFzc2VtYmx5RGF0YS5fcGFzc2VkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCYWNraW5nIGZpZWxkIGZvciBhIHBhc3NlZCB2YWx1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdEFzc2VtYmx5RGF0YS5fY2xhc3NlcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFja2luZyBzdG9yZSBmb3IgdGhlIHNldCBvZiB0ZXN0IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0QXNzZW1ibHlEYXRhLkdldFJlc3VsdFJlcG9ydCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0cmlldmVzIHRoZSByZXN1bHRzIHJlcG9ydC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSByZXBvcnQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RBc3NlbWJseURhdGEuSXNFeHBhbmRlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpdGVtIGlzIGV4cGFuZGVkIGluDQorICAgICAgICAgICAgYSBoaWVyYXJjaGljYWwgZGlzcGxheS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdEFzc2VtYmx5RGF0YS5Jc0NoZWNrZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgY2hlY2tlZCB2YWx1ZS4gRG9uJ3QgdGhpbmsgdGhpcyBpcyBhY3R1YWxseSB1c2VkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0QXNzZW1ibHlEYXRhLlBhc3NlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0ZXN0IHBhc3NlZC4gSWYgZmFpbGVkLA0KKyAgICAgICAgICAgIHdpbGwgcHJvcGFnYXRlIHRvIHRoZSBwYXJlbnQgbWV0YWRhdGEgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0QXNzZW1ibHlEYXRhLk5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIG5hbWUgb2YgdGhlIGFzc2VtYmx5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0QXNzZW1ibHlEYXRhLlRlc3RDbGFzc2VzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGFuIG9ic2VydmFibGUgY29sbGVjdGlvbiBvZiB0ZXN0IGNsYXNzIGRhdGEgb2JqZWN0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERhdGEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgZGF0YSBvYmplY3QgdGhhdCBnZW5lcmF0ZXMgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYW5kIGNhbg0KKyAgICAgICAgICAgIGJlIHVzZWQgZm9yIHJpY2ggZGF0YSBiaW5kaW5nIHRvIHRlc3QgcmVzdWx0cy4gRG9lcyBrZWVwIGEgcmVmZXJlbmNlDQorICAgICAgICAgICAgdG8gYWxsIHJlc3VsdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RNZXRob2REYXRhLl9tZXRhZGF0YSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3RvcmVzIHRoZSB0ZXN0IG1ldGhvZCBtZXRhZGF0YS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERhdGEuX3BhcmVudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUGFyZW50IGRhdGEgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5faXNSdW5uaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGVzdCBpcyBjdXJyZW50bHkgZXhlY3V0aW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5fcmVzdWx0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdGVzdCBvdXRjb21lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5fcHJldmlvdXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIGxpbmtlZCBkYXRhLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5fbmV4dCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFja2luZyBmaWVsZCBmb3IgbGlua2VkIGRhdGEuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RNZXRob2REYXRhLl9wcmV2aW91c0ZhaWx1cmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIGxpbmtlZCBkYXRhLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5fbmV4dEZhaWx1cmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIGxpbmtlZCBkYXRhLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZCxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdENsYXNzRGF0YSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBUZXN0TWV0aG9kRGF0YSB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdE1ldGhvZCI+VGhlIHRlc3QgbWV0aG9kIG1ldGFkYXRhLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmVudCI+VGhlIHRlc3QgY2xhc3MgdGhhdCBpcyB0aGUgcGFyZW50IG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RNZXRob2REYXRhLkNoZWNrRm9yS25vd25CdWdzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSdW5zIHRocm91Z2ggdGhlIG1ldGFkYXRhIGZvciBidWdzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5fa25vd25CdWdzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCYWNraW5nIGZpZWxkIGZvciBrbm93biBidWdzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5fZml4ZWRCdWdzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCYWNraW5nIGZpZWxkIGZvciBidWdzIHRoYXQgYXJlIG1hcmtlZCBmaXhlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERhdGEuRXZhbHVhdGVOb3RhYmxlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDYWxjdWxhdGVzIHdoZXRoZXIgdGhlIGl0ZW0gaXMgY29uc2lkZXJlZCAibm90YWJsZSIsIGluIHRoYXQgaXQNCisgICAgICAgICAgICBzaG91bGQgaGF2ZSBhIHZpc3VhbCBjdWUgb3IgaGludCBmb3IgdGhlIHVzZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RNZXRob2REYXRhLl9pc05vdGFibGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN0b3JlcyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVzdWx0IGlzIG5vdGFibGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RNZXRob2REYXRhLl9jaGVja2VkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCYWNraW5nIGZpZWxkIGZvciB0aGUgY2hlY2tlZCBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERhdGEuX2V4cGFuZGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCYWNraW5nIGZpZWxkIGZvciB0aGUgZXhwYW5kZWQgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RNZXRob2REYXRhLkdldFJlc3VsdFJlcG9ydCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0cmlldmVzIHRoZSByZXN1bHRzIHJlcG9ydC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSByZXBvcnQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RNZXRob2REYXRhLlJlc3VsdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSByZXN1bHQgb2YgdGhlIHRlc3QgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5Lbm93bkJ1Z3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGtub3duIGJ1Z3MgZm9yIGRpc3BsYXkgaW4gdGhlIFVJLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5GaXhlZEJ1Z3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGZpeGVkIGJ1Z3MgZm9yIGRpc3BsYXkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RNZXRob2REYXRhLlNpbXBsaWZpZWRFeHBlY3RlZEV4Y2VwdGlvbk5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiBuYW1lIGZvciBhIG5lZ2F0aXZlIHRlc3QsIGlmIGFueS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERhdGEuU2ltcGxpZmllZEV4Y2VwdGlvblN0YWNrVHJhY2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSBzaW1wbGlmaWVkIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB0aGF0IG9taXRzIHRoZSB0cmFjZSBiZWxvdw0KKyAgICAgICAgICAgIHRoZSBpbnZva2Ugb2YgdGhlIHRlc3QgbWV0aG9kIGJ5IHRoZSB0ZXN0IGZyYW1ld29yay4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERhdGEuU2ltcGxpZmllZEV4Y2VwdGlvbk5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHNob3J0LCBzaW1wbGUgbmFtZSBvZiB0aGUgZXhjZXB0aW9uIHR5cGUgcmVjb3JkZWQgaW4gdGhlDQorICAgICAgICAgICAgdGVzdCByZXN1bHQsIGlmIGFueS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERhdGEuSGFzT3V0Y29tZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWV0aG9kIGhhcyByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5QYXNzZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1ldGhvZCBoYXMgcGFzc2VkLiBSZXR1cm5zIA0KKyAgICAgICAgICAgIHRydWUgdW50aWwgdGhlcmUgaXMgYSByZXN1bHQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RNZXRob2REYXRhLklzUnVubmluZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0ZXN0IG1ldGhvZCBpcyBydW5uaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5Jc05vdGFibGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVzdWx0IGlzIG5vdGFibGUuIA0KKyAgICAgICAgICAgIE5vdGFibGUgaXMgZGVmaW5lZCBhcyBlaXRoZXIgY3VycmVudGx5IHJ1bm5pbmcsIG9yIG5vdCBoYXZpbmcgDQorICAgICAgICAgICAgcGFzc2VkLiBUaGlzIGNhbiBhbGxvdyBhIHVzZXIgaW50ZXJmYWNlIHRvIHJlYWN0IHRvIGFuIA0KKyAgICAgICAgICAgIGludGVyZXN0aW5nIHJlc3VsdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERhdGEuUGFyZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBwYXJlbnQgZGF0YSBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RNZXRob2REYXRhLk1ldGFkYXRhIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGFuIGluc3RhbmNlIG9mIHRoZSBhY3R1YWwgbWV0YWRhdGEgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5OYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERhdGEuSGFzRGVzY3JpcHRpb25WaXNpYmlsaXR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmlzaWJpbGl0eSB2YWx1ZSB0byBhbGxvdyBmb3IgZWFzeSBzaG93aW5nIG9yDQorICAgICAgICAgICAgaGlkaW5nIG9mIGEgdXNlciBpbnRlcmZhY2UgY29tcG9uZW50IHRoYXQgZGlzcGxheXMgdGhlDQorICAgICAgICAgICAgZGVzY3JpcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSB2aXNpYmlsaXR5IHZhbHVlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5SZWFkYWJsZUVsYXBzZWRUaW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBlbGFwc2VkIHRpbWUgaW4gYSByZWFkYWJsZSBmb3JtYXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSBzdHJpbmcgb2YgdGhlIHJlYWRhYmxlIHRpbWUgZWxhcHNlZC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERhdGEuRGVzY3JpcHRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0IG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERhdGEuSXNDaGVja2VkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGl0ZW0gaXMgY2hlY2tlZCBpbiB0aGUNCisgICAgICAgICAgICB1c2VyIGludGVyZmFjZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERhdGEuSXNFeHBhbmRlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpdGVtIGlzIGV4cGFuZGVkIGluDQorICAgICAgICAgICAgYSBoaWVyYXJjaGljYWwgZGlzcGxheS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdE1ldGhvZERhdGEuUHJldmlvdXNSZXN1bHQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgcHJldmlvdXMgcmVzdWx0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5OZXh0UmVzdWx0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIG5leHQgcmVzdWx0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0TWV0aG9kRGF0YS5QcmV2aW91c0ZhaWxpbmdSZXN1bHQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgcHJldmlvdXMgZmFpbGluZyByZXN1bHQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RNZXRob2REYXRhLk5leHRGYWlsaW5nUmVzdWx0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIG5leHQgZmFpbGluZyByZXN1bHQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5Db2RlQ292ZXJhZ2VQcm92aWRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBwcm92aWRlciBvZiBjb2RlIGNvdmVyYWdlIGluZm9ybWF0aW9uIHRvIGFuIGV4dGVybmFsIHByb2Nlc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5Qcm92aWRlckJhc2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBiYXNlIGNsYXNzIGZvciB0ZXN0IHNlcnZpY2UgcHJvdmlkZXJzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuUHJvdmlkZXJCYXNlLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlcixTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgYmFzZSBwcm92aWRlciBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InByb3ZpZGVyIj5UaGUgb3duaW5nIHRlc3Qgc2VydmljZSBwcm92aWRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkaXNwbGF5TmFtZSI+VGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgc2VydmljZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5Qcm92aWRlckJhc2UuSW5pdGlhbGl6ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIHByb3ZpZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuUHJvdmlkZXJCYXNlLkluY3JlbWVudEJ1c3lTZXJ2aWNlQ291bnRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5jcmVtZW50cyB0aGUgYnVzeSBzZXJ2aWNlIGNvdW50ZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5Qcm92aWRlckJhc2UuRGVjcmVtZW50QnVzeVNlcnZpY2VDb3VudGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZWNyZW1lbnRzIHRoZSBidXN5IHNlcnZpY2UgY291bnRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlByb3ZpZGVyQmFzZS5JbnZva2VNZXRob2QoU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbnZva2VzIGEgbWV0aG9kIG9uIHRoaXMgcHJvdmlkZXIgdXNpbmcgcmVmbGVjdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1ldGhvZE5hbWUiPlRoZSBuYW1lIG9mIHRoZSBtZXRob2QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVycyI+VGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuUHJvdmlkZXJCYXNlLk9uSW5pdGlhbGl6ZUNvbXBsZXRlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2FsbCB0aGUgSW5pdGlhbGl6ZUNvbXBsZXRlZCBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlByb3ZpZGVyQmFzZS5DYWxsYmFjayhTeXN0ZW0uQWN0aW9ue01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2VydmljZVJlc3VsdH0sTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TZXJ2aWNlUmVzdWx0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUGVyZm9ybXMgYSBjYWxsYmFjay4gIE51bGwgYWN0aW9uIGFuZC9vciByZXN1bHQgYXJlIHBlcm1pdHRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdGlvbiI+VGhlIG9wdGlvbmFsIGNhbGxiYWNrIGFjdGlvbi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyZXN1bHQiPlRoZSByZXN1bHQgdG8gcGFzcyBiYWNrLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlByb3ZpZGVyQmFzZS5Jbml0aWFsaXplQ29tcGxldGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFdmVudCBmaXJlZCBvbmNlIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuUHJvdmlkZXJCYXNlLkRpc3BsYXlOYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBwcm92aWRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlByb3ZpZGVyQmFzZS5UZXN0U2VydmljZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgb3duaW5nIHRlc3Qgc2VydmljZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlByb3ZpZGVyQmFzZS5Jbml0aWFsaXplZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgcHJvdmlkZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgDQorICAgICAgICAgICAgeWV0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuQ29kZUNvdmVyYWdlUHJvdmlkZXIuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U2VydmljZVByb3ZpZGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgY29kZSBjb3ZlcmFnZSBwcm92aWRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RTZXJ2aWNlIj5UaGUgdGVzdCBzZXJ2aWNlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLkNvZGVDb3ZlcmFnZVByb3ZpZGVyLlNhdmVDb3ZlcmFnZURhdGEoU3lzdGVtLlN0cmluZyxTeXN0ZW0uQWN0aW9ue01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2VydmljZVJlc3VsdH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTYXZlIHN0cmluZy1iYXNlZCBjb2RlIGNvdmVyYWdlIGRhdGEuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgY29kZSBjb3ZlcmFnZSBkYXRhLCBhcyBhIHN0cmluZy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjYWxsYmFjayI+VGhlIGNhbGxiYWNrIGFjdGlvbi48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5FbnZpcm9ubWVudFByb3ZpZGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHByb3ZpZGVyIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgZW52aXJvbm1lbnRhbCBpbmZvcm1hdGlvbiB0aGF0IA0KKyAgICAgICAgICAgIHVzZXMgdGhlIHRlc3Qgc2VydmljZSBwcm92aWRlciBpbmZyYXN0cnVjdHVyZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLkVudmlyb25tZW50UHJvdmlkZXIuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U2VydmljZVByb3ZpZGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgZW52aXJvbm1lbnQgcHJvdmlkZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0U2VydmljZSI+VGhlIHRlc3Qgc2VydmljZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5FbnZpcm9ubWVudFByb3ZpZGVyLkdldEVudmlyb25tZW50VmFyaWFibGUoU3lzdGVtLlN0cmluZyxTeXN0ZW0uQWN0aW9ue01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2VydmljZVJlc3VsdH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXRyaWV2ZSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBmcm9tIHRoZSBzeXN0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJuYW1lIj5UaGUgdmFyaWFibGUgbmFtZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjYWxsYmFjayI+VGhlIGNhbGxiYWNrIGFjdGlvbi48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuRXh0ZW5zaW9ucyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTWlzY2VsbGFuZW91cyBpbnRlcm5hbCBleHRlbnNpb24gbWV0aG9kcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5FeHRlbnNpb25zLlRyeUdldEFzc2VtYmx5QXR0cmlidXRlYGAxKFN5c3RlbS5SZWZsZWN0aW9uLkFzc2VtYmx5LGBgMEApIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBdHRlbXB0cyB0byByZXRyaWV2ZSBhIGN1c3RvbSBhc3NlbWJseSBhdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIHR5cGUgb2YgYXR0cmlidXRlIHRvIHJldHJpZXZlLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhc3NlbWJseSI+VGhlIGFzc2VtYmx5IHJlZmVyZW5jZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPkFuIG91dCBhdHRyaWJ1dGUgcmVmZXJlbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgZm91bmQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuRXh0ZW5zaW9ucy5Ub1RyYW5zZm9ybWVkRGljdGlvbmFyeWBgMyhTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRW51bWVyYWJsZXtgYDB9LFN5c3RlbS5GdW5je2BgMCxgYDF9LFN5c3RlbS5GdW5je2BgMCxgYDJ9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVHJhbnNmb3JtIHRoZSBYRWxlbWVudCBpbnRvIGEgZGljdGlvbmFyeSBvZiBrZXkvdmFsdWUgcGFpcnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIHR5cGUgb2YgZW51bWVyYXRpb24uPC90eXBlcGFyYW0+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJLIj5UaGUga2V5IHR5cGUuPC90eXBlcGFyYW0+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJSIj5UaGUgdmFsdWUgdHlwZS48L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGhhdCI+VGhlIHJvb3QgZW51bWVyYWJsZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJrZXlTZWxlY3RvciI+VGhlIGtleSBzZWxlY3Rvci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtU2VsZWN0b3IiPlRoZSBpdGVtIHNlbGVjdG9yLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIG5ldyBkaWN0aW9uYXJ5LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuSXNvbGF0ZWRTdG9yYWdlU2V0dGluZ3NQcm92aWRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB0eXBlIHRoYXQgc3RvcmVzIGdsb2JhbCBzZXR0aW5ncyBpbiB0aGUgaXNvbGF0ZWQgc3RvcmFnZSBmb3IgdGhlIA0KKyAgICAgICAgICAgIGFwcGxpY2F0aW9uLiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2V0dGluZ3NQcm92aWRlciIvPiANCisgICAgICAgICAgICB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2V0dGluZ3NQcm92aWRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBwcm92aWRlciBvZiBzdHJpbmcgZGljdGlvbmFyeSB2YWx1ZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TZXR0aW5nc1Byb3ZpZGVyLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IFNldHRpbmdzUHJvdmlkZXIgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdFNlcnZpY2UiPlRoZSB0ZXN0IHNlcnZpY2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2V0dGluZ3NQcm92aWRlci4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RTZXJ2aWNlUHJvdmlkZXIsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IFNldHRpbmdzUHJvdmlkZXIgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdFNlcnZpY2UiPlRoZSB0ZXN0IHNlcnZpY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VydmljZU5hbWUiPlRoZSBzZXJ2aWNlIG5hbWUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2V0dGluZ3NQcm92aWRlci5TYXZlU2V0dGluZ3MoU3lzdGVtLkFjdGlvbntNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNlcnZpY2VSZXN1bHR9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2F2ZXMgdGhlIHNldHRpbmdzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmVtYXJrcz5DbGFzc2VzIHRoYXQgaW5oZXJpdCBmcm9tIFNldHRpbmdzUHJvdmlkZXI6IGhpZGUgdGhpcyANCisgICAgICAgICAgICBmdW5jdGlvbi4gIERvIG5vdCBjYWxsIHVwIHRocm91Z2ggdG8gdGhpcyBiYXNlIG1ldGhvZC48L3JlbWFya3M+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNhbGxiYWNrIj5UaGUgc2VydmljZSBjYWxsYmFjay48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TZXR0aW5nc1Byb3ZpZGVyLlNldHRpbmdzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBzZXR0aW5ncyBkaWN0aW9uYXJ5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2V0dGluZ3NQcm92aWRlci5Jc1JlYWRPbmx5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzZXR0aW5ncyBhcmUgcmVhZC1vbmx5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2V0dGluZ3NQcm92aWRlci5Tb3VyY2VOYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBzZXR0aW5ncyBzb3VyY2UgZm9yIGVuZC11c2VyIGRpc3BsYXkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5Jc29sYXRlZFN0b3JhZ2VTZXR0aW5nc1Byb3ZpZGVyLlRlc3RGcmFtZXdvcmtTZXR0aW5nc0tleU5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB1bmlxdWUga2V5IHVzZWQgZm9yIHN0b3JpbmcgdGhlIHRlc3QgZnJhbWV3b3JrJ3Mgc2V0dGluZ3MgDQorICAgICAgICAgICAgZGljdGlvbmFyeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLklzb2xhdGVkU3RvcmFnZVNldHRpbmdzUHJvdmlkZXIuX3NldHRpbmdzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdW5kZXJseWluZyBzZXR0aW5ncyBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5Jc29sYXRlZFN0b3JhZ2VTZXR0aW5nc1Byb3ZpZGVyLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGlzb2xhdGVkIHN0b3JhZ2Ugc2V0dGluZ3MgcHJvdmlkZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0U2VydmljZSI+VGhlIHRlc3Qgc2VydmljZSBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5Jc29sYXRlZFN0b3JhZ2VTZXR0aW5nc1Byb3ZpZGVyLkluaXRpYWxpemUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIHRoZSBpc29sYXRlZCBzdG9yYWdlIHNldHRpbmdzIHByb3ZpZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuSXNvbGF0ZWRTdG9yYWdlU2V0dGluZ3NQcm92aWRlci5TYXZlU2V0dGluZ3MoU3lzdGVtLkFjdGlvbntNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNlcnZpY2VSZXN1bHR9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2F2ZXMgdGhlIGN1cnJlbnQgc2V0dGluZ3MgdmFsdWVzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2FsbGJhY2siPlRoZSBzZXJ2aWNlIGNvbXBsZXRpb24gY2FsbGJhY2suPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuSXNvbGF0ZWRTdG9yYWdlU2V0dGluZ3NQcm92aWRlci5Mb2FkU2V0dGluZ3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlY2FsbHMgdGhlIHN0b3JlZCBzZXR0aW5ncyB2YWx1ZXMgZnJvbSBpc29sYXRlZCBzdG9yYWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuSXNvbGF0ZWRTdG9yYWdlU2V0dGluZ3NQcm92aWRlci5Jbml0aWFsaXplU2V0dGluZ3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIGlzb2xhdGVkIHN0b3JhZ2UgYXBwbGljYXRpb24gc2V0dGluZ3Mgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2VydmljZVJlc3VsdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVzdWx0IG9iamVjdCBmb3IgYXN5bmNocm9ub3VzIHRlc3Qgc2VydmljZSByZXNwb25zZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNlcnZpY2VSZXN1bHQuQ3JlYXRlRXhjZXB0aW9uYWxSZXN1bHQoU3lzdGVtLkV4Y2VwdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgU2VydmljZVJlc3VsdCBvYmplY3QgZm9yIGEgZmFpbGVkIHJlc3VsdCwgdGhlIA0KKyAgICAgICAgICAgIHNldHMgdGhlIGV4Y2VwdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4Y2VwdCI+VGhlIEV4Y2VwdGlvbiBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgbmV3IFNlcnZpY2VSZXN1bHQgd2l0aCB0aGUgRXhjZXB0aW9uIHNldC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNlcnZpY2VSZXN1bHQuX3Jlc3VsdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHJlc3VsdCBMSU5RIGVsZW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TZXJ2aWNlUmVzdWx0LiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU2VydmljZVJlc3VsdCBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNlcnZpY2VSZXN1bHQuUHJvY2Vzc1Jlc3BvbnNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm9jZXNzIHRoZSByZXNwb25zZSB0ZXh0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2VydmljZVJlc3VsdC5UcnlHZXRFbGVtZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBdHRlbXB0IHRvIHByb2Nlc3MgYW5kIHJldHVybiB0aGUgcm9vdCBlbGVtZW50IG9mIGEgc3VjY2Vzc2Z1bCANCisgICAgICAgICAgICByZXF1ZXN0LiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgd2FzIGFuIEV4Y2VwdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIHJvb3QgWE1MIGVsZW1lbnQgb2YgdGhlIHJlc3BvbnNlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2VydmljZVJlc3VsdC5TZXRSZXN1bHQoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TaW1wbGVYRWxlbWVudCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNldHMgdGhlIHJlc3VsdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJlc3VsdCI+VGhlIExJTlEgZWxlbWVudCBmb3IgdGhlIHJlc3VsdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TZXJ2aWNlUmVzdWx0LlByb2Nlc3NlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZXN1bHQgaGFzIGJlZW4gDQorICAgICAgICAgICAgcHJvY2Vzc2VkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2VydmljZVJlc3VsdC5FeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgZXhjZXB0aW9uIGludGVyY2VwdGVkIG9yIGdlbmVyYXRlZCBkdXJpbmcgdGhlIA0KKyAgICAgICAgICAgIHJlcXVlc3Qgb3IgDQorICAgICAgICAgICAgcHJvY2Vzc2luZyB0aW1lZnJhbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TZXJ2aWNlUmVzdWx0LkVsZW1lbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHJvb3QgWEVsZW1lbnQgb2YgdGhlIHRlc3Qgc2VydmljZSByZXN1bHQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TZXJ2aWNlUmVzdWx0LlN1Y2Nlc3NmdWwiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TZXJ2aWNlVHlwZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHR5cGUgb2YgdGVzdCBzZXJ2aWNlIGluIHVzZS4gIFVzZWQgYnkgdGhlIG1vcmUgYWR2YW5jZWQgc2VydmljZSANCisgICAgICAgICAgICBzY2VuYXJpb3MgaW4gU2lsdmVybGlnaHRUZXN0U2VydmljZVByb3ZpZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2VydmljZVR5cGUuTm9uZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTm8gc2VydmljZSwgb3IgdW5rbm93biBzZXJ2aWNlIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TZXJ2aWNlVHlwZS5EaXJlY3QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgZGlyZWN0IGNvbm5lY3Rpb24sIGJlIGl0IHRoZSBmaWxlIHN5c3RlbSwgaXNvbGF0ZWQgc3RvcmFnZSwgb3IgDQorICAgICAgICAgICAgc2ltaWxhci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNlcnZpY2VUeXBlLldlYlNlcnZpY2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgd2ViIHNlcnZpY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TaWx2ZXJsaWdodFRlc3RTZXJ2aWNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgU2lsdmVybGlnaHQgdGVzdCBzZXJ2aWNlIHByb3ZpZGVyIGlzIGJ1aWx0IGZvciBjb21waWxhdGlvbiB3aXRoIA0KKyAgICAgICAgICAgIFNpbHZlcmxpZ2h0IGJ1aWxkcyBvZiB0aGUgdGVzdCBmcmFtZXdvcmsuICBQb3B1bGF0ZXMgd2l0aCB0aGUgaW1wb3J0YW50IA0KKyAgICAgICAgICAgIHByb3ZpZGVycyBmb3Igd2ViIGJyb3dzZXItaG9zdGVkIHRlc3QgcnVucy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIFNpbHZlcmxpZ2h0IHRlc3Qgc2VydmljZSBwcm92aWRlciBpcyBidWlsdCBmb3IgY29tcGlsYXRpb24gd2l0aCANCisgICAgICAgICAgICBTaWx2ZXJsaWdodCBidWlsZHMgb2YgdGhlIHRlc3QgZnJhbWV3b3JrLiAgUG9wdWxhdGVzIHdpdGggdGhlIGltcG9ydGFudCANCisgICAgICAgICAgICBwcm92aWRlcnMgZm9yIHdlYiBicm93c2VyLWhvc3RlZCB0ZXN0IHJ1bnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U2VydmljZVByb3ZpZGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHN5c3RlbSB0aGF0IHByb3ZpZGVzIHRlc3Qgc2VydmljZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U2VydmljZVByb3ZpZGVyLl9zZXJ2aWNlcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIGRpY3Rpb25hcnkgb2Ygc2VydmljZXMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcHJvdmlkZXIgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U2VydmljZVByb3ZpZGVyLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyB0ZXN0IHNlcnZpY2UgcHJvdmlkZXIgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U2VydmljZVByb3ZpZGVyLkluaXRpYWxpemUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIHRoZSBwcm92aWRlciBhbmQgYWxsIG9mIGl0cyB0ZXN0IHNlcnZpY2VzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlci5Jbml0aWFsaXplQWxsU2VydmljZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemUgYWxsIHNlcnZpY2VzIGFuZCBmZWF0dXJlcyBzeW5jaHJvbm91c2x5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlci5SZWdpc3RlclNlcnZpY2UoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5UZXN0U2VydmljZUZlYXR1cmUsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5Qcm92aWRlckJhc2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZWdpc3RlciBhIG5ldyBzZXJ2aWNlIHRoYXQgdGhlIHRlc3Qgc2VydmljZSBzaG91bGQgZXhwb3NlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmVhdHVyZSI+S25vd24gZmVhdHVyZSB0eXBlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlcnZpY2VJbnN0YW5jZSI+SW5zdGFuY2Ugb2YgdGhlIGZlYXR1cmUncyANCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5Qcm92aWRlckJhc2UiLz4gdHlwZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U2VydmljZVByb3ZpZGVyLlJlZ2lzdGVyU2VydmljZShTeXN0ZW0uU3RyaW5nLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuUHJvdmlkZXJCYXNlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVnaXN0ZXIgYSBuZXcgc2VydmljZSB0aGF0IHRoZSB0ZXN0IHNlcnZpY2Ugc2hvdWxkIGV4cG9zZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZlYXR1cmVOYW1lIj5TdHJpbmcgbmFtZSBvZiB0aGUgZmVhdHVyZSBpZiB0aGUga25vd24gDQorICAgICAgICAgICAgZW51bSB2YWx1ZSBkb2VzIG5vdCBleGlzdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZXJ2aWNlSW5zdGFuY2UiPkluc3RhbmNlIG9mIHRoZSBmZWF0dXJlJ3MgDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuUHJvdmlkZXJCYXNlIi8+IHR5cGUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlci5VbnJlZ2lzdGVyU2VydmljZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlRlc3RTZXJ2aWNlRmVhdHVyZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVucmVnaXN0ZXJzIGEgZmVhdHVyZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZlYXR1cmUiPktub3duIGZlYXR1cmUgdHlwZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U2VydmljZVByb3ZpZGVyLlVucmVnaXN0ZXJTZXJ2aWNlKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBVbnJlZ2lzdGVycyBhIGZlYXR1cmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmZWF0dXJlTmFtZSI+S25vd24gZmVhdHVyZSB0eXBlIHN0cmluZy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U2VydmljZVByb3ZpZGVyLkhhc1NlcnZpY2UoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5UZXN0U2VydmljZUZlYXR1cmUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDaGVjayBpZiBhIHJlcXVlc3RlZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgdGVzdCBzZXJ2aWNlIA0KKyAgICAgICAgICAgIHByb3ZpZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmVhdHVyZSI+RmVhdHVyZSBvZiBpbnRlcmVzdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmZWF0dXJlIGV4aXN0cy48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RTZXJ2aWNlUHJvdmlkZXIuSGFzU2VydmljZShTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2hlY2sgaWYgYSByZXF1ZXN0ZWQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIHRlc3Qgc2VydmljZSANCisgICAgICAgICAgICBwcm92aWRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZlYXR1cmVOYW1lIj5GZWF0dXJlIG9mIGludGVyZXN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+QSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZlYXR1cmUgZXhpc3RzLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlci5HZXRTZXJ2aWNlYGAxKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuVGVzdFNlcnZpY2VGZWF0dXJlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0cmlldmUgYSBmZWF0dXJlLiAgQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBzZXJ2aWNlIA0KKyAgICAgICAgICAgIGRvZXMgbm90IGV4aXN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlRTZXJ2aWNlIj5UeXBlIG9mIGEgc2VydmljZSwgUHJvdmlkZXJCYXNlLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmZWF0dXJlIj5UaGUgZmVhdHVyZSBvZiBpbnRlcmVzdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgdGhlIGZlYXR1cmUsIGNhc3QgcHJvcGVybHkuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U2VydmljZVByb3ZpZGVyLkdldFNlcnZpY2UoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5UZXN0U2VydmljZUZlYXR1cmUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXRyaWV2ZSBhIGZlYXR1cmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmZWF0dXJlIj5GZWF0dXJlIG9mIGludGVyZXN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIGZlYXR1cmUncyBwcm92aWRlci48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RTZXJ2aWNlUHJvdmlkZXIuR2V0U2VydmljZShTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0cmlldmUgYSBmZWF0dXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmVhdHVyZU5hbWUiPkZlYXR1cmUgb2YgaW50ZXJlc3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgc2VydmljZSBvciBudWxsIGlmIG9uZSB3YXMgbm90IHByZXNlbnQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U2VydmljZVByb3ZpZGVyLlJlcXVpcmVTZXJ2aWNlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlcixTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcXVpcmUgYSBmZWF0dXJlLCBvciB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQgaXNuJ3QgYXZhaWxhYmxlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmVhdHVyZSI+RmVhdHVyZSBvZiBpbnRlcmVzdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyZXF1aXJlZFR5cGUiPlRoZSByZXF1aXJlZCB0eXBlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIHNlcnZpY2Ugb3IgbnVsbCBpZiBvbmUgd2FzIG5vdCBwcmVzZW50LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlci5SZXF1aXJlU2VydmljZShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVxdWlyZSBhIGZlYXR1cmUsIG9yIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBpdCBpc24ndCBhdmFpbGFibGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmZWF0dXJlTmFtZSI+RmVhdHVyZSBvZiBpbnRlcmVzdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyZXF1aXJlZFR5cGUiPlRoZSByZXF1aXJlZCB0eXBlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIHNlcnZpY2Ugb3IgbnVsbCBpZiBvbmUgd2FzIG5vdCBwcmVzZW50LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlci5SZXF1aXJlU2VydmljZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlRlc3RTZXJ2aWNlRmVhdHVyZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcXVpcmUgYSBmZWF0dXJlIG9yIGludGVyZXN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmVhdHVyZSI+RmVhdHVyZSBvZiBpbnRlcmVzdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRoZSBzZXJ2aWNlIG9yIG51bGwgaWYgb25lIHdhcyBub3QgcHJlc2VudC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RTZXJ2aWNlUHJvdmlkZXIuUmVxdWlyZVNlcnZpY2UoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcXVpcmVzIGEgc2VydmljZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZlYXR1cmVOYW1lIj5GZWF0dXJlIG9mIGludGVyZXN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIHNlcnZpY2Ugb3IgbnVsbCBpZiBvbmUgd2FzIG5vdCBwcmVzZW50LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlci5SZXF1aXJlU2VydmljZUludGVybmFsKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDaGVjayBmb3IgYW5kIHJlcXVpcmVkIHRoZSBwcmVzZW5jZSBvZiBhIHNlcnZpY2UuICBUaHJvd3MgYW4gDQorICAgICAgICAgICAgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiBtZXNzYWdlIGlmIHRoZSBzZXJ2aWNlIGlzIHVuYXZhaWxhYmxlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmVhdHVyZSI+RmVhdHVyZSBvZiBpbnRlcmVzdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRoZSBzZXJ2aWNlIG9yIG51bGwgaWYgb25lIHdhcyBub3QgcHJlc2VudC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RTZXJ2aWNlUHJvdmlkZXIuUmVxdWlyZVNlcnZpY2VJbnRlcm5hbChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVxdWlyZSBhIHNwZWNpZmljIGZlYXR1cmUsIGFuZCB0aGF0IGl0IGNhbiBiZSBjYXN0IHByb3Blcmx5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmVhdHVyZSI+RmVhdHVyZSBvZiBpbnRlcmVzdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjYXN0Ij5UaGUgdHlwZSB0byB2ZXJpZnkgYXNzaWdubWVudCBmb3IgYSBjYXN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIHNlcnZpY2Ugb3IgbnVsbCBpZiBvbmUgd2FzIG5vdCBwcmVzZW50LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlci5HZXRTZXJ2aWNlSW50ZXJuYWwoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIExvb2tzIGZvciBhIHNwZWNpZmljIHNlcnZpY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmZWF0dXJlIj5GZWF0dXJlIG9mIGludGVyZXN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIHNlcnZpY2Ugb3IgbnVsbCBpZiBvbmUgd2FzIG5vdCBwcmVzZW50LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlci5VbmlxdWVUZXN0UnVuSWRlbnRpZmllciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIGEgdW5pcXVlIHRlc3QgcnVuIGlkZW50aWZpZXIsIGlmIGFueSBpcyBwcmVzZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlci5CdXN5U2VydmljZVJlZmVyZW5jZUNvdW50ZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhbiBpbnRlZ2VyIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gbWFuYWdlIHNpbXBsZQ0KKyAgICAgICAgICAgIHJlZmVyZW5jZSBjb3VudGluZyBzZXJ2aWNlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNpbHZlcmxpZ2h0VGVzdFNlcnZpY2UuX3dlYlNlcnZpY2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBzZXJ2aWNlIHZlcmlmaWVyIGFuZCBpbmZvcm1hdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNpbHZlcmxpZ2h0VGVzdFNlcnZpY2UuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTaWx2ZXJsaWdodFRlc3RTZXJ2aWNlIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2lsdmVybGlnaHRUZXN0U2VydmljZS4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFNldHRpbmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFNpbHZlcmxpZ2h0VGVzdFNlcnZpY2UgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZXR0aW5ncyI+VW5pdCB0ZXN0IHNldHRpbmdzIHRvIHJlYWQgdGhlIHNlcnZpY2UgcGF0aA0KKyAgICAgICAgICAgIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmcm9tLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNpbHZlcmxpZ2h0VGVzdFNlcnZpY2UuSW5pdGlhbGl6ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIFNpbHZlcmxpZ2h0IHRlc3Qgc2VydmljZS4gIFBlcmZvcm1zIGEgc2VydmljZSBjaGVjayANCisgICAgICAgICAgICBpZiBuZWVkZWQgYmVmb3JlIGluaXRpYWxpemluZyB0aGUgb3RoZXIgcHJvdmlkZXJzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2lsdmVybGlnaHRUZXN0U2VydmljZS5TZXRDdXN0b21JZGVudGlmaWNhdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0cyB0aGUgY3VzdG9tIElEIGluZm9ybWF0aW9uIGZvciB0aGUgdGVzdCBydW4sIGlmIHBhc3NlZCBpbnRvIA0KKyAgICAgICAgICAgIHRoZSBydW4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TaWx2ZXJsaWdodFRlc3RTZXJ2aWNlLlNldFNlcnZpY2VQYXRoKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0U2V0dGluZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZXRlcm1pbmUgdGhlIHNlcnZpY2UgcGF0aCB0byBhdHRlbXB0IHRvIHVzZSwgYW5kIHByZXBhcmVzIHRoZSANCisgICAgICAgICAgICB2ZXJpZmljYXRpb24gb2JqZWN0IHVzaW5nIHRob3NlIHBhcmFtZXRlcnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZXR0aW5ncyI+VW5pdCB0ZXN0IHNldHRpbmdzIG9iamVjdCB0byB0cnkgYW5kIHJlYWQNCisgICAgICAgICAgICBzZXR0aW5ncyBmcm9tLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNpbHZlcmxpZ2h0VGVzdFNlcnZpY2UuQXR0ZW1wdFNlcnZpY2VDb25uZWN0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQYXVzZXMgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MgdG8gYXR0ZW1wdCBhIHNlcnZpY2UgY29ubmVjdGlvbi4gDQorICAgICAgICAgICAgVGhlIHJlc3VsdCB3aWxsIGFsdGVyIHRoZSB1bmRlcmx5aW5nIFNlcnZpY2VUeXBlIGJlaW5nIHVzZWQgYnkgDQorICAgICAgICAgICAgdGhpcyBwcm92aWRlciB0byBlbnN1cmUgYSBmYWxsYmFjayBleHBlcmllbmNlIGNhbiBiZSB1c2VkLiAgDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgVGhpcyB2ZXJpZmljYXRpb24gc3RlcCB3aWxsIGJsb2NrIHRoZSBpbml0aWFsaXphdGlvbiBhbmQgZW50aXJlIA0KKyAgICAgICAgICAgIHRlc3QgcnVuIHVudGlsIGl0IGNvbnRpbnVlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNpbHZlcmxpZ2h0VGVzdFNlcnZpY2UuQ29udGludWVJbml0aWFsaXphdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29udGludWVzIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIGZvciB0aGUgdGVzdCBzZXJ2aWNlIHByb3ZpZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2lsdmVybGlnaHRUZXN0U2VydmljZS5Qb3B1bGF0ZVByb3ZpZGVycyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUG9wdWxhdGVzIHdpdGggdGhlIHN0YW5kYXJkIHByb3ZpZGVycyBmb3IgU2lsdmVybGlnaHQgaW4tYnJvd3NlciANCisgICAgICAgICAgICB0ZXN0aW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2lsdmVybGlnaHRUZXN0U2VydmljZS5TZXJ2aWNlVHlwZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgc2VydmljZSB0eXBlIHRoYXQgaXMgaW4gdXNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2lsdmVybGlnaHRUZXN0U2VydmljZS5XZWJTZXJ2aWNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB3ZWIgc2VydmljZSBwcm94eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNpbHZlcmxpZ2h0VGVzdFNlcnZpY2UuU2VydmljZVZlcmlmaWVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHNwZWNpYWwgdmVyaWZpY2F0aW9uIGNsYXNzIHVzZWQgYnkgU2lsdmVybGlnaHRUZXN0U2VydmljZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNpbHZlcmxpZ2h0VGVzdFNlcnZpY2UuU2VydmljZVZlcmlmaWVyLlZlcmlmaWNhdGlvblNlcnZpY2VOYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgbmFtZSBvZiBhIHNpbXBsZSAncGluZycgbWV0aG9kIGV4cG9zZWQgYnkgdGhlIHNlcnZpY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TaWx2ZXJsaWdodFRlc3RTZXJ2aWNlLlNlcnZpY2VWZXJpZmllci5WZXJpZnkoU3lzdGVtLkFjdGlvbixTeXN0ZW0uQWN0aW9uKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXR0ZW1wdHMgdG8gdmVyaWZ5IHRoZSBzZXJ2aWNlIGNvbm5lY3Rpb24uICBDYWxscyB0aGUgcHJvcGVyIA0KKyAgICAgICAgICAgIHN1Y2Nlc3MvZmFpbHVyZSBBY3Rpb24gb25jZSBhIHZlcmlmaWNhdGlvbiByZXN1bHQgaXMgcG9zc2libGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdWNjZXNzIj5UaGUgQWN0aW9uIHRvIGNhbGwgdXBvbiBjb25uZWN0aW9uIA0KKyAgICAgICAgICAgIHZlcmlmaWNhdGlvbi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmYWlsdXJlIj5BbiBBY3Rpb24gdG8gY2FsbCB1cG9uIGZhaWx1cmUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2lsdmVybGlnaHRUZXN0U2VydmljZS5TZXJ2aWNlVmVyaWZpZXIuSG9zdG5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgc2VydmljZSBob3N0bmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNpbHZlcmxpZ2h0VGVzdFNlcnZpY2UuU2VydmljZVZlcmlmaWVyLlBvcnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgc2VydmljZSBwb3J0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2lsdmVybGlnaHRUZXN0U2VydmljZS5TZXJ2aWNlVmVyaWZpZXIuU2VydmljZVBhdGgiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBwYXRoIHRvIHRoZSBzaW1wbGUgUE9YIHNlcnZpY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TaWx2ZXJsaWdodFRlc3RTZXJ2aWNlLlNlcnZpY2VWZXJpZmllci5TZXJ2aWNlVXJpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBVUkkgdG8gdGhlIHNlcnZpY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5UZXN0UmVwb3J0aW5nUHJvdmlkZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgdGVzdCBzZXJ2aWNlIHRoYXQgcmVwb3J0cyB0ZXN0IHJ1biByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuVGVzdFJlcG9ydGluZ1Byb3ZpZGVyLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IHJlcG9ydGluZyBwcm92aWRlciBpbnN0YW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RTZXJ2aWNlIj5UaGUgdGVzdCBzZXJ2aWNlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlRlc3RSZXBvcnRpbmdQcm92aWRlci5Xcml0ZUxvZyhTeXN0ZW0uQWN0aW9ue01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2VydmljZVJlc3VsdH0sU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmVnaW5zIGEgY2FsbCB0byB0aGUgdGVzdCBzZXJ2aWNlIHRvIHdyaXRlIHRvIHRoZSBsb2cuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjYWxsYmFjayI+VGhlIGNhbGxiYWNrLCB1c2VkIHRvIHJlYWQgb3IgdmVyaWZ5IHJlc3VsdHMgDQorICAgICAgICAgICAgZnJvbSB0aGUgc2VydmljZSBjYWxsLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImxvZ05hbWUiPlRoZSBuYW1lIG9mIHRoZSBsb2cgdG8gd3JpdGUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29udGVudCI+VGhlIGxvZyBmaWxlIGNvbnRlbnQuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuVGVzdFJlcG9ydGluZ1Byb3ZpZGVyLlJlcG9ydEZpbmFsUmVzdWx0KFN5c3RlbS5BY3Rpb257TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TZXJ2aWNlUmVzdWx0fSxTeXN0ZW0uQm9vbGVhbixTeXN0ZW0uSW50MzIsU3lzdGVtLkludDMyLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCZWdpbnMgYSBjYWxsIHRvIHRoZSB0ZXN0IHNlcnZpY2UgdG8gcmVwb3J0IGEgdGVzdCBydW4ncyByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2FsbGJhY2siPlRoZSBjYWxsYmFjaywgdXNlZCB0byByZWFkIG9yIHZlcmlmeSByZXN1bHRzIA0KKyAgICAgICAgICAgIGZyb20gdGhlIHNlcnZpY2UgY2FsbC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmYWlsdXJlIj5BIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGVzdCBydW4gd2FzIGEgDQorICAgICAgICAgICAgZmFpbHVyZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmYWlsdXJlcyI+VGhlIGZhaWxlZCBzY2VuYXJpbyBjb3VudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0b3RhbFNjZW5hcmlvcyI+VGhlIHRvdGFsIHNjZW5hcmlvIGNvdW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPkFueSBtZXNzYWdlIHRvIHJlcG9ydCBhbG9uZyB3aXRoIHRoZSBmYWlsdXJlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlRlc3RTZXJ2aWNlRmVhdHVyZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0IG9mIGtub3duLCB3ZWxsLWRlZmluZWQgdGVzdCBzZXJ2aWNlIGZlYXR1cmVzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuVGVzdFNlcnZpY2VGZWF0dXJlLkNvZGVDb3ZlcmFnZVJlcG9ydGluZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29kZSBjb3ZlcmFnZSByZXBvcnRpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5UZXN0U2VydmljZUZlYXR1cmUuUnVuU2V0dGluZ3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb3ZpZGVzIHJ1biBwYXJhbWV0ZXJzIGFuZCBzZXR0aW5ncy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlRlc3RTZXJ2aWNlRmVhdHVyZS5UZXN0UmVwb3J0aW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyB0ZXN0IHJlcG9ydGluZyBzZXJ2aWNlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlRlc3RTZXJ2aWNlRmVhdHVyZS5FbnZpcm9ubWVudFNlcnZpY2VzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYkNvZGVDb3ZlcmFnZVByb3ZpZGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHByb3ZpZGVyIG9mIGNvZGUgY292ZXJhZ2UgaW5mb3JtYXRpb24gdG8gYW4gZXh0ZXJuYWwgcHJvY2Vzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYkNvZGVDb3ZlcmFnZVByb3ZpZGVyLk1ldGhvZE5hbWVfU2F2ZUNvZGVDb3ZlcmFnZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIE1ldGhvZE5hbWVfU2F2ZUNvZGVDb3ZlcmFnZSBtZXRob2QgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYkNvZGVDb3ZlcmFnZVByb3ZpZGVyLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGNvZGUgY292ZXJhZ2UgcHJvdmlkZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0U2VydmljZSI+VGhlIHRlc3Qgc2VydmljZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5XZWJDb2RlQ292ZXJhZ2VQcm92aWRlci5TYXZlQ292ZXJhZ2VEYXRhKFN5c3RlbS5TdHJpbmcsU3lzdGVtLkFjdGlvbntNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNlcnZpY2VSZXN1bHR9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2F2ZSBzdHJpbmctYmFzZWQgY29kZSBjb3ZlcmFnZSBkYXRhLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGNvZGUgY292ZXJhZ2UgZGF0YSwgYXMgYSBzdHJpbmcuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2FsbGJhY2siPlRoZSBjYWxsYmFjayBhY3Rpb24uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViRW52aXJvbm1lbnRQcm92aWRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBwcm92aWRlciBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIGVudmlyb25tZW50YWwgaW5mb3JtYXRpb24gdGhhdCANCisgICAgICAgICAgICB1c2VzIHRoZSB0ZXN0IHNlcnZpY2UgcHJvdmlkZXIgaW5mcmFzdHJ1Y3R1cmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5XZWJFbnZpcm9ubWVudFByb3ZpZGVyLk1ldGhvZE5hbWVfR2V0RW52aXJvbm1lbnRWYXJpYWJsZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIE1ldGhvZE5hbWVfR2V0RW52aXJvbm1lbnRWYXJpYWJsZSBtZXRob2QgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYkVudmlyb25tZW50UHJvdmlkZXIuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TaWx2ZXJsaWdodFRlc3RTZXJ2aWNlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgZW52aXJvbm1lbnQgcHJvdmlkZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0U2VydmljZSI+VGhlIHdlYiB0ZXN0IHNlcnZpY2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViRW52aXJvbm1lbnRQcm92aWRlci5HZXRFbnZpcm9ubWVudFZhcmlhYmxlKFN5c3RlbS5TdHJpbmcsU3lzdGVtLkFjdGlvbntNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNlcnZpY2VSZXN1bHR9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0cmlldmUgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgZnJvbSB0aGUgc3lzdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIHZhcmlhYmxlIG5hbWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2FsbGJhY2siPlRoZSBjYWxsYmFjayBhY3Rpb24uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViU2VydmljZVJlc3VsdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVzdWx0IG9iamVjdCBmb3IgYXN5bmNocm9ub3VzIHRlc3Qgc2VydmljZSByZXNwb25zZSB0aGF0IHVzZXMgYSBzaW1wbGUgDQorICAgICAgICAgICAgd2ViIHNlcnZpY2UgLyBQT1ggY2FsbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlNlcnZpY2VSZXN1bHQuI2N0b3IoU3lzdGVtLk5ldC5XZWJSZXF1ZXN0LFN5c3RlbS5OZXQuV2ViUmVzcG9uc2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyB3ZWIgc2VydmljZSByZXN1bHQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyZXF1ZXN0Ij5UaGUgcmVxdWVzdCBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icmVzcG9uc2UiPlRoZSByZXNwb25zZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViU2VydmljZVJlc3VsdC4jY3RvcihTeXN0ZW0uTmV0LldlYlJlcXVlc3QsU3lzdGVtLk5ldC5XZWJSZXNwb25zZSxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgd2ViIHNlcnZpY2UgcmVzdWx0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icmVxdWVzdCI+VGhlIHJlcXVlc3Qgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJlc3BvbnNlIj5UaGUgcmVzcG9uc2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRldGFpbHMiPlRoZSBkZXRhaWxzIHRvIGFzc29jaWF0ZSBmb3IgZGVidWdnaW5nIA0KKyAgICAgICAgICAgIHB1cnBvc2VzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlNlcnZpY2VSZXN1bHQuUmVhZEh0dHBXZWJSZXNwb25zZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVhZHMgdGhlIHdlYiByZXNwb25zZSwgaWYgc3VjY2Vzc2Z1bCwgYW5kIHBhcnNlcyBvdXQgdGhlIHN0cmluZyANCisgICAgICAgICAgICBjb250ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViU2VydmljZVJlc3VsdC5Qcm9jZXNzUmVzcG9uc2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb2Nlc3MgdGhlIHJlc3BvbnNlIHRleHQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5XZWJTZXJ2aWNlUmVzdWx0LlJlcXVlc3QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHdlYiByZXF1ZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZSBjYWxsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViU2VydmljZVJlc3VsdC5SZXNwb25zZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgd2ViIHJlc3BvbnNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZSBjYWxsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViU2VydmljZVJlc3VsdC5SZXF1ZXN0RGV0YWlscyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgZGV0YWlscyBvZiB0aGUgcmVxdWVzdCwgdXNlZCBmb3IgaW50ZXJhY3RpdmUgZGVidWdnaW5nIA0KKyAgICAgICAgICAgIHNlc3Npb25zIG9ubHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5XZWJTZXJ2aWNlUmVzdWx0LlJlc3BvbnNlU3RyaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBzdHJpbmcgcmV0cmlldmVkIGZyb20gdGhlIHJlc3BvbnNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViU2V0dGluZ3NQcm92aWRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB0ZXN0IHNlcnZpY2UgdGhhdCByZWFkcyBjb21tYW5kIGxpbmUgc2V0dGluZ3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5XZWJTZXR0aW5nc1Byb3ZpZGVyLk1ldGhvZE5hbWVfR2V0UnVuUGFyYW1ldGVycyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTmFtZSBvZiB0aGUgbWV0aG9kIE1ldGhvZE5hbWVfR2V0UnVuUGFyYW1ldGVycy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlNldHRpbmdzUHJvdmlkZXIuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U2VydmljZVByb3ZpZGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgc2V0dGluZ3MgcHJvdmlkZXIgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0U2VydmljZSI+VGhlIHRlc3Qgc2VydmljZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5XZWJTZXR0aW5nc1Byb3ZpZGVyLkluaXRpYWxpemUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIHdlYiBzZXR0aW5ncyBwcm92aWRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlNldHRpbmdzUHJvdmlkZXIuUmVhZFJ1blBhcmFtZXRlcnMoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TZXJ2aWNlUmVzdWx0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVhZCB0aGUgcnVuIHBhcmFtZXRlcnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyZXN1bHQiPlRoZSBzZXJ2aWNlIHJlc3VsdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5XZWJUZXN0UmVwb3J0aW5nUHJvdmlkZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgdGVzdCBzZXJ2aWNlIHRoYXQgcmVwb3J0cyB0ZXN0IHJ1biByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViVGVzdFJlcG9ydGluZ1Byb3ZpZGVyLk1ldGhvZE5hbWVfUmVwb3J0VGVzdFJlc3VsdHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE5hbWUgb2YgdGhlIG1ldGhvZCBNZXRob2ROYW1lX1JlcG9ydFRlc3RSZXN1bHRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViVGVzdFJlcG9ydGluZ1Byb3ZpZGVyLk1ldGhvZE5hbWVfV3JpdGVMb2ciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE5hbWUgb2YgdGhlIG1ldGhvZCBNZXRob2ROYW1lX1dyaXRlTG9nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViVGVzdFJlcG9ydGluZ1Byb3ZpZGVyLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IHJlcG9ydGluZyBwcm92aWRlciBpbnN0YW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RTZXJ2aWNlIj5UaGUgdGVzdCBzZXJ2aWNlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlRlc3RSZXBvcnRpbmdQcm92aWRlci5Xcml0ZUxvZyhTeXN0ZW0uQWN0aW9ue01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2VydmljZVJlc3VsdH0sU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmVnaW5zIGEgY2FsbCB0byB0aGUgdGVzdCBzZXJ2aWNlIHRvIHdyaXRlIHRvIHRoZSBsb2cuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjYWxsYmFjayI+VGhlIGNhbGxiYWNrLCB1c2VkIHRvIHJlYWQgb3IgdmVyaWZ5IHJlc3VsdHMgDQorICAgICAgICAgICAgZnJvbSB0aGUgc2VydmljZSBjYWxsLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImxvZ05hbWUiPlRoZSBuYW1lIG9mIHRoZSBsb2cgdG8gd3JpdGUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29udGVudCI+VGhlIGxvZyBmaWxlIGNvbnRlbnQuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViVGVzdFJlcG9ydGluZ1Byb3ZpZGVyLlJlcG9ydEZpbmFsUmVzdWx0KFN5c3RlbS5BY3Rpb257TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TZXJ2aWNlUmVzdWx0fSxTeXN0ZW0uQm9vbGVhbixTeXN0ZW0uSW50MzIsU3lzdGVtLkludDMyLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCZWdpbnMgYSBjYWxsIHRvIHRoZSB0ZXN0IHNlcnZpY2UgdG8gcmVwb3J0IGEgdGVzdCBydW4ncyByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2FsbGJhY2siPlRoZSBjYWxsYmFjaywgdXNlZCB0byByZWFkIG9yIHZlcmlmeSByZXN1bHRzIA0KKyAgICAgICAgICAgIGZyb20gdGhlIHNlcnZpY2UgY2FsbC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmYWlsdXJlIj5BIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGVzdCBydW4gd2FzIGEgDQorICAgICAgICAgICAgZmFpbHVyZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmYWlsdXJlcyI+VGhlIGZhaWxlZCBzY2VuYXJpbyBjb3VudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0b3RhbFNjZW5hcmlvcyI+VGhlIHRvdGFsIHNjZW5hcmlvIGNvdW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPkFueSBtZXNzYWdlIHRvIHJlcG9ydCBhbG9uZyB3aXRoIHRoZSBmYWlsdXJlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlRlc3RTZXJ2aWNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBvdXQtb2YtcHJvY2VzcyBhY2Nlc3MgdG8gb3BlcmF0aW5nIHN5c3RlbSBmdW5jdGlvbnMgYW5kIG90aGVyIA0KKyAgICAgICAgICAgIHNlcnZpY2VzIHN1Y2ggYXMgdmlzdWFsIHZlcmlmaWNhdGlvbiwgaWYgcHJlc2VudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvdmlkZXMgb3V0LW9mLXByb2Nlc3MgYWNjZXNzIHRvIG9wZXJhdGluZyBzeXN0ZW0gZnVuY3Rpb25zIGFuZCBvdGhlciANCisgICAgICAgICAgICBzZXJ2aWNlcyBzdWNoIGFzIHZpc3VhbCB2ZXJpZmljYXRpb24sIGlmIHByZXNlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb3ZpZGVzIG91dC1vZi1wcm9jZXNzIGFjY2VzcyB0byBvcGVyYXRpbmcgc3lzdGVtIGZ1bmN0aW9ucyBhbmQgb3RoZXIgDQorICAgICAgICAgICAgc2VydmljZXMgc3VjaCBhcyB2aXN1YWwgdmVyaWZpY2F0aW9uLCBpZiBwcmVzZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViVGVzdFNlcnZpY2UuX3NlcnZpY2VVcmkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBzZXJ2aWNlIGFkZHJlc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5XZWJUZXN0U2VydmljZS5fc3luYyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHN5bmNocm9uaXphdGlvbiBjb250ZXh0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViVGVzdFNlcnZpY2UuI2N0b3IoU3lzdGVtLlVyaSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IHBsYWluLW9sZC1YTUwgdGVzdCBzZXJ2aWNlLiAgVGhpcyBhc3N1bWVzIHRoYXQgDQorICAgICAgICAgICAgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSB2ZXJpZmllciB0aGF0IGEgc2VydmljZSBpcyBwcmVzZW50IGFuZCANCisgICAgICAgICAgICByZXNwb25kaW5nIGF0IHRoZSBzZXJ2aWNlIGFkZHJlc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZXJ2aWNlVXJpIj5UaGUgYmFzZSBzZXJ2aWNlIFVSSSwgc3VjaCBhcyANCisgICAgICAgICAgICAic2NoZW1lOi8vaG9zdG5hbWU6cG9ydC9zZXJ2aWNlUGF0aC8iLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlRlc3RTZXJ2aWNlLkNyZWF0ZVVyaShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnl7U3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBzaW1wbGUgUkVTVC1zdHlsZSBVcmkgZ2l2ZW4gdGhlIG1ldGhvZC9zZXJ2aWNlIG5hbWUgYW5kIA0KKyAgICAgICAgICAgIGEgZGljdGlvbmFyeSBvZiBrZXkvdmFsdWUgcGFpcnMgdG8gc2VuZCBhcyBhcmd1bWVudHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZXJ2aWNlIj5UaGUgbWV0aG9kL3NlcnZpY2UgbmFtZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPkEgc2V0IG9mIGtleS92YWx1ZSBwYWlycy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSBuZXcgVXJpLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViVGVzdFNlcnZpY2UuQ3JlYXRlVXJpKFN5c3RlbS5TdHJpbmcsU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeXtTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmd9LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGVzIGEgc2ltcGxlIFJFU1Qtc3R5bGUgVXJpIGdpdmVuIHRoZSBtZXRob2Qvc2VydmljZSBuYW1lIGFuZCANCisgICAgICAgICAgICBhIGRpY3Rpb25hcnkgb2Yga2V5L3ZhbHVlIHBhaXJzIHRvIHNlbmQgYXMgYXJndW1lbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VydmljZSI+VGhlIG1ldGhvZC9zZXJ2aWNlIG5hbWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj5BIHNldCBvZiBrZXkvdmFsdWUgcGFpcnMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icXVlcnlTdHJpbmciPk9wdGlvbmFsIHF1ZXJ5IHN0cmluZy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSBuZXcgVXJpLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViVGVzdFNlcnZpY2UuRGljdGlvbmFyeShTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCdWlsZHMgYSBzaW1wbGUgZGljdGlvbmFyeSBmcm9tIHBhcmFtZXRlcnMuICBUaGUgdmFsdWUgZm9sbG93cyB0aGUgDQorICAgICAgICAgICAga2V5IHBhcmFtZXRlci4gIHtba2V5LCB2YWx1ZV0sIH0gLi4uDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgVGhlIFRvU3RyaW5nKCkgbWV0aG9kIGlzIGNhbGxlZCBvbiBldmVyeSBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj5UaGUgcGFyYW1ldGVycy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSBrZXkvdmFsdWUgZGljdGlvbmFyeSBmcm9tIHRoZSBwYXJhbWV0ZXJzLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViVGVzdFNlcnZpY2UuQ2FsbE1ldGhvZChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5BY3Rpb257TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TZXJ2aWNlUmVzdWx0fSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJlZ2luIGEgUE9YIG1ldGhvZCBjYWxsLiAgVGhlIGNhbGxiYWNrIGlzIHVzZWQgd2l0aCB0aGUgcmVzdWx0IHdoZW4gDQorICAgICAgICAgICAgaXQgYmVjb21lcyBhdmFpbGFibGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXRob2QiPlRoZSBtZXRob2QgbmFtZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjYWxsYmFjayI+VGhlIGNhbGxiYWNrIGFjdGlvbi48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5XZWJUZXN0U2VydmljZS5DYWxsTWV0aG9kKFN5c3RlbS5TdHJpbmcsU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeXtTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmd9LFN5c3RlbS5BY3Rpb257TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TZXJ2aWNlUmVzdWx0fSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJlZ2luIGEgUE9YIG1ldGhvZCBjYWxsLiAgVGhlIGNhbGxiYWNrIGlzIHVzZWQgd2l0aCB0aGUgcmVzdWx0IHdoZW4gDQorICAgICAgICAgICAgaXQgYmVjb21lcyBhdmFpbGFibGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXRob2QiPlRoZSBtZXRob2QgbmFtZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPkRpY3Rpb25hcnkgb2Yga2V5L3ZhbHVlIHBhaXJzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNhbGxiYWNrIj5UaGUgY2FsbGJhY2sgYWN0aW9uLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlRlc3RTZXJ2aWNlLkNhbGxNZXRob2QoU3lzdGVtLlN0cmluZyxTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5e1N5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZ30sU3lzdGVtLlN0cmluZyxTeXN0ZW0uQWN0aW9ue01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2VydmljZVJlc3VsdH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCZWdpbiBhIFBPWCBtZXRob2QgY2FsbC4gIFRoZSBjYWxsYmFjayBpcyB1c2VkIHdpdGggdGhlIHJlc3VsdCB3aGVuIA0KKyAgICAgICAgICAgIGl0IGJlY29tZXMgYXZhaWxhYmxlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWV0aG9kIj5UaGUgbWV0aG9kIG5hbWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj5EaWN0aW9uYXJ5IG9mIGtleS92YWx1ZSBwYWlycy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwb3N0RGF0YSI+T3B0aW9uYWwgc3RyaW5nIHRoYXQgd2lsbCB0cmFuc2Zvcm0gdGhlIA0KKyAgICAgICAgICAgIHJlcXVlc3QgdG8gYSBQT1NUIHJlcXVlc3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2FsbGJhY2siPlRoZSBjYWxsYmFjayBhY3Rpb24uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViVGVzdFNlcnZpY2UuQ2FsbE1ldGhvZFBvc3RDb250aW51ZShTeXN0ZW0uSUFzeW5jUmVzdWx0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIGludGVybWVkaWF0ZSBzdGVwIHRoYXQgd3JpdGVzIHRoZSBQT1NUIGRhdGEgYW5kIHRoZW4gY29udGludWVzIA0KKyAgICAgICAgICAgIHRoZSB3ZWIgcmVxdWVzdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyIj5UaGUgYXN5bmMgcmVzdWx0IG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5XZWJUZXN0U2VydmljZS5SZXNwb25zZUNhbGxiYWNrKFN5c3RlbS5JQXN5bmNSZXN1bHQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm9jZXNzIHRoZSByZXNwb25zZSBjYWxsYmFjayBmcm9tIGEgUE9YIG1ldGhvZCBjYWxsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXIiPlRoZSBhc3luYyByZXN1bHQgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlRlc3RTZXJ2aWNlLlVzZXJJbnRlcmZhY2VUaHJlYWRDYWxsYmFjayhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgT24gdGhlIFVJIHRocmVhZCwgaW52b2tlIHRoZSBjYWxsYmFjayBhY3Rpb24gd2l0aCB0aGUgcmVzdWx0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3RhdGUiPlRoZSB0ZW1wb3Jhcnkgc3RhdGUgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlRlc3RTZXJ2aWNlLkNyb3NzVGhyZWFkU3RhdGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgc2ltcGxlIHR5cGUgdG8gc3RvcmUgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgY3Jvc3MtdGhyZWFkIA0KKyAgICAgICAgICAgIGNhbGxiYWNrLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViVGVzdFNlcnZpY2UuQ3Jvc3NUaHJlYWRTdGF0ZS4jY3RvcihTeXN0ZW0uQWN0aW9ue01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2VydmljZVJlc3VsdH0sTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5XZWJTZXJ2aWNlUmVzdWx0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgVGVtcG9yYXJ5U3RhdGVPYmplY3Qgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2FsbGJhY2siPlRoZSBjYWxsYmFjayBhY3Rpb24uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icmVzdWx0Ij5UaGUgcmVzdWx0IG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5XZWJUZXN0U2VydmljZS5Dcm9zc1RocmVhZFN0YXRlLkNhbGxiYWNrIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBjYWxsYmFjayBhY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5XZWJUZXN0U2VydmljZS5Dcm9zc1RocmVhZFN0YXRlLlJlc3VsdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgcmVzdWx0IG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlRlc3RTZXJ2aWNlLlJlcXVlc3REYXRhIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgcmVxdWVzdCBkYXRhIGNsYXNzLCBzdG9yZXMgaW5mb3JtYXRpb24gdXNlZCBpbiBhIHJlcXVlc3QgZm9yIA0KKyAgICAgICAgICAgIGFzc29jaWF0aW5nIHRoaXMgZGF0YSB3aXRoIHRoZSByZXNwb25zZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlRlc3RTZXJ2aWNlLlJlcXVlc3REYXRhLiNjdG9yKFN5c3RlbS5VcmksU3lzdGVtLk5ldC5IdHRwV2ViUmVxdWVzdCxTeXN0ZW0uQWN0aW9ue01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2VydmljZVJlc3VsdH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyByZXF1ZXN0IGRhdGEgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idXJpIj5UaGUgcmVxdWVzdCBVcmkuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icmVxdWVzdCI+VGhlIHJlcXVlc3Qgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNhbGxiYWNrIj5UaGUgY2FsbGJhY2sgYWN0aW9uLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlRlc3RTZXJ2aWNlLlJlcXVlc3REYXRhLkNvbnZlcnRUb1Jlc3VsdChTeXN0ZW0uTmV0LldlYlJlc3BvbnNlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29udmVydHMgdGhlIHJlcXVlc3QgZGF0YSBvYmplY3QgaW50byBhIHdlYiBzZXJ2aWNlIHJlc3VsdCANCisgICAgICAgICAgICBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyZXNwb25zZSI+VGhlIHJlc3BvbnNlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSBuZXcgV2ViU2VydmljZVJlc3VsdCBpbnN0YW5jZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlRlc3RTZXJ2aWNlLlJlcXVlc3REYXRhLlBvc3REYXRhIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIG9wdGlvbmFsIHBvc3QgZGF0YSBmb3IgdGhlIHJlcXVlc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5XZWJUZXN0U2VydmljZS5SZXF1ZXN0RGF0YS5SZXF1ZXN0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB3ZWIgcmVxdWVzdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLldlYlRlc3RTZXJ2aWNlLlJlcXVlc3REYXRhLlJlcXVlc3RVcmkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHJlcXVlc3QgVXJpLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuV2ViVGVzdFNlcnZpY2UuUmVxdWVzdERhdGEuQ2FsbGJhY2siPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGNhbGxiYWNrIGFjdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkZhc3RSdW5EaXNwYXRjaGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHR5cGUgd2hpY2ggaGFuZGxlcyBwcmVwYXJpbmcgdGhlIHVuZGVybHlpbmcgZGlzcGF0Y2hlciBvciB0aW1lciBmcm9tIA0KKyAgICAgICAgICAgIHdoaWNoIHRoZSB0ZXN0IHdvcmsgaXRlbXMgZXhlY3V0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlJ1bkRpc3BhdGNoZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZSBjYWxsaW5nIGludG8gdGhlIHRlc3QgZnJhbWV3b3JrIGFzIG5lZWRlZCB0byBwZXJmb3JtIHRoZSB0ZXN0DQorICAgICAgICAgICAgcnVuLCBwcm9jZXNzIHRoZSBpbnRlcm5hbCB0ZXN0IGRpc3BhdGNoZXIgcXVldWUsIGFuZCBrZWVwIGV4ZWN1dGlvbg0KKyAgICAgICAgICAgIG1vdmluZyBmb3J3YXJkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuUnVuRGlzcGF0Y2hlci5fcnVuTmV4dFN0ZXAiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERlbGVnYXRlIHRoYXQgcmV0dXJucyB3aGV0aGVyIG1vcmUgd29yayByZW1haW5zIGFuZCBydW5zIHRoZSBuZXh0DQorICAgICAgICAgICAgc2V0IG9mIHdvcmsuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5SdW5EaXNwYXRjaGVyLl9ydW5uaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCYWNraW5nIGZpZWxkIGZvciBhIHZhbHVlIGluZGljYWluZyB3aGV0aGVyIHRoZSBkaXNwYXRjaGVyIHNob3VsZCBiZQ0KKyAgICAgICAgICAgIHJ1bm5pbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5SdW5EaXNwYXRjaGVyLiNjdG9yKFN5c3RlbS5GdW5je1N5c3RlbS5Cb29sZWFufSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgUnVuTWV0aG9kTWFuYWdlciwgdGFraW5nIGluIGEgY29uZGl0aW9uYWwgZGVsZWdhdGUgdG8NCisgICAgICAgICAgICBydW4gZm9yIGVhY2ggc3RlcCB0byBzZWUgaWYgbW9yZSB3b3JrIHJlbWFpbnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJydW5OZXh0U3RlcCI+DQorICAgICAgICAgICAgVGhlIGNvbmRpdGlvbmFsIGRlbGVnYXRlIHRoYXQgcGVyZm9ybXMgd29yayBhbmQgaW5kaWNhdGVzIHdoZXRoZXINCisgICAgICAgICAgICBhZGRpdGlvbmFsIHdvcmsgcmVtYWlucy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5SdW5EaXNwYXRjaGVyLkNyZWF0ZShTeXN0ZW0uRnVuY3tTeXN0ZW0uQm9vbGVhbn0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGUgYSBuZXcgcnVuIG1ldGhvZCBtYW5hZ2VyIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJ1bk5leHRTdGVwIj4NCisgICAgICAgICAgICBDb25kaXRpb25hbCBpbmRpY2F0aW5nIHdoZXRoZXIgbW9yZSB3b3JrIHdpbGwgcmVtYWluIGFmdGVyDQorICAgICAgICAgICAgcGVyZm9ybWluZyB0aGUgd29yay4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFJldHVybnMgdGhlIHJ1biBtZXRob2QgbWFuYWdlci4gVHlwaWNhbGx5IGRlcGVuZHMgb24gdGhlIGV4ZWN1dGlvbiANCisgICAgICAgICAgICBwbGF0Zm9ybSBhbmQgZW52aXJvbm1lbnQuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5SdW5EaXNwYXRjaGVyLkNyZWF0ZShTeXN0ZW0uRnVuY3tTeXN0ZW0uQm9vbGVhbn0sU3lzdGVtLldpbmRvd3MuVGhyZWFkaW5nLkRpc3BhdGNoZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGUgYSBuZXcgcnVuIG1ldGhvZCBtYW5hZ2VyIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJ1bk5leHRTdGVwIj4NCisgICAgICAgICAgICBDb25kaXRpb25hbCBpbmRpY2F0aW5nIHdoZXRoZXIgbW9yZSB3b3JrIHdpbGwgcmVtYWluIGFmdGVyDQorICAgICAgICAgICAgcGVyZm9ybWluZyB0aGUgd29yay4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkaXNwYXRjaGVyIj5BIERpc3BhdGNoZXIgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBSZXR1cm5zIHRoZSBydW4gbWV0aG9kIG1hbmFnZXIuIFR5cGljYWxseSBkZXBlbmRzIG9uIHRoZSBleGVjdXRpb24gDQorICAgICAgICAgICAgcGxhdGZvcm0gYW5kIGVudmlyb25tZW50Lg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuUnVuRGlzcGF0Y2hlci5SdW4iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgY29tcGxldGVseSBzeW5jaHJvbm91cyBpbXBsZW1lbnRhdGlvbiwgdW5sZXNzIG92ZXJyaWRkZW4sIHRoYXQNCisgICAgICAgICAgICBjYWxscyBSdW5OZXh0U3RlcCgpIHVudGlsIHRoZSBoYXJuZXNzIGlzIGZpbmlzaGVkLg0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdpbGwgbm90IHdvcmsgd2l0aCBhIHByZXNlbnRhdGlvbi1yaWNoDQorICAgICAgICAgICAgdGVzdCBlbnZpcm9ubWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlJ1bkRpc3BhdGNoZXIuUnVuTmV4dFN0ZXAiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhbGxzIGEgY29uZGl0aW9uYWwgZGVsZWdhdGUsIGFuZCByZXR1cm5zIHdoZXRoZXIgdGhlcmUgaXMgbW9yZSB3b3JrDQorICAgICAgICAgICAgdG8gYmUgZG9uZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgUmV0dXJucyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGVyZSBpcyBhZGRpdGlvbmFsIHdvcmsNCisgICAgICAgICAgICByZW1haW5pbmcgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBjdXJyZW50IHdvcmsuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5SdW5EaXNwYXRjaGVyLk9uQ29tcGxldGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhbGxzIHRoZSBDb21wbGV0ZSBldmVudCBoYW5kbGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJFOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuUnVuRGlzcGF0Y2hlci5Db21wbGV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRXZlbnQgdGhhdCBpcyBjYWxsZWQgd2hlbiBhbGwgd29yayBpcyBjb21wbGV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlJ1bkRpc3BhdGNoZXIuSXNSdW5uaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGRpc3BhdGNoZXIgc2hvdWxkIGJlIA0KKyAgICAgICAgICAgIHJ1bm5pbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5GYXN0UnVuRGlzcGF0Y2hlci5fZGlzcGF0Y2hlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3RvcmVkIERpc3BhdGNoZXIgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5GYXN0UnVuRGlzcGF0Y2hlci4jY3RvcihTeXN0ZW0uRnVuY3tTeXN0ZW0uQm9vbGVhbn0sU3lzdGVtLldpbmRvd3MuVGhyZWFkaW5nLkRpc3BhdGNoZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZXRzIHVwIGEgbmV3IHJ1biBtZXRob2QgbWFuYWdlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJ1bk5leHRTdGVwIj4NCisgICAgICAgICAgICBDb25kaXRpb25hbCBkZWxlZ2F0ZSB3aGljaCByZXR1cm5zIHRydWUgYXMgbG9uZyBhcyB0aGVyZSBpcyANCisgICAgICAgICAgICBhZGRpdGlvbmFsIHdvcmsuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGlzcGF0Y2hlciI+QW4gaW5zdGFuY2Ugb2YgdGhlIGRpc3BhdGNoZXIgdG8gdXNlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkZhc3RSdW5EaXNwYXRjaGVyLlJ1biI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmVnaW4gdGhlIGV4ZWN1dGlvbiBwcm9jZXNzIGJ5IGhvb2tpbmcgdXAgdGhlIHVuZGVybHlpbmcgDQorICAgICAgICAgICAgRGlzcGF0Y2hlclRpbWVyIHRvIGNhbGwgaW50byB0aGUgdGVzdCBmcmFtZXdvcmsgcmVndWxhcmx5IGFuZCANCisgICAgICAgICAgICBwZXJmb3JtIHRlc3Qgd29yayBpdGVtcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdENsYXNzRGF0YSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBkYXRhIG9iamVjdCB0aGF0IGdlbmVyYXRlcyBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBhbmQgY2FuDQorICAgICAgICAgICAgYmUgdXNlZCBmb3IgcmljaCBkYXRhIGJpbmRpbmcgdG8gdGVzdCByZXN1bHRzLiBEb2VzIGtlZXAgYSByZWZlcmVuY2UNCisgICAgICAgICAgICB0byBhbGwgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdENsYXNzRGF0YS5fcGFyZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQYXJlbnQgb2JqZWN0IHJlZmVyZW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdENsYXNzRGF0YS4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdENsYXNzLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0QXNzZW1ibHlEYXRhKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFRlc3RDbGFzc0RhdGEgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RDbGFzcyI+VGhlIHRlc3QgY2xhc3MgbWV0YWRhdGEuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyZW50Ij5UaGUgcGFyZW50IHRlc3QgYXNzZW1ibHkgZGF0YSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0Q2xhc3NEYXRhLl9tZXRob2RzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCYWNraW5nIHN0b3JlIGZvciB0aGUgc2V0IG9mIHRlc3QgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RDbGFzc0RhdGEuX2V4cGFuZGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCYWNraW5nIGZpZWxkIGZvciB0aGUgZXhwYW5kZWQgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RDbGFzc0RhdGEuQ29sbGFwc2VVbmxlc3NGYWlsdXJlcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29sbGFwc2VzIHRoZSB0ZXN0IGNsYXNzIG5vZGUgdW5sZXNzIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGlsZA0KKyAgICAgICAgICAgIHRlc3QgbWV0aG9kIHRoYXQgZmFpbGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0Q2xhc3NEYXRhLl9wYXNzZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIGEgcGFzc2VkIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0Q2xhc3NEYXRhLkdldFJlc3VsdFJlcG9ydCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0cmlldmVzIHRoZSByZXN1bHRzIHJlcG9ydC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSByZXBvcnQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RDbGFzc0RhdGEuUGFyZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBwYXJlbnQgZGF0YSBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RDbGFzc0RhdGEuTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdENsYXNzRGF0YS5OYW1lc3BhY2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIG5hbWVzcGFjZSBmb3IgdGhlIHRlc3QgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RDbGFzc0RhdGEuVGVzdE1ldGhvZHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYW4gb2JzZXJ2YWJsZSBjb2xsZWN0aW9uIG9mIHRlc3QgY2xhc3MgZGF0YSBvYmplY3RzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0Q2xhc3NEYXRhLklzRXhwYW5kZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgaXRlbSBpcyBleHBhbmRlZCBpbg0KKyAgICAgICAgICAgIGEgaGllcmFyY2hpY2FsIGRpc3BsYXkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RDbGFzc0RhdGEuSXNDaGVja2VkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIGNoZWNrZWQgdmFsdWUuIERvbid0IHRoaW5rIHRoaXMgaXMgYWN0dWFsbHkgdXNlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdENsYXNzRGF0YS5QYXNzZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGVzdCBwYXNzZWQuIElmIGZhaWxlZCwNCisgICAgICAgICAgICB3aWxsIHByb3BhZ2F0ZSB0byB0aGUgcGFyZW50IG1ldGFkYXRhIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdFJ1bkRhdGEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgZGF0YSBvYmplY3QgdGhhdCBnZW5lcmF0ZXMgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYW5kIGNhbg0KKyAgICAgICAgICAgIGJlIHVzZWQgZm9yIHJpY2ggZGF0YSBiaW5kaW5nIHRvIHRlc3QgcmVzdWx0cy4gRG9lcyBrZWVwIGEgcmVmZXJlbmNlDQorICAgICAgICAgICAgdG8gYWxsIHJlc3VsdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RSdW5EYXRhLl9oYXJuZXNzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdW5pdCB0ZXN0IGhhcm5lc3MgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RSdW5EYXRhLl9pbmZvcm1hdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFja2luZyBmaWVsZCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRlc3QgYXBwbGljYXRpb24gaW4gdXNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0UnVuRGF0YS4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0IHJ1biByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idW5pdFRlc3RIYXJuZXNzIj5UaGUgdW5pdCB0ZXN0IGhhcm5lc3MuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0UnVuRGF0YS5fYXNzZW1ibGllcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFja2luZyBzdG9yZSBmb3IgdGhlIHNldCBvZiB0ZXN0IGFzc2VtYmxpZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RSdW5EYXRhLl90aXRsZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGl0bGUgYmFja2luZyBmaWVsZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdFJ1bkRhdGEuX3RvdGFsIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdG9yZXMgdGhlIHRvdGFsIG51bWJlciBvZiBleHBlY3RlZCBzY2VuYXJpb3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RSdW5EYXRhLl9jdXJyZW50VGVzdE1ldGhvZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3RvcmVzIHRoZSBjdXJyZW50IHRlc3QgaW5mb3JtYXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RSdW5EYXRhLl9jdXJyZW50VGVzdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3RvcmVzIHRoZSBjdXJyZW50IHRlc3QgaW5mb3JtYXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RSdW5EYXRhLl9ydW5TY2VuYXJpb3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN0b3JlcyB0aGUgbnVtYmVyIG9mIHJ1biBzY2VuYXJpb3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RSdW5EYXRhLl9mYWlsZWRTY2VuYXJpb3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvdW50IG9mIGZhaWxlZCBzY2VuYXJpb3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RSdW5EYXRhLl9ydW5uaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCYWNraW5nIGZpZWxkIGZvciB3aGV0aGVyIHRoZSBhcHAgaXMgcnVubmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdFJ1bkRhdGEuVGVzdEFwcGxpY2F0aW9uSW5mb3JtYXRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHRlc3QgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RSdW5EYXRhLlVuaXRUZXN0SGFybmVzcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdW5pdCB0ZXN0IGhhcm5lc3MgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RSdW5EYXRhLlRlc3RBc3NlbWJsaWVzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGFuIG9ic2VydmFibGUgY29sbGVjdGlvbiBvZiB0ZXN0IGFzc2VtYmx5IGRhdGEgb2JqZWN0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdFJ1bkRhdGEuVGl0bGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgaW5mb3JtYXRpb25hbCBydW4gdGl0bGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RSdW5EYXRhLlRvdGFsU2NlbmFyaW9zIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIG51bWJlciBvZiB0b3RhbCBzY2VuYXJpb3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RSdW5EYXRhLkN1cnJlbnRUZXN0TWV0aG9kIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIGN1cnJlbnQgdGVzdCBuYW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0UnVuRGF0YS5DdXJyZW50VGVzdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBjdXJyZW50IHRlc3QgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdFJ1bkRhdGEuUnVuU2NlbmFyaW9zIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIG51bWJlciBvZiBydW4gc2NlbmFyaW9zLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0UnVuRGF0YS5GYWlsZWRTY2VuYXJpb3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCBzY2VuYXJpb3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RSdW5EYXRhLlBhc3NlZEFuZENvbXBsZXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBydW4gaXMgY29tcGxldGUgYW5kIHBhc3NlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdFJ1bkRhdGEuUGFzc2VkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIGFsbCBwYXNzaW5nIHJlc3VsdHMgaGF2ZSBiZWVuDQorICAgICAgICAgICAgcHJvY2Vzc2VkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0UnVuRGF0YS5QYXNzZWRTY2VuYXJpb3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIG51bWJlciBvZiBwYXNzZWQgc2NlbmFyaW9zLCBkZWZpbmVkIGFzIHRoZSBudW1iZXIgb2YNCisgICAgICAgICAgICBydW4gc2NlbmFyaW9zIG1pbnVzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHNjZW5hcmlvcyB0cmFja2VkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0UnVuRGF0YS5Jc0Rpc3BhdGNoZXJSdW5uaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBkaXNwYXRjaGVyIGlzIGN1cnJlbnRseSBydW5uaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0UnVuRGF0YS5Jc1J1bm5pbmciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRlc3QgcnVuIGlzIGluIGFjdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RBc3NlbWJseUNvbXBsZXRlZEV2ZW50QXJncyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZW1ibHkgY29tcGxldGUgZXZlbnQgYXJndW1lbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzRXZlbnRBcmdzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZW5lcmljIHVuaXQgdGVzdCBoYXJuZXNzIGV2ZW50IGFyZ3VtZW50cyBiYXNlIGNsYXNzIHRoYXQgY29udGFpbnMgYQ0KKyAgICAgICAgICAgIHJlZmVyZW5jZSB0byB0aGUgaGFybmVzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzc0V2ZW50QXJncy4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBVbml0VGVzdEhhcm5lc3NFdmVudEFyZ3MgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJoYXJuZXNzIj5UaGUgdGVzdCBoYXJuZXNzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzc0V2ZW50QXJncy5Vbml0VGVzdEhhcm5lc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHVuaXQgdGVzdCBoYXJuZXNzIHJlZmVyZW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RBc3NlbWJseUNvbXBsZXRlZEV2ZW50QXJncy4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JQXNzZW1ibHksTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgVGVzdEFzc2VtYmx5Q29tcGxldGVkRXZlbnRBcmdzDQorICAgICAgICAgICAgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFzc2VtYmx5Ij5UaGUgYXNzZW1ibHkgbWV0YWRhdGEuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaGFybmVzcyI+VGhlIHRlc3QgaGFybmVzcyBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0QXNzZW1ibHlDb21wbGV0ZWRFdmVudEFyZ3MuQXNzZW1ibHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGFzc2VtYmx5IG1ldGFkYXRhLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEFzc2VtYmx5U3RhcnRpbmdFdmVudEFyZ3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3QgYXNzZW1ibHkgc3RhcnRpbmcgZXZlbnQgYXJndW1lbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEFzc2VtYmx5U3RhcnRpbmdFdmVudEFyZ3MuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSUFzc2VtYmx5LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFRlc3RBc3NlbWJseVN0YXJ0aW5nRXZlbnRBcmdzDQorICAgICAgICAgICAgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFzc2VtYmx5Ij5UaGUgYXNzZW1ibHkgbWV0YWRhdGEuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaGFybmVzcyI+VGhlIHVuaXQgdGVzdCBoYXJuZXNzIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RBc3NlbWJseVN0YXJ0aW5nRXZlbnRBcmdzLkFzc2VtYmx5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBhc3NlbWJseSBtZXRhZGF0YSBpbmZvcm1hdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc0NvbXBsZXRlZEV2ZW50QXJncyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3QgY2xhc3MgY29tcGxldGVkIGV2ZW50IGFyZ3VtZW50cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc0NvbXBsZXRlZEV2ZW50QXJncy4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdENsYXNzLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFRlc3RDbGFzc0NvbXBsZXRlZEV2ZW50QXJncw0KKyAgICAgICAgICAgIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdENsYXNzIj5UZXN0IGNsYXNzIG1ldGFkYXRhLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imhhcm5lc3MiPlRoZSBoYXJuZXNzIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc0NvbXBsZXRlZEV2ZW50QXJncy5UZXN0Q2xhc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHRlc3QgY2xhc3MgbWV0YWRhdGEuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0Q2xhc3NTdGFydGluZ0V2ZW50QXJncyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXJ0IG9mIGEgdGVzdCBjbGFzcyBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc1N0YXJ0aW5nRXZlbnRBcmdzLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3MsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgVGVzdENsYXNzU3RhcnRpbmdFdmVudEFyZ3MgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RDbGFzcyI+VGhlIHRlc3QgY2xhc3MgbWV0YWRhdGEuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaGFybmVzcyI+VGhlIHVuaXQgdGVzdCBoYXJuZXNzIHJlZmVyZW5jZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0Q2xhc3NTdGFydGluZ0V2ZW50QXJncy5UZXN0Q2xhc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHRlc3QgY2xhc3MgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0TWV0aG9kU3RhcnRpbmdFdmVudEFyZ3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3QgbWV0aG9kIHN0YXJ0aW5nIGV2ZW50IGFyZ3VtZW50cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RTdGFydGluZ0V2ZW50QXJncy4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZCxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdENsYXNzLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFRlc3RNZXRob2RTdGFydGluZ0V2ZW50QXJncyB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdE1ldGhvZCI+VGhlIHRlc3QgbWV0aG9kIG1ldGFkYXRhLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RDbGFzcyI+VGhlIHRlc3QgY2xhc3MgbWV0YWRhdGEuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaGFybmVzcyI+VGhlIHRlc3QgaGFybmVzcyBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0TWV0aG9kU3RhcnRpbmdFdmVudEFyZ3MuVGVzdE1ldGhvZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdGVzdCBtZXRob2QgbWV0YWRhdGEuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0TWV0aG9kU3RhcnRpbmdFdmVudEFyZ3MuVGVzdENsYXNzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB0ZXN0IGNsYXNzIG1ldGFkYXRhLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFJ1blN0YXJ0aW5nRXZlbnRBcmdzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IG1ldGhvZCBjb21wbGV0ZWQgZXZlbnQgYXJndW1lbnRzLCBjb250YWlucyB0aGUgcmVzdWx0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFJ1blN0YXJ0aW5nRXZlbnRBcmdzLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0U2V0dGluZ3MsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UnVuRmlsdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFRlc3RSdW5TdGFydGluZ0V2ZW50QXJncw0KKyAgICAgICAgICAgIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZXR0aW5ncyI+VGhlIHRlc3QgcnVuIGZpbHRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWx0ZXIiPlRoZSB0ZXN0IHJ1biBzZXR0aW5ncyBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFJ1blN0YXJ0aW5nRXZlbnRBcmdzLlNldHRpbmdzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB1bml0IHRlc3QgcnVuIHNldHRpbmdzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFJ1blN0YXJ0aW5nRXZlbnRBcmdzLlRlc3RSdW5GaWx0ZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHRlc3QgcnVuIGZpbHRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RSdW5TdGFydGluZ0V2ZW50QXJncy5UZXN0SGFybmVzc05hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdGVzdCBoYXJuZXNzIG5hbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UnVuU3RhcnRpbmdFdmVudEFyZ3MuRW5xdWV1ZWRBc3NlbWJsaWVzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIG51bWJlciBvZiB2YWxpZCwgZW5xdWV1ZWQgYXNzZW1ibGllcyBzY2hlZHVsZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVGFnQXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUYWcgYXR0cmlidXRlIHVzZWQgdG8gYXNzb2NpYXRlIGluZGl2aWR1YWwgdGVzdCBjYXNlcyB3aXRoIHRhZ3MgdG8NCisgICAgICAgICAgICBlYXNpbHkgdGVzdCByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIFRoZSBpbmZyYXN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIFRhZ0F0dHJpYnV0ZSBpcyBub3QgeWV0IGluIHBsYWNlLg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlRhZ0F0dHJpYnV0ZS5SZXNlcnZlZFdvcmRzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBMaXN0IG9mIHJlc2VydmVkIHdvcmRzIHRoYXQgY2Fubm90IGJlIHVzZWQgYXMgdGFncy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJlbWFya3M+DQorICAgICAgICAgICAgVGhpcyBsaXN0IHNob3VsZCBiZSBzaGFyZWQgd2l0aCB0aGUgdGFnIHBhcnNlciBpbXBsZW1lbnRhdGlvbiB3aGVuDQorICAgICAgICAgICAgYXZhaWxhYmxlLg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlRhZ0F0dHJpYnV0ZS5SZXNlcnZlZENoYXJhY3RlcnMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIExpc3Qgb2YgcmVzZXJ2ZWQgY2hhcmFjdGVycyB0aGF0IGNhbm5vdCBiZSB1c2VkIGluIHRhZ3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIFRoaXMgbGlzdCBzaG91bGQgYmUgc2hhcmVkIHdpdGggdGhlIHRhZyBwYXJzZXIgaW1wbGVtZW50YXRpb24gd2hlbg0KKyAgICAgICAgICAgIGF2YWlsYWJsZS4NCisgICAgICAgICAgICA8L3JlbWFya3M+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5UYWdBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBUYWdBdHRyaWJ1dGUgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YWciPg0KKyAgICAgICAgICAgIFRhZyBhc3NvY2lhdGVkIHdpdGggdGhlIHRlc3QgbWV0aG9kIG9yIGNsYXNzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5UYWdBdHRyaWJ1dGUuVGFnIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoZSB0ZXN0IG1ldGhvZCBvciBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkhhcm5lc3NFeHRlbnNpb25zIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZXQgb2YgZXh0ZW5zaW9uIG1ldGhvZHMgdXNlZCBieSB0aGUgaGFybmVzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkhhcm5lc3NFeHRlbnNpb25zLkFkZFJhbmdlYGAxKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0e2BgMH0sU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUVudW1lcmFibGV7YGAwfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFuIEFkZFJhbmdlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZ2VuZXJpYyBJTGlzdCBpbnRlcmZhY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVExpc3RUeXBlIj5UaGUgbGlzdCB0eXBlLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJsaXN0Ij5UaGUgbGlzdCBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+VGhlIGNvbGxlY3Rpb24gdG8gY29weSBpbnRvIHRoZSBsaXN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkhhcm5lc3NFeHRlbnNpb25zLlJlcGxhY2VgYDEoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUxpc3R7YGAwfSxTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRW51bWVyYWJsZXtgYDB9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVwbGFjZSBhIGxpc3QncyBjb250ZW50cyB3aXRoIHRoZSBpdGVtcyBpbiB0aGUgSUVudW1lcmFibGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVExpc3RUeXBlIj5UaGUgbGlzdCB0eXBlLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJsaXN0Ij5UaGUgbGlzdCBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VxdWVuY2UiPlRoZSBzZXF1ZW5jZSB0byBjb3B5IGludG8gdGhlIGxpc3QuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuSVByb3ZpZGVEeW5hbWljVGVzdE1ldGhvZHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBJUHJvdmlkZUR5bmFtaWNUZXN0TWV0aG9kcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBwcm92aWRlIGFkZGl0aW9uYWwNCisgICAgICAgICAgICB0ZXN0IG1ldGhvZHMgZHluYW1pY2FsbHkgYXQgcnVudGltZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLklQcm92aWRlRHluYW1pY1Rlc3RNZXRob2RzLkdldER5bmFtaWNUZXN0TWV0aG9kcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSBkeW5hbWljIHRlc3QgbWV0aG9kcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+U2VxdWVuY2Ugb2YgZHluYW1pYyB0ZXN0IG1ldGhvZHMuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5SZXRyeVRlc3RSdW5GaWx0ZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgdHlwZSBmaWx0ZXIgZm9yIGp1c3QgYSBzcGVjaWZpYyB0ZXN0LiAgQWxsb3dzIHRoZSByZS1ydW5uaW5nIG9mIGEgDQorICAgICAgICAgICAgc2luZ2xlIHJlc3VsdCBhZ2FpbiBpbiB0aGUgc2FtZSBwcm9jZXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFJ1bkZpbHRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB0eXBlIHRvIGZpbHRlciBkb3duIGNvbXBsZXRlIHNldHMgb2YgY2xhc3NlcywgdGVzdHMgYW5kIG1ldGhvZHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UnVuRmlsdGVyLkRlZmF1bHRUZXN0UnVuTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIGRlZmF1bHQgdW5pdCB0ZXN0IHJ1biBuYW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFJ1bkZpbHRlci5fc2V0dGluZ3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVuaXQgdGVzdCBzZXR0aW5ncy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RSdW5GaWx0ZXIuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncyxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IHRlc3QgcnVuIGZpbHRlciB1c2luZyBhbiBleGlzdGluZyBzZXR0aW5ncyBmaWxlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2V0dGluZ3MiPkEgdW5pdCB0ZXN0IHNldHRpbmdzIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imhhcm5lc3MiPlRoZSB1bml0IHRlc3QgaGFybmVzcy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UnVuRmlsdGVyLkdldFRlc3RDbGFzc2VzKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklBc3NlbWJseSxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc0luc3RhbmNlRGljdGlvbmFyeSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHJpZXZlIGEgc2V0IG9mIHRlc3QgY2xhc3NlcyBmcm9tIGEgdGVzdCBhc3NlbWJseS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFzc2VtYmx5Ij5UaGUgdGVzdCBhc3NlbWJseSBtZXRhZGF0YSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5zdGFuY2VzIj5UZXN0IGNsYXNzIGluc3RhbmNlIGRpY3Rpb25hcnkuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgbmV3IGxpc3Qgb2YgdGVzdCBjbGFzcyBtZXRhZGF0YSBvYmplY3RzLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFJ1bkZpbHRlci5Tb3J0VGVzdENsYXNzZXMoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUxpc3R7TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RDbGFzc30pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTb3J0IHRoZSB0ZXN0IGNsYXNzZXMgaWYgdGhlIHNldHRpbmdzIGZvciBhbHBoYWJldGljYWwgc29ydGluZyBhcmUgDQorICAgICAgICAgICAgcHJlc2VudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RzIj5MaXN0IG9mIHRlc3QgY2xhc3Nlcy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UnVuRmlsdGVyLkZpbHRlclRlc3RDbGFzc2VzKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0e01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3N9LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdENsYXNzSW5zdGFuY2VEaWN0aW9uYXJ5KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRmlsdGVyIG91dCB0ZXN0cyBiYXNlZCBvbiB0aGUgc3RhbmRhcmQtc3VwcG9ydGVkIG1ldGhvZHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjbGFzc2VzIj5MaXN0IG9mIHRlc3QgY2xhc3Nlcy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbnN0YW5jZXMiPlRlc3QgY2xhc3MgaW5zdGFuY2UgZGljdGlvbmFyeS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UnVuRmlsdGVyLkZpbHRlckN1c3RvbVRlc3RDbGFzc2VzKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0e01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3N9LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdENsYXNzSW5zdGFuY2VEaWN0aW9uYXJ5KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUGVyZm9ybSBhbnkgY3VzdG9tIGZpbHRlcmluZyB0aGF0IHRoZSBUZXN0UnVuRmlsdGVyIG5lZWRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2xhc3NlcyI+TGlzdCBvZiB0ZXN0IGNsYXNzZXMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5zdGFuY2VzIj5UZXN0IGNsYXNzIGluc3RhbmNlIGRpY3Rpb25hcnkuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFJ1bkZpbHRlci5GaWx0ZXJMZWdhY3lUZXN0Q2xhc3NlcyhTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JTGlzdHtNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdENsYXNzfSxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc0luc3RhbmNlRGljdGlvbmFyeSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIElmIHNwZWNpZmljIHN0cmluZy1jb250YWlucyBmaWx0ZXJzIGFyZSBwcmVzZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2xhc3NlcyI+TGlzdCBvZiB0ZXN0IGNsYXNzZXMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5zdGFuY2VzIj5UZXN0IGNsYXNzIGluc3RhbmNlIGRpY3Rpb25hcnkuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFJ1bkZpbHRlci5GaWx0ZXJFeGNsdXNpdmVUZXN0Q2xhc3NlcyhTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JTGlzdHtNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdENsYXNzfSxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc0luc3RhbmNlRGljdGlvbmFyeSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIElmIGFueSBleGNsdXNpdmUgY2xhc3NlcyBhcmUgZm91bmQsIGZpbHRlciB0aGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2xhc3NlcyI+TGlzdCBvZiB0ZXN0IGNsYXNzZXMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5zdGFuY2VzIj5UZXN0IGNsYXNzIGluc3RhbmNlIGRpY3Rpb25hcnkuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFJ1bkZpbHRlci5HZXRUZXN0TWV0aG9kcyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdENsYXNzLFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXRyaWV2ZXMgdGhlIHRlc3QgbWV0aG9kcyBmcm9tIGEgdGVzdCBjbGFzcyBtZXRhZGF0YSBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0Ij5UaGUgdGVzdCBjbGFzcyBtZXRhZGF0YSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5zdGFuY2UiPlRoZSB0ZXN0IGNsYXNzIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIGxpc3Qgb2YgdGVzdCBtZXRob2QgbWV0YWRhdGEgb2JqZWN0cy48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RSdW5GaWx0ZXIuRmlsdGVyVGVzdE1ldGhvZHMoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUxpc3R7TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2R9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRmlsdGVyIHRoZSB0ZXN0IG1ldGhvZHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXRob2RzIj5MaXN0IG9mIHRlc3QgbWV0aG9kcy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UnVuRmlsdGVyLkZpbHRlckN1c3RvbVRlc3RNZXRob2RzKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0e01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0TWV0aG9kfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFBlcmZvcm0gYW55IGN1c3RvbSBmaWx0ZXJpbmcgdGhhdCB0aGUgVGVzdFJ1bkZpbHRlciBuZWVkcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1ldGhvZHMiPkxpc3Qgb2YgdGVzdCBtZXRob2RzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RSdW5GaWx0ZXIuRmlsdGVyRXhjbHVzaXZlVGVzdE1ldGhvZHMoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUxpc3R7TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2R9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWYgYW55IGV4Y2x1c2l2ZSBjbGFzc2VzIGFyZSBmb3VuZCwgZmlsdGVyIHRoZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXRob2RzIj5MaXN0IG9mIHRlc3QgbWV0aG9kcy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UnVuRmlsdGVyLlNvcnRUZXN0TWV0aG9kcyhTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JTGlzdHtNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTb3J0cyB0aGUgdGVzdCBtZXRob2RzLCBpZiByZXF1ZXN0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXRob2RzIj5MaXN0IG9mIHRlc3QgbWV0aG9kcy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UnVuRmlsdGVyLlRlc3RSdW5OYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgZnJpZW5kbHkgbmFtZSBmb3IgdGhlIHRlc3QgcnVuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFJ1bkZpbHRlci5Vbml0VGVzdEhhcm5lc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHVuaXQgdGVzdCBoYXJuZXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuUmV0cnlUZXN0UnVuRmlsdGVyLl90ZXN0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdGVzdCBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlJldHJ5VGVzdFJ1bkZpbHRlci5fbWV0aG9kIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdGVzdCBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5SZXRyeVRlc3RSdW5GaWx0ZXIuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RDbGFzcyxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IHRlc3QgcnVuIGZpbHRlciB1c2luZyBhbiBleGlzdGluZyBzZXR0aW5ncyBmaWxlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdCI+VGhlIHRlc3QgY2xhc3MgbWV0YWRhdGEuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWV0aG9kIj5UaGUgdGVzdCBtZXRob2QgbWV0YWRhdGEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuUmV0cnlUZXN0UnVuRmlsdGVyLkdldFRlc3RDbGFzc2VzKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklBc3NlbWJseSxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc0luc3RhbmNlRGljdGlvbmFyeSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHJpZXZlIGEgc2V0IG9mIHRlc3QgY2xhc3NlcyBmcm9tIGEgdGVzdCBhc3NlbWJseS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFzc2VtYmx5Ij5UaGUgdGVzdCBhc3NlbWJseSBtZXRhZGF0YSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5zdGFuY2VzIj5UZXN0IGNsYXNzIGluc3RhbmNlIGRpY3Rpb25hcnkuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgbmV3IGxpc3Qgb2YgdGVzdCBjbGFzcyBtZXRhZGF0YSBvYmplY3RzLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuUmV0cnlUZXN0UnVuRmlsdGVyLkdldFRlc3RNZXRob2RzKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3MsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHJpZXZlcyB0aGUgdGVzdCBtZXRob2RzIGZyb20gYSB0ZXN0IGNsYXNzIG1ldGFkYXRhIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3QiPlRoZSB0ZXN0IGNsYXNzIG1ldGFkYXRhIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbnN0YW5jZSI+VGhlIHRlc3QgY2xhc3MgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgbGlzdCBvZiB0ZXN0IG1ldGhvZCBtZXRhZGF0YSBvYmplY3RzLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnTWFuYWdlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBoZWxwZXIgY2xhc3MgdGhhdCBtYW5hZ2VzIHRhZ3MgYW5kIGFzc29jaWF0ZWQgbWV0YWRhdGEuIFRhZw0KKyAgICAgICAgICAgIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgYXQgdGhlIFRlc3RDbGFzcyBsZXZlbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBoZWxwZXIgY2xhc3MgdGhhdCBtYW5hZ2VzIHRhZ3MgYW5kIGFzc29jaWF0ZWQgbWV0YWRhdGEuIFRhZw0KKyAgICAgICAgICAgIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgYXQgdGhlIFRlc3RDbGFzcyBsZXZlbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBoZWxwZXIgY2xhc3MgdGhhdCBtYW5hZ2VzIHRhZ3MgYW5kIGFzc29jaWF0ZWQgbWV0YWRhdGEuIFRhZw0KKyAgICAgICAgICAgIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgYXQgdGhlIFRlc3RDbGFzcyBsZXZlbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIuUHJpb3JpdHlUYWdQcmVmaXgiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBwcmVmaXggZm9yIGFueSB0YWdzIGdlbmVyYXRlZCBmcm9tIHByaW9yaXR5IHZhbHVlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIuVGFnVHlwZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIHRhZyBhdHRyaWJ1dGUgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIuX2NsYXNzVGFncyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3QgdGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnTWFuYWdlci5fbWV0aG9kVGFncyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3QgdGFncyBhc3NvY2lhdGVkIHdpdGggbWV0aG9kcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIuX3RhZ3NUb01ldGhvZHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBhYmlsaXR5IHRvIGdyYWIgdGhlIHNldCBvZiBtZXRob2RzLCBnaXZlbiBhIHRlc3QgY2xhc3MgdHlwZSwgDQorICAgICAgICAgICAgYW5kIHRoZSB0YWcgb2YgaW50ZXJlc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdNYW5hZ2VyLl90ZXN0Q2xhc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB0ZXN0IGNsYXNzIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdNYW5hZ2VyLiNjdG9yKFN5c3RlbS5UeXBlLFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklFbnVtZXJhYmxle01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0TWV0aG9kfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IHRhZyBtYW5hZ2VyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdCI+VGhlIHRlc3QgY2xhc3MgdHlwZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXRob2RzIj5UaGUgc2V0IG9mIG1ldGhvZHMgdG8gcnVuLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIuQ3JlYXRlQ2xhc3NUYWdzKFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVmbGVjdCwgcmVhZCBhbmQgcHJlcGFyZSB0aGUgdGFncyBmb3IgdGhlIGNsYXNzIG1ldGFkYXRhLiBQZXJmb3JtcyANCisgICAgICAgICAgICB0aGUgd29yayBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBtZXRhZGF0YSBoYXMgYmVlbiBzZWVuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdCI+VGhlIHJlZmxlY3Rpb24gb2JqZWN0IGZvciB0aGUgdGVzdCBjbGFzcy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdNYW5hZ2VyLkNyZWF0ZU1ldGhvZFRhZ3MoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZWZsZWN0LCByZWFkIGFuZCBwcmVwYXJlIHRoZSB0YWdzIGZvciB0aGUgbWV0aG9kIG1ldGFkYXRhLiBQZXJmb3JtcyANCisgICAgICAgICAgICB0aGUgd29yayBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBtZXRhZGF0YSBoYXMgYmVlbiBzZWVuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWV0aG9kIj5UaGUgbWV0aG9kIG1ldGFkYXRhLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIuRXZhbHVhdGVFeHByZXNzaW9uKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIHRlc3QgbWV0aG9kcyB0aGF0IGNvcnJlc3BvbmQgdG8gYSB0YWcgZXhwcmVzc2lvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRhZ0V4cHJlc3Npb24iPlRhZyBleHByZXNzaW9uLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGVzdCBtZXRob2RzIGZvciB0aGUgdGFnIGV4cHJlc3Npb24uPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdNYW5hZ2VyLlVuaXZlcnNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIHVuaXZlcnNlIG9mIGFsbCB0ZXN0IG1ldGhvZHMgZm9yIGV4cHJlc3Npb24gDQorICAgICAgICAgICAgZXZhbHVhdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIuRXhwcmVzc2lvbkV2YWx1YXRvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRXZhbHVhdGUgdGFnIGV4cHJlc3Npb25zLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBUYWcgZXhwcmVzc2lvbnMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgZm9sbG93aW5nIEVCTkYgZ3JhbW1hcjoNCisgICAgICAgICAgICAgICAge0V4cHJlc3Npb259IDo9DQorICAgICAgICAgICAgICAgICAgICB7RXhwcmVzc2lvbn0gKyB7VGVybX0gfA0KKyAgICAgICAgICAgICAgICAgICAge0V4cHJlc3Npb259IC0ge1Rlcm19IHwNCisgICAgICAgICAgICAgICAgICAgIHtUZXJtfQ0KKyAgICAgICAgICAgICAgICB7VGVybX0gOj0NCisgICAgICAgICAgICAgICAgICAgIHtUZXJtfSAqIHtGYWN0b3J9IHwNCisgICAgICAgICAgICAgICAgICAgIHtGYWN0b3J9DQorICAgICAgICAgICAgICAgIHtGYWN0b3J9IDo9DQorICAgICAgICAgICAgICAgICAgICAhe0ZhY3Rvcn0gfA0KKyAgICAgICAgICAgICAgICAgICAgKHtFeHByZXNzaW9ufSkgfA0KKyAgICAgICAgICAgICAgICAgICAge1RhZ30NCisgICAgICAgICAgICAgICAge1RhZ30gOj0NCisgICAgICAgICAgICAgICAgICAgIEFsbCB8DQorICAgICAgICAgICAgICAgICAgICBbXkludmFsaWRDaGFyYWN0ZXJzXSsNCisgICAgICAgICAgICAgDQorICAgICAgICAgICAgVGhlIG5vbi10ZXJtaW5hbHMgZm9yIHtFeHByZXNzaW9ufSBhbmQge1Rlcm19IHdpbGwgYmUgbGVmdCBmYWN0b3JlZA0KKyAgICAgICAgICAgIGluIHRoZSByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIgYmVsb3cuDQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdNYW5hZ2VyLkV4cHJlc3Npb25FdmFsdWF0b3IuVW5pb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVuaW9uIGNoYXJhY3Rlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIuRXhwcmVzc2lvbkV2YWx1YXRvci5JbnRlcnNlY3Rpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEludGVyc2VjdGlvbiBjaGFyYWN0ZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdNYW5hZ2VyLkV4cHJlc3Npb25FdmFsdWF0b3IuQ29tcGxlbWVudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29tcGxlbWVudCBjaGFyYWN0ZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdNYW5hZ2VyLkV4cHJlc3Npb25FdmFsdWF0b3IuRGlmZmVyZW5jZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGlmZmVyZW5jZSBjaGFyYWN0ZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdNYW5hZ2VyLkV4cHJlc3Npb25FdmFsdWF0b3IuQWxsIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgIkFsbCIgc3RyaW5nIGNvbnN0YW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnTWFuYWdlci5FeHByZXNzaW9uRXZhbHVhdG9yLkludmFsaWRDaGFyYWN0ZXJzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbnZhbGlkIGNoYXJhY3RlcnMgaW4gYSB0YWcgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIuRXhwcmVzc2lvbkV2YWx1YXRvci5FdmFsdWF0ZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEV2YWx1YXRlIGEgdGFnIGV4cHJlc3Npb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJvd25lciI+VGhlIG93bmVyIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YWdFeHByZXNzaW9uIj5UYWcgZXhwcmVzc2lvbi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRlc3QgbWV0aG9kcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhZyBleHByZXNzaW9uLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnTWFuYWdlci5FeHByZXNzaW9uRXZhbHVhdG9yLl9vd25lciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIG93bmluZyBUYWdNYW5hZ2VyIGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnTWFuYWdlci5FeHByZXNzaW9uRXZhbHVhdG9yLl90YWdFeHByZXNzaW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeHByZXNzaW9uIGJlaW5nIGV2YWx1YXRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIuRXhwcmVzc2lvbkV2YWx1YXRvci5fcG9zaXRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGV4cHJlc3Npb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdNYW5hZ2VyLkV4cHJlc3Npb25FdmFsdWF0b3IuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdNYW5hZ2VyLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGUgYW4gZXhwcmVzc2lvbiBldmFsdWF0b3IuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJvd25lciI+VGhlIG93bmVyIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YWdFeHByZXNzaW9uIj5FeHByZXNzaW9uIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdNYW5hZ2VyLkV4cHJlc3Npb25FdmFsdWF0b3IuTWF0Y2goU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1hdGNoIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5TdHJpbmcgdG8gbWF0Y2guPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnTWFuYWdlci5FeHByZXNzaW9uRXZhbHVhdG9yLlRyeU1hdGNoKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUcnkgdG8gbWF0Y2ggYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlN0cmluZyB0byBtYXRjaC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hdGNoIHdhcyANCisgICAgICAgICAgICBzdWNjZXNzZnVsLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnTWFuYWdlci5FeHByZXNzaW9uRXZhbHVhdG9yLkV2YWx1YXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFdmFsdWF0ZSBhbiBleHByZXNzaW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5UZXN0IG1ldGhvZHMgZGVzY3JpYmVkIGJ5IHRoZSBleHByZXNzaW9uLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnTWFuYWdlci5FeHByZXNzaW9uRXZhbHVhdG9yLlJlYWRFeHByZXNzaW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFdmFsdWF0ZSBhbiBleHByZXNzaW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5UZXN0IG1ldGhvZHMgZGVzY3JpYmVkIGJ5IHRoZSBleHByZXNzaW9uLjwvcmV0dXJucz4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBXZSBuZWVkIHRvIGZhY3RvciBvdXQgbGVmdCByZWN1cnNpb24sIHNvOg0KKyAgICAgICAgICAgICAgICB7RXhwcmVzc2lvbn0gOj0NCisgICAgICAgICAgICAgICAgICAgIHtFeHByZXNzaW9ufSArIHtUZXJtfSB8DQorICAgICAgICAgICAgICAgICAgICB7RXhwcmVzc2lvbn0gLSB7VGVybX0gfA0KKyAgICAgICAgICAgICAgICAgICAge1Rlcm19DQorICAgICAgICAgICAgYmVjb21lczoNCisgICAgICAgICAgICAgICAge0V4cHJlc3Npb259IDo9DQorICAgICAgICAgICAgICAgIAl7VGVybX17RXhwcmVzc2lvbid9DQorICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICB7RXhwcmVzc2lvbid9IDo9DQorICAgICAgICAgICAgICAgIAkjZW1wdHkjDQorICAgICAgICAgICAgICAgIAkrIHtUZXJtfXtFeHByZXNzaW9uJ30NCisgICAgICAgICAgICAgICAgCS0ge1Rlcm19e0V4cHJlc3Npb24nfQ0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnTWFuYWdlci5FeHByZXNzaW9uRXZhbHVhdG9yLlJlYWRFeHByZXNzaW9uKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklFbnVtZXJhYmxle01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0TWV0aG9kfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEV2YWx1YXRlIGFuIGV4cHJlc3Npb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXJtIj4NCisgICAgICAgICAgICBMZWZ0IHRlcm0gYWxyZWFkeSByZWFkIGFzIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UZXN0IG1ldGhvZHMgZGVzY3JpYmVkIGJ5IHRoZSBleHByZXNzaW9uLjwvcmV0dXJucz4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBOb24tdGVybWluYWwgY3JlYXRlZCBmb3IgbGVmdC1mYWN0b3Jpbmc6DQorICAgICAgICAgICAgICAgIHtFeHByZXNzaW9uJ30gOj0NCisgICAgICAgICAgICAgICAgCSNlbXB0eSMNCisgICAgICAgICAgICAgICAgCSsge1Rlcm19e0V4cHJlc3Npb24nfQ0KKyAgICAgICAgICAgICAgICAJLSB7VGVybX17RXhwcmVzc2lvbid9DQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdNYW5hZ2VyLkV4cHJlc3Npb25FdmFsdWF0b3IuUmVhZFRlcm0iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEV2YWx1YXRlIGEgdGVybS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+VGVzdCBtZXRob2RzIGRlc2NyaWJlZCBieSB0aGUgZXhwcmVzc2lvbi48L3JldHVybnM+DQorICAgICAgICAgICAgPHJlbWFya3M+DQorICAgICAgICAgICAgV2UgbmVlZCB0byBmYWN0b3Igb3V0IGxlZnQgcmVjdXJzaW9uLCBzbzoNCisgICAgICAgICAgICAgICAge1Rlcm19IDo9DQorICAgICAgICAgICAgICAgICAgICB7RmFjdG9yfSAqIHtUZXJtfSB8DQorICAgICAgICAgICAgICAgICAgICB7RmFjdG9yfQ0KKyAgICAgICAgICAgIGJlY29tZXM6DQorICAgICAgICAgICAgICAgIHtUZXJtfSA6PQ0KKyAgICAgICAgICAgICAgICAgICAge0ZhY3Rvcn17VGVybSd9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgIHtUZXJtJ30gOj0NCisgICAgICAgICAgICAgICAgCSNlbXB0eSMNCisgICAgICAgICAgICAgICAgCV4ge0ZhY3Rvcn17VGVybSd9DQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdNYW5hZ2VyLkV4cHJlc3Npb25FdmFsdWF0b3IuUmVhZFRlcm0oU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUVudW1lcmFibGV7TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2R9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRXZhbHVhdGUgYSB0ZXJtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmFjdG9yIj4NCisgICAgICAgICAgICBMZWZ0IHRlcm0gYWxyZWFkeSByZWFkIGFzIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UZXN0IG1ldGhvZHMgZGVzY3JpYmVkIGJ5IHRoZSBleHByZXNzaW9uLjwvcmV0dXJucz4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBOb24tdGVybWluYWwgY3JlYXRlZCBmb3IgbGVmdC1mYWN0b3Jpbmc6DQorICAgICAgICAgICAgICAgIHtUZXJtJ30gOj0NCisgICAgICAgICAgICAgICAgCSNlbXB0eSMNCisgICAgICAgICAgICAgICAgCV4ge0ZhY3Rvcn17VGVybSd9DQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdNYW5hZ2VyLkV4cHJlc3Npb25FdmFsdWF0b3IuUmVhZEZhY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRXZhbHVhdGUgYSBmYWN0b3IuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRlc3QgbWV0aG9kcyBkZXNjcmliZWQgYnkgdGhlIGV4cHJlc3Npb24uPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIHtGYWN0b3J9IDo9DQorICAgICAgICAgICAgICAgICF7RmFjdG9yfSB8DQorICAgICAgICAgICAgICAgICh7RXhwcmVzc2lvbn0pIHwNCisgICAgICAgICAgICAgICAge1RhZ30NCisgICAgICAgICAgICA8L3JlbWFya3M+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIuRXhwcmVzc2lvbkV2YWx1YXRvci5DcmVhdGVFbXB0eUxpc3QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgZW1wdHkgY29sbGVjdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhbiBlbXB0eSBjb2xsZWN0aW9uLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnTWFuYWdlci5FeHByZXNzaW9uRXZhbHVhdG9yLlJlYWRUYWciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEV2YWx1YXRlIGEgdGFnLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5UZXN0IG1ldGhvZHMgZGVzY3JpYmVkIGJ5IHRoZSBleHByZXNzaW9uLjwvcmV0dXJucz4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICB7VGFnfSA6PQ0KKyAgICAgICAgICAgICAgICBBbGwgfA0KKyAgICAgICAgICAgICAgICBbXkludmFsaWRDaGFyYWN0ZXJzXSsNCisgICAgICAgICAgICA8L3JlbWFya3M+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIuVGFncyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBzdHJpbmcgbGlzdCBmb3Igc3RvcmluZyB0YWdzLiBQcm92aWRlcyBhbiBBZGQgbWV0aG9kIHRoYXQgdGFrZXMgDQorICAgICAgICAgICAgYW4gYXR0cmlidXRlIG9iamVjdCBhbmQsIGlmIGEgVGFnQXR0cmlidXRlLCB3aWxsIGFwcGVuZCBpdHMgdGFnIA0KKyAgICAgICAgICAgIHZhbHVlIHRvIHRoZSBsaXN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnTWFuYWdlci5UYWdzLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBUYWdzIGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnTWFuYWdlci5UYWdzLiNjdG9yKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklFbnVtZXJhYmxle1N5c3RlbS5TdHJpbmd9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgVGFncyBpbnN0YW5jZSBmcm9tIGFuIGV4aXN0aW5nIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5UaGUgY29sbGVjdGlvbiB0byBjb3B5LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIuVGFncy5BZGQoU3lzdGVtLkF0dHJpYnV0ZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFkZHMgYSBUYWdBdHRyaWJ1dGUncyB0YWcgdmFsdWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YWciPlRoZSB0YWcgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ1Rlc3RSdW5GaWx0ZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgbWV0aG9kIGFuZCBjbGFzcyBmaWx0ZXIgdGhhdCB1c2VzIGV4cHJlc3Npb25zIGFuZCB0aGUgVGFnQXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnVGVzdFJ1bkZpbHRlci5OdWxsVGFnUnVuTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIG5hbWUgdG8gdXNlIGZvciB0aGUgdGVzdCBydW4gd2hlbiB0aGUgdGFnIGV4cHJlc3Npb24gaXMgbnVsbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ1Rlc3RSdW5GaWx0ZXIuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncyxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IHRlc3QgcnVuIGZpbHRlciB3aXRoIHRoZSB0YWcgZXhwcmVzc2lvbiBzZXR0aW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2V0dGluZ3MiPlVuaXQgdGVzdCBzZXR0aW5ncy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJoYXJuZXNzIj5Vbml0IHRlc3QgaGFybmVzcy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdUZXN0UnVuRmlsdGVyLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0U2V0dGluZ3MsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IHRlc3QgcnVuIGZpbHRlciB3aXRoIHRoZSB0YWcgZXhwcmVzc2lvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNldHRpbmdzIj5Vbml0IHRlc3Qgc2V0dGluZ3MuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaGFybmVzcyI+VW5pdCB0ZXN0IGhhcm5lc3MuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGFnRXhwcmVzc2lvbiI+VGhlIHRhZyBleHByZXNzaW9uIHRvIHVzZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdUZXN0UnVuRmlsdGVyLlNldFRhZ0V4cHJlc3Npb24oU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNldHMgdGhlIHRhZyBleHByZXNzaW9uIHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGFnRXhwcmVzc2lvbiI+VGhlIHRhZyBleHByZXNzaW9uIHRvIHVzZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdUZXN0UnVuRmlsdGVyLl9oYXNMb2dnZWRXYXJuaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgd2FybmluZyBoYXMgYmVlbiBsb2dnZWQgeWV0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnVGVzdFJ1bkZpbHRlci5GaWx0ZXJDdXN0b21UZXN0Q2xhc3NlcyhTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JTGlzdHtNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdENsYXNzfSxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc0luc3RhbmNlRGljdGlvbmFyeSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IHRhZyBmaWx0ZXJpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjbGFzc2VzIj5MaXN0IG9mIHRlc3QgY2xhc3Nlcy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbnN0YW5jZXMiPlRlc3QgY2xhc3MgaW5zdGFuY2UgZGljdGlvbmFyeS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdUZXN0UnVuRmlsdGVyLkZpbHRlckN1c3RvbVRlc3RNZXRob2RzKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0e01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0TWV0aG9kfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IHRhZyBmaWx0ZXJpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXRob2RzIj5MaXN0IG9mIHRlc3QgbWV0aG9kcy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UYWdUZXN0UnVuRmlsdGVyLkFwcGx5RXhwcmVzc2lvbihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ01hbmFnZXIsU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUNvbGxlY3Rpb257TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2R9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbHkgdGhlIHRhZyBmaWx0ZXJpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YWdNYW5hZ2VyIj5UaGUgdGFnIG1hbmFnZXIgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWV0aG9kcyI+U2V0IG9mIG1ldGhvZHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnVGVzdFJ1bkZpbHRlci5GaWx0ZXJFeGNsdXNpdmVUZXN0Q2xhc3NlcyhTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JTGlzdHtNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdENsYXNzfSxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc0luc3RhbmNlRGljdGlvbmFyeSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEV4Y2x1c2l2ZSBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkIHdoZW4gYWxzbyB1c2luZyB0YWdnaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2xhc3NlcyI+TGlzdCBvZiB0ZXN0IGNsYXNzZXMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5zdGFuY2VzIj5UZXN0IGNsYXNzIGluc3RhbmNlIGRpY3Rpb25hcnkuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGFnVGVzdFJ1bkZpbHRlci5GaWx0ZXJFeGNsdXNpdmVUZXN0TWV0aG9kcyhTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JTGlzdHtNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeGNsdXNpdmUgYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZCB3aGVuIGFsc28gdXNpbmcgdGFnZ2luZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1ldGhvZHMiPkxpc3Qgb2YgdGVzdCBtZXRob2RzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRhZ1Rlc3RSdW5GaWx0ZXIuVGFnRXhwcmVzc2lvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdGFnIGV4cHJlc3Npb24gaW4gdXNlIGJ5IHRoZSBydW4gZmlsdGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEFzc2VtYmx5SGVscGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIZWxwZXIgY29kZSBmb3IgVGVzdEFzc2VtYmx5IGxvZ2ljLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEFzc2VtYmx5SGVscGVyLkhhc0V4Y2x1c2l2ZUNsYXNzZXMoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUxpc3R7TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RDbGFzc30pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDaGVjayB3aGV0aGVyIFtFeGNsdXNpdmVdIGF0dHJpYnV0ZSBpcyBwcmVzZW50IG9uIGFueSBjbGFzc2VzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2xhc3NlcyI+Q29sbGVjdGlvbiBvZiBjbGFzcyBtZXRhZGF0YSBvYmplY3RzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBhbnkgb2YgdGhlIGNsYXNzZXMgDQorICAgICAgICAgICAgaW5jbHVkZSBhbiBbRXhjbHVzaXZlXSBhdHRyaWJ1dGUuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0QXNzZW1ibHlIZWxwZXIuU29ydFRlc3RDbGFzc2VzKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0e01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3N9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU29ydHMgdGhlIHRlc3QgY2xhc3NlcyBhbHBoYWJldGljYWxseSBieSBuYW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2xhc3NlcyI+QSBsaXN0IG9mIHRlc3QgY2xhc3MgbWV0YWRhdGEgb2JqZWN0cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0Q2xhc3NIZWxwZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3QgY2xhc3MgaGVscGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdENsYXNzSGVscGVyLl9oYXNXYXJuZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB3YXJuaW5nIGhhcyBiZWVuIGxvZ2dlZCBpbiB0aGlzIHJ1bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc0hlbHBlci5GaWx0ZXJUZXN0c1RvUnVuKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0e01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3N9LFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklDb2xsZWN0aW9ue1N5c3RlbS5TdHJpbmd9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRmlsdGVyIHRoZSBzZXQgb2YgdGVzdCBjbGFzc2VzIGJ5IHJlbW92aW5nIHVudXNlZCBjbGFzc2VzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2xhc3NlcyI+VGhlIGlucHV0IGxpc3Qgb2YgdGVzdCBjbGFzcyBtZXRhZGF0YSBvYmplY3RzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNsYXNzZXNUb1J1biI+VGhlIGNsYXNzZXMgdG8gcnVuLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc0hlbHBlci5GaWx0ZXJFeGNsdXNpdmVDbGFzc2VzKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0e01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3N9LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIExvb2sgdGhyb3VnaCB0aGUgY2xhc3NlcyBmb3IgdGhlIFtFeGNsdXNpdmVdIGF0dHJpYnV0ZS4gSWYgZm91bmQsIA0KKyAgICAgICAgICAgIHJlbW92ZSBhbnkgY2xhc3NlcyB3aGVyZSB0aGUgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2xhc3NlcyI+VGhlIGlucHV0IGxpc3Qgb2YgY2xhc3Nlcy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJsb2dXcml0ZXIiPlRoZSBsb2cgd3JpdGVyIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0Q2xhc3NIZWxwZXIuRmlsdGVyQnlGaWx0ZXJDbGFzc1BhcmFtZXRlcihTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRGljdGlvbmFyeXtTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmd9LFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0e01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3N9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTG9vayBmb3IgdGhlIC9wOkZpbHRlckNsYXNzIHBhcmFtZXRlciBpbiB0aGUgdGVzdCBoYXJuZXNzIHNldHRpbmdzLiANCisgICAgICAgICAgICBUcnkgdG8gZG8gYSBzdWJzdHJpbmcgbWF0Y2ggb24gYWxsIGZpbHRlcmVkIHRlc3QgY2xhc3Nlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlcnMiPlRoZSBwYXJhbWV0ZXJzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNsYXNzZXMiPkxpc3Qgb2YgdGVzdCBjbGFzc2VzIHRvIGJlIGZpbHRlcmVkLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RDb21wbGV0ZWRFdmVudEFyZ3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3QgbWV0aG9kIGNvbXBsZXRlZCBldmVudCBhcmd1bWVudHMsIGNvbnRhaW5zIHRoZSByZXN1bHQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0TWV0aG9kQ29tcGxldGVkRXZlbnRBcmdzLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuU2NlbmFyaW9SZXN1bHQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgVGVzdE1ldGhvZENvbXBsZXRlZEV2ZW50QXJncw0KKyAgICAgICAgICAgIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyZXN1bHQiPlRoZSByZXN1bHQgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE1ldGhvZENvbXBsZXRlZEV2ZW50QXJncy4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlNjZW5hcmlvUmVzdWx0LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFRlc3RNZXRob2RDb21wbGV0ZWRFdmVudEFyZ3MNCisgICAgICAgICAgICB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icmVzdWx0Ij5UaGUgcmVzdWx0IGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imhhcm5lc3MiPlRoZSB1bml0IHRlc3QgaGFybmVzcy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0TWV0aG9kQ29tcGxldGVkRXZlbnRBcmdzLlJlc3VsdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdGVzdCBtZXRob2QgcmVzdWx0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE1ldGhvZEhlbHBlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGVscGVyIGNvZGUgZm9yIFRlc3RNZXRob2QgbG9naWMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0TWV0aG9kSGVscGVyLl9oYXNXYXJuZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB3YXJuaW5nIGhhcyBiZWVuIGxvZ2dlZCBpbiB0aGlzIHJ1bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RIZWxwZXIuSGFzRXhjbHVzaXZlTWV0aG9kcyhTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JQ29sbGVjdGlvbntNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDaGVjayB3aGV0aGVyIFtFeGNsdXNpdmVdIGlzIHByZXNlbnQgb24gPj0gMSBvZiB0aGUgbWV0aG9kcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1ldGhvZHMiPlRoZSBtZXRob2RzIHRvIHNlYXJjaCB0aHJvdWdoLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIG1ldGhvZHMgaGFzIEV4Y2x1c2l2ZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RIZWxwZXIuRmlsdGVyRXhjbHVzaXZlTWV0aG9kcyhTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JTGlzdHtNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZH0sTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTG9vayB0aHJvdWdoIHRoZSBtZXRob2RzIGZvciB0aGUgW0V4Y2x1c2l2ZV0gYXR0cmlidXRlLiBJZiBmb3VuZCwgDQorICAgICAgICAgICAgcmVtb3ZlIGFueSBtZXRob2RzIHdoZXJlIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXRob2RzIj5UaGUgbWV0aG9kcyB0byBmaWx0ZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibG9nV3JpdGVyIj5UaGUgbG9nIHdyaXRlciBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzRXZlbnRzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIGhlbHBlciB1dGlsaXR5IGZvciBmaXJpbmcgZXZlbnRzIGFzIHRoZSB1bml0IHRlc3QgaGFybmVzcyBmcm9tIGFueQ0KKyAgICAgICAgICAgIGNvbXBvbmVudCwgaW50ZXJuYWwgb3Igbm90LiBFbmFibGVzIGV4cGFuc2lvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzc0V2ZW50cy5faGFybmVzcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3RvcmVkIGluc3RhbmNlIG9mIHRoZSBoYXJuZXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzRXZlbnRzLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW50YW5jZSBvZiB0aGUgVW5pdFRlc3RIYXJuZXNzRXZlbnRzIGhlbHBlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imhhcm5lc3MiPlRoZSBoYXJuZXNzIHJlZmVyZW5jZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3NFdmVudHMuU2VuZFRlc3RBc3NlbWJseVN0YXJ0aW5nKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEFzc2VtYmx5U3RhcnRpbmdFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDYWxscyB0aGUgdGVzdCBhc3NlbWJseSBzdGFydGluZyBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBldmVudCBkYXRhLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzc0V2ZW50cy5TZW5kVGVzdEFzc2VtYmx5Q29tcGxldGVkKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEFzc2VtYmx5Q29tcGxldGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2FsbHMgdGhlIHRlc3QgYXNzZW1ibHkgY29tcGxldGVkIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGRhdGEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzRXZlbnRzLlNlbmRUZXN0Q2xhc3NTdGFydGluZyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc1N0YXJ0aW5nRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2FsbHMgdGhlIHRlc3QgY2xhc3Mgc3RhcnRpbmcgZXZlbnQgaGFuZGxlcnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgZGF0YS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3NFdmVudHMuU2VuZFRlc3RDbGFzc0NvbXBsZXRlZChNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc0NvbXBsZXRlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhbGxzIHRoZSB0ZXN0IGNsYXNzIGNvbXBsZXRlZCBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBldmVudCBkYXRhLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzc0V2ZW50cy5TZW5kVGVzdE1ldGhvZFN0YXJ0aW5nKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE1ldGhvZFN0YXJ0aW5nRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2FsbHMgdGhlIHRlc3QgbWV0aG9kIHN0YXJ0aW5nIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGRhdGEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzRXZlbnRzLlNlbmRUZXN0TWV0aG9kQ29tcGxldGVkKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE1ldGhvZENvbXBsZXRlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhbGxzIHRoZSB0ZXN0IG1ldGhvZCBjb21wbGV0ZWQgZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgZGF0YS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3NFdmVudHMuU2VuZFRlc3RSdW5TdGFydGluZyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RSdW5TdGFydGluZ0V2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhbGxzIHRoZSB0ZXN0IHJ1biBzdGFydGluZyBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBldmVudCBkYXRhLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TG9naWNGYWN0b3J5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIGZhY3RvcnkgZm9yIGNyZWF0aW5nIHRoZSB1bml0IHRlc3Qgb2JqZWN0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TG9naWNGYWN0b3J5Ll9oYXJuZXNzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdW5pdCB0ZXN0IGhhcm5lc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdExvZ2ljRmFjdG9yeS4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IHVuaXQgdGVzdCBsb2dpYyBmYWN0b3J5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaGFybmVzcyI+VGhlIHVuaXQgdGVzdCBoYXJuZXNzIHJlZmVyZW5jZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdExvZ2ljRmFjdG9yeS5DcmVhdGVBc3NlbWJseU1hbmFnZXIoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVVuaXRUZXN0UHJvdmlkZXIsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UnVuRmlsdGVyLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklBc3NlbWJseSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgQXNzZW1ibHlNYW5hZ2VyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icHJvdmlkZXIiPlRoZSB1bml0IHRlc3QgcHJvdmlkZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsdGVyIj5UaGUgcnVuIGZpbHRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhc3NlbWJseSI+VGhlIHVuaXQgdGVzdCBhc3NlbWJseSBtZXRhZGF0YSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgbmV3IEFzc2VtYmx5TWFuYWdlci48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TG9naWNGYWN0b3J5LkNyZWF0ZVRlc3RDbGFzc01hbmFnZXIoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVVuaXRUZXN0UHJvdmlkZXIsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UnVuRmlsdGVyLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3MsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgVGVzdENsYXNzTWFuYWdlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InByb3ZpZGVyIj5UaGUgdW5pdCB0ZXN0IHByb3ZpZGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbHRlciI+VGhlIHJ1biBmaWx0ZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdENsYXNzIj5UaGUgdGVzdCBjbGFzcyBtZXRhZGF0YS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbnN0YW5jZSI+VGhlIHRlc3QgY2xhc3MgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgbmV3IFRlc3RDbGFzc01hbmFnZXIuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdExvZ2ljRmFjdG9yeS5DcmVhdGVUZXN0TWV0aG9kTWFuYWdlcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVW5pdFRlc3RQcm92aWRlcixNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdENsYXNzLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0TWV0aG9kLFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGVzIGEgbmV3IFRlc3RNZXRob2RNYW5hZ2VyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icHJvdmlkZXIiPlRoZSB1bml0IHRlc3QgcHJvdmlkZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdENsYXNzIj5UaGUgdGVzdCBjbGFzcyBtZXRhZGF0YS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXRob2QiPlRoZSB0ZXN0IG1ldGhvZCBtZXRhZGF0YS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbnN0YW5jZSI+VGhlIHRlc3QgY2xhc3MgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgbmV3IFRlc3RNZXRob2RNYW5hZ2VyLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgbG9nIHByb3ZpZGVyIHRoYXQgb3V0cHV0cyBpbiBhIHNpbXBsZSBjdXN0b20gdGVzdCBmb3JtYXQgdGhhdCBWaXN1YWwgDQorICAgICAgICAgICAgU3R1ZGlvIHJlY29nbml6ZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgbG9nIHByb3ZpZGVyIHRoYXQgb3V0cHV0cyBpbiBhIHNpbXBsZSBjdXN0b20gdGVzdCBmb3JtYXQgdGhhdCBWaXN1YWwgDQorICAgICAgICAgICAgU3R1ZGlvIHJlY29nbml6ZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dQcm92aWRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTG9nUHJvdmlkZXIgaW50ZXJmYWNlIHdpdGggYSBzaW5nbGUgUHJvY2VzcyBtZXRob2QgdGhhdCBoYW5kbGVzIGENCisgICAgICAgICAgICBMb2dNZXNzYWdlIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ1Byb3ZpZGVyLl9jb25kaXRpb25hbEhhbmRsZXJzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIGRpY3Rpb25hcnkgb2YgY29uZGl0aW9uYWwgYWN0aW9uIGhhbmRsZXJzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nUHJvdmlkZXIuX2RlZmluZWRIYW5kbGVycyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IG9mIHR5cGVzL2FjdGlvbnMgZm9yIGhhbmRsaW5nIHNwZWNpZmljIHR5cGVzIG9mIGxvZw0KKyAgICAgICAgICAgIG1lc3NhZ2VzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nUHJvdmlkZXIuUHJvY2VzcyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQZXJmb3JtIGFueSBuZWVkZWQgb3BlcmF0aW9ucyB0byBsb2cgdGhlIG1lc3NhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJsb2dNZXNzYWdlIj5JbnN0YW5jZSBvZiBMb2dNZXNzYWdlIHR5cGUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nUHJvdmlkZXIuUHJvY2Vzc1JlbWFpbmRlcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNZXRob2QgdGhhdCBwcm9jZXNzZXMgYW55IG1lc3NhZ2VzIG5vdCBoYW5kbGVkIGFueSBvdGhlciB3YXkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbG9nIG1lc3NhZ2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nUHJvdmlkZXIuUmVnaXN0ZXJNZXNzYWdlVHlwZUhhbmRsZXIoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlVHlwZSxTeXN0ZW0uQWN0aW9ue01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZX0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZWdpc3RlcnMgYW4gYWN0aW9uIGZvciBhIHNwZWNpZmljIG1lc3NhZ2UgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InR5cGUiPlRoZSB0eXBlIG9mIGludGVyZXN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdGlvbiI+VGhlIGhhbmRsZXIgZm9yIHRoZSB0eXBlLiAgVGFrZXMgYSBMb2dNZXNzYWdlIA0KKyAgICAgICAgICAgIHBhcmFtZXRlci48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dQcm92aWRlci5SZWdpc3RlckNvbmRpdGlvbmFsSGFuZGxlcihTeXN0ZW0uRnVuY3tNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UsU3lzdGVtLkJvb2xlYW59LFN5c3RlbS5BY3Rpb257TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlZ2lzdGVycyBhIGNvbmRpdGlvbmFsIGhhbmRsZXIuICBEdXJpbmcgdGhlIGxvZyBtZXNzYWdlIHByb2Nlc3NpbmcgDQorICAgICAgICAgICAgc3RlcCwgYWxsIGNvbmRpdGlvbmFsIGNhbGxiYWNrcyB3aWxsIGJlIHRyaWVkLiAgVGhlIGZpcnN0IHBvc2l0aXZlIA0KKyAgICAgICAgICAgIHJlc3VsdCB3aWxsIHRoZW4gY2FsbCB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzaW5nIEFjdGlvbiBmb3IgdGhhdCANCisgICAgICAgICAgICBjb25kaXRpb25hbCBtZXRob2QgZW50cnkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPkEgY29uZGl0aW9uYWwgY2FsbGJhY2sgdGhhdCB0YWtlcyBhIA0KKyAgICAgICAgICAgIExvZ01lc3NhZ2UgaW5wdXQgcGFyYW1ldGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdGlvbiI+QSBsb2cgbWVzc2FnZSBwcm9jZXNzaW5nIEFjdGlvbiB0aGF0IGlzIGNhbGxlZCANCisgICAgICAgICAgICB3aGVuIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dQcm92aWRlci5VbnJlZ2lzdGVyQ29uZGl0aW9uYWxIYW5kbGVyKFN5c3RlbS5GdW5je01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZSxTeXN0ZW0uQm9vbGVhbn0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZW1vdmVzIGEgY29uZGl0aW9uYWwgY2FsbGJhY2suDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPlRoZSBjb25kaXRpb24uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nUHJvdmlkZXIuQ2xlYXJDb25kaXRpb25hbEhhbmRsZXJzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDbGVhciBhbGwgZXhpc3RpbmcgY29uZGl0aW9uYWwgaGFuZGxlcnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dQcm92aWRlci5DbGVhck1lc3NhZ2VUeXBlSGFuZGxlcnMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENsZWFyIGFsbCBleGlzdGluZyBtZXNzYWdlIHR5cGUgaGFuZGxlcnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5JVGVzdFNldHRpbmdzTG9nUHJvdmlkZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEludGVyZmFjZSBmb3IgTG9nUHJvdmlkZXJzIHRoYXQgd2FudCBhY2Nlc3MgdG8gZXh0ZXJuYWwgdGVzdCBzZXR0aW5ncy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLklUZXN0U2V0dGluZ3NMb2dQcm92aWRlci5Jbml0aWFsaXplKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0U2V0dGluZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyB0aGUgcHJvdmlkZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZXR0aW5ncyI+VGhlIHNldHRpbmdzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLkRlZmF1bHRUZXN0UmVzdWx0c0ZpbGVuYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgZmlsZW5hbWUgdG8gdXNlIGZvciBzYXZpbmcgdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuRGVmYXVsdFRlc3RBZGFwdGVyVHlwZU5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRlc3QgYWRhcHRlciB0eXBlIG5hbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5EZWZhdWx0VGVzdExpc3ROYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgZGVmYXVsdCB0ZXN0IGxpc3QgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLkRlZmF1bHRDb21wdXRlck5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBkZWZhdWx0IGNvbXB1dGVyIG5hbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5EZWZhdWx0VXNlck5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBkZWZhdWx0IHVzZXIgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLkRlZmF1bHRUZXN0UnVuQ29uZmlndXJhdGlvbk5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLkRlZmF1bHRUZXN0UnVuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuX3dyaXRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIFZpc3VhbCBTdHVkaW8gbG9nIGZvcm1hdCB3cml0ZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuUmVnaXN0ZXJMb2dIYW5kbGVycyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVnaXN0ZXIgdGhlIGhhbmRsZXIgY29uZGl0aW9ucyBvZiBpbnRlcmVzdCB0byB0aGlzIGxvZyBwcm92aWRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLlRlc3RBc3NlbWJseVN0YXJ0KE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VtYmx5IHN0YXJ0IGNvZGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJsIj5UaGUgbG9nIG1lc3NhZ2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuUHJvY2Vzc0luY29ycmVjdEV4Y2VwdGlvbihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm9jZXNzIGFuIEV4Y2VwdGlvbiB0aGF0IHdhcyBub3QgdGhlIGV4cGVjdGVkIEV4Y2VwdGlvbiB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibCI+VGhlIGxvZyBtZXNzYWdlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLlByb2Nlc3NFeGNlcHRpb24oTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvY2VzcyBhbiBFeGNlcHRpb24gdGhhdCBpcyBsb2dnZWQgb3Igc3RvcmVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibCI+VGhlIGxvZyBtZXNzYWdlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5TZXRUZXN0UnVuQ29uZmlndXJhdGlvbihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JQXNzZW1ibHkpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZXRzIHRoZSB0ZXN0IHJ1biBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHdoZW4gdGhlIHRlc3QgYXNzZW1ibHkgDQorICAgICAgICAgICAgYmVnaW5zIHByb2Nlc3NpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhc3NlbWJseSI+VGhlIHRlc3QgYXNzZW1ibHkgbWV0YWRhdGEgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLkdlbmVyYXRlVGVzdFJ1bk5hbWUoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSUFzc2VtYmx5KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2VuZXJhdGUgYSBuYW1lIGZvciB0aGUgdGVzdCBydW4gdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiANCisgICAgICAgICAgICBkaXNwbGF5aW5nIHRoZSByZXN1bHQgaW4gVmlzdWFsIFN0dWRpby4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFzc2VtYmx5Ij5UaGUgdGVzdCBhc3NlbWJseSBtZXRhZGF0YSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRoZSB0ZXN0IHJ1biBuYW1lLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuTmV3R3VpZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2VuZXJhdGVzIGEgbmV3IEd1aWQgc3RyaW5nIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgbmV3IEd1aWQgc3RyaW5nIHZhbHVlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuUHJvY2Vzc1Jlc3VsdChNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm9jZXNzIGEgVVRGIHJlc3VsdCBtZXNzYWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibG9nTWVzc2FnZSI+VGhlIGxvZyBtZXNzYWdlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Qcm9jZXNzQnVnKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb2Nlc3MgW0J1ZyguLi4pXS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImwiPkEgS25vd25CdWdMb2dNZXNzYWdlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5UZXN0UnVuRmlsdGVyU2VsZWN0ZWQoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHJ1biBmaWx0ZXIgaGFzIGJlZW4gc2VsZWN0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJsb2dNZXNzYWdlIj5UaGUgbG9nIG1lc3NhZ2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLldyaXRlTG9nRmlsZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNhdmVzIHRoZSBsb2cgZmlsZSBkYXRhLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaGFybmVzcyI+VGhlIHVuaXQgdGVzdCBoYXJuZXNzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLkluaXRpYWxpemUoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIHRoZSB0ZXN0IGhhcm5lc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZXR0aW5ncyI+VGhlIHRlc3QgaGFybmVzcyBzZXR0aW5ncy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5UZXN0UmVzdWx0c0ZpbGVOYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIHRlc3QgcmVzdWx0cyBmaWxlbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLlRlc3RBZGFwdGVyVHlwZU5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdGVzdCBhZGFwdGVyIHR5cGUgbmFtZSByZXBvcnRlZCBpbiB0aGUgVmlzdWFsIA0KKyAgICAgICAgICAgIFN0dWRpbyByZXN1bHRzIGxvZyBmaWxlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuVGVzdFJ1bklkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIFRlc3RSdW5JZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLlRlc3RMaXN0TmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSB0ZXN0IGxpc3QgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLkNvbXB1dGVyTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBjb21wdXRlciBuYW1lIHRoYXQgaXMgcmVwb3J0ZWQgaW4gdGhlIHJlc3VsdHMNCisgICAgICAgICAgICBsb2cgZmlsZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLlVzZXJOYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIHVzZXIgbmFtZSB0aGF0IGlzIHJlcG9ydGVkIGluIHRoZSByZXN1bHRzIGZpbGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5UZXN0UnVuQ29uZmlndXJhdGlvbk5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgVGVzdFJ1bkNvbmZpZ3VyYXRpb25OYW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuVGVzdFJ1bkNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBUZXN0UnVuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuVGVzdFJ1bk5hbWVQcmVmaXgiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHByZWZpeCBmb3IgdXNlIGluIHRoZSB0ZXN0IHJ1biBuYW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuVGVzdFJ1bkNvbmZpZ3VyYXRpb25JZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBUZXN0UnVuQ29uZmlndXJhdGlvbklkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuQ3VycmVudEFzc2VtYmx5TmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgY3VycmVudCBhc3NlbWJseSBuYW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuV3JpdGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIGxvZyBwcm92aWRlciB0aGF0IG91dHB1dHMgaW4gYSBzaW1wbGUgY3VzdG9tIHRlc3QgZm9ybWF0IHRoYXQgDQorICAgICAgICAgICAgVmlzdWFsIFN0dWRpbyByZWNvZ25pemVzLiBUaGlzIGlzIGEgc2ltcGxlLCBzdWJzZXQgd3JpdGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuV3JpdGVyLkRhdGVUaW1lRm9ybWF0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEYXRlIHRpbWUgZm9ybWF0IHN0cmluZyByZXByZXNlbnRpbmcgcm91bmQtdHJpcCBkYXRlL3RpbWUgDQorICAgICAgICAgICAgcGF0dGVybi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLldyaXRlci5EZWZhdWx0VGVzdFR5cGVJZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIHRoZSBWaXN1YWwgU3R1ZGlvIHVuaXQgdGVzdCB0eXBlIElELg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuV3JpdGVyLlJlc3VsdHNYbWxOYW1lc3BhY2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBuYW1lc3BhY2UgZm9yIFZpc3VhbCBTdHVkaW8gdGVhbSB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZW1hcmtzPldhcyBvZiBYTmFtZXNwYWNlIHR5cGUgaW4gWExpbnEgaW1wbGVtZW50YXRpb24uPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuX3Rlc3RMaXN0cyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGVzdCBsaXN0IG5hbWVzIGFuZCBndWlkcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLldyaXRlci5fcGVuZGluZ0VsZW1lbnRzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdG9yZXMgdGVtcG9yYXJ5LCBwZW5kaW5nIGVsZW1lbnRzIGZvciB0aGUgbmV4dCByZXN1bHQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IFdyaXRlciBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuRmluYWxpemVDb250ZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdG9yZXMgcHJvcGVydHkgdmFsdWVzIGluIHRoZSByZXNwZWN0aXZlIGVsZW1lbnRzLCBjbGVhcnMgYW55IA0KKyAgICAgICAgICAgIGxvb2t1cCBkaWN0aW9uYXJpZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuVG9EYXRlU3RyaW5nKFN5c3RlbS5EYXRlVGltZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBzdHJpbmcgdmFsdWUgb2YgdGhlIERhdGVUaW1lIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRhdGVUaW1lIj5UaGUgRGF0ZVRpbWUgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgZm9ybWF0dGVkIHN0cmluZy48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLldyaXRlci5HZXRYbWxBc1N0cmluZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyB0aGUgWE1MIGxvZyBmaWxlIGFzIGEgc3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgWE1MIHZhbHVlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuV3JpdGVyLkNyZWF0ZUluaXRpYWxEb2N1bWVudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyB0aGUgaW5pdGlhbCByZXN1bHRzIGRvY3VtZW50IGFuZCBpdHMgWEVsZW1lbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuV3JpdGVyLkNyZWF0ZUVsZW1lbnQoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgWEVsZW1lbnQgd2l0aGluIHRoZSByZXN1bHRzIFhNTCBuYW1lc3BhY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJuYW1lIj5UaGUgZWxlbWVudCBuYW1lLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIG5ldyBuYW1lZCBlbGVtZW50LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuV3JpdGVyLl90b3RhbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRvdGFsIG51bWJlciBvZiBzY2VuYXJpb3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuX291dGNvbWVzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgc2V0IG9mIG91dGNvbWVzIGFuZCBjb3VudHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuSW5jcmVtZW50UmVzdWx0cyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RPdXRjb21lKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgcGFzc2luZyByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ib3V0Y29tZSI+VGhlIHRlc3Qgb3V0Y29tZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuQWRkVGVzdE1ldGhvZFJlc3VsdChNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uRGF0ZVRpbWUsU3lzdGVtLkRhdGVUaW1lLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE91dGNvbWUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBZGRzIHRoZSByZXN1bHQgb2YgYSB0ZXN0IG1ldGhvZCBpbnRvIHRoZSBsb2cuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0Ij5UaGUgdGVzdCBtZXRhZGF0YS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdG9yYWdlIj5UaGUgc3RvcmFnZSB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2RlQmFzZSI+VGhlIGNvZGUgYmFzZSB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhZGFwdGVyVHlwZU5hbWUiPlRoZSBhZGFwdGVyIHR5cGUgbmFtZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjbGFzc05hbWUiPlRoZSBjbGFzcyBuYW1lLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RMaXN0TmFtZSI+VGhlIHRlc3QgbGlzdCBuYW1lLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbXB1dGVyTmFtZSI+VGhlIGNvbXB1dGVyIG5hbWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3RhcnRUaW1lIj5UaGUgc3RhcnQgdGltZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbmRUaW1lIj5UaGUgZW5kIHRpbWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ib3V0Y29tZSI+VGhlIG91dGNvbWUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuV3JpdGVyLkFkZFBlbmRpbmdXcml0ZUxpbmUoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFkZHMgYSBXcml0ZUxpbmUgdG8gdGhlIG5leHQgcmVzdWx0IHRvIGJlIHByb2Nlc3NlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImxpbmUiPlRoZSB0ZXh0IHRvIG91dHB1dC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuQWRkUGVuZGluZ0Vycm9yTWVzc2FnZShTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQWRkcyBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSBuZXh0IHJlc3VsdCB0byBiZSBwcm9jZXNzZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuQWRkUGVuZGluZ0V4Y2VwdGlvbihTeXN0ZW0uRXhjZXB0aW9uKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQWRkcyBhbiBFeGNlcHRpb24gdG8gdGhlIG5leHQgcmVzdWx0IHRvIGJlIHByb2Nlc3NlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBFeGNlcHRpb24gb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLldyaXRlci5BZGRQZW5kaW5nT3V0cHV0KE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2ltcGxlWEVsZW1lbnQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBZGRzIHBlbmRpbmcgb3V0cHV0IGZvciB0aGUgbmV4dCByZXN1bHQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij5UaGUgZWxlbWVudCB0byB3cmFwIGluIGFuIE91dHB1dCBlbGVtZW50LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLldyaXRlci5HZXRUZXN0TGlzdEd1aWQoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgdGhlIEdVSUQgZm9yIGEgdGVzdCBsaXN0IG5hbWUuIFRoZSByZXN1bHQgaXMgc3RvcmVkIA0KKyAgICAgICAgICAgIGluIG1lbW9yeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RMaXN0TmFtZSI+VGhlIHRlc3QgbGlzdCBuYW1lLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgdGVzdCBsaXN0IG5hbWUgZ3VpZC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLldyaXRlci5TdGFydGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIHRpbWUgdGhhdCB0aGUgdGVzdCBydW4gc3RhcnRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLldyaXRlci5DcmVhdGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIHRpbWUgdGhhdCB0aGUgd3JpdGVyIG9iamVjdCBhbmQvb3IgdGVzdCBydW4gd2FzIGNyZWF0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuRmluaXNoZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdGltZSB0aGF0IHRoZSB0ZXN0IHJ1biB3YXMgZmluaXNoZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuVGVzdFJ1biI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgcm9vdCBYTUwgbm9kZSBmb3IgdGhlIHRlc3QgcnVuIGFuZCBpdHMgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLldyaXRlci5Vbml0VGVzdFRlc3RUeXBlSWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdGVzdCB0eXBlIElEIHVzZWQgZm9yIG5ldyByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuV3JpdGVyLlRlc3RSdW5Db25maWd1cmF0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBUZXN0UnVuQ29uZmlndXJhdGlvbiBlbGVtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuV3JpdGVyLkNvdW50ZXJzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBDb3VudGVycyBlbGVtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuV3JpdGVyLlRlc3REZWZpbml0aW9ucyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgVGVzdERlZmluaXRpb25zIGVsZW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuVGVzdExpc3RzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBUZXN0TGlzdHMgZWxlbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLldyaXRlci5UZXN0RW50cmllcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgVGVzdEVudHJpZXMgZWxlbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLldyaXRlci5UaW1lcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgVGltZXMgZWxlbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLldyaXRlci5SZXN1bHRTdW1tYXJ5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBSZXN1bHRTdW1tYXJ5IGVsZW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuUmVzdWx0cyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgUmVzdWx0cyBlbGVtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuV3JpdGVyLlRlc3RSdW5JZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0cyB0aGUgVGVzdFJ1bklkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuV3JpdGVyLlRlc3RSdW5OYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZXRzIHRoZSBUZXN0UnVuTmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLldyaXRlci5UZXN0UnVuVXNlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0cyB0aGUgVGVzdFJ1blVzZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuVGVzdFJ1bkNvbmZpZ3VyYXRpb25OYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZXRzIHRoZSBUZXN0UnVuQ29uZmlndXJhdGlvbk5hbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5WaXN1YWxTdHVkaW9Mb2dQcm92aWRlci5Xcml0ZXIuVGVzdFJ1bkNvbmZpZ3VyYXRpb25JZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0cyB0aGUgVGVzdFJ1bkNvbmZpZ3VyYXRpb25JZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlZpc3VhbFN0dWRpb0xvZ1Byb3ZpZGVyLldyaXRlci5SdW5PdXRjb21lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZXRzIHRoZSBvdmVyYWxsIHJ1biBvdXRjb21lIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIuV3JpdGVyLlRlc3RSdW5Db25maWd1cmF0aW9uRGVzY3JpcHRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNldHMgdGhlIFRlc3RSdW5Db25maWd1cmF0aW9uRGVzY3JpcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkNsYXNzaWNUZXN0UGFnZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB1c2VyIGNvbnRyb2wgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgcm9vdCB2aXN1YWwgZm9yIGEgU2lsdmVybGlnaHQgDQorICAgICAgICAgICAgcGx1Z2luIGlmIGRldmVsb3BlcnMgd291bGQgbGlrZSB0byB1c2UgdGhlIGFkdmFuY2VkIFRlc3RTdXJmYWNlIA0KKyAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgd2l0aGluIE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLg0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIFRoZSBUZXN0U3VyZmFjZSBpcyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgYWZ0ZXIgZWFjaCB0ZXN0IHNjZW5hcmlvIA0KKyAgICAgICAgICAgIGNvbXBsZXRlcywgZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIG1hbnkgYWRkaXRpb25hbCBjbGVhbnVwIG1ldGhvZHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkNsYXNzaWNUZXN0UGFnZS4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIFRlc3RQYWdlIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuQ2xhc3NpY1Rlc3RQYWdlLkluaXRpYWxpemVDb21wb25lbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVDb21wb25lbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuQ2xhc3NpY1Rlc3RQYWdlLlRlc3RQYW5lbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdGVzdCBzdXJmYWNlLCBhIGR5bmFtaWMgUGFuZWwgdGhhdCByZW1vdmVzIGl0cyBjaGlsZHJlbiANCisgICAgICAgICAgICBlbGVtZW50cyBhZnRlciBlYWNoIHRlc3QgY29tcGxldGVzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGV4dEZhaWx1cmVzTG9nUHJvdmlkZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgbG9nIHByb3ZpZGVyIHRoYXQgb3V0cHV0cyBmYWlsdXJlcyBhcyBhIHN0cmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRleHRGYWlsdXJlc0xvZ1Byb3ZpZGVyLl9mYWlsdXJlcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBsaXN0IG9mIGZhaWxpbmcgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRleHRGYWlsdXJlc0xvZ1Byb3ZpZGVyLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBUZXh0RmFpbHVyZXNMb2dQcm92aWRlciBpbnN0YW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRleHRGYWlsdXJlc0xvZ1Byb3ZpZGVyLkdldEZhaWx1cmVzTG9nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXRyaWV2ZSB0aGUgdGV4dCBsb2cgb2YgYWxsIGZhaWx1cmVzIGluIHRoZSB1bml0IHRlc3QgcnVuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRoZSBsb2cgY29udGVudHMuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXh0RmFpbHVyZXNMb2dQcm92aWRlci5SZWdpc3RlckxvZ0hhbmRsZXJzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZWdpc3RlciB0aGUgaGFuZGxlciBjb25kaXRpb25zIG9mIGludGVyZXN0IHRvIHRoaXMgbG9nIHByb3ZpZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGV4dEZhaWx1cmVzTG9nUHJvdmlkZXIuUHJvY2Vzc1Jlc3VsdChNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm9jZXNzIGEgVVRGIHJlc3VsdCBtZXNzYWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibG9nTWVzc2FnZSI+VGhlIGxvZyBtZXNzYWdlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RQYWdlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHVzZXIgY29udHJvbCB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIHRoZSByb290IHZpc3VhbCBmb3IgYSBTaWx2ZXJsaWdodCANCisgICAgICAgICAgICBwbHVnaW4gaWYgZGV2ZWxvcGVycyB3b3VsZCBsaWtlIHRvIHVzZSB0aGUgYWR2YW5jZWQgVGVzdFN1cmZhY2UgDQorICAgICAgICAgICAgZnVuY3Rpb25hbGl0eSB3aXRoaW4gTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuIFRoZSBUZXN0U3VyZmFjZSBpcyANCisgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgYWZ0ZXIgZWFjaCB0ZXN0IHNjZW5hcmlvIGNvbXBsZXRlcywgZWxpbWluYXRpbmcgDQorICAgICAgICAgICAgdGhlIG5lZWQgZm9yIG1hbnkgYWRkaXRpb25hbCBjbGVhbnVwIG1ldGhvZHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RQYWdlLl9oYXJuZXNzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCYWNraW5nIGZpZWxkIGZvciB0aGUgdW5pdCB0ZXN0IGhhcm5lc3MgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RQYWdlLl9tb2RlbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFja2luZyBmaWVsZCBmb3IgdGhlIG1vZGVsIG1hbmFnZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RQYWdlLl9zdGFydHVwVGltZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIHRoZSBzdGFydHVwIHRpbWVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0UGFnZS5fY2xpcGJvYXJkRmVhdHVyZVN1cHBvcnRlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFja2luZyBmaWVsZCBmb3IgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNsaXBib2FyZCBmZWF0dXJlDQorICAgICAgICAgICAgaXMgc3VwcG9ydGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0UGFnZS4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIFRlc3RQYWdlIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdFBhZ2UuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyB0aGUgVGVzdFBhZ2Ugb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaGFybmVzcyI+VGhlIHRlc3QgaGFybmVzcyBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RQYWdlLlN0YXJ0dXBNb25pdG9yKFN5c3RlbS5PYmplY3QsU3lzdGVtLkV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdhaXRzIGZvciB0aGUgU2V0dGluZ3MgdG8gYmVjb21lIGF2YWlsYWJsZSwgZWl0aGVyIGJ5IHRoZSBzZXJ2aWNlIG9yDQorICAgICAgICAgICAgc3lzdGVtIHNldHRpbmcgdGhlIGluc3RhbmNlIHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgc291cmNlIHRpbWVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBldmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0UGFnZS5TdGFydFRlc3RSdW4iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN0YXJ0cyB0aGUgdGVzdCBydW4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RQYWdlLk9uVGVzdEFzc2VtYmx5U3RhcnRpbmcoU3lzdGVtLk9iamVjdCxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RBc3NlbWJseVN0YXJ0aW5nRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlcyB0aGUgdGVzdCBhc3NlbWJseSBzdGFydGluZyBldmVudCB0byBleHBhbmQgdGhlIHRlc3Qgc3RhZ2UNCisgICAgICAgICAgICBoZWlnaHQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBzb3VyY2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBldmVudCBkYXRhLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdFBhZ2UuT25UZXN0SGFybmVzc0NvbXBsZXRlZChTeXN0ZW0uT2JqZWN0LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEhhcm5lc3NDb21wbGV0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIYW5kbGVzIHRoZSB0ZXN0IGhhcm5lc3MgY29tcGxldGUgZXZlbnQsIHRvIGRpc3BsYXkgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGRhdGEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0UGFnZS5PblRlc3RTdGFnZUV4cGFuZGVyQ2xpY2soU3lzdGVtLk9iamVjdCxTeXN0ZW0uRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlcyB0aGUgY2xpY2sgb24gdGhlIHRlc3Qgc3RhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBzb3VyY2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBldmVudCBkYXRhLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdFBhZ2UuRXhwYW5kQ29sbGFwc2VUZXN0U3RhZ2UoU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeHBhbmQgYW5kIGNvbGxhcHNlIHRoZSB0ZXN0IHN0YWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwYW5kIj5BIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0byBleHBhbmQgdGhlIHN0YWdlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdFBhZ2UuT25UZXN0TWV0aG9kQ29tcGxldGVkKFN5c3RlbS5PYmplY3QsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0TWV0aG9kQ29tcGxldGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlcyB0aGUgY29tcGxldGlvbiBvZiBhIHRlc3QgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgc291cmNlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdFBhZ2UuT25UYWdFeHByZXNzaW9uU2VsZWN0ZWQoU3lzdGVtLk9iamVjdCxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGFnRXhwcmVzc2lvbkV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZXMgdGhlIGNvbXBsZXRpb24gZXZlbnQgb24gdGhlIHRhZyBleHByZXNzaW9uIGVkaXRvciB0byBiZWdpbg0KKyAgICAgICAgICAgIHRoZSB0ZXN0IHJ1biB1c2luZyB0aGUgdXNlci1wcm92aWRlZCBzZXR0aW5ncy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RQYWdlLk9uUmVzdWx0TmF2aWdhdGlvbkNsaWNrKFN5c3RlbS5PYmplY3QsU3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlcyBuYXZpZ2F0aW9uIGJhY2sgb3IgZm9yd2FyZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RQYWdlLk9uSW5zdGFsbENsaWNrKFN5c3RlbS5PYmplY3QsU3lzdGVtLkV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluc3RhbGxzIHRoZSBhcHBsaWNhdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RQYWdlLk9uQ2xpcGJvYXJkQnV0dG9uQ2xpY2soU3lzdGVtLk9iamVjdCxTeXN0ZW0uRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgT2ZmZXJzIGNsaXBib2FyZCBpbnRlcmZhY2Ugc3VwcG9ydCBmb3IgY29weWluZyB0ZXN0IHJ1biByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgc291cmNlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdFBhZ2UuT25QbGF5UGF1c2VDbGljayhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5XaW5kb3dzLlJvdXRlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZXMgdGhlIGNsaWNrIG9uIGEgcGxheS9wYXVzZSBidXR0b24gZm9yIHRoZSBydW4gZGlzcGF0Y2hlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RQYWdlLlNldENsaXBib2FyZFRleHQoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvcGllcyB0ZXh0IGludG8gdGhlIGNsaXBib2FyZC4gSWYgdGhlIFNpbHZlcmxpZ2h0IHJ1bnRpbWUgb24gdGhlDQorICAgICAgICAgICAgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNsaXBib2FyZCBBUEksIHRoZW4gaXQgcmV2ZXJ0cyB0byBhDQorICAgICAgICAgICAgbGFyZ2UgdGV4dCBib3ggdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gbWFudWFsbHkgY29weSBhbmQgcGFzdGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXh0Ij5UaGUgdGV4dCB0byBzZXQuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0UGFnZS5Jbml0aWFsaXplQ29tcG9uZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplQ29tcG9uZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RQYWdlLlRlc3RQYW5lbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdGVzdCBzdXJmYWNlLCBhIGR5bmFtaWMgUGFuZWwgdGhhdCByZW1vdmVzIGl0cyBjaGlsZHJlbiANCisgICAgICAgICAgICBlbGVtZW50cyBhZnRlciBlYWNoIHRlc3QgY29tcGxldGVzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0UGFnZS5Vbml0VGVzdEhhcm5lc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHVuaXQgdGVzdCBoYXJuZXNzIGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0UGFnZS5UcmVlVmlldyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdHJlZSB2aWV3IGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlByb3BlcnRpZXMuVW5pdFRlc3RNZXNzYWdlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICAgIEEgc3Ryb25nbHktdHlwZWQgcmVzb3VyY2UgY2xhc3MsIGZvciBsb29raW5nIHVwIGxvY2FsaXplZCBzdHJpbmdzLCBldGMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuUHJvcGVydGllcy5Vbml0VGVzdE1lc3NhZ2UuUmVzb3VyY2VNYW5hZ2VyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICAgIFJldHVybnMgdGhlIGNhY2hlZCBSZXNvdXJjZU1hbmFnZXIgaW5zdGFuY2UgdXNlZCBieSB0aGlzIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlByb3BlcnRpZXMuVW5pdFRlc3RNZXNzYWdlLkN1bHR1cmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgICAgT3ZlcnJpZGVzIHRoZSBjdXJyZW50IHRocmVhZCdzIEN1cnJlbnRVSUN1bHR1cmUgcHJvcGVydHkgZm9yIGFsbA0KKyAgICAgICAgICAgICAgcmVzb3VyY2UgbG9va3VwcyB1c2luZyB0aGlzIHN0cm9uZ2x5IHR5cGVkIHJlc291cmNlIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlByb3BlcnRpZXMuVW5pdFRlc3RNZXNzYWdlLkNvbXBvc2l0ZVdvcmtJdGVtX0ludm9rZV9Ob1JlbWFpbmluZ1dvcmtJdGVtcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgICBMb29rcyB1cCBhIGxvY2FsaXplZCBzdHJpbmcgc2ltaWxhciB0byBUaGVyZSBhcmUgbm8gcmVtYWluaW5nIHRlc3Qgd29yayBpdGVtcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Qcm9wZXJ0aWVzLlVuaXRUZXN0TWVzc2FnZS5Mb2dFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgICAgTG9va3MgdXAgYSBsb2NhbGl6ZWQgc3RyaW5nIHNpbWlsYXIgdG8gRXhjZXB0aW9uOiBUeXBlICZxdW90O3swfSZxdW90OyBNZXNzYWdlICZxdW90O3sxfSZxdW90Oy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Qcm9wZXJ0aWVzLlVuaXRUZXN0TWVzc2FnZS5Mb2dJZ25vcmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgICAgTG9va3MgdXAgYSBsb2NhbGl6ZWQgc3RyaW5nIHNpbWlsYXIgdG8gSWdub3JpbmcgJnF1b3Q7ezB9JnF1b3Q7Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlByb3BlcnRpZXMuVW5pdFRlc3RNZXNzYWdlLkxvZ0luY29ycmVjdEV4Y2VwdGlvblR5cGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgICAgTG9va3MgdXAgYSBsb2NhbGl6ZWQgc3RyaW5nIHNpbWlsYXIgdG8gSW5jb3JyZWN0IGV4Y2VwdGlvbiB0eXBlICZxdW90O3swfSZxdW90OyByZWNlaXZlZC4gV2FzIGV4cGVjdGluZyBhICZxdW90O3sxfSZxdW90OyB0eXBlLi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Qcm9wZXJ0aWVzLlVuaXRUZXN0TWVzc2FnZS5Mb2dOb0V4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgICBMb29rcyB1cCBhIGxvY2FsaXplZCBzdHJpbmcgc2ltaWxhciB0byBObyBFeGNlcHRpb24gd2FzIG9ic2VydmVkLiBXYXMgZXhwZWN0aW5nIGEgJnF1b3Q7ezB9JnF1b3Q7IHR5cGUgZXhjZXB0aW9uLi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Qcm9wZXJ0aWVzLlVuaXRUZXN0TWVzc2FnZS5UYWdBdHRyaWJ1dGVfY3Rvcl9FbXB0eVRhZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgICBMb29rcyB1cCBhIGxvY2FsaXplZCBzdHJpbmcgc2ltaWxhciB0byBUYWcgY2Fubm90IGJlIGVtcHR5IS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Qcm9wZXJ0aWVzLlVuaXRUZXN0TWVzc2FnZS5UYWdBdHRyaWJ1dGVfY3Rvcl9SZXNlcnZlZENoYXJhY3RlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgICBMb29rcyB1cCBhIGxvY2FsaXplZCBzdHJpbmcgc2ltaWxhciB0byBUaGUgdGFnICZxdW90O3swfSZxdW90OyBjb250YWlucyB0aGUgaW52YWxpZCBjaGFyYWN0ZXIgJnF1b3Q7ezF9JnF1b3Q7IS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Qcm9wZXJ0aWVzLlVuaXRUZXN0TWVzc2FnZS5UYWdBdHRyaWJ1dGVfY3Rvcl9SZXNlcnZlZFRhZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgICBMb29rcyB1cCBhIGxvY2FsaXplZCBzdHJpbmcgc2ltaWxhciB0byBUYWcgJnF1b3Q7ezB9JnF1b3Q7IGlzIHJlc2VydmVkIS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Qcm9wZXJ0aWVzLlVuaXRUZXN0TWVzc2FnZS5UYWdNYW5hZ2VyX0V4cHJlc3Npb25FdmFsdWF0b3JfRW1wdHlUYWdFeHByZXNzaW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICAgIExvb2tzIHVwIGEgbG9jYWxpemVkIHN0cmluZyBzaW1pbGFyIHRvIHRhZ0V4cHJlc3Npb24gY2Fubm90IGJlIGVtcHR5IS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Qcm9wZXJ0aWVzLlVuaXRUZXN0TWVzc2FnZS5UYWdNYW5hZ2VyX0V4cHJlc3Npb25FdmFsdWF0b3JfRXhwZWN0ZWRFbmRPZlRhZ0V4cHJlc3Npb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgICAgTG9va3MgdXAgYSBsb2NhbGl6ZWQgc3RyaW5nIHNpbWlsYXIgdG8gRXhwZWN0ZWQgZW5kIG9mIHRhZyBleHByZXNzaW9uICZxdW90O3swfSZxdW90OyBhdCBwb3NpdGlvbiB7MX0hLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlByb3BlcnRpZXMuVW5pdFRlc3RNZXNzYWdlLlRhZ01hbmFnZXJfRXhwcmVzc2lvbkV2YWx1YXRvcl9FeHBlY3RlZFRhZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgICBMb29rcyB1cCBhIGxvY2FsaXplZCBzdHJpbmcgc2ltaWxhciB0byBUYWcgZXhwZWN0ZWQgaW4gZXhwcmVzc2lvbiAmcXVvdDt7MH0mcXVvdDsgYXQgcG9zaXRpb24gezF9IS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Qcm9wZXJ0aWVzLlVuaXRUZXN0TWVzc2FnZS5UYWdNYW5hZ2VyX0V4cHJlc3Npb25FdmFsdWF0b3JfSW52YWxpZFRhZ0V4cHJlc3Npb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgICAgTG9va3MgdXAgYSBsb2NhbGl6ZWQgc3RyaW5nIHNpbWlsYXIgdG8gSW52YWxpZCB0YWcgZXhwcmVzc2lvbiAmcXVvdDt7MH0mcXVvdDsgKGV4cGVjdGVkICZxdW90O3sxfSZxdW90OyBhdCBwb3NpdGlvbiB7Mn0pIS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Qcm9wZXJ0aWVzLlVuaXRUZXN0TWVzc2FnZS5UYWdUZXN0UnVuRmlsdGVyX1RhZ2dpbmdJblVzZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgICBMb29rcyB1cCBhIGxvY2FsaXplZCBzdHJpbmcgc2ltaWxhciB0byBUYWcgZXhwcmVzc2lvbiAmcXVvdDt7MH0mcXVvdDsgaXMgaW4gdXNlLi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Qcm9wZXJ0aWVzLlVuaXRUZXN0TWVzc2FnZS5UZXN0Q2xhc3NIZWxwZXJfRXhjbHVzaXZlQ2xhc3Nlc0luVXNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICAgIExvb2tzIHVwIGEgbG9jYWxpemVkIHN0cmluZyBzaW1pbGFyIHRvIEV4Y2x1c2l2ZSBjbGFzc2VzIGFyZSBpbiB1c2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuUHJvcGVydGllcy5Vbml0VGVzdE1lc3NhZ2UuVGVzdE1ldGhvZEhlbHBlcl9FeGNsdXNpdmVNZXRob2RzSW5Vc2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgICAgTG9va3MgdXAgYSBsb2NhbGl6ZWQgc3RyaW5nIHNpbWlsYXIgdG8gRXhjbHVzaXZlIG1ldGhvZHMgYXJlIGluIHVzZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Qcm9wZXJ0aWVzLlVuaXRUZXN0TWVzc2FnZS5UZXN0TWV0aG9kTWFuYWdlcl9Db21wbGV0ZU1ldGhvZF9VblZlcmlmaWVkQnVnIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICAgIExvb2tzIHVwIGEgbG9jYWxpemVkIHN0cmluZyBzaW1pbGFyIHRvIFRoZSBrbm93biBpc3N1ZSBjb3VsZCBub3QgYmUgdmVyaWZpZWQuIEEgZmFpbHVyZSB3aWxsIGJlIHJlY29yZGVkLiBJZiB0aGlzIGJ1ZyBoYXMgYmVlbiBmaXhlZCwgcGxlYXNlIG1hcmsgdGhlIEZpeGVkIGF0dHJpYnV0ZSB2YWx1ZSB0byBUcnVlLi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Qcm9wZXJ0aWVzLlVuaXRUZXN0TWVzc2FnZS5Vbml0VGVzdENvbXBvc2l0ZVdvcmtJdGVtX2N0b3JfTm9UZXN0SGFybmVzcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgICBMb29rcyB1cCBhIGxvY2FsaXplZCBzdHJpbmcgc2ltaWxhciB0byBObyBUZXN0SGFybmVzcyBpcyBhdmFpbGFibGUuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlByb3BlcnRpZXMuVW5pdFRlc3RNZXNzYWdlLlVuaXRUZXN0Q29udGV4dF9GZWF0dXJlTm90U3VwcG9ydGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICAgIExvb2tzIHVwIGEgbG9jYWxpemVkIHN0cmluZyBzaW1pbGFyIHRvIFRoZSAmcXVvdDt7MH0mcXVvdDsgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIHdpdGhpbiB0aGlzIHVuaXQgdGVzdCBzeXN0ZW0uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlByb3BlcnRpZXMuVW5pdFRlc3RNZXNzYWdlLlVuaXRUZXN0SGFybmVzc19Jbml0aWFsaXplX1VuaXRUZXN0SGFybmVzc0luaXRpYWxpemUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgICAgTG9va3MgdXAgYSBsb2NhbGl6ZWQgc3RyaW5nIHNpbWlsYXIgdG8gSW5pdGlhbGl6YXRpb24gb2YgVW5pdFRlc3RIYXJuZXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlByb3BlcnRpZXMuVW5pdFRlc3RNZXNzYWdlLlVuaXRUZXN0SGFybmVzc19SdW5OZXh0U3RlcF9Ob0NvbXBvc2l0ZVdvcmtJdGVtc0V4aXN0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICAgIExvb2tzIHVwIGEgbG9jYWxpemVkIHN0cmluZyBzaW1pbGFyIHRvIE5vIGNvbXBvc2l0ZSB3b3JrIGl0ZW1zIGV4aXN0IHRvIGJlIGNsZWFyZWQuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlByb3BlcnRpZXMuVW5pdFRlc3RNZXNzYWdlLlVuaXRUZXN0SGFybmVzc19UZXN0QXNzZW1ibGllc05vdEFjdGlvbmFibGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgICAgTG9va3MgdXAgYSBsb2NhbGl6ZWQgc3RyaW5nIHNpbWlsYXIgdG8gTm8gdGVzdCBjbGFzc2VzIHdlcmUgc2VsZWN0ZWQgdG8gYmUgaW4gdGhlIHRlc3QgcnVuLi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Qcm9wZXJ0aWVzLlVuaXRUZXN0TWVzc2FnZS5Vbml0VGVzdFN5c3RlbV9SdW5fTm9UZXN0SGFybmVzc0luU2V0dGluZ3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgICAgTG9va3MgdXAgYSBsb2NhbGl6ZWQgc3RyaW5nIHNpbWlsYXIgdG8gVGVzdCBoYXJuZXNzIHdhcyBub3Qgc3BlY2lmaWVkIG9uIHRlc3QgaGFybmVzcyBzZXR0aW5ncyBvYmplY3QuIElmIGEgdGVzdCBoYXJuZXNzIHNldHRpbmdzIG9iamVjdCB3YXMgcGFzc2VkIGluLCBwbGVhc2UgdmVyaWZ5IHRoYXQgaXQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSB0ZXN0IGhhcm5lc3MuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlByb3BlcnRpZXMuVW5pdFRlc3RNZXNzYWdlLldvcmtJdGVtVGVzdF9FbnF1ZXVlV29ya0l0ZW1fQXN5bmNocm9ub3VzRmVhdHVyZVVuYXZhaWxhYmxlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICAgIExvb2tzIHVwIGEgbG9jYWxpemVkIHN0cmluZyBzaW1pbGFyIHRvIFRlc3QgYnVnOiBBIHRlc3QgY2Fubm90IHVzZSBUZXN0IFRhc2sgb2JqZWN0cywgc3VjaCBhcyBjYWxsYmFja3MgYW5kIGNvbmRpdGlvbmFscywgb3IgdGhlIFB1bXBNZXNzYWdlcyBmZWF0dXJlLCB1bmxlc3MgbWFya2VkIHdpdGggdGhlIFtBc3luY2hyb25vdXNdIGF0dHJpYnV0ZS4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTeXN0ZW0iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgY2VudHJhbCBlbnRyeSBwb2ludCBmb3IgdW5pdCB0ZXN0IHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgY2VudHJhbCBlbnRyeSBwb2ludCBmb3IgdW5pdCB0ZXN0IHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTeXN0ZW0uVW5pdFRlc3RTeXN0ZW1OYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGcmllbmRseSB1bml0IHRlc3Qgc3lzdGVtIG5hbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTeXN0ZW0uUHJlcGFyZUN1c3RvbUxvZ1Byb3ZpZGVycyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFNldHRpbmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBwYXJ0aWFsIG1ldGhvZCBmb3IgUHJlcGFyZURlZmF1bHRMb2dNYW5hZ2VyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2V0dGluZ3MiPlRoZSB0ZXN0IGhhcm5lc3Mgc2V0dGluZ3MuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0U3lzdGVtLlNldFRlc3RTZXJ2aWNlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0U2V0dGluZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHBhcnRpYWwgbWV0aG9kIGZvciBzZXR0aW5nIHRoZSBUZXN0U2VydmljZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNldHRpbmdzIj5UaGUgdGVzdCBoYXJuZXNzIHNldHRpbmdzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFN5c3RlbS5DcmVhdGVUZXN0UGFnZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyBhIG5ldyBUZXN0UGFnZSB2aXN1YWwgdGhhdCBpbiB0dXJuIHdpbGwgc2V0dXAgYW5kIGJlZ2luIGEgDQorICAgICAgICAgICAgdW5pdCB0ZXN0IHJ1bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+QSBuZXcgUm9vdFZpc3VhbC48L3JldHVybnM+DQorICAgICAgICAgICAgPHJlbWFya3M+QXNzdW1lcyB0aGUgY2FsbGluZyBhc3NlbWJseSBpcyBhIHRlc3QgYXNzZW1ibHkuPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTeXN0ZW0uQ3JlYXRlVGVzdFBhZ2UoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgVGVzdFBhZ2UgdmlzdWFsIHRoYXQgaW4gdHVybiB3aWxsIHNldHVwIGFuZCBiZWdpbiBhIA0KKyAgICAgICAgICAgIHVuaXQgdGVzdCBydW4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZXR0aW5ncyI+VGVzdCBoYXJuZXNzIHNldHRpbmdzIHRvIGJlIGFwcGxpZWQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5BIG5ldyBSb290VmlzdWFsLjwvcmV0dXJucz4NCisgICAgICAgICAgICA8cmVtYXJrcz5Bc3N1bWVzIHRoZSBjYWxsaW5nIGFzc2VtYmx5IGlzIGEgdGVzdCBhc3NlbWJseS48L3JlbWFya3M+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFN5c3RlbS5NZXJnZVNldHRpbmdzQW5kUGFyYW1ldGVycyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RTZXJ2aWNlUHJvdmlkZXIsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1lcmdlIGFueSBzZXR0aW5ncyBwcm92aWRlZCBieSBhIHRlc3Qgc2VydmljZSB3aXRoIHRoZSBwYXJhbWV0ZXJzIA0KKyAgICAgICAgICAgIHRoYXQgd2VyZSBwYXNzZWQgaW5zaWRlIHRoZSBUZXN0SGFybmVzc1NldHRpbmdzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdFNlcnZpY2UiPlRoZSB0ZXN0IHNlcnZpY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5wdXRTZXR0aW5ncyI+VGhlIHJ1biBzZXR0aW5ncy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTeXN0ZW0uUHJlcGFyZVRlc3RTZXJ2aWNlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0U2V0dGluZ3MsU3lzdGVtLkFjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIHRoZSB0ZXN0IHNlcnZpY2UgYW5kIGl0cyBjb250YWluZWQgcHJvdmlkZXJzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5wdXRTZXR0aW5ncyI+VGhlIHJ1biBzZXR0aW5ncy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wbGV0ZSI+QWN0aW9uIHRvIGNhbGwgb25jZSB0aGUgdGVzdCBzZXJ2aWNlIGlzIA0KKyAgICAgICAgICAgIGluaXRpYWxpemVkIGFuZCByZWFkeSB0byBjb250aW51ZSB0aGUgcnVuJ3MgZXhlY3V0aW9uLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFN5c3RlbS5SZWdpc3RlclVuaXRUZXN0UHJvdmlkZXIoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVVuaXRUZXN0UHJvdmlkZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZWdpc3RlciBhbm90aGVyIGF2YWlsYWJsZSB1bml0IHRlc3QgcHJvdmlkZXIgZm9yIHRoZSB1bml0IHRlc3Qgc3lzdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icHJvdmlkZXIiPkEgdW5pdCB0ZXN0IHByb3ZpZGVyLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFN5c3RlbS5faGFybmVzcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCBoYXJuZXNzIGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0U3lzdGVtLlJ1bihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFNldHRpbmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3RhcnQgYSBuZXcgdW5pdCB0ZXN0IHJ1bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNldHRpbmdzIj5Vbml0IHRlc3Qgc2V0dGluZ3Mgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFN5c3RlbS5TZXRTdGFuZGFyZExvZ1Byb3ZpZGVycyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFNldHRpbmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJlcGFyZXMgdGhlIGRlZmF1bHQgbG9nIG1hbmFnZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZXR0aW5ncyI+VGhlIHRlc3QgaGFybmVzcyBzZXR0aW5ncy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTeXN0ZW0uVHJ5QWRkVmlzdWFsU3R1ZGlvTG9nUHJvdmlkZXIoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRyaWVzIHRvIGluc3RhbnRpYXRlIGFuZCBpbml0aWFsaXplIGEgVlNUVCBwcm92aWRlci4gUmVxdWlyZXMgdGhhdCANCisgICAgICAgICAgICBYTGlucSBpcyBhdmFpbGFibGUgYW5kIGluY2x1ZGVkIGluIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2V0dGluZ3MiPlRoZSB0ZXN0IGhhcm5lc3Mgc2V0dGluZ3Mgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFN5c3RlbS5DcmVhdGVEZWZhdWx0U2V0dGluZ3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MgdGhhdCB3b3VsZCBiZSB1c2VkIGJ5IHRoZSBVbml0VGVzdEhhcm5lc3MNCisgICAgICAgICAgICBpZiBub25lIHdlcmUgc3BlY2lmaWVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5BIG5ldyBSb290VmlzdWFsLjwvcmV0dXJucz4NCisgICAgICAgICAgICA8cmVtYXJrcz5Bc3N1bWVzIHRoZSBjYWxsaW5nIGFzc2VtYmx5IGlzIGEgdGVzdCBhc3NlbWJseS48L3JlbWFya3M+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFN5c3RlbS5PblRlc3RIYXJuZXNzQ29tcGxldGVkKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEhhcm5lc3NDb21wbGV0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDYWxsIHRoZSBUZXN0SGFybmVzc0NvbXBsZXRlZCBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPlRoZSB0ZXN0IGhhcm5lc3MgY29tcGxldGVkIGV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTeXN0ZW0uQ3JlYXRlRGVmYXVsdFNldHRpbmdzKFN5c3RlbS5SZWZsZWN0aW9uLkFzc2VtYmx5KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlIGEgZGVmYXVsdCBzZXR0aW5ncyBvYmplY3QgZm9yIHVuaXQgdGVzdGluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNhbGxpbmdBc3NlbWJseSI+VGhlIGFzc2VtYmx5IHJlZmxlY3Rpb24gb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+QSB1bml0IHRlc3Qgc2V0dGluZ3MgaW5zdGFuY2UuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTeXN0ZW0uU3lzdGVtTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdGVzdCBzeXN0ZW0gbmFtZSBidWlsdCBpbnRvIHRoZSBhc3NlbWJseS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFN5c3RlbS5GcmFtZXdvcmtGaWxlVmVyc2lvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGZpbGUgdmVyc2lvbiBhdHRyaWJ1dGUgb2YgdGhlIG1haW4NCisgICAgICAgICAgICB1bml0IHRlc3QgZnJhbWV3b3JrIGFzc2VtYmx5LCBpZiBwcmVzZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJFOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0U3lzdGVtLlRlc3RIYXJuZXNzQ29tcGxldGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIGNvbXBsZXRlZCB0ZXN0IGhhcm5lc3MgaGFuZGxlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Xb3JrSXRlbUV4dGVuc2lvbnMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgY2xhc3MgY29udGFpbnMgZXh0ZW5zaW9uIG1ldGhvZHMgYW5kIGhlbHBlcnMgZm9yIGRlYWxpbmcgd2l0aCBXb3JrSXRlbQ0KKyAgICAgICAgICAgIGluc3RhbmNlcyBhbmQgaW1wcm92aW5nIGZyYW1ld29yayBwZXJmb3JtYW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Xb3JrSXRlbUV4dGVuc2lvbnMuRW5xdWV1ZVF1aWNrV29ya0l0ZW0oTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuV29ya0l0ZW1UZXN0LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLldvcmtJdGVtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRW5xdWV1ZXMgYSB3b3JrIGl0ZW0gaW50byB0aGUgdGFzayBxdWV1ZS4gVGhlIHdvcmsgaXRlbSB3aWxsIHJ1bg0KKyAgICAgICAgICAgIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgcHJldmlvdXMgd29yayBpdGVtLCBhbmQgbWF5IG5vdCBsZWF2ZSBhbnkNCisgICAgICAgICAgICB0aW1lIGJlZm9yZSBleGVjdXRpbmcgdGhlIG5leHQuIFRoaXMgaXMgYSBzcGVjaWFsaXplZCBtZXRob2QgdG8gYmUNCisgICAgICAgICAgICB1c2VkIGZvciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0Ij5UaGUgd29yayBpdGVtIHRlc3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id29ya0l0ZW0iPlRoZSB1bml0IG9mIHdvcmsuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLldvcmtJdGVtRXh0ZW5zaW9ucy5FbnF1ZXVlUXVpY2tDYWxsYmFjayhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Xb3JrSXRlbVRlc3QsU3lzdGVtLkFjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEVucXVldWVzIGEgbWV0aG9kIGludG8gdGhlIHRhc2sgcXVldWUuIFRoZSBtZXRob2Qgd2lsbCBydW4NCisgICAgICAgICAgICBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIHByZXZpb3VzIHdvcmsgaXRlbSwgYW5kIG1heSBub3QgbGVhdmUgYW55DQorICAgICAgICAgICAgdGltZSBiZWZvcmUgZXhlY3V0aW5nIHRoZSBuZXh0LiBUaGlzIGlzIGEgc3BlY2lhbGl6ZWQgbWV0aG9kIHRvIGJlDQorICAgICAgICAgICAgdXNlZCBmb3IgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdCI+VGhlIHdvcmsgaXRlbSB0ZXN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNhbGxiYWNrIj5UaGUgY2FsbGJhY2sgYWN0aW9uIG9yIG1ldGhvZC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuV29ya0l0ZW1FeHRlbnNpb25zLkVucXVldWVRdWlja0NvbmRpdGlvbmFsKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLldvcmtJdGVtVGVzdCxTeXN0ZW0uRnVuY3tTeXN0ZW0uQm9vbGVhbn0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFbnF1ZXVlcyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCBpbnRvIHRoZSB0YXNrIHF1ZXVlLiBUaGUgbWV0aG9kIHdpbGwNCisgICAgICAgICAgICBydW4gaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBwcmV2aW91cyB3b3JrIGl0ZW0sIGFuZCBtYXkgbm90IGxlYXZlDQorICAgICAgICAgICAgYW55IHRpbWUgYmVmb3JlIGV4ZWN1dGluZyB0aGUgbmV4dC4gVGhpcyBpcyBhIHNwZWNpYWxpemVkIG1ldGhvZCB0bw0KKyAgICAgICAgICAgIGJlIHVzZWQgZm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3QiPlRoZSB3b3JrIGl0ZW0gdGVzdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25kaXRpb25hbCI+VGhlIGNvbmRpdGlvbmFsIGZ1bmN0aW9uIG9yIHN0YXRlbWVudC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuV29ya0l0ZW1UZXN0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDdXN0b20gdGVzdCBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHBlcmZvcm0gc2VtaS1hc3luY2hyb25vdXMgDQorICAgICAgICAgICAgdGVzdCB0YXNrcyBvbiB0aGUgbWFpbiB0aHJlYWQuICBSZXF1aXJlcyB0aGUgY3VzdG9tIHVuaXQgdGVzdCBoYXJuZXNzIA0KKyAgICAgICAgICAgIHRoYXQgbWFuYWdlcyBhbmQgaW52b2tlcyB0ZXN0IHdvcmsgaXRlbXMgb24gdGhlIHRocmVhZCB3aGVuIG5lZWRlZC4NCisgICAgICAgICAgICANCisgICAgICAgICAgICBUZXN0cyB1c2luZyB0aGlzIGZ1bmN0aW9uYWxpdHkgd2lsbCBub3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBmdWxsIA0KKyAgICAgICAgICAgIGRlc2t0b3AgZnJhbWV3b3JrJ3MgVmlzdWFsIFN0dWRpbyBUZWFtIFRlc3QgZW52aXJvbm1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuV29ya0l0ZW1UZXN0LlRlc3RDb21wbGV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2lnbmFsIHRoYXQgYSB0ZXN0IGlzIGNvbXBsZXRlIHdoZW4gdXNpbmcgQXN5bmMgdGVzdGluZy4gIA0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIFdBUk5JTkc6IElmIHlvdSB1c2UgeW91ciBvd24gbWV0aG9kcyBmb3IgY29tcGxldGluZywgc3VjaCBhcyBhbiANCisgICAgICAgICAgICBIdG1sVGltZXIgb3Igb3RoZXIgdGhyZWFkaW5nIG1ldGhvZCwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIGNhbGwgDQorICAgICAgICAgICAgd2lsbCBvY2N1ciAqQUZURVIqIHRoZSB0ZXN0IGhhcyB0aW1lZCBvdXQgd2hlbiB1c2luZyBUaW1lb3V0cy4gIEFzIA0KKyAgICAgICAgICAgIHN1Y2gsIGJlIHZlcnkgY2FyZWZ1bCBhcyB5b3UgY291bGQgY29tcGxldGUgdGhlIGNhbGwgdG8gdGhlICpuZXh0KiANCisgICAgICAgICAgICB0ZXN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLldvcmtJdGVtVGVzdC5FbnF1ZXVlV29ya0l0ZW0oTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuV29ya0l0ZW0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBZGQgYSB0YXNrIG9iamVjdCB0byB0aGUgdGVzdCBxdWV1ZS4gIEZvciBhIHRlc3QgdGhhdCBpcyBjdXJyZW50bHkgDQorICAgICAgICAgICAgZXhlY3V0aW5nLCBhbGwgdGFza3MgY29udGFpbmVkIHdpdGhpbiB0aGUgcXVldWUgYXJlIGV4ZWN1dGVkIHRvIA0KKyAgICAgICAgICAgIGNvbXBsZXRpb24gKHVubGVzcyBhbiBFeGNlcHRpb24gaXMgdGhyb3duKSAtYmVmb3JlLSBtb3Zpbmcgb24gdG8gDQorICAgICAgICAgICAgdGhlIG5leHQgdGVzdC4NCisgICAgICAgICAgICANCisgICAgICAgICAgICBUaGUgdGVzdCB0YXNrIHF1ZXVlIHJlcGxhY2VzIHRoZSBQdW1wTWVzc2FnZXMoLi4uKSBzeXN0ZW0gdGhhdCANCisgICAgICAgICAgICBwZXJtaXR0ZWQgYSBzaW5nbGUgY2FsbGJhY2suICBUaGlzIGVuYWJsZXMgc3BlY2lhbGl6ZWQgdGFza3MsIHN1Y2ggDQorICAgICAgICAgICAgYXMgRE9NIGJyaWRnZSB0YXNrcywgc2xlZXAgdGFza3MsIGFuZCBjb25kaXRpb25hbCBjb250aW51ZSB0YXNrcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RUYXNrT2JqZWN0Ij5Bc3luY2hyb25vdXMgdGVzdCB0YXNrIA0KKyAgICAgICAgICAgIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Xb3JrSXRlbVRlc3QuRW5xdWV1ZURlbGF5KFN5c3RlbS5UaW1lU3BhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERlbGF5IGEgbWluaW11bSBhbW91bnQgb2YgdGltZSBiZWZvcmUgY29udGludWluZy4gU2ltaWxhciB0byBhIHNsZWVwDQorICAgICAgICAgICAgY2FsbCB0aGF0IGlzIG5vdCBhIGJsb2NraW5nIGNhbGwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWxheSI+VGhlIG1pbmltdW0gdGltZSBzcGFuIHRvIHdhaXQgYmVmb3JlIGNvbnRpbnVpbmcuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLldvcmtJdGVtVGVzdC5DcmVhdGVEZWxheShTeXN0ZW0uVGltZVNwYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGVzIGEgZGVsYXkgd29yayBpdGVtIGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVsYXkiPlRoZSBtaW5pbXVtIHRpbWUgc3BhbiB0byB3YWl0IGJlZm9yZSBjb250aW51aW5nLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIG5ldyB3b3JrIGl0ZW0uPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuV29ya0l0ZW1UZXN0LkVucXVldWVEZWxheShTeXN0ZW0uRG91YmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGVsYXkgYSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIGJlZm9yZSBjb250aW51aW5nLiBTaW1pbGFyIHRvIGEgc2xlZXANCisgICAgICAgICAgICBjYWxsIHRoYXQgaXMgbm90IGEgYmxvY2tpbmcgY2FsbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1pbGxpc2Vjb25kcyI+VGhlIG1pbmltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0DQorICAgICAgICAgICAgdW50aWwgdGhlIGRlbGF5IGlzIGZpbmlzaGVkLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Xb3JrSXRlbVRlc3QuRW5xdWV1ZUNvbmRpdGlvbmFsKFN5c3RlbS5GdW5je1N5c3RlbS5Cb29sZWFufSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcXVpcmVzIGEgYm9vbCByZXR1cm5pbmcgZGVsZWdhdGUgdG8gYmUgcGFzc2VkIGluLiBJbnN0cnVjdHMgdGhlIA0KKyAgICAgICAgICAgIHRlc3QgdGFzayBxdWV1ZSB0byB3YWl0IHVudGlsIHRoZSBjb25kaXRpb25hbCBjYWxsIHJldHVybnMgVHJ1ZSB0byANCisgICAgICAgICAgICBjb250aW51ZSBleGVjdXRpbmcgb3RoZXIgdGVzdCB0YXNrcyBhbmQvb3IgZW5kaW5nIHRoZSB0ZXN0IG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbmRpdGlvbmFsRGVsZWdhdGUiPkNvbmRpdGlvbmFsIG1ldGhvZCBvciBkZWxlZ2F0ZS4gDQorICAgICAgICAgICAgVGVzdCB3aWxsIGhhbHQgdW50aWwgdGhpcyBjb25kaXRpb24gcmV0dXJucyBUcnVlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Xb3JrSXRlbVRlc3QuQ3JlYXRlQ29uZGl0aW9uYWwoU3lzdGVtLkZ1bmN7U3lzdGVtLkJvb2xlYW59KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyBhIGNvbmRpdGlvbmFsIHdvcmsgaXRlbSBpbnN0YW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbmRpdGlvbmFsRGVsZWdhdGUiPkNvbmRpdGlvbmFsIG1ldGhvZCBvciBkZWxlZ2F0ZS4gDQorICAgICAgICAgICAgVGVzdCB3aWxsIGhhbHQgdW50aWwgdGhpcyBjb25kaXRpb24gcmV0dXJucyBUcnVlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIG5ldyB3b3JrIGl0ZW0uPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuV29ya0l0ZW1UZXN0LkVucXVldWVUZXN0Q29tcGxldGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEVucXVldWUgYSB0ZXN0IHRhc2sgd2hpY2ggY2FsbHMgdGhlIFRlc3RDb21wbGV0ZSBtZXRob2Qgb2YgDQorICAgICAgICAgICAgU2lsdmVybGlnaHRUZXN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLldvcmtJdGVtVGVzdC5FbnF1ZXVlQ2FsbGJhY2soU3lzdGVtLkFjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFkZCBhIENhbGxiYWNrIG1ldGhvZCBpbnRvIHRoZSB0ZXN0IHRhc2sgcXVldWUuICBTaW1pbGFyIHRvIHRoZSANCisgICAgICAgICAgICBQdW1wTWVzc2FnZXMoLi4uKSBjYWxsLCB3aXRoIHRoZSBkaWZmZXJlbmNlIGJlaW5nIHRoYXQgdGhlcmUgaXMgbm8gDQorICAgICAgICAgICAgbG9uZ2VyIGEgc2luZ2xlIHJlcXVpcmVtZW50OiB5b3UgY2FuIGVucXVldWUgc2V2ZXJhbCBjYWxsYmFjayANCisgICAgICAgICAgICBtZXRob2RzIGFuZCBvdGhlciB0ZXN0IHRhc2tzLCBhbGwgb2Ygd2hpY2ggd2lsbCBleGVjdXRlIGJlZm9yZSB0aGUgDQorICAgICAgICAgICAgdGVzdCBjb21wbGV0ZXMgYW5kL29yIHRoZSBlbmdpbmUgY29udGludWVzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdENhbGxiYWNrRGVsZWdhdGUiPlZvaWQtcmV0dXJuaW5nIGRlbGVnYXRlLCANCisgICAgICAgICAgICBhbm9ueW1vdXMgZGVsZWdhdGVzIHdvcmsgZmluZSB0b28uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLldvcmtJdGVtVGVzdC5DcmVhdGVDYWxsYmFjayhTeXN0ZW0uQWN0aW9uKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyBhIGNhbGxiYWNrIHdvcmsgaXRlbSBpbnN0YW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RDYWxsYmFja0RlbGVnYXRlIj5Wb2lkLXJldHVybmluZyBkZWxlZ2F0ZSwgDQorICAgICAgICAgICAgYW5vbnltb3VzIGRlbGVnYXRlcyB3b3JrIGZpbmUgdG9vLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIG5ldyB3b3JrIGl0ZW0uPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuV29ya0l0ZW1UZXN0LkVucXVldWVDYWxsYmFjayhTeXN0ZW0uQWN0aW9uW10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBZGRzIGEgbnVtYmVyIG9mIGNhbGxiYWNrIG1ldGhvZHMgaW50byB0aGUgdGVzdCB0YXNrIHF1ZXVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0aW9ucyI+U2V0IG9mIEFjdGlvbiBpbnN0YW5jZXMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLldvcmtJdGVtVGVzdC5TbGVlcChTeXN0ZW0uSW50MzIsU3lzdGVtLkFjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNsZWVwIGEgbWluaW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSBjYWxsaW5nIGEgdGVzdCANCisgICAgICAgICAgICBjYWxsYmFjayBkZWxlZ2F0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNsZWVwTWlsbGlzZWNvbmRzTWluaW11bSI+TWluaW11bSBudW1iZXIgb2YgDQorICAgICAgICAgICAgbWlsbGlzZWNvbmRzIHRvIHNsZWVwLiAgVGhlIG9ubHkgZ3VhcmFudGVlIHRvIHRoZSB0ZXN0ZXIgDQorICAgICAgICAgICAgaXMgdGhhdCB0aGUgc2xlZXAgd2lsbCBiZSA+PSB0aGlzIGFtb3VudCBvZiBtcywgYW5kIE5PVCANCisgICAgICAgICAgICB0aGF0IHRoZXJlIGlzIHByZWNpc2lvbiBvciBhbiBleGFjdCB0aW1lLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RDYWxsYmFjayI+Q2FsbGJhY2sgbWV0aG9kIHRvIA0KKyAgICAgICAgICAgIGV4ZWN1dGUgYWZ0ZXIgdGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgaGFzIA0KKyAgICAgICAgICAgIGVsYXBzZWQuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLldvcmtJdGVtVGVzdC5FbnF1ZXVlKFN5c3RlbS5BY3Rpb24pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFbnF1ZXVlIGFuIGFjdGlvbi4gIEEgc2hvcnRjdXQgZm9yIHRoZSBFbnF1ZXVlQ2FsbGJhY2suDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3Rpb24iPlRoZSBhY3Rpb24gdG8gZW5xdWV1ZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuV29ya0l0ZW1UZXN0LkVucXVldWVTbGVlcChTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTbGVlcCBhIG1pbmltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gIFRoaXMgaXMgdGhlIHNpbXBsaWZpZWQgDQorICAgICAgICAgICAgb3ZlcmxvYWQgd2hpY2ggcmVxdWlyZXMgbm8gY2FsbGJhY2suDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzbGVlcE1pbGxpc2Vjb25kc01pbmltdW0iPk1pbmltdW0gbnVtYmVyIG9mIA0KKyAgICAgICAgICAgIG1pbGxpc2Vjb25kcyB0byBzbGVlcC4gIFRoZSBvbmx5IGd1YXJhbnRlZSB0byB0aGUgdGVzdGVyIGlzIHRoYXQgdGhlDQorICAgICAgICAgICAgc2xlZXAgd2lsbCBiZSA+PSB0aGlzIGFtb3VudCBvZiBtcywgYW5kIE5PVCB0aGF0IHRoZXJlIGlzIHByZWNpc2lvbiANCisgICAgICAgICAgICBvciBhbiBleGFjdCB0aW1lLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5FeGNsdXNpdmVBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgc3BlY2lhbCBpbmRpY2F0b3IgYXR0cmlidXRlIHRvIGVuYWJsZSBiZXR0ZXIgZGVidWdnaW5nIHVzaW5nIA0KKyAgICAgICAgICAgIE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLiAgDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgQXMgdGhlcmUgaXMgdmVyeSBsaXR0bGUgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBmb3IgYSB0ZXN0IHJ1biwgDQorICAgICAgICAgICAgdGhpcyBhdHRyaWJ1dGUgc2luZ2xlcyBvdXQgc3BlY2lmaWMgY2xhc3NlcyB0byBleGVjdXRlIHdoZW4gZm91bmQuDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgdW5pcXVlIHRvIHRoaXMgZW52aXJvbm1lbnQgYW5kIG5vdCBjb21wYXRpYmxlIHdpdGggYW55IA0KKyAgICAgICAgICAgIGRlc2t0b3AgdW5pdCB0ZXN0IGZyYW1ld29yayB3aXRob3V0IHVzaW5nIGEgc2hpbSBpZiBpdCBpcyBsZWZ0IGluIGNvZGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuUHJlc2VudGF0aW9uVGVzdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgdXNlZnVsIHByb3BlcnRpZXMgYW5kIGZlYXR1cmVzIGZvciBwcmVzZW50YXRpb24gDQorICAgICAgICAgICAgcGxhdGZvcm0gdGVzdHMgKFNpbHZlcmxpZ2h0IGFuZCBXUEYpLg0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIFRlc3RzIHVzaW5nIHRoaXMgZnVuY3Rpb25hbGl0eSB3aWxsIG5vdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGZ1bGwgDQorICAgICAgICAgICAgZGVza3RvcCBmcmFtZXdvcmsncyBWaXN1YWwgU3R1ZGlvIFRlYW0gVGVzdCBlbnZpcm9ubWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5QcmVzZW50YXRpb25UZXN0LlRlc3RQYW5lbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdGVzdCBwYW5lbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TaWx2ZXJsaWdodFRlc3QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb3ZpZGVzIGFjY2VzcyB0byBTaWx2ZXJsaWdodC1zcGVjaWZpYyB0ZXN0IGZlYXR1cmVzIGFuZCANCisgICAgICAgICAgICBmdW5jdGlvbmFsaXR5Lg0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIFRlc3RzIHVzaW5nIHRoaXMgZnVuY3Rpb25hbGl0eSB3aWxsIG5vdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGZ1bGwgDQorICAgICAgICAgICAgZGVza3RvcCBmcmFtZXdvcmsncyBWaXN1YWwgU3R1ZGlvIFRlYW0gVGVzdCBlbnZpcm9ubWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Xb3JrSXRlbSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB0ZXN0IHdvcmsgaXRlbSBpcyBhIHRhc2sgdGhhdCBpcyBpbnZva2VkIHVudGlsIGl0IGlzIGNvbXBsZXRlLiAgSXQgDQorICAgICAgICAgICAgbWFpbnRhaW5zIGl0cyBvd24gc3RhdGUgdG8gYmUgYWJsZSB0byBub3RpZnkgdGhlIGNhbGxlciB3aGVuIGl0IGlzIA0KKyAgICAgICAgICAgIGZpbmFsbHkgY29tcGxldGUsIHdpdGggbm8gZnVydGhlciB3b3JrIHRvIGJlIHJ1bi4NCisgICAgICAgICAgICANCisgICAgICAgICAgICBJdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgaW1wbGVtZW50YXRpb25zIG9mIGEgVGVzdFdvcmtJdGVtIG1heSBhY3R1YWxseSANCisgICAgICAgICAgICBjb250YWluIGEgc2V0IG9mIHN1Yi10YXNrcyBieSBpbXBsZW1lbnRpbmcgYSBjb21wb3NpdGUgcGF0dGVybi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Xb3JrSXRlbS5fY2FuRXhlY3V0ZUltbWVkaWF0ZWx5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGFzayBjYW4gaW1tZWRpYXRlbHkgZXhlY3V0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Xb3JrSXRlbS5JbnZva2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEludm9rZSB0aGUgdGFzay4gIFJldHVybiBmYWxzZSBvbmx5IHdoZW4gdGhlIHRhc2sgaXMgY29tcGxldGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgaWYgdGhlcmUgaXMgYWRkaXRpb25hbCB3b3JrIHRvIGJlIGNvbXBsZXRlZC4gIEZhbHNlIA0KKyAgICAgICAgICAgIHdoZW4gdGhlcmUgaXMgbm9uZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Xb3JrSXRlbS5Xb3JrSXRlbUNvbXBsZXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDYWxsZWQgYnkgdGhlIHRhc2sgYWZ0ZXIgdGhlIHdvcmsgaXMgY29tcGxldGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuV29ya0l0ZW0uSXNDb21wbGV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGFzaydzIHdvcmsgaXMgY29tcGxldGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuV29ya0l0ZW0uQ2FuRXhlY3V0ZUltbWVkaWF0ZWx5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHdvcmsgaXRlbSBjYW4gYmUNCisgICAgICAgICAgICBleGVjdXRlZCBpbW1lZGlhdGVseSwgYW5kIGRvZXMgbm90IHJlbHkgb24gc3BlY2lhbCBhc3luY2hyb25vdXMNCisgICAgICAgICAgICBvcGVyYXRpb24uIFVzZWQgZm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cy4gVGhlIHNldHRlciBpcyBhbHNvDQorICAgICAgICAgICAgcHVibGljLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RMb2dNZXNzYWdlV3JpdGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgZXh0ZW5kZWQgd3JpdGVyIGZvciB0aGUgdW5pdCB0ZXN0aW5nIGhhcm5lc3MgYW5kIGNvbnN1bWVycy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VXcml0ZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgdXRpbGl0eSB0eXBlIHRoYXQgd3JpdGVzIG5ldyBsb2cgbWVzc2FnZXMgdG8gdGhlIHRlc3QgaGFybmVzcyBsb2cNCisgICAgICAgICAgICBxdWV1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VXcml0ZXIuX2ZhY3RvcnkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBmYWN0b3J5IHVzZWQgZm9yIGNyZWF0aW5nIG5ldyBMb2dNZXNzYWdlIHR5cGVzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZVdyaXRlci5fdGVzdEhhcm5lc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB0ZXN0IGhhcm5lc3MgdGhhdCBjb250YWlucyB0aGUgbWV0aG9kIHRvIHBvc3QgbmV3IGV2ZW50cyBpbnRvDQorICAgICAgICAgICAgdGhlIGxvZyBtZXNzYWdlIHF1ZXVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZVdyaXRlci4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemUgYSBuZXcgd3JpdGVyIGNsYXNzLCB1c2luZyB0aGUgZGVmYXVsdCBMb2dNZXNzYWdlRmFjdG9yeQ0KKyAgICAgICAgICAgIHRvIGNyZWF0ZSBuZXcgbWVzc2FnZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJoYXJuZXNzIj5UaGUgdGVzdCBoYXJuZXNzIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VXcml0ZXIuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlRmFjdG9yeSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemUgYSBuZXcgd3JpdGVyIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaGFybmVzcyI+VGhlIHRlc3QgaGFybmVzcyBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlRmFjdG9yeSI+DQorICAgICAgICAgICAgVGhlIGZhY3RvcnkgdG8gdXNlIHdoZW4gY3JlYXRpbmcgbmV3IG1lc3NhZ2VzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VXcml0ZXIuRW5xdWV1ZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQb3N0cyBhIGxvZyBtZXNzYWdlIHRvIHRoZSB0ZXN0IGhhcm5lc3MgcXVldWUgZm9yIHByb2Nlc3NpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbG9nIG1lc3NhZ2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VXcml0ZXIuQ3JlYXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGVzIGEgbmV3IGxvZyBtZXNzYWdlIHVzaW5nIHRoZSBlbWJlZGRlZCBmYWN0b3J5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgbmV3IExvZ01lc3NhZ2UgaW5zdGFuY2UuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlV3JpdGVyLkNyZWF0ZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VUeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyBhIG5ldyBsb2cgbWVzc2FnZSB1c2luZyB0aGUgZW1iZWRkZWQgZmFjdG9yeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2VUeXBlIj5UaGUgbWVzc2FnZSB0eXBlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIG5ldyBMb2dNZXNzYWdlIGluc3RhbmNlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZVdyaXRlci5DcmVhdGUoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlVHlwZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyBhIG5ldyBsb2cgbWVzc2FnZSB1c2luZyB0aGUgZW1iZWRkZWQgZmFjdG9yeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2VUeXBlIj5UaGUgbWVzc2FnZSB0eXBlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSB0ZXh0IG1lc3NhZ2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgbmV3IExvZ01lc3NhZ2UgaW5zdGFuY2UuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlV3JpdGVyLkRlY29yYXRlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZSxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZWNvcmF0ZSBhIGxvZyBtZXNzYWdlIHdpdGggYSB2YWx1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBsb2cgbWVzc2FnZSB0byBkZWNvcmF0ZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJrZXkiPlRoZSBrZXkgZm9yIHRoaXMgZGVjb3JhdGlvbi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlIG9mIHRoaXMgZGVjb3JhdGlvbi48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlV3JpdGVyLkRlY29yYXRlRXhjZXB0aW9uKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZSxTeXN0ZW0uRXhjZXB0aW9uKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGVjb3JhdGUgdGhlIGxvZyBtZXNzYWdlIG9iamVjdCB3aXRoIGFuIEV4Y2VwdGlvbiBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbG9nIG1lc3NhZ2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4Y2VwdGlvbiI+VGhlIEV4Y2VwdGlvbi48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlV3JpdGVyLkRlY29yYXRlTmFtZVByb3BlcnR5KE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGVjb3JhdGUgdGhlIGxvZyBtZXNzYWdlIG9iamVjdCB3aXRoIGEgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBsb2cgbWVzc2FnZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibmFtZSI+TmFtZSBwcm9wZXJ0eSB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlV3JpdGVyLkRlY29yYXRlVGVzdFN0YWdlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZSxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RTdGFnZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERlY29yYXRlIHRoZSBsb2cgbWVzc2FnZSBvYmplY3Qgd2l0aCBhIHRlc3Qgc3RhZ2UgdmFsdWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbG9nIG1lc3NhZ2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN0YWdlIj5UZXN0IHN0YWdlIHZhbHVlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VXcml0ZXIuRGVjb3JhdGVUZXN0T3V0Y29tZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0T3V0Y29tZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERlY29yYXRlIHRoZSBsb2cgbWVzc2FnZSBvYmplY3Qgd2l0aCBhIHRlc3Qgb3V0Y29tZSBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbG9nIG1lc3NhZ2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im91dGNvbWUiPlRlc3Qgb3V0Y29tZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZVdyaXRlci5EZWNvcmF0ZVRlc3RHcmFudWxhcml0eShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0R3JhbnVsYXJpdHkpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZWNvcmF0ZSB0aGUgbG9nIG1lc3NhZ2Ugb2JqZWN0IHdpdGggYSB0ZXN0IGdyYW51bGFyaXR5IG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBsb2cgbWVzc2FnZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZ3JhbnVsYXJpdHkiPlRlc3QgZ3JhbnVsYXJpdHkgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VXcml0ZXIuU2V0VHlwZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNldHMgdGhlIHR5cGUgb2YgdGhlIGxvZyBtZXNzYWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIGxvZyBtZXNzYWdlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0eXBlIj5UaGUgbmV3IHZhbHVlIHRvIHNldCB0aGUgbWVzc2FnZSB0eXBlIHRvLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VXcml0ZXIuRGVidWdXcml0ZUxpbmUoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoaXMgd3JpdGVzIGEgbmV3IGxpbmUgb2YgaW5mb3JtYXRpb24gc2ltaWxhciB0byBhIERlYnVnOjpXcml0ZUxpbmUNCisgICAgICAgICAgICBjYWxsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGV4dCI+VGhlIHRleHQgdG8gd3JpdGUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZVdyaXRlci5JbmZvcm1hdGlvbihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGVzIGluZm9ybWF0aW9uIHRocm91Z2ggYSBuZXcgbG9nIG1lc3NhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbmZvIj5UaGUgaW5mb3JtYXRpb24gc3RyaW5nLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VXcml0ZXIuVGVzdEluZnJhc3RydWN0dXJlKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZXMgYSBtZXNzYWdlIHJlbGF0aW5nIHRvIHRoZSB0ZXN0IGluZnJhc3RydWN0dXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGV4dCI+VGhlIHRleHQgdG8gd3JpdGUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZVdyaXRlci5FbnZpcm9ubWVudChTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGVzIGFuIGVudmlyb25tZW50IG1lc3NhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXh0Ij5UaGUgdGV4dCB0byB3cml0ZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlV3JpdGVyLlRlc3RFeGVjdXRpb24oU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlcyBhIFRlc3RSdW4gbWVzc2FnZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRleHQiPlRoZSB0ZXh0IHRvIHdyaXRlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VXcml0ZXIuRXJyb3IoU3lzdGVtLlN0cmluZyxTeXN0ZW0uRXhjZXB0aW9uKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTG9nIGFuIGVycm9yIG1lc3NhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlcnJvck1lc3NhZ2UiPlRoZSBlcnJvciBtZXNzYWdlIHN0cmluZy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleGNlcHRpb24iPlRoZSBFeGNlcHRpb24gb2JqZWN0IHRvIGRlY29yYXRlIHRoZSBtZXNzYWdlDQorICAgICAgICAgICAgd2l0aC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlV3JpdGVyLkVycm9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBMb2cgYW4gZXJyb3IgbWVzc2FnZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVycm9yTWVzc2FnZSI+VGhlIGVycm9yIG1lc3NhZ2Ugc3RyaW5nLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VXcml0ZXIuV2FybmluZyhTeXN0ZW0uU3RyaW5nLFN5c3RlbS5FeGNlcHRpb24pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBMb2cgYSB3YXJuaW5nIG1lc3NhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3YXJuaW5nTWVzc2FnZSI+VGhlIHdhcm5pbmcgbWVzc2FnZSBzdHJpbmcuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhjZXB0aW9uIj5UaGUgRXhjZXB0aW9uIG9iamVjdCB0byBkZWNvcmF0ZSB0aGUgbWVzc2FnZQ0KKyAgICAgICAgICAgIHdpdGguPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZVdyaXRlci5XYXJuaW5nKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBMb2cgYSB3YXJuaW5nIG1lc3NhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3YXJuaW5nTWVzc2FnZSI+VGhlIHdhcm5pbmcgbWVzc2FnZSBzdHJpbmcuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZVdyaXRlci5UZXN0UmVzdWx0KFN5c3RlbS5TdHJpbmcsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0T3V0Y29tZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlY29yZCBhIHRlc3Qgb3V0Y29tZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBhY2NvbXBhbnlpbmcgbWVzc2FnZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJvdXRjb21lIj5UaGUgb3V0Y29tZSB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlV3JpdGVyLktub3duSXNzdWUoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlcyBpbmZvcm1hdGlvbiBhYm91dCBhbiBlbmNvdW50ZXJlZCwga25vd24gaXNzdWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpc3N1ZSI+SW5mb3JtYXRpb24gYWJvdXQgdGhlIGtub3duIGlzc3VlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VXcml0ZXIuR3JhbnVsYXJUZXN0U3RhZ2UoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEdyYW51bGFyaXR5LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFN0YWdlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVjb3JkcyBhIGxvZyBtZXNzYWdlIHRoYXQgaW5kaWNhdGVzIGEgbmFtZWQsIGdyYW51bGFyIHRlc3Qgc3RhZ2UgDQorICAgICAgICAgICAgaGFzIGhhcHBlbmVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+QW55IG1lc3NhZ2UgZm9yIHRoZSBsb2cuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibmFtZSI+QSBuYW1lIGZvciB0aGUgb2JqZWN0IG9yIGV2ZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImdyYW51bGFyaXR5Ij5UaGUgdGVzdCBncmFudWxhcml0eSB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdGFnZSI+VGhlIHRlc3Qgc3RhZ2UgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RMb2dNZXNzYWdlV3JpdGVyLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIHVuaXQgdGVzdCBsb2cgbWVzc2FnZSB3cml0ZXIgaGVscGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaGFybmVzcyI+VGhlIHRlc3QgaGFybmVzcyByZWZlcmVuY2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RMb2dNZXNzYWdlV3JpdGVyLk1hcmtVbml0VGVzdE1lc3NhZ2UoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTWFya3MgYSBtZXNzYWdlIGFzIGEgdW5pdCB0ZXN0IHN5c3RlbS1zcGVjaWZpYyBtZXNzYWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIGxvZyBtZXNzYWdlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdExvZ01lc3NhZ2VXcml0ZXIuSW5jb3JyZWN0RXhjZXB0aW9uKFN5c3RlbS5UeXBlLFN5c3RlbS5UeXBlLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3MsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBbiBpbmNvcnJlY3QgZXhjZXB0aW9uIHR5cGUgaGFzIG9jY3VycmVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWRFeGNlcHRpb25UeXBlIj5UaGUgZXhwZWN0ZWQgdHlwZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWxFeGNlcHRpb25UeXBlIj5UaGUgYWN0dWFsIGV4Y2VwdGlvbidzIHR5cGUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdCI+VGhlIHRlc3QgbWV0YWRhdGEuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWV0aG9kIj5UaGUgbWV0aG9kIG1ldGFkYXRhLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TG9nTWVzc2FnZVdyaXRlci5Ob0V4Y2VwdGlvbldoZW5FeHBlY3RlZChTeXN0ZW0uVHlwZSxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdENsYXNzLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0TWV0aG9kKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTm8gRXhjZXB0aW9uIHdhcyBpbnRlcmNlcHRlZCwgeWV0IG9uZSB3YXMgZXhwZWN0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZEV4Y2VwdGlvblR5cGUiPlRoZSBleHBlY3RlZCBleGNlcHRpb24gdHlwZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0Ij5UaGUgdGVzdCBjbGFzcyBtZXRhZGF0YS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXRob2QiPlRoZSB0ZXN0IG1ldGhvZCBtZXRhZGF0YS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdExvZ01lc3NhZ2VXcml0ZXIuTG9nRXhjZXB0aW9uKFN5c3RlbS5FeGNlcHRpb24sTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RDbGFzcyxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIExvZ3MgYW5kIEV4Y2VwdGlvbiB0aGF0IHdhcyBpbnRlcmNlcHRlZCBvciBvYnNlcnZlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4Y2VwdGlvbiI+VGhlIGFjdHVhbCBFeGNlcHRpb24gaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdCI+VGhlIHRlc3QgY2xhc3MgbWV0YWRhdGEuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWV0aG9kIj5UaGUgdGVzdCBtZXRob2QgbWV0YWRhdGEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RMb2dNZXNzYWdlV3JpdGVyLklnbm9yZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RHcmFudWxhcml0eSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRW5xdWV1ZXMgYSBJZ25vcmUgbWVzc2FnZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImdyYW51bGFyaXR5Ij5UaGUgZ3JhbnVsYXJpdHkgb2YgdGhlIGlnbm9yZSBvcGVyYXRpb24uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIG5hbWUgb2YgdGhlIHRlc3Qgc2tpcHBlZC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdExvZ01lc3NhZ2VXcml0ZXIuVGVzdFJ1bkZpbHRlclNlbGVjdGVkKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFJ1bkZpbHRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEVucXVldWVzIGEgbWVzc2FnZSBjb250YWluaW5nIGEgdGVzdCBydW4gZmlsdGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsdGVyIj5UaGUgdGVzdCBydW4gZmlsdGVyLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TG9nTWVzc2FnZVdyaXRlci5HcmFudWxhckFzc2VtYmx5VGVzdFN0YWdlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklBc3NlbWJseSxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RHcmFudWxhcml0eSxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RTdGFnZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlY29yZHMgYSBsb2cgbWVzc2FnZSB0aGF0IGluZGljYXRlcyBhIG5hbWVkLCBncmFudWxhciB0ZXN0IHN0YWdlIGhhcyANCisgICAgICAgICAgICBoYXBwZW5lZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFzc2VtYmx5Ij5UaGUgYXNzZW1ibHkgbWV0YWRhdGEgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImdyYW51bGFyaXR5Ij5UaGUgdGVzdCBncmFudWxhcml0eSB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdGFnZSI+VGhlIHRlc3Qgc3RhZ2UgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RMb2dNZXNzYWdlV3JpdGVyLlRlc3RDbGFzc1N0YWdlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3MsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U3RhZ2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBMb2cgYSB0ZXN0IGNsYXNzJ3Mgc3RhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0Ij5UaGUgdGVzdCBjbGFzcyBtZXRhZGF0YSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3RhZ2UiPlRoZSB0ZXN0IHN0YWdlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TG9nTWVzc2FnZVdyaXRlci5UZXN0UmVzdWx0KE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuU2NlbmFyaW9SZXN1bHQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBMb2cgdGhlIHJlc3VsdCBvZiBhIHVuaXQgdGVzdCBzY2VuYXJpby4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJlc3VsdCI+VGhlIHJlc3VsdCBvZiB0aGUgdGVzdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdExvZ01lc3NhZ2VXcml0ZXIuVGVzdE1ldGhvZFN0YWdlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0TWV0aG9kLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFN0YWdlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTG9nIGEgdGVzdCBtZXRob2QncyBzdGFnZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1ldGhvZCI+VGhlIHRlc3QgbWV0aG9kIG1ldGFkYXRhIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdGFnZSI+VGhlIHRlc3Qgc3RhZ2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RMb2dNZXNzYWdlV3JpdGVyLlVuaXRUZXN0SGFybmVzc1N0YWdlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLFN5c3RlbS5TdHJpbmcsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U3RhZ2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZWNvcmRzIGEgaGFybmVzcyBzdGF0ZSBmb3IgdGhlIHVuaXQgdGVzdCBoYXJuZXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaGFybmVzcyI+VGhlIHVuaXQgdGVzdCBoYXJuZXNzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5hbWUiPlRoZSBoYXJuZXNzIG5hbWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3RhZ2UiPlRoZSB0ZXN0IHN0YWdlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB0ZXN0IGhhcm5lc3MgZm9yIGludGVyYWN0aW5nIHdpdGggdW5pdCB0ZXN0IHByb3ZpZGVycyBzdWNoIGFzIFZpc3VhbCANCisgICAgICAgICAgICBTdHVkaW8gVGVhbSBUZXN0J3MgbWV0YWRhdGEuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuSGFybmVzc05hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERpc3BsYXkgbmFtZSBmb3IgdGhpcyBoYXJuZXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLl9nbG9iYWxFeGNlcHRpb25zIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNYW5hZ2VzIHRoZSBhdHRhY2htZW50IHN0YXRlIG9mIGEgZ2xvYmFsIGV4Y2VwdGlvbiBoYW5kbGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLl9oYXJuZXNzVGFza3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnRhaW5lciBvZiBhbGwgd29yayBpdGVtcyBmb3IgdGhlIHRlc3QgaGFybmVzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5fZGlzcGF0Y2hlclN0YWNrIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNYW5hZ2VyIG9mIHRoZSBzdGFjayBvZiBkaXNwYXRjaGVycywgc28gdGhhdCB0aGUgYXBwcm9wcmlhdGUgcGFyZW50IA0KKyAgICAgICAgICAgIGNvbnRhaW5lciBoYW5kbGVzIGV4Y2VwdGlvbnMgYW5kIGNvbXBsZXRpb24gZXZlbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLl92YWxpZFRlc3RBc3NlbWJsaWVzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBOdW1iZXIgb2YgdmFsaWQgdGVzdCBhc3NlbWJsaWVzIGVuY291bnRlcmVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLl9rbm93blRlc3RNZXRob2RzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgY3VycmVudCBydW4ncyBrbm93biBudW1iZXIgb2YgdGVzdCBtZXRob2RzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLl9ldmVudHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIHRoZSBldmVudCBmaXJpbmcgaGVscGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWF0ZSB1bml0IHRlc3QgaGFybmVzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5fcXVldWVkTG9nTWVzc2FnZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFF1ZXVlIG9mIGxvZyBtZXNzYWdlcyBhd2FpdGluZyBwcm9jZXNzaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLkFkZExvZ1Byb3ZpZGVyKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nUHJvdmlkZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBZGRzIGEgbG9nIHByb3ZpZGVyIHRvIHRoZSBsaXN0ZW5pbmcgbG9nIHByb3ZpZGVycyBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InByb3ZpZGVyIj5Mb2cgcHJvdmlkZXIgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5RdWV1ZUxvZ01lc3NhZ2UoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRW5xdWV1ZSBhIGxvZyBtZXNzYWdlIG9iamVjdCBmb3IgcHJvY2Vzc2luZyBieSB0aGUgbG9nIHByb3ZpZGVycy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBsb2cgbWVzc2FnZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLlJ1biI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmVnaW4gcnVubmluZyB0aGUgdGVzdCBoYXJuZXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBNYWtlIHN1cmUgdG8gc3Vic2NyaWJlIHRvIHRoZSBDb21wbGV0ZSBldmVudCBiZWZvcmUgY2FsbGluZyB0aGlzIA0KKyAgICAgICAgICAgIG1ldGhvZCwgaW4gc29tZSBoYXJuZXNzZXMgdGhpcyBtYXkgYmUgYSBzeW5jaHJvbm91cyBSdW4gZm9sbG93ZWQgDQorICAgICAgICAgICAgaW1tZWRpYXRlbHkgYnkgdGhlIENvbXBsZXRlIGV2ZW50IGJlaW5nIGZpcmVkLg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLlJ1bkRpc3BhdGNoZXJDb21wbGV0ZShTeXN0ZW0uT2JqZWN0LFN5c3RlbS5FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb21wbGV0ZSBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNlbmRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5Xcml0ZUxvZ0ZpbGUoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3RvcmVzIGEgbG9nIGZpbGUgZm9yIHRoZSB0ZXN0IHJ1bi4gRGVwZW5kaW5nIG9uIHRoZSBleGVjdXRpb24gDQorICAgICAgICAgICAgZW52aXJvbm1lbnQsIHRoaXMgY2FsbCBtYXkgbm90IHN1Y2Nlc3NmdWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJsb2dOYW1lIj5UaGUgbmFtZSBvZiB0aGUgbG9nIGZpbGUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZUNvbnRlbnQiPlRoZSBsb2cgZmlsZSBjb250ZW50IGFzIGEgc3RyaW5nLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5QdWJsaXNoRmluYWxSZXN1bHQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIElmIHN1cHBvcnRlZCBieSBhbnkgYXR0YWNoZWQgdGVzdCBzZXJ2aWNlLCB0aGlzIHB1Ymxpc2hlcyB0aGUgZmluYWwNCisgICAgICAgICAgICB0ZXN0IHJlc3VsdHMuIFR5cGljYWwgaGFybmVzcyBpbXBsZW1lbnRhdGlvbnMgbWF5IGltbWVkaWF0ZWx5IGNsb3NlDQorICAgICAgICAgICAgdGhlIHdlYiBicm93c2VyIGNoYW5uZWwgdXBvbiByZWNlaXZpbmcgdGhlIG1lc3NhZ2UsIHNvIGFueSBvdGhlcg0KKyAgICAgICAgICAgIHJlcG9ydGluZyBzaG91bGQgYmUgZG9uZSBmaXJzdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5Qcm9jZXNzTG9nTWVzc2FnZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb2Nlc3MgYWxsIHF1ZXVlZCBsb2cgbWVzc2FnZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuSW5pdGlhbGl6ZVNldHRpbmdzKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0U2V0dGluZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGaWxsIG1lbWJlciB2YXJpYWJsZXMgd2l0aCBhbnkgbm9uLW51bGwgc2V0dGluZ3Mgb2YgdGhlIHNhbWUgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNldHRpbmdzIj5TZXR0aW5ncyBjb250YWluZXIgY2xhc3MuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLkluaXRpYWxpemVMb2dQcm92aWRlcnMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGFsbCBsb2cgcHJvdmlkZXJzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLk9uVGVzdEhhcm5lc3NDb21wbGV0ZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhbGwgdGhlIFRlc3RIYXJuZXNzQ29tcGxldGVkIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLk9uUHVibGlzaGluZyhTeXN0ZW0uRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2FsbCB0aGUgUHVibGlzaGluZyBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBldmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLlB1Ymxpc2hSZXN1bHRzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBPdmVycmlkZXMgdGhlIFB1Ymxpc2hSZXN1bHRzIG1ldGhvZCBzbyB0aGF0IGZpbmFsIHJlcG9ydGluZyBpcyBvbmx5DQorICAgICAgICAgICAgZG9uZSBvbmNlIGFsbCBvdGhlciBsb2dnaW5nIGlzIGZpbmlzaGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLlB1Ymxpc2hGaW5hbFJlc3VsdHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFB1Ymxpc2ggZmluYWwgcmVzdWx0cy4gSWYgbm90IHlldCByZWFkeSwgd2lsbCBrZWVwIHdhaXRpbmcgYXJvdW5kDQorICAgICAgICAgICAgYXMgYSB3b3JrIGl0ZW0gdW50aWwgaXQgaXMgZG9uZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5fZGlzcGF0Y2hlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3RvcmVkIGRpc3BhdGNoZXIgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuSXNSZXBvcnRpbmdUZXN0U2VydmljZUNvbm5lY3RlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2hlY2tzIGlmIGEgcmVwb3J0aW5nIHByb3ZpZGVyIGlzIGNvbm5lY3RlZCB0byB0aGUgdGVzdCBzZXJ2aWNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRydWUgaWYgYSByZXBvcnRpbmcgcHJvdmlkZXIgaXMgY29ubmVjdGVkIHRvIHRoZQ0KKyAgICAgICAgICAgIHRlc3Qgc2VydmljZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5TZXRPdmVyYWxsU3RhdHVzKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbW1lZGlhdGVseSBzZXRzIHRoZSBvdmVyYWxsIHN0YXR1cyB1c2luZyBhIGxvZyBtZXNzYWdlIGFuZA0KKyAgICAgICAgICAgIHByb2Nlc3NlcyB0aGUgbWVzc2FnZSBxdWV1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIHNldC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuUHJlcGFyZUN1c3RvbVRlc3RJbnN0YW5jZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DdXN0b21GcmFtZXdvcmtVbml0VGVzdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNldHMgdGhlIHVuaXQgdGVzdCBoYXJuZXNzIHByb3BlcnR5IGZvciBhIHRlc3QgY2FzZSB0aGF0IGluaGVyaXRzIA0KKyAgICAgICAgICAgIGZyb20gdGhlIGFic3RyYWN0IGJhc2UgdHlwZSAnQ3VzdG9tVGVzdCcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjdXN0b21UZXN0Ij5BIEN1c3RvbVRleHQgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLkluaXRpYWxpemUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIGhhcm5lc3Mgd2l0aCBhIHNldCBvZiB0ZXN0IGFzc2VtYmxpZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuUmVzdGFydFJ1bkRpc3BhdGNoZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlc3RhcnRzIHRoZSBydW4gZGlzcGF0Y2hlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5UcmFja1NjZW5hcmlvUmVzdWx0KE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuU2NlbmFyaW9SZXN1bHQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUcmFjayB0aGUgcmVzdWx0cyBmb3Igb3VyIGV4ZWN1dGlvbiBhbmQgYWxzbyB0cmFjayB0aGUgZmFpbCBzdGF0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJlc3VsdCI+U2NlbmFyaW8gcmVzdWx0IHRvIHByb2Nlc3MuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLk9uVGVzdEFzc2VtYmx5U3RhcnRpbmcoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0QXNzZW1ibHlTdGFydGluZ0V2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZpcmVzIHRoZSB0ZXN0IGFzc2VtYmx5IHN0YXJ0aW5nIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VGhlIGV2ZW50IGRhdGEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLk9uSXNEaXNwYXRjaGVyUnVubmluZ0NoYW5nZWQoU3lzdGVtLkV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZpcmVzIHRoZSBwbGF5IHBhdXNlIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgZGF0YS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuT25UZXN0QXNzZW1ibHlDb21wbGV0ZWQoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0QXNzZW1ibHlDb21wbGV0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGaXJlcyB0aGUgdGVzdCBhc3NlbWJseSBjb21wbGV0ZWQgZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgZGF0YS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuT25UZXN0Q2xhc3NTdGFydGluZyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc1N0YXJ0aW5nRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRmlyZXMgdGhlIHRlc3QgY2xhc3Mgc3RhcnRpbmcgZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgZGF0YS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuT25UZXN0Q2xhc3NDb21wbGV0ZWQoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0Q2xhc3NDb21wbGV0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGaXJlcyB0aGUgdGVzdCBjbGFzcyBjb21wbGV0ZWQgZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgZGF0YS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuT25UZXN0TWV0aG9kU3RhcnRpbmcoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0TWV0aG9kU3RhcnRpbmdFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGaXJlcyB0aGUgdGVzdCBtZXRob2Qgc3RhcnRpbmcgZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgZGF0YS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuT25UZXN0TWV0aG9kQ29tcGxldGVkKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE1ldGhvZENvbXBsZXRlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE5vdGlmaWVzIG9ic2VydmVycyB0aGF0IGEgdGVzdCBtZXRob2QgaGFzIGJlZW4gY29tcGxldGVkLiBBbHNvDQorICAgICAgICAgICAgY2xlYXJzIHRoZSB0ZXN0IHBhbmVsJ3MgdmlzdWFsIHRyZWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgZGF0YS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuT25UZXN0UnVuU3RhcnRpbmcoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UnVuU3RhcnRpbmdFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBOb3RpZmllcyBvYnNlcnZlcnMgdGhhdCBhIHRlc3QgcnVuIGhhcyBiZWVuIHN0YXJ0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgZGF0YS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuX3Rlc3RQYWdlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZWZlcmVuY2UgdG8gdGhlIHRlc3QgcGFnZSBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuUmVwb3J0Q29kZUNvdmVyYWdlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFNlcnZpY2VQcm92aWRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEF0dGVtcHRzIHRvIHJlcG9ydCB0aGUgY29kZSBjb3ZlcmFnZSBpbmZvcm1hdGlvbiB1c2luZyB0aGUgdGVzdCANCisgICAgICAgICAgICBzZXJ2aWNlIHByb3ZpZGVyLiBJZiB0aGVyZSBpcyBubyBhdmFpbGFibGUgY292ZXJhZ2UgcmVwb3J0aW5nIA0KKyAgICAgICAgICAgIHNlcnZpY2UsIHRoaXMgaXMgYSBzaWxlbnQgZmFpbHVyZS4gT25seSByZXBvcnRzIGlmID49IDEgYmxvY2tzIA0KKyAgICAgICAgICAgIGFyZSBoaXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0U2VydmljZSI+VGhlIHRlc3Qgc2VydmljZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuRW5xdWV1ZVRlc3RBc3NlbWJseShTeXN0ZW0uUmVmbGVjdGlvbi5Bc3NlbWJseSxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RSdW5GaWx0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFbnF1ZXVlIGEgdGVzdCBhc3NlbWJseSBmcm9tIGEgc2ltcGxlIEFzc2VtYmx5IHJlZmVyZW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFzc2VtYmx5Ij5UaGUgdGVzdCBhc3NlbWJseS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJydW5GaWx0ZXIiPlRoZSBydW4gZmlsdGVyIHNldHRpbmdzIGZvciB0aGUgdGVzdCBhc3NlbWJseSdzIHJ1bi48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuRW5xdWV1ZVRlc3RBc3NlbWJseShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JQXNzZW1ibHksTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UnVuRmlsdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRW5xdWV1ZXMgYSB0ZXN0IGFzc2VtYmx5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdEFzc2VtYmx5Ij5UaGUgdGVzdCBhc3NlbWJseSBtZXRhZGF0YS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJydW5GaWx0ZXIiPlRoZSBydW4gZmlsdGVyIHNldHRpbmdzIGZvciB0aGUgdGVzdCBhc3NlbWJseSdzIHJ1bi48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuUnVuTmV4dFN0ZXAiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZsdXNoIHRoZSBjdXJyZW50IGxvZyBtYW5hZ2VyIGFuZCB0aGVuIHBlcmZvcm0gdGhlIG5leHQgaW52b2tlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRydWUgaWYgd29yayByZW1haW5zLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLkNyZWF0ZVRlc3RSdW5GaWx0ZXIoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgdGhlIHRlc3QgcnVuIGZpbHRlciBmb3IgdGhlIGluaXRpYWwgcnVuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2V0dGluZ3MiPlRoZSB1bml0IHRlc3Qgc2V0dGluZ3MuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgbmV3IFRlc3RSdW5GaWx0ZXIgaW5zdGFuY2UuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuUHJlcGFyZVRlc3RBc3NlbWJseVRhc2tzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZXRlcm1pbmUgd2hhdCB0ZXN0IGFzc2VtYmxpZXMgbmVlZCB0byBiZSBleGVjdXRlZC4gRW5xdWV1ZSB0YXNrcyANCisgICAgICAgICAgICBmb3IgdGhlIHVuaXQgdGVzdCBhc3NlbWJseSBwcm92aWRlcnMgdG8gcnVuIHRoZSB0ZXN0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5DYWxjdWxhdGVUb3RhbE1ldGhvZHMoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Bc3NlbWJseU1hbmFnZXIsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSUFzc2VtYmx5LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFJ1bkZpbHRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBtZXRob2RzIGZvciBhIHJ1bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFzc2VtYmx5TWFuYWdlciI+VGhlIGFzc2VtYmx5IG1hbmFnZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXNzZW1ibHkiPlRoZSB0ZXN0IGFzc2VtYmx5LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbHRlciI+VGhlIHRlc3QgcnVuIGZpbHRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgdGhlIG51bWJlciBvZiBrbm93biBtZXRob2RzIHJldHVybmVkLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLkhhcm5lc3NDb21wbGV0ZShTeXN0ZW0uT2JqZWN0LFN5c3RlbS5FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFdmVudCBmaXJlZCBhdCB0aGUgY29tcGxldGlvbiBvZiB0aGUgaGFybmVzcycgd29yay4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+U2VuZGVyIG9iamVjdCBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLkdsb2JhbFVuaGFuZGxlZEV4Y2VwdGlvbkxpc3RlbmVyKFN5c3RlbS5PYmplY3QsU3lzdGVtLkV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIExpc3RlbmVyIGV2ZW50IGZvciBhbnkgdW5oYW5kbGVkIGV4Y2VwdGlvbnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlNlbmRlciBvYmplY3QgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5DcmVhdGVIYXJuZXNzVGFza3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgdGhlIHNldCBvZiBoYXJuZXNzIHRhc2tzIHRvIHJ1biBhbmQgaG9va3MgdXAgdG8gdGhlIENvbXBsZXRlIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLlJlc3VsdHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGxpc3Qgb2YgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5Mb2dXcml0ZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGxvZyBtZXNzYWdlIHdyaXRlciBpbnN0YW5jZS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gZWFzaWx5IA0KKyAgICAgICAgICAgIHBvc3QgaW5mb3JtYXRpdmUgbWVzc2FnZXMgdG8gdGhlIGxvZyBtZXNzYWdlIHF1ZXVlIGFuZCBwcm92aWRlcnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuTG9naWNGYWN0b3J5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIGxvZ2ljIGZhY3RvcnkgdXNlZCBmb3IgaW5zdGFudGlhdGluZyB0aGUgDQorICAgICAgICAgICAgdW5pdCB0ZXN0IGxvZ2ljIGFuZCBtYW5hZ2VtZW50IG9iamVjdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuU3RhdGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgb3ZlcmFsbCBoYXJuZXNzIHN0YXRlIC0gb3ZlcmxvYWRlZCB0eXBlcyBjYW4gYmUgDQorICAgICAgICAgICAgdXNlZCB0byBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLkxvZ1Byb3ZpZGVycyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgbG9nIHByb3ZpZGVycyBsaXN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLlJ1bkRpc3BhdGNoZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgd3JhcHBlciB0aGF0IGhhbmRsZXMgY2FsbGluZyB0aGUgbmV4dCBSdW4gc3RlcCANCisgICAgICAgICAgICBtZXRob2QgdW50aWwgY29tcGxldGU7IGFsbG93cyBmb3IgYSB2aXJ0dWFsIFJ1biBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuUGFyYW1ldGVycyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgZGljdGlvbmFyeSBvZiBQYXJhbWV0ZXJzIHBhc3NlZCBpbnRvIHRoZSB0ZXN0IGhhcm5lc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuU2V0dGluZ3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgc2V0dGluZ3MgdXNlZCB0byBpbml0aWFsaXplIHRoZSB0ZXN0IGhhcm5lc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuRXZlbnRzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgc2V0IG9mIGV2ZW50cyB0aGF0IGNhbiBiZSBmaXJlZCBmb3IgdGVzdCByZXN1bHRzIGFuZCBvdGhlcg0KKyAgICAgICAgICAgIGltcG9ydGFudCB0ZXN0IHJ1bnRpbWUgZXZlbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJFOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLlB1Ymxpc2hpbmciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB0ZXN0IGhhcm5lc3MgaXMgcHVibGlzaGluZyByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLlRlc3RTZXJ2aWNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBUZXN0U2VydmljZSByZWZlcmVuY2VkIGJ5IHRoZSB0ZXN0IGhhcm5lc3Mgc2V0dGluZ3MuIFRoZSANCisgICAgICAgICAgICB0ZXN0IHNlcnZpY2UgcHJvdmlkZXMgYWR2YW5jZWQsIG9wdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyANCisgICAgICAgICAgICB1c2VmdWwgdG8gaGFybmVzcyBhbmQgdGVzdCBjYXNlIGRldmVsb3BlcnMuIEEgdHlwaWNhbCB0ZXN0IHNlcnZpY2UgDQorICAgICAgICAgICAgb3BlcmF0ZXMgb3V0c2lkZSB0aGUgcHJvY2VzcyBvciBzZWN1cml0eSBib3VuZGFyeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5UZXN0SGFybmVzc0NvbXBsZXRlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29tcGxldGUgZXZlbnQgZmlyZWQgd2hlbiB0aGUgdGVzdCBoYXJuZXNzIGhhcyBmaW5pc2hlZCBpdHMgdGVzdCANCisgICAgICAgICAgICBydW4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuRGlzcGF0Y2hlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIGRpc3BhdGNoZXIgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuUm9vdENvbXBvc2l0ZVdvcmtJdGVtIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSByb290IGNvbnRhaW5lciBmb3IgdGVzdCB3b3JrIHRvIGJlIGNvbXBsZXRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5UZXN0TWV0aG9kQ291bnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGtub3duIG51bWJlciBvZiB0ZXN0IG1ldGhvZHMgaW4gdGhlIGN1cnJlbnQgdGVzdCBydW4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuSW50ZXJjZXB0QWxsRXhjZXB0aW9ucyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGludGVyY2VwdCBleGNlcHRpb25zIGF0IA0KKyAgICAgICAgICAgIHRoZSBhcHAgZG9tYWluIGxldmVsIGFuZCBmdW5uZWwgaW50byB0aGUgY3VycmVudCBjb250YWluZXIgb3Igbm90Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLkRpc3BhdGNoZXJTdGFjayI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgaW50ZXJuYWwgRGlzcGF0Y2hlclN0YWNrIGJlaW5nIHVzZWQgYnkgdGhlIHRlc3QgaGFybmVzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5UZXN0QXNzZW1ibHlTdGFydGluZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3QgYXNzZW1ibHkgc3RhcnRpbmcgZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkU6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuSXNEaXNwYXRjaGVyUnVubmluZ0NoYW5nZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE9uIHRoZSBwbGF5IG9yIHBhdXNlIGNoYW5nZSBvZiB0aGUgZGlzcGF0Y2hlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5Jc0Rpc3BhdGNoZXJSdW5uaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGRpc3BhdGNoZXIgaXMgY3VycmVudGx5DQorICAgICAgICAgICAgcnVubmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5UZXN0QXNzZW1ibHlDb21wbGV0ZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3QgYXNzZW1ibHkgY29tcGxldGVkIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJFOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLlRlc3RDbGFzc1N0YXJ0aW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IGNsYXNzIHN0YXJ0aW5nIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJFOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLlRlc3RDbGFzc0NvbXBsZXRlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3QgY2xhc3MgY29tcGxldGVkIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJFOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLlRlc3RNZXRob2RTdGFydGluZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3QgbWV0aG9kIHN0YXJ0aW5nIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJFOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLlRlc3RNZXRob2RDb21wbGV0ZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFuIGV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbmV2ZXIgYSB0ZXN0IG1ldGhvZCBjb21wbGV0ZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkU6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MuVGVzdFJ1blN0YXJ0aW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBbiBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIHRlc3QgcnVuIGlzIHN0YXJ0aW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLlRlc3RQYWdlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIHRlc3QgcGFnZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcy5UZXN0UGFuZWxNYW5hZ2VyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB0ZXN0IHBhbmVsIG1hbmFnZXIgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdExvZ0RlY29yYXRvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV2VsbC1rbm93biBrZXlzIHRoYXQgY2FuIGJlIHVzZWQgdG8gbWFyayBkZWNvcmF0b3IgaW5zdGFuY2VzIGluIGxvZyANCisgICAgICAgICAgICBtZXNzYWdlIG9iamVjdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdExvZ0RlY29yYXRvci5Jc1VuaXRUZXN0TWVzc2FnZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIG1lc3NhZ2UgaXMgc3BlY2lmaWMgdG8gdGhlIHVuaXQgdGVzdCBzeXN0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdExvZ0RlY29yYXRvci5Vbml0VGVzdEhhcm5lc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB1bml0IHRlc3QgaGFybmVzcyByZWZlcmVuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdExvZ0RlY29yYXRvci5UZXN0QXNzZW1ibHlNZXRhZGF0YSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIG1ldGFkYXRhIGludGVyZmFjaW5nIG9iamVjdCBmb3IgYSB0ZXN0IGFzc2VtYmx5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RMb2dEZWNvcmF0b3IuVGVzdENsYXNzTWV0YWRhdGEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBtZXRhZGF0YSBpbnRlcmZhY2luZyBvYmplY3QgZm9yIGEgdGVzdCBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TG9nRGVjb3JhdG9yLlRlc3RNZXRob2RNZXRhZGF0YSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIG1ldGFkYXRhIGludGVyZmFjaW5nIG9iamVjdCBmb3IgYSB0ZXN0IG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TG9nRGVjb3JhdG9yLkluY29ycmVjdEV4Y2VwdGlvbk1lc3NhZ2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBpbmNvcnJlY3QgZXhjZXB0aW9uIHdhcyBpbnRlcmNlcHRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TG9nRGVjb3JhdG9yLklnbm9yZU1lc3NhZ2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBtZXNzYWdlIGluZGljYXRlcyBhIHNraXBwZWQvaWdub3JlZCBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RMb2dEZWNvcmF0b3IuRXhwZWN0ZWRFeGNlcHRpb25UeXBlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RMb2dEZWNvcmF0b3IuQWN0dWFsRXhjZXB0aW9uVHlwZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIGFjdHVhbCBleGNlcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdExvZ0RlY29yYXRvci5BY3R1YWxFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBhY3R1YWwgZXhjZXB0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RMb2dEZWNvcmF0b3IuVGVzdFJ1bkZpbHRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBUZXN0UnVuRmlsdGVyIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TG9nRGVjb3JhdG9yLlNjZW5hcmlvUmVzdWx0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIFNjZW5hcmlvUmVzdWx0IG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TWVzc2FnZUNvbmRpdGlvbmFsIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIZWxwZXIgY29uZGl0aW9uYWwgbWV0aG9kcyBmb3IgdW5pdCB0ZXN0LXNwZWNpZmljIGxvZyBtZXNzYWdlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TWVzc2FnZUNvbmRpdGlvbmFsLklzVW5pdFRlc3RFbmRNZXNzYWdlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERldGVybWluZXMgd2hldGhlciBhIGxvZyBtZXNzYWdlIG1lZXRzIGEgc3BlY2lmaWMgY29uZGl0aW9uIG9yIHNldCANCisgICAgICAgICAgICBvZiBjb25kaXRpb25zLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIGxvZyBtZXNzYWdlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgdHJ1ZSBpZiB0aGUgY29uZGl0aW9uIGlzIG1ldC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TWVzc2FnZUNvbmRpdGlvbmFsLklzVW5pdFRlc3RTdGFydE1lc3NhZ2UoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdExvZ0RlY29yYXRvcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERldGVybWluZXMgd2hldGhlciBhIGxvZyBtZXNzYWdlIG1lZXRzIGEgc3BlY2lmaWMgY29uZGl0aW9uIG9yIHNldCANCisgICAgICAgICAgICBvZiBjb25kaXRpb25zLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVjb3JhdG9yIj5UaGUgdW5pdCB0ZXN0IGRlY29yYXRvciBvZiBpbnRlcmVzdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgdHJ1ZSBpZiB0aGUgY29uZGl0aW9uIGlzIG1ldC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TWVzc2FnZUNvbmRpdGlvbmFsLklzVW5pdFRlc3RNZXNzYWdlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgbWFya2VkIGFzIGEgdW5pdA0KKyAgICAgICAgICAgIHRlc3Qgc3lzdGVtIG1lc3NhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgdHJ1ZSBpZiB0aGUgbWVzc2FnZSBpcyBhIHVuaXQgdGVzdCBzeXN0ZW0tbWFya2VkIA0KKyAgICAgICAgICAgIG1lc3NhZ2UuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdE1lc3NhZ2VDb25kaXRpb25hbC5IYXNVbml0VGVzdE91dGNvbWUoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbG9nIG1lc3NhZ2UgbWVldHMgYSBzcGVjaWZpYyBjb25kaXRpb24gb3Igc2V0IA0KKyAgICAgICAgICAgIG9mIGNvbmRpdGlvbnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbG9nIG1lc3NhZ2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0cnVlIGlmIHRoZSBjb25kaXRpb24gaXMgbWV0LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RNZXNzYWdlQ29uZGl0aW9uYWwuSXNJZ25vcmVNZXNzYWdlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERldGVybWluZXMgd2hldGhlciBhIGxvZyBtZXNzYWdlIG1lZXRzIGEgc3BlY2lmaWMgY29uZGl0aW9uIG9yIHNldCANCisgICAgICAgICAgICBvZiBjb25kaXRpb25zLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIGxvZyBtZXNzYWdlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgdHJ1ZSBpZiB0aGUgY29uZGl0aW9uIGlzIG1ldC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TWVzc2FnZUNvbmRpdGlvbmFsLklzVGVzdFJ1bkZpbHRlck1lc3NhZ2UoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbG9nIG1lc3NhZ2UgaGFzIGFuIGF0dGFjaGVkIFRlc3RSdW5GaWx0ZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbG9nIG1lc3NhZ2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29uZGl0aW9uIGlzIG1ldC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TWVzc2FnZUNvbmRpdGlvbmFsLklzRXhjZXB0aW9uTG9nTWVzc2FnZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgYSBsb2cgbWVzc2FnZSBtZWV0cyBhIHNwZWNpZmljIGNvbmRpdGlvbiBvciBzZXQgDQorICAgICAgICAgICAgb2YgY29uZGl0aW9ucy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBsb2cgbWVzc2FnZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRydWUgaWYgdGhlIGNvbmRpdGlvbiBpcyBtZXQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdE1lc3NhZ2VDb25kaXRpb25hbC5Jc0luY29ycmVjdEV4Y2VwdGlvbkxvZ01lc3NhZ2UoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbG9nIG1lc3NhZ2UgbWVldHMgYSBzcGVjaWZpYyBjb25kaXRpb24gb3Igc2V0IA0KKyAgICAgICAgICAgIG9mIGNvbmRpdGlvbnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbG9nIG1lc3NhZ2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0cnVlIGlmIHRoZSBjb25kaXRpb24gaXMgbWV0LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RNZXNzYWdlQ29uZGl0aW9uYWwuSXNLbm93bkJ1ZyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgYSBsb2cgbWVzc2FnZSBtZWV0cyBhIHNwZWNpZmljIGNvbmRpdGlvbiBvciBzZXQgDQorICAgICAgICAgICAgb2YgY29uZGl0aW9ucy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBsb2cgbWVzc2FnZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRydWUgaWYgdGhlIGNvbmRpdGlvbiBpcyBtZXQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5MYXp5QXNzZW1ibHlNZXRob2RJbmZvIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIGxhenkgbWV0aG9kIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5MYXp5TWV0aG9kSW5mbyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBjbGFzcyB0aGF0IGRvZXMgYSBsYXp5IGxvb2t1cCB3aGVuIG5lZWRlZCB1c2luZyByZWZsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTGF6eU1ldGhvZEluZm8uX2F0dHJpYnV0ZVR5cGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEF0dHJpYnV0ZSBUeXBlIGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTGF6eU1ldGhvZEluZm8uX3NlYXJjaFR5cGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBUeXBlIHRvIHNlYXJjaCB3aXRoLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTGF6eU1ldGhvZEluZm8uX2hhc1NlYXJjaGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXaGV0aGVyIHRoZSBzZWFyY2ggaGFzIGhhcHBlbmVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTGF6eU1ldGhvZEluZm8uX21ldGhvZEluZm8iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBtZXRob2QgcmVmbGVjdGlvbiBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5MYXp5TWV0aG9kSW5mby4jY3RvcihTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIG5ldyBsYXp5IG1ldGhvZCB3cmFwcGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXR0cmlidXRlVHlwZSI+VGhlIGF0dHJpYnV0ZSB0eXBlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxhenlNZXRob2RJbmZvLiNjdG9yKFN5c3RlbS5UeXBlLFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgbmV3IGxhenkgbWV0aG9kIHdyYXBwZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZWFyY2hUeXBlIj5UeXBlIHRvIHNlYXJjaC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGVUeXBlIj5BdHRyaWJ1dGUgdHlwZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5MYXp5TWV0aG9kSW5mby5HZXRNZXRob2RJbmZvIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEb2VzIGEgc2VhcmNoIGFuZCByZXRyaWV2ZXMgdGhlIG1ldGhvZCBpbmZvcm1hdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIG1ldGhvZCByZWZsZWN0aW9uIG9iamVjdC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxhenlNZXRob2RJbmZvLkhhc01ldGhvZEluZm8iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdoZXRoZXIgdGhlIHR5cGUgaGFzIGEgbWV0aG9kIGluZm8uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtZXRob2QgaW5mb3JtYXRpb24gaGFzIA0KKyAgICAgICAgICAgIGJlZW4gZm91bmQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5MYXp5TWV0aG9kSW5mby5TZWFyY2giPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFBlcmZvcm0gYSBzZWFyY2ggb24gdGhlIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5MYXp5TWV0aG9kSW5mby5BdHRyaWJ1dGVUeXBlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB0eXBlIG9mIGF0dHJpYnV0ZSB0aGUgbGF6eSBtZXRob2QgaXMgc2VhcmNoaW5nIGZvci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxhenlNZXRob2RJbmZvLlNlYXJjaFR5cGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHVuZGVybHlpbmcgdHlwZSB0aGF0IGlzIHNlYXJjaGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTGF6eU1ldGhvZEluZm8uSGFzU2VhcmNoZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBhIGxvb2t1cCBoYXMgYWxyZWFkeSBiZWVuIGF0dGVtcHRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxhenlNZXRob2RJbmZvLk1ldGhvZEluZm8iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdW5kZXJseWluZyBNZXRob2RJbmZvIGZyb20gcmVmbGVjdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxhenlBc3NlbWJseU1ldGhvZEluZm8uX2Fzc2VtYmx5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBVbmRlcmx5aW5nIEFzc2VtYmx5IHJlZmxlY3Rpb24gb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTGF6eUFzc2VtYmx5TWV0aG9kSW5mby4jY3RvcihTeXN0ZW0uUmVmbGVjdGlvbi5Bc3NlbWJseSxTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZSBhIG5ldyBsYXp5IG1ldGhvZCBmcm9tIGEgTWV0aG9kSW5mbyBpbnN0YW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFzc2VtYmx5Ij5Bc3NlbWJseSByZWZsZWN0aW9uIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGVUeXBlIj5BdHRyaWJ1dGUgVHlwZSBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5MYXp5QXNzZW1ibHlNZXRob2RJbmZvLlNlYXJjaCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUGVyZm9ybXMgYSBzZWFyY2ggb24gdGhlIE1ldGhvZEluZm8gZm9yIHRoZSBhdHRyaWJ1dGVzIG5lZWRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JQXNzZW1ibHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3QgYXNzZW1ibHkgbWV0YWRhdGEgaW50ZXJmYWNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklBc3NlbWJseS5HZXRUZXN0Q2xhc3NlcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIGNvbGxlY3Rpb24gb2YgdGVzdCBjbGFzcyBtZXRhZGF0YSBvYmplY3RzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBtZXRhZGF0YSBvYmplY3RzLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklBc3NlbWJseS5Bc3NlbWJseUluaXRpYWxpemVNZXRob2QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGluaXRpYWxpemF0aW9uIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JQXNzZW1ibHkuQXNzZW1ibHlDbGVhbnVwTWV0aG9kIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBjbGVhbnVwIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JQXNzZW1ibHkuUHJvdmlkZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSByZWZlcmVuY2UgdG8gdGhlIHVuaXQgdGVzdCBwcm92aWRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JQXNzZW1ibHkuTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBhc3NlbWJseS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JQXNzZW1ibHkuVGVzdEhhcm5lc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHRlc3QgaGFybmVzcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGFzc2VtYmx5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklFeHBlY3RlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQW4gZXhwZWN0ZWQgZXhjZXB0aW9uIG1hcmtlciBmb3IgYSB0ZXN0IG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JRXhwZWN0ZWRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSUV4cGVjdGVkRXhjZXB0aW9uLk1lc3NhZ2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYW55IG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleHBlY3RlZCBleGNlcHRpb24gb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklIb3N0VHlwZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVwcmVzZW50cyB0aGUgaG9zdCB0eXBlIGluZm9ybWF0aW9uIGZvciBhIHRlc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSUhvc3RUeXBlLkhvc3RUeXBlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBIb3N0IHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSUhvc3RUeXBlLkhvc3REYXRhIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBob3N0IGRhdGEuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVByaW9yaXR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHJlcHJlc2VudGF0aW9uIG9mIGEgdGVzdCdzIHByaW9yaXR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1ldGFkYXRhIHJlcHJlc2VudGluZyBhIHRlc3QgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RDbGFzcy5HZXRUZXN0TWV0aG9kcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0cmlldmUgYSBjb2xsZWN0aW9uIG9mIHRoZSB0ZXN0IG1ldGhvZCBtZXRhZGF0YSBvYmplY3RzIHNldHVwIGJ5IA0KKyAgICAgICAgICAgIHRoZSB1bml0IHRlc3QgcHJvdmlkZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkEgY29sbGVjdGlvbiBvZiB0ZXN0IG1ldGhvZCBpbnRlcmZhY2VzLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3MuVHlwZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdGVzdCBjbGFzcyBUeXBlIGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3MuSWdub3JlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0ZXN0IGNsYXNzIHNob3VsZCBiZSBpZ25vcmVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3MuVGVzdEluaXRpYWxpemVNZXRob2QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHBlci10ZXN0IGluaXRpYWxpemF0aW9uIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdENsYXNzLlRlc3RDbGVhbnVwTWV0aG9kIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBwZXItdGVzdCBjbGVhbnVwIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdENsYXNzLkNsYXNzSW5pdGlhbGl6ZU1ldGhvZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgb25lLXRpbWUgY2xhc3MgaW5pdGlhbGl6YXRpb24gbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3MuQ2xhc3NDbGVhbnVwTWV0aG9kIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBvbmUtdGltZSBjbGFzcyBjbGVhbnVwIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdENsYXNzLk5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RDbGFzcy5Bc3NlbWJseSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IHRlc3QgYXNzZW1ibHkgbWV0YWRhdGEgDQorICAgICAgICAgICAgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3QgbWV0aG9kIG1ldGFkYXRhLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0TWV0aG9kLkRlY29yYXRlSW5zdGFuY2UoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVzZWQgZm9yIGRlY29yYXRpbmcgd2l0aCB1bml0IHRlc3QgcHJvdmlkZXItc3BlY2lmaWMgY2FwYWJpbGl0aWVzLCANCisgICAgICAgICAgICBzdWNoIGFzIHRoZSBUZXN0Q29udGV4dCBjb25jZXB0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5zdGFuY2UiPkluc3RhbmNlIHRvIGRlY29yYXRlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZC5HZXREeW5hbWljQXR0cmlidXRlcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IGFueSBhdHRyaWJ1dGUgb24gdGhlIHRlc3QgbWV0aG9kIHRoYXQgYXJlIHByb3ZpZGVkIGR5bmFtaWNhbGx5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBEeW5hbWljYWxseSBwcm92aWRlZCBhdHRyaWJ1dGVzIG9uIHRoZSB0ZXN0IG1ldGhvZC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZC5JbnZva2UoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEludm9rZSB0aGUgdGVzdCBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbnN0YW5jZSI+SW5zdGFuY2Ugb2YgdGhlIHRlc3QgY2xhc3MuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0TWV0aG9kLk1ldGhvZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdGVzdCBtZXRob2QgcmVmbGVjdGlvbiBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkU6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2QuV3JpdGVMaW5lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIb29rcyB1cCB0byBhbnkgdW5pdCB0ZXN0IHByb3ZpZGVyLWVuYWJsZWQgV3JpdGVMaW5lIGNhcGFiaWxpdHkgDQorICAgICAgICAgICAgZm9yIHVuaXQgdGVzdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2QuSWdub3JlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0ZXN0IGlzIG1hcmtlZCB0byBiZSBpZ25vcmVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0TWV0aG9kLkRlc2NyaXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGFueSBkZXNjcmlwdGlvbiBmb3IgdGhlIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZC5OYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgbmFtZSBmb3IgdGhlIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZC5DYXRlZ29yeSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhbnkgY2F0ZWdvcnkgaW5mb3JtYXRpb24gZm9yIHRoZSBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2QuT3duZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYW55IHRlc3Qgb3duZXIgaW5mb3JtYXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2QuRXhwZWN0ZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYW55IGV4cGVjdGVkIGV4Y2VwdGlvbiBhdHRyaWJ1dGUgLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0TWV0aG9kLlRpbWVvdXQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYW55IHRpbWVvdXQgaW5mb3JtYXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2QuUHJvcGVydGllcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIGNvbGxlY3Rpb24gb2YgYW55IHRlc3QgcHJvcGVydGllcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZC5Xb3JrSXRlbXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSBjb2xsZWN0aW9uIG9mIGFueSB0ZXN0IHdvcmsgaXRlbXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2QuUHJpb3JpdHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYW55IHByaW9yaXR5IGluZm9ybWF0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0UHJvcGVydHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgcHJvcGVydHkgZm9yIGEgdGVzdCBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RQcm9wZXJ0eS5OYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB0ZXN0IHByb3BlcnR5IG5hbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RQcm9wZXJ0eS5WYWx1ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdGVzdCBwcm9wZXJ0eSB2YWx1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVW5pdFRlc3RQcm92aWRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvdmlkZXIgbW9kZWwgZm9yIGEgdW5pdCB0ZXN0IHN5c3RlbSB0aGF0IHVzZXMgcmVmbGVjdGlvbiBhbmQgbWV0YWRhdGEgDQorICAgICAgICAgICAgdG8gZW5hYmxlIGEgdW5pdCB0ZXN0IHJ1bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVW5pdFRlc3RQcm92aWRlci5HZXRVbml0VGVzdEFzc2VtYmx5KE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLFN5c3RlbS5SZWZsZWN0aW9uLkFzc2VtYmx5KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0cmlldmUgdGhlIG1ldGFkYXRhIGluc3RhbmNlIGZvciBhIHRlc3QgYXNzZW1ibHkgZ2l2ZW4gYSANCisgICAgICAgICAgICByZWZsZWN0aW9uIEFzc2VtYmx5IGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdEhhcm5lc3MiPlRoZSB0ZXN0IGhhcm5lc3MgdXNpbmcgdGhlIHByb3ZpZGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFzc2VtYmx5UmVmZXJlbmNlIj5SZWZsZWN0ZWQgdGVzdCBhc3NlbWJseS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlVuaXQgdGVzdCBwcm92aWRlci1zcGVjaWZpYyBtZXRhZGF0YSBpbnN0YW5jZSBmb3IgDQorICAgICAgICAgICAgdGhlIHRlc3QgYXNzZW1ibHkuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVVuaXRUZXN0UHJvdmlkZXIuSGFzQ2FwYWJpbGl0eShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5Vbml0VGVzdFByb3ZpZGVyQ2FwYWJpbGl0aWVzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBhIHNwZWNpZmljIGNhcGFiaWxpdHkgb3Igc2V0IG9mIA0KKyAgICAgICAgICAgIGNhcGFiaWxpdGllcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSB1bml0IHRlc3QgcHJvdmlkZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjYXBhYmlsaXR5Ij5DYXBhYmlsaXR5IG9mIGludGVyZXN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+R2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY2FwYWJpbGl0eSBpcyANCisgICAgICAgICAgICBzdXBwb3J0ZWQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVVuaXRUZXN0UHJvdmlkZXIuSXNGYWlsZWRBc3NlcnQoU3lzdGVtLkV4Y2VwdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENoZWNrcyBpZiBhbiBFeGNlcHRpb24gYWN0dWFsbHkgcmVwcmVzZW50cyBhbiBhc3NlcnRpb24gdGhhdCBmYWlsZWQgDQorICAgICAgICAgICAgdG8gaW1wcm92ZSB0aGUgbG9nZ2luZyBleHBlcmllbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhjZXB0aW9uIj5FeGNlcHRpb24gb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0cnVlIGlmIHRoZSBFeGNlcHRpb24gaXMgYW4gYXNzZXJ0aW9uIGV4Y2VwdGlvbiANCisgICAgICAgICAgICB0eXBlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklVbml0VGVzdFByb3ZpZGVyLk5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIG5hbWUgb2YgdGhlIHVuaXQgdGVzdCBwcm92aWRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVW5pdFRlc3RQcm92aWRlci5DYXBhYmlsaXRpZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGNhcGFiaWxpdGllcyB0aGF0IHRoZSB1bml0IHRlc3QgcHJvdmlkZXIgaW1wbGVtZW50cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JV29ya0l0ZW1NZXRhZGF0YSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV29yayBpdGVtIGZvciBhIHRlc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVdvcmtJdGVtTWV0YWRhdGEuRGF0YSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB3b3JrIGl0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuU3RyaW5nRXZlbnRBcmdzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFdmVudCBhcmd1bWVudHMgdGhhdCBwYXNzIGFsb25nIGEgc3RyaW5nIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlN0cmluZ0V2ZW50QXJncy4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlIGEgbmV3IGV2ZW50IGFyZ3VtZW50IGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlN0cmluZ0V2ZW50QXJncy4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlIGEgbmV3IGV2ZW50IGFyZ3VtZW50IGluc3RhbmNlIHRoYXQgc3RvcmVzIGEgc3RyaW5nIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlN0cmluZyB2YWx1ZSB0byBwYXNzIGFsb25nLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5TdHJpbmdFdmVudEFyZ3MuX3ZhbHVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgc3RvcmVkIGluIHRoZSBldmVudCBhcmd1bWVudHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuU3RyaW5nRXZlbnRBcmdzLlZhbHVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBzdG9yZWQgc3RyaW5nIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlVuaXRUZXN0UHJvdmlkZXJDYXBhYmlsaXRpZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgc2V0IG9mIGNhcGFiaWxpdGllcyB0aGF0IGEgdW5pdCB0ZXN0IHByb3ZpZGVyIG1heSBjaG9zZSB0byBpbXBsZW1lbnQgDQorICAgICAgICAgICAgdGhyb3VnaCB0aGUgbWV0YWRhdGEgaW50ZXJmYWNlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5Vbml0VGVzdFByb3ZpZGVyQ2FwYWJpbGl0aWVzLk5vbmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE5vIGRlZmluZWQgY2FwYWJpbGl0aWVzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlVuaXRUZXN0UHJvdmlkZXJDYXBhYmlsaXRpZXMuQXNzZW1ibHlTdXBwb3J0c0luaXRpYWxpemVNZXRob2QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN1cHBvcnQgZm9yIGF0dHJpYnV0ZSBbQXNzZW1ibHlJbml0aWFsaXplXS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5Vbml0VGVzdFByb3ZpZGVyQ2FwYWJpbGl0aWVzLkFzc2VtYmx5U3VwcG9ydHNDbGVhbnVwTWV0aG9kIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdXBwb3J0IGZvciBhdHRyaWJ1dGUgW0Fzc2VtYmx5Q2xlYW51cF0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVW5pdFRlc3RQcm92aWRlckNhcGFiaWxpdGllcy5DbGFzc0Nhbklnbm9yZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3VwcG9ydCBmb3IgYXR0cmlidXRlIFtJZ25vcmVdIGZvciBjbGFzc2VzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlVuaXRUZXN0UHJvdmlkZXJDYXBhYmlsaXRpZXMuTWV0aG9kQ2FuSWdub3JlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdXBwb3J0IGZvciBhdHRyaWJ1dGUgW0lnbm9yZV0gZm9yIG1ldGhvZHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVW5pdFRlc3RQcm92aWRlckNhcGFiaWxpdGllcy5NZXRob2RDYW5EZXNjcmliZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3VwcG9ydCBmb3IgYXR0cmlidXRlIFtEZXNjcmlwdGlvbl0gb24gbWV0aG9kcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5Vbml0VGVzdFByb3ZpZGVyQ2FwYWJpbGl0aWVzLk1ldGhvZENhbkNhdGVnb3JpemUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN1cHBvcnQgZm9yIGF0dHJpYnV0ZSBbQ2F0ZWdvcnldIG9uIG1ldGhvZHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVW5pdFRlc3RQcm92aWRlckNhcGFiaWxpdGllcy5NZXRob2RDYW5IYXZlT3duZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN1cHBvcnQgZm9yIGF0dHJpYnV0ZSBbT3duZXJdIG9uIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5Vbml0VGVzdFByb3ZpZGVyQ2FwYWJpbGl0aWVzLk1ldGhvZENhbkhhdmVQcmlvcml0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3VwcG9ydCBmb3IgYXR0cmlidXRlIFtQcmlvcml0eV0gb24gbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlVuaXRUZXN0UHJvdmlkZXJDYXBhYmlsaXRpZXMuTWV0aG9kQ2FuSGF2ZVByb3BlcnRpZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN1cHBvcnQgZm9yIGF0dHJpYnV0ZSBbVGVzdFByb3BlcnR5XSguLi4pIG9uIG1ldGhvZHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVW5pdFRlc3RQcm92aWRlckNhcGFiaWxpdGllcy5NZXRob2RDYW5IYXZlVGltZW91dCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3VwcG9ydCBmb3IgYXR0cmlidXRlIFtUaW1lb3V0XSBvbiBtZXRob2RzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlVuaXRUZXN0UHJvdmlkZXJDYXBhYmlsaXRpZXMuTWV0aG9kQ2FuSGF2ZVdvcmtJdGVtcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3VwcG9ydCBmb3IgYXR0cmlidXRlIFtXb3JrSXRlbSguLi4pXSgncykgb24gbWV0aG9kcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlNsZWVwV29ya0l0ZW0iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd29yayBpdGVtIHR5cGUgdGhhdCBkb2VzIG5vdCBjb21wbGV0ZSB1bnRpbCB0aGUgc2xlZXAgdGltZSBoYXMgDQorICAgICAgICAgICAgZWxhcHNlZC4gIFRoaXMgaXMgTk9UIGEgYmxvY2tpbmcgU2xlZXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5TbGVlcFdvcmtJdGVtLl9kZWxheSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIGFtb3VudCBvZiB0aW1lIHRvIGRlbGF5IGZvci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlNsZWVwV29ya0l0ZW0uX2V4cGlyZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBEYXRlVGltZSB0aGF0IG1hcmtzIHRoZSBwb2ludCBpbiB0aW1lIHRoZSB0YXNrIGlzIGNvbXBsZXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuU2xlZXBXb3JrSXRlbS4jY3RvcihTeXN0ZW0uVGltZVNwYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGUgYSBuZXcgU2xlZXAgd29yayBpdGVtLCBpbmNsdWRpbmcgdGhlIG51bWJlciBvZiANCisgICAgICAgICAgICBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCBjb250aW51aW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVsYXkiPkFtb3VudCBvZiB0aW1lIHRvIHdhaXQvZGVsYXkuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuU2xlZXBXb3JrSXRlbS5JbnZva2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE9uIHRoZSBmaXJzdCB0aW1lLCB3aWxsIGNhbGN1bGF0ZSB0aGUgZmluYWwgRGF0ZVRpbWUuICBPdGhlcndpc2UsIA0KKyAgICAgICAgICAgIG51bGwgb3BlcmF0aW9uIChyZXR1cm5zKSB1bnRpbCB0aGF0IHRpbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlcmUgaXMgbW9yZSB3b3JrIHRvIGJlDQorICAgICAgICAgICAgZG9uZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uRXhwZWN0ZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEV4cGVjdGVkIGV4Y2VwdGlvbiBtZXRhZGF0YS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uRXhwZWN0ZWRFeGNlcHRpb24uI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByaXZhdGUgY29uc3RydWN0b3IuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLkV4cGVjdGVkRXhjZXB0aW9uLiNjdG9yKE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkV4cGVjdGVkRXhjZXB0aW9uQXR0cmlidXRlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyBhIG5ldyBleHBlY3RlZCBleGNlcHRpb24gbWV0YWRhdGEgd3JhcHBlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkRXhjZXB0aW9uQXR0cmlidXRlIj5BdHRyaWJ1dGUgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5FeHBlY3RlZEV4Y2VwdGlvbi5fZXhwIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgZXhwZWN0ZWQgZXhjZXB0aW9uIGF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uRXhwZWN0ZWRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdHlwZSBvZiB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5FeHBlY3RlZEV4Y2VwdGlvbi5NZXNzYWdlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGFueSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gYSBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Qcmlvcml0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBzaW1wbGUgd3JhcHBlciBmb3IgYSBwcmlvcml0eSBpbnRlZ2VyIHZhbHVlIHRoYXQgb3ZlcnJpZGVzIHRoZSANCisgICAgICAgICAgICBUb1N0cmluZyBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlByaW9yaXR5LiNjdG9yKFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBQcmlvcml0eSBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InByaW9yaXR5Ij5UaGUgcHJpb3JpdHkuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Qcmlvcml0eS5Ub1N0cmluZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgcHJpb3JpdHkgYXMgc3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRoZSBwcmlvcml0eS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uUHJpb3JpdHkuVmFsdWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHByaW9yaXR5IHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Qcm92aWRlckF0dHJpYnV0ZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBzZXQgb2YgcHJvdmlkZXIgYXR0cmlidXRlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uUHJvdmlkZXJBdHRyaWJ1dGVzLiNjY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIFZTVFQgbWV0YWRhdGEgcHJvdmlkZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlByb3ZpZGVyQXR0cmlidXRlcy5UZXN0Q2xhc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgVlNUVCBbVGVzdENsYXNzXSBhdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlByb3ZpZGVyQXR0cmlidXRlcy5JZ25vcmVBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgVlNUVCBbSWdub3JlXSBhdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlByb3ZpZGVyQXR0cmlidXRlcy5DbGFzc0luaXRpYWxpemUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgVlNUVCBbQ2xhc3NJbml0aWFsaXplXSBhdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlByb3ZpZGVyQXR0cmlidXRlcy5Qcmlvcml0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBWU1RUIFtQcmlvcml0eV0gYXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Qcm92aWRlckF0dHJpYnV0ZXMuQ2xhc3NDbGVhbnVwIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIFZTVFQgW0NsYXNzQ2xlYW51cF0gYXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Qcm92aWRlckF0dHJpYnV0ZXMuVGVzdEluaXRpYWxpemUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgVlNUVCBbVGVzdEluaXRpYWxpemVdIGF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uUHJvdmlkZXJBdHRyaWJ1dGVzLlRlc3RDbGVhbnVwIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIFZTVFQgW1Rlc3RDbGVhbnVwXSBhdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlByb3ZpZGVyQXR0cmlidXRlcy5EZXNjcmlwdGlvbkF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBWU1RUIFtEZXNjcmlwdGlvbl0gYXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Qcm92aWRlckF0dHJpYnV0ZXMuVGltZW91dEF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBWU1RUIFtUaW1lb3V0XSBhdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlByb3ZpZGVyQXR0cmlidXRlcy5Pd25lckF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBWU1RUIFtPd25lcl0gYXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Qcm92aWRlckF0dHJpYnV0ZXMuRXhwZWN0ZWRFeGNlcHRpb25BdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgVlNUVCBbRXhwZWN0ZWRFeGNlcHRpb25dIGF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uUHJvdmlkZXJBdHRyaWJ1dGVzLkFzc2VtYmx5SW5pdGlhbGl6ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBWU1RUIFtBc3NlbWJseUluaXRpYWxpemVdIGF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uUHJvdmlkZXJBdHRyaWJ1dGVzLkFzc2VtYmx5Q2xlYW51cCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBWU1RUIFtBc3NlbWJseUNsZWFudXBdIGF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uUHJvdmlkZXJBdHRyaWJ1dGVzLlRlc3RNZXRob2QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgVlNUVCBbVGVzdE1ldGhvZF0gYXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Qcm92aWRlckF0dHJpYnV0ZXMuVGVzdFByb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIFZTVFQgW1Rlc3RQcm9wZXJ0eV0gYXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5UZXN0Q2xhc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3QgY2xhc3Mgd3JhcHBlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdENsYXNzLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklBc3NlbWJseSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIG5ldyB0ZXN0IGNsYXNzIG1ldGFkYXRhIGludGVyZmFjZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFzc2VtYmx5Ij5Bc3NlbWJseSBtZXRhZGF0YSBpbnRlcmZhY2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdENsYXNzLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklBc3NlbWJseSxTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgdGVzdCBjbGFzcyB3cmFwcGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXNzZW1ibHkiPkFzc2VtYmx5IG1ldGFkYXRhIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0Q2xhc3NUeXBlIj5UeXBlIG9mIHRoZSBjbGFzcy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RDbGFzcy5fdHlwZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCBUeXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5UZXN0Q2xhc3MuX3Rlc3RzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb2xsZWN0aW9uIG9mIHRlc3QgbWV0aG9kIGludGVyZmFjZSBvYmplY3RzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5UZXN0Q2xhc3MuX3Rlc3RzTG9hZGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0ZXN0cyBhcmUgbG9hZGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5UZXN0Q2xhc3MuX20iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgZGljdGlvbmFyeSBvZiBtZXRob2QgdHlwZXMgYW5kIG1ldGhvZCBpbnRlcmZhY2Ugb2JqZWN0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdENsYXNzLkdldFRlc3RNZXRob2RzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgY29sbGVjdGlvbiBvZiB0ZXN0IG1ldGhvZCAgd3JhcHBlciBpbnN0YW5jZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkEgY29sbGVjdGlvbiBvZiB0ZXN0IG1ldGhvZCBpbnRlcmZhY2Ugb2JqZWN0cy48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdENsYXNzLlRvU3RyaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeHBvc2VzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNsYXNzLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5UZXN0Q2xhc3MuQXNzZW1ibHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHRlc3QgYXNzZW1ibHkgbWV0YWRhdGEuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RDbGFzcy5UeXBlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB1bmRlcmx5aW5nIFR5cGUgb2YgdGhlIHRlc3QgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RDbGFzcy5OYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5UZXN0Q2xhc3MuSWdub3JlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIGFuIElnbm9yZSBhdHRyaWJ1dGUgcHJlc2VudCANCisgICAgICAgICAgICBvbiB0aGUgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RDbGFzcy5UZXN0SW5pdGlhbGl6ZU1ldGhvZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhbnkgdGVzdCBpbml0aWFsaXplIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdENsYXNzLlRlc3RDbGVhbnVwTWV0aG9kIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGFueSB0ZXN0IGNsZWFudXAgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5UZXN0Q2xhc3MuQ2xhc3NJbml0aWFsaXplTWV0aG9kIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGFueSBjbGFzcyBpbml0aWFsaXplIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdENsYXNzLkNsYXNzQ2xlYW51cE1ldGhvZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhbnkgY2xhc3MgY2xlYW51cCBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RDbGFzcy5NZXRob2RzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNZXRob2RzIGVudW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RDbGFzcy5NZXRob2RzLkNsYXNzSW5pdGlhbGl6ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZSBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RDbGFzcy5NZXRob2RzLkNsYXNzQ2xlYW51cCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2xlYW51cCBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RDbGFzcy5NZXRob2RzLlRlc3RJbml0aWFsaXplIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IGluaXQgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5UZXN0Q2xhc3MuTWV0aG9kcy5UZXN0Q2xlYW51cCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCBjbGVhbnVwIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdE1ldGhvZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBwcm92aWRlciB3cmFwcGVyIGZvciBhIHRlc3QgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5UZXN0TWV0aG9kLkNvbnRleHRQcm9wZXJ0eU5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb3BlcnR5IG5hbWUgZm9yIHRoZSBUZXN0Q29udGV4dC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdE1ldGhvZC5EZWZhdWx0UHJpb3JpdHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgZm9yIG1ldGhvZHMgd2hlbiBubyBwcmlvcml0eSBhdHRyaWJ1dGUgaXMgZGVmaW5lZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdE1ldGhvZC5Ob25lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBbiBlbXB0eSBvYmplY3QgYXJyYXkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RNZXRob2QuX21ldGhvZEluZm8iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1ldGhvZCByZWZsZWN0aW9uIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdE1ldGhvZC4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJpdmF0ZSBjb25zdHJ1Y3RvciwgdGhlIGNvbnN0cnVjdG9yIHJlcXVpcmVzIHRoZSBtZXRob2QgcmVmbGVjdGlvbiBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RNZXRob2QuI2N0b3IoU3lzdGVtLlJlZmxlY3Rpb24uTWV0aG9kSW5mbykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgdGVzdCBtZXRob2Qgd3JhcHBlciBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXRob2RJbmZvIj5UaGUgcmVmbGVjdGVkIG1ldGhvZC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RNZXRob2QuT25Xcml0ZUxpbmUoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhbGwgdGhlIFdyaXRlTGluZSBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzIj5TdHJpbmcgdG8gV3JpdGVMaW5lLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdE1ldGhvZC5EZWNvcmF0ZUluc3RhbmNlKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZWNvcmF0ZXMgYSB0ZXN0IGNsYXNzIGluc3RhbmNlIHdpdGggdGhlIHVuaXQgdGVzdCBmcmFtZXdvcmsncyANCisgICAgICAgICAgICBzcGVjaWZpYyB0ZXN0IGNvbnRleHQgY2FwYWJpbGl0eSwgaWYgc3VwcG9ydGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5zdGFuY2UiPkluc3RhbmNlIHRvIGRlY29yYXRlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdE1ldGhvZC5HZXREeW5hbWljQXR0cmlidXRlcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IGFueSBhdHRyaWJ1dGUgb24gdGhlIHRlc3QgbWV0aG9kIHRoYXQgYXJlIHByb3ZpZGVkIGR5bmFtaWNhbGx5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBEeW5hbWljYWxseSBwcm92aWRlZCBhdHRyaWJ1dGVzIG9uIHRoZSB0ZXN0IG1ldGhvZC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdE1ldGhvZC5JbnZva2UoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEludm9rZSB0aGUgdGVzdCBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbnN0YW5jZSI+SW5zdGFuY2Ugb2YgdGhlIHRlc3QgY2xhc3MuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5UZXN0TWV0aG9kLlRvU3RyaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeHBvc2VzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IG1ldGhvZCBhcyBhIHN0cmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBtZXRob2QuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkU6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RNZXRob2QuV3JpdGVMaW5lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBbGxvd3MgdGhlIHRlc3QgdG8gcGVyZm9ybSBhIHN0cmluZyBXcml0ZUxpbmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RNZXRob2QuTWV0aG9kIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB1bmRlcmx5aW5nIHJlZmxlY3RlZCBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RNZXRob2QuSWdub3JlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZXJlIGlzIGFuIElnbm9yZSBhdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RNZXRob2QuRGVzY3JpcHRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYW55IGRlc2NyaXB0aW9uIG1hcmtlZCBvbiB0aGUgdGVzdCBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RNZXRob2QuTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5UZXN0TWV0aG9kLkNhdGVnb3J5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBDYXRlZ29yeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdE1ldGhvZC5Pd25lciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgb3duZXIgbmFtZSBvZiB0aGUgdGVzdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdE1ldGhvZC5FeHBlY3RlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhbnkgZXhwZWN0ZWQgZXhjZXB0aW9uIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHRlc3QgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5UZXN0TWV0aG9kLlRpbWVvdXQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYW55IHRpbWVvdXQuICBBIE51bGxhYmxlIHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5UZXN0TWV0aG9kLlByb3BlcnRpZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSBDb2xsZWN0aW9uIG9mIHRlc3QgcHJvcGVydGllcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdE1ldGhvZC5Xb3JrSXRlbXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSBjb2xsZWN0aW9uIG9mIHRlc3Qgd29yayBpdGVtcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdE1ldGhvZC5Qcmlvcml0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBQcmlvcml0eSBpbmZvcm1hdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdFByb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXByZXNlbnRzIGEgc2ltcGxlIHRlc3QgcHJvcGVydHkgd2l0aCBhIGtleS92YWx1ZSBzdHJpbmcgcGFpci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdFByb3BlcnR5LiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgVGVzdFByb3BlcnR5IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5UZXN0UHJvcGVydHkuI2N0b3IoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFRlc3RQcm9wZXJ0eSBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5hbWUiPlRoZSBpbml0aWFsIHByb3BlcnR5IG5hbWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBpbml0aWFsIHByb3BlcnR5IHZhbHVlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdFByb3BlcnR5Lk5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgcHJvcGVydHkgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVGVzdFByb3BlcnR5LlZhbHVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIHByb3BlcnR5IHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Vbml0VGVzdENvbnRleHQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgd3JhcHBlciBmb3IgdGhlIHVuaXQgdGVzdCBjb250ZXh0IGNhcGFiaWxpdHkgb2YgVmlzdWFsIFN0dWRpbyBUZWFtIA0KKyAgICAgICAgICAgIFRlc3QncyB1bml0IHRlc3QgZnJhbWV3b3JrLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Vbml0VGVzdENvbnRleHQuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlRlc3RNZXRob2QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGUgYSBuZXcgdW5pdCB0ZXN0IGNvbnRleHQgd3JhcHBlciBmb3IgdGhlIHRlc3QgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdE1ldGhvZCI+VGVzdCBtZXRob2QuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Vbml0VGVzdENvbnRleHQuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdG9yIG9mIGEgbmV3IHVuaXQgdGVzdCBjb250ZXh0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Vbml0VGVzdENvbnRleHQuX3RtIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVW5pdFRlc3RDb250ZXh0LldyaXRlTGluZShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVzZWQgdG8gd3JpdGUgdHJhY2UgbWVzc2FnZXMgd2hpbGUgdGhlIHRlc3QgaXMgcnVubmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZvcm1hdCI+Rm9ybWF0IHN0cmluZy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5UaGUgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVW5pdFRlc3RDb250ZXh0Lk5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhyb3cgYSBub3Qgc3VwcG9ydGVkIGV4Y2VwdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZ1bmN0aW9uYWxpdHkiPkZ1bmN0aW9uYWxpdHkgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIChzdHJpbmcpLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+QSBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Vbml0VGVzdENvbnRleHQuQWRkUmVzdWx0RmlsZShTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQWRkcyBhIGZpbGUgbmFtZSB0byB0aGUgbGlzdCBpbiBUZXN0UmVzdWx0LlJlc3VsdEZpbGVOYW1lcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGVOYW1lIj5GaWxlbmFtZSB0byBhZGQgYXMgYSByZXN1bHQuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Vbml0VGVzdENvbnRleHQuQmVnaW5UaW1lcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmVnaW5zIGEgdGltZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0aW1lck5hbWUiPlRoZSBuYW1lIG9mIHRoZSB0aW1lciB0byBjcmVhdGUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Vbml0VGVzdENvbnRleHQuRW5kVGltZXIoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEVuZHMgYSB0aW1lciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRpbWVyTmFtZSI+TmFtZSBvZiB0aGUgdGltZXIuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Vbml0VGVzdENvbnRleHQuX3Byb3BlcnR5Q2FjaGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhY2hlIG9mIHByb3BlcnRpZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlVuaXRUZXN0Q29udGV4dC5Qcm9wZXJ0aWVzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRlc3QgcHJvcGVydGllcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVW5pdFRlc3RDb250ZXh0LkRhdGFSb3ciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgY3VycmVudCBkYXRhIHJvdyB3aGVuIHRlc3QgaXMgdXNlZCBmb3IgZGF0YSBkcml2ZW4gdGVzdGluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVW5pdFRlc3RDb250ZXh0LkRhdGFDb25uZWN0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGN1cnJlbnQgZGF0YSBjb25uZWN0aW9uIHJvdyB3aGVuIHRlc3QgaXMgdXNlZCBmb3IgZGF0YSBkcml2ZW4gdGVzdGluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVW5pdFRlc3RDb250ZXh0LlRlc3ROYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVW5pdFRlc3RDb250ZXh0LkN1cnJlbnRUZXN0T3V0Y29tZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgY3VycmVudCBlbnVtIG91dGNvbWUgLSBwYXNzZWQsIGZhaWxlZCwgb3IgaW5jb25jbHVzaXZlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Vbml0VGVzdEZyYW1ld29ya0Fzc2VtYmx5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlbWJseSBtZXRhZGF0YSBmb3IgdGhlIFZpc3VhbCBTdHVkaW8gVGVhbSBUZXN0IHVuaXQgdGVzdCBmcmFtZXdvcmsuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlVuaXRUZXN0RnJhbWV3b3JrQXNzZW1ibHkuX2Fzc2VtYmx5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlbWJseSByZWZsZWN0aW9uIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVW5pdFRlc3RGcmFtZXdvcmtBc3NlbWJseS5faW5pdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZW1ibHkgaW5pdGlhbGl6YXRpb24gbWV0aG9kIGluZm9ybWF0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Vbml0VGVzdEZyYW1ld29ya0Fzc2VtYmx5Ll9jbGVhbnVwIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlbWJseSBjbGVhbnVwIG1ldGhvZCBpbmZvcm1hdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVW5pdFRlc3RGcmFtZXdvcmtBc3NlbWJseS5fcHJvdmlkZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVuaXQgdGVzdCBwcm92aWRlciB1c2VkIGZvciB0aGUgYXNzZW1ibHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlVuaXRUZXN0RnJhbWV3b3JrQXNzZW1ibHkuX2hhcm5lc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB1bml0IHRlc3QgaGFybmVzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVW5pdFRlc3RGcmFtZXdvcmtBc3NlbWJseS4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVW5pdFRlc3RQcm92aWRlcixNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcyxTeXN0ZW0uUmVmbGVjdGlvbi5Bc3NlbWJseSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgdW5pdCB0ZXN0IGFzc2VtYmx5IHdyYXBwZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwcm92aWRlciI+VW5pdCB0ZXN0IG1ldGFkYXRhIHByb3ZpZGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InVuaXRUZXN0SGFybmVzcyI+QSByZWZlcmVuY2UgdG8gdGhlIHVuaXQgdGVzdCBoYXJuZXNzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFzc2VtYmx5Ij5Bc3NlbWJseSByZWZsZWN0aW9uIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlVuaXRUZXN0RnJhbWV3b3JrQXNzZW1ibHkuR2V0VGVzdENsYXNzZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlZmxlY3QgYW5kIHJldHJpZXZlIHRoZSB0ZXN0IGNsYXNzIG1ldGFkYXRhIHdyYXBwZXJzIGZvciANCisgICAgICAgICAgICB0aGUgdGVzdCBhc3NlbWJseS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGVzdCBjbGFzcyBtZXRhZGF0YSANCisgICAgICAgICAgICBpbnRlcmZhY2Ugb2JqZWN0cy48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVW5pdFRlc3RGcmFtZXdvcmtBc3NlbWJseS5OYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGFzc2VtYmx5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Vbml0VGVzdEZyYW1ld29ya0Fzc2VtYmx5LlByb3ZpZGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB1bml0IHRlc3QgcHJvdmlkZXIgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlVuaXRUZXN0RnJhbWV3b3JrQXNzZW1ibHkuQXNzZW1ibHlJbml0aWFsaXplTWV0aG9kIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGFueSBhc3NlbWJseSBpbml0aWFsaXplIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVW5pdFRlc3RGcmFtZXdvcmtBc3NlbWJseS5Bc3NlbWJseUNsZWFudXBNZXRob2QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYW55IGFzc2VtYmx5IGNsZWFudXAgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Vbml0VGVzdEZyYW1ld29ya0Fzc2VtYmx5LlRlc3RIYXJuZXNzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB0ZXN0IGhhcm5lc3MgdXNlZCB0byBpbml0aWFsaXplIHRoZSBhc3NlbWJseS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVW5pdFRlc3RGcmFtZXdvcmtBc3NlbWJseS5Vbml0VGVzdEhhcm5lc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHRlc3QgaGFybmVzcyBhcyBhIHVuaXQgdGVzdCBoYXJuZXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Wc3R0UHJvdmlkZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb3ZpZGVyIGZvciB0aGUgVmlzdWFsIFN0dWRpbyBUZWFtIFRlc3QgdW5pdCB0ZXN0IChVVCkgZnJhbWV3b3JrIA0KKyAgICAgICAgICAgIG1ldGFkYXRhLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Wc3R0UHJvdmlkZXIuUHJvdmlkZXJOYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBOYW1lIG9mIHRoaXMgcHJvdmlkZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlZzdHRQcm92aWRlci5NeUNhcGFiaWxpdGllcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgVlNUVCBVVEYgcHJvdmlkZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlZzdHRQcm92aWRlci5IYXNDYXBhYmlsaXR5KE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlVuaXRUZXN0UHJvdmlkZXJDYXBhYmlsaXRpZXMpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXaGV0aGVyIHRoZSBjYXBhYmlsaXR5IGlzIHN1cHBvcnRlZCBieSB0aGlzIHByb3ZpZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2FwYWJpbGl0eSI+Q2FwYWJpbGl0eSB0eXBlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+QSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNhcGFiaWxpdHkgaXMgYXZhaWxhYmxlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Wc3R0UHJvdmlkZXIuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZSBhIG5ldyBWaXN1YWwgU3R1ZGlvIFRlYW0gVGVzdCB1bml0IHRlc3QgZnJhbWV3b3JrIHByb3ZpZGVyIA0KKyAgICAgICAgICAgIGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Wc3R0UHJvdmlkZXIuX2Fzc2VtYmx5Q2FjaGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhY2hlIG9mIGFzc2VtYmxpZXMgYW5kIGFzc2VtYmx5IHVuaXQgdGVzdCBpbnRlcmZhY2Ugb2JqZWN0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5WaXN1YWxTdHVkaW8uVnN0dFByb3ZpZGVyLkdldFVuaXRUZXN0QXNzZW1ibHkoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MsU3lzdGVtLlJlZmxlY3Rpb24uQXNzZW1ibHkpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWU1RUIHVuaXQgdGVzdCBwcm92aWRlciBjb25zdHJ1Y3RvcjsgdGFrZXMgYW4gYXNzZW1ibHkgcmVmZXJlbmNlIHRvIA0KKyAgICAgICAgICAgIHBlcmZvcm0gcmVmbGVjdGlvbiBvbiB0byByZXRyaWV2ZSBhbGwgdGVzdCBjbGFzcyB0eXBlcy4gSW4gdGhpcyANCisgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiBhbiBlbmdpbmUgZm9yIHRoZSBWU1RUIG1ldGFkYXRhLCBvbmx5IGEgc2luZ2xlIA0KKyAgICAgICAgICAgIHRlc3QgQXNzZW1ibHkgY2FuIGJlIHV0aWxpemVkIGF0IGEgdGltZSBmb3Igc2ltcGxpY2l0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RIYXJuZXNzIj5UaGUgdW5pdCB0ZXN0IGhhcm5lc3MuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXNzZW1ibHlSZWZlcmVuY2UiPkFzc2VtYmx5IHJlZmxlY3Rpb24gb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgYXNzZW1ibHkgbWV0YWRhdGEgaW50ZXJmYWNlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Wc3R0UHJvdmlkZXIuSXNGYWlsZWRBc3NlcnQoU3lzdGVtLkV4Y2VwdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENoZWNrIGlmIHRoZSBFeGNlcHRpb24gaXMgYWN0dWFsbHkgYSBmYWlsZWQgYXNzZXJ0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhjZXB0aW9uIj5FeGNlcHRpb24gb2JqZWN0IHRvIGNoZWNrLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBpZiB0aGUgZXhjZXB0aW9uIGlzIGFjdHVhbGx5IGFuIGFzc2VydCBmYWlsdXJlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlZpc3VhbFN0dWRpby5Wc3R0UHJvdmlkZXIuTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvdmlkZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVmlzdWFsU3R1ZGlvLlZzdHRQcm92aWRlci5DYXBhYmlsaXRpZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHNwZWNpYWxpemVkIGNhcGFiaWxpdHkgZGVzY3JpcHRvci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFNldHRpbmdzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZXR0aW5ncyBmb3IgdGhlIHVuaXQgdGVzdCBzeXN0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncy5UYWdFeHByZXNzaW9uS2V5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdGFnIGV4cHJlc3Npb24ga2V5IG5hbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncy5EZWZhdWx0U29ydFRlc3RNZXRob2RzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCeSBkZWZhdWx0IHRlc3QgbWV0aG9kcyBhcmUgc29ydGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0U2V0dGluZ3MuRGVmYXVsdFNvcnRUZXN0Q2xhc3NlcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQnkgZGVmYXVsdCB0ZXN0IGNsYXNzZXMgYXJlIHNvcnRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFNldHRpbmdzLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZXR0aW5ncyBmb3IgdGhlIHVuaXQgdGVzdCBzeXN0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncy5QYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHJlc3BvbnNlIGZpbGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT5UaGUgcGFyYW1ldGVycy48L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncy5Db21wb25lbnRzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBjb21wb25lbnRzIGluaXRpYWxpemVkIGJ5IHRoZSBlbnRyeS1wb2ludCBhc3NlbWJseS4gVGhlc2UNCisgICAgICAgICAgICBhcmUgdGhlIGR5bmFtaWNhbGx5IGxvYWRlZCBvYmplY3RzIHRoYXQgbWF5IGJlIG5lZWRlZCBieSB0aGUNCisgICAgICAgICAgICBUZXN0SGFybmVzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPlRoZSBjb21wb25lbnRzLjwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFNldHRpbmdzLkxvZ1Byb3ZpZGVycyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgbG9nIHByb3ZpZGVycy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFNldHRpbmdzLlNhbXBsZVRhZ3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHNldCBvZiBzYW1wbGUgdGFncyBmb3IgdXNlIGluIGEgdGFnIGVkaXRvciBzY3JlZW4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncy5UZXN0QXNzZW1ibGllcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgbGlzdCBvZiB0ZXN0IGFzc2VtYmxpZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT5UaGUgdGVzdCBhc3NlbWJseS48L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncy5UZXN0U2VydmljZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSB0ZXN0IHNlcnZpY2UgcHJvdmlkZXIuICBUaGUgdGVzdCBzZXJ2aWNlIGxpZ2h0cyB1cCANCisgICAgICAgICAgICBhZHZhbmNlZCBvdXQtb2YtcHJvY2VzcyBjb21tdW5pY2F0aW9uLCByZXBvcnRpbmcsIGxvZ2dpbmcsIGFuZCANCisgICAgICAgICAgICBvdGhlciB2YWx1YWJsZSBzZXJ2aWNlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFNldHRpbmdzLlRlc3RIYXJuZXNzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIHRlc3QgaGFybmVzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPlRoZSB0ZXN0IGhhcm5lc3MuPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0U2V0dGluZ3MuVGVzdFNlcnZpY2VIb3N0bmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSB0ZXN0IHNlcnZpY2UgaG9zdG5hbWUgdG8gdHJ5IHVzaW5nLiBEZWZhdWx0cyB0bw0KKyAgICAgICAgICAgIGxvY2FsaG9zdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFNldHRpbmdzLlRlc3RTZXJ2aWNlUG9ydCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSB0ZXN0IHNlcnZpY2UgcG9ydCB0byB0cnkgdXNpbmcuIERlZmF1bHRzIHRvIDgwMDAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncy5UZXN0U2VydmljZVBhdGgiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdGVzdCBzZXJ2aWNlIHBhdGggdG8gdHJ5IHVzaW5nLiBEZWZhdWx0cyB0bw0KKyAgICAgICAgICAgIC9leHRlcm5hbEludGVyZmFjZS8uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncy5TdGFydFJ1bkltbWVkaWF0ZWx5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gc3RhcnQgdGhlIHJ1bg0KKyAgICAgICAgICAgIGltbWVkaWF0ZWx5IHdoZW4gdGhlIHRlc3Qgc3lzdGVtIGlzIHJ1bi4gRGVmYXVsdHMgdG8gZmFsc2UgdG8gZW5hYmxlDQorICAgICAgICAgICAgdGhlIHRlc3Qgc2VydmljZSB0byBsb2FkIGFuZCBpbmZvcm1hdGlvbiB0byBiZSBwcm92aWRlZCBpbiB0aGUNCisgICAgICAgICAgICB1c2VyIGludGVyZmFjZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFNldHRpbmdzLlRlc3RQYW5lbFR5cGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdHlwZSBvZiB0aGUgVGVzdFBhbmVsIHRvIGNyZWF0ZS4gVGhlIHR5cGUgbXVzdA0KKyAgICAgICAgICAgIGRlcml2ZSBmcm9tIE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLklUZXN0UGFuZWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RTZXR0aW5ncy5Tb3J0VGVzdE1ldGhvZHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0ZXN0IG1ldGhvZHMgYXJlIHNvcnRlZCANCisgICAgICAgICAgICBhbHBoYWJldGljYWxseS4gQnkgZGVmYXVsdCB0aGlzIHZhbHVlIGlzIHRydWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIEl0IGlzIHdvcnRoIHVuZGVyc3RhbmRpbmcgdGhhdCB0aGUgb3JkZXIgb2YgdW5pdCB0ZXN0IA0KKyAgICAgICAgICAgIGV4ZWN1dGlvbiBzaG91bGQgbm90IGFmZmVjdCB0aGUgcmVzdWx0cyBvZiBhIHRlc3QgcnVuLiAgQW55IGV4cGVjdGVkDQorICAgICAgICAgICAgb3JkZXJpbmcgYW5kIHZlcmlmaWNhdGlvbiBmcm9tIG11bHRpcGxlIHRlc3QgbWV0aG9kcyBzaG91bGQgYmUgDQorICAgICAgICAgICAgcmVmYWN0b3JlZCBpbnRvIGEgc2luZ2xlIHVuaXQgdGVzdC4NCisgICAgICAgICAgICA8L3JlbWFya3M+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFNldHRpbmdzLlNvcnRUZXN0Q2xhc3NlcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRlc3QgY2xhc3NlcyBhcmUgc29ydGVkIA0KKyAgICAgICAgICAgIGFscGhhYmV0aWNhbGx5LiBUaGlzIHNldHRpbmcgaXMgVHJ1ZSBieSBkZWZhdWx0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0U2V0dGluZ3MuU2hvd1RhZ0V4cHJlc3Npb25FZGl0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0byBzaG93IHRoZSB0YWcgZXhwcmVzc2lvbg0KKyAgICAgICAgICAgIGVkaXRvciB1c2VyIGludGVyZmFjZSBiZWZvcmUgc3RhcnRpbmcgdGhlIHRlc3QgcnVuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0U2V0dGluZ3MuVGFnRXhwcmVzc2lvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSB0YWcgZXhwcmVzc2lvbiB1c2VkIGZvciBzZWxlY3RpbmcgdGVzdHMgdG8gcnVuLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdFNldHRpbmdzLlRlc3RDbGFzc2VzVG9SdW4iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSBsaXN0IG9mIHRlc3QgY2xhc3NlcyB0byBydW4uIEVuYWJsZXMgZmlsdGVyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmVtYXJrcz5UaGlzIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIG9ic29sZXRlLjwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFBhbmVsTWFuYWdlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBtYW5hZ2VyIGZvciB0aGUgdW5kZXJseWluZyBUZXN0U3VyZmFjZSBQYW5lbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RQYW5lbE1hbmFnZXIuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByaXZhdGUgY29uc3RydWN0b3IuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UGFuZWxNYW5hZ2VyLl90ZXN0UGFnZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3QgcGFnZSBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UGFuZWxNYW5hZ2VyLl9kaXJ0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhbmVsIGlzIGRpcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFBhbmVsTWFuYWdlci5DbGVhclVzZWRDaGlsZHJlbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVtb3ZlIHRoZSBjaGlsZHJlbiBmcm9tIHRoZSB0ZXN0IHN1cmZhY2UsIGlmIGl0IGhhcyANCisgICAgICAgICAgICBiZWVuIHVzZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0UGFuZWxNYW5hZ2VyLkNsZWFyQ2hpbGRyZW4iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlbW92ZSB0aGUgY2hpbGRyZW4gZnJvbSB0aGUgdGVzdCBzdXJmYWNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdFBhbmVsTWFuYWdlci5UZXN0UGFnZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBSZWZlcmVuY2UgdG8gdGhlIFRlc3RQYWdlIHVzZXIgY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RQYW5lbE1hbmFnZXIuVGVzdFBhbmVsIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBUZXN0U3VyZmFjZSBQYW5lbCwgYW5kIHRyYWNrcyB0aGUgdXNlIGZvciB0aGUgDQorICAgICAgICAgICAgY3VycmVudCB0ZXN0IG1ldGhvZC4gIFdoZW4gdGhlIHRlc3QgY29tcGxldGVzLCB0aGUgcGFuZWwgY2hpbGRyZW4gDQorICAgICAgICAgICAgd2lsbCBiZSBjbGVhcmVkIGF1dG9tYXRpY2FsbHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5TY2VuYXJpb1Jlc3VsdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSByZXN1bHQgZnJvbSBhIHRlc3Qgc2NlbmFyaW8uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5TY2VuYXJpb1Jlc3VsdC4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZCxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdENsYXNzLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE91dGNvbWUsU3lzdGVtLkV4Y2VwdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSByZXN1bHQgcmVjb3JkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWV0aG9kIj5UZXN0IG1ldGhvZCBtZXRhZGF0YSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdENsYXNzIj5UZXN0IGNsYXNzIG1ldGFkYXRhIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyZXN1bHQiPlRlc3QgcmVzdWx0IG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleGNlcHRpb24iPkV4Y2VwdGlvbiBpbnN0YW5jZSwgaWYgYW55LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlNjZW5hcmlvUmVzdWx0LlRvU3RyaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBTY2VuYXJpb1Jlc3VsdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhIHZlcmJvc2Ugc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXN1bHQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5TY2VuYXJpb1Jlc3VsdC5TdGFydGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIHNjZW5hcmlvJ3Mgc3RhcnRlZCB0aW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuU2NlbmFyaW9SZXN1bHQuRmluaXNoZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgc2NlbmFyaW8ncyBmaW5pc2hpbmcgdGltZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlNjZW5hcmlvUmVzdWx0LlRlc3RNZXRob2QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHRlc3QgbWV0aG9kIG1ldGFkYXRhLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuU2NlbmFyaW9SZXN1bHQuVGVzdENsYXNzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB0ZXN0IGNsYXNzIG1ldGFkYXRhLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuU2NlbmFyaW9SZXN1bHQuUmVzdWx0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIFJlc3VsdCBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5TY2VuYXJpb1Jlc3VsdC5FeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIEV4Y2VwdGlvbiBpbnN0YW5jZSwgaWYgYW55Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQXNzZW1ibHlNYW5hZ2VyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb250YWluZXIgYW5kIG1hbmFnZXIgdHlwZSB3aGljaCBoYW5kbGVzIGFuIGVudGlyZSB0ZXN0IGFzc2VtYmx5OyBjb250YWlucyBzdWIgd29yayANCisgICAgICAgICAgICBpdGVtcyB0aGF0IHJlcHJlc2VudCBhbGwgYWN0aW9ucyBuZWVkZWQgdG8gZXhlY3V0ZSBpdHMgdGVzdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdENvbXBvc2l0ZVdvcmtJdGVtIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIGNvbnRhaW5lciB0aGF0IHN0b3JlcyBpbnN0YW5jZXMgb2YgdGhlIHVuaXQgdGVzdCBoYXJuZXNzIGFuZCBwcm92aWRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNvbXBvc2l0ZVdvcmtJdGVtIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0V29ya0l0ZW0gd2hpY2ggY2FuIGNvbnRhaW4gc3ViLXRhc2tzOyB0aGUgdW5kZXJseWluZyB3b3JrIGl0ZW0gaXMgDQorICAgICAgICAgICAgbm90IG1hcmtlZCBjb21wbGV0ZSB1bnRpbCB0aGUgQ2hpbGRyZW4gaGF2ZSBjb21wbGV0ZWQgb3IgYW4gRXhjZXB0aW9uIA0KKyAgICAgICAgICAgIGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNvbXBvc2l0ZVdvcmtJdGVtLl9jaGlsZHJlbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3RvcmUgdGhlIHVuZGVybHlpbmcgdGFza3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Db21wb3NpdGVXb3JrSXRlbS5fZmluaXNoV2hlbkVtcHR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXaGV0aGVyIHRoZSBUZXN0VGFza0NvbnRhaW5lcjo6SXNDb21wbGV0ZSBzaG91bGQgYmUgc2V0IHRvIHRydWUgDQorICAgICAgICAgICAgYWZ0ZXIgYWxsIGNoaWxkcmVuIGhhdmUgYmVlbiBkZS1xdWV1ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Db21wb3NpdGVXb3JrSXRlbS5faW52b2tlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV2hldGhlciB0aGUgZmlyc3QgaW52b2tlIGhhcyBoYXBwZW5lZCB5ZXQgb3Igbm90Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQ29tcG9zaXRlV29ya0l0ZW0uI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdG9yIGZvciB0aGUgVGVzdFRhc2tDb250YWluZXIgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNvbXBvc2l0ZVdvcmtJdGVtLkZpcnN0SW52b2tlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBPcHRpb25hbCBtZXRob2QgdG8gY2FsbCBvbiB0aGUgZmlyc3QgaW52b2tlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQ29tcG9zaXRlV29ya0l0ZW0uSW52b2tlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbnZva2UgdGhlIHRlc3QgY29udGFpbmVyOyBpbiB0dXJuIHdpbGwgZXhlY3V0ZSBjaGlsZCB3b3JrIGl0ZW1zIA0KKyAgICAgICAgICAgIGFzIG5lZWRlZC4gU3VwcG9ydHMgZXhlY3V0aW5nIG11bHRpcGxlIGl0ZW1zIGltbWVkaWF0ZWx5IGZvcg0KKyAgICAgICAgICAgIHBlcmZvcm1hbmNlIHJlYXNvbnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgaWYgYWRkaXRpb25hbCB3b3JrIHJlbWFpbnMsIEZhbHNlIG9uY2UgSXNDb21wbGV0ZSANCisgICAgICAgICAgICBpcyBzZXQgdG8gdHJ1ZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNvbXBvc2l0ZVdvcmtJdGVtLkludm9rZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Xb3JrSXRlbUApIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbnZva2UgdGhlIHRlc3QgY29udGFpbmVyOyBpbiB0dXJuIHdpbGwgZXhlY3V0ZSBjaGlsZCB3b3JrIGl0ZW1zIA0KKyAgICAgICAgICAgIGFzIG5lZWRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InVzZWRXb3JrSXRlbSI+VGhlIHdvcmsgaXRlbSB1c2VkIGZvciB0aGUgaW52b2tlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBpZiBhZGRpdGlvbmFsIHdvcmsgcmVtYWlucywgRmFsc2Ugb25jZSBJc0NvbXBsZXRlIA0KKyAgICAgICAgICAgIGlzIHNldCB0byB0cnVlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQ29tcG9zaXRlV29ya0l0ZW0uQ2xlYXJDaGlsZHJlbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2xlYXIgdGhlIGNoaWxkcmVuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQ29tcG9zaXRlV29ya0l0ZW0uRGVxdWV1ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGVxdWV1ZSBhIHdvcmsgaXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+QSB3b3JrIGl0ZW0uPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Db21wb3NpdGVXb3JrSXRlbS5FbnF1ZXVlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLldvcmtJdGVtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQWRkIGEgbmV3IHdvcmsgaXRlbSB0byB0aGUgY29udGFpbmVyIHRvIHNjaGVkdWxlIGl0IGZvciBpbnZvY2F0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+TmV3IHRlc3Qgd29yayBpdGVtIHRvIGVucXVldWUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQ29tcG9zaXRlV29ya0l0ZW0uRW5xdWV1ZVF1aWNrKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLldvcmtJdGVtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQWRkcyBhIG5ldyB3b3JrIGl0ZW0gdGhhdCB3aWxsIGV4ZWN1dGUgbW9yZSBxdWlja2x5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIGl0ZW0gb2Ygd29yay48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Db21wb3NpdGVXb3JrSXRlbS5FbnF1ZXVlUXVpY2soU3lzdGVtLkFjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEVucXVldWVzIGEgY2FsbGJhY2sgb3IgYWN0aW9uIHRoYXQgd2lsbCBxdWlja2x5IGV4ZWN1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3Rpb24iPlRoZSBhY3Rpb24gb3IgbWV0aG9kLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNvbXBvc2l0ZVdvcmtJdGVtLkVucXVldWUoU3lzdGVtLkFjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFkZCBhIG5ldyBjYWxsYmFjayBhY3Rpb24gYW5kIHNjaGVkdWxlIGl0IGZvciBpbnZvY2F0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0aW9uIj5UaGUgYWN0aW9uLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNvbXBvc2l0ZVdvcmtJdGVtLlBlZWsiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybiB0aGUgdG9wIHdvcmsgaXRlbSwgaWYgYW55LCBmcm9tIHRoaXMgY29udGFpbmVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5QZWVrIGludG8gYW55IHRlc3Qgd29yayBpdGVtLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQ29tcG9zaXRlV29ya0l0ZW0uV29ya0l0ZW1Db21wbGV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV29yayBpdGVtcyBtdXN0IGNhbGwgdGhpcyBtZXRob2QgdG8gaW5kaWNhdGUgY29tcGxldGlvbiBvZiB0aGUgd29yayANCisgICAgICAgICAgICBpdGVtOyBpbiB0dXJuIGZpcmVzIHRoZSBDb21wbGV0ZSBldmVudCBkZWxlZ2F0ZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Db21wb3NpdGVXb3JrSXRlbS5Xb3JrSXRlbUNvbXBsZXRlSW50ZXJuYWwiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEludGVybmFsLW9ubHkgdmVyc2lvbiB3aGljaCBjYW4gYmUgY2FsbGVkIGR1cmluZyBhIHRlc3QgY29tcGxldGlvbiANCisgICAgICAgICAgICB0aHJvdWdoIHRoZSByZWxhdGlvbiAtIG5vdCBuZWNlc3NhcmlseSB0aGUgYmVzdCBkZXNpZ247IGV2ZW50cyANCisgICAgICAgICAgICBtYXkgbWFrZSBtb3JlIHNlbnNlIGxvbmctdGVybS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNvbXBvc2l0ZVdvcmtJdGVtLldvcmtJdGVtRXhjZXB0aW9uKFN5c3RlbS5FeGNlcHRpb24pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDYWxsIHdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbnNpZGUgYSB3b3JrIGl0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FeGNlcHRpb24gb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNvbXBvc2l0ZVdvcmtJdGVtLk9uQ29tcGxldGUoU3lzdGVtLkV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZpcmUgdGhlIENvbXBsZXRlIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RW1wdHkgZXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNvbXBvc2l0ZVdvcmtJdGVtLk9uVW5oYW5kbGVkRXhjZXB0aW9uKFN5c3RlbS5FeGNlcHRpb24pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGaXJlIHRoZSB1bmhhbmRsZWQgZXhjZXB0aW9uIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhjZXB0aW9uIj5FeGNlcHRpb24gb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNvbXBvc2l0ZVdvcmtJdGVtLkZpbmlzaFdoZW5FbXB0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29udGFpbmVyIGlzIG1hcmtlZCBDb21wbGV0ZSANCisgICAgICAgICAgICB3aGVuIGFsbCBjaGlsZHJlbiBoYXZlIGV4ZWN1dGVkIG9yIG5vdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNvbXBvc2l0ZVdvcmtJdGVtLlJlbWFpbmluZ1dvcmsiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgc3ViIHRhc2tzIHJlbWFpbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNvbXBvc2l0ZVdvcmtJdGVtLkNvbXBsZXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb21wbGV0ZSBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSB1bmRlcmx5aW5nIFdvcmtJdGVtQ29tcGxldGUgbWV0aG9kIA0KKyAgICAgICAgICAgIGlzIGNhbGxlZCBieSB0aGUgd29yayBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJFOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQ29tcG9zaXRlV29ya0l0ZW0uVW5oYW5kbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFdmVudCBmaXJlZCB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gYW5kIHVuaGFuZGxlZCB3aXRoaW4gdGhlIA0KKyAgICAgICAgICAgIHVuZGVybHlpbmcgSW52b2tlIHNlcXVlbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQ29tcG9zaXRlV29ya0l0ZW0uQ2FuRXhlY3V0ZUltbWVkaWF0ZWx5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhc2sgY2FuIGV4ZWN1dGUNCisgICAgICAgICAgICBpbW1lZGlhdGVseS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0Q29tcG9zaXRlV29ya0l0ZW0uX3Byb3ZpZGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdW5pdCB0ZXN0IHByb3ZpZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RDb21wb3NpdGVXb3JrSXRlbS4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcyxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVW5pdFRlc3RQcm92aWRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IHVuaXQgdGVzdCB3b3JrIGl0ZW0gY29udGFpbmVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdEhhcm5lc3MiPlRoZSB1bml0IHRlc3QgaGFybmVzcy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ1bml0VGVzdFByb3ZpZGVyIj5UaGUgdW5pdCB0ZXN0IG1ldGFkYXRhIHByb3ZpZGVyLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0Q29tcG9zaXRlV29ya0l0ZW0uTG9nTWVzc2FnZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBMb2dzIGEgbmV3IG1lc3NhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5NZXNzYWdlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdENvbXBvc2l0ZVdvcmtJdGVtLkxvZ01lc3NhZ2UoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIExvZ3MgYSBtZXNzYWdlIGFib3V0IHRoZSBoYXJuZXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaGFybmVzc0luZm9ybWF0aW9uIj5JbmZvcm1hdGlvbiBhYm91dCB0aGUgaGFybmVzcy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdENvbXBvc2l0ZVdvcmtJdGVtLkxvZ1dyaXRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgbG9nIG1lc3NhZ2Ugd3JpdGVyIGZvciB0aGUgdW5pdCB0ZXN0IHN5c3RlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0Q29tcG9zaXRlV29ya0l0ZW0uVGVzdEhhcm5lc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHRlc3QgaGFybmVzcyBpbnN0YW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0Q29tcG9zaXRlV29ya0l0ZW0uUHJvdmlkZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHVuaXQgdGVzdCBwcm92aWRlciBpbnN0YW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkFzc2VtYmx5TWFuYWdlci5fZmlsdGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdGVzdCBydW4gZmlsdGVyIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkFzc2VtYmx5TWFuYWdlci5fYXNzZW1ibHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVuaXQgdGVzdCBwcm92aWRlci1hZ25vc3RpYyBhc3NlbWJseSBtZXRhZGF0YS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkFzc2VtYmx5TWFuYWdlci5fdGVzdENsYXNzZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnRhaW5lciBvZiB3b3JrIGl0ZW1zIGZvciBydW5uaW5nIHRlc3QgY2xhc3Nlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkFzc2VtYmx5TWFuYWdlci4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RSdW5GaWx0ZXIsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVVuaXRUZXN0UHJvdmlkZXIsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSUFzc2VtYmx5KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlIGEgbmV3IGFzc2VtYmx5IG1hbmFnZXIsIHRha2VzIGluIHRoZSBoYXJuZXNzLCBwcm92aWRlciANCisgICAgICAgICAgICByZWZlcmVuY2UgYW5kIGFjdHVhbCBJQXNzZW1ibHkgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icnVuRmlsdGVyIj5UaGUgdGVzdCBydW4gZmlsdGVyIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0SGFybmVzcyI+SGFybmVzcyBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icHJvdmlkZXIiPlRoZSB1bml0IHRlc3QgbWV0YWRhdGEgcHJvdmlkZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdEFzc2VtYmx5Ij5UaGUgdGVzdCBhc3NlbWJseSBtZXRhZGF0YSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQXNzZW1ibHlNYW5hZ2VyLkZpcnN0SW52b2tlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXaGVuIHRoZSB0ZXN0IHJ1biBpcyByZWFkeSB0byB0ZXN0IHRoZSB1bmRlcmx5aW5nIHRlc3QgYXNzZW1ibHkgdGhhdA0KKyAgICAgICAgICAgIHRoaXMgY2xhc3MgbWFuYWdlcywgcGVyZm9ybSByZWZsZWN0aW9uIGFuZCBlbnF1ZXVlIHdvcmsgaXRlbXMgdG8gcnVuDQorICAgICAgICAgICAgdGhlIHRlc3RzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQXNzZW1ibHlNYW5hZ2VyLkVucXVldWVBc3NlbWJseUluaXRpYWxpemUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBhc3NlbWJseSBpbml0aWFsaXplIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkFzc2VtYmx5TWFuYWdlci5FbnF1ZXVlQXNzZW1ibHlDbGVhbnVwIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgYXNzZW1ibHkgY2xlYW51cCBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Bc3NlbWJseU1hbmFnZXIuRW5xdWV1ZVRlc3RDbGFzc2VzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZWZsZWN0IG92ZXIgYWxsIHRlc3QgY2xhc3NlcyBpbiB0aGUgYXNzZW1ibHkgYW5kIGFkZCBhbnkgd2hpY2ggYXJlIG5vdCANCisgICAgICAgICAgICBmaWx0ZXJlZCBvdXQgaW50byB0aGUgdGVzdCB3b3JrIGl0ZW0gcXVldWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Bc3NlbWJseU1hbmFnZXIuRW5xdWV1ZU1ldGhvZERpc3BhdGNoZXIoU3lzdGVtLlJlZmxlY3Rpb24uTWV0aG9kSW5mbykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhlbHBlciB0byBlbnF1ZXVlIGEgbmV3IG1ldGhvZCBkaXNwYXRjaGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWV0aG9kIj5UaGUgbWV0aG9kIHJlZmxlY3Rpb24gb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkFzc2VtYmx5TWFuYWdlci5DbGFzc0luc3RhbmNlcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgY29sbGVjdGlvbiBvZiBhbGwgdGhlIGluc3RhbmNlcyBvZiB0aGUgYXNzZW1ibHkncyB0ZXN0DQorICAgICAgICAgICAgY2xhc3NlcywgdXNlZCB0byBrZWVwIGEgc2luZ2xlIHJlZmVyZW5jZSBvZiB0aGUgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLk1ldGhvZENvbnRhaW5lciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBtZXRob2QgY29udGFpbmVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTWV0aG9kQ29udGFpbmVyLl90aW1lb3V0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdGltZW91dCB0aW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTWV0aG9kQ29udGFpbmVyLl9tZXRob2QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB0ZXN0IG1ldGhvZCBtZXRhZGF0YS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLk1ldGhvZENvbnRhaW5lci4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0cyBhIG5ldyBtZXRob2QgY29udGFpbmVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTWV0aG9kQ29udGFpbmVyLiNjdG9yKFN5c3RlbS5PYmplY3QsU3lzdGVtLlJlZmxlY3Rpb24uTWV0aG9kSW5mbyxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdHMgYSBuZXcgbWV0aG9kIGNvbnRhaW5lci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imluc3RhbmNlIj5BbiBpbnN0YW5jZSBvZiB0aGUgbWV0aG9kJ3MgdHlwZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXRob2QiPlRoZSBtZXRob2QgcmVmbGVjdGlvbiBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdE1ldGhvZCI+VGhlIHRlc3QgbWV0aG9kLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLk1ldGhvZENvbnRhaW5lci5fbWV0aG9kVGFzayI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRhc2sgdGhhdCBpbnZvbHZlcyB0aGUgbWV0aG9kLCBhbmQgY29udGFpbnMgaXRzIG93biBpbnRlcm5hbCANCisgICAgICAgICAgICB0ZXN0IHF1ZXVlLCBpZiBuZWVkZWQgZm9yIGFzeW5jaHJvbm91cyB0YXNrcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLk1ldGhvZENvbnRhaW5lci5fbWV0aG9kSW5mbyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHJlZmxlY3Rpb24gb2JqZWN0IGZvciB0aGUgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTWV0aG9kQ29udGFpbmVyLkludm9rZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW52b2tlIGludG8gdGhlIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgY29uZGl0aW9uIG9mIGFueSByZW1haW5pbmcgd29yay48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLk1ldGhvZENvbnRhaW5lci5GaXJzdEludm9rZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgT24gdGhlIGZpcnN0IGludm9rZSwgbWFrZSBzdXJlIHRoZXJlJ3MgYSB0YXNrIHRvIGNhbGwgdGhlIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLk1ldGhvZENvbnRhaW5lci5NZXRob2RJbmZvIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBtZXRob2QncyByZWZsZWN0aW9uIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc0luc3RhbmNlRGljdGlvbmFyeSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IHRoYXQgbWFuYWdlcyBzaW5nbGUgaW5zdGFuY2VzIG9mIHR5cGVzIGZvciB1c2UgYWNyb3NzIHRoZSANCisgICAgICAgICAgICB1bml0IHRlc3Qgc3lzdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdENsYXNzSW5zdGFuY2VEaWN0aW9uYXJ5LkdldEluc3RhbmNlKFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIGEgVHlwZTsgaWYgdGhlcmUgaXMgbm90IGFuIGluc3RhbmNlIHlldCwgDQorICAgICAgICAgICAgdGhpcyB3aWxsIHVzZSBBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2UgdG8gY3JlYXRlIGl0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idHlwZSI+VGhlIFR5cGUgaW5zdGFuY2UgdG8gcmV0cmlldmUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBUeXBlLiAgUmV0dXJucyBhIG5ldyBpbnN0YW5jZSANCisgICAgICAgICAgICBpZiB0aGUgVHlwZSBoYXMgbm90IHlldCBiZWVuIHVzZWQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0Q2xhc3NJbnN0YW5jZURpY3Rpb25hcnkuQ2xlYXJJbnN0YW5jZShTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlbW92ZSBhbnkgaW5zdGFuY2UgZm9yIHRoZSB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idHlwZSI+VGhlIFR5cGUgb2YgaW5zdGFuY2UgdG8gcmVtb3ZlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc01hbmFnZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3QgY2xhc3MgbWFuYWdlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc01hbmFnZXIuX2ZpbHRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCBydW4gZmlsdGVyIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc01hbmFnZXIuX3Rlc3RDbGFzcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVmZXJlbmNlIHRvIHRoZSBjbGFzcyBhbmQgaXRzIG1ldGFkYXRhLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdENsYXNzTWFuYWdlci5fdGVzdEV4ZWN1dGlvblF1ZXVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBRdWV1ZSBvZiBhbnkgdGVzdHMgdG8gcnVuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdENsYXNzTWFuYWdlci5faW5zdGFuY2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENsYXNzIGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdENsYXNzTWFuYWdlci4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RSdW5GaWx0ZXIsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RDbGFzcyxTeXN0ZW0uT2JqZWN0LE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklVbml0VGVzdFByb3ZpZGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBjb250YWluZXIgdHlwZSB0aGF0IGhhbmRsZXMgYW4gZW50aXJlIHRlc3QgY2xhc3MgdGhyb3VnaG91dCB0aGUgDQorICAgICAgICAgICAgdGVzdCBydW4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWx0ZXIiPlRlc3QgcnVuIGZpbHRlciBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdEhhcm5lc3MiPlRoZSB1bml0IHRlc3QgaGFybmVzcy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0Q2xhc3MiPlRoZSB0ZXN0IGNsYXNzIG1ldGFkYXRhIGludGVyZmFjZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbnN0YW5jZSI+VGhlIG9iamVjdCBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwcm92aWRlciI+VGhlIHVuaXQgdGVzdCBwcm92aWRlci48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0Q2xhc3NNYW5hZ2VyLkZpcnN0SW52b2tlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb2RlIHJ1biB0aGUgZmlyc3QgdGltZSB0aGlzIGNvbnRhaW5lciBpcyBpbnZva2VkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdENsYXNzTWFuYWdlci5QcmVwYXJlSW5zdGFuY2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEN1c3RvbSB0ZXN0cyBuZWVkIHRvIGJlIHByZXBhcmVkIGJlZm9yZSB1c2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0Q2xhc3NNYW5hZ2VyLkVucXVldWVUZXN0Q2xhc3NJbml0aWFsaXplIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdGVzdCBpbml0aWFsaXplIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RDbGFzc01hbmFnZXIuRW5xdWV1ZVRlc3RDbGFzc0NsZWFudXAiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB0ZXN0IGNsZWFudXAgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdENsYXNzTWFuYWdlci5Qb3B1bGF0ZVRlc3RNZXRob2RzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZWZsZWN0IHRocm91Z2ggdGhlIGNsYXNzIHRvIGZpbmQgYW55IHRlc3QgbWV0aG9kcywgYW5kIGFkZCB0aGVtIHRvIA0KKyAgICAgICAgICAgIHRoZSBsaXN0IG9mIHF1ZXVlZCBtZXRob2RzLiAgQWxzbywgc29ydHMgdGhlIG1ldGhvZHMgaWYgYXBwcm9wcmlhdGUgDQorICAgICAgICAgICAgYmFzZWQgb24gdGhlIHNldHRpbmdzIGZpbGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0Q2xhc3NNYW5hZ2VyLkVucXVldWVNZXRob2REaXNwYXRjaGVyKFN5c3RlbS5SZWZsZWN0aW9uLk1ldGhvZEluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBZGQgYSBuZXcgbWV0aG9kIGRpc3BhdGNoZXIgdG8gdGhlIHRlc3Qgd29yayBpdGVtIHF1ZXVlLiAgVGhpcyBpcyBhIA0KKyAgICAgICAgICAgIHdvcmsgaXRlbSBjb250YWluZXIgd2hpY2ggaXMgYWJsZSB0byBtYW5hZ2UgaXRzIG93biBpbnRlcm5hbCB0ZXN0IA0KKyAgICAgICAgICAgIHdvcmsgaXRlbSBxdWV1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1ldGhvZCI+VGhlIG1ldGhvZCByZWZsZWN0aW9uIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Xb3JrSXRlbXNNYW5hZ2VyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHNwZWNpYWwgdHlwZSBkZWRpY2F0ZWQgdG8ga2VlcGluZyBhIHJ1bm5pbmcgc3RhY2sgb2YgdGhlIGRpc3BhdGNoIA0KKyAgICAgICAgICAgIG1hbmFnZXJzIHRoYXQgYXJlIGFjdHVhbGx5IGVuYWJsZWQgZm9yICJ3b3JrIGl0ZW0iIHVzZS4gIFRoZSBjdXJyZW50IA0KKyAgICAgICAgICAgIGRpc3BhdGNoZXIgaXMgdXNlZCBieSB0aGUgdGVzdCB3b3JrIGl0ZW0gcXVldWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Xb3JrSXRlbXNNYW5hZ2VyLl9zdGFjayI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGlzcGF0Y2hlciBzdGFjazsgYSBzdGFjayBvZiB3b3JrIGl0ZW0gY29udGFpbmVycy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLldvcmtJdGVtc01hbmFnZXIuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgZW1wdHkgc3RhY2sgZm9yIHdvcmsgaXRlbSBjb250YWluZXJzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuV29ya0l0ZW1zTWFuYWdlci5QdXNoKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQ29tcG9zaXRlV29ya0l0ZW0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQdXNoIGEgbmV3IGRpc3BhdGNoZXIgb250byB0aGUgc3RhY2suDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wb3NpdGUiPlRoZSBjb21wb3NpdGUgd29yayBpdGVtIHRvIHB1c2guPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuV29ya0l0ZW1zTWFuYWdlci5Qb3AiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFBvcCBhIGRpc3BhdGNoZXIgb2ZmIHRoZSBzdGFjay4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgdG9wLW1vc3QgY29udGFpbmVyLiAgVGhyb3dzIGFuIA0KKyAgICAgICAgICAgIEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24gaWYgbm9uZSBpcyBhdmFpbGFibGUuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Xb3JrSXRlbXNNYW5hZ2VyLkN1cnJlbnRDb21wb3NpdGVXb3JrSXRlbSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgY3VycmVudCB0ZXN0IHdvcmsgaXRlbSBkaXNwYXRjaGVyLCB3aGljaCBpcyB0aGUgZGlzcGF0Y2hlciANCisgICAgICAgICAgICBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4gIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBub25lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE1ldGhvZE1hbmFnZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1hbmFnZXIgZm9yIHBsYW5uaW5nLCBwcm9jZXNzaW5nLCBhbmQgcmVwb3J0aW5nIHRoZSByZXN1bHQgb2YgYSBzaW5nbGUgDQorICAgICAgICAgICAgdGVzdCBtZXRob2QgZm9yIGEgdW5pdCB0ZXN0IHByb3ZpZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE1ldGhvZE1hbmFnZXIuX3Rlc3RDbGFzcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVW5kZXJseWluZyB0ZXN0IGNsYXNzIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RNYW5hZ2VyLl90ZXN0TWV0aG9kIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBVbmRlcmx5aW5nIHRlc3QgbWV0aG9kIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RNYW5hZ2VyLl9pbnN0YW5jZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVmZXJlbmNlIHRvIGFuIGluc3RhbmNlIG9mIHRoZSB0ZXN0IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE1ldGhvZE1hbmFnZXIuX3Jlc3VsdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2NlbmFyaW8gcmVzdWx0IG9mIHRoZSB0ZXN0IG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RNYW5hZ2VyLl9zdGFydGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgc3RhcnRlZCB0aW1lIG9mIGV4ZWN1dGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RNYW5hZ2VyLl9vdXRwdXQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN0b3JlcyBhIGNvbGxlY3Rpb24gb2Ygd3JpdHRlbiBsaW5lcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RNYW5hZ2VyLl9idWdBdHRyaWJ1dGVQcmVzZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgYnVnIGF0dHJpYnV0ZSB3YXMgcHJlc2VudCBvbiB0aGlzIA0KKyAgICAgICAgICAgIG1ldGhvZC4gIElmIGl0IGlzLCB0aGUgcmVzdWx0IHdpbGwgYmUgaW52ZXJ0ZWQgYXQgY29tcGxldGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RNYW5hZ2VyLl9tYWluVGVzdE1ldGhvZENvbnRhaW5lciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29udGFpbnMgdGhlIG1haW4gdGVzdCBjb250ZW50cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RNYW5hZ2VyLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0Q2xhc3MsTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2QsU3lzdGVtLk9iamVjdCxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVW5pdFRlc3RQcm92aWRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdG9yIGZvciBhIHRlc3QgbWV0aG9kIG1hbmFnZXIsIHdoaWNoIGhhbmRsZXMgZXhlY3V0aW5nIGEgc2luZ2xlIHRlc3QgbWV0aG9kIA0KKyAgICAgICAgICAgIGZvciBhIHVuaXQgdGVzdCBwcm92aWRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RIYXJuZXNzIj5UaGUgdW5pdCB0ZXN0IGhhcm5lc3Mgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RDbGFzcyI+VGhlIHRlc3QgY2xhc3MgbWV0YWRhdGEgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RNZXRob2QiPlRoZSB0ZXN0IG1ldGhvZCBtZXRhZGF0YSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5zdGFuY2UiPlRoZSB0ZXN0IGNsYXNzIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InByb3ZpZGVyIj5UaGUgdW5pdCB0ZXN0IHByb3ZpZGVyLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RNYW5hZ2VyLkxvZ1N0YXJ0TWVzc2FnZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTG9nIGEgc3RhcnQgbWVzc2FnZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RNYW5hZ2VyLkxvZ0VuZE1lc3NhZ2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIExvZyBhbiBlbmQgbWVzc2FnZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RNYW5hZ2VyLk9uV3JpdGVMaW5lKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlN0cmluZ0V2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZXMgdGhlIHdyaXRlIGxpbmUgZXZlbnQgZm9yIHRoZSB0ZXN0IG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBzdHJpbmcgZXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RNYW5hZ2VyLkZpcnN0SW52b2tlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGaXJzdCBpbnZva2UsIHBsYW4gZm9yIHRoZSBtZXRob2QncyBleGVjdXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0TWV0aG9kTWFuYWdlci5TZXRSZXN1bHRUaW1lcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0cyB0aGUgc3RhcnQgYW5kIGZpbmlzaCB0aW1lcyBvbiB0aGUgU2NlbmFyaW9SZXN1bHQgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE1ldGhvZE1hbmFnZXIuQ3JlYXRlTmV3UmVzdWx0KE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE91dGNvbWUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGVzIHRoZSBTY2VuYXJpb1Jlc3VsdCBpbnN0YW5jZSBmb3IgdGhpcyB0ZXN0IG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im91dGNvbWUiPlRoZSBpbml0aWFsIHRlc3Qgb3V0Y29tZSB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0TWV0aG9kTWFuYWdlci5Db21wbGV0ZU1ldGhvZChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm9jZXNzIHRoZSByZXN1bHQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RNZXRob2RNYW5hZ2VyLlVuaGFuZGxlZE1ldGhvZEV4Y2VwdGlvbihTeXN0ZW0uT2JqZWN0LFN5c3RlbS5VbmhhbmRsZWRFeGNlcHRpb25FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm9jZXNzIGFuIHVuaGFuZGxlZCBleGNlcHRpb24gZm9yIHRoZSBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlNvdXJjZSBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+VW5oYW5kbGVkIGV4Y2VwdGlvbiBldmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE1ldGhvZE1hbmFnZXIuRW5xdWV1ZU1ldGhvZERpc3BhdGNoZXIoU3lzdGVtLlJlZmxlY3Rpb24uTWV0aG9kSW5mbykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZSBhIG5ldyBtZXRob2QgY29udGFpbmVyIHRvIGVuY2xvc2UgYSByZWZsZWN0ZWQgbWV0aG9kIGZvciBleGVjdXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXRob2QiPlRoZSBtZXRob2QgcmVmbGVjdGlvbiBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE1ldGhvZE1hbmFnZXIuQnVnQXR0cmlidXRlUHJvY2Vzc2VkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGJ1ZyBhdHRyaWJ1dGUncyBsb2dpYw0KKyAgICAgICAgICAgIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE1ldGhvZE1hbmFnZXIuV3JpdGVMaW5lT3V0cHV0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB3cml0ZSBsaW5lIG91dHB1dCBsaXN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RNZXRob2RDb250YWluZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgY29udGFpbmVyIHdoaWNoIGlzIGFibGUgdG8gYXR0YWNoIHRvIHRoZSB1bmRlcmx5aW5nIHRlc3QgZGlzcGF0Y2hlciANCisgICAgICAgICAgICBzdGFjayB0byBlbmFibGUgYWR2YW5jZWQgYXN5bmNocm9ub3VzIGZ1bmN0aW9uYWxpdHksIHdoZW4gc3VwcG9ydGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RNZXRob2RDb250YWluZXIuX2hhcm5lc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB1bml0IHRlc3QgaGFybmVzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TWV0aG9kQ29udGFpbmVyLl9ncmFudWxhcml0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBjb250YWluZWQgaXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TWV0aG9kQ29udGFpbmVyLl90ZXN0TWV0aG9kIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdGVzdCBtZXRob2QgbWV0YWRhdGEgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RNZXRob2RDb250YWluZXIuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Vbml0VGVzdEhhcm5lc3MsU3lzdGVtLk9iamVjdCxTeXN0ZW0uUmVmbGVjdGlvbi5NZXRob2RJbmZvLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0TWV0aG9kLE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEdyYW51bGFyaXR5KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgZGlzcGF0Y2hlci1zdGFjayBhdHRhY2hpbmcgbWV0aG9kIGNvbnRhaW5lciB3b3JrIGl0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0SGFybmVzcyI+VGVzdCBoYXJuZXNzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imluc3RhbmNlIj5UZXN0IGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1ldGhvZCI+TWV0aG9kIHJlZmxlY3Rpb24gb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RNZXRob2QiPlRlc3QgbWV0aG9kIG1ldGFkYXRhLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImdyYW51bGFyaXR5Ij5HcmFudWxhcml0eSBvZiB0ZXN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0TWV0aG9kQ29udGFpbmVyLkZpcnN0SW52b2tlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25uZWN0IHRvIGRpc3BhdGNoZXIgc3RhY2sgZm9yIGFkdmFuY2VkIGZ1bmN0aW9ucywgaWYgc3VwcG9ydGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RNZXRob2RDb250YWluZXIuU3VwcG9ydHNXb3JrSXRlbVF1ZXVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDaGVjayBhIE1ldGhvZEluZm8gZm9yIHRoZSBhZHZhbmNlZCBhc3luYyBhdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgaWYgdGhlIHdvcmsgaXRlbSBxdWV1ZSBpcyBzdXBwb3J0ZWQuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5DYWxsYmFja1dvcmtJdGVtIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHdvcmsgaXRlbSBmb3IgdGVzdHMgdG8gdXNlIHdoaWNoIHdpbGwgY2FsbCB0aGUgZGVsZWdhdGUgd2hlbiB0aGUgd29yayANCisgICAgICAgICAgICBpdGVtIGlzIGV4ZWN1dGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQ2FsbGJhY2tXb3JrSXRlbS5fYWN0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdG9yZWQgdm9pZCBkZWxlZ2F0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNhbGxiYWNrV29ya0l0ZW0uI2N0b3IoU3lzdGVtLkFjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZSBhIG5ldyBDYWxsYmFjayB3b3JrIGl0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjYWxsYmFjayI+QWN0aW9uIHRvIGV4ZWN1dGUgb24gSW52b2tlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNhbGxiYWNrV29ya0l0ZW0uSW52b2tlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeGVjdXRlIHRoZSBjYWxsYmFjay4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+V2hldGhlciB0aGUgd29yayBpdGVtIGlzIGNvbXBsZXRlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQ29uZGl0aW9uYWxXb3JrSXRlbSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB0ZXN0IHdvcmsgaXRlbSB0aGF0IGlzIGNvbXBsZXRlIG9uY2UgdGhlIGNvbmRpdGlvbiBpcyBhc3NlcnRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkNvbmRpdGlvbmFsV29ya0l0ZW0uX2RlbGVnYXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgY29uZGl0aW9uYWwgZGVsZWdhdGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Db25kaXRpb25hbFdvcmtJdGVtLiNjdG9yKFN5c3RlbS5GdW5je1N5c3RlbS5Cb29sZWFufSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIG5ldyBjb25kaXRpb25hbCB3b3JrIGl0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25kaXRpb25hbE1ldGhvZCI+Q29uZGl0aW9uYWwgZGVsZWdhdGUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuQ29uZGl0aW9uYWxXb3JrSXRlbS5JbnZva2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEludm9rZSB0aGUgY29uZGl0aW9uLCB3aWxsIGNvbnRpbnVlIGludm9raW5nIHVudGlsIA0KKyAgICAgICAgICAgIHRoZSBjb25kaXRpb24gaXMgZmFsc2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkNvbXBsZXRlcyB0aGUgaW52b2NhdGlvbiBvbmNlIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLk1ldGhvZEludm9rZVdvcmtJdGVtIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHNpbXBsZSB3b3JrIGl0ZW0gdGhhdCBpbnZva2VzIGEgbWV0aG9kIHRocm91Z2ggdGhlIHJlZmxlY3Rpb24gDQorICAgICAgICAgICAgTWV0aG9kSW5mbyBpbnN0YW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLk1ldGhvZEludm9rZVdvcmtJdGVtLk5vbmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFuIGVtcHR5IG9iamVjdCBhcnJheS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLk1ldGhvZEludm9rZVdvcmtJdGVtLl9pbnN0YW5jZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQW4gb2JqZWN0IGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTWV0aG9kSW52b2tlV29ya0l0ZW0uX21ldGhvZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTWV0aG9kIHJlZmxlY3Rpb24gb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTWV0aG9kSW52b2tlV29ya0l0ZW0uX3Rlc3RNZXRob2QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB0ZXN0IG1ldGhvZCB0byBpbnZva2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5NZXRob2RJbnZva2VXb3JrSXRlbS4jY3RvcihTeXN0ZW0uT2JqZWN0LFN5c3RlbS5SZWZsZWN0aW9uLk1ldGhvZEluZm8sTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGVzIGEgbmV3IG1ldGhvZCBpbnZva2Ugd29yayBpdGVtIGZvciBhIE1ldGhvZEluZm8gaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbnN0YW5jZSI+VGhlIHR5cGUgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWV0aG9kIj5UaGUgbWV0aG9kIG9uIHRoZSB0eXBlIHRvIGludm9rZSB3aGVuIHRoZSANCisgICAgICAgICAgICB3b3JrIGl0ZW0gaXMgZXhlY3V0ZWQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGVzdE1ldGhvZCI+VGhlIHRlc3QgbWV0aG9kIG1ldGFkYXRhLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLk1ldGhvZEludm9rZVdvcmtJdGVtLkludm9rZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW52b2tlcyB0aGUgdW5kZXJseWluZyBtZXRob2Qgb24gdGhlIGluc3RhbmNlIGFuZCBtYXJrcyB0aGUgDQorICAgICAgICAgICAgdGVzdCB3b3JrIGl0ZW0gYXMgY29tcGxldGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkZhbHNlLCBub3RpbmcgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHdvcmsgaXRlbS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5Vbml0VGVzdFByb3ZpZGVycyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVW5pdCB0ZXN0IHByb3ZpZGVycy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5Vbml0VGVzdFByb3ZpZGVycy5fcHJvdmlkZXJzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBMaXN0IG9mIHVuaXQgdGVzdCBwcm92aWRlcnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuVW5pdFRlc3RQcm92aWRlcnMuI2NjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdGF0aWMgY29uc3RydWN0b3IgdGhhdCBpbml0aWFsaXplcyB0aGUgYnVpbHQtaW4gdW5pdCB0ZXN0IG1ldGFkYXRhIHByb3ZpZGVycy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5Vbml0VGVzdFByb3ZpZGVycy5HZXRBc3NlbWJseVByb3ZpZGVyKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVW5pdFRlc3RIYXJuZXNzLFN5c3RlbS5SZWZsZWN0aW9uLkFzc2VtYmx5KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdW5pdCB0ZXN0IHByb3ZpZGVyIGZvciBhbiBhc3NlbWJseS4gIFRoZSBmcmFtZXdvcmsgb25seSANCisgICAgICAgICAgICBjdXJyZW50bHkgc3VwcG9ydHMgYSBzaW5nbGUgcHJvdmlkZXIgcGVyIHRlc3QgYXNzZW1ibHksIHNvIGlmIG1vcmUgDQorICAgICAgICAgICAgdGhhbiBvbmUgcmVnaXN0ZXJlZCBwcm92aWRlciBjYW4gaGFuZGxlIHRoZSBhc3NlbWJseSwgYXQgcnVudGltZSBhbiANCisgICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imhhcm5lc3MiPlRoZSB0ZXN0IGhhcm5lc3MgbWFraW5nIHRoZSByZXF1ZXN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RBc3NlbWJseSI+QXNzZW1ibHkgcmVmbGVjdGlvbiBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgdW5pdCB0ZXN0IHByb3ZpZGVyIGZvciB0aGUgdGVzdCBhc3NlbWJseS4gIFRocm93cyBpZiANCisgICAgICAgICAgICBtb3JlIHRoYW4gb25lIGNhbiBwcm9jZXNzIHRoZSBhc3NlbWJseS4gIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyANCisgICAgICAgICAgICBub3QgYSBwcm92aWRlciBmb3IgdGhlIGFzc2VtYmx5LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlVuaXRUZXN0UHJvdmlkZXJzLkdldEFzc2VtYmx5V3JhcHBlcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlVuaXRUZXN0SGFybmVzcyxTeXN0ZW0uUmVmbGVjdGlvbi5Bc3NlbWJseSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgdGhlIElBc3NlbWJseSBwcm92aWRlciBmb3IgYW4gYXNzZW1ibHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJoYXJuZXNzIj5UZXN0IGhhcm5lc3Mgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRlc3RBc3NlbWJseSI+QXNzZW1ibHkgcmVmbGVjdGlvbiBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIG51bGwgb3IgYW4gSUFzc2VtYmx5IGluc3RhbmNlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLlVuaXRUZXN0UHJvdmlkZXJzLlByb3ZpZGVycyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgbGlzdCBvZiBVbml0IFRlc3QgcHJvdmlkZXJzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuRGVjb3JhdG9yRGljdGlvbmFyeSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IHRoYXQgY2FuIHN0b3JlIGp1c3QgYWJvdXQgYW55IGtpbmQgb2Ygb2JqZWN0LCBrZXllZCBvZmYgYW55DQorICAgICAgICAgICAgb2JqZWN0LiAgQXMgYSBIYXNodGFibGUsIGl0IHBlcm1pdHMgdXNpbmcga2V5cyBvZiANCisgICAgICAgICAgICAtIGVudW1zDQorICAgICAgICAgICAgLSBvYmplY3RzDQorICAgICAgICAgICAgLSB0eXBlcw0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIFRoaXMgbWFrZXMgaXQgaWRlYWwgZm9yIHVzZSBpbiBkZWNvcmF0aW5nIGFuZCBhZG9ybmluZyBzcGVjaWFsIHR5cGVzIGluDQorICAgICAgICAgICAgdGhlIHN5c3RlbSwgc3VjaCBhcyBsb2cgbWVzc2FnZXMuDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgQSBzdHJvbmdseS10eXBlZCBkZWNvcmF0b3Iga2V5IGNvdWxkIGNvbWUgZnJvbSBhbiBlbnVtIHZhbHVlLCB3aGlsZSBhDQorICAgICAgICAgICAgcHJvdG90eXBlIGV4dGVuc2lvbiB0byB0aGUgdGVzdCBzeXN0ZW0gY291bGQgc2ltcGx5IHVzZSBhIHN0cmluZyBrZXkgZm9yDQorICAgICAgICAgICAgb3JnYW5pemluZy4gIA0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIEluIGFsbCBpbnN0YW5jZXMsIHRoZSByZXN1bHRpbmcgb2JqZWN0IG5lZWRzIHRvIGJlIGNhc3QgYXBwcm9wcmlhdGVseS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkRlY29yYXRvckRpY3Rpb25hcnkuSGFzRGVjb3JhdG9yKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDaGVjayBpZiBhIGRlY29yYXRvciBleGlzdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWNvcmF0b3JLZXkiPlRoZSBkZWNvcmF0b3Iga2V5IG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGRlY29yYXRvciBrZXkgZXhpc3RzLiAgRXZlbg0KKyAgICAgICAgICAgIGlmIHRoZSBrZXkgZXhpc3RzLCB0aGUgaW5zdGFuY2UgdmFsdWUgZm9yIHRoZSBrZXkgY291bGQgYmUgc2V0IHRvDQorICAgICAgICAgICAgbnVsbCwgeWllbGRpbmcgYSBudWxsIGluc3RhbmNlLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuRGVjb3JhdG9yRGljdGlvbmFyeS5IYXNEZWNvcmF0b3JzKFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENoZWNrIGlmIGEgc2V0IG9mIGRlY29yYXRvcnMgZXhpc3RzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVjb3JhdG9ycyI+VGhlIHNldCBvZiBkZWNvcmF0b3Iocykgb2YgaW50ZXJlc3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBSZXR1cm5zIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBkZWNvcmF0b3JzIG9mIGludGVyZXN0IHdlcmUNCisgICAgICAgICAgICBwcmVzZW50Lg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuRGVjb3JhdG9yRGljdGlvbmFyeS5HZXREZWNvcmF0b3IoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHJpZXZlcyB0aGUgZGVjb3JhdG9yIGluc3RhbmNlIGlmIGl0IGV4aXN0cy4gIElmIG5vdCwgdGhpcyBtZXRob2QNCisgICAgICAgICAgICByZXR1cm5zIG51bGwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWNvcmF0b3JLZXkiPlRoZSBkZWNvcmF0b3Iga2V5IG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFJldHVybnMgdGhlIGluc3RhbmNlIG9yIG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3QuICBObyBleGNlcHRpb25zDQorICAgICAgICAgICAgYXJlIHRocm93biBpbiB0aGlzIG1ldGhvZC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlJlc291cmNlVXRpbGl0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGVscGVyIGZ1bmN0aW9uYWxpdHkgZm9yIGRlYWxpbmcgd2l0aCBlbWJlZGRlZCByZXNvdXJjZXMgaW4gYW4gYXNzZW1ibHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5SZXNvdXJjZVV0aWxpdHkuR2V0QWxsVGV4dChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgdGV4dCBvZiBhbiBlbWJlZGRlZCByZXNvdXJjZSBpbiBhbg0KKyAgICAgICAgICAgIGFzc2VtYmx5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5zdGFuY2UiPg0KKyAgICAgICAgICAgIEFuIGluc3RhbmNlIHdob3NlIGFzc2VtYmx5IGNhbiBiZSByZXRyaWV2ZWQgdGhyb3VnaCByZWZsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZ1bGxFbWJlZGRlZFJlc291cmNlTmFtZSI+DQorICAgICAgICAgICAgQ29tcGxldGUgZW1iZWRkZWQgcmVzb3VyY2UgbmFtZS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGVtYmVkZGVkIHJlc291cmNlJ3Mgc3RyaW5nIGNvbnRlbnRzLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZUZhY3RvcnkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgc2ltcGxlIGZhY3RvcnkgdXNlZCBmb3IgY3JlYXRpbmcgbmV3IGxvZyBtZXNzYWdlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VGYWN0b3J5LkNyZWF0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlIGEgbmV3IExvZ01lc3NhZ2UgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSBuZXcgTG9nTWVzc2FnZSBpbnN0YW5jZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VGYWN0b3J5LkNyZWF0ZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VUeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlIGEgbmV3IExvZ01lc3NhZ2UgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlVHlwZSI+VGhlIHR5cGUgb2YgbWVzc2FnZSB0byBjcmVhdGUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGEgbmV3IExvZ01lc3NhZ2UgaW5zdGFuY2UuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlRmFjdG9yeS5EZWZhdWx0TG9nTWVzc2FnZVR5cGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgZGVmYXVsdCBsb2cgbWVzc2FnZSB0eXBlIHVzZWQgZm9yIHRoZSBjcmVhdGlvbiBvZg0KKyAgICAgICAgICAgIHVuc3BlY2lmaWMgbG9nIG1lc3NhZ2UgdHlwZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dEZWNvcmF0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdlbGwta25vd24ga2V5cyB0aGF0IGNhbiBiZSB1c2VkIHRvIG1hcmsgZGVjb3JhdG9yIGluc3RhbmNlcyBpbiBsb2cgDQorICAgICAgICAgICAgbWVzc2FnZSBvYmplY3RzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nRGVjb3JhdG9yLkV4Y2VwdGlvbk9iamVjdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgS2V5IGZvciBhIGRlY29yYXRvciB0aGF0IGlzIGEgc2ltcGxlIEV4Y2VwdGlvbiBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dEZWNvcmF0b3IuTmFtZVByb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBLZXkgZm9yIGEgZGVjb3JhdG9yIHRoYXQgaXMgYSBzaW1wbGUgTmFtZSBzdHJpbmcgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dEZWNvcmF0b3IuVGVzdE91dGNvbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFuIGFzc29jaWF0ZWQgVGVzdE91dGNvbWUgdmFsdWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dEZWNvcmF0b3IuVGVzdFN0YWdlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgc3RhZ2Ugb2YgYSBtZXNzYWdlIG9yIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nRGVjb3JhdG9yLlRlc3RHcmFudWxhcml0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIGdyYW51bGFyaXR5IG9mIGEgbWVzc2FnZSBvciBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RPdXRjb21lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIG51bWJlciBvZiBwb3NzaWJsZSB0ZXN0IG91dGNvbWVzIG9yIHJlc3VsdHMuICBGb3IgY29tcGF0aWJpbGl0eSwgdGhpcyANCisgICAgICAgICAgICBpbmZvcm1hdGlvbiByZXNlbWJsZXMgdGhhdCBvZiB0aGUgZGVza3RvcCB0ZXN0IGZyYW1ld29yaywgYWx0aG91Z2ggbWFueSANCisgICAgICAgICAgICBvZiB0aGUgc3RhdGVzIG1heSBub3QgYXBwbHkgb3IgYmUgdmFsaWQgZm9yIGFuIGluLWJyb3dzZXIgdGVzdCBoYXJuZXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE91dGNvbWUuRXJyb3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgdGVzdCBvdXRjb21lIG9mIEVycm9yLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE91dGNvbWUuRmFpbGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHRlc3Qgb3V0Y29tZSBvZiBGYWlsZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0T3V0Y29tZS5UaW1lb3V0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHRlc3Qgb3V0Y29tZSBvZiBUaW1lb3V0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE91dGNvbWUuQWJvcnRlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB0ZXN0IG91dGNvbWUgb2YgQWJvcnRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RPdXRjb21lLkluY29uY2x1c2l2ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB0ZXN0IG91dGNvbWUgb2YgSW5jb25jbHVzaXZlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE91dGNvbWUuUGFzc2VkQnV0UnVuQWJvcnRlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB0ZXN0IG91dGNvbWUgb2YgYSBydW4gdGhhdCB3YXMgYWJvcnRlZCwgYnV0IHBhc3NlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RPdXRjb21lLk5vdFJ1bm5hYmxlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHRlc3Qgb3V0Y29tZSBvZiBOb3RSdW5uYWJsZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RPdXRjb21lLk5vdEV4ZWN1dGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHRlc3Qgb3V0Y29tZSBvZiBOb3RFeGVjdXRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RPdXRjb21lLkRpc2Nvbm5lY3RlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB0ZXN0IG91dGNvbWUgb2YgRGlzY29ubmVjdGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE91dGNvbWUuV2FybmluZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB0ZXN0IG91dGNvbWUgb2YgV2FybmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RPdXRjb21lLlBhc3NlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB0ZXN0IG91dGNvbWUgb2YgUGFzc2VkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE91dGNvbWUuQ29tcGxldGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHRlc3Qgb3V0Y29tZSBvZiBDb21wbGV0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0T3V0Y29tZS5JblByb2dyZXNzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHRlc3Qgb3V0Y29tZSBvZiBJblByb2dyZXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdE91dGNvbWUuUGVuZGluZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB0ZXN0IG91dGNvbWUgb2YgUGVuZGluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RTdGFnZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHN0YWdlIG9mIGEgdGVzdCBzY2VuYXJpbywgY2FzZSBvciBzeXN0ZW0gcnVubmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RTdGFnZS5TdGFydGluZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U3RhZ2UuUnVubmluZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3VycmVudGx5IHJ1bm5pbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U3RhZ2UuRmluaXNoaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGaW5pc2hpbmcgdXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0U3RhZ2UuQ2FuY2VsaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdGVzdCBpcyBjYW5jZWxpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5HbG9iYWxFeGNlcHRpb25IYW5kbGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlcyBhIHByb3BlcnR5IHRoYXQgd2lsbCBhdHRhY2ggYW5kIGRldGFjaCBhIGtub3duIGV2ZW50IGhhbmRsZXINCisgICAgICAgICAgICBkZWxlZ2F0ZSB3aGVuIHRoZSBiaXQgaXMgZmxpcHBlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkdsb2JhbEV4Y2VwdGlvbkhhbmRsZXIuX2V2ZW50SGFuZGxlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIGV2ZW50IHRvIGZpcmUgd2hlbiBhdHRhY2hlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkdsb2JhbEV4Y2VwdGlvbkhhbmRsZXIuX2F0dGFjaGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXaGV0aGVyIHRoZSBldmVudCBoYW5kbGVyIGlzIGF0dGFjaGVkIGFzIGEgZ2xvYmFsIHVuaGFuZGxlZA0KKyAgICAgICAgICAgIGV4Y2VwdGlvbiBoYW5kbGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuR2xvYmFsRXhjZXB0aW9uSGFuZGxlci4jY3RvcihTeXN0ZW0uRXZlbnRIYW5kbGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyBhIG5ldyBleGNlcHRpb24gaGFuZGxlciAibWFuYWdlciIgd2l0aCB0aGUgcHJvdmlkZWQNCisgICAgICAgICAgICBFdmVudEhhbmRsZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJldmVudEhhbmRsZXIiPlRoZSBldmVudCBoYW5kbGVyIHRvIG1hbmFnZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5HbG9iYWxFeGNlcHRpb25IYW5kbGVyLkNoYW5nZUV4Y2VwdGlvbkJ1YmJsaW5nKFN5c3RlbS5FdmVudEFyZ3MsU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNYXJrIHRoZSBIYW5kbGVkIHByb3BlcnR5IGluIHRoZSBldmVudCBhcmdzIGFzIFRydWUgdG8gc3RvcCBhbnkgDQorICAgICAgICAgICAgZXZlbnQgYnViYmxpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhjZXB0aW9uSGFuZGxlZCI+DQorICAgICAgICAgICAgVmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBFeGNlcHRpb24gc2hvdWxkIGJlIG1hcmtlZCBhcyBoYW5kbGVkLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkdsb2JhbEV4Y2VwdGlvbkhhbmRsZXIuR2V0RXhjZXB0aW9uT2JqZWN0KFN5c3RlbS5FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm4gdGhlIEV4Y2VwdGlvbiBwcm9wZXJ0eSBmcm9tIHRoZSBFdmVudEFyZ3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBSZXR1cm5zIHRoZSBFeGNlcHRpb24gb2JqZWN0IHRoYXQgdGhlIGV2ZW50IGFyZ3VtZW50cyBzdG9yZXMuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZnVsbCBkZXNrdG9wIGZyYW1ld29yayBhcyB3ZWxsIGFzDQorICAgICAgICAgICAgU2lsdmVybGlnaHQuDQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5HbG9iYWxFeGNlcHRpb25IYW5kbGVyLk9uR2xvYmFsRXhjZXB0aW9uKFN5c3RlbS5PYmplY3QsU3lzdGVtLldpbmRvd3MuQXBwbGljYXRpb25VbmhhbmRsZWRFeGNlcHRpb25FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbnRlcm5hbCBldmVudCB0aGF0IGlzIGhvb2tlZCB1cCB0byB0aGUgZ2xvYmFsIGV4Y2VwdGlvbiBoYW5kbGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5Tb3VyY2Ugb2JqZWN0IG9mIHRoZSBldmVudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuR2xvYmFsRXhjZXB0aW9uSGFuZGxlci5VcGRhdGVBdHRhY2htZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDYWxsZWQgYWZ0ZXIgYSBjaGFuZ2UgdG8gdGhlIGF0dGFjaG1lbnQgZmllbGQgdmFsdWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5HbG9iYWxFeGNlcHRpb25IYW5kbGVyLkF0dGFjaEhhbmRsZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEF0dGFjaCB0aGUgaGFuZGxlciBnbG9iYWxseS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkdsb2JhbEV4Y2VwdGlvbkhhbmRsZXIuRGV0YWNoSGFuZGxlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGV0YWNoIHRoZSBoYW5kbGVyIGdsb2JhbGx5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuR2xvYmFsRXhjZXB0aW9uSGFuZGxlci5BdHRhY2hHbG9iYWxIYW5kbGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGhhbmRsZXIgaXMgY3VycmVudGx5IA0KKyAgICAgICAgICAgIGF0dGFjaGVkIHRvIHRoZSBnbG9iYWwgZXhjZXB0aW9uIGhhbmRsZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIGxvZyBtZXNzYWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZS5EZWZhdWx0TG9nTWVzc2FnZVR5cGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBkZWZhdWx0IGxvZyBtZXNzYWdlIHVzZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZS4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgbG9nIG1lc3NhZ2Ugb2YgdGhlIGRlZmF1bHQgbWVzc2FnZSB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZS4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VUeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgbG9nIG1lc3NhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlVHlwZSI+VGhlIG1lc3NhZ2UgdHlwZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlLlRvU3RyaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb252ZXJ0cyB0byBzdHJpbmcgcmVwcmVzZW50YXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkEgc3RyaW5nIHZlcnNpb24gb2YgdGhlIExvZ01lc3NhZ2UuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlLkhhc0RlY29yYXRvcihTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2hlY2sgaWYgYSBkZWNvcmF0b3IgaXMgcHJlc2VudCBvbiB0aGUgTG9nTWVzc2FnZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlY29yYXRvciI+VGhlIGRlY29yYXRvciBvZiBpbnRlcmVzdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGRlY29yYXRvciBpcyBwcmVzZW50IGluIHRoZQ0KKyAgICAgICAgICAgIERlY29yYXRvckRpY3Rpb25hcnkuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlLkhhc0RlY29yYXRvcnMoU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2hlY2sgaWYgYSBzZXQgb2YgZGVjb3JhdG9ycyBhcmUgcHJlc2VudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlY29yYXRvcnMiPlRoZSBkZWNvcmF0b3Iocykgb2YgaW50ZXJlc3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBSZXR1cm5zIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBkZWNvcmF0b3Iocykgb2YgaW50ZXJlc3QgYXJlDQorICAgICAgICAgICAgcHJlc2VudC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UuRGVjb3JhdG9ycyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgc2V0IG9mIGRlY29yYXRvciBpbnN0YW5jZXMgYXR0YWNoZWQgdG8gdGhlIGxvZyBtZXNzYWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZS5NZXNzYWdlVHlwZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSB0eXBlIG9mIG1lc3NhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlLk1lc3NhZ2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgbG9nJ3MgbWVzc2FnZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UuSXRlbShTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBkZWNvcmF0b3IgdHlwZSBmb3IgdGhlIG1lc3NhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWNvcmF0b3IiPg0KKyAgICAgICAgICAgIFRoZSB0eXBlIG9mIGRlY29yYXRvci4gIE9ubHkgb25lIGV4cGxpY2l0IFR5cGUgaXMgcGVybWl0dGVkLA0KKyAgICAgICAgICAgIGFsdGhvdWdoIG11bHRpcGxlIHR5cGVzIHdpdGhpbiB0aGUgc2FtZSB0eXBlIGhpZXJhcmNoeSBhcmUNCisgICAgICAgICAgICBsZWdpdGltYXRlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgaW5zdGFuY2Ugb2YgdGhlIGRlY29yYXRvciwgaWYgYW55LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEdyYW51bGFyaXR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgaGllcmFyY2h5IG9mIHRlc3QgZXhlY3V0aW9uIHJlcHJlc2VudGVkIGluIG1vcmUgZ2VuZXJpYyB0ZXJtcywgdGhpcw0KKyAgICAgICAgICAgIGFsbG93cyBmb3IgbW9yZSByb2J1c3QgYW5kIHVzZWZ1bCBhY3Rpb25zIGJ5IGxvZyBwcm92aWRlcnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0R3JhbnVsYXJpdHkuSGFybmVzcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFybmVzcy1sZXZlbCBncmFudWxhcml0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RHcmFudWxhcml0eS5UZXN0R3JvdXAiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdyb3VwIG9mIHRlc3QtbGV2ZWwgZ3JhbnVsYXJpdHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0R3JhbnVsYXJpdHkuVGVzdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdC1sZXZlbCBncmFudWxhcml0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RHcmFudWxhcml0eS5UZXN0U2NlbmFyaW8iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNjZW5hcmlvLWxldmVsIGdyYW51bGFyaXR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuRGVidWdPdXRwdXRQcm92aWRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIG1vc3QgdmVyYm9zZSBsb2cgcHJvdmlkZXIsIHRoaXMgY2FsbHMgLlRvU3RyaW5nKCkgb24gZWFjaCBhbmQgZXZlcnkgDQorICAgICAgICAgICAgTG9nTWVzc2FnZSB0aGF0IGl0IHByb2Nlc3Nlcy4gIFRoZSBvdXRwdXQgd2lsbCBhcHBlYXIgaW4gYW4gYXR0YWNoZWQgDQorICAgICAgICAgICAgZGVidWdnZXIncyAiT3V0cHV0IiB3aW5kb3cuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5EZWJ1Z091dHB1dFByb3ZpZGVyLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRGVidWdPdXRwdXRQcm92aWRlciBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkRlYnVnT3V0cHV0UHJvdmlkZXIuUHJvY2VzcyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEaXNwbGF5IGEgTG9nTWVzc2FnZSBpbiB0aGUgZGVidWcgb3V0cHV0IHdpbmRvdy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImxvZ01lc3NhZ2UiPk1lc3NhZ2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkRlYnVnT3V0cHV0UHJvdmlkZXIuU2hvd0FsbEZhaWx1cmVzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgYW55IFRlc3RSZXN1bHQgZmFpbHVyZXMgd2lsbCANCisgICAgICAgICAgICBiZSByZXBvcnRlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBUZXN0UmVzdWx0IHR5cGUgaXMgYmVpbmcgDQorICAgICAgICAgICAgbW9uaXRvcmVkIGZvciBkZWJ1ZyBvdXRwdXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5EZWJ1Z091dHB1dFByb3ZpZGVyLlNob3dFdmVyeXRoaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgYWxsIG1lc3NhZ2VzIGFwcGVhciBpbiB0aGUgDQorICAgICAgICAgICAgZGVidWcgb3V0cHV0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZVR5cGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNldCBvZiBkZWZpbmVkIHR5cGVzIG9mIGxvZyBtZXNzYWdlcyB0byBhbGxvdyBmb3Igc29tZSBsZXZlbCBvZiANCisgICAgICAgICAgICBmaWx0ZXJpbmcgYW5kIHNlbGVjdGl2ZSBwcm9jZXNzaW5nIG9mIGxvZyBtZXNzYWdlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VUeXBlLlRlc3RSZXN1bHQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFBhc3MsIGZhaWwsIGV0Yy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VUeXBlLkRlYnVnIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZWJ1Zzo6V3JpdGVMaW5lIG9yIHRyYWNpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlVHlwZS5XYXJuaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBOb24tZmF0YWwgbG9nIG1lc3NhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5Mb2dNZXNzYWdlVHlwZS5FcnJvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRmF0YWwgZXJyb3IgbWVzc2FnZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VUeXBlLktub3duSXNzdWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluZm9ybWF0aW9uIGFib3V0IGEga25vd24gZGVmZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZVR5cGUuSW5mb3JtYXRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdlbmVyYWwgaW5mb3JtYXRpb24gc2ltaWxhciB0byBhIENvbnNvbGU6OldyaXRlTGluZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLkxvZ01lc3NhZ2VUeXBlLkVudmlyb25tZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBPcGVyYXRpbmcgc3lzdGVtIHNldHRpbmcgb3IgcGxhdGZvcm0gdmFsdWVzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZVR5cGUuVGVzdEV4ZWN1dGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTmV3IHVuaXQgb2YgdGVzdCBvciB0ZXN0IHJ1biBub3RlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuTG9nTWVzc2FnZVR5cGUuVGVzdEluZnJhc3RydWN0dXJlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZWxhdGVkIHRlc3Qgc3lzdGVtcyBvciBvdXQtb2YtcHJvY2VzcyBjb21tdW5pY2F0aW9uIGluZm9ybWF0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEhhcm5lc3NDb21wbGV0ZWRFdmVudEFyZ3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEV2ZW50IGluZm9ybWF0aW9uIG1hcmtpbmcgdGhlIGNvbXBsZXRpb24gb2YgYSB0ZXN0IHJ1bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RIYXJuZXNzQ29tcGxldGVkRXZlbnRBcmdzLiNjdG9yKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEhhcm5lc3NTdGF0ZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgVGVzdEhhcm5lc3NDb21wbGV0ZWRFdmVudEFyZ3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0ZXN0SGFybmVzc1N0YXRlIj5UaGUgZmluYWwgdGVzdCBoYXJuZXNzIHN0YXRlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RIYXJuZXNzQ29tcGxldGVkRXZlbnRBcmdzLlN0YXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBmaW5hbCB0ZXN0IGhhcm5lc3Mgc3RhdGUuDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgVGhpcyBjb250YWlucyB0aGUgZmluYWwgcGFzcyB2ZXJzdXMgZmFpbCByZXN1bHQgYXQgYSBtaW5pbXVtLg0KKyAgICAgICAgICAgIFNwZWNpZmljIGhhcm5lc3NlcyBtYXkgZXh0ZW5kIHRoZSB0eXBlIHRvIGNvbnRhaW4gYWRkaXRpb25hbA0KKyAgICAgICAgICAgIGluZm9ybWF0aW9uLCBsb2dzLCBzY2VuYXJpbyBjb3VudHMsIG9yIGFueXRoaW5nIGVsc2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5XZWJCcm93c2VyVGljayI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSB0eXBlIHdoaWNoIGhhbmRsZXMgcHJlcGFyaW5nIHRoZSB1bmRlcmx5aW5nIGRpc3BhdGNoZXIgb3IgdGltZXIgZnJvbSANCisgICAgICAgICAgICB3aGljaCB0aGUgdGVzdCB3b3JrIGl0ZW1zIGV4ZWN1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5XZWJCcm93c2VyVGljay5EZWZhdWx0VGlja0ludGVydmFsIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNaWxsaXNlY29uZCBpbnRlcnZhbCB0byB1c2UgZm9yIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIERpc3BhdGNoZXJUaW1lcg0KKyAgICAgICAgICAgIHRpY2tzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuV2ViQnJvd3NlclRpY2suX3RpbWVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEaXNwYXRjaGVyIHRpbWVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuV2ViQnJvd3NlclRpY2suI2N0b3IoU3lzdGVtLkZ1bmN7U3lzdGVtLkJvb2xlYW59KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyBhIG5ldyBydW4gbWV0aG9kIG1hbmFnZXIgdXNpbmcgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSANCisgICAgICAgICAgICB0aW1lcidzIG1pbGxpc2Vjb25kIGludGVydmFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icnVuTmV4dFN0ZXAiPg0KKyAgICAgICAgICAgIENvbmRpdGlvbmFsIGRlbGVnYXRlIHdoaWNoIHJldHVybnMgdHJ1ZSBhcyBsb25nIGFzIHRoZXJlIGlzIA0KKyAgICAgICAgICAgIGFkZGl0aW9uYWwgd29yay4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5XZWJCcm93c2VyVGljay4jY3RvcihTeXN0ZW0uRnVuY3tTeXN0ZW0uQm9vbGVhbn0sU3lzdGVtLkludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0cyB1cCBhIG5ldyBydW4gbWV0aG9kIG1hbmFnZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJydW5OZXh0U3RlcCI+DQorICAgICAgICAgICAgQ29uZGl0aW9uYWwgZGVsZWdhdGUgd2hpY2ggcmV0dXJucyB0cnVlIGFzIGxvbmcgYXMgdGhlcmUgaXMgDQorICAgICAgICAgICAgYWRkaXRpb25hbCB3b3JrLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1pbGxpc2Vjb25kSW50ZXJ2YWwiPk1pbGxpc2Vjb25kcyBiZXR3ZWVuIHRpY2tzLCBhdCBhIA0KKyAgICAgICAgICAgIG1pbmltdW0uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuV2ViQnJvd3NlclRpY2suUnVuIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCZWdpbiB0aGUgZXhlY3V0aW9uIHByb2Nlc3MgYnkgaG9va2luZyB1cCB0aGUgdW5kZXJseWluZyANCisgICAgICAgICAgICBEaXNwYXRjaGVyVGltZXIgdG8gY2FsbCBpbnRvIHRoZSB0ZXN0IGZyYW1ld29yayByZWd1bGFybHkgYW5kIA0KKyAgICAgICAgICAgIHBlcmZvcm0gdGVzdCB3b3JrIGl0ZW1zLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuV2ViQnJvd3NlclRpY2suVGltZXJfVGljayhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDYWxsIGludG8gdGhlIHVuZGVybHlpbmcgd29yayBpdGVtIHF1ZXVlLCBpZiB0aGUgbWV0aG9kIG1hbmFnZXIgaXMgDQorICAgICAgICAgICAgc3RpbGwgc2V0IHRvIHJ1bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+U2VuZGluZyBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RIYXJuZXNzU3RhdGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhc2UgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBvdmVyYWxsIHN0YXRlIG9mIGEgdGVzdCBydW4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0SGFybmVzc1N0YXRlLkluY3JlbWVudEZhaWx1cmVzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbmNyZW1lbnQgdGhlIGZhaWx1cmVzIGNvdW50ZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5UZXN0SGFybmVzc1N0YXRlLkluY3JlbWVudFRvdGFsU2NlbmFyaW9zIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbmNyZW1lbnRzIHRoZSB0b3RhbCBzY2VuYXJpb3MgY291bnRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RIYXJuZXNzU3RhdGUuRmFpbHVyZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGNvdW50IG9mIGZhaWxpbmcgc2NlbmFyaW9zLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuVGVzdEhhcm5lc3NTdGF0ZS5Ub3RhbFNjZW5hcmlvcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdG90YWwgY291bnQgb2Ygc2NlbmFyaW9zIHJ1bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlRlc3RIYXJuZXNzU3RhdGUuRmFpbGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzdGF0dXMgcmVjb3JkZWQgaW5kaWNhdGVzIGENCisgICAgICAgICAgICBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuUmVmbGVjdGlvblV0aWxpdHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgc2V0IG9mIGhlbHBlciBtZXRob2RzIGZvciBpbnRlcmFjdGluZyB3aXRoIG1ldGhvZHMgYW5kIHR5cGVzIHRoYXQgYXJlDQorICAgICAgICAgICAgbWFya2VkIHdpdGggYXR0cmlidXRlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlJlZmxlY3Rpb25VdGlsaXR5LkdldFR5cGVzV2l0aEF0dHJpYnV0ZShTeXN0ZW0uUmVmbGVjdGlvbi5Bc3NlbWJseSxTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHJpZXZlIGFsbCB0eXBlcyBpbiBhbiBhc3NlbWJseSB0aGF0IGFyZSBkZWNvcmF0ZWQgd2l0aCBhIHNwZWNpZmljDQorICAgICAgICAgICAgYXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXNzZW1ibHkiPkFzc2VtYmx5IHRvIHNlYXJjaC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWNvcmF0aW5nQXR0cmlidXRlIj4NCisgICAgICAgICAgICBJbnN0YW5jZSBvZiB0aGUgVHlwZSBvZiBhdHRyaWJ1dGUgdGhhdCBtYXJrcyBpbnRlcmVzdGluZyBtZXRob2RzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgQSBjb2xsZWN0aW9uIG9mIHR5cGVzIGZyb20gdGhlIGFzc2VtYmx5LiAgQW4gZW1wdHkgY29sbGVjdGlvbiBpcw0KKyAgICAgICAgICAgIHJldHVybmVkIGlmIG5vIHR5cGVzIHdlcmUgZm91bmQgbWF0Y2hpbmcgdGhlIGNvbnN0cmFpbnRzLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuUmVmbGVjdGlvblV0aWxpdHkuR2V0QXR0cmlidXRlcyhTeXN0ZW0uUmVmbGVjdGlvbi5NZW1iZXJJbmZvLFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2l2ZW4gYSBNZXRob2RJbmZvIHR5cGUsIHJldHVybnMgdGhlIGF0dHJpYnV0ZXMgKGlmIGFueSkgdGhhdCBhcmUgb2YgDQorICAgICAgICAgICAgdGhlIGRlY29yYXRpbmdBdHRyaWJ1dGUgcGFyYW1ldGVyJ3MgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lbWJlciI+TWVtYmVySW5mbyBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWNvcmF0aW5nQXR0cmlidXRlIj5BdHRyaWJ1dGUgb2YgaW50ZXJlc3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIGNvbGxlY3Rpb24gcG9wdWxhdGVkIHdpdGggdGhlIEF0dHJpYnV0ZSBpbnN0YW5jZXMuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5SZWZsZWN0aW9uVXRpbGl0eS5HZXRBdHRyaWJ1dGVzKFN5c3RlbS5SZWZsZWN0aW9uLk1lbWJlckluZm8sU3lzdGVtLlR5cGUsU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHaXZlbiBhIE1ldGhvZEluZm8gdHlwZSwgcmV0dXJucyB0aGUgYXR0cmlidXRlcyAoaWYgYW55KSB0aGF0IGFyZSBvZiANCisgICAgICAgICAgICB0aGUgZGVjb3JhdGluZ0F0dHJpYnV0ZSBwYXJhbWV0ZXIncyB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVtYmVyIj5NZW1iZXJJbmZvIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlY29yYXRpbmdBdHRyaWJ1dGUiPkF0dHJpYnV0ZSBvZiBpbnRlcmVzdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbmhlcml0Ij5BIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0byBsb29rIGZvciANCisgICAgICAgICAgICBpbmhlcml0aW5nIGN1c3RvbSBhdHRyaWJ1dGVzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgQSBjb2xsZWN0aW9uIHBvcHVsYXRlZCB3aXRoIHRoZSBBdHRyaWJ1dGUgaW5zdGFuY2VzLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuUmVmbGVjdGlvblV0aWxpdHkuR2V0QXR0cmlidXRlcyhNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZCxTeXN0ZW0uVHlwZSxTeXN0ZW0uQm9vbGVhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdpdmVuIGEgdGVzdCBtZXRob2QsIHJldHVybnMgdGhlIGF0dHJpYnV0ZXMgKGlmIGFueSkgdGhhdCBhcmUgb2YgDQorICAgICAgICAgICAgdGhlIGRlY29yYXRpbmdBdHRyaWJ1dGUgcGFyYW1ldGVyJ3MgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1ldGhvZCI+SVRlc3RNZXRob2QgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVjb3JhdGluZ0F0dHJpYnV0ZSI+QXR0cmlidXRlIG9mIGludGVyZXN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImluaGVyaXQiPldoZXRoZXIgdG8gaW5oZXJpdCBhdHRyaWJ1dGVzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgQSBjb2xsZWN0aW9uIHBvcHVsYXRlZCB3aXRoIHRoZSBBdHRyaWJ1dGUgaW5zdGFuY2VzLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuUmVmbGVjdGlvblV0aWxpdHkuR2V0QXNzZW1ibGllc0Zyb21JbnN0YW5jZXMoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUVudW1lcmFibGV7U3lzdGVtLk9iamVjdH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXRyaWV2ZSBhIGxpc3Qgb2YgUmVmbGVjdGlvbi5Bc3NlbWJseSB0eXBlcyBmcm9tIGEgc2V0IG9mIA0KKyAgICAgICAgICAgIGluc3RhbmNlcyBhbmQvb3IgdHlwZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJvYmplY3RzIj5TZXQgb2YgaW5zdGFuY2VzIG9yIHR5cGVzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+QSBzZXQgb2YgQXNzZW1ibHkgaW5zdGFuY2VzIGZyb20gdGhlIGluc3RhbmNlcyBvciB0eXBlcy48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlJlZmxlY3Rpb25VdGlsaXR5LkdldEFzc2VtYmxpZXMoU3lzdGVtLlR5cGVbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBsaXN0IG9mIHVuaXF1ZSBhc3NlbWJsaWVzIGZyb20gYSBzZXQgb2YgdHlwZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0eXBlcyI+U2V0IG9mIHR5cGVzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgQSBsaXN0IG9mIHVuaXF1ZSBBc3NlbWJseSBpbnN0YW5jZXMgZnJvbSB0aGUgaW5wdXQgdHlwZXMuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5SZWZsZWN0aW9uVXRpbGl0eS5HZXRBdHRyaWJ1dGUoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUNvbGxlY3Rpb257U3lzdGVtLkF0dHJpYnV0ZX0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHaXZlbiBhIGxpc3Qgb2YgYXR0cmlidXRlcywgcmV0cmlldmVzIGEgc2luZ2xlIEF0dHJpYnV0ZSBpbnN0YW5jZS4NCisgICAgICAgICAgICBXaWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBtdWx0aXBsZSBhdHRyaWJ1dGVzIGV4aXN0IG9uIHRoZSBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGVzIj5MaXN0IG9mIGF0dHJpYnV0ZXMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgYXR0cmlidXRlIGluc3RhbmNlLCBvciBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0Lg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuUmVmbGVjdGlvblV0aWxpdHkuR2V0QXR0cmlidXRlKFN5c3RlbS5SZWZsZWN0aW9uLk1lbWJlckluZm8sU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHaXZlbiBhIG1ldGhvZCBhbmQgYSBkZWNvcmF0aXZlIGF0dHJpYnV0ZSBvZiBpbnRlcmVzdCwgcmV0cmlldmVzIGENCisgICAgICAgICAgICBzaW5nbGUgQXR0cmlidXRlIGluc3RhbmNlLiAgV2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgbXVsdGlwbGUNCisgICAgICAgICAgICBhdHRyaWJ1dGVzIGV4aXN0IG9uIHRoZSBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZW1iZXIiPk1lbWJlckluZm8gaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVjb3JhdGluZ0F0dHJpYnV0ZSI+DQorICAgICAgICAgICAgQXR0cmlidXRlIHR5cGUgb2YgaW50ZXJlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgYXR0cmlidXRlIGluc3RhbmNlLCBvciBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0Lg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuUmVmbGVjdGlvblV0aWxpdHkuR2V0QXR0cmlidXRlKE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlVuaXRUZXN0aW5nLk1ldGFkYXRhLklUZXN0TWV0aG9kLFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2l2ZW4gYSB0ZXN0IG1ldGhvZCBhbmQgYSBkZWNvcmF0aXZlIGF0dHJpYnV0ZSBvZiBpbnRlcmVzdCwNCisgICAgICAgICAgICByZXRyaWV2ZXMgYSBzaW5nbGUgQXR0cmlidXRlIGluc3RhbmNlLiAgV2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYNCisgICAgICAgICAgICBtdWx0aXBsZSBhdHRyaWJ1dGVzIGV4aXN0IG9uIHRoZSBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXRob2QiPklUZXN0TWV0aG9kIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlY29yYXRpbmdBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIEF0dHJpYnV0ZSB0eXBlIG9mIGludGVyZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZSBpbnN0YW5jZSwgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5IYXJuZXNzLlJlZmxlY3Rpb25VdGlsaXR5LkdldEF0dHJpYnV0ZShNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Vbml0VGVzdGluZy5NZXRhZGF0YS5JVGVzdE1ldGhvZCxTeXN0ZW0uVHlwZSxTeXN0ZW0uQm9vbGVhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdpdmVuIGEgdGVzdCBtZXRob2QgYW5kIGEgZGVjb3JhdGl2ZSBhdHRyaWJ1dGUgb2YgaW50ZXJlc3QsDQorICAgICAgICAgICAgcmV0cmlldmVzIGEgc2luZ2xlIEF0dHJpYnV0ZSBpbnN0YW5jZS4gIFdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmDQorICAgICAgICAgICAgbXVsdGlwbGUgYXR0cmlidXRlcyBleGlzdCBvbiB0aGUgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWV0aG9kIj5JVGVzdE1ldGhvZCBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWNvcmF0aW5nQXR0cmlidXRlIj4NCisgICAgICAgICAgICBBdHRyaWJ1dGUgdHlwZSBvZiBpbnRlcmVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbmhlcml0Ij5BIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0byBsb29rIGZvciBjdXN0b20gDQorICAgICAgICAgICAgaW5oZXJpdGVkIGF0dHJpYnV0ZXMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgYXR0cmlidXRlIGluc3RhbmNlLCBvciBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0Lg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuUmVmbGVjdGlvblV0aWxpdHkuSGFzQXR0cmlidXRlKFN5c3RlbS5SZWZsZWN0aW9uLk1lbWJlckluZm8sU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIGEgbWV0aG9kIGhhcyB0aGUgYXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVtYmVyIj5NZW1iZXJJbmZvIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlY29yYXRpbmdBdHRyaWJ1dGUiPkF0dHJpYnV0ZSBvZiBpbnRlcmVzdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0eXBlIGhhcyB0aGUgZGVjb3JhdGluZyBhdHRyaWJ1dGUgb3INCisgICAgICAgICAgICBub3QuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5SZWZsZWN0aW9uVXRpbGl0eS5IYXNBdHRyaWJ1dGUoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuVW5pdFRlc3RpbmcuTWV0YWRhdGEuSVRlc3RNZXRob2QsU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIGEgbWV0aG9kIGhhcyB0aGUgYXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWV0aG9kIj5JVGVzdE1ldGhvZCBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWNvcmF0aW5nQXR0cmlidXRlIj5BdHRyaWJ1dGUgb2YgaW50ZXJlc3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdHlwZSBoYXMgdGhlIGRlY29yYXRpbmcgYXR0cmlidXRlIG9yDQorICAgICAgICAgICAgbm90Lg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkhhcm5lc3MuUmVmbGVjdGlvblV0aWxpdHkuR2V0TWV0aG9kc1dpdGhBdHRyaWJ1dGUoU3lzdGVtLlR5cGUsU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm4gYSBjb2xsZWN0aW9uIG9mIE1ldGhvZEluZm8gaW5zdGFuY2VzIGdpdmVuIGEgdHlwZSB0byBsb29rDQorICAgICAgICAgICAgdGhyb3VnaCAgYW5kIHRoZSBhdHRyaWJ1dGUgb2YgaW50ZXJlc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0eXBlIj5UeXBlIHRvIGxvb2sgdGhyb3VnaCBmb3IgbWV0aG9kcy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWNvcmF0aW5nQXR0cmlidXRlIj5BdHRyaWJ1dGUgb2YgaW50ZXJlc3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIGNvbGxlY3Rpb24gb2YgdGhlIG1ldGhvZCByZWZsZWN0aW9uIG9iamVjdHMsIGlmIGFueSwgd2l0aCB0aGUNCisgICAgICAgICAgICBtYXJrZWQgYXR0cmlidXRlIHByZXNlbnQuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuSGFybmVzcy5SZWZsZWN0aW9uVXRpbGl0eS5HZXRPbmVNZXRob2RXaXRoQXR0cmlidXRlKFN5c3RlbS5UeXBlLFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0cmlldmUgYSBNZXRob2RJbmZvIGZyb20gYSBzaW5nbGUgZGVjb3JhdGVkIG1ldGhvZCBpbnNpZGUgYSB0eXBlLA0KKyAgICAgICAgICAgIGlmIGFueS4gIFRocm93cyBhbiBFeGNlcHRpb24gaWYgdGhlcmUgYXJlID4gMSBtZXRob2RzIHRoYXQgYXJlDQorICAgICAgICAgICAgZGVjb3JhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InR5cGUiPlR5cGUgb2YgaW50ZXJlc3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVjb3JhdGluZ0F0dHJpYnV0ZSI+QXR0cmlidXRlIG9mIGludGVyZXN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgTWV0aG9kSW5mbyByZWZsZWN0aW9uIG9iamVjdC4gIE51bGwgaWYgbm9uZSBhcmUgZm91bmQuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkNsaXBib2FyZEhlbHBlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRXhwb3NlcyBjbGlwYm9hcmQgZnVuY3Rpb25hbGl0eSB3aXRoaW4gU2lsdmVybGlnaHQgMyBhcHBsaWNhdGlvbnMgd2hlbiBhDQorICAgICAgICAgICAgU2lsdmVybGlnaHQgNCBydW50aW1lIGlzIGluIHVzZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuQ2xpcGJvYXJkSGVscGVyLkVtcHR5T2JqZWN0QXJyYXkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFuIGVtcHR5IGFycmF5IG9mIG9iamVjdCB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5DbGlwYm9hcmRIZWxwZXIuX3NldFRleHQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIHNldCB0ZXh0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5DbGlwYm9hcmRIZWxwZXIuX2dldFRleHQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIGdldCB0ZXh0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5DbGlwYm9hcmRIZWxwZXIuX2NvbnRhaW5zVGV4dCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFja2luZyBmaWVsZCBmb3IgdGhlIGNvbnRhaW5zIHRleHQgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5DbGlwYm9hcmRIZWxwZXIuX2NsaXBib2FyZEZlYXR1cmVTdXBwb3J0ZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjbGlwYm9hcmQgZmVhdHVyZSBpcyBwcmVzZW50LiBUaGlzDQorICAgICAgICAgICAgYXNzdW1lcyB0aGF0IGFsbCAzIG1ldGhvZHMgYXJlIHByZXNlbnQsIGluIHRoZWlyIGN1cnJlbnQgZm9ybSBmb3IgYQ0KKyAgICAgICAgICAgIG1vcmUgcmVjZW50IHJ1bnRpbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkNsaXBib2FyZEhlbHBlci5TZXRUZXh0KFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZXRzIFVuaWNvZGUgdGV4dCBkYXRhIHRvIHN0b3JlIG9uIHRoZSBjbGlwYm9hcmQsIGZvciBsYXRlciBhY2Nlc3MgDQorICAgICAgICAgICAgd2l0aCBTeXN0ZW0uV2luZG93cy5DbGlwYm9hcmQuR2V0VGV4dCgpLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGV4dCI+QSBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUgVW5pY29kZSB0ZXh0IGRhdGEgdG8gDQorICAgICAgICAgICAgc3RvcmUgb24gdGhlIGNsaXBib2FyZC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkNsaXBib2FyZEhlbHBlci5HZXRUZXh0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXRyaWV2ZXMgVW5pY29kZSB0ZXh0IGRhdGEgZnJvbSB0aGUgc3lzdGVtIGNsaXBib2FyZCwgaWYgVW5pY29kZSANCisgICAgICAgICAgICB0ZXh0IGRhdGEgZXhpc3RzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5JZiBVbmljb2RlIHRleHQgZGF0YSBpcyBwcmVzZW50IG9uIHRoZSBzeXN0ZW0gY2xpcGJvYXJkLCANCisgICAgICAgICAgICByZXR1cm5zIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgdGhlIFVuaWNvZGUgdGV4dCBkYXRhLiBPdGhlcndpc2UsIA0KKyAgICAgICAgICAgIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5DbGlwYm9hcmRIZWxwZXIuQ29udGFpbnNUZXh0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBRdWVyaWVzIHRoZSBjbGlwYm9hcmQgZm9yIHRoZSBwcmVzZW5jZSBvZiBkYXRhIGluIHRoZSBVbmljb2RlIHRleHQgDQorICAgICAgICAgICAgZm9ybWF0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGlmIHRoZSBzeXN0ZW0gY2xpcGJvYXJkIGNvbnRhaW5zIFVuaWNvZGUgdGV4dCBkYXRhOyANCisgICAgICAgICAgICBvdGhlcndpc2UsIGZhbHNlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5DbGlwYm9hcmRIZWxwZXIuUmVxdWlyZUNsaXBib2FyZEZlYXR1cmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByZXBhcmVzIHRvIHVzZSB0aGUgU3lzdGVtLldpbmRvd3MuQ2xpcGJvYXJkIHR5cGUgYW5kIHRocm93cyBhbg0KKyAgICAgICAgICAgIGV4Y2VwdGlvbiBpZiB0aGUgZmVhdHVyZSBjYW5ub3QgYmUgY29tcGxldGVseSBsb2NhdGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5DbGlwYm9hcmRIZWxwZXIuUHJlcGFyZUNsaXBib2FyZEluc3RhbmNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcmVwYXJlcyB0aGUgdHlwZSBhbmQgcmVmbGVjdHMgZm9yIG5ldyBTaWx2ZXJsaWdodCBmZWF0dXJlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuQ2xpcGJvYXJkSGVscGVyLklzQ2xpcGJvYXJkRmVhdHVyZVN1cHBvcnRlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY2xpcGJvYXJkIGZlYXR1cmUgaXMgYXZhaWxhYmxlDQorICAgICAgICAgICAgYW5kIHN1cHBvcnRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5CaW5kaW5nRXZhbHVhdG9yYDEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgZnJhbWV3b3JrIGVsZW1lbnQgdGhhdCBwZXJtaXRzIGEgYmluZGluZyB0byBiZSBldmFsdWF0ZWQgaW4gYSBuZXcgZGF0YQ0KKyAgICAgICAgICAgIGNvbnRleHQgbGVhZiBub2RlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSB0eXBlIG9mIGR5bmFtaWMgYmluZGluZyB0byByZXR1cm4uPC90eXBlcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5CaW5kaW5nRXZhbHVhdG9yYDEuX2JpbmRpbmciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgc3RyaW5nIHZhbHVlIGJpbmRpbmcgdXNlZCBieSB0aGUgY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5CaW5kaW5nRXZhbHVhdG9yYDEuVmFsdWVQcm9wZXJ0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWRlbnRpZmllcyB0aGUgVmFsdWUgZGVwZW5kZW5jeSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5CaW5kaW5nRXZhbHVhdG9yYDEuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBCaW5kaW5nRXZhbHVhdG9yIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkJpbmRpbmdFdmFsdWF0b3JgMS4jY3RvcihTeXN0ZW0uV2luZG93cy5EYXRhLkJpbmRpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQmluZGluZ0V2YWx1YXRvciBjbGFzcywNCisgICAgICAgICAgICBzZXR0aW5nIHRoZSBpbml0aWFsIGJpbmRpbmcgdG8gdGhlIHByb3ZpZGVkIHBhcmFtZXRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImJpbmRpbmciPlRoZSBpbml0aWFsIHN0cmluZyB2YWx1ZSBiaW5kaW5nLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5CaW5kaW5nRXZhbHVhdG9yYDEuQ2xlYXJEYXRhQ29udGV4dCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2xlYXJzIHRoZSBkYXRhIGNvbnRleHQgc28gdGhhdCB0aGUgY29udHJvbCBkb2VzIG5vdCBrZWVwIGENCisgICAgICAgICAgICByZWZlcmVuY2UgdG8gdGhlIGxhc3QtbG9va2VkIHVwIGl0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuQmluZGluZ0V2YWx1YXRvcmAxLkdldER5bmFtaWNWYWx1ZShTeXN0ZW0uT2JqZWN0LFN5c3RlbS5Cb29sZWFuKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVXBkYXRlcyB0aGUgZGF0YSBjb250ZXh0IG9mIHRoZSBmcmFtZXdvcmsgZWxlbWVudCBhbmQgcmV0dXJucyB0aGUgDQorICAgICAgICAgICAgdXBkYXRlZCBiaW5kaW5nIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibyI+VGhlIG9iamVjdCB0byB1c2UgYXMgdGhlIGRhdGEgY29udGV4dC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjbGVhckRhdGFDb250ZXh0Ij5JZiBzZXQgdG8gdHJ1ZSwgdGhpcyBwYXJhbWV0ZXIgd2lsbA0KKyAgICAgICAgICAgIGNsZWFyIHRoZSBkYXRhIGNvbnRleHQgaW1tZWRpYXRlbHkgYWZ0ZXIgcmV0cmlldmluZyB0aGUgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRoZSBldmFsdWF0ZWQgVCB2YWx1ZSBvZiB0aGUgYm91bmQgZGVwZW5kZW5jeQ0KKyAgICAgICAgICAgIHByb3BlcnR5LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkJpbmRpbmdFdmFsdWF0b3JgMS5HZXREeW5hbWljVmFsdWUoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVwZGF0ZXMgdGhlIGRhdGEgY29udGV4dCBvZiB0aGUgZnJhbWV3b3JrIGVsZW1lbnQgYW5kIHJldHVybnMgdGhlIA0KKyAgICAgICAgICAgIHVwZGF0ZWQgYmluZGluZyB2YWx1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im8iPlRoZSBvYmplY3QgdG8gdXNlIGFzIHRoZSBkYXRhIGNvbnRleHQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRoZSBldmFsdWF0ZWQgVCB2YWx1ZSBvZiB0aGUgYm91bmQgZGVwZW5kZW5jeQ0KKyAgICAgICAgICAgIHByb3BlcnR5LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkJpbmRpbmdFdmFsdWF0b3JgMS5WYWx1ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBkYXRhIGl0ZW0gc3RyaW5nIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkJpbmRpbmdFdmFsdWF0b3JgMS5WYWx1ZUJpbmRpbmciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdmFsdWUgYmluZGluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5Eb2NrIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTcGVjaWZpZXMgdmFsdWVzIHRoYXQgY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgYSBjb250cm9sIHBvc2l0aW9uZWQNCisgICAgICAgICAgICBpbnNpZGUgYW5vdGhlciBjb250cm9sLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8UXVhbGl0eUJhbmQ+U3RhYmxlPC9RdWFsaXR5QmFuZD4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkRvY2suTGVmdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIGNvbnRyb2wgc2hvdWxkIGJlIHBvc2l0aW9uZWQgb24gdGhlIGxlZnQgb2YgdGhlDQorICAgICAgICAgICAgY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5Eb2NrLlRvcCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIGNvbnRyb2wgc2hvdWxkIGJlIHBvc2l0aW9uZWQgb24gdG9wIG9mIHRoZQ0KKyAgICAgICAgICAgIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuRG9jay5SaWdodCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIGNvbnRyb2wgc2hvdWxkIGJlIHBvc2l0aW9uZWQgb24gdGhlIHJpZ2h0IG9mIHRoZQ0KKyAgICAgICAgICAgIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuRG9jay5Cb3R0b20iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNwZWNpZmllcyB0aGF0IHRoZSBjb250cm9sIHNob3VsZCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBib3R0b20gb2YgDQorICAgICAgICAgICAgY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JbnRlcmFjdGlvbkhlbHBlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIEludGVyYWN0aW9uSGVscGVyIHByb3ZpZGVzIGNvbnRyb2xzIHdpdGggc3VwcG9ydCBmb3IgYWxsIG9mIHRoZQ0KKyAgICAgICAgICAgIGNvbW1vbiBpbnRlcmFjdGlvbnMgbGlrZSBtb3VzZSBtb3ZlbWVudCwgbW91c2UgY2xpY2tzLCBrZXkgcHJlc3NlcywNCisgICAgICAgICAgICBldGMuLCBhbmQgYWxzbyBpbmNvcnBvcmF0ZXMgcHJvcGVyIGV2ZW50IHNlbWFudGljcyB3aGVuIHRoZSBjb250cm9sIGlzDQorICAgICAgICAgICAgZGlzYWJsZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSW50ZXJhY3Rpb25IZWxwZXIuU2VxdWVudGlhbENsaWNrVGhyZXNob2xkSW5NaWxsaXNlY29uZHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB0aHJlc2hvbGQgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0d28gY2xpY2tzIGFyZSB0ZW1wb3JhbGx5DQorICAgICAgICAgICAgbG9jYWwgYW5kIGNvbnNpZGVyZWQgYSBkb3VibGUgY2xpY2sgKG9yIHRyaXBsZSwgcXVhZHJ1cGxlLCBldGMuKS4NCisgICAgICAgICAgICA1MDAgbWlsbGlzZWNvbmRzIGlzIHRoZSBkZWZhdWx0IGRvdWJsZSBjbGljayB2YWx1ZSBvbiBXaW5kb3dzLg0KKyAgICAgICAgICAgIFRoaXMgdmFsdWUgd291bGQgaWRlYWxseSBiZSBwdWxsZWQgZm9ybSB0aGUgc3lzdGVtIHNldHRpbmdzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkludGVyYWN0aW9uSGVscGVyLlNlcXVlbnRpYWxDbGlja1RocmVzaG9sZEluUGl4ZWxzU3F1YXJlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRocmVzaG9sZCB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHR3byBjbGlja3MgYXJlIHNwYXRpYWxseQ0KKyAgICAgICAgICAgIGxvY2FsIGFuZCBjb25zaWRlcmVkIGEgZG91YmxlIGNsaWNrIChvciB0cmlwbGUsIHF1YWRydXBsZSwgZXRjLikNCisgICAgICAgICAgICBpbiBwaXhlbHMgc3F1YXJlZC4gIFdlIHVzZSBwaXhlbHMgc3F1YXJlZCBzbyB0aGF0IHdlIGNhbiBjb21wYXJlIHRvDQorICAgICAgICAgICAgdGhlIGRpc3RhbmNlIGRlbHRhIHdpdGhvdXQgdGFraW5nIGEgc3F1YXJlIHJvb3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSW50ZXJhY3Rpb25IZWxwZXIuX3VwZGF0ZVZpc3VhbFN0YXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZWZlcmVuY2UgdXNlZCB0byBjYWxsIFVwZGF0ZVZpc3VhbFN0YXRlIG9uIHRoZSBiYXNlIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkludGVyYWN0aW9uSGVscGVyLiNjdG9yKFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLkNvbnRyb2wpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgSW50ZXJhY3Rpb25IZWxwZXIgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb250cm9sIj5Db250cm9sIHJlY2VpdmluZyBpbnRlcmFjdGlvbi48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSW50ZXJhY3Rpb25IZWxwZXIuVXBkYXRlVmlzdWFsU3RhdGUoU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBVcGRhdGUgdGhlIHZpc3VhbCBzdGF0ZSBvZiB0aGUgY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InVzZVRyYW5zaXRpb25zIj4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHRyYW5zaXRpb25zIHRvDQorICAgICAgICAgICAgdGhlIG5ldyBzdGF0ZSwgb3IgaW5zdGFudGx5IHRyYW5zaXRpb24gdG8gdGhlIG5ldyBzdGF0ZS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIFVwZGF0ZVZpc3VhbFN0YXRlIHdvcmtzIGRpZmZlcmVudGx5IHRoYW4gdGhlIHJlc3Qgb2YgdGhlIGluamVjdGVkDQorICAgICAgICAgICAgZnVuY3Rpb25hbGl0eS4gIE1vc3Qgb2YgdGhlIG90aGVyIGV2ZW50cyBhcmUgb3ZlcnJpZGRlbiBieSB0aGUNCisgICAgICAgICAgICBjYWxsaW5nIGNsYXNzIHdoaWNoIGNhbGxzIEFsbG93LCBkb2VzIHdoYXQgaXQgd2FudHMsIGFuZCB0aGVuIGNhbGxzDQorICAgICAgICAgICAgQmFzZS4gIFVwZGF0ZVZpc3VhbFN0YXRlIGlzIHRoZSBvcHBvc2l0ZSBiZWNhdXNlIGEgbnVtYmVyIG9mIHRoZQ0KKyAgICAgICAgICAgIG1ldGhvZHMgaW4gSW50ZXJhY3Rpb25IZWxwZXIgbmVlZCB0byB0cmlnZ2VyIGl0IGluIHRoZSBjYWxsaW5nDQorICAgICAgICAgICAgY2xhc3MuICBXZSBkbyB0aGlzIHVzaW5nIHRoZSBJVXBkYXRlVmlzdWFsU3RhdGUgaW50ZXJuYWwgaW50ZXJmYWNlLg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkludGVyYWN0aW9uSGVscGVyLlVwZGF0ZVZpc3VhbFN0YXRlQmFzZShTeXN0ZW0uQm9vbGVhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVwZGF0ZSB0aGUgdmlzdWFsIHN0YXRlIG9mIHRoZSBjb250cm9sLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idXNlVHJhbnNpdGlvbnMiPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgdHJhbnNpdGlvbnMgdG8NCisgICAgICAgICAgICB0aGUgbmV3IHN0YXRlLCBvciBpbnN0YW50bHkgdHJhbnNpdGlvbiB0byB0aGUgbmV3IHN0YXRlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JbnRlcmFjdGlvbkhlbHBlci5PbkxvYWRlZChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5XaW5kb3dzLlJvdXRlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZSB0aGUgY29udHJvbCdzIExvYWRlZCBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIGNvbnRyb2wuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JbnRlcmFjdGlvbkhlbHBlci5PbklzRW5hYmxlZENoYW5nZWQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5EZXBlbmRlbmN5UHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlIGNoYW5nZXMgdG8gdGhlIGNvbnRyb2wncyBJc0VuYWJsZWQgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBjb250cm9sLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSW50ZXJhY3Rpb25IZWxwZXIuT25Jc1JlYWRPbmx5Q2hhbmdlZChTeXN0ZW0uQm9vbGVhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZXMgY2hhbmdlcyB0byB0aGUgY29udHJvbCdzIElzUmVhZE9ubHkgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSW50ZXJhY3Rpb25IZWxwZXIuT25BcHBseVRlbXBsYXRlQmFzZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVXBkYXRlIHRoZSB2aXN1YWwgc3RhdGUgb2YgdGhlIGNvbnRyb2wgd2hlbiBpdHMgdGVtcGxhdGUgaXMgY2hhbmdlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JbnRlcmFjdGlvbkhlbHBlci5BbGxvd0dvdEZvY3VzKFN5c3RlbS5XaW5kb3dzLlJvdXRlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENoZWNrIGlmIHRoZSBjb250cm9sJ3MgR290Rm9jdXMgZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSW50ZXJhY3Rpb25IZWxwZXIuT25Hb3RGb2N1c0Jhc2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZpcnR1YWwgR290Rm9jdXMgZXZlbnQgaGFuZGxlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JbnRlcmFjdGlvbkhlbHBlci5BbGxvd0xvc3RGb2N1cyhTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDaGVjayBpZiB0aGUgY29udHJvbCdzIExvc3RGb2N1cyBldmVudCBzaG91bGQgYmUgaGFuZGxlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBldmVudCBzaG91bGQgYmUgaGFuZGxlZC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JbnRlcmFjdGlvbkhlbHBlci5Pbkxvc3RGb2N1c0Jhc2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZpcnR1YWwgTG9zdEZvY3VzIGV2ZW50IGhhbmRsZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSW50ZXJhY3Rpb25IZWxwZXIuQWxsb3dNb3VzZUVudGVyKFN5c3RlbS5XaW5kb3dzLklucHV0Lk1vdXNlRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGNvbnRyb2wncyBNb3VzZUVudGVyIGV2ZW50IHNob3VsZCBiZSBoYW5kbGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgQSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGV2ZW50IHNob3VsZCBiZSBoYW5kbGVkLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkludGVyYWN0aW9uSGVscGVyLk9uTW91c2VFbnRlckJhc2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZpcnR1YWwgTW91c2VFbnRlciBldmVudCBoYW5kbGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkludGVyYWN0aW9uSGVscGVyLkFsbG93TW91c2VMZWF2ZShTeXN0ZW0uV2luZG93cy5JbnB1dC5Nb3VzZUV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENoZWNrIGlmIHRoZSBjb250cm9sJ3MgTW91c2VMZWF2ZSBldmVudCBzaG91bGQgYmUgaGFuZGxlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBldmVudCBzaG91bGQgYmUgaGFuZGxlZC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JbnRlcmFjdGlvbkhlbHBlci5Pbk1vdXNlTGVhdmVCYXNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCYXNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB2aXJ0dWFsIE1vdXNlTGVhdmUgZXZlbnQgaGFuZGxlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JbnRlcmFjdGlvbkhlbHBlci5BbGxvd01vdXNlTGVmdEJ1dHRvbkRvd24oU3lzdGVtLldpbmRvd3MuSW5wdXQuTW91c2VCdXR0b25FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDaGVjayBpZiB0aGUgY29udHJvbCdzIE1vdXNlTGVmdEJ1dHRvbkRvd24gZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSW50ZXJhY3Rpb25IZWxwZXIuT25Nb3VzZUxlZnRCdXR0b25Eb3duQmFzZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmlydHVhbCBNb3VzZUxlZnRCdXR0b25Eb3duIGV2ZW50DQorICAgICAgICAgICAgaGFuZGxlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JbnRlcmFjdGlvbkhlbHBlci5BbGxvd01vdXNlTGVmdEJ1dHRvblVwKFN5c3RlbS5XaW5kb3dzLklucHV0Lk1vdXNlQnV0dG9uRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGNvbnRyb2wncyBNb3VzZUxlZnRCdXR0b25VcCBldmVudCBzaG91bGQgYmUgaGFuZGxlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBldmVudCBzaG91bGQgYmUgaGFuZGxlZC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JbnRlcmFjdGlvbkhlbHBlci5Pbk1vdXNlTGVmdEJ1dHRvblVwQmFzZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmlydHVhbCBNb3VzZUxlZnRCdXR0b25VcCBldmVudCBoYW5kbGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkludGVyYWN0aW9uSGVscGVyLkFsbG93S2V5RG93bihTeXN0ZW0uV2luZG93cy5JbnB1dC5LZXlFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDaGVjayBpZiB0aGUgY29udHJvbCdzIEtleURvd24gZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSW50ZXJhY3Rpb25IZWxwZXIuQWxsb3dLZXlVcChTeXN0ZW0uV2luZG93cy5JbnB1dC5LZXlFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDaGVjayBpZiB0aGUgY29udHJvbCdzIEtleVVwIGV2ZW50IHNob3VsZCBiZSBoYW5kbGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgQSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGV2ZW50IHNob3VsZCBiZSBoYW5kbGVkLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkludGVyYWN0aW9uSGVscGVyLkNvbnRyb2wiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGNvbnRyb2wgdGhlIEludGVyYWN0aW9uSGVscGVyIGlzIHRhcmdldGluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JbnRlcmFjdGlvbkhlbHBlci5Jc0ZvY3VzZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbnRyb2wgaGFzIGZvY3VzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkludGVyYWN0aW9uSGVscGVyLklzTW91c2VPdmVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtb3VzZSBpcyBvdmVyIHRoZSBjb250cm9sLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4gDQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JbnRlcmFjdGlvbkhlbHBlci5Jc1JlYWRPbmx5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZWFkLW9ubHkgcHJvcGVydHkgaXMgc2V0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkludGVyYWN0aW9uSGVscGVyLklzUHJlc3NlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQgZG93bg0KKyAgICAgICAgICAgIG92ZXIgdGhlIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSW50ZXJhY3Rpb25IZWxwZXIuTGFzdENsaWNrVGltZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBsYXN0IHRpbWUgdGhlIGNvbnRyb2wgd2FzIGNsaWNrZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIFRoZSB2YWx1ZSBpcyBzdG9yZWQgYXMgVXRjIHRpbWUgYmVjYXVzZSBpdCBpcyBzbGlnaHRseSBtb3JlDQorICAgICAgICAgICAgcGVyZm9ybWFudCB0aGFuIGNvbnZlcnRpbmcgdG8gbG9jYWwgdGltZS4NCisgICAgICAgICAgICA8L3JlbWFya3M+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JbnRlcmFjdGlvbkhlbHBlci5MYXN0Q2xpY2tQb3NpdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBtb3VzZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBjbGljay4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJlbWFya3M+VGhlIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBjb250cm9sLjwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkludGVyYWN0aW9uSGVscGVyLkNsaWNrQ291bnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgY29udHJvbCB3YXMgY2xpY2tlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JdGVtc0NvbnRyb2xIZWxwZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBJdGVtQ29udGFpbmVyR2VuZXJhdG9yIHByb3ZpZGVzIHVzZWZ1bCB1dGlsaXRpZXMgZm9yIEl0ZW1zQ29udHJvbHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5QcmV2aWV3PC9RdWFsaXR5QmFuZD4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkl0ZW1zQ29udHJvbEhlbHBlci5faXRlbXNIb3N0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIFBhbmVsIHRoYXQgaXMgdXNlZCBhcyB0aGUgSXRlbXNIb3N0IG9mIHRoZSBJdGVtc0NvbnRyb2wuICBUaGlzDQorICAgICAgICAgICAgcHJvcGVydHkgd2lsbCBvbmx5IGJlIHZhbGlkIHdoZW4gdGhlIEl0ZW1zQ29udHJvbCBpcyBsaXZlIGluIHRoZQ0KKyAgICAgICAgICAgIHRyZWUgYW5kIGhhcyBnZW5lcmF0ZWQgY29udGFpbmVycyBmb3Igc29tZSBvZiBpdHMgaXRlbXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSXRlbXNDb250cm9sSGVscGVyLl9zY3JvbGxIb3N0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIFNjcm9sbFZpZXdlciB0aGF0IGlzIHVzZWQgdG8gc2Nyb2xsIHRoZSBpdGVtcyBpbiB0aGUgSXRlbXNIb3N0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkl0ZW1zQ29udHJvbEhlbHBlci4jY3RvcihTeXN0ZW0uV2luZG93cy5Db250cm9scy5JdGVtc0NvbnRyb2wpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgSXRlbUNvbnRhaW5lckdlbmVyYXRvci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbnRyb2wiPg0KKyAgICAgICAgICAgIFRoZSBJdGVtc0NvbnRyb2wgYmVpbmcgdHJhY2tlZCBieSB0aGUgSXRlbUNvbnRhaW5lckdlbmVyYXRvci4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSXRlbXNDb250cm9sSGVscGVyLk9uQXBwbHlUZW1wbGF0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbHkgYSBjb250cm9sIHRlbXBsYXRlIHRvIHRoZSBJdGVtc0NvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSXRlbXNDb250cm9sSGVscGVyLlByZXBhcmVDb250YWluZXJGb3JJdGVtT3ZlcnJpZGUoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCxTeXN0ZW0uV2luZG93cy5TdHlsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByZXBhcmVzIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIHRvIGRpc3BsYXkgdGhlIHNwZWNpZmllZCBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+DQorICAgICAgICAgICAgQ29udGFpbmVyIGVsZW1lbnQgdXNlZCB0byBkaXNwbGF5IHRoZSBzcGVjaWZpZWQgaXRlbS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJlbnRJdGVtQ29udGFpbmVyU3R5bGUiPg0KKyAgICAgICAgICAgIFRoZSBJdGVtQ29udGFpbmVyU3R5bGUgZm9yIHRoZSBwYXJlbnQgSXRlbXNDb250cm9sLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JdGVtc0NvbnRyb2xIZWxwZXIuVXBkYXRlSXRlbUNvbnRhaW5lclN0eWxlKFN5c3RlbS5XaW5kb3dzLlN0eWxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVXBkYXRlIHRoZSBzdHlsZSBvZiBhbnkgZ2VuZXJhdGVkIGl0ZW1zIHdoZW4gdGhlIEl0ZW1Db250YWluZXJTdHlsZQ0KKyAgICAgICAgICAgIGhhcyBiZWVuIGNoYW5nZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpdGVtQ29udGFpbmVyU3R5bGUiPlRoZSBJdGVtQ29udGFpbmVyU3R5bGUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBTaWx2ZXJsaWdodCBkb2VzIG5vdCBzdXBwb3J0IHNldHRpbmcgYSBTdHlsZSBtdWx0aXBsZSB0aW1lcywgc28gd2UNCisgICAgICAgICAgICBvbmx5IGF0dGVtcHQgdG8gc2V0IHN0eWxlcyBvbiBlbGVtZW50cyB3aG9zZSBzdHlsZSBoYXNuJ3QgYWxyZWFkeQ0KKyAgICAgICAgICAgIGJlZW4gc2V0Lg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkl0ZW1zQ29udHJvbEhlbHBlci5TY3JvbGxJbnRvVmlldyhTeXN0ZW0uV2luZG93cy5GcmFtZXdvcmtFbGVtZW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2Nyb2xsIHRoZSBkZXNpcmVkIGVsZW1lbnQgaW50byB0aGUgU2Nyb2xsSG9zdCdzIHZpZXdwb3J0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+RWxlbWVudCB0byBzY3JvbGwgaW50byB2aWV3LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JdGVtc0NvbnRyb2xIZWxwZXIuSXRlbXNDb250cm9sIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIEl0ZW1zQ29udHJvbCBiZWluZyB0cmFja2VkIGJ5IHRoZQ0KKyAgICAgICAgICAgIEl0ZW1Db250YWluZXJHZW5lcmF0b3IuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSXRlbXNDb250cm9sSGVscGVyLkl0ZW1zSG9zdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIFBhbmVsIHRoYXQgaXMgdXNlZCBhcyB0aGUgSXRlbXNIb3N0IG9mIHRoZSBJdGVtc0NvbnRyb2wuDQorICAgICAgICAgICAgVGhpcyBwcm9wZXJ0eSB3aWxsIG9ubHkgYmUgdmFsaWQgd2hlbiB0aGUgSXRlbXNDb250cm9sIGlzIGxpdmUgaW4NCisgICAgICAgICAgICB0aGUgdHJlZSBhbmQgaGFzIGdlbmVyYXRlZCBjb250YWluZXJzIGZvciBzb21lIG9mIGl0cyBpdGVtcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JdGVtc0NvbnRyb2xIZWxwZXIuU2Nyb2xsSG9zdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIFNjcm9sbFZpZXdlciB0aGF0IGlzIHVzZWQgdG8gc2Nyb2xsIHRoZSBpdGVtcyBpbiB0aGUNCisgICAgICAgICAgICBJdGVtc0hvc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuTnVtZXJpY0V4dGVuc2lvbnMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE51bWVyaWMgdXRpbGl0eSBtZXRob2RzIHVzZWQgYnkgY29udHJvbHMuICBUaGVzZSBtZXRob2RzIGFyZSBzaW1pbGFyIGluDQorICAgICAgICAgICAgc2NvcGUgdG8gdGhlIFdQRiBEb3VibGVVdGlsIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLk51bWVyaWNFeHRlbnNpb25zLklzWmVybyhTeXN0ZW0uRG91YmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2hlY2sgaWYgYSBudW1iZXIgaXMgemVyby4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgbnVtYmVyIHRvIGNoZWNrLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBpZiB0aGUgbnVtYmVyIGlzIHplcm8sIGZhbHNlIG90aGVyd2lzZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5OdW1lcmljRXh0ZW5zaW9ucy5Jc05hTihTeXN0ZW0uRG91YmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2hlY2sgaWYgYSBudW1iZXIgaXNuJ3QgcmVhbGx5IGEgbnVtYmVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBudW1iZXIgdG8gY2hlY2suPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUcnVlIGlmIHRoZSBudW1iZXIgaXMgbm90IGEgbnVtYmVyLCBmYWxzZSBpZiBpdCBpcyBhIG51bWJlci4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5OdW1lcmljRXh0ZW5zaW9ucy5Jc0dyZWF0ZXJUaGFuKFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERldGVybWluZSBpZiBvbmUgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiBhbm90aGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibGVmdCI+Rmlyc3QgbnVtYmVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJpZ2h0Ij5TZWNvbmQgbnVtYmVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVHJ1ZSBpZiB0aGUgZmlyc3QgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLCBmYWxzZQ0KKyAgICAgICAgICAgIG90aGVyd2lzZS4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5OdW1lcmljRXh0ZW5zaW9ucy5Jc0xlc3NUaGFuT3JDbG9zZShTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZXRlcm1pbmUgaWYgb25lIG51bWJlciBpcyBsZXNzIHRoYW4gb3IgY2xvc2UgdG8gYW5vdGhlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImxlZnQiPkZpcnN0IG51bWJlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyaWdodCI+U2Vjb25kIG51bWJlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRydWUgaWYgdGhlIGZpcnN0IG51bWJlciBpcyBsZXNzIHRoYW4gb3IgY2xvc2UgdG8gdGhlIHNlY29uZCwgZmFsc2UNCisgICAgICAgICAgICBvdGhlcndpc2UuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuTnVtZXJpY0V4dGVuc2lvbnMuQXJlQ2xvc2UoU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGV0ZXJtaW5lIGlmIHR3byBudW1iZXJzIGFyZSBjbG9zZSBpbiB2YWx1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImxlZnQiPkZpcnN0IG51bWJlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyaWdodCI+U2Vjb25kIG51bWJlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRydWUgaWYgdGhlIGZpcnN0IG51bWJlciBpcyBjbG9zZSBpbiB2YWx1ZSB0byB0aGUgc2Vjb25kLCBmYWxzZQ0KKyAgICAgICAgICAgIG90aGVyd2lzZS4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5OdW1lcmljRXh0ZW5zaW9ucy5OYW5VbmlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTmFuVW5pb24gaXMgYSBDKysgc3R5bGUgdHlwZSB1bmlvbiB1c2VkIGZvciBlZmZpY2llbnRseSBjb252ZXJ0aW5nDQorICAgICAgICAgICAgYSBkb3VibGUgaW50byBhbiB1bnNpZ25lZCBsb25nLCB3aG9zZSBiaXRzIGNhbiBiZSBlYXNpbHkNCisgICAgICAgICAgICBtYW5pcHVsYXRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5OdW1lcmljRXh0ZW5zaW9ucy5OYW5Vbmlvbi5GbG9hdGluZ1ZhbHVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGbG9hdGluZyBwb2ludCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5pb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuTnVtZXJpY0V4dGVuc2lvbnMuTmFuVW5pb24uSW50ZWdlclZhbHVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bmlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5Sb3V0ZWRQcm9wZXJ0eUNoYW5naW5nRXZlbnRBcmdzYDEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb3ZpZGVzIGV2ZW50IGRhdGEgZm9yIHZhcmlvdXMgcm91dGVkIGV2ZW50cyB0aGF0IHRyYWNrIHByb3BlcnR5IHZhbHVlcw0KKyAgICAgICAgICAgIGNoYW5naW5nLiAgVHlwaWNhbGx5IHRoZSBldmVudHMgZGVub3RlIGEgY2FuY2VsbGFibGUgYWN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPg0KKyAgICAgICAgICAgIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBmb3IgdGhlIGRlcGVuZGVuY3kgcHJvcGVydHkgdGhhdCBpcyBjaGFuZ2luZy4NCisgICAgICAgICAgICA8L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8UXVhbGl0eUJhbmQ+UHJldmlldzwvUXVhbGl0eUJhbmQ+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5Sb3V0ZWRQcm9wZXJ0eUNoYW5naW5nRXZlbnRBcmdzYDEuX2NhbmNlbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJpdmF0ZSBtZW1iZXIgdmFyaWFibGUgZm9yIENhbmNlbCBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5Sb3V0ZWRQcm9wZXJ0eUNoYW5naW5nRXZlbnRBcmdzYDEuI2N0b3IoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeVByb3BlcnR5LGAwLGAwLFN5c3RlbS5Cb29sZWFuKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlJvdXRlZFByb3BlcnR5Q2hhbmdpbmdFdmVudEFyZ3NgMSIgLz4NCisgICAgICAgICAgICBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InByb3BlcnR5Ij4NCisgICAgICAgICAgICBUaGUgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lQcm9wZXJ0eSIgLz4gaWRlbnRpZmllcg0KKyAgICAgICAgICAgIGZvciB0aGUgcHJvcGVydHkgdGhhdCBpcyBjaGFuZ2luZy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJvbGRWYWx1ZSI+VGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJuZXdWYWx1ZSI+DQorICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIGFzc3VtaW5nIHRoYXQgdGhlIHByb3BlcnR5IGNoYW5nZSBpcw0KKyAgICAgICAgICAgIG5vdCBjYW5jZWxsZWQuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXNDYW5jZWxhYmxlIj4NCisgICAgICAgICAgICBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgaXMgY2FuY2VsbGFibGUgYnkgc2V0dGluZw0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5Sb3V0ZWRQcm9wZXJ0eUNoYW5naW5nRXZlbnRBcmdzYDEuQ2FuY2VsIiAvPg0KKyAgICAgICAgICAgIHRvIHRydWUgaW4gZXZlbnQgaGFuZGxpbmcuIGZhbHNlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgaXMgbm90DQorICAgICAgICAgICAgY2FuY2VsbGFibGUuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlJvdXRlZFByb3BlcnR5Q2hhbmdpbmdFdmVudEFyZ3NgMS5Qcm9wZXJ0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lQcm9wZXJ0eSIgLz4NCisgICAgICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgcHJvcGVydHkgdGhhdCBpcyBjaGFuZ2luZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPg0KKyAgICAgICAgICAgIFRoZSA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeVByb3BlcnR5IiAvPiBpZGVudGlmaWVyDQorICAgICAgICAgICAgZm9yIHRoZSBwcm9wZXJ0eSB0aGF0IGlzIGNoYW5naW5nLg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5Sb3V0ZWRQcm9wZXJ0eUNoYW5naW5nRXZlbnRBcmdzYDEuT2xkVmFsdWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSB0aGF0IHJlcG9ydHMgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBjaGFuZ2luZw0KKyAgICAgICAgICAgIHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBjaGFuZ2luZyBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuUm91dGVkUHJvcGVydHlDaGFuZ2luZ0V2ZW50QXJnc2AxLk5ld1ZhbHVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSB0aGF0IHJlcG9ydHMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2hhbmdpbmcNCisgICAgICAgICAgICBwcm9wZXJ0eSwgYXNzdW1pbmcgdGhhdCB0aGUgcHJvcGVydHkgY2hhbmdlIGlzIG5vdCBjYW5jZWxsZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT4NCisgICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBjaGFuZ2luZyBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuUm91dGVkUHJvcGVydHlDaGFuZ2luZ0V2ZW50QXJnc2AxLklzQ2FuY2VsYWJsZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgcHJvcGVydHkgY2hhbmdlIHRoYXQgb3JpZ2luYXRlZA0KKyAgICAgICAgICAgIHRoZSBSb3V0ZWRQcm9wZXJ0eUNoYW5naW5nIGV2ZW50IGlzIGNhbmNlbGxhYmxlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVHJ1ZSBpZiB0aGUgcHJvcGVydHkgY2hhbmdlIGlzIGNhbmNlbGxhYmxlLiBmYWxzZSBpZiB0aGUgcHJvcGVydHkNCisgICAgICAgICAgICBjaGFuZ2UgaXMgbm90IGNhbmNlbGxhYmxlLg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5Sb3V0ZWRQcm9wZXJ0eUNoYW5naW5nRXZlbnRBcmdzYDEuQ2FuY2VsIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHByb3BlcnR5IGNoYW5nZSB0aGF0DQorICAgICAgICAgICAgb3JpZ2luYXRlZCB0aGUgUm91dGVkUHJvcGVydHlDaGFuZ2luZyBldmVudCBzaG91bGQgYmUgY2FuY2VsbGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVHJ1ZSB0byBjYW5jZWwgdGhlIHByb3BlcnR5IGNoYW5nZTsgdGhpcyByZXNldHMgdGhlIHByb3BlcnR5IHRvDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlJvdXRlZFByb3BlcnR5Q2hhbmdpbmdFdmVudEFyZ3NgMS5PbGRWYWx1ZSIgLz4uDQorICAgICAgICAgICAgZmFsc2UgdG8gbm90IGNhbmNlbCB0aGUgcHJvcGVydHkgY2hhbmdlOyB0aGUgdmFsdWUgY2hhbmdlcyB0bw0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5Sb3V0ZWRQcm9wZXJ0eUNoYW5naW5nRXZlbnRBcmdzYDEuTmV3VmFsdWUiIC8+Lg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBBdHRlbXB0ZWQgdG8gY2FuY2VsIGluIGFuIGluc3RhbmNlIHdoZXJlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlJvdXRlZFByb3BlcnR5Q2hhbmdpbmdFdmVudEFyZ3NgMS5Jc0NhbmNlbGFibGUiIC8+DQorICAgICAgICAgICAgaXMgZmFsc2UuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5Sb3V0ZWRQcm9wZXJ0eUNoYW5naW5nRXZlbnRBcmdzYDEuSW5Db2VyY2lvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIGludGVybmFsIHZhbHVlIGNvZXJjaW9uIGlzDQorICAgICAgICAgICAgYWN0aW5nIG9uIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgdGhhdCBvcmlnaW5hdGVkIHRoZQ0KKyAgICAgICAgICAgIFJvdXRlZFByb3BlcnR5Q2hhbmdpbmcgZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT4NCisgICAgICAgICAgICBUcnVlIGlmIGNvZXJjaW9uIGlzIGFjdGl2ZS4gZmFsc2UgaWYgY29lcmNpb24gaXMgbm90IGFjdGl2ZS4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIFRoaXMgaXMgYSB0b3RhbCBoYWNrIHRvIHdvcmsgYXJvdW5kIHRoZSBjbGFzcyBoaWVyYXJjaHkgZm9yIFZhbHVlDQorICAgICAgICAgICAgY29lcmNpb24gaW4gTnVtZXJpY1VwRG93bi4NCisgICAgICAgICAgICA8L3JlbWFya3M+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5Sb3V0ZWRQcm9wZXJ0eUNoYW5naW5nRXZlbnRIYW5kbGVyYDEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcHJlc2VudHMgbWV0aG9kcyB0aGF0IGhhbmRsZSB2YXJpb3VzIHJvdXRlZCBldmVudHMgdGhhdCB0cmFjayBwcm9wZXJ0eQ0KKyAgICAgICAgICAgIHZhbHVlcyBjaGFuZ2luZy4gIFR5cGljYWxseSB0aGUgZXZlbnRzIGRlbm90ZSBhIGNhbmNlbGxhYmxlIGFjdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUIj4NCisgICAgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgZm9yIHRoZSBkZXBlbmRlbmN5IHByb3BlcnR5IHRoYXQgaXMgY2hhbmdpbmcuDQorICAgICAgICAgICAgPC90eXBlcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+DQorICAgICAgICAgICAgVGhlIG9iamVjdCB3aGVyZSB0aGUgaW5pdGlhdGluZyBwcm9wZXJ0eSBpcyBjaGFuZ2luZy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBkYXRhIGZvciB0aGUgZXZlbnQuPC9wYXJhbT4NCisgICAgICAgICAgICA8UXVhbGl0eUJhbmQ+UHJldmlldzwvUXVhbGl0eUJhbmQ+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5TY3JvbGxFeHRlbnNpb25zIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgU2Nyb2xsRXh0ZW5zaW9ucyBjbGFzcyBwcm92aWRlcyB1dGlsaXR5IG1ldGhvZHMgZm9yIHNjcm9sbGluZyBpdGVtcw0KKyAgICAgICAgICAgIFNjcm9sbFZpZXdlcnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuU2Nyb2xsRXh0ZW5zaW9ucy5MaW5lQ2hhbmdlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgYW1vdW50IHRvIHNjcm9sbCBhIFNjcm9sbFZpZXdlciBmb3IgYSBsaW5lIGNoYW5nZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5TY3JvbGxFeHRlbnNpb25zLlNjcm9sbEJ5VmVydGljYWxPZmZzZXQoU3lzdGVtLldpbmRvd3MuQ29udHJvbHMuU2Nyb2xsVmlld2VyLFN5c3RlbS5Eb3VibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTY3JvbGwgYSBTY3JvbGxWaWV3ZXIgdmVydGljYWxseSBieSBhIGdpdmVuIG9mZnNldC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZpZXdlciI+VGhlIFNjcm9sbFZpZXdlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJvZmZzZXQiPlRoZSB2ZXJ0aWNhbCBvZmZzZXQgdG8gc2Nyb2xsLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5TY3JvbGxFeHRlbnNpb25zLlNjcm9sbEJ5SG9yaXpvbnRhbE9mZnNldChTeXN0ZW0uV2luZG93cy5Db250cm9scy5TY3JvbGxWaWV3ZXIsU3lzdGVtLkRvdWJsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNjcm9sbCBhIFNjcm9sbFZpZXdlciBob3Jpem9udGFsbHkgYnkgYSBnaXZlbiBvZmZzZXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2aWV3ZXIiPlRoZSBTY3JvbGxWaWV3ZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5UaGUgaG9yaXpvbnRhbCBvZmZzZXQgdG8gc2Nyb2xsLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5TY3JvbGxFeHRlbnNpb25zLkxpbmVVcChTeXN0ZW0uV2luZG93cy5Db250cm9scy5TY3JvbGxWaWV3ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTY3JvbGwgdGhlIFNjcm9sbFZpZXdlciB1cCBieSBhIGxpbmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2aWV3ZXIiPlRoZSBTY3JvbGxWaWV3ZXIuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlNjcm9sbEV4dGVuc2lvbnMuTGluZURvd24oU3lzdGVtLldpbmRvd3MuQ29udHJvbHMuU2Nyb2xsVmlld2VyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2Nyb2xsIHRoZSBTY3JvbGxWaWV3ZXIgZG93biBieSBhIGxpbmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2aWV3ZXIiPlRoZSBTY3JvbGxWaWV3ZXIuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlNjcm9sbEV4dGVuc2lvbnMuTGluZUxlZnQoU3lzdGVtLldpbmRvd3MuQ29udHJvbHMuU2Nyb2xsVmlld2VyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2Nyb2xsIHRoZSBTY3JvbGxWaWV3ZXIgbGVmdCBieSBhIGxpbmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2aWV3ZXIiPlRoZSBTY3JvbGxWaWV3ZXIuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlNjcm9sbEV4dGVuc2lvbnMuTGluZVJpZ2h0KFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLlNjcm9sbFZpZXdlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNjcm9sbCB0aGUgU2Nyb2xsVmlld2VyIHJpZ2h0IGJ5IGEgbGluZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZpZXdlciI+VGhlIFNjcm9sbFZpZXdlci48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuU2Nyb2xsRXh0ZW5zaW9ucy5QYWdlVXAoU3lzdGVtLldpbmRvd3MuQ29udHJvbHMuU2Nyb2xsVmlld2VyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2Nyb2xsIHRoZSBTY3JvbGxWaWV3ZXIgdXAgYnkgYSBwYWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlld2VyIj5UaGUgU2Nyb2xsVmlld2VyLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5TY3JvbGxFeHRlbnNpb25zLlBhZ2VEb3duKFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLlNjcm9sbFZpZXdlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNjcm9sbCB0aGUgU2Nyb2xsVmlld2VyIGRvd24gYnkgYSBwYWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlld2VyIj5UaGUgU2Nyb2xsVmlld2VyLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5TY3JvbGxFeHRlbnNpb25zLlBhZ2VMZWZ0KFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLlNjcm9sbFZpZXdlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNjcm9sbCB0aGUgU2Nyb2xsVmlld2VyIGxlZnQgYnkgYSBwYWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlld2VyIj5UaGUgU2Nyb2xsVmlld2VyLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5TY3JvbGxFeHRlbnNpb25zLlBhZ2VSaWdodChTeXN0ZW0uV2luZG93cy5Db250cm9scy5TY3JvbGxWaWV3ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTY3JvbGwgdGhlIFNjcm9sbFZpZXdlciByaWdodCBieSBhIHBhZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2aWV3ZXIiPlRoZSBTY3JvbGxWaWV3ZXIuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlNjcm9sbEV4dGVuc2lvbnMuU2Nyb2xsVG9Ub3AoU3lzdGVtLldpbmRvd3MuQ29udHJvbHMuU2Nyb2xsVmlld2VyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2Nyb2xsIHRoZSBTY3JvbGxWaWV3ZXIgdG8gdGhlIHRvcC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZpZXdlciI+VGhlIFNjcm9sbFZpZXdlci48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuU2Nyb2xsRXh0ZW5zaW9ucy5TY3JvbGxUb0JvdHRvbShTeXN0ZW0uV2luZG93cy5Db250cm9scy5TY3JvbGxWaWV3ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTY3JvbGwgdGhlIFNjcm9sbFZpZXdlciB0byB0aGUgYm90dG9tLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmlld2VyIj5UaGUgU2Nyb2xsVmlld2VyLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5TY3JvbGxFeHRlbnNpb25zLkdldFRvcEFuZEJvdHRvbShTeXN0ZW0uV2luZG93cy5GcmFtZXdvcmtFbGVtZW50LFN5c3RlbS5XaW5kb3dzLkZyYW1ld29ya0VsZW1lbnQsU3lzdGVtLkRvdWJsZUAsU3lzdGVtLkRvdWJsZUApIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIHRvcCBhbmQgYm90dG9tIG9mIGFuIGVsZW1lbnQgd2l0aCByZXNwZWN0IHRvIGl0cyBwYXJlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij5UaGUgZWxlbWVudCB0byBnZXQgdGhlIHBvc2l0aW9uIG9mLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmVudCI+VGhlIHBhcmVudCBvZiB0aGUgZWxlbWVudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0b3AiPlZlcnRpY2FsIG9mZnNldCB0byB0aGUgdG9wIG9mIHRoZSBlbGVtZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImJvdHRvbSI+DQorICAgICAgICAgICAgVmVydGljYWwgb2Zmc2V0IHRvIHRoZSBib3R0b20gb2YgdGhlIGVsZW1lbnQuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlR5cGVDb252ZXJ0ZXJzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb21tb24gVHlwZUNvbnZlcnRlciBmdW5jdGlvbmFsaXR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlR5cGVDb252ZXJ0ZXJzLkNhbkNvbnZlcnRGcm9tYGAxKFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGNvbnZlcnRlciBjYW4gY29udmVydCBhbg0KKyAgICAgICAgICAgIG9iamVjdCBvZiB0aGUgZ2l2ZW4gdHlwZSB0byBhbiBpbnN0YW5jZSBvZiB0aGUgZXhwZWN0ZWQgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUIj5FeHBlY3RlZCB0eXBlIG9mIHRoZSBjb252ZXJ0ZXIuPC90eXBlcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNvdXJjZVR5cGUiPg0KKyAgICAgICAgICAgIFRoZSB0eXBlIG9mIHRoZSBzb3VyY2UgdGhhdCBpcyBiZWluZyBldmFsdWF0ZWQgZm9yIGNvbnZlcnNpb24uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29udmVydGVyIGNhbiBjb252ZXJ0IHRoZSBwcm92aWRlZA0KKyAgICAgICAgICAgIHR5cGUuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHlwZUNvbnZlcnRlcnMuQ29udmVydEZyb21gYDEoU3lzdGVtLkNvbXBvbmVudE1vZGVsLlR5cGVDb252ZXJ0ZXIsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEF0dGVtcHRzIHRvIGNvbnZlcnQgYSBzcGVjaWZpZWQgb2JqZWN0IHRvIGFuIGluc3RhbmNlIG9mIHRoZQ0KKyAgICAgICAgICAgIGV4cGVjdGVkIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVCI+RXhwZWN0ZWQgdHlwZSBvZiB0aGUgY29udmVydGVyLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb252ZXJ0ZXIiPlR5cGVDb252ZXJ0ZXIgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBvYmplY3QgYmVpbmcgY29udmVydGVkLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIGluc3RhbmNlIG9mIHRoZSBleHBlY3RlZCB0eXBlIGNyZWF0ZWQgZnJvbSB0aGUgY29udmVydGVkIG9iamVjdC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UeXBlQ29udmVydGVycy5DYW5Db252ZXJ0VG9gYDEoU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgY29udmVyc2lvbiBpcyBwb3NzaWJsZSB0byBhIHNwZWNpZmllZCB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPkV4cGVjdGVkIHR5cGUgb2YgdGhlIGNvbnZlcnRlci48L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVzdGluYXRpb25UeXBlIj4NCisgICAgICAgICAgICBJZGVudGlmaWVzIHRoZSBkYXRhIHR5cGUgdG8gZXZhbHVhdGUgZm9yIGNvbnZlcnNpb24uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBjb252ZXJzaW9uIGlzIHBvc3NpYmxlLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlR5cGVDb252ZXJ0ZXJzLkNvbnZlcnRUbyhTeXN0ZW0uQ29tcG9uZW50TW9kZWwuVHlwZUNvbnZlcnRlcixTeXN0ZW0uT2JqZWN0LFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXR0ZW1wdHMgdG8gY29udmVydCBhIHNwZWNpZmllZCBvYmplY3QgdG8gYW4gaW5zdGFuY2Ugb2YgdGhlDQorICAgICAgICAgICAgZGVzaXJlZCB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29udmVydGVyIj5UeXBlQ29udmVydGVyIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgb2JqZWN0IGJlaW5nIGNvbnZlcnRlZC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZXN0aW5hdGlvblR5cGUiPg0KKyAgICAgICAgICAgIFRoZSB0eXBlIHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBjb252ZXJzaW9uIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE5hbWVzIGFuZCBoZWxwZXJzIGZvciB2aXN1YWwgc3RhdGVzIGluIHRoZSBjb250cm9scy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuR3JvdXBDb21tb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbW1vbiBzdGF0ZSBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuU3RhdGVOb3JtYWwiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE5vcm1hbCBzdGF0ZSBvZiB0aGUgQ29tbW9uIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZVJlYWRPbmx5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBOb3JtYWwgc3RhdGUgb2YgdGhlIENvbW1vbiBzdGF0ZSBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuU3RhdGVNb3VzZU92ZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1vdXNlT3ZlciBzdGF0ZSBvZiB0aGUgQ29tbW9uIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZVByZXNzZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByZXNzZWQgc3RhdGUgb2YgdGhlIENvbW1vbiBzdGF0ZSBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuU3RhdGVEaXNhYmxlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGlzYWJsZWQgc3RhdGUgb2YgdGhlIENvbW1vbiBzdGF0ZSBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuR3JvdXBGb2N1cyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRm9jdXMgc3RhdGUgZ3JvdXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLlN0YXRlVW5mb2N1c2VkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBVbmZvY3VzZWQgc3RhdGUgb2YgdGhlIEZvY3VzIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZUZvY3VzZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZvY3VzZWQgc3RhdGUgb2YgdGhlIEZvY3VzIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5Hcm91cFNlbGVjdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2VsZWN0aW9uIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZVNlbGVjdGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZWxlY3RlZCBzdGF0ZSBvZiB0aGUgU2VsZWN0aW9uIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZVVuc2VsZWN0ZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVuc2VsZWN0ZWQgc3RhdGUgb2YgdGhlIFNlbGVjdGlvbiBzdGF0ZSBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuU3RhdGVTZWxlY3RlZEluYWN0aXZlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZWxlY3RlZCBpbmFjdGl2ZSBzdGF0ZSBvZiB0aGUgU2VsZWN0aW9uIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5Hcm91cEV4cGFuc2lvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRXhwYW5zaW9uIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZUV4cGFuZGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeHBhbmRlZCBzdGF0ZSBvZiB0aGUgRXhwYW5zaW9uIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZUNvbGxhcHNlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29sbGFwc2VkIHN0YXRlIG9mIHRoZSBFeHBhbnNpb24gc3RhdGUgZ3JvdXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLkdyb3VwUG9wdXAiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFBvcHVwIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZVBvcHVwT3BlbmVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBPcGVuZWQgc3RhdGUgb2YgdGhlIFBvcHVwIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZVBvcHVwQ2xvc2VkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDbG9zZWQgc3RhdGUgb2YgdGhlIFBvcHVwIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5Hcm91cFZhbGlkYXRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZhbGlkYXRpb25TdGF0ZXMgc3RhdGUgZ3JvdXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLlN0YXRlVmFsaWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB2YWxpZCBzdGF0ZSBmb3IgdGhlIFZhbGlkYXRpb25TdGF0ZXMgZ3JvdXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLlN0YXRlSW52YWxpZEZvY3VzZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEludmFsaWQsIGZvY3VzZWQgc3RhdGUgZm9yIHRoZSBWYWxpZGF0aW9uU3RhdGVzIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZUludmFsaWRVbmZvY3VzZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEludmFsaWQsIHVuZm9jdXNlZCBzdGF0ZSBmb3IgdGhlIFZhbGlkYXRpb25TdGF0ZXMgZ3JvdXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLkdyb3VwRXhwYW5kRGlyZWN0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeHBhbmREaXJlY3Rpb24gc3RhdGUgZ3JvdXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLlN0YXRlRXhwYW5kRG93biI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRG93biBleHBhbmQgZGlyZWN0aW9uIHN0YXRlIG9mIEV4cGFuZERpcmVjdGlvbiBzdGF0ZSBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuU3RhdGVFeHBhbmRVcCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVXAgZXhwYW5kIGRpcmVjdGlvbiBzdGF0ZSBvZiBFeHBhbmREaXJlY3Rpb24gc3RhdGUgZ3JvdXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLlN0YXRlRXhwYW5kTGVmdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTGVmdCBleHBhbmQgZGlyZWN0aW9uIHN0YXRlIG9mIEV4cGFuZERpcmVjdGlvbiBzdGF0ZSBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuU3RhdGVFeHBhbmRSaWdodCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmlnaHQgZXhwYW5kIGRpcmVjdGlvbiBzdGF0ZSBvZiBFeHBhbmREaXJlY3Rpb24gc3RhdGUgZ3JvdXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLkdyb3VwSGFzSXRlbXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhc0l0ZW1zIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZUhhc0l0ZW1zIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIYXNJdGVtcyBzdGF0ZSBvZiB0aGUgSGFzSXRlbXMgc3RhdGUgZ3JvdXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLlN0YXRlTm9JdGVtcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTm9JdGVtcyBzdGF0ZSBvZiB0aGUgSGFzSXRlbXMgc3RhdGUgZ3JvdXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLkdyb3VwSW5jcmVhc2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluY3JlbWVudCBzdGF0ZSBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuU3RhdGVJbmNyZWFzZUVuYWJsZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN0YXRlIGVuYWJsZWQgZm9yIGluY3JlbWVudCBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuU3RhdGVJbmNyZWFzZURpc2FibGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdGF0ZSBkaXNhYmxlZCBmb3IgaW5jcmVtZW50IGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5Hcm91cERlY3JlYXNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZWNyZW1lbnQgc3RhdGUgZ3JvdXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLlN0YXRlRGVjcmVhc2VFbmFibGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdGF0ZSBlbmFibGVkIGZvciBkZWNyZW1lbnQgZ3JvdXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLlN0YXRlRGVjcmVhc2VEaXNhYmxlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3RhdGUgZGlzYWJsZWQgZm9yIGRlY3JlbWVudCBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuR3JvdXBJbnRlcmFjdGlvbk1vZGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEludGVyYWN0aW9uTW9kZSBzdGF0ZSBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuU3RhdGVFZGl0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFZGl0IG9mIHRoZSBEaXNwbGF5TW9kZSBzdGF0ZSBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuU3RhdGVEaXNwbGF5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEaXNwbGF5IG9mIHRoZSBEaXNwbGF5TW9kZSBzdGF0ZSBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuR3JvdXBMb2NrZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERpc3BsYXlNb2RlIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZUxvY2tlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRWRpdCBvZiB0aGUgRGlzcGxheU1vZGUgc3RhdGUgZ3JvdXAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLlN0YXRlVW5sb2NrZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERpc3BsYXkgb2YgdGhlIERpc3BsYXlNb2RlIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZUFjdGl2ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQWN0aXZlIHN0YXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZUluYWN0aXZlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbmFjdGl2ZSBzdGF0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuR3JvdXBBY3RpdmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFjdGl2ZSBzdGF0ZSBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuU3RhdGVVbndhdGVybWFya2VkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBOb24td2F0ZXJtYXJrZWQgc3RhdGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLlN0YXRlV2F0ZXJtYXJrZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdhdGVybWFya2VkIHN0YXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5Hcm91cFdhdGVybWFyayI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV2F0ZXJtYXJrIHN0YXRlIGdyb3VwLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5TdGF0ZUNhbGVuZGFyQnV0dG9uVW5mb2N1c2VkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBVbmZvY3VzZWQgc3RhdGUgZm9yIENhbGVuZGFyIEJ1dHRvbnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLlN0YXRlQ2FsZW5kYXJCdXR0b25Gb2N1c2VkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGb2N1c2VkIHN0YXRlIGZvciBDYWxlbmRhciBCdXR0b25zLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlZpc3VhbFN0YXRlcy5Hcm91cENhbGVuZGFyQnV0dG9uRm9jdXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhbGVuZGFyQnV0dG9ucyBGb2N1cyBzdGF0ZSBncm91cC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuR29Ub1N0YXRlKFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLkNvbnRyb2wsU3lzdGVtLkJvb2xlYW4sU3lzdGVtLlN0cmluZ1tdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVXNlIFZpc3VhbFN0YXRlTWFuYWdlciB0byBjaGFuZ2UgdGhlIHZpc3VhbCBzdGF0ZSBvZiB0aGUgY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbnRyb2wiPg0KKyAgICAgICAgICAgIENvbnRyb2wgd2hvc2UgdmlzdWFsIHN0YXRlIGlzIGJlaW5nIGNoYW5nZWQuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idXNlVHJhbnNpdGlvbnMiPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHVzZSB0cmFuc2l0aW9ucyB3aGVuIHVwZGF0aW5nIHRoZQ0KKyAgICAgICAgICAgIHZpc3VhbCBzdGF0ZSwgb3IgdG8gc25hcCBkaXJlY3RseSB0byB0aGUgbmV3IHZpc3VhbCBzdGF0ZS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdGF0ZU5hbWVzIj4NCisgICAgICAgICAgICBPcmRlcmVkIGxpc3Qgb2Ygc3RhdGUgbmFtZXMgYW5kIGZhbGxiYWNrIHN0YXRlcyB0byB0cmFuc2l0aW9uIGludG8uDQorICAgICAgICAgICAgT25seSB0aGUgZmlyc3Qgc3RhdGUgdG8gYmUgZm91bmQgd2lsbCBiZSB1c2VkLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5WaXN1YWxTdGF0ZXMuR2V0SW1wbGVtZW50YXRpb25Sb290KFN5c3RlbS5XaW5kb3dzLkRlcGVuZGVuY3lPYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBpbXBsZW1lbnRhdGlvbiByb290IG9mIHRoZSBDb250cm9sLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVwZW5kZW5jeU9iamVjdCI+VGhlIERlcGVuZGVuY3lPYmplY3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBJbXBsZW1lbnRzIFNpbHZlcmxpZ2h0J3MgY29ycmVzcG9uZGluZyBpbnRlcm5hbCBwcm9wZXJ0eSBvbiBDb250cm9sLg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiByb290IG9yIG51bGwuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVmlzdWFsU3RhdGVzLlRyeUdldFZpc3VhbFN0YXRlR3JvdXAoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhpcyBtZXRob2QgdHJpZXMgdG8gZ2V0IHRoZSBuYW1lZCBWaXN1YWxTdGF0ZUdyb3VwIGZvciB0aGUgDQorICAgICAgICAgICAgZGVwZW5kZW5jeSBvYmplY3QuIFRoZSBwcm92aWRlZCBvYmplY3QncyBJbXBsZW1lbnRhdGlvblJvb3Qgd2lsbCBiZSANCisgICAgICAgICAgICBsb29rZWQgdXAgaW4gdGhpcyBjYWxsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVwZW5kZW5jeU9iamVjdCI+VGhlIGRlcGVuZGVuY3kgb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imdyb3VwTmFtZSI+VGhlIHZpc3VhbCBzdGF0ZSBncm91cCdzIG5hbWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIG51bGwgb3IgdGhlIFZpc3VhbFN0YXRlR3JvdXAgb2JqZWN0LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhpZXJhcmNoaWNhbERhdGFUZW1wbGF0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVwcmVzZW50cyBhIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5EYXRhVGVtcGxhdGUiIC8+IHRoYXQgc3VwcG9ydHMNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSGVhZGVyZWRJdGVtc0NvbnRyb2wiIC8+IG9iamVjdHMsDQorICAgICAgICAgICAgc3VjaCBhcyA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtIiAvPi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPFF1YWxpdHlCYW5kPlN0YWJsZTwvUXVhbGl0eUJhbmQ+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IaWVyYXJjaGljYWxEYXRhVGVtcGxhdGUuX2l0ZW1UZW1wbGF0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIERhdGFUZW1wbGF0ZSB0byBhcHBseSB0byB0aGUgSXRlbVRlbXBsYXRlIHByb3BlcnR5IG9uIGENCisgICAgICAgICAgICBnZW5lcmF0ZWQgSGVhZGVyZWRJdGVtc0NvbnRyb2wgKHN1Y2ggYXMgYSBNZW51SXRlbSBvciBhDQorICAgICAgICAgICAgVHJlZVZpZXdJdGVtKSwgdG8gaW5kaWNhdGUgaG93IHRvIGRpc3BsYXkgaXRlbXMgZnJvbSB0aGUgbmV4dCBsZXZlbA0KKyAgICAgICAgICAgIGluIHRoZSBkYXRhIGhpZXJhcmNoeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IaWVyYXJjaGljYWxEYXRhVGVtcGxhdGUuX2l0ZW1Db250YWluZXJTdHlsZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIFN0eWxlIHRvIGFwcGx5IHRvIHRoZSBJdGVtQ29udGFpbmVyU3R5bGUgcHJvcGVydHkgb24gYSBnZW5lcmF0ZWQNCisgICAgICAgICAgICBIZWFkZXJlZEl0ZW1zQ29udHJvbCAoc3VjaCBhcyBhIE1lbnVJdGVtIG9yIGEgVHJlZVZpZXdJdGVtKSwgdG8NCisgICAgICAgICAgICBpbmRpY2F0ZSBob3cgdG8gc3R5bGUgaXRlbXMgZnJvbSB0aGUgbmV4dCBsZXZlbCBpbiB0aGUgZGF0YQ0KKyAgICAgICAgICAgIGhpZXJhcmNoeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IaWVyYXJjaGljYWxEYXRhVGVtcGxhdGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5IaWVyYXJjaGljYWxEYXRhVGVtcGxhdGUiIC8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhpZXJhcmNoaWNhbERhdGFUZW1wbGF0ZS5JdGVtc1NvdXJjZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBjb2xsZWN0aW9uIHRoYXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBjb250ZW50IGZvciB0aGUNCisgICAgICAgICAgICBuZXh0IHN1YmxldmVsIGluIHRoZSBkYXRhIGhpZXJhcmNoeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPg0KKyAgICAgICAgICAgIFRoZSBjb2xsZWN0aW9uIHRoYXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBjb250ZW50IGZvciB0aGUgbmV4dA0KKyAgICAgICAgICAgIHN1YmxldmVsIGluIHRoZSBkYXRhIGhpZXJhcmNoeS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG51bGwuDQorICAgICAgICAgICAgPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhpZXJhcmNoaWNhbERhdGFUZW1wbGF0ZS5Jc0l0ZW1UZW1wbGF0ZVNldCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgSXRlbVRlbXBsYXRlIHByb3BlcnR5IHdhcyBzZXQgb24NCisgICAgICAgICAgICB0aGUgdGVtcGxhdGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSGllcmFyY2hpY2FsRGF0YVRlbXBsYXRlLkl0ZW1UZW1wbGF0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuRGF0YVRlbXBsYXRlIiAvPiB0bw0KKyAgICAgICAgICAgIGFwcGx5IHRvIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5JdGVtc0NvbnRyb2wuSXRlbVRlbXBsYXRlIiAvPg0KKyAgICAgICAgICAgIHByb3BlcnR5IG9uIGEgZ2VuZXJhdGVkDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhlYWRlcmVkSXRlbXNDb250cm9sIiAvPiwgc3VjaA0KKyAgICAgICAgICAgIGFzIGEgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSIgLz4sIHRvDQorICAgICAgICAgICAgaW5kaWNhdGUgaG93IHRvIGRpc3BsYXkgaXRlbXMgZnJvbSB0aGUgbmV4dCBzdWJsZXZlbCBpbiB0aGUgZGF0YQ0KKyAgICAgICAgICAgIGhpZXJhcmNoeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPg0KKyAgICAgICAgICAgIFRoZSA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuRGF0YVRlbXBsYXRlIiAvPiB0byBhcHBseSB0byB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSXRlbXNDb250cm9sLkl0ZW1UZW1wbGF0ZSIgLz4NCisgICAgICAgICAgICBwcm9wZXJ0eSBvbiBhIGdlbmVyYXRlZA0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5IZWFkZXJlZEl0ZW1zQ29udHJvbCIgLz4sIHN1Y2gNCisgICAgICAgICAgICBhcyBhIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+LCB0bw0KKyAgICAgICAgICAgIGluZGljYXRlIGhvdyB0byBkaXNwbGF5IGl0ZW1zIGZyb20gdGhlIG5leHQgc3VibGV2ZWwgaW4gdGhlIGRhdGENCisgICAgICAgICAgICBoaWVyYXJjaHkuDQorICAgICAgICAgICAgPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkhpZXJhcmNoaWNhbERhdGFUZW1wbGF0ZS5Jc0l0ZW1Db250YWluZXJTdHlsZVNldCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgSXRlbUNvbnRhaW5lclN0eWxlIHByb3BlcnR5IHdhcw0KKyAgICAgICAgICAgIHNldCBvbiB0aGUgdGVtcGxhdGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuSGllcmFyY2hpY2FsRGF0YVRlbXBsYXRlLkl0ZW1Db250YWluZXJTdHlsZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuU3R5bGUiIC8+IHRoYXQgaXMNCisgICAgICAgICAgICBhcHBsaWVkIHRvIHRoZSBpdGVtIGNvbnRhaW5lciBmb3IgZWFjaCBjaGlsZCBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVGhlIHN0eWxlIHRoYXQgaXMgYXBwbGllZCB0byB0aGUgaXRlbSBjb250YWluZXIgZm9yIGVhY2ggY2hpbGQgaXRlbS4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuRHJhZ1ZhbGlkYXRvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2xhc3MgdG8gZW5jYXBzdWxhdGUgZHJhZyBiZWhhdmlvciBmb3IgYSBVSUVsZW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5NYXR1cmU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuRHJhZ1ZhbGlkYXRvci5fdGFyZ2V0RWxlbWVudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuRHJhZ1ZhbGlkYXRvci5fc3RhcnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkRyYWdWYWxpZGF0b3IuX2RyYWdnaW5nQWN0aXZlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5EcmFnVmFsaWRhdG9yLiNjdG9yKFN5c3RlbS5XaW5kb3dzLlVJRWxlbWVudCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgRHJhZ1ZhbGlkYXRvciBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRhcmdldEVsZW1lbnQiPg0KKyAgICAgICAgICAgIFVJRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIHNvdXJjZSBvZiB0aGUgZHJhZyBvcGVyYXRpb24uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkRyYWdWYWxpZGF0b3IuVGFyZ2V0RWxlbWVudF9Nb3VzZU1vdmUoU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5JbnB1dC5Nb3VzZUV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZSB0aGUgTW91c2VNb3ZlIGV2ZW50IGZvciB0aGUgVUlFbGVtZW50IHRvIHVwZGF0ZSB0aGUgZHJhZw0KKyAgICAgICAgICAgIG9wZXJhdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+SW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+SW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQgMS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuRHJhZ1ZhbGlkYXRvci5UYXJnZXRFbGVtZW50X01vdXNlTGVmdEJ1dHRvblVwKFN5c3RlbS5PYmplY3QsU3lzdGVtLldpbmRvd3MuSW5wdXQuTW91c2VCdXR0b25FdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIYW5kbGUgdGhlIE1vdXNlTGVmdEJ1dHRvblVwIGV2ZW50IGZvciB0aGUgVUlFbGVtZW50IHRvIGNvbXBsZXRlIHRoZQ0KKyAgICAgICAgICAgIGRyYWcgb3BlcmF0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5Jbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5Jbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudCAxLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5EcmFnVmFsaWRhdG9yLlRhcmdldEVsZW1lbnRfTW91c2VMZWZ0QnV0dG9uRG93bihTeXN0ZW0uT2JqZWN0LFN5c3RlbS5XaW5kb3dzLklucHV0Lk1vdXNlQnV0dG9uRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlIHRoZSBNb3VzZUxlZnRCdXR0b25Eb3duIGV2ZW50IGZvciB0aGUgVUlFbGVtZW50IHRvIHN0YXJ0IGENCisgICAgICAgICAgICBkcmFnIG9wZXJhdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+SW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+SW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQgMS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuRHJhZ1ZhbGlkYXRvci5PbkRyYWdTdGFydGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbnZva2UgdGhlIERyYWdTdGFydGVkRXZlbnQgaGFuZGxlcnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuRHJhZ1ZhbGlkYXRvci5PbkRyYWdEZWx0YShTeXN0ZW0uV2luZG93cy5JbnB1dC5Nb3VzZUV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEludm9rZSB0aGUgRHJhZ0RlbHRhRXZlbnQgaGFuZGxlcnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5Jbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuRHJhZ1ZhbGlkYXRvci5PbkRyYWdDb21wbGV0ZWQoU3lzdGVtLldpbmRvd3MuSW5wdXQuTW91c2VFdmVudEFyZ3MsU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbnZva2UgdGhlIERyYWdDb21wbGV0ZWRFdmVudCBoYW5kbGVycy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNhbmNlbGVkIj5Jbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudCAxLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5EcmFnVmFsaWRhdG9yLkRyYWdTdGFydGVkRXZlbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE9jY3VycyB3aGVuIGEgZHJhZyBvcGVyYXRpb24gaGFzIHN0YXJ0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkU6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuRHJhZ1ZhbGlkYXRvci5EcmFnQ29tcGxldGVkRXZlbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE9jY3VycyB3aGVuIGEgZHJhZyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5EcmFnVmFsaWRhdG9yLkRyYWdEZWx0YUV2ZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBPY2N1cnMgd2hlbiBhIGRyYWcgb3BlcmF0aW9uIGhhcyBwcm9ncmVzc2VkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVwcmVzZW50cyBhIGNvbnRyb2wgdGhhdCByZWRpc3RyaWJ1dGVzIHNwYWNlIGJldHdlZW4gdGhlIHJvd3Mgb2YNCisgICAgICAgICAgICBjb2x1bW5zIG9mIGEgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWQiIC8+IGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5NYXR1cmU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcHJlc2VudHMgdGhlIGNvbnRyb2wgdGhhdCByZWRpc3RyaWJ1dGVzIHNwYWNlIGJldHdlZW4gY29sdW1ucyBvciByb3dzDQorICAgICAgICAgICAgb2YgYSBHcmlkIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5NYXR1cmU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcHJlc2VudHMgdGhlIGNvbnRyb2wgdGhhdCByZWRpc3RyaWJ1dGVzIHNwYWNlIGJldHdlZW4gY29sdW1ucyBvciByb3dzDQorICAgICAgICAgICAgb2YgYSBHcmlkIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5NYXR1cmU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcHJlc2VudHMgdGhlIGNvbnRyb2wgdGhhdCByZWRpc3RyaWJ1dGVzIHNwYWNlIGJldHdlZW4gY29sdW1ucyBvciByb3dzDQorICAgICAgICAgICAgb2YgYSBHcmlkIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5NYXR1cmU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcHJlc2VudHMgdGhlIGNvbnRyb2wgdGhhdCByZWRpc3RyaWJ1dGVzIHNwYWNlIGJldHdlZW4gY29sdW1ucyBvciByb3dzDQorICAgICAgICAgICAgb2YgYSBHcmlkIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5NYXR1cmU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcHJlc2VudHMgdGhlIGNvbnRyb2wgdGhhdCByZWRpc3RyaWJ1dGVzIHNwYWNlIGJldHdlZW4gY29sdW1ucyBvciByb3dzDQorICAgICAgICAgICAgb2YgYSBHcmlkIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5NYXR1cmU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcHJlc2VudHMgdGhlIGNvbnRyb2wgdGhhdCByZWRpc3RyaWJ1dGVzIHNwYWNlIGJldHdlZW4gY29sdW1ucyBvciByb3dzDQorICAgICAgICAgICAgb2YgYSBHcmlkIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5NYXR1cmU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcHJlc2VudHMgdGhlIGNvbnRyb2wgdGhhdCByZWRpc3RyaWJ1dGVzIHNwYWNlIGJldHdlZW4gY29sdW1ucyBvciByb3dzDQorICAgICAgICAgICAgb2YgYSBHcmlkIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5NYXR1cmU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLkVsZW1lbnRIb3Jpem9udGFsVGVtcGxhdGVOYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuRWxlbWVudFZlcnRpY2FsVGVtcGxhdGVOYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuRHJhZ0luY3JlbWVudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGVmYXVsdCBpbmNyZW1lbnQgcGFyYW1ldGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5LZXlib2FyZEluY3JlbWVudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGVmYXVsdCBpbmNyZW1lbnQgcGFyYW1ldGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5TaG93c1ByZXZpZXdQcm9wZXJ0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWRlbnRpZmllcyB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlNob3dzUHJldmlldyIgLz4NCisgICAgICAgICAgICBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgQW4gaWRlbnRpZmllciBmb3IgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5TaG93c1ByZXZpZXciIC8+DQorICAgICAgICAgICAgZGVwZW5kZW5jeSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlByZXZpZXdTdHlsZVByb3BlcnR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJZGVudGlmaWVzIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuUHJldmlld1N0eWxlIiAvPg0KKyAgICAgICAgICAgIGRlcGVuZGVuY3kgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT4NCisgICAgICAgICAgICBBbiBpZGVudGlmaWVyIGZvciB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlByZXZpZXdTdHlsZSIgLz4NCisgICAgICAgICAgICBkZXBlbmRlbmN5IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuT25Jc0VuYWJsZWRDaGFuZ2VkKFN5c3RlbS5PYmplY3QsU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeVByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhbGxlZCB3aGVuIHRoZSBJc0VuYWJsZWQgcHJvcGVydHkgY2hhbmdlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+U2VuZGVyIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5Qcm9wZXJ0eSBjaGFuZ2VkIGFyZ3MuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5fcHJldmlld0xheWVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJcyBOdWxsIHVudGlsIGEgcmVzaXplIG9wZXJhdGlvbiBpcyBpbml0aWF0ZWQgd2l0aCBTaG93c1ByZXZpZXcgPT0NCisgICAgICAgICAgICBUcnVlLCB0aGVuIGl0IHBlcnNpc3RzIGZvciB0aGUgbGlmZSBvZiB0aGUgR3JpZFNwbGl0dGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5fZHJhZ1ZhbGlkYXRvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5fY3VycmVudEdyaWRSZXNpemVEaXJlY3Rpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5faXNNb3VzZU92ZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhvbGRzIHRoZSBzdGF0ZSBmb3Igd2hldGhlciB0aGUgbW91c2UgaXMgb3ZlciB0aGUgY29udHJvbCBvciBub3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyIiAvPiBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuT25BcHBseVRlbXBsYXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCdWlsZHMgdGhlIHZpc3VhbCB0cmVlIGZvciB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyIiAvPg0KKyAgICAgICAgICAgIGNvbnRyb2wgd2hlbiBhIG5ldyB0ZW1wbGF0ZSBpcyBhcHBsaWVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5PbkNyZWF0ZUF1dG9tYXRpb25QZWVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGENCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuQXV0b21hdGlvbi5QZWVycy5HcmlkU3BsaXR0ZXJBdXRvbWF0aW9uUGVlciIgLz4NCisgICAgICAgICAgICBmb3IgdXNlIGJ5IHRoZSBTaWx2ZXJsaWdodCBhdXRvbWF0aW9uIGluZnJhc3RydWN0dXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuR3JpZFNwbGl0dGVyQXV0b21hdGlvblBlZXIiIC8+DQorICAgICAgICAgICAgZm9yIHRoZSA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyIiAvPg0KKyAgICAgICAgICAgIG9iamVjdC4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuQ2hhbmdlVmlzdWFsU3RhdGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1ldGhvZCB0byBjaGFuZ2UgdGhlIHZpc3VhbCBzdGF0ZSBvZiB0aGUgY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuQ2hhbmdlVmlzdWFsU3RhdGUoU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDaGFuZ2UgdG8gdGhlIGNvcnJlY3QgdmlzdWFsIHN0YXRlIGZvciB0aGUgR3JpZFNwbGl0dGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idXNlVHJhbnNpdGlvbnMiPg0KKyAgICAgICAgICAgIFRydWUgdG8gdXNlIHRyYW5zaXRpb25zIHdoZW4gdXBkYXRpbmcgdGhlIHZpc3VhbCBzdGF0ZSwgZmFsc2UgdG8NCisgICAgICAgICAgICBzbmFwIGRpcmVjdGx5IHRvIHRoZSBuZXcgdmlzdWFsIHN0YXRlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuRHJhZ1ZhbGlkYXRvcl9EcmFnQ29tcGxldGVkRXZlbnQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5Db250cm9scy5QcmltaXRpdmVzLkRyYWdDb21wbGV0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIYW5kbGUgdGhlIGRyYWcgY29tcGxldGVkIGV2ZW50IHRvIGNvbW1pdCBvciBjYW5jZWwgdGhlIHJlc2l6ZQ0KKyAgICAgICAgICAgIG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+SW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+SW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQgMS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLkRyYWdWYWxpZGF0b3JfRHJhZ0RlbHRhRXZlbnQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5Db250cm9scy5QcmltaXRpdmVzLkRyYWdEZWx0YUV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZSB0aGUgZHJhZyBkZWx0YSBldmVudCB0byB1cGRhdGUgdGhlIFVJIGZvciB0aGUgcmVzaXplDQorICAgICAgICAgICAgb3BlcmF0aW9uIGluIHByb2dyZXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5Jbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5Jbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudCAxLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuRHJhZ1ZhbGlkYXRvcl9EcmFnU3RhcnRlZEV2ZW50KFN5c3RlbS5PYmplY3QsU3lzdGVtLldpbmRvd3MuQ29udHJvbHMuUHJpbWl0aXZlcy5EcmFnU3RhcnRlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZSB0aGUgZHJhZyBzdGFydGVkIGV2ZW50IHRvIHN0YXJ0IGEgcmVzaXplIG9wZXJhdGlvbiBpZiB0aGUNCisgICAgICAgICAgICBjb250cm9sIGlzIGVuYWJsZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPkluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50IDEuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5HcmlkU3BsaXR0ZXJfS2V5RG93bihTeXN0ZW0uT2JqZWN0LFN5c3RlbS5XaW5kb3dzLklucHV0LktleUV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhhbmRsZSB0aGUga2V5IGRvd24gZXZlbnQgdG8gYWxsb3cga2V5Ym9hcmQgcmVzaXppbmcgb3IgY2FuY2VsaW5nIGENCisgICAgICAgICAgICByZXNpemUgb3BlcmF0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5Jbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5Jbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudCAxLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuSW5pdGlhbGl6ZUFuZE1vdmVTcGxpdHRlcihTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplIHRoZSByZXNpemUgZGF0YSBhbmQgbW92ZSB0aGUgc3BsaXR0ZXIgYnkgdGhlIHNwZWNpZmllZA0KKyAgICAgICAgICAgIGFtb3VudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imhvcml6b250YWxDaGFuZ2UiPg0KKyAgICAgICAgICAgIEhvcml6b250YWwgYW1vdW50IHRvIG1vdmUgdGhlIHNwbGl0dGVyLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZlcnRpY2FsQ2hhbmdlIj4NCisgICAgICAgICAgICBWZXJ0aWNhbCBhbW91bnQgdG8gbW92ZSB0aGUgc3BsaXR0ZXIuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5Jbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuS2V5Ym9hcmRNb3ZlU3BsaXR0ZXIoU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2FsbGVkIGJ5IGtleWJvYXJkIGV2ZW50IGhhbmRsZXIgdG8gbW92ZSB0aGUgc3BsaXR0ZXIgaWYgYWxsb3dlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imhvcml6b250YWxDaGFuZ2UiPg0KKyAgICAgICAgICAgIEhvcml6b250YWwgYW1vdW50IHRvIG1vdmUgdGhlIHNwbGl0dGVyLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZlcnRpY2FsQ2hhbmdlIj4NCisgICAgICAgICAgICBWZXJ0aWNhbCBhbW91bnQgdG8gbW92ZSB0aGUgc3BsaXR0ZXIuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5Jbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuQ3JlYXRlUHJldmlld0xheWVyKFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLkdyaWQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGVzIHRoZSBwcmV2aWV3IGxheWVyIGFuZCBhZGRzIGl0IHRvIHRoZSBwYXJlbnQgZ3JpZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmVudEdyaWQiPkdyaWQgdG8gYWRkIHRoZSBwcmV2aWV3IGxheWVyIHRvLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuU2V0dXBQcmV2aWV3Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBZGQgdGhlIHByZXZpZXcgbGF5ZXIgdG8gdGhlIEdyaWQgaWYgaXQgaXMgbm90IHRoZXJlIGFscmVhZHkgYW5kDQorICAgICAgICAgICAgdGhlbiBzaG93IHRoZSBwcmV2aWV3IGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlJlbW92ZVByZXZpZXdDb250cm9sIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZW1vdmUgdGhlIHByZXZpZXcgY29udHJvbCBmcm9tIHRoZSBwcmV2aWV3IGxheWVyIGlmIGl0IGV4aXN0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuSW5pdGlhbGl6ZURhdGEoU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplIHRoZSByZXNpemVEYXRhIG9iamVjdCB0byBob2xkIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlDQorICAgICAgICAgICAgcmVzaXplIG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNob3dzUHJldmlldyI+DQorICAgICAgICAgICAgV2hldGhlciBvciBub3QgdGhlIHByZXZpZXcgc2hvdWxkIGJlIHNob3duLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuTW92ZVNwbGl0dGVyKFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1vdmUgdGhlIHNwbGl0dGVyIGFuZCByZXNpemUgdGhlIGFmZmVjdGVkIGNvbHVtbnMgb3Igcm93cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imhvcml6b250YWxDaGFuZ2UiPg0KKyAgICAgICAgICAgIEFtb3VudCB0byByZXNpemUgaG9yaXpvbnRhbGx5Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZlcnRpY2FsQ2hhbmdlIj4NCisgICAgICAgICAgICBBbW91bnQgdG8gcmVzaXplIHZlcnRpY2FsbHkuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBPbmx5IG9uZSBvZiBob3Jpem9udGFsQ2hhbmdlIG9yIHZlcnRpY2FsQ2hhbmdlIHdpbGwgYmUgbm9uLXplcm8uDQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlNldHVwRGVmaW5pdGlvbnNUb1Jlc2l6ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGV0ZXJtaW5lIHdoaWNoIGFkamFjZW50IGNvbHVtbiBvciByb3cgZGVmaW5pdGlvbnMgbmVlZCB0byBiZQ0KKyAgICAgICAgICAgIGluY2x1ZGVkIGluIHRoZSByZXNpemUgb3BlcmF0aW9uIGFuZCBzZXQgdXAgcmVzaXplRGF0YSBhY2NvcmRpbmdseS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBpZiBpdCBpcyBhIHZhbGlkIHJlc2l6ZSBvcGVyYXRpb24uPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLkNhbmNlbFJlc2l6ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2FuY2VsIHRoZSByZXNpemUgb3BlcmF0aW9uIGluIHByb2dyZXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5HZXRBY3R1YWxMZW5ndGgoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLkRlZmluaXRpb25BYnN0cmFjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gZGVmaW5pdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlZmluaXRpb24iPg0KKyAgICAgICAgICAgIFJvdyBvciBjb2x1bW4gZGVmaW5pdGlvbiB0byBnZXQgdGhlIGFjdHVhbCBsZW5ndGggZm9yLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgSGVpZ2h0IG9mIGEgcm93IGRlZmluaXRpb24gb3Igd2lkdGggb2YgYSBjb2x1bW4gZGVmaW5pdGlvbi4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuR2V0RGVsdGFDb25zdHJhaW50cyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGV0ZXJtaW5lIHRoZSBtYXggYW5kIG1pbiB0aGF0IHRoZSB0d28gZGVmaW5pdGlvbnMgY2FuIGJlIHJlc2l6ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5HZXRFZmZlY3RpdmVSZXNpemVCZWhhdmlvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuR3JpZFJlc2l6ZURpcmVjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERldGVybWluZSB0aGUgcmVzaXplIGJlaGF2aW9yIGJhc2VkIG9uIHRoZSBnaXZlbiBkaXJlY3Rpb24gYW5kDQorICAgICAgICAgICAgYWxpZ25tZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGlyZWN0aW9uIj5Jbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50IDEuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLkdldEVmZmVjdGl2ZVJlc2l6ZURpcmVjdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGV0ZXJtaW5lIHRoZSByZXNpemUgZGlyZWN0aW9uIGJhc2VkIG9uIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbA0KKyAgICAgICAgICAgIGFsaWdubWVudHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5HZXRHcmlkRGVmaW5pdGlvbihTeXN0ZW0uV2luZG93cy5Db250cm9scy5HcmlkLFN5c3RlbS5JbnQzMixNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuR3JpZFJlc2l6ZURpcmVjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZSBhIERlZmluaXRpb25BYnN0cmFjdGlvbiBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIHJvdyBvciBjb2x1bW4NCisgICAgICAgICAgICBpbmRleCBpbiB0aGUgZ3JpZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImdyaWQiPkluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImluZGV4Ij5Jbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudCAxLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRpcmVjdGlvbiI+SW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQgMi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50IDMuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlNldExlbmd0aHMoU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0IHRoZSBsZW5ndGhzIG9mIHRoZSB0d28gZGVmaW5pdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBzcGxpdA0KKyAgICAgICAgICAgIGJlaGF2aW9yLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVmaW5pdGlvbjFQaXhlbHMiPg0KKyAgICAgICAgICAgIEluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlZmluaXRpb24yUGl4ZWxzIj4NCisgICAgICAgICAgICBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudCAxLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuU2V0RGVmaW5pdGlvbkxlbmd0aChNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuRGVmaW5pdGlvbkFic3RyYWN0aW9uLFN5c3RlbS5XaW5kb3dzLkdyaWRMZW5ndGgpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZXQgdGhlIGhlaWdodC93aWR0aCBvZiB0aGUgZ2l2ZW4gcm93L2NvbHVtbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlZmluaXRpb24iPkluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imxlbmd0aCI+SW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQgMS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLklzU3RhcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuRGVmaW5pdGlvbkFic3RyYWN0aW9uKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBkZWZpbml0aW9uIGhhcyBpdHMgc2l6ZSBzZXQgdG8gdGhlICIqIiB2YWx1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlZmluaXRpb24iPkluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+SW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQgMS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuVXBkYXRlVGVtcGxhdGVPcmllbnRhdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhpcyBjb2RlIHdpbGwgcnVuIHdoZW5ldmVyIHRoZSBlZmZlY3RpdmUgcmVzaXplIGRpcmVjdGlvbiBjaGFuZ2VzLA0KKyAgICAgICAgICAgIHRvIHVwZGF0ZSB0aGUgdGVtcGxhdGUgYmVpbmcgdXNlZCB0byBkaXNwbGF5IHRoaXMgY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuX3Rlc3RIb29rIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeHBvc2VzIHRlc3QgaG9va3MgdG8gdW5pdCB0ZXN0cyB3aXRoIGludGVybmFsIGFjY2Vzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuRWxlbWVudEhvcml6b250YWxUZW1wbGF0ZUZyYW1ld29ya0VsZW1lbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuRWxlbWVudFZlcnRpY2FsVGVtcGxhdGVGcmFtZXdvcmtFbGVtZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgSW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlJlc2l6ZURhdGFJbnRlcm5hbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSByZXNpemUgZGF0YS4gIFRoaXMgaXMgbnVsbCB1bmxlc3MgYSByZXNpemUNCisgICAgICAgICAgICBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlNob3dzUHJldmlldyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIiIC8+IGRpc3BsYXlzIGENCisgICAgICAgICAgICBwcmV2aWV3Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVHJ1ZSBpZiBhIHByZXZpZXcgaXMgZGlzcGxheWVkOyBvdGhlcndpc2UsIGZhbHNlLg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuUHJldmlld1N0eWxlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5TdHlsZSIgLz4gdGhhdCBpcyB1c2VkDQorICAgICAgICAgICAgZm9yIHByZXZpZXdpbmcgY2hhbmdlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPg0KKyAgICAgICAgICAgIFRoZSBzdHlsZSB0aGF0IGlzIHVzZWQgdG8gcHJldmlldyBjaGFuZ2VzLg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuSGFzS2V5Ym9hcmRGb2N1cyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIGNvbnRyb2wgaGFzIGtleWJvYXJkDQorICAgICAgICAgICAgZm9jdXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlRlc3RIb29rIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdGVzdCBob29rIGZvciB1bml0IHRlc3RzIHdpdGggaW50ZXJuYWwgYWNjZXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5EZWZpbml0aW9uQWJzdHJhY3Rpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByZXRlbmRzIHRvIGJlIHRoZSBiYXNlIGNsYXNzIGZvciBSb3dEZWZpbml0aW9uIGFuZCBDbGFzc0RlZmluaXRpb24NCisgICAgICAgICAgICB0eXBlcyBzbyB0aGF0IG9iamVjdHMgb2YgZWl0aGVyIHR5cGUgY2FuIGJlIHRyZWF0ZWQgYXMgb25lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8UXVhbGl0eUJhbmQ+TWF0dXJlPC9RdWFsaXR5QmFuZD4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5EZWZpbml0aW9uQWJzdHJhY3Rpb24uI2N0b3IoU3lzdGVtLldpbmRvd3MuRGVwZW5kZW5jeU9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIERlZmluaXRpb25BYnN0cmFjdGlvbiBjbGFzcyBiYXNlZCBvbg0KKyAgICAgICAgICAgIHRoZSBnaXZlbiByb3cgb3IgY29sdW1uIGRlZmluaXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWZpbml0aW9uIj4NCisgICAgICAgICAgICBSb3dEZWZpbml0aW9uIG9yIENvbHVtbkRlZmluaXRpb24gaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5EZWZpbml0aW9uQWJzdHJhY3Rpb24uQXNSb3dEZWZpbml0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBzdG9yZWQgZGVmaW5pdGlvbiBjYXN0IGFzIGEgcm93IGRlZmluaXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT5OdWxsIGlmIG5vdCBhIFJvd0RlZmluaXRpb24uPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5EZWZpbml0aW9uQWJzdHJhY3Rpb24uQXNDb2x1bW5EZWZpbml0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBzdG9yZWQgZGVmaW5pdGlvbiBjYXN0IGFzIGEgY29sdW1uIGRlZmluaXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT5OdWxsIGlmIG5vdCBhIENvbHVtbkRlZmluaXRpb24uPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5EZWZpbml0aW9uQWJzdHJhY3Rpb24uTWF4U2l6ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgTWF4SGVpZ2h0L01heFdpZHRoIGZvciB0aGUgcm93L2NvbHVtbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuRGVmaW5pdGlvbkFic3RyYWN0aW9uLk1pblNpemUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIE1pbkhlaWdodC9NaW5XaWR0aCBmb3IgdGhlIHJvdy9jb2x1bW4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLkRlZmluaXRpb25BYnN0cmFjdGlvbi5TaXplIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBIZWlnaHQvV2lkdGggZm9yIHRoZSByb3cvY29sdW1uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5Eb3VibGVVdGlsIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIGNvbGxlY3Rpb24gb2YgaGVscGVyIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBkb3VibGUgZGF0YSB0eXBlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPFF1YWxpdHlCYW5kPk1hdHVyZTwvUXVhbGl0eUJhbmQ+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuRG91YmxlVXRpbC5FcHNpbG9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFcHNpbG9uIGlzIHRoZSBzbWFsbGVzdCB2YWx1ZSBzdWNoIHRoYXQgMS4wK2Vwc2lsb24gIT0gMS4wLiAgSXQNCisgICAgICAgICAgICBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFjY2VwdGFibGUgdG9sZXJhbmNlIGZvciByb3VuZGluZw0KKyAgICAgICAgICAgIGVycm9ycy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJlbWFya3M+DQorICAgICAgICAgICAgRXBzaWxvbiBpcyBub3JtYWxseSAyLjIyMDQ0NjA0OTI1MDMxMzFFLTE2LCBidXQgU2lsdmVybGlnaHQgMg0KKyAgICAgICAgICAgIHVzZXMgZmxvYXRzIHNvIHRoZSBlZmZlY3RpdmUgZXBzaWxvbiBpcyByZWFsbHkgMS4xOTIwOTNFLTA3Lg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5Eb3VibGVVdGlsLlNjYWxhckFkanVzdG1lbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5Eb3VibGVVdGlsLkFyZUNsb3NlKFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERldGVybWluZSBpZiB0aGUgdHdvIGRvdWJsZXMgYXJlIGVmZmVjdGl2ZWx5IGVxdWFsIHdpdGhpbg0KKyAgICAgICAgICAgIHRvbGVyYW5jZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZTEiPkluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlMiI+SW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQgMS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50IDIuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLkdyaWRSZXNpemVCZWhhdmlvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5NYXR1cmU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLkdyaWRSZXNpemVCZWhhdmlvci5CYXNlZE9uQWxpZ25tZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuR3JpZFJlc2l6ZUJlaGF2aW9yLkN1cnJlbnRBbmROZXh0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuR3JpZFJlc2l6ZUJlaGF2aW9yLlByZXZpb3VzQW5kQ3VycmVudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLkdyaWRSZXNpemVCZWhhdmlvci5QcmV2aW91c0FuZE5leHQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5HcmlkUmVzaXplRGlyZWN0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPFF1YWxpdHlCYW5kPk1hdHVyZTwvUXVhbGl0eUJhbmQ+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuR3JpZFJlc2l6ZURpcmVjdGlvbi5BdXRvIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuR3JpZFJlc2l6ZURpcmVjdGlvbi5Db2x1bW5zIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuR3JpZFJlc2l6ZURpcmVjdGlvbi5Sb3dzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuUmVzaXplRGF0YSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVHlwZSB0byBob2xkIHRoZSBkYXRhIGZvciB0aGUgcmVzaXplIG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPFF1YWxpdHlCYW5kPk1hdHVyZTwvUXVhbGl0eUJhbmQ+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuUmVzaXplRGF0YS5QcmV2aWV3Q29udHJvbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIEluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5SZXNpemVEYXRhLkRlZmluaXRpb24xIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgSW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlJlc2l6ZURhdGEuRGVmaW5pdGlvbjFJbmRleCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIEluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5SZXNpemVEYXRhLkRlZmluaXRpb24yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgSW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlJlc2l6ZURhdGEuRGVmaW5pdGlvbjJJbmRleCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIEluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5SZXNpemVEYXRhLkdyaWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuUmVzaXplRGF0YS5NYXhDaGFuZ2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuUmVzaXplRGF0YS5NaW5DaGFuZ2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuUmVzaXplRGF0YS5PcmlnaW5hbERlZmluaXRpb24xQWN0dWFsTGVuZ3RoIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgSW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlJlc2l6ZURhdGEuT3JpZ2luYWxEZWZpbml0aW9uMUxlbmd0aCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIEluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5SZXNpemVEYXRhLk9yaWdpbmFsRGVmaW5pdGlvbjJBY3R1YWxMZW5ndGgiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuUmVzaXplRGF0YS5PcmlnaW5hbERlZmluaXRpb24yTGVuZ3RoIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgSW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlJlc2l6ZURhdGEuUmVzaXplQmVoYXZpb3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuUmVzaXplRGF0YS5SZXNpemVEaXJlY3Rpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuUmVzaXplRGF0YS5TaG93c1ByZXZpZXciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuUmVzaXplRGF0YS5TcGxpdEJlaGF2aW9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgSW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlJlc2l6ZURhdGEuU3BsaXR0ZXJJbmRleCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIEluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5SZXNpemVEYXRhLlNwbGl0dGVyTGVuZ3RoIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgSW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlNwbGl0QmVoYXZpb3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8UXVhbGl0eUJhbmQ+TWF0dXJlPC9RdWFsaXR5QmFuZD4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5TcGxpdEJlaGF2aW9yLlNwbGl0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuU3BsaXRCZWhhdmlvci5SZXNpemVEZWZpbml0aW9uMSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLlNwbGl0QmVoYXZpb3IuUmVzaXplRGVmaW5pdGlvbjIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5JbnRlcm5hbFRlc3RIb29rIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeHBvc2UgdGVzdCBob29rcyBmb3IgaW50ZXJuYWwgYW5kIHByaXZhdGUgbWVtYmVycyBvZiB0aGUNCisgICAgICAgICAgICBHcmlkU3BsaXR0ZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLkludGVybmFsVGVzdEhvb2suX2dyaWRTcGxpdHRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVmZXJlbmNlIHRvIHRoZSBvdXRlciAncGFyZW50JyBHcmlkU3BsaXR0ZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLkludGVybmFsVGVzdEhvb2suI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEludGVybmFsVGVzdEhvb2sgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJncmlkU3BsaXR0ZXIiPlRoZSBncmlkIHNwbGl0dGVyIHRvIGhvb2suPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5JbnRlcm5hbFRlc3RIb29rLkRyYWdWYWxpZGF0b3JfRHJhZ0NvbXBsZXRlZEV2ZW50KFN5c3RlbS5PYmplY3QsU3lzdGVtLldpbmRvd3MuQ29udHJvbHMuUHJpbWl0aXZlcy5EcmFnQ29tcGxldGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2ltdWxhdGUgdGhlIERyYWdWYWxpZGF0b3IncyBEcmFnQ29tcGxldGVkIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgc2VuZGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPkV2ZW50IGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLkludGVybmFsVGVzdEhvb2suRHJhZ1ZhbGlkYXRvcl9EcmFnRGVsdGFFdmVudChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5XaW5kb3dzLkNvbnRyb2xzLlByaW1pdGl2ZXMuRHJhZ0RlbHRhRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2ltdWxhdGUgdGhlIERyYWdWYWxpZGF0b3IncyBEcmFnRGVsdGEgZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBzZW5kZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZSI+RXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIuSW50ZXJuYWxUZXN0SG9vay5EcmFnVmFsaWRhdG9yX0RyYWdTdGFydGVkRXZlbnQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5Db250cm9scy5QcmltaXRpdmVzLkRyYWdTdGFydGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2ltdWxhdGUgdGhlIERyYWdWYWxpZGF0b3IncyBEcmFnU3RhcnRlZCBldmVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNlbmRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5FdmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5JbnRlcm5hbFRlc3RIb29rLktleWJvYXJkTW92ZVNwbGl0dGVyKFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNpbXVsYXRlIHVzaW5nIHRoZSBrZXlib2FyZCB0byBtb3ZlIHRoZSBzcGxpdHRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imhvcml6b250YWxDaGFuZ2UiPkhvcml6b250YWwgY2hhbmdlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZlcnRpY2FsQ2hhbmdlIj5WZXJ0aWNhbCBjaGFuZ2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3BsaXR0ZXIgd2FzIG1vdmVkLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlci5JbnRlcm5hbFRlc3RIb29rLkdyaWRSZXNpemVEaXJlY3Rpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIEdyaWRTcGxpdHRlcidzIEdyaWRSZXNpemVEaXJlY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLkludGVybmFsVGVzdEhvb2suUHJldmlld0xheWVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBHcmlkU3BsaXR0ZXIncyBQcmV2aWV3TGF5ZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyLkludGVybmFsVGVzdEhvb2suUmVzaXplRGF0YSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgR3JpZFNwbGl0dGVyJ3MgUmVzaXplRGF0YS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXJBdXRvbWF0aW9uUGVlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRXhwb3NlcyA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyIiAvPiB0eXBlcyB0bw0KKyAgICAgICAgICAgIFVJIGF1dG9tYXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5NYXR1cmU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyQXV0b21hdGlvblBlZXIuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuR3JpZFNwbGl0dGVyQXV0b21hdGlvblBlZXIiIC8+DQorICAgICAgICAgICAgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJvd25lciI+DQorICAgICAgICAgICAgVGhlIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIiIC8+IHRvDQorICAgICAgICAgICAgYXNzb2NpYXRlIHdpdGggdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuR3JpZFNwbGl0dGVyQXV0b21hdGlvblBlZXIiIC8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXJBdXRvbWF0aW9uUGVlci5HZXRBdXRvbWF0aW9uQ29udHJvbFR5cGVDb3JlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBjb250cm9sIHR5cGUgZm9yIHRoZSBlbGVtZW50IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBVSQ0KKyAgICAgICAgICAgIEF1dG9tYXRpb24gcGVlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIGNvbnRyb2wgdHlwZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXJBdXRvbWF0aW9uUGVlci5HZXRDbGFzc05hbWVDb3JlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDYWxsZWQgYnkgR2V0Q2xhc3NOYW1lIHRoYXQgZ2V0cyBhIGh1bWFuIHJlYWRhYmxlIG5hbWUgdGhhdCwgaW4NCisgICAgICAgICAgICBhZGRpdGlvbiB0byBBdXRvbWF0aW9uQ29udHJvbFR5cGUsICBkaWZmZXJlbnRpYXRlcyB0aGUgY29udHJvbA0KKyAgICAgICAgICAgIHJlcHJlc2VudGVkIGJ5IHRoaXMgQXV0b21hdGlvblBlZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRoZSBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUgbmFtZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXJBdXRvbWF0aW9uUGVlci5HZXRQYXR0ZXJuKFN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuUGF0dGVybkludGVyZmFjZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGNvbnRyb2wgcGF0dGVybiBmb3IgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLkdyaWRTcGxpdHRlciIgLz4gdGhhdCBpcw0KKyAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuR3JpZFNwbGl0dGVyQXV0b21hdGlvblBlZXIiIC8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGF0dGVybkludGVyZmFjZSI+DQorICAgICAgICAgICAgT25lIG9mIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZXMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICBUaGUgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgcGF0dGVybiBpbnRlcmZhY2UsIG9yIG51bGwgaWYgdGhlDQorICAgICAgICAgICAgc3BlY2lmaWVkIHBhdHRlcm4gaW50ZXJmYWNlIGlzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGlzIHBlZXIuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyQXV0b21hdGlvblBlZXIuU3lzdGVtI1dpbmRvd3MjQXV0b21hdGlvbiNQcm92aWRlciNJVHJhbnNmb3JtUHJvdmlkZXIjTW92ZShTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNb3ZlcyB0aGUgY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IngiPg0KKyAgICAgICAgICAgIEFic29sdXRlIHNjcmVlbiBjb29yZGluYXRlcyBvZiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBjb250cm9sLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InkiPg0KKyAgICAgICAgICAgIEFic29sdXRlIHNjcmVlbiBjb29yZGluYXRlcyBvZiB0aGUgdG9wIG9mIHRoZSBjb250cm9sLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXJBdXRvbWF0aW9uUGVlci5TeXN0ZW0jV2luZG93cyNBdXRvbWF0aW9uI1Byb3ZpZGVyI0lUcmFuc2Zvcm1Qcm92aWRlciNSZXNpemUoU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVzaXplcyB0aGUgY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndpZHRoIj5UaGUgbmV3IHdpZHRoIG9mIHRoZSB3aW5kb3csIGluIHBpeGVscy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJoZWlnaHQiPg0KKyAgICAgICAgICAgIFRoZSBuZXcgaGVpZ2h0IG9mIHRoZSB3aW5kb3csIGluIHBpeGVscy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyQXV0b21hdGlvblBlZXIuU3lzdGVtI1dpbmRvd3MjQXV0b21hdGlvbiNQcm92aWRlciNJVHJhbnNmb3JtUHJvdmlkZXIjUm90YXRlKFN5c3RlbS5Eb3VibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSb3RhdGVzIHRoZSBjb250cm9sLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVncmVlcyI+DQorICAgICAgICAgICAgVGhlIG51bWJlciBvZiBkZWdyZWVzIHRvIHJvdGF0ZSB0aGUgY29udHJvbC4gQSBwb3NpdGl2ZSBudW1iZXINCisgICAgICAgICAgICByb3RhdGVzIGNsb2Nrd2lzZTsgYSBuZWdhdGl2ZSBudW1iZXIgcm90YXRlcyBjb3VudGVyY2xvY2t3aXNlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXJBdXRvbWF0aW9uUGVlci5TeXN0ZW0jV2luZG93cyNBdXRvbWF0aW9uI1Byb3ZpZGVyI0lUcmFuc2Zvcm1Qcm92aWRlciNDYW5Nb3ZlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb250cm9sIGNhbiBiZSBtb3ZlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPg0KKyAgICAgICAgICAgIFRydWUgaWYgdGhlIGVsZW1lbnQgY2FuIGJlIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXJBdXRvbWF0aW9uUGVlci5TeXN0ZW0jV2luZG93cyNBdXRvbWF0aW9uI1Byb3ZpZGVyI0lUcmFuc2Zvcm1Qcm92aWRlciNDYW5SZXNpemUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFVJIGF1dG9tYXRpb24gZWxlbWVudCBjYW4gYmUNCisgICAgICAgICAgICByZXNpemVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVHJ1ZSBpZiB0aGUgZWxlbWVudCBjYW4gYmUgcmVzaXplZDsgb3RoZXJ3aXNlLCBmYWxzZS4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuR3JpZFNwbGl0dGVyQXV0b21hdGlvblBlZXIuU3lzdGVtI1dpbmRvd3MjQXV0b21hdGlvbiNQcm92aWRlciNJVHJhbnNmb3JtUHJvdmlkZXIjQ2FuUm90YXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb250cm9sIGNhbiBiZSByb3RhdGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgVHJ1ZSBpZiB0aGUgZWxlbWVudCBjYW4gYmUgcm90YXRlZDsgb3RoZXJ3aXNlLCBmYWxzZS4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuUHJldmlld0NvbnRyb2wiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcHJlc2VudHMgdGhlIGNvbnRyb2wgdGhhdCBzaG93cyBhIHByZXZpZXcgb2YgdGhlIEdyaWRTcGxpdHRlcidzDQorICAgICAgICAgICAgcmVkaXN0cmlidXRpb24gb2Ygc3BhY2UgYmV0d2VlbiBjb2x1bW5zIG9yIHJvd3Mgb2YgYSBHcmlkIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5NYXR1cmU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuUHJldmlld0NvbnRyb2wuRWxlbWVudEhvcml6b250YWxUZW1wbGF0ZU5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaGVyaXRlZCBjb2RlOiBSZXF1aXJlcyBjb21tZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlByZXZpZXdDb250cm9sLkVsZW1lbnRWZXJ0aWNhbFRlbXBsYXRlTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5oZXJpdGVkIGNvZGU6IFJlcXVpcmVzIGNvbW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuUHJldmlld0NvbnRyb2wuX2N1cnJlbnRHcmlkUmVzaXplRGlyZWN0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJcyBOdWxsIHVudGlsIHRoZSBQcmV2aWV3Q29udHJvbCBpcyBib3VuZCB0byBhIEdyaWRTcGxpdHRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5QcmV2aWV3Q29udHJvbC5fZ3JpZFNwbGl0dGVyT3JpZ2luIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUcmFja3MgdGhlIGJvdW5kIEdyaWRTcGxpdHRlcidzIGxvY2F0aW9uIGZvciBjYWxjdWxhdGluZyB0aGUNCisgICAgICAgICAgICBQcmV2aWV3Q29udHJvbCdzIG9mZnNldC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5QcmV2aWV3Q29udHJvbC4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5zdGFudGlhdGUgdGhlIFByZXZpZXdDb250cm9sLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlByZXZpZXdDb250cm9sLk9uQXBwbHlUZW1wbGF0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2FsbGVkIHdoZW4gdGVtcGxhdGUgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuUHJldmlld0NvbnRyb2wuQmluZChNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5HcmlkU3BsaXR0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCaW5kIHRoZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcHJldmlldyBjb250cm9sIHRvIHRoZSBhc3NvY2lhdGVkDQorICAgICAgICAgICAgZ3JpZCBzcGxpdHRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImdyaWRTcGxpdHRlciI+R3JpZFNwbGl0dGVyIGluc3RhbmNlIHRvIHRhcmdldC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuUHJldmlld0NvbnRyb2wuRWxlbWVudEhvcml6b250YWxUZW1wbGF0ZUZyYW1ld29ya0VsZW1lbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5QcmV2aWV3Q29udHJvbC5FbGVtZW50VmVydGljYWxUZW1wbGF0ZUZyYW1ld29ya0VsZW1lbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyBJbmhlcml0ZWQgY29kZTogUmVxdWlyZXMgY29tbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5QcmV2aWV3Q29udHJvbC5PZmZzZXRYIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIHgtYXhpcyBvZmZzZXQgZm9yIHRoZSB1bmRlcmx5aW5nIHJlbmRlciB0cmFuc2Zvcm0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuUHJldmlld0NvbnRyb2wuT2Zmc2V0WSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSB5LWF4aXMgb2Zmc2V0IGZvciB0aGUgdW5kZXJseWluZyByZW5kZXIgdHJhbnNmb3JtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3QXV0b21hdGlvblBlZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEV4cG9zZXMgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3IiAvPiB0eXBlcyB0byBVSQ0KKyAgICAgICAgICAgIGF1dG9tYXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5TdGFibGU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdBdXRvbWF0aW9uUGVlci4jY3RvcihNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5BdXRvbWF0aW9uLlBlZXJzLlRyZWVWaWV3QXV0b21hdGlvblBlZXIiIC8+DQorICAgICAgICAgICAgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJvd25lciI+DQorICAgICAgICAgICAgVGhlIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldyIgLz4gdG8gYXNzb2NpYXRlDQorICAgICAgICAgICAgd2l0aCB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuQXV0b21hdGlvbi5QZWVycy5UcmVlVmlld0F1dG9tYXRpb25QZWVyIiAvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdBdXRvbWF0aW9uUGVlci5HZXRBdXRvbWF0aW9uQ29udHJvbFR5cGVDb3JlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBjb250cm9sIHR5cGUgZm9yIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldyIgLz4gdGhhdCBpcyBhc3NvY2lhdGVkDQorICAgICAgICAgICAgd2l0aCB0aGlzDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuVHJlZVZpZXdBdXRvbWF0aW9uUGVlciIgLz4uDQorICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5DQorICAgICAgICAgICAgPHNlZSBjcmVmPSJNOlN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuQXV0b21hdGlvblBlZXIuR2V0QXV0b21hdGlvbkNvbnRyb2xUeXBlIiAvPi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJGOlN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuQXV0b21hdGlvbkNvbnRyb2xUeXBlLlRyZWUiIC8+DQorICAgICAgICAgICAgZW51bWVyYXRpb24gdmFsdWUuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdBdXRvbWF0aW9uUGVlci5HZXRDbGFzc05hbWVDb3JlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBuYW1lIG9mIHRoZQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlldyIgLz4gdGhhdCBpcyBhc3NvY2lhdGVkDQorICAgICAgICAgICAgd2l0aCANCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuQXV0b21hdGlvbi5QZWVycy5UcmVlVmlld0F1dG9tYXRpb25QZWVyIiAvPi4NCisgICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkNCisgICAgICAgICAgICA8c2VlIGNyZWY9Ik06U3lzdGVtLldpbmRvd3MuQXV0b21hdGlvbi5QZWVycy5BdXRvbWF0aW9uUGVlci5HZXRDbGFzc05hbWUiIC8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5BIHN0cmluZyB0aGF0IGNvbnRhaW5zIFRyZWVWaWV3LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3QXV0b21hdGlvblBlZXIuR2V0UGF0dGVybihTeXN0ZW0uV2luZG93cy5BdXRvbWF0aW9uLlBlZXJzLlBhdHRlcm5JbnRlcmZhY2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgY29udHJvbCBwYXR0ZXJuIGZvciB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXciIC8+IHRoYXQgaXMgYXNzb2NpYXRlZA0KKyAgICAgICAgICAgIHdpdGggdGhpcw0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5BdXRvbWF0aW9uLlBlZXJzLlRyZWVWaWV3QXV0b21hdGlvblBlZXIiIC8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGF0dGVybkludGVyZmFjZSI+DQorICAgICAgICAgICAgT25lIG9mIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZXMgdGhhdCBpbmRpY2F0ZXMgdGhlIGNvbnRyb2wgcGF0dGVybi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRoZSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBwYXR0ZXJuIGludGVyZmFjZSwgb3IgbnVsbCBpZiB0aGUNCisgICAgICAgICAgICBzcGVjaWZpZWQgcGF0dGVybiBpbnRlcmZhY2UgaXMgbm90IGltcGxlbWVudGVkIGJ5IHRoaXMgcGVlci4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0F1dG9tYXRpb25QZWVyLkdldENoaWxkcmVuQ29yZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgY29sbGVjdGlvbiBvZiBjaGlsZCBlbGVtZW50cyBvZiB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXciIC8+IHRoYXQgaXMgYXNzb2NpYXRlZA0KKyAgICAgICAgICAgIHdpdGggdGhpcw0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5BdXRvbWF0aW9uLlBlZXJzLlRyZWVWaWV3QXV0b21hdGlvblBlZXIiIC8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgY29sbGVjdGlvbiBvZiBjaGlsZCBlbGVtZW50cy48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0F1dG9tYXRpb25QZWVyLlN5c3RlbSNXaW5kb3dzI0F1dG9tYXRpb24jUHJvdmlkZXIjSVNlbGVjdGlvblByb3ZpZGVyI0dldFNlbGVjdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0cmlldmVzIGEgVUkgYXV0b21hdGlvbiBwcm92aWRlciBmb3IgZWFjaCBjaGlsZCBlbGVtZW50IHRoYXQgaXMNCisgICAgICAgICAgICBzZWxlY3RlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+QW4gYXJyYXkgb2YgVUkgYXV0b21hdGlvbiBwcm92aWRlcnMuPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIFRoaXMgQVBJIHN1cHBvcnRzIHRoZSAuTkVUIEZyYW1ld29yayBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IA0KKyAgICAgICAgICAgIGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuDQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdBdXRvbWF0aW9uUGVlci5Pd25lclRyZWVWaWV3Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBUcmVlVmlldyB0aGF0IG93bnMgdGhpcyBUcmVlVmlld0F1dG9tYXRpb25QZWVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3QXV0b21hdGlvblBlZXIuU3lzdGVtI1dpbmRvd3MjQXV0b21hdGlvbiNQcm92aWRlciNJU2VsZWN0aW9uUHJvdmlkZXIjQ2FuU2VsZWN0TXVsdGlwbGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFVJIGF1dG9tYXRpb24gcHJvdmlkZXINCisgICAgICAgICAgICBhbGxvd3MgbW9yZSB0aGFuIG9uZSBjaGlsZCBlbGVtZW50IHRvIGJlIHNlbGVjdGVkIGF0IHRoZSBzYW1lIHRpbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT4NCisgICAgICAgICAgICBUcnVlIGlmIG11bHRpcGxlIHNlbGVjdGlvbiBpcyBhbGxvd2VkOyBvdGhlcndpc2UsIGZhbHNlLg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICAgICAgPHJlbWFya3M+DQorICAgICAgICAgICAgVGhpcyBBUEkgc3VwcG9ydHMgdGhlIC5ORVQgRnJhbWV3b3JrIGluZnJhc3RydWN0dXJlIGFuZCBpcyBub3QgDQorICAgICAgICAgICAgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSBmcm9tIHlvdXIgY29kZS4NCisgICAgICAgICAgICA8L3JlbWFya3M+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0F1dG9tYXRpb25QZWVyLlN5c3RlbSNXaW5kb3dzI0F1dG9tYXRpb24jUHJvdmlkZXIjSVNlbGVjdGlvblByb3ZpZGVyI0lzU2VsZWN0aW9uUmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFVJIGF1dG9tYXRpb24gcHJvdmlkZXINCisgICAgICAgICAgICByZXF1aXJlcyBhdCBsZWFzdCBvbmUgY2hpbGQgZWxlbWVudCB0byBiZSBzZWxlY3RlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPg0KKyAgICAgICAgICAgIFRydWUgaWYgc2VsZWN0aW9uIGlzIHJlcXVpcmVkOyBvdGhlcndpc2UsIGZhbHNlLg0KKyAgICAgICAgICAgIDwvdmFsdWU+DQorICAgICAgICAgICAgPHJlbWFya3M+DQorICAgICAgICAgICAgVGhpcyBBUEkgc3VwcG9ydHMgdGhlIC5ORVQgRnJhbWV3b3JrIGluZnJhc3RydWN0dXJlIGFuZCBpcyBub3QgDQorICAgICAgICAgICAgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSBmcm9tIHlvdXIgY29kZS4NCisgICAgICAgICAgICA8L3JlbWFya3M+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW1BdXRvbWF0aW9uUGVlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRXhwb3NlcyB0aGUgaXRlbXMgaW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtIiAvPiB0eXBlcyB0byBVSQ0KKyAgICAgICAgICAgIGF1dG9tYXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxRdWFsaXR5QmFuZD5TdGFibGU8L1F1YWxpdHlCYW5kPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtQXV0b21hdGlvblBlZXIuI2N0b3IoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuVHJlZVZpZXdJdGVtQXV0b21hdGlvblBlZXIiIC8+DQorICAgICAgICAgICAgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJvd25lciI+DQorICAgICAgICAgICAgVGhlIDxzZWUgY3JlZj0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW0iIC8+IGluc3RhbmNlDQorICAgICAgICAgICAgdG8gYXNzb2NpYXRlIHdpdGggdGhpcw0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpTeXN0ZW0uV2luZG93cy5BdXRvbWF0aW9uLlBlZXJzLlRyZWVWaWV3SXRlbUF1dG9tYXRpb25QZWVyIiAvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtQXV0b21hdGlvblBlZXIuR2V0QXV0b21hdGlvbkNvbnRyb2xUeXBlQ29yZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgY29udHJvbCB0eXBlIGZvciB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtIiAvPiB0aGF0IGlzDQorICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuQXV0b21hdGlvbi5QZWVycy5UcmVlVmlld0l0ZW1BdXRvbWF0aW9uUGVlciIgLz4uDQorICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5DQorICAgICAgICAgICAgPHNlZSBjcmVmPSJNOlN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuQXV0b21hdGlvblBlZXIuR2V0QXV0b21hdGlvbkNvbnRyb2xUeXBlIiAvPi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJGOlN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuQXV0b21hdGlvbkNvbnRyb2xUeXBlLlRyZWVJdGVtIiAvPg0KKyAgICAgICAgICAgIGVudW1lcmF0aW9uIHZhbHVlLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbUF1dG9tYXRpb25QZWVyLkdldENsYXNzTmFtZUNvcmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIG5hbWUgb2YgdGhlDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbSIgLz4gdGhhdCBpcw0KKyAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOlN5c3RlbS5XaW5kb3dzLkF1dG9tYXRpb24uUGVlcnMuVHJlZVZpZXdJdGVtQXV0b21hdGlvblBlZXIiIC8+Lg0KKyAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieQ0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iTTpTeXN0ZW0uV2luZG93cy5BdXRvbWF0aW9uLlBlZXJzLkF1dG9tYXRpb25QZWVyLkdldENsYXNzTmFtZSIgLz4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkEgc3RyaW5nIHRoYXQgY29udGFpbnMgVHJlZVZpZXdJdGVtLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbUF1dG9tYXRpb25QZWVyLkdldFBhdHRlcm4oU3lzdGVtLldpbmRvd3MuQXV0b21hdGlvbi5QZWVycy5QYXR0ZXJuSW50ZXJmYWNlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgY29udHJvbCBwYXR0ZXJuIGZvciB0aGUNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtIiAvPiB0aGF0IGlzDQorICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuQXV0b21hdGlvbi5QZWVycy5UcmVlVmlld0l0ZW1BdXRvbWF0aW9uUGVlciIgLz4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXR0ZXJuSW50ZXJmYWNlIj4NCisgICAgICAgICAgICBPbmUgb2YgdGhlIGVudW1lcmF0aW9uIHZhbHVlcy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIFRoZSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBwYXR0ZXJuIGludGVyZmFjZSwgb3IgbnVsbCBpZiB0aGUNCisgICAgICAgICAgICBzcGVjaWZpZWQgcGF0dGVybiBpbnRlcmZhY2UgaXMgbm90IGltcGxlbWVudGVkIGJ5IHRoaXMgcGVlci4NCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW1BdXRvbWF0aW9uUGVlci5SYWlzZUF1dG9tYXRpb25Jc1NlbGVjdGVkQ2hhbmdlZChTeXN0ZW0uQm9vbGVhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJhaXNlIHRoZSBJc1NlbGVjdGVkIHByb3BlcnR5IGNoYW5nZWQgZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpc1NlbGVjdGVkIj4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgVHJlZVZpZXdJdGVtIGlzIHNlbGVjdGVkLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW1BdXRvbWF0aW9uUGVlci5SYWlzZUV4cGFuZENvbGxhcHNlQXV0b21hdGlvbkV2ZW50KFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5Cb29sZWFuKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmFpc2UgYW4gYXV0b21hdGlvbiBldmVudCB3aGVuIGEgVHJlZVZpZXdJdGVtIGlzIGV4cGFuZGVkIG9yDQorICAgICAgICAgICAgY29sbGFwc2VkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ib2xkVmFsdWUiPg0KKyAgICAgICAgICAgIEEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBUcmVlVmlld0l0ZW0gd2FzIGV4cGFuZGVkLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5ld1ZhbHVlIj4NCisgICAgICAgICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgVHJlZVZpZXdJdGVtIGlzIGV4cGFuZGVkLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW1BdXRvbWF0aW9uUGVlci5TeXN0ZW0jV2luZG93cyNBdXRvbWF0aW9uI1Byb3ZpZGVyI0lFeHBhbmRDb2xsYXBzZVByb3ZpZGVyI0V4cGFuZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGlzcGxheXMgYWxsIGNoaWxkIG5vZGVzLCBjb250cm9scywgb3IgY29udGVudCBvZiB0aGUgY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJlbWFya3M+DQorICAgICAgICAgICAgVGhpcyBBUEkgc3VwcG9ydHMgdGhlIC5ORVQgRnJhbWV3b3JrIGluZnJhc3RydWN0dXJlIGFuZCBpcyBub3QgDQorICAgICAgICAgICAgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSBmcm9tIHlvdXIgY29kZS4NCisgICAgICAgICAgICA8L3JlbWFya3M+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW1BdXRvbWF0aW9uUGVlci5TeXN0ZW0jV2luZG93cyNBdXRvbWF0aW9uI1Byb3ZpZGVyI0lFeHBhbmRDb2xsYXBzZVByb3ZpZGVyI0NvbGxhcHNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIaWRlcyBhbGwgbm9kZXMsIGNvbnRyb2xzLCBvciBjb250ZW50IHRoYXQgYXJlIGRlc2NlbmRhbnRzIG9mIHRoZQ0KKyAgICAgICAgICAgIGNvbnRyb2wuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIFRoaXMgQVBJIHN1cHBvcnRzIHRoZSAuTkVUIEZyYW1ld29yayBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IA0KKyAgICAgICAgICAgIGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuDQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtQXV0b21hdGlvblBlZXIuU3lzdGVtI1dpbmRvd3MjQXV0b21hdGlvbiNQcm92aWRlciNJU2VsZWN0aW9uSXRlbVByb3ZpZGVyI0FkZFRvU2VsZWN0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBZGRzIHRoZSBjdXJyZW50IGVsZW1lbnQgdG8gdGhlIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgaXRlbXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIFRoaXMgQVBJIHN1cHBvcnRzIHRoZSAuTkVUIEZyYW1ld29yayBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IA0KKyAgICAgICAgICAgIGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuDQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtQXV0b21hdGlvblBlZXIuU3lzdGVtI1dpbmRvd3MjQXV0b21hdGlvbiNQcm92aWRlciNJU2VsZWN0aW9uSXRlbVByb3ZpZGVyI1NlbGVjdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2xlYXJzIGFueSBzZWxlY3Rpb24gYW5kIHRoZW4gc2VsZWN0cyB0aGUgY3VycmVudCBlbGVtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBUaGlzIEFQSSBzdXBwb3J0cyB0aGUgLk5FVCBGcmFtZXdvcmsgaW5mcmFzdHJ1Y3R1cmUgYW5kIGlzIG5vdCANCisgICAgICAgICAgICBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGZyb20geW91ciBjb2RlLg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbUF1dG9tYXRpb25QZWVyLlN5c3RlbSNXaW5kb3dzI0F1dG9tYXRpb24jUHJvdmlkZXIjSVNlbGVjdGlvbkl0ZW1Qcm92aWRlciNSZW1vdmVGcm9tU2VsZWN0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZW1vdmVzIHRoZSBjdXJyZW50IGVsZW1lbnQgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJlbWFya3M+DQorICAgICAgICAgICAgVGhpcyBBUEkgc3VwcG9ydHMgdGhlIC5ORVQgRnJhbWV3b3JrIGluZnJhc3RydWN0dXJlIGFuZCBpcyBub3QgDQorICAgICAgICAgICAgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSBmcm9tIHlvdXIgY29kZS4NCisgICAgICAgICAgICA8L3JlbWFya3M+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5Db250cm9scy5UcmVlVmlld0l0ZW1BdXRvbWF0aW9uUGVlci5TeXN0ZW0jV2luZG93cyNBdXRvbWF0aW9uI1Byb3ZpZGVyI0lTY3JvbGxJdGVtUHJvdmlkZXIjU2Nyb2xsSW50b1ZpZXciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNjcm9sbHMgdGhlIGNvbnRlbnQgYXJlYSBvZiBhIGNvbnRhaW5lciBvYmplY3QgaW4gb3JkZXIgdG8gZGlzcGxheQ0KKyAgICAgICAgICAgIHRoZSBjb250cm9sIHdpdGhpbiB0aGUgdmlzaWJsZSByZWdpb24gKHZpZXdwb3J0KSBvZiB0aGUgY29udGFpbmVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBUaGlzIEFQSSBzdXBwb3J0cyB0aGUgLk5FVCBGcmFtZXdvcmsgaW5mcmFzdHJ1Y3R1cmUgYW5kIGlzIG5vdCANCisgICAgICAgICAgICBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGZyb20geW91ciBjb2RlLg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNvbnRyb2xzLlRyZWVWaWV3SXRlbUF1dG9tYXRpb25QZWVyLk93bmVyVHJlZVZpZXdJdGVtIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBUcmVlVmlld0l0ZW0gdGhhdCBvd25zIHRoaXMgVHJlZVZpZXdJdGVtQXV0b21hdGlvblBlZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtQXV0b21hdGlvblBlZXIuU3lzdGVtI1dpbmRvd3MjQXV0b21hdGlvbiNQcm92aWRlciNJRXhwYW5kQ29sbGFwc2VQcm92aWRlciNFeHBhbmRDb2xsYXBzZVN0YXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBzdGF0ZSAoZXhwYW5kZWQgb3IgY29sbGFwc2VkKSBvZiB0aGUgY29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPg0KKyAgICAgICAgICAgIFRoZSBzdGF0ZSAoZXhwYW5kZWQgb3IgY29sbGFwc2VkKSBvZiB0aGUgY29udHJvbC4NCisgICAgICAgICAgICA8L3ZhbHVlPg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIFRoaXMgQVBJIHN1cHBvcnRzIHRoZSAuTkVUIEZyYW1ld29yayBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IA0KKyAgICAgICAgICAgIGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuDQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtQXV0b21hdGlvblBlZXIuU3lzdGVtI1dpbmRvd3MjQXV0b21hdGlvbiNQcm92aWRlciNJU2VsZWN0aW9uSXRlbVByb3ZpZGVyI0lzU2VsZWN0ZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gaXRlbSBpcyBzZWxlY3RlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPlRydWUgaWYgYW4gaXRlbSBpcyBzZWxlY3RlZDsgb3RoZXJ3aXNlLCBmYWxzZS48L3ZhbHVlPg0KKyAgICAgICAgICAgIDxyZW1hcmtzPg0KKyAgICAgICAgICAgIFRoaXMgQVBJIHN1cHBvcnRzIHRoZSAuTkVUIEZyYW1ld29yayBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IA0KKyAgICAgICAgICAgIGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuDQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ29udHJvbHMuVHJlZVZpZXdJdGVtQXV0b21hdGlvblBlZXIuU3lzdGVtI1dpbmRvd3MjQXV0b21hdGlvbiNQcm92aWRlciNJU2VsZWN0aW9uSXRlbVByb3ZpZGVyI1NlbGVjdGlvbkNvbnRhaW5lciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgVUkgYXV0b21hdGlvbiBwcm92aWRlciB0aGF0IGltcGxlbWVudHMNCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6U3lzdGVtLldpbmRvd3MuQXV0b21hdGlvbi5Qcm92aWRlci5JU2VsZWN0aW9uUHJvdmlkZXIiIC8+DQorICAgICAgICAgICAgYW5kIGFjdHMgYXMgdGhlIGNvbnRhaW5lciBmb3IgdGhlIGNhbGxpbmcgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+VGhlIFVJIGF1dG9tYXRpb24gcHJvdmlkZXIuPC92YWx1ZT4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBUaGlzIEFQSSBzdXBwb3J0cyB0aGUgLk5FVCBGcmFtZXdvcmsgaW5mcmFzdHJ1Y3R1cmUgYW5kIGlzIG5vdCANCisgICAgICAgICAgICBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGZyb20geW91ciBjb2RlLg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5EYXRhVGVtcGxhdGVTZWxlY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBzcGVjaWFsaXplZCBkYXRhIHRlbXBsYXRlIHNlbGVjdG9yLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5EYXRhVGVtcGxhdGVTZWxlY3Rvci4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIERhdGFUZW1wbGF0ZVNlbGVjdG9yIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkRhdGFUZW1wbGF0ZVNlbGVjdG9yLkNvbnZlcnQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5HbG9iYWxpemF0aW9uLkN1bHR1cmVJbmZvKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29udmVydCBhIHZhbHVlIHRvIGEgZGF0YSB0ZW1wbGF0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGFyZ2V0VHlwZSI+VGhlIHRhcmdldCBwYXJhbWV0ZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVyIj5Db252ZXJ0ZXJQYXJhbWV0ZXIgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3VsdHVyZSI+VGhlIGN1bHR1cmUgcGFyYW1ldGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgb2JqZWN0LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5EYXRhVGVtcGxhdGVTZWxlY3Rvci5Db252ZXJ0QmFjayhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5UeXBlLFN5c3RlbS5PYmplY3QsU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBObyAyLXdheSBkYXRhYmluZGluZyBzdXBwb3J0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YXJnZXRUeXBlIj5UaGUgdGFyZ2V0IHBhcmFtZXRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXIiPkNvbnZlcnRlclBhcmFtZXRlciB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjdWx0dXJlIj5UaGUgY3VsdHVyZSBwYXJhbWV0ZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRoZSBvYmplY3QuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkRhdGFUZW1wbGF0ZVNlbGVjdG9yLkRlZmF1bHREYXRhVGVtcGxhdGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgZGVmYXVsdCBkYXRhIHRlbXBsYXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5EYXRhVGVtcGxhdGVTZWxlY3Rvci5UZXN0TWV0aG9kVGVtcGxhdGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdGVzdCBtZXRob2QgdGVtcGxhdGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkRhdGFUZW1wbGF0ZVNlbGVjdG9yLlRlc3RDbGFzc1RlbXBsYXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIHRlc3QgY2xhc3MgdGVtcGxhdGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LkludmVydFZhbHVlQ29udmVydGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIHNwZWNpYWxpemVkIGJvb2wgaW52ZXJzaW9uIHNlbGVjdG9yLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5JbnZlcnRWYWx1ZUNvbnZlcnRlci4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEludmVydFZhbHVlQ29udmVydGVyIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5JbnZlcnRWYWx1ZUNvbnZlcnRlci5Db252ZXJ0KFN5c3RlbS5PYmplY3QsU3lzdGVtLlR5cGUsU3lzdGVtLk9iamVjdCxTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mbykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnZlcnQgYSB2YWx1ZSB0byBpdHMgb3Bwb3NpdGUuIERlZmluZXMgdGhhdCBudWxsIHZhbHVlIHdpbGwgYWxzbw0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGFyZ2V0VHlwZSI+VGhlIHRhcmdldCBwYXJhbWV0ZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVyIj5Db252ZXJ0ZXJQYXJhbWV0ZXIgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3VsdHVyZSI+VGhlIGN1bHR1cmUgcGFyYW1ldGVyLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgb2JqZWN0LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5JbnZlcnRWYWx1ZUNvbnZlcnRlci5Db252ZXJ0QmFjayhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5UeXBlLFN5c3RlbS5PYmplY3QsU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBObyAyLXdheSBkYXRhYmluZGluZyBzdXBwb3J0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YXJnZXRUeXBlIj5UaGUgdGFyZ2V0IHBhcmFtZXRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXIiPkNvbnZlcnRlclBhcmFtZXRlciB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjdWx0dXJlIj5UaGUgY3VsdHVyZSBwYXJhbWV0ZXIuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIHRoZSBvYmplY3QuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk5vdGlmaWNhdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBub3RpZmljYXRpb24gdHlwZSBmb3IgdXNlIGluIHRoZSBOb3RpZmljYXRpb25zIEl0ZW1zQ29udHJvbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTm90aWZpY2F0aW9uLkNsb3NlQnV0dG9uTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTmFtZSBvZiB0aGUgdGVtcGxhdGUgcGFydC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTm90aWZpY2F0aW9uLlRpdGxlUHJvcGVydHkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIElkZW50aWZpZXMgdGhlIFRpdGxlIGRlcGVuZGVuY3kgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk5vdGlmaWNhdGlvbi5DbG9zZUJ1dHRvblZpc2liaWxpdHlQcm9wZXJ0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWRlbnRpZmllcyB0aGUgQ2xvc2VCdXR0b25WaXNpYmlsaXR5IGRlcGVuZGVuY3kgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk5vdGlmaWNhdGlvbi5fY2xvc2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIHRoZSBjbG9zZSBidXR0b24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk5vdGlmaWNhdGlvbi4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIE5vdGlmaWNhdGlvbiBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTm90aWZpY2F0aW9uLk9uQ2xvc2VkKFN5c3RlbS5XaW5kb3dzLlJvdXRlZEV2ZW50QXJncykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZpcmVzIHRoZSBDbG9zZWQgZXZlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgZGF0YS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk5vdGlmaWNhdGlvbi5PbkFwcGx5VGVtcGxhdGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE92ZXJyaWRlcyB0aGUgb24gYXBwbHkgdGVtcGxhdGUgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Ob3RpZmljYXRpb24uT25DbG9zZUNsaWNrKFN5c3RlbS5PYmplY3QsU3lzdGVtLldpbmRvd3MuUm91dGVkRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29ubmVjdHMgdG8gdGhlIENsaWNrIGV2ZW50IG9mIHRoZSBDbG9zZSBidXR0b24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBzb3VyY2Ugb2JqZWN0LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImUiPlRoZSBldmVudCBhcmd1bWVudHMuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5Ob3RpZmljYXRpb24uVGl0bGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdGl0bGUgb2YgdGhlIG5vdGlmaWNhdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTm90aWZpY2F0aW9uLkNsb3NlQnV0dG9uVmlzaWJpbGl0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjbG9zZSBidXR0b24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkU6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk5vdGlmaWNhdGlvbi5DbG9zZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENsb3NlZCBldmVudCB0aGF0IGNvbm5lY3RzIHRvIHRoZSBjbG9zZSBidXR0b24gb2YgdGhlIG5vdGlmaWNhdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTm90aWZpY2F0aW9ucyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBjbGFzcyB0aGF0IGNvbnRhaW5zIG5vdGlmaWNhdGlvbiBpbmZvcm1hdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTm90aWZpY2F0aW9ucy4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZSBhIG5ldyBpbnRhbmNlIG9mIHRoZSBOb3RpZmljYXRpb25zIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk5vdGlmaWNhdGlvbnMuT25BcHBseVRlbXBsYXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBPdmVycmlkZXMgdGhlIG9uIGFwcGx5IHRlbXBsYXRlIG1ldGhvZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuTm90aWZpY2F0aW9ucy5BZGROb3RpZmljYXRpb24oTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk5vdGlmaWNhdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFkZHMgYSBub3RpZmljYXRpb24gb2JqZWN0IHRvIHRoZSBzZXQgb2Ygbm90aWZpY2F0aW9ucy4gQ29ubmVjdHMgdGhlDQorICAgICAgICAgICAgY2xvc2UgYnV0dG9uIGhhbmRsZXIgdG8gYXV0b21hdGljYWxseSByZW1vdmUgdGhlIG5vdGlmaWNhdGlvbiBmcm9tDQorICAgICAgICAgICAgdGhlIHZpc3VhbCB0cmVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibm90aWZpY2F0aW9uIj5BIG5vdGlmaWNhdGlvbiBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50Lk5vdGlmaWNhdGlvbnMuT25Ob3RpZmljYXRpb25DbG9zZWQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uV2luZG93cy5Sb3V0ZWRFdmVudEFyZ3MpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIYW5kbGVzIHRoZSBDbG9zZWQgZXZlbnQgZnJvbSB0aGUgbm90aWZpY2F0aW9uIGFuZCByZW1vdmVzIHRoZQ0KKyAgICAgICAgICAgIGNoaWxkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgc291cmNlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgZGF0YS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RBcHBsaWNhdGlvbkluZm9ybWF0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGlzIGNsYXNzIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXN0IGFwcGxpY2F0aW9uIGFuZCBpdHMNCisgICAgICAgICAgICBkZXBsb3ltZW50IHNldHRpbmdzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0QXBwbGljYXRpb25JbmZvcm1hdGlvbi4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0QXBwbGljYXRpb25JbmZvcm1hdGlvbi5Pbkluc3RhbGxTdGF0ZUNoYW5nZWQoU3lzdGVtLk9iamVjdCxTeXN0ZW0uRXZlbnRBcmdzKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSGFuZGxlcyB0aGUgaW5zdGFsbCBzdGF0ZSBjaGFuZ2VkIGV2ZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgc291cmNlIG9iamVjdC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlIj5UaGUgZXZlbnQgYXJndW1lbnRzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdEFwcGxpY2F0aW9uSW5mb3JtYXRpb24uX2luc3RhbGxlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFja2luZyBmaWVsZCBmb3IgYW4gaW5zdGFsbGVkIHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0QXBwbGljYXRpb25JbmZvcm1hdGlvbi5PdXRPZkJyb3dzZXJBcHBsaWNhdGlvbkluc3RhbGxlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGVzdCBhcHBsaWNhdGlvbiBpcyBjdXJyZW50bHkNCisgICAgICAgICAgICBpbnN0YWxsZWQgb3V0IG9mIGJyb3dzZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuQ2xpZW50LlRlc3RBcHBsaWNhdGlvbkluZm9ybWF0aW9uLkluc3RhbGxhdGlvblN0YXRlVGV4dCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdGV4dCB0byBzaG93IHRoZSB1c2VyIHRoZSBzdGF0ZSBvZiB0aGUgb3V0IG9mIGJyb3dzZXIgdGVzdA0KKyAgICAgICAgICAgIGFwcGxpY2F0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkNsaWVudC5UZXN0QXBwbGljYXRpb25JbmZvcm1hdGlvbi5TdXBwb3J0c091dE9mQnJvd3NlckFuZE5vdEluc3RhbGxlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBvdXQgb2YgYnJvd3NlciBpcyBib3RoIHN1cHBvcnRlZCBhbmQNCisgICAgICAgICAgICBub3QgY3VycmVudGx5IGluc3RhbGxlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5DbGllbnQuVGVzdEFwcGxpY2F0aW9uSW5mb3JtYXRpb24uU3VwcG9ydHNPdXRPZkJyb3dzZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3V0IG9mIGJyb3dzZXIgaXMgc3VwcG9ydGVkIGJ5IHRoaXMNCisgICAgICAgICAgICB0ZXN0IGFwcGxpY2F0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2ltcGxlWEVsZW1lbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgc2ltcGxlIGltcGxlbWVudGF0aW9uIHNpbWlsYXIgdG8gWEVsZW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TaW1wbGVYRWxlbWVudC5fY2hpbGRyZW4iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIGNoaWxkIGVsZW1lbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2ltcGxlWEVsZW1lbnQuX2F0dHJpYnV0ZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIGF0dHJpYnV0ZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TaW1wbGVYRWxlbWVudC5fbmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFja2luZyBmaWVsZCBmb3IgdGhlIGVsZW1lbnQgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNpbXBsZVhFbGVtZW50Ll9uYW1lc3BhY2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhY2tpbmcgZmllbGQgZm9yIG9wdGlvbmFsIFhNTCBuYW1lc3BhY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TaW1wbGVYRWxlbWVudC4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2ltcGxlWEVsZW1lbnQuI2N0b3IoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBlbGVtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiPlRoZSBuYW1lIG9mIHRoZSBlbGVtZW50LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNpbXBsZVhFbGVtZW50LiNjdG9yKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBlbGVtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiPlRoZSBuYW1lIG9mIHRoZSBlbGVtZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5zIj5UaGUgWE1MIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TaW1wbGVYRWxlbWVudC4jY3RvcihTeXN0ZW0uWG1sLlhtbFJlYWRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyB1c2luZyB0aGUgcmVhZGVyIGFzIHRoZQ0KKyAgICAgICAgICAgIGN1cnJlbnQgcm9vdCBvZiB0aGUgZWxlbWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5ld0VsZW1lbnRSZWFkZXIiPlRoZSBYbWxSZWFkZXIgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2ltcGxlWEVsZW1lbnQuU2V0RWxlbWVudFZhbHVlKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNldHMgdGhlIHZhbHVlIG9mIGEgbmV3IGNoaWxkIGVsZW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50TmFtZSI+VGhlIGVsZW1lbnQgbmFtZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlIG9mIHRoZSBuZXcgZWxlbWVudC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TaW1wbGVYRWxlbWVudC5TZXRFbGVtZW50VmFsdWUoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZXRzIHRoZSB2YWx1ZSBvZiBhIG5ldyBjaGlsZCBlbGVtZW50IHdpdGggYW4gWE1MIG5hbWVzcGFjZSB2YWx1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIj5UaGUgZWxlbWVudCBuYW1lLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgdmFsdWUgb2YgdGhlIG5ldyBlbGVtZW50LjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InhtbE5hbWVzcGFjZSI+VGhlIFhNTCBuYW1lc3BhY2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2ltcGxlWEVsZW1lbnQuU2V0QXR0cmlidXRlVmFsdWUoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0cyB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXR0cmlidXRlIj5UaGUgYXR0cmlidXRlIG5hbWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBhdHRyaWJ1dGUgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2ltcGxlWEVsZW1lbnQuU2V0VmFsdWUoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBuZXcgc3RyaW5nIHZhbHVlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNpbXBsZVhFbGVtZW50LkF0dHJpYnV0ZShTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhbiBhdHRyaWJ1dGUgdmFsdWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJuYW1lIj5UaGUgYXR0cmlidXRlIG5hbWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5SZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TaW1wbGVYRWxlbWVudC5BZGQoTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TaW1wbGVYRWxlbWVudCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFkZHMgYSBjaGlsZCBlbGVtZW50IHRvIHRoZSBzaW1wbGUgZWxlbWVudCBpbnN0YW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNoaWxkIj5UaGUgY2hpbGQgZWxlbWVudCBpbnN0YW5jZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuU2VydmljZS5TaW1wbGVYRWxlbWVudC5EZXNjZW5kYW50cyhTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBkZXNjZW5kYW50cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIj5UaGUgZWxlbWVudCBuYW1lIHRvIGxvb2sgZm9yLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBlbGVtZW50cy48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNpbXBsZVhFbGVtZW50LlBhcnNlKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGVzIGEgbmV3IFNpbXBsZVhFbGVtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ieG1sIj5YTUwgY29udGVudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGVsZW1lbnQgYW5kIGNoaWxkcmVuLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2ltcGxlWEVsZW1lbnQuUGFyc2VJbnRlcm5hbChTeXN0ZW0uWG1sLlhtbFJlYWRlcixTeXN0ZW0uQm9vbGVhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFBhcnNlcyB0aGUgY3VycmVudCBsZXZlbCB3aXRoIHRoZSBYbWxSZWFkZXIgaW5zdGFuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyZWFkZXIiPlRoZSByZWFkZXIgaW5zdGFuY2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXNGaXJzdCI+QSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QNCisgICAgICAgICAgICBwYXJzZS4gQWN0dWFsbHkgdGhpcyB3aWxsIGFsd2F5cyBiZSB0cnVlIGZvciBub3cuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2ltcGxlWEVsZW1lbnQuVG9TdHJpbmciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdlbmVyYXRlcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50IGFuZCBpdHMgdHJlZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+UmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLlNlcnZpY2UuU2ltcGxlWEVsZW1lbnQuV3JpdGVFbGVtZW50KFN5c3RlbS5YbWwuWG1sV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGVzIHRvIHRoZSBYTUwgd3JpdGVyIHdpdGhvdXQgZG9jdW1lbnQgc3RhcnQgYW5kIGVuZHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3Ij5UaGUgd3JpdGVyIGluc3RhbmNlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNpbXBsZVhFbGVtZW50Lk5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGVsZW1lbnQgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5TZXJ2aWNlLlNpbXBsZVhFbGVtZW50LlZhbHVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIGVsZW1lbnQgdGV4dCwgaWYgYW55Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICA8L21lbWJlcnM+DQorPC9kb2M+DQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy9BcHJpbDIwMTAvTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZGxsIGIvY3NoYXJwL2xpYi9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy9BcHJpbDIwMTAvTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZGxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMTM5MTgKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nL0FwcmlsMjAxMC9NaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodC5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy9BcHJpbDIwMTAvTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZXh0bWFwLnhtbCBiL2NzaGFycC9saWIvTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcvQXByaWwyMDEwL01pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LmV4dG1hcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxMGY3MQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcvQXByaWwyMDEwL01pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LmV4dG1hcC54bWwKQEAgLTAsMCArMSwxMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+DQorPG1hbmlmZXN0IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIA0KKyAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCisgIDxhc3NlbWJseT4NCisgICAgPG5hbWU+TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQ8L25hbWU+DQorICAgIDx2ZXJzaW9uPjIuMC41LjA8L3ZlcnNpb24+DQorICAgIDxwdWJsaWNrZXl0b2tlbj4zMWJmMzg1NmFkMzY0ZTM1PC9wdWJsaWNrZXl0b2tlbj4NCisgICAgPHJlbHBhdGg+TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZGxsPC9yZWxwYXRoPg0KKyAgICA8ZXh0ZW5zaW9uIGRvd25sb2FkVXJpPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodC56aXAiIC8+DQorICA8L2Fzc2VtYmx5Pg0KKw0KKzwvbWFuaWZlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy9BcHJpbDIwMTAvTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQucGRiIGIvY3NoYXJwL2xpYi9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy9BcHJpbDIwMTAvTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQucGRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOTY5NjAKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nL0FwcmlsMjAxMC9NaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodC5wZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy9BcHJpbDIwMTAvTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQueG1sIGIvY3NoYXJwL2xpYi9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy9BcHJpbDIwMTAvTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODRjMGEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nL0FwcmlsMjAxMC9NaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodC54bWwKQEAgLTAsMCArMSwzNDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4NCis8ZG9jPg0KKyAgICA8YXNzZW1ibHk+DQorICAgICAgICA8bmFtZT5NaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodDwvbmFtZT4NCisgICAgPC9hc3NlbWJseT4NCisgICAgPG1lbWJlcnM+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuV2ViLlVybFRvVGVzdEF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVXJsVG9UZXN0IHNwZWNpZmllcyB0aGUgdXJsIHRoYXQgc2hvdWxkIGJlIHJlcXVlc3RlZCB0byBnaXZlIGNvbnRleHQgdG8gdGhlIHRlc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuV2ViLlVybFRvVGVzdEF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQW4gdW51c2VkIGF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InVybFRvVGVzdCI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLldlYi5VcmxUb1Rlc3RBdHRyaWJ1dGUuVXJsVG9UZXN0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBVUkwgdG8gdGVzdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5XZWIuQXNwTmV0RGV2ZWxvcG1lbnRTZXJ2ZXJBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzcE5ldERldmVsb3BtZW50U2VydmVyIHNwZWNpZmllcyB0aGUgc2V0dGluZ3MgdG8gYmUgdXNlZCBmb3IgdGhlDQorICAgICAgICAgICAgQVNQLk5FVCBEZXZlbG9wbWVudCBTZXJ2ZXIgZm9yIHRoZSB0ZXN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLldlYi5Bc3BOZXREZXZlbG9wbWVudFNlcnZlckF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyB0aGUgQXNwTmV0RGV2ZWxvcG1lbnRTZXJ2ZXJBdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJuYW1lIj5UaGUgbmFtZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoVG9XZWJBcHAiPlRoZSBwYXRoIHRvIHdlYiBhcHAuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLldlYi5Bc3BOZXREZXZlbG9wbWVudFNlcnZlckF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIHRoZSBBc3BOZXREZXZlbG9wbWVudFNlcnZlckF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5hbWUiPlRoZSBuYW1lLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGhUb1dlYkFwcCI+VGhlIHBhdGggdG8gd2ViIGFwcC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3ZWJBcHBSb290Ij5UaGUgd2ViIGFwcCByb290LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5XZWIuQXNwTmV0RGV2ZWxvcG1lbnRTZXJ2ZXJBdHRyaWJ1dGUuTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5XZWIuQXNwTmV0RGV2ZWxvcG1lbnRTZXJ2ZXJBdHRyaWJ1dGUuUGF0aFRvV2ViQXBwIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBQYXRoVG9XZWJBcHAuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuV2ViLkFzcE5ldERldmVsb3BtZW50U2VydmVyQXR0cmlidXRlLldlYkFwcFJvb3QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHdlYiBhcHAgcm9vdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5XZWIuQXNwTmV0RGV2ZWxvcG1lbnRTZXJ2ZXJIb3N0QXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3BOZXREZXZlbG9wbWVudFNlcnZlckhvc3Qgc3BlY2lmaWVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIHdoZW4NCisgICAgICAgICAgICBBU1AuTkVUIERldmVsb3BtZW50IFNlcnZlciBpcyB0aGUgaG9zdCBzZXJ2ZXIgZm9yIHRoZSB0ZXN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLldlYi5Bc3BOZXREZXZlbG9wbWVudFNlcnZlckhvc3RBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIHRoZSBBc3BOZXREZXZlbG9wbWVudFNlcnZlckhvc3RBdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoVG9XZWJBcHAiPlRoZSBwYXRoIHRvIHRoZSB3ZWIgYXBwLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5XZWIuQXNwTmV0RGV2ZWxvcG1lbnRTZXJ2ZXJIb3N0QXR0cmlidXRlLiNjdG9yKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIHRoZSBBc3BOZXREZXZlbG9wbWVudFNlcnZlckhvc3RBdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoVG9XZWJBcHAiPlRoZSBwYXRoIHRvIHRoZSB3ZWIgYXBwLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndlYkFwcFJvb3QiPlRoZSB3ZWIgYXBwIHJvb3QuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLldlYi5Bc3BOZXREZXZlbG9wbWVudFNlcnZlckhvc3RBdHRyaWJ1dGUuUGF0aFRvV2ViQXBwIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBwYXRoIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuV2ViLkFzcE5ldERldmVsb3BtZW50U2VydmVySG9zdEF0dHJpYnV0ZS5XZWJBcHBSb290Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBXZWJBcHBSb290Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLldlYi5DcmVkZW50aWFsQXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGb3IgQVNQLk5FVCBzaXRlcyB0aGF0IHJlcXVpcmUgYmFzaWMgYXV0aGVudGljYXRpb24sIHNwZWNpZnkgdGhlDQorICAgICAgICAgICAgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB1c2luZyB0aGUgQ3JlZGVudGlhbCBhdHRyaWJ1dGUuDQorICAgICAgICAgICAgV0FSTklORzogVGhlIHBhc3N3b3JkIGlzIHN0b3JlZCBpbiBwbGFpbiB0ZXh0IGluIHNvdXJjZSBjb2RlDQorICAgICAgICAgICAgYW5kIGluIHRoZSBjb21waWxlZCBhc3NlbWJseS4gUmVzdHJpY3QgYWNjZXNzIHRvIHRoZSBzb3VyY2UgY29kZQ0KKyAgICAgICAgICAgIGFuZCBhc3NlbWJseSB0byBwcm90ZWN0IHRoaXMgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLldlYi5DcmVkZW50aWFsQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNwZWNpZnkgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgbmVlZGVkIHRvIGFjY2VzcyB0aGUgd2ViIHNpdGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InVzZXJOYW1lIj5UaGUgdXNlciBuYW1lLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhc3N3b3JkIj4NCisgICAgICAgICAgICBUaGUgcGFzc3dvcmQuIFdBUk5JTkc6IFRoZSBwYXNzd29yZCBpcyBzdG9yZWQgaW4gcGxhaW4gdGV4dCBpbiBzb3VyY2UgY29kZQ0KKyAgICAgICAgICAgIGFuZCBpbiB0aGUgY29tcGlsZWQgYXNzZW1ibHkuIFJlc3RyaWN0IGFjY2VzcyB0byB0aGUgc291cmNlIGNvZGUgYW5kIGFzc2VtYmx5DQorICAgICAgICAgICAgdG8gcHJvdGVjdCB0aGlzIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuV2ViLkNyZWRlbnRpYWxBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTcGVjaWZ5IHRoZSB1c2VyIG5hbWUsIHBhc3N3b3JkLCBhbmQgZG9tYWluIG5lZWRlZCB0byBhY2Nlc3MgdGhlIHdlYiBzaXRlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ1c2VyTmFtZSI+VGhlIHVzZXIgbmFtZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXNzd29yZCI+DQorICAgICAgICAgICAgVGhlIHBhc3N3b3JkLiBXQVJOSU5HOiBUaGUgcGFzc3dvcmQgaXMgc3RvcmVkIGluIHBsYWluIHRleHQgaW4gc291cmNlIGNvZGUNCisgICAgICAgICAgICBhbmQgaW4gdGhlIGNvbXBpbGVkIGFzc2VtYmx5LiBSZXN0cmljdCBhY2Nlc3MgdG8gdGhlIHNvdXJjZSBjb2RlIGFuZCBhc3NlbWJseQ0KKyAgICAgICAgICAgIHRvIHByb3RlY3QgdGhpcyBzZW5zaXRpdmUgaW5mb3JtYXRpb24uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9tYWluIj5UaGUgZG9tYWluLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5XZWIuQ3JlZGVudGlhbEF0dHJpYnV0ZS5Vc2VyTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdXNlciBuYW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLldlYi5DcmVkZW50aWFsQXR0cmlidXRlLlBhc3N3b3JkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBwYXNzd29yZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5XZWIuQ3JlZGVudGlhbEF0dHJpYnV0ZS5Eb21haW4iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIGRvbWFpbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Vbml0VGVzdEFzc2VydEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFzZSBjbGFzcyBmb3IgRnJhbWV3b3JrIEV4Y2VwdGlvbnMsIHByb3ZpZGVzIGxvY2FsaXphdGlvbiB0cmljayBzbyB0aGF0IG1lc3NhZ2VzIGFyZSBpbiBIQSBsb2NhbGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVW5pdFRlc3RBc3NlcnRFeGNlcHRpb24uI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IFVuaXRUZXN0QXNzZXJ0RXhjZXB0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlVuaXRUZXN0QXNzZXJ0RXhjZXB0aW9uLiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBVbml0VGVzdEFzc2VydEV4Y2VwdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1zZyI+VGhlIG1lc3NhZ2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlVuaXRUZXN0QXNzZXJ0RXhjZXB0aW9uLk1lc3NhZ2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIE1lc3NhZ2Ugc3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIGNsYXNzLiBVc2VkIHRvIGluZGljYXRlIGZhaWx1cmUgZm9yIGEgdGVzdCBjYXNlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uLiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBBc3NlcnRGYWlsZWRFeGNlcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uLiNjdG9yKFN5c3RlbS5TdHJpbmcsU3lzdGVtLkV4Y2VwdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydEZhaWxlZEV4Y2VwdGlvbg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5uZXIiPlRoZSBpbm5lciBleGNlcHRpb24uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEluY29uY2x1c2l2ZUV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIEFzc2VydEluY29uY2x1c2l2ZUV4Y2VwdGlvbiBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRJbmNvbmNsdXNpdmVFeGNlcHRpb24uI2N0b3IoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IEFzc2VydEluY29uY2x1c2l2ZUV4Y2VwdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRJbmNvbmNsdXNpdmVFeGNlcHRpb24uI2N0b3IoU3lzdGVtLlN0cmluZyxTeXN0ZW0uRXhjZXB0aW9uKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgQXNzZXJ0SW5jb25jbHVzaXZlRXhjZXB0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5uZXIiPlRoZSBpbm5lciBleGNlcHRpb24uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEluY29uY2x1c2l2ZUV4Y2VwdGlvbi4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgQXNzZXJ0SW5jb25jbHVzaXZlRXhjZXB0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkludGVybmFsVGVzdEZhaWx1cmVFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEludGVybmFsVGVzdEZhaWx1cmVFeGNlcHRpb24gY2xhc3MuIFVzZWQgdG8gaW5kaWNhdGUgaW50ZXJuYWwgZmFpbHVyZSANCisgICAgICAgICAgICBmb3IgYSB0ZXN0IGNhc2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuSW50ZXJuYWxUZXN0RmFpbHVyZUV4Y2VwdGlvbi4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgSW50ZXJuYWxUZXN0RmFpbHVyZUV4Y2VwdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5JbnRlcm5hbFRlc3RGYWlsdXJlRXhjZXB0aW9uLiNjdG9yKFN5c3RlbS5TdHJpbmcsU3lzdGVtLkV4Y2VwdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IEludGVybmFsVGVzdEZhaWx1cmVFeGNlcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbm5lciI+VGhlIGlubmVyIGV4Y2VwdGlvbi48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuSW50ZXJuYWxUZXN0RmFpbHVyZUV4Y2VwdGlvbi4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgSW50ZXJuYWxUZXN0RmFpbHVyZUV4Y2VwdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEEgY29sbGVjdGlvbiBvZiBoZWxwZXIgY2xhc3NlcyB0byB0ZXN0IHZhcmlvdXMgY29uZGl0aW9ucyB3aXRoaW4NCisgICAgICAgICAgICB1bml0IHRlc3RzLiBJZiB0aGUgY29uZGl0aW9uIGJlaW5nIHRlc3RlZCBpcyBub3QgbWV0LCBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LmVycm9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuSXNUcnVlKFN5c3RlbS5Cb29sZWFuKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbiBpcyB0cnVlIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbmRpdGlvbiI+VGhlIGNvbmRpdGlvbiB0aGUgdGVzdCBleHBlY3RzIHRvIGJlIHRydWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImNvbmRpdGlvbiIvPiBpcyBmYWxzZS4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5Jc1RydWUoU3lzdGVtLkJvb2xlYW4sU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb25kaXRpb24gaXMgdHJ1ZSBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPlRoZSBjb25kaXRpb24gdGhlIHRlc3QgZXhwZWN0cyB0byBiZSB0cnVlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJjb25kaXRpb24iLz4NCisgICAgICAgICAgICBpcyBmYWxzZS4gVGhlIG1lc3NhZ2UgaXMgc2hvd24gaW4gdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJjb25kaXRpb24iLz4gaXMgZmFsc2UuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuSXNUcnVlKFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbiBpcyB0cnVlIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbmRpdGlvbiI+VGhlIGNvbmRpdGlvbiB0aGUgdGVzdCBleHBlY3RzIHRvIGJlIHRydWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImNvbmRpdGlvbiIvPg0KKyAgICAgICAgICAgIGlzIGZhbHNlLiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVycyI+DQorICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBmb3JtYXR0aW5nIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJjb25kaXRpb24iLz4gaXMgZmFsc2UuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuSXNGYWxzZShTeXN0ZW0uQm9vbGVhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb25kaXRpb24gaXMgZmFsc2UgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPlRoZSBjb25kaXRpb24gdGhlIHRlc3QgZXhwZWN0cyB0byBiZSBmYWxzZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0iY29uZGl0aW9uIi8+IGlzIHRydWUuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuSXNGYWxzZShTeXN0ZW0uQm9vbGVhbixTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbiBpcyBmYWxzZSBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbmRpdGlvbiI+VGhlIGNvbmRpdGlvbiB0aGUgdGVzdCBleHBlY3RzIHRvIGJlIGZhbHNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJjb25kaXRpb24iLz4NCisgICAgICAgICAgICBpcyB0cnVlLiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImNvbmRpdGlvbiIvPiBpcyB0cnVlLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LklzRmFsc2UoU3lzdGVtLkJvb2xlYW4sU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29uZGl0aW9uIGlzIGZhbHNlIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29uZGl0aW9uIj5UaGUgY29uZGl0aW9uIHRoZSB0ZXN0IGV4cGVjdHMgdG8gYmUgZmFsc2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImNvbmRpdGlvbiIvPg0KKyAgICAgICAgICAgIGlzIHRydWUuIFRoZSBtZXNzYWdlIGlzIHNob3duIGluIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImNvbmRpdGlvbiIvPiBpcyB0cnVlLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LklzTnVsbChTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBudWxsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgaXQgaXMgbm90Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBvYmplY3QgdGhlIHRlc3QgZXhwZWN0cyB0byBiZSBudWxsLjwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPiBpcyBub3QgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5Jc051bGwoU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBudWxsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgaXQgaXMgbm90Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBvYmplY3QgdGhlIHRlc3QgZXhwZWN0cyB0byBiZSBudWxsLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPg0KKyAgICAgICAgICAgIGlzIG5vdCBudWxsLiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+IGlzIG5vdCBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LklzTnVsbChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBudWxsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgaXQgaXMgbm90Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBvYmplY3QgdGhlIHRlc3QgZXhwZWN0cyB0byBiZSBudWxsLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPg0KKyAgICAgICAgICAgIGlzIG5vdCBudWxsLiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVycyI+DQorICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBmb3JtYXR0aW5nIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPiBpcyBub3QgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5Jc05vdE51bGwoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgbm9uLW51bGwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiBpdCBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBvYmplY3QgdGhlIHRlc3QgZXhwZWN0cyBub3QgdG8gYmUgbnVsbC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5Jc05vdE51bGwoU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBub24tbnVsbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIGl0IGlzIG51bGwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIG9iamVjdCB0aGUgdGVzdCBleHBlY3RzIG5vdCB0byBiZSBudWxsLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPg0KKyAgICAgICAgICAgIGlzIG51bGwuIFRoZSBtZXNzYWdlIGlzIHNob3duIGluIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4gaXMgbnVsbC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5Jc05vdE51bGwoU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgbm9uLW51bGwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiBpdCBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBvYmplY3QgdGhlIHRlc3QgZXhwZWN0cyBub3QgdG8gYmUgbnVsbC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4NCisgICAgICAgICAgICBpcyBudWxsLiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVycyI+DQorICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBmb3JtYXR0aW5nIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPiBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZVNhbWUoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdHMgYm90aCByZWZlciB0byB0aGUgc2FtZSBvYmplY3QgYW5kDQorICAgICAgICAgICAgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgdHdvIGlucHV0cyBkbyBub3QgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBvYmplY3QgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgdmFsdWUgdGhlIHRlc3QgZXhwZWN0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHZhbHVlIHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+IGRvZXMgbm90IHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdA0KKyAgICAgICAgICAgIGFzIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlU2FtZShTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3RzIGJvdGggcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IGFuZA0KKyAgICAgICAgICAgIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHR3byBpbnB1dHMgZG8gbm90IHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHZhbHVlIHRoZSB0ZXN0IGV4cGVjdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSB2YWx1ZSBwcm9kdWNlZCBieSB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyBub3QgdGhlIHNhbWUgYXMgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93bg0KKyAgICAgICAgICAgIGluIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4gZG9lcyBub3QgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0DQorICAgICAgICAgICAgYXMgPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5BcmVTYW1lKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3RzIGJvdGggcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IGFuZA0KKyAgICAgICAgICAgIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHR3byBpbnB1dHMgZG8gbm90IHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHZhbHVlIHRoZSB0ZXN0IGV4cGVjdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSB2YWx1ZSBwcm9kdWNlZCBieSB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyBub3QgdGhlIHNhbWUgYXMgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93bg0KKyAgICAgICAgICAgIGluIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+IGRvZXMgbm90IHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdA0KKyAgICAgICAgICAgIGFzIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlTm90U2FtZShTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyByZWZlciB0byBkaWZmZXJlbnQgb2JqZWN0cyBhbmQNCisgICAgICAgICAgICB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSB0d28gaW5wdXRzIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5vdEV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHZhbHVlIHRoZSB0ZXN0IGV4cGVjdHMgbm90DQorICAgICAgICAgICAgdG8gbWF0Y2ggPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHZhbHVlIHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+IHJlZmVycyB0byB0aGUgc2FtZSBvYmplY3QNCisgICAgICAgICAgICBhcyA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZU5vdFNhbWUoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyByZWZlciB0byBkaWZmZXJlbnQgb2JqZWN0cyBhbmQNCisgICAgICAgICAgICB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSB0d28gaW5wdXRzIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5vdEV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHZhbHVlIHRoZSB0ZXN0IGV4cGVjdHMgbm90DQorICAgICAgICAgICAgdG8gbWF0Y2ggPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHZhbHVlIHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPg0KKyAgICAgICAgICAgIGlzIHRoZSBzYW1lIGFzIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPi4gVGhlIG1lc3NhZ2UgaXMgc2hvd24gaW4NCisgICAgICAgICAgICB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+IHJlZmVycyB0byB0aGUgc2FtZSBvYmplY3QNCisgICAgICAgICAgICBhcyA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZU5vdFNhbWUoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdHMgcmVmZXIgdG8gZGlmZmVyZW50IG9iamVjdHMgYW5kDQorICAgICAgICAgICAgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgdHdvIGlucHV0cyByZWZlciB0byB0aGUgc2FtZSBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJub3RFeHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IG9iamVjdCB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSB2YWx1ZSB0aGUgdGVzdCBleHBlY3RzIG5vdA0KKyAgICAgICAgICAgIHRvIG1hdGNoIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSB2YWx1ZSBwcm9kdWNlZCBieSB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4uIFRoZSBtZXNzYWdlIGlzIHNob3duIGluDQorICAgICAgICAgICAgdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlcnMiPg0KKyAgICAgICAgICAgIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZm9ybWF0dGluZyA8cGFyYW1yZWYgbmFtZT0ibWVzc2FnZSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4gcmVmZXJzIHRvIHRoZSBzYW1lIG9iamVjdA0KKyAgICAgICAgICAgIGFzIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlRXF1YWxgYDEoYGAwLGBgMCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYXJlIGVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhlIHR3byB2YWx1ZXMgYXJlIG5vdCBlcXVhbC4gRGlmZmVyZW50IG51bWVyaWMgdHlwZXMgYXJlIHRyZWF0ZWQNCisgICAgICAgICAgICBhcyB1bmVxdWFsIGV2ZW4gaWYgdGhlIGxvZ2ljYWwgdmFsdWVzIGFyZSBlcXVhbC4gNDJMIGlzIG5vdCBlcXVhbCB0byA0Mi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgdHlwZSBvZiB2YWx1ZXMgdG8gY29tcGFyZS48L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCB2YWx1ZSB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSB2YWx1ZSB0aGUgdGVzdHMgZXhwZWN0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgdmFsdWUgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgdmFsdWUgcHJvZHVjZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4gaXMgbm90IGVxdWFsIHRvIA0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlRXF1YWxgYDEoYGAwLGBgMCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHZhbHVlcyBhcmUgZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGUgdHdvIHZhbHVlcyBhcmUgbm90IGVxdWFsLiBEaWZmZXJlbnQgbnVtZXJpYyB0eXBlcyBhcmUgdHJlYXRlZA0KKyAgICAgICAgICAgIGFzIHVuZXF1YWwgZXZlbiBpZiB0aGUgbG9naWNhbCB2YWx1ZXMgYXJlIGVxdWFsLiA0MkwgaXMgbm90IGVxdWFsIHRvIDQyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSB0eXBlIG9mIHZhbHVlcyB0byBjb21wYXJlLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IHZhbHVlIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHZhbHVlIHRoZSB0ZXN0cyBleHBlY3RzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCB2YWx1ZSB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSB2YWx1ZSBwcm9kdWNlZCBieSB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4gaXMgbm90IGVxdWFsIHRvDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5BcmVFcXVhbGBgMShgYDAsYGAwLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHZhbHVlcyBhcmUgZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGUgdHdvIHZhbHVlcyBhcmUgbm90IGVxdWFsLiBEaWZmZXJlbnQgbnVtZXJpYyB0eXBlcyBhcmUgdHJlYXRlZA0KKyAgICAgICAgICAgIGFzIHVuZXF1YWwgZXZlbiBpZiB0aGUgbG9naWNhbCB2YWx1ZXMgYXJlIGVxdWFsLiA0MkwgaXMgbm90IGVxdWFsIHRvIDQyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSB0eXBlIG9mIHZhbHVlcyB0byBjb21wYXJlLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IHZhbHVlIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHZhbHVlIHRoZSB0ZXN0cyBleHBlY3RzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCB2YWx1ZSB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSB2YWx1ZSBwcm9kdWNlZCBieSB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+IGlzIG5vdCBlcXVhbCB0byANCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZU5vdEVxdWFsYGAxKGBgMCxgYDApIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWVzIGFyZSB1bmVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhlIHR3byB2YWx1ZXMgYXJlIGVxdWFsLiBEaWZmZXJlbnQgbnVtZXJpYyB0eXBlcyBhcmUgdHJlYXRlZA0KKyAgICAgICAgICAgIGFzIHVuZXF1YWwgZXZlbiBpZiB0aGUgbG9naWNhbCB2YWx1ZXMgYXJlIGVxdWFsLiA0MkwgaXMgbm90IGVxdWFsIHRvIDQyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSB0eXBlIG9mIHZhbHVlcyB0byBjb21wYXJlLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJub3RFeHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IHZhbHVlIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHZhbHVlIHRoZSB0ZXN0IGV4cGVjdHMgbm90DQorICAgICAgICAgICAgdG8gbWF0Y2ggPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgdmFsdWUgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgdmFsdWUgcHJvZHVjZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4gaXMgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5BcmVOb3RFcXVhbGBgMShgYDAsYGAwLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWVzIGFyZSB1bmVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhlIHR3byB2YWx1ZXMgYXJlIGVxdWFsLiBEaWZmZXJlbnQgbnVtZXJpYyB0eXBlcyBhcmUgdHJlYXRlZA0KKyAgICAgICAgICAgIGFzIHVuZXF1YWwgZXZlbiBpZiB0aGUgbG9naWNhbCB2YWx1ZXMgYXJlIGVxdWFsLiA0MkwgaXMgbm90IGVxdWFsIHRvIDQyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSB0eXBlIG9mIHZhbHVlcyB0byBjb21wYXJlLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJub3RFeHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IHZhbHVlIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHZhbHVlIHRoZSB0ZXN0IGV4cGVjdHMgbm90DQorICAgICAgICAgICAgdG8gbWF0Y2ggPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgdmFsdWUgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgdmFsdWUgcHJvZHVjZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+DQorICAgICAgICAgICAgaXMgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4gaXMgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5BcmVOb3RFcXVhbGBgMShgYDAsYGAwLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHZhbHVlcyBhcmUgdW5lcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZSB0d28gdmFsdWVzIGFyZSBlcXVhbC4gRGlmZmVyZW50IG51bWVyaWMgdHlwZXMgYXJlIHRyZWF0ZWQNCisgICAgICAgICAgICBhcyB1bmVxdWFsIGV2ZW4gaWYgdGhlIGxvZ2ljYWwgdmFsdWVzIGFyZSBlcXVhbC4gNDJMIGlzIG5vdCBlcXVhbCB0byA0Mi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgdHlwZSBvZiB2YWx1ZXMgdG8gY29tcGFyZS48L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibm90RXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCB2YWx1ZSB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSB2YWx1ZSB0aGUgdGVzdCBleHBlY3RzIG5vdA0KKyAgICAgICAgICAgIHRvIG1hdGNoIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHZhbHVlIHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPg0KKyAgICAgICAgICAgIGlzIGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPi4gVGhlIG1lc3NhZ2UgaXMgc2hvd24gaW4NCisgICAgICAgICAgICB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVycyI+DQorICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBmb3JtYXR0aW5nIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPiBpcyBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3RzIGFyZSBlcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsLiBEaWZmZXJlbnQgbnVtZXJpYyB0eXBlcyBhcmUgdHJlYXRlZA0KKyAgICAgICAgICAgIGFzIHVuZXF1YWwgZXZlbiBpZiB0aGUgbG9naWNhbCB2YWx1ZXMgYXJlIGVxdWFsLiA0MkwgaXMgbm90IGVxdWFsIHRvIDQyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBvYmplY3QgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgb2JqZWN0IHRoZSB0ZXN0cyBleHBlY3RzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBvYmplY3QgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgb2JqZWN0IHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+IGlzIG5vdCBlcXVhbCB0bw0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyBhcmUgZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbC4gRGlmZmVyZW50IG51bWVyaWMgdHlwZXMgYXJlIHRyZWF0ZWQNCisgICAgICAgICAgICBhcyB1bmVxdWFsIGV2ZW4gaWYgdGhlIGxvZ2ljYWwgdmFsdWVzIGFyZSBlcXVhbC4gNDJMIGlzIG5vdCBlcXVhbCB0byA0Mi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIG9iamVjdCB0aGUgdGVzdHMgZXhwZWN0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIG9iamVjdCBwcm9kdWNlZCBieSB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4gaXMgbm90IGVxdWFsIHRvDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5BcmVFcXVhbChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyBhcmUgZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbC4gRGlmZmVyZW50IG51bWVyaWMgdHlwZXMgYXJlIHRyZWF0ZWQNCisgICAgICAgICAgICBhcyB1bmVxdWFsIGV2ZW4gaWYgdGhlIGxvZ2ljYWwgdmFsdWVzIGFyZSBlcXVhbC4gNDJMIGlzIG5vdCBlcXVhbCB0byA0Mi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIG9iamVjdCB0aGUgdGVzdHMgZXhwZWN0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIG9iamVjdCBwcm9kdWNlZCBieSB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+IGlzIG5vdCBlcXVhbCB0bw0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdHMgYXJlIHVuZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIGVxdWFsLiBEaWZmZXJlbnQgbnVtZXJpYyB0eXBlcyBhcmUgdHJlYXRlZA0KKyAgICAgICAgICAgIGFzIHVuZXF1YWwgZXZlbiBpZiB0aGUgbG9naWNhbCB2YWx1ZXMgYXJlIGVxdWFsLiA0MkwgaXMgbm90IGVxdWFsIHRvIDQyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibm90RXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBvYmplY3QgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgdmFsdWUgdGhlIHRlc3QgZXhwZWN0cyBub3QNCisgICAgICAgICAgICB0byBtYXRjaCA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBvYmplY3QgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgb2JqZWN0IHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+IGlzIGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyBhcmUgdW5lcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgZXF1YWwuIERpZmZlcmVudCBudW1lcmljIHR5cGVzIGFyZSB0cmVhdGVkDQorICAgICAgICAgICAgYXMgdW5lcXVhbCBldmVuIGlmIHRoZSBsb2dpY2FsIHZhbHVlcyBhcmUgZXF1YWwuIDQyTCBpcyBub3QgZXF1YWwgdG8gNDIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJub3RFeHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IG9iamVjdCB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSB2YWx1ZSB0aGUgdGVzdCBleHBlY3RzIG5vdA0KKyAgICAgICAgICAgIHRvIG1hdGNoIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBvYmplY3QgcHJvZHVjZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+DQorICAgICAgICAgICAgaXMgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4gaXMgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyBhcmUgdW5lcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgZXF1YWwuIERpZmZlcmVudCBudW1lcmljIHR5cGVzIGFyZSB0cmVhdGVkDQorICAgICAgICAgICAgYXMgdW5lcXVhbCBldmVuIGlmIHRoZSBsb2dpY2FsIHZhbHVlcyBhcmUgZXF1YWwuIDQyTCBpcyBub3QgZXF1YWwgdG8gNDIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJub3RFeHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IG9iamVjdCB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSB2YWx1ZSB0aGUgdGVzdCBleHBlY3RzIG5vdA0KKyAgICAgICAgICAgIHRvIG1hdGNoIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBvYmplY3QgcHJvZHVjZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+DQorICAgICAgICAgICAgaXMgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+IGlzIGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU2luZ2xlLFN5c3RlbS5TaW5nbGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmxvYXRzIGFyZSBlcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3QgZmxvYXQgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgZmxvYXQgdGhlIHRlc3RzIGV4cGVjdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIGZsb2F0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGZsb2F0IHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVsdGEiPg0KKyAgICAgICAgICAgIFRoZSByZXF1aXJlZCBhY2N1cmFjeS4gQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIG9ubHkgaWYNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+IGlzIGRpZmZlcmVudCB0aGFuIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZCIvPg0KKyAgICAgICAgICAgIGJ5IG1vcmUgdGhhbiA8cGFyYW1yZWYgbmFtZT0iZGVsdGEiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+IGlzIG5vdCBlcXVhbCB0bw0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU2luZ2xlLFN5c3RlbS5TaW5nbGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmbG9hdHMgYXJlIGVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhleSBhcmUgbm90IGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBmbG9hdCB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBmbG9hdCB0aGUgdGVzdHMgZXhwZWN0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgZmxvYXQgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgZmxvYXQgcHJvZHVjZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWx0YSI+DQorICAgICAgICAgICAgVGhlIHJlcXVpcmVkIGFjY3VyYWN5LiBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gb25seSBpZg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4gaXMgZGlmZmVyZW50IHRoYW4gPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+DQorICAgICAgICAgICAgYnkgbW9yZSB0aGFuIDxwYXJhbXJlZiBuYW1lPSJkZWx0YSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+DQorICAgICAgICAgICAgaXMgZGlmZmVyZW50IHRoYW4gPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+IGJ5IG1vcmUgdGhhbg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJkZWx0YSIvPi4gVGhlIG1lc3NhZ2UgaXMgc2hvd24gaW4gdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZCIvPiBpcyBub3QgZXF1YWwgdG8NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5TaW5nbGUsU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU2luZ2xlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGZsb2F0cyBhcmUgZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGV5IGFyZSBub3QgZXF1YWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IGZsb2F0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGZsb2F0IHRoZSB0ZXN0cyBleHBlY3RzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBmbG9hdCB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBmbG9hdCBwcm9kdWNlZCBieSB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlbHRhIj4NCisgICAgICAgICAgICBUaGUgcmVxdWlyZWQgYWNjdXJhY3kuIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBvbmx5IGlmDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPiBpcyBkaWZmZXJlbnQgdGhhbiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4NCisgICAgICAgICAgICBieSBtb3JlIHRoYW4gPHBhcmFtcmVmIG5hbWU9ImRlbHRhIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyBkaWZmZXJlbnQgdGhhbiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4gYnkgbW9yZSB0aGFuDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImRlbHRhIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVycyI+DQorICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBmb3JtYXR0aW5nIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZCIvPiBpcyBub3QgZXF1YWwgdG8NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5TaW5nbGUsU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU2luZ2xlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGZsb2F0cyBhcmUgdW5lcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZXkgYXJlIGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibm90RXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBmbG9hdCB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBmbG9hdCB0aGUgdGVzdCBleHBlY3RzIG5vdCB0bw0KKyAgICAgICAgICAgIG1hdGNoIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIGZsb2F0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGZsb2F0IHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVsdGEiPg0KKyAgICAgICAgICAgIFRoZSByZXF1aXJlZCBhY2N1cmFjeS4gQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIG9ubHkgaWYNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+IGlzIGRpZmZlcmVudCB0aGFuIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPg0KKyAgICAgICAgICAgIGJ5IGF0IG1vc3QgPHBhcmFtcmVmIG5hbWU9ImRlbHRhIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPiBpcyBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5TaW5nbGUsU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU2luZ2xlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmxvYXRzIGFyZSB1bmVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhleSBhcmUgZXF1YWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJub3RFeHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IGZsb2F0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGZsb2F0IHRoZSB0ZXN0IGV4cGVjdHMgbm90IHRvDQorICAgICAgICAgICAgbWF0Y2ggPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgZmxvYXQgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgZmxvYXQgcHJvZHVjZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWx0YSI+DQorICAgICAgICAgICAgVGhlIHJlcXVpcmVkIGFjY3VyYWN5LiBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gb25seSBpZg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4gaXMgZGlmZmVyZW50IHRoYW4gPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+DQorICAgICAgICAgICAgYnkgYXQgbW9zdCA8cGFyYW1yZWYgbmFtZT0iZGVsdGEiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPg0KKyAgICAgICAgICAgIGlzIGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPiBvciBkaWZmZXJlbnQgYnkgbGVzcyB0aGFuDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImRlbHRhIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+IGlzIGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU2luZ2xlLFN5c3RlbS5TaW5nbGUsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmxvYXRzIGFyZSB1bmVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhleSBhcmUgZXF1YWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJub3RFeHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IGZsb2F0IHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGZsb2F0IHRoZSB0ZXN0IGV4cGVjdHMgbm90IHRvDQorICAgICAgICAgICAgbWF0Y2ggPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgZmxvYXQgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgZmxvYXQgcHJvZHVjZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWx0YSI+DQorICAgICAgICAgICAgVGhlIHJlcXVpcmVkIGFjY3VyYWN5LiBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gb25seSBpZg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4gaXMgZGlmZmVyZW50IHRoYW4gPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+DQorICAgICAgICAgICAgYnkgYXQgbW9zdCA8cGFyYW1yZWYgbmFtZT0iZGVsdGEiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPg0KKyAgICAgICAgICAgIGlzIGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPiBvciBkaWZmZXJlbnQgYnkgbGVzcyB0aGFuDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImRlbHRhIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVycyI+DQorICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBmb3JtYXR0aW5nIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPiBpcyBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGRvdWJsZXMgYXJlIGVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhleSBhcmUgbm90IGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBkb3VibGUgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgZG91YmxlIHRoZSB0ZXN0cyBleHBlY3RzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBkb3VibGUgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgZG91YmxlIHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVsdGEiPg0KKyAgICAgICAgICAgIFRoZSByZXF1aXJlZCBhY2N1cmFjeS4gQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIG9ubHkgaWYNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+IGlzIGRpZmZlcmVudCB0aGFuIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZCIvPg0KKyAgICAgICAgICAgIGJ5IG1vcmUgdGhhbiA8cGFyYW1yZWYgbmFtZT0iZGVsdGEiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+IGlzIG5vdCBlcXVhbCB0bw0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBkb3VibGVzIGFyZSBlcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3QgZG91YmxlIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGRvdWJsZSB0aGUgdGVzdHMgZXhwZWN0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgZG91YmxlIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGRvdWJsZSBwcm9kdWNlZCBieSB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlbHRhIj4NCisgICAgICAgICAgICBUaGUgcmVxdWlyZWQgYWNjdXJhY3kuIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBvbmx5IGlmDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPiBpcyBkaWZmZXJlbnQgdGhhbiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4NCisgICAgICAgICAgICBieSBtb3JlIHRoYW4gPHBhcmFtcmVmIG5hbWU9ImRlbHRhIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyBkaWZmZXJlbnQgdGhhbiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4gYnkgbW9yZSB0aGFuDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImRlbHRhIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+IGlzIG5vdCBlcXVhbCB0byANCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGRvdWJsZXMgYXJlIGVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhleSBhcmUgbm90IGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBkb3VibGUgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgZG91YmxlIHRoZSB0ZXN0cyBleHBlY3RzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBkb3VibGUgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgZG91YmxlIHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVsdGEiPg0KKyAgICAgICAgICAgIFRoZSByZXF1aXJlZCBhY2N1cmFjeS4gQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIG9ubHkgaWYNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+IGlzIGRpZmZlcmVudCB0aGFuIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZCIvPg0KKyAgICAgICAgICAgIGJ5IG1vcmUgdGhhbiA8cGFyYW1yZWYgbmFtZT0iZGVsdGEiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPg0KKyAgICAgICAgICAgIGlzIGRpZmZlcmVudCB0aGFuIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZCIvPiBieSBtb3JlIHRoYW4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iZGVsdGEiLz4uIFRoZSBtZXNzYWdlIGlzIHNob3duIGluIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+IGlzIG5vdCBlcXVhbCB0byANCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGRvdWJsZXMgYXJlIHVuZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGV5IGFyZSBlcXVhbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5vdEV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3QgZG91YmxlIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGRvdWJsZSB0aGUgdGVzdCBleHBlY3RzIG5vdCB0bw0KKyAgICAgICAgICAgIG1hdGNoIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIGRvdWJsZSB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBkb3VibGUgcHJvZHVjZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWx0YSI+DQorICAgICAgICAgICAgVGhlIHJlcXVpcmVkIGFjY3VyYWN5LiBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gb25seSBpZg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4gaXMgZGlmZmVyZW50IHRoYW4gPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+DQorICAgICAgICAgICAgYnkgYXQgbW9zdCA8cGFyYW1yZWYgbmFtZT0iZGVsdGEiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+IGlzIGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBkb3VibGVzIGFyZSB1bmVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhleSBhcmUgZXF1YWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJub3RFeHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IGRvdWJsZSB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBkb3VibGUgdGhlIHRlc3QgZXhwZWN0cyBub3QgdG8NCisgICAgICAgICAgICBtYXRjaCA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBkb3VibGUgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgZG91YmxlIHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVsdGEiPg0KKyAgICAgICAgICAgIFRoZSByZXF1aXJlZCBhY2N1cmFjeS4gQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIG9ubHkgaWYNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+IGlzIGRpZmZlcmVudCB0aGFuIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPg0KKyAgICAgICAgICAgIGJ5IGF0IG1vc3QgPHBhcmFtcmVmIG5hbWU9ImRlbHRhIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4gb3IgZGlmZmVyZW50IGJ5IGxlc3MgdGhhbg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJkZWx0YSIvPi4gVGhlIG1lc3NhZ2UgaXMgc2hvd24gaW4gdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPiBpcyBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGRvdWJsZXMgYXJlIHVuZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGV5IGFyZSBlcXVhbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5vdEV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3QgZG91YmxlIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGRvdWJsZSB0aGUgdGVzdCBleHBlY3RzIG5vdCB0bw0KKyAgICAgICAgICAgIG1hdGNoIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIGRvdWJsZSB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBkb3VibGUgcHJvZHVjZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWx0YSI+DQorICAgICAgICAgICAgVGhlIHJlcXVpcmVkIGFjY3VyYWN5LiBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gb25seSBpZg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4gaXMgZGlmZmVyZW50IHRoYW4gPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+DQorICAgICAgICAgICAgYnkgYXQgbW9zdCA8cGFyYW1yZWYgbmFtZT0iZGVsdGEiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPg0KKyAgICAgICAgICAgIGlzIGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPiBvciBkaWZmZXJlbnQgYnkgbGVzcyB0aGFuDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImRlbHRhIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVycyI+DQorICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBmb3JtYXR0aW5nIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPiBpcyBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uQm9vbGVhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmdzIGFyZSBlcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gVGhlIGludmFyaWFudCBjdWx0dXJlIGlzIHVzZWQgZm9yIHRoZSBjb21wYXJpc29uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBzdHJpbmcgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgc3RyaW5nIHRoZSB0ZXN0cyBleHBlY3RzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBzdHJpbmcgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgc3RyaW5nIHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaWdub3JlQ2FzZSI+DQorICAgICAgICAgICAgQSBCb29sZWFuIGluZGljYXRpbmcgYSBjYXNlLXNlbnNpdGl2ZSBvciBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLiAodHJ1ZQ0KKyAgICAgICAgICAgIGluZGljYXRlcyBhIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4pDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+IGlzIG5vdCBlcXVhbCB0byANCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uQm9vbGVhbixTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgYXJlIGVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhleSBhcmUgbm90IGVxdWFsLiBUaGUgaW52YXJpYW50IGN1bHR1cmUgaXMgdXNlZCBmb3IgdGhlIGNvbXBhcmlzb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IHN0cmluZyB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBzdHJpbmcgdGhlIHRlc3RzIGV4cGVjdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIHN0cmluZyB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpZ25vcmVDYXNlIj4NCisgICAgICAgICAgICBBIEJvb2xlYW4gaW5kaWNhdGluZyBhIGNhc2Utc2Vuc2l0aXZlIG9yIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24uICh0cnVlDQorICAgICAgICAgICAgaW5kaWNhdGVzIGEgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uLikNCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+DQorICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZCIvPi4gVGhlIG1lc3NhZ2UgaXMgc2hvd24gaW4NCisgICAgICAgICAgICB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+IGlzIG5vdCBlcXVhbCB0byANCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uQm9vbGVhbixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmdzIGFyZSBlcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gVGhlIGludmFyaWFudCBjdWx0dXJlIGlzIHVzZWQgZm9yIHRoZSBjb21wYXJpc29uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBzdHJpbmcgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgc3RyaW5nIHRoZSB0ZXN0cyBleHBlY3RzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBzdHJpbmcgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgc3RyaW5nIHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaWdub3JlQ2FzZSI+DQorICAgICAgICAgICAgQSBCb29sZWFuIGluZGljYXRpbmcgYSBjYXNlLXNlbnNpdGl2ZSBvciBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLiAodHJ1ZQ0KKyAgICAgICAgICAgIGluZGljYXRlcyBhIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4pDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPg0KKyAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4uIFRoZSBtZXNzYWdlIGlzIHNob3duIGluDQorICAgICAgICAgICAgdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlcnMiPg0KKyAgICAgICAgICAgIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZm9ybWF0dGluZyA8cGFyYW1yZWYgbmFtZT0ibWVzc2FnZSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4gaXMgbm90IGVxdWFsIHRvIA0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5HbG9iYWxpemF0aW9uLkN1bHR1cmVJbmZvKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgYXJlIGVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhleSBhcmUgbm90IGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBzdHJpbmcgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgc3RyaW5nIHRoZSB0ZXN0cyBleHBlY3RzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBzdHJpbmcgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgc3RyaW5nIHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaWdub3JlQ2FzZSI+DQorICAgICAgICAgICAgQSBCb29sZWFuIGluZGljYXRpbmcgYSBjYXNlLXNlbnNpdGl2ZSBvciBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLiAodHJ1ZQ0KKyAgICAgICAgICAgIGluZGljYXRlcyBhIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4pDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3VsdHVyZSI+DQorICAgICAgICAgICAgQSBDdWx0dXJlSW5mbyBvYmplY3QgdGhhdCBzdXBwbGllcyBjdWx0dXJlLXNwZWNpZmljIGNvbXBhcmlzb24gaW5mb3JtYXRpb24uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+IGlzIG5vdCBlcXVhbCB0byANCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uQm9vbGVhbixTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mbyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgYXJlIGVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhleSBhcmUgbm90IGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBzdHJpbmcgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgc3RyaW5nIHRoZSB0ZXN0cyBleHBlY3RzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBzdHJpbmcgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgc3RyaW5nIHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaWdub3JlQ2FzZSI+DQorICAgICAgICAgICAgQSBCb29sZWFuIGluZGljYXRpbmcgYSBjYXNlLXNlbnNpdGl2ZSBvciBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLiAodHJ1ZQ0KKyAgICAgICAgICAgIGluZGljYXRlcyBhIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4pDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3VsdHVyZSI+DQorICAgICAgICAgICAgQSBDdWx0dXJlSW5mbyBvYmplY3QgdGhhdCBzdXBwbGllcyBjdWx0dXJlLXNwZWNpZmljIGNvbXBhcmlzb24gaW5mb3JtYXRpb24uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPg0KKyAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4uIFRoZSBtZXNzYWdlIGlzIHNob3duIGluDQorICAgICAgICAgICAgdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZCIvPiBpcyBub3QgZXF1YWwgdG8gDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5BcmVFcXVhbChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLkJvb2xlYW4sU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8sU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGV5IGFyZSBub3QgZXF1YWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IHN0cmluZyB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBzdHJpbmcgdGhlIHRlc3RzIGV4cGVjdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIHN0cmluZyB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpZ25vcmVDYXNlIj4NCisgICAgICAgICAgICBBIEJvb2xlYW4gaW5kaWNhdGluZyBhIGNhc2Utc2Vuc2l0aXZlIG9yIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24uICh0cnVlDQorICAgICAgICAgICAgaW5kaWNhdGVzIGEgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uLikNCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjdWx0dXJlIj4NCisgICAgICAgICAgICBBIEN1bHR1cmVJbmZvIG9iamVjdCB0aGF0IHN1cHBsaWVzIGN1bHR1cmUtc3BlY2lmaWMgY29tcGFyaXNvbiBpbmZvcm1hdGlvbi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+DQorICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZCIvPi4gVGhlIG1lc3NhZ2UgaXMgc2hvd24gaW4NCisgICAgICAgICAgICB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVycyI+DQorICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBmb3JtYXR0aW5nIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZCIvPiBpcyBub3QgZXF1YWwgdG8gDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgdW5lcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZXkgYXJlIGVxdWFsLiBUaGUgaW52YXJpYW50IGN1bHR1cmUgaXMgdXNlZCBmb3IgdGhlIGNvbXBhcmlzb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJub3RFeHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IHN0cmluZyB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBzdHJpbmcgdGhlIHRlc3QgZXhwZWN0cyBub3QgdG8NCisgICAgICAgICAgICBtYXRjaCA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBzdHJpbmcgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgc3RyaW5nIHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaWdub3JlQ2FzZSI+DQorICAgICAgICAgICAgQSBCb29sZWFuIGluZGljYXRpbmcgYSBjYXNlLXNlbnNpdGl2ZSBvciBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLiAodHJ1ZQ0KKyAgICAgICAgICAgIGluZGljYXRlcyBhIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4pDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+IGlzIGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgdW5lcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZXkgYXJlIGVxdWFsLiBUaGUgaW52YXJpYW50IGN1bHR1cmUgaXMgdXNlZCBmb3IgdGhlIGNvbXBhcmlzb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJub3RFeHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IHN0cmluZyB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBzdHJpbmcgdGhlIHRlc3QgZXhwZWN0cyBub3QgdG8NCisgICAgICAgICAgICBtYXRjaCA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBzdHJpbmcgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgc3RyaW5nIHByb2R1Y2VkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaWdub3JlQ2FzZSI+DQorICAgICAgICAgICAgQSBCb29sZWFuIGluZGljYXRpbmcgYSBjYXNlLXNlbnNpdGl2ZSBvciBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLiAodHJ1ZQ0KKyAgICAgICAgICAgIGluZGljYXRlcyBhIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4pDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPg0KKyAgICAgICAgICAgIGlzIGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPi4gVGhlIG1lc3NhZ2UgaXMgc2hvd24gaW4NCisgICAgICAgICAgICB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+IGlzIGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgYXJlIHVuZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGV5IGFyZSBlcXVhbC4gVGhlIGludmFyaWFudCBjdWx0dXJlIGlzIHVzZWQgZm9yIHRoZSBjb21wYXJpc29uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibm90RXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBzdHJpbmcgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgc3RyaW5nIHRoZSB0ZXN0IGV4cGVjdHMgbm90IHRvDQorICAgICAgICAgICAgbWF0Y2ggPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgc3RyaW5nIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHN0cmluZyBwcm9kdWNlZCBieSB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imlnbm9yZUNhc2UiPg0KKyAgICAgICAgICAgIEEgQm9vbGVhbiBpbmRpY2F0aW5nIGEgY2FzZS1zZW5zaXRpdmUgb3IgaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4gKHRydWUNCisgICAgICAgICAgICBpbmRpY2F0ZXMgYSBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24uKQ0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4uIFRoZSBtZXNzYWdlIGlzIHNob3duIGluDQorICAgICAgICAgICAgdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlcnMiPg0KKyAgICAgICAgICAgIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZm9ybWF0dGluZyA8cGFyYW1yZWYgbmFtZT0ibWVzc2FnZSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4gaXMgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLkJvb2xlYW4sU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgdW5lcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZXkgYXJlIGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibm90RXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBzdHJpbmcgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgc3RyaW5nIHRoZSB0ZXN0IGV4cGVjdHMgbm90IHRvDQorICAgICAgICAgICAgbWF0Y2ggPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgc3RyaW5nIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHN0cmluZyBwcm9kdWNlZCBieSB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imlnbm9yZUNhc2UiPg0KKyAgICAgICAgICAgIEEgQm9vbGVhbiBpbmRpY2F0aW5nIGEgY2FzZS1zZW5zaXRpdmUgb3IgaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4gKHRydWUNCisgICAgICAgICAgICBpbmRpY2F0ZXMgYSBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24uKQ0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImN1bHR1cmUiPg0KKyAgICAgICAgICAgIEEgQ3VsdHVyZUluZm8gb2JqZWN0IHRoYXQgc3VwcGxpZXMgY3VsdHVyZS1zcGVjaWZpYyBjb21wYXJpc29uIGluZm9ybWF0aW9uLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPiBpcyBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uQm9vbGVhbixTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mbyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgYXJlIHVuZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGV5IGFyZSBlcXVhbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5vdEV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3Qgc3RyaW5nIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHN0cmluZyB0aGUgdGVzdCBleHBlY3RzIG5vdCB0bw0KKyAgICAgICAgICAgIG1hdGNoIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIHN0cmluZyB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpZ25vcmVDYXNlIj4NCisgICAgICAgICAgICBBIEJvb2xlYW4gaW5kaWNhdGluZyBhIGNhc2Utc2Vuc2l0aXZlIG9yIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24uICh0cnVlDQorICAgICAgICAgICAgaW5kaWNhdGVzIGEgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uLikNCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjdWx0dXJlIj4NCisgICAgICAgICAgICBBIEN1bHR1cmVJbmZvIG9iamVjdCB0aGF0IHN1cHBsaWVzIGN1bHR1cmUtc3BlY2lmaWMgY29tcGFyaXNvbiBpbmZvcm1hdGlvbi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+DQorICAgICAgICAgICAgaXMgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4gaXMgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLkJvb2xlYW4sU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8sU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgdW5lcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZXkgYXJlIGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibm90RXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBzdHJpbmcgdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgc3RyaW5nIHRoZSB0ZXN0IGV4cGVjdHMgbm90IHRvDQorICAgICAgICAgICAgbWF0Y2ggPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgc3RyaW5nIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIHN0cmluZyBwcm9kdWNlZCBieSB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imlnbm9yZUNhc2UiPg0KKyAgICAgICAgICAgIEEgQm9vbGVhbiBpbmRpY2F0aW5nIGEgY2FzZS1zZW5zaXRpdmUgb3IgaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4gKHRydWUNCisgICAgICAgICAgICBpbmRpY2F0ZXMgYSBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24uKQ0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImN1bHR1cmUiPg0KKyAgICAgICAgICAgIEEgQ3VsdHVyZUluZm8gb2JqZWN0IHRoYXQgc3VwcGxpZXMgY3VsdHVyZS1zcGVjaWZpYyBjb21wYXJpc29uIGluZm9ybWF0aW9uLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4uIFRoZSBtZXNzYWdlIGlzIHNob3duIGluDQorICAgICAgICAgICAgdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlcnMiPg0KKyAgICAgICAgICAgIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZm9ybWF0dGluZyA8cGFyYW1yZWYgbmFtZT0ibWVzc2FnZSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4gaXMgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKFN5c3RlbS5PYmplY3QsU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIHRoZSBleHBlY3RlZA0KKyAgICAgICAgICAgIHR5cGUgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGV4cGVjdGVkIHR5cGUgaXMgbm90IGluIHRoZQ0KKyAgICAgICAgICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBvZiB0aGUgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPg0KKyAgICAgICAgICAgIFRoZSBvYmplY3QgdGhlIHRlc3QgZXhwZWN0cyB0byBiZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWRUeXBlIj4NCisgICAgICAgICAgICBUaGUgZXhwZWN0ZWQgdHlwZSBvZiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+IGlzIG51bGwgb3INCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWRUeXBlIi8+IGlzIG5vdCBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5DQorICAgICAgICAgICAgb2YgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUoU3lzdGVtLk9iamVjdCxTeXN0ZW0uVHlwZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZXhwZWN0ZWQNCisgICAgICAgICAgICB0eXBlIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBleHBlY3RlZCB0eXBlIGlzIG5vdCBpbiB0aGUNCisgICAgICAgICAgICBpbmhlcml0YW5jZSBoaWVyYXJjaHkgb2YgdGhlIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj4NCisgICAgICAgICAgICBUaGUgb2JqZWN0IHRoZSB0ZXN0IGV4cGVjdHMgdG8gYmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkVHlwZSI+DQorICAgICAgICAgICAgVGhlIGV4cGVjdGVkIHR5cGUgb2YgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPg0KKyAgICAgICAgICAgIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWRUeXBlIi8+LiBUaGUgbWVzc2FnZSBpcw0KKyAgICAgICAgICAgIHNob3duIGluIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4gaXMgbnVsbCBvcg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZFR5cGUiLz4gaXMgbm90IGluIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkNCisgICAgICAgICAgICBvZiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShTeXN0ZW0uT2JqZWN0LFN5c3RlbS5UeXBlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZXhwZWN0ZWQNCisgICAgICAgICAgICB0eXBlIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBleHBlY3RlZCB0eXBlIGlzIG5vdCBpbiB0aGUNCisgICAgICAgICAgICBpbmhlcml0YW5jZSBoaWVyYXJjaHkgb2YgdGhlIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj4NCisgICAgICAgICAgICBUaGUgb2JqZWN0IHRoZSB0ZXN0IGV4cGVjdHMgdG8gYmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkVHlwZSI+DQorICAgICAgICAgICAgVGhlIGV4cGVjdGVkIHR5cGUgb2YgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPg0KKyAgICAgICAgICAgIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWRUeXBlIi8+LiBUaGUgbWVzc2FnZSBpcw0KKyAgICAgICAgICAgIHNob3duIGluIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+IGlzIG51bGwgb3INCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWRUeXBlIi8+IGlzIG5vdCBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5DQorICAgICAgICAgICAgb2YgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LklzTm90SW5zdGFuY2VPZlR5cGUoU3lzdGVtLk9iamVjdCxTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSB3cm9uZw0KKyAgICAgICAgICAgIHR5cGUgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCB0eXBlIGlzIGluIHRoZQ0KKyAgICAgICAgICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBvZiB0aGUgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPg0KKyAgICAgICAgICAgIFRoZSBvYmplY3QgdGhlIHRlc3QgZXhwZWN0cyBub3QgdG8gYmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Indyb25nVHlwZSI+DQorICAgICAgICAgICAgVGhlIHR5cGUgdGhhdCA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4gc2hvdWxkIG5vdCBiZS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4gaXMgbm90IG51bGwgYW5kDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9Indyb25nVHlwZSIvPiBpcyBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5DQorICAgICAgICAgICAgb2YgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LklzTm90SW5zdGFuY2VPZlR5cGUoU3lzdGVtLk9iamVjdCxTeXN0ZW0uVHlwZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIHdyb25nDQorICAgICAgICAgICAgdHlwZSBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgaW4gdGhlDQorICAgICAgICAgICAgaW5oZXJpdGFuY2UgaGllcmFyY2h5IG9mIHRoZSBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+DQorICAgICAgICAgICAgVGhlIG9iamVjdCB0aGUgdGVzdCBleHBlY3RzIG5vdCB0byBiZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JvbmdUeXBlIj4NCisgICAgICAgICAgICBUaGUgdHlwZSB0aGF0IDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPiBzaG91bGQgbm90IGJlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPg0KKyAgICAgICAgICAgIGlzIGFuIGluc3RhbmNlIG9mIDxwYXJhbXJlZiBuYW1lPSJ3cm9uZ1R5cGUiLz4uIFRoZSBtZXNzYWdlIGlzIHNob3duDQorICAgICAgICAgICAgaW4gdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPiBpcyBub3QgbnVsbCBhbmQNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0id3JvbmdUeXBlIi8+IGlzIGluIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkNCisgICAgICAgICAgICBvZiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuSXNOb3RJbnN0YW5jZU9mVHlwZShTeXN0ZW0uT2JqZWN0LFN5c3RlbS5UeXBlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIHdyb25nDQorICAgICAgICAgICAgdHlwZSBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgaW4gdGhlDQorICAgICAgICAgICAgaW5oZXJpdGFuY2UgaGllcmFyY2h5IG9mIHRoZSBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+DQorICAgICAgICAgICAgVGhlIG9iamVjdCB0aGUgdGVzdCBleHBlY3RzIG5vdCB0byBiZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JvbmdUeXBlIj4NCisgICAgICAgICAgICBUaGUgdHlwZSB0aGF0IDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPiBzaG91bGQgbm90IGJlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPg0KKyAgICAgICAgICAgIGlzIGFuIGluc3RhbmNlIG9mIDxwYXJhbXJlZiBuYW1lPSJ3cm9uZ1R5cGUiLz4uIFRoZSBtZXNzYWdlIGlzIHNob3duDQorICAgICAgICAgICAgaW4gdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlcnMiPg0KKyAgICAgICAgICAgIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZm9ybWF0dGluZyA8cGFyYW1yZWYgbmFtZT0ibWVzc2FnZSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4gaXMgbm90IG51bGwgYW5kDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9Indyb25nVHlwZSIvPiBpcyBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5DQorICAgICAgICAgICAgb2YgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkZhaWwiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRocm93cyBhbiBBc3NlcnRGYWlsZWRFeGNlcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIEFsd2F5cyB0aHJvd24uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuRmFpbChTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhyb3dzIGFuIEFzc2VydEZhaWxlZEV4Y2VwdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbi4gVGhlIG1lc3NhZ2UgaXMgc2hvd24gaW4NCisgICAgICAgICAgICB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBBbHdheXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkZhaWwoU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaHJvd3MgYW4gQXNzZXJ0RmFpbGVkRXhjZXB0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uLiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBBbHdheXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkluY29uY2x1c2l2ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhyb3dzIGFuIEFzc2VydEluY29uY2x1c2l2ZUV4Y2VwdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEluY29uY2x1c2l2ZUV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgQWx3YXlzIHRocm93bi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5JbmNvbmNsdXNpdmUoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRocm93cyBhbiBBc3NlcnRJbmNvbmNsdXNpdmVFeGNlcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24uIFRoZSBtZXNzYWdlIGlzIHNob3duIGluDQorICAgICAgICAgICAgdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEluY29uY2x1c2l2ZUV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgQWx3YXlzIHRocm93bi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5JbmNvbmNsdXNpdmUoU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaHJvd3MgYW4gQXNzZXJ0SW5jb25jbHVzaXZlRXhjZXB0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uLiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0SW5jb25jbHVzaXZlRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBBbHdheXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkhhbmRsZUZhaWwoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhlbHBlciBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW5kIHRocm93cyBhbiBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhc3NlcnRpb25OYW1lIj5uYW1lIG9mIHRoZSBhc3NlcnRpb24gdGhyb3dpbmcgYW4gZXhjZXB0aW9uLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPm1lc3NhZ2UgZGVzY3JpYmluZyBjb25kaXRpb25zIGZvciBhc3NlcnRpb24gZmFpbHVyZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj5UaGUgcGFyYW1ldGVycy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0LkNoZWNrUGFyYW1ldGVyTm90TnVsbChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENoZWNrcyB0aGUgcGFyYW1ldGVyIGZvciB2YWxpZCBjb25kaXRpb25zDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbSI+VGhlIHBhcmFtZXRlci48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhc3NlcnRpb25OYW1lIj5UaGUgYXNzZXJ0aW9uIG5hbWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVyTmFtZSI+VGhlIHBhcmFtZXRlciBuYW1lLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlcnMiPlRoZSBwYXJhbWV0ZXJzLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnQuUmVwbGFjZU51bGxzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTYWZlbHkgY29udmVydHMgYW4gb2JqZWN0IHRvIGEgc3RyaW5nLCBoYW5kbGluZyBudWxsIHZhbHVlcyBhbmQgbnVsbCBjaGFyYWN0ZXJzLg0KKyAgICAgICAgICAgIE51bGwgdmFsdWVzIGFyZSBjb252ZXJ0ZWQgdG8gIihudWxsKSIuIE51bGwgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIHRvICJcXDAiLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5wdXQiPlRoZSBvYmplY3QgdG8gY29udmVydCB0byBhIHN0cmluZy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRoZSBjb252ZXJ0ZWQgc3RyaW5nLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydC5SZXBsYWNlTnVsbENoYXJzKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXBsYWNlcyBudWxsIGNoYXJhY3RlcnMgKCdcMCcpIHdpdGggIlxcMCIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbnB1dCI+VGhlIHN0cmluZyB0byBzZWFyY2guPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgY29udmVydGVkIHN0cmluZyB3aXRoIG51bGwgY2hhcmFjdGVycyByZXBsYWNlZCBieSAiXFwwIi48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5IZWxwZXIuVGhyb3dJbm5lckV4Y2VwdGlvbihTeXN0ZW0uUmVmbGVjdGlvbi5UYXJnZXRJbnZvY2F0aW9uRXhjZXB0aW9uKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQW4gZXhjZXB0aW9uIGZyb20gcmVmbGVjdGlvbiB3aWxsIGFsd2F5cyBiZSBhIFRhcmdldEludm9jYXRpb25FeGNlcHRpb24gLSBob3dldmVyDQorICAgICAgICAgICAgdGhlIGdvYWwgb2YgUHJpdmF0ZSBBY2Nlc3NvcnMgaXMgdG8gYmUgc2VhbWxlc3MgdG8gdGhlIG9yaWdpbmFsIGNvZGUuDQorICAgICAgICAgICAgVGhlIG9ubHkgcHJvYmxlbSB3aXRoIHRocm93aW5nIHRoZSBpbm5lciBleGNlcHRpb24gaXMgdGhhdCB0aGUgc3RhY2sgdHJhY2Ugd2lsbA0KKyAgICAgICAgICAgIGJlIG92ZXJ3cml0dGVuLiAgRnJvbSBoZXJlIHdlIHJlZ2lzdGVyIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgaW5uZXIgZXhjZXB0aW9uDQorICAgICAgICAgICAgYW5kIHRoZW4gdGhyb3cgaXQuICBUaGUgVW5pdCBUZXN0IEFkYXB0ZXIgd2lsbCB0aGVuIGxhdGVyIHJlYnVpbGQgdGhlIHN0YWNrDQorICAgICAgICAgICAgZnJvbSB0aGUgY2FjaGVkIHNoYWRvdyBpbmZvcm1hdGlvbiBwbHVzIHRoZSByZW1haW5pbmcgc3RhY2sgZnJvbSB0aGlzIHRocm93Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ib3V0ZXIiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIGNvbGxlY3Rpb24gb2YgaGVscGVyIGNsYXNzZXMgdG8gdGVzdCB2YXJpb3VzIGNvbmRpdGlvbnMgYXNzb2NpYXRlZA0KKyAgICAgICAgICAgIHdpdGggY29sbGVjdGlvbnMgd2l0aGluIHVuaXQgdGVzdHMuIElmIHRoZSBjb25kaXRpb24gYmVpbmcgdGVzdGVkIGlzIG5vdA0KKyAgICAgICAgICAgIG1ldCwgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LkNvbnRhaW5zKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50DQorICAgICAgICAgICAgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGVsZW1lbnQgaXMgbm90IGluIHRoZSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+DQorICAgICAgICAgICAgVGhlIGNvbGxlY3Rpb24gaW4gd2hpY2ggdG8gc2VhcmNoIGZvciB0aGUgZWxlbWVudC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij4NCisgICAgICAgICAgICBUaGUgZWxlbWVudCB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJlbGVtZW50Ii8+IGlzIG5vdCBmb3VuZCBpbg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJjb2xsZWN0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ29sbGVjdGlvbkFzc2VydC5Db250YWlucyhTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50DQorICAgICAgICAgICAgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGVsZW1lbnQgaXMgbm90IGluIHRoZSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+DQorICAgICAgICAgICAgVGhlIGNvbGxlY3Rpb24gaW4gd2hpY2ggdG8gc2VhcmNoIGZvciB0aGUgZWxlbWVudC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij4NCisgICAgICAgICAgICBUaGUgZWxlbWVudCB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJlbGVtZW50Ii8+DQorICAgICAgICAgICAgaXMgbm90IGluIDxwYXJhbXJlZiBuYW1lPSJjb2xsZWN0aW9uIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0iZWxlbWVudCIvPiBpcyBub3QgZm91bmQgaW4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iY29sbGVjdGlvbiIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNvbGxlY3Rpb25Bc3NlcnQuQ29udGFpbnMoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5PYmplY3QsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQNCisgICAgICAgICAgICBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj4NCisgICAgICAgICAgICBUaGUgY29sbGVjdGlvbiBpbiB3aGljaCB0byBzZWFyY2ggZm9yIHRoZSBlbGVtZW50Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnQiPg0KKyAgICAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImVsZW1lbnQiLz4NCisgICAgICAgICAgICBpcyBub3QgaW4gPHBhcmFtcmVmIG5hbWU9ImNvbGxlY3Rpb24iLz4uIFRoZSBtZXNzYWdlIGlzIHNob3duIGluDQorICAgICAgICAgICAgdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlcnMiPg0KKyAgICAgICAgICAgIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZm9ybWF0dGluZyA8cGFyYW1yZWYgbmFtZT0ibWVzc2FnZSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0iZWxlbWVudCIvPiBpcyBub3QgZm91bmQgaW4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iY29sbGVjdGlvbiIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNvbGxlY3Rpb25Bc3NlcnQuRG9lc05vdENvbnRhaW4oU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBkb2VzIG5vdCBjb250YWluIHRoZSBzcGVjaWZpZWQNCisgICAgICAgICAgICBlbGVtZW50IGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+DQorICAgICAgICAgICAgVGhlIGNvbGxlY3Rpb24gaW4gd2hpY2ggdG8gc2VhcmNoIGZvciB0aGUgZWxlbWVudC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij4NCisgICAgICAgICAgICBUaGUgZWxlbWVudCB0aGF0IGlzIGV4cGVjdGVkIG5vdCB0byBiZSBpbiB0aGUgY29sbGVjdGlvbi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0iZWxlbWVudCIvPiBpcyBmb3VuZCBpbg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJjb2xsZWN0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ29sbGVjdGlvbkFzc2VydC5Eb2VzTm90Q29udGFpbihTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gZG9lcyBub3QgY29udGFpbiB0aGUgc3BlY2lmaWVkDQorICAgICAgICAgICAgZWxlbWVudCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBpcyBpbiB0aGUgY29sbGVjdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPg0KKyAgICAgICAgICAgIFRoZSBjb2xsZWN0aW9uIGluIHdoaWNoIHRvIHNlYXJjaCBmb3IgdGhlIGVsZW1lbnQuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZWxlbWVudCI+DQorICAgICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCBpcyBleHBlY3RlZCBub3QgdG8gYmUgaW4gdGhlIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImVsZW1lbnQiLz4NCisgICAgICAgICAgICBpcyBpbiA8cGFyYW1yZWYgbmFtZT0iY29sbGVjdGlvbiIvPi4gVGhlIG1lc3NhZ2UgaXMgc2hvd24gaW4gdGVzdA0KKyAgICAgICAgICAgIHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImVsZW1lbnQiLz4gaXMgZm91bmQgaW4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iY29sbGVjdGlvbiIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNvbGxlY3Rpb25Bc3NlcnQuRG9lc05vdENvbnRhaW4oU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5PYmplY3QsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBkb2VzIG5vdCBjb250YWluIHRoZSBzcGVjaWZpZWQNCisgICAgICAgICAgICBlbGVtZW50IGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+DQorICAgICAgICAgICAgVGhlIGNvbGxlY3Rpb24gaW4gd2hpY2ggdG8gc2VhcmNoIGZvciB0aGUgZWxlbWVudC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbGVtZW50Ij4NCisgICAgICAgICAgICBUaGUgZWxlbWVudCB0aGF0IGlzIGV4cGVjdGVkIG5vdCB0byBiZSBpbiB0aGUgY29sbGVjdGlvbi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iZWxlbWVudCIvPg0KKyAgICAgICAgICAgIGlzIGluIDxwYXJhbXJlZiBuYW1lPSJjb2xsZWN0aW9uIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0DQorICAgICAgICAgICAgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9ImVsZW1lbnQiLz4gaXMgZm91bmQgaW4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iY29sbGVjdGlvbiIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNvbGxlY3Rpb25Bc3NlcnQuQWxsSXRlbXNBcmVOb3ROdWxsKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgYWxsIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBhcmUgbm9uLW51bGwgYW5kIHRocm93cw0KKyAgICAgICAgICAgIGFuIGV4Y2VwdGlvbiBpZiBhbnkgZWxlbWVudCBpcyBudWxsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+DQorICAgICAgICAgICAgVGhlIGNvbGxlY3Rpb24gaW4gd2hpY2ggdG8gc2VhcmNoIGZvciBudWxsIGVsZW1lbnRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIGEgbnVsbCBlbGVtZW50IGlzIGZvdW5kIGluIDxwYXJhbXJlZiBuYW1lPSJjb2xsZWN0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ29sbGVjdGlvbkFzc2VydC5BbGxJdGVtc0FyZU5vdE51bGwoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIGFsbCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gYXJlIG5vbi1udWxsIGFuZCB0aHJvd3MNCisgICAgICAgICAgICBhbiBleGNlcHRpb24gaWYgYW55IGVsZW1lbnQgaXMgbnVsbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPg0KKyAgICAgICAgICAgIFRoZSBjb2xsZWN0aW9uIGluIHdoaWNoIHRvIHNlYXJjaCBmb3IgbnVsbCBlbGVtZW50cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iY29sbGVjdGlvbiIvPg0KKyAgICAgICAgICAgIGNvbnRhaW5zIGEgbnVsbCBlbGVtZW50LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgYSBudWxsIGVsZW1lbnQgaXMgZm91bmQgaW4gPHBhcmFtcmVmIG5hbWU9ImNvbGxlY3Rpb24iLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LkFsbEl0ZW1zQXJlTm90TnVsbChTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIGFsbCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gYXJlIG5vbi1udWxsIGFuZCB0aHJvd3MNCisgICAgICAgICAgICBhbiBleGNlcHRpb24gaWYgYW55IGVsZW1lbnQgaXMgbnVsbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPg0KKyAgICAgICAgICAgIFRoZSBjb2xsZWN0aW9uIGluIHdoaWNoIHRvIHNlYXJjaCBmb3IgbnVsbCBlbGVtZW50cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iY29sbGVjdGlvbiIvPg0KKyAgICAgICAgICAgIGNvbnRhaW5zIGEgbnVsbCBlbGVtZW50LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVycyI+DQorICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBmb3JtYXR0aW5nIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIGEgbnVsbCBlbGVtZW50IGlzIGZvdW5kIGluIDxwYXJhbXJlZiBuYW1lPSJjb2xsZWN0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ29sbGVjdGlvbkFzc2VydC5BbGxJdGVtc0FyZVVuaXF1ZShTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIGFsbCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gYXJlIHVuaXF1ZSBvciBub3QgYW5kDQorICAgICAgICAgICAgdGhyb3dzIGlmIGFueSB0d28gZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24gYXJlIGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+DQorICAgICAgICAgICAgVGhlIGNvbGxlY3Rpb24gaW4gd2hpY2ggdG8gc2VhcmNoIGZvciBkdXBsaWNhdGUgZWxlbWVudHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgYSB0d28gb3IgbW9yZSBlcXVhbCBlbGVtZW50cyBhcmUgZm91bmQgaW4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iY29sbGVjdGlvbiIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNvbGxlY3Rpb25Bc3NlcnQuQWxsSXRlbXNBcmVVbmlxdWUoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIGFsbCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gYXJlIHVuaXF1ZSBvciBub3QgYW5kDQorICAgICAgICAgICAgdGhyb3dzIGlmIGFueSB0d28gZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24gYXJlIGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+DQorICAgICAgICAgICAgVGhlIGNvbGxlY3Rpb24gaW4gd2hpY2ggdG8gc2VhcmNoIGZvciBkdXBsaWNhdGUgZWxlbWVudHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImNvbGxlY3Rpb24iLz4NCisgICAgICAgICAgICBjb250YWlucyBhdCBsZWFzdCBvbmUgZHVwbGljYXRlIGVsZW1lbnQuIFRoZSBtZXNzYWdlIGlzIHNob3duIGluDQorICAgICAgICAgICAgdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIGEgdHdvIG9yIG1vcmUgZXF1YWwgZWxlbWVudHMgYXJlIGZvdW5kIGluDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImNvbGxlY3Rpb24iLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LkFsbEl0ZW1zQXJlVW5pcXVlKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgYWxsIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBhcmUgdW5pcXVlIG9yIG5vdCBhbmQNCisgICAgICAgICAgICB0aHJvd3MgaWYgYW55IHR3byBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbiBhcmUgZXF1YWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj4NCisgICAgICAgICAgICBUaGUgY29sbGVjdGlvbiBpbiB3aGljaCB0byBzZWFyY2ggZm9yIGR1cGxpY2F0ZSBlbGVtZW50cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iY29sbGVjdGlvbiIvPg0KKyAgICAgICAgICAgIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBkdXBsaWNhdGUgZWxlbWVudC4gVGhlIG1lc3NhZ2UgaXMgc2hvd24gaW4NCisgICAgICAgICAgICB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVycyI+DQorICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBmb3JtYXR0aW5nIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIGEgdHdvIG9yIG1vcmUgZXF1YWwgZWxlbWVudHMgYXJlIGZvdW5kIGluDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImNvbGxlY3Rpb24iLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LklzU3Vic2V0T2YoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgb25lIGNvbGxlY3Rpb24gaXMgYSBzdWJzZXQgb2YgYW5vdGhlciBjb2xsZWN0aW9uIGFuZA0KKyAgICAgICAgICAgIHRocm93cyBhbiBleGNlcHRpb24gaWYgYW55IGVsZW1lbnQgaW4gdGhlIHN1YnNldCBpcyBub3QgYWxzbyBpbiB0aGUNCisgICAgICAgICAgICBzdXBlcnNldC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1YnNldCI+DQorICAgICAgICAgICAgVGhlIGNvbGxlY3Rpb24gZXhwZWN0ZWQgdG8gYmUgYSBzdWJzZXQgb2YgPHBhcmFtcmVmIG5hbWU9InN1cGVyc2V0Ii8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1cGVyc2V0Ij4NCisgICAgICAgICAgICBUaGUgY29sbGVjdGlvbiBleHBlY3RlZCB0byBiZSBhIHN1cGVyc2V0IG9mIDxwYXJhbXJlZiBuYW1lPSJzdWJzZXQiLz4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiBhbiBlbGVtZW50IGluIDxwYXJhbXJlZiBuYW1lPSJzdWJzZXQiLz4gaXMgbm90IGZvdW5kIGluDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9InN1cGVyc2V0Ii8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ29sbGVjdGlvbkFzc2VydC5Jc1N1YnNldE9mKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgb25lIGNvbGxlY3Rpb24gaXMgYSBzdWJzZXQgb2YgYW5vdGhlciBjb2xsZWN0aW9uIGFuZA0KKyAgICAgICAgICAgIHRocm93cyBhbiBleGNlcHRpb24gaWYgYW55IGVsZW1lbnQgaW4gdGhlIHN1YnNldCBpcyBub3QgYWxzbyBpbiB0aGUNCisgICAgICAgICAgICBzdXBlcnNldC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1YnNldCI+DQorICAgICAgICAgICAgVGhlIGNvbGxlY3Rpb24gZXhwZWN0ZWQgdG8gYmUgYSBzdWJzZXQgb2YgPHBhcmFtcmVmIG5hbWU9InN1cGVyc2V0Ii8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1cGVyc2V0Ij4NCisgICAgICAgICAgICBUaGUgY29sbGVjdGlvbiBleHBlY3RlZCB0byBiZSBhIHN1cGVyc2V0IG9mIDxwYXJhbXJlZiBuYW1lPSJzdWJzZXQiLz4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiBhbiBlbGVtZW50IGluDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9InN1YnNldCIvPiBpcyBub3QgZm91bmQgaW4gPHBhcmFtcmVmIG5hbWU9InN1cGVyc2V0Ii8+Lg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIGlzIHNob3duIGluIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiBhbiBlbGVtZW50IGluIDxwYXJhbXJlZiBuYW1lPSJzdWJzZXQiLz4gaXMgbm90IGZvdW5kIGluDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9InN1cGVyc2V0Ii8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ29sbGVjdGlvbkFzc2VydC5Jc1N1YnNldE9mKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIG9uZSBjb2xsZWN0aW9uIGlzIGEgc3Vic2V0IG9mIGFub3RoZXIgY29sbGVjdGlvbiBhbmQNCisgICAgICAgICAgICB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIGFueSBlbGVtZW50IGluIHRoZSBzdWJzZXQgaXMgbm90IGFsc28gaW4gdGhlDQorICAgICAgICAgICAgc3VwZXJzZXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdWJzZXQiPg0KKyAgICAgICAgICAgIFRoZSBjb2xsZWN0aW9uIGV4cGVjdGVkIHRvIGJlIGEgc3Vic2V0IG9mIDxwYXJhbXJlZiBuYW1lPSJzdXBlcnNldCIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdXBlcnNldCI+DQorICAgICAgICAgICAgVGhlIGNvbGxlY3Rpb24gZXhwZWN0ZWQgdG8gYmUgYSBzdXBlcnNldCBvZiA8cGFyYW1yZWYgbmFtZT0ic3Vic2V0Ii8+DQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gYW4gZWxlbWVudCBpbg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJzdWJzZXQiLz4gaXMgbm90IGZvdW5kIGluIDxwYXJhbXJlZiBuYW1lPSJzdXBlcnNldCIvPi4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVycyI+DQorICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBmb3JtYXR0aW5nIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIGFuIGVsZW1lbnQgaW4gPHBhcmFtcmVmIG5hbWU9InN1YnNldCIvPiBpcyBub3QgZm91bmQgaW4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0ic3VwZXJzZXQiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LklzTm90U3Vic2V0T2YoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgb25lIGNvbGxlY3Rpb24gaXMgbm90IGEgc3Vic2V0IG9mIGFub3RoZXIgY29sbGVjdGlvbiBhbmQNCisgICAgICAgICAgICB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIGFsbCBlbGVtZW50cyBpbiB0aGUgc3Vic2V0IGFyZSBhbHNvIGluIHRoZQ0KKyAgICAgICAgICAgIHN1cGVyc2V0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3Vic2V0Ij4NCisgICAgICAgICAgICBUaGUgY29sbGVjdGlvbiBleHBlY3RlZCBub3QgdG8gYmUgYSBzdWJzZXQgb2YgPHBhcmFtcmVmIG5hbWU9InN1cGVyc2V0Ii8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1cGVyc2V0Ij4NCisgICAgICAgICAgICBUaGUgY29sbGVjdGlvbiBleHBlY3RlZCBub3QgdG8gYmUgYSBzdXBlcnNldCBvZiA8cGFyYW1yZWYgbmFtZT0ic3Vic2V0Ii8+DQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgZXZlcnkgZWxlbWVudCBpbiA8cGFyYW1yZWYgbmFtZT0ic3Vic2V0Ii8+IGlzIGFsc28gZm91bmQgaW4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0ic3VwZXJzZXQiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LklzTm90U3Vic2V0T2YoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciBvbmUgY29sbGVjdGlvbiBpcyBub3QgYSBzdWJzZXQgb2YgYW5vdGhlciBjb2xsZWN0aW9uIGFuZA0KKyAgICAgICAgICAgIHRocm93cyBhbiBleGNlcHRpb24gaWYgYWxsIGVsZW1lbnRzIGluIHRoZSBzdWJzZXQgYXJlIGFsc28gaW4gdGhlDQorICAgICAgICAgICAgc3VwZXJzZXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdWJzZXQiPg0KKyAgICAgICAgICAgIFRoZSBjb2xsZWN0aW9uIGV4cGVjdGVkIG5vdCB0byBiZSBhIHN1YnNldCBvZiA8cGFyYW1yZWYgbmFtZT0ic3VwZXJzZXQiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3VwZXJzZXQiPg0KKyAgICAgICAgICAgIFRoZSBjb2xsZWN0aW9uIGV4cGVjdGVkIG5vdCB0byBiZSBhIHN1cGVyc2V0IG9mIDxwYXJhbXJlZiBuYW1lPSJzdWJzZXQiLz4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiBldmVyeSBlbGVtZW50IGluDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9InN1YnNldCIvPiBpcyBhbHNvIGZvdW5kIGluIDxwYXJhbXJlZiBuYW1lPSJzdXBlcnNldCIvPi4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgZXZlcnkgZWxlbWVudCBpbiA8cGFyYW1yZWYgbmFtZT0ic3Vic2V0Ii8+IGlzIGFsc28gZm91bmQgaW4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0ic3VwZXJzZXQiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LklzTm90U3Vic2V0T2YoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgb25lIGNvbGxlY3Rpb24gaXMgbm90IGEgc3Vic2V0IG9mIGFub3RoZXIgY29sbGVjdGlvbiBhbmQNCisgICAgICAgICAgICB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIGFsbCBlbGVtZW50cyBpbiB0aGUgc3Vic2V0IGFyZSBhbHNvIGluIHRoZQ0KKyAgICAgICAgICAgIHN1cGVyc2V0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3Vic2V0Ij4NCisgICAgICAgICAgICBUaGUgY29sbGVjdGlvbiBleHBlY3RlZCBub3QgdG8gYmUgYSBzdWJzZXQgb2YgPHBhcmFtcmVmIG5hbWU9InN1cGVyc2V0Ii8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1cGVyc2V0Ij4NCisgICAgICAgICAgICBUaGUgY29sbGVjdGlvbiBleHBlY3RlZCBub3QgdG8gYmUgYSBzdXBlcnNldCBvZiA8cGFyYW1yZWYgbmFtZT0ic3Vic2V0Ii8+DQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gZXZlcnkgZWxlbWVudCBpbg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJzdWJzZXQiLz4gaXMgYWxzbyBmb3VuZCBpbiA8cGFyYW1yZWYgbmFtZT0ic3VwZXJzZXQiLz4uDQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgaXMgc2hvd24gaW4gdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlcnMiPg0KKyAgICAgICAgICAgIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZm9ybWF0dGluZyA8cGFyYW1yZWYgbmFtZT0ibWVzc2FnZSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiBldmVyeSBlbGVtZW50IGluIDxwYXJhbXJlZiBuYW1lPSJzdWJzZXQiLz4gaXMgYWxzbyBmb3VuZCBpbg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJzdXBlcnNldCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1aXZhbGVudChTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0d28gY29sbGVjdGlvbnMgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cyBhbmQgdGhyb3dzIGFuDQorICAgICAgICAgICAgZXhjZXB0aW9uIGlmIGVpdGhlciBjb2xsZWN0aW9uIGNvbnRhaW5zIGFuIGVsZW1lbnQgbm90IGluIHRoZSBvdGhlcg0KKyAgICAgICAgICAgIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IGNvbGxlY3Rpb24gdG8gY29tcGFyZS4gVGhpcyBjb250YWlucyB0aGUgZWxlbWVudHMgdGhlIHRlc3QNCisgICAgICAgICAgICBleHBlY3RzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBjb2xsZWN0aW9uIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gcHJvZHVjZWQgYnkNCisgICAgICAgICAgICB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIGFuIGVsZW1lbnQgd2FzIGZvdW5kIGluIG9uZSBvZiB0aGUgY29sbGVjdGlvbnMgYnV0IG5vdA0KKyAgICAgICAgICAgIHRoZSBvdGhlci4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1aXZhbGVudChTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHR3byBjb2xsZWN0aW9ucyBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzIGFuZCB0aHJvd3MgYW4NCisgICAgICAgICAgICBleGNlcHRpb24gaWYgZWl0aGVyIGNvbGxlY3Rpb24gY29udGFpbnMgYW4gZWxlbWVudCBub3QgaW4gdGhlIG90aGVyDQorICAgICAgICAgICAgY29sbGVjdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3QgY29sbGVjdGlvbiB0byBjb21wYXJlLiBUaGlzIGNvbnRhaW5zIHRoZSBlbGVtZW50cyB0aGUgdGVzdA0KKyAgICAgICAgICAgIGV4cGVjdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIGNvbGxlY3Rpb24gdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgY29sbGVjdGlvbiBwcm9kdWNlZCBieQ0KKyAgICAgICAgICAgIHRoZSBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gYW4gZWxlbWVudCB3YXMgZm91bmQNCisgICAgICAgICAgICBpbiBvbmUgb2YgdGhlIGNvbGxlY3Rpb25zIGJ1dCBub3QgdGhlIG90aGVyLiBUaGUgbWVzc2FnZSBpcyBzaG93bg0KKyAgICAgICAgICAgIGluIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiBhbiBlbGVtZW50IHdhcyBmb3VuZCBpbiBvbmUgb2YgdGhlIGNvbGxlY3Rpb25zIGJ1dCBub3QNCisgICAgICAgICAgICB0aGUgb3RoZXIuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWl2YWxlbnQoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdHdvIGNvbGxlY3Rpb25zIGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMgYW5kIHRocm93cyBhbg0KKyAgICAgICAgICAgIGV4Y2VwdGlvbiBpZiBlaXRoZXIgY29sbGVjdGlvbiBjb250YWlucyBhbiBlbGVtZW50IG5vdCBpbiB0aGUgb3RoZXINCisgICAgICAgICAgICBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBjb2xsZWN0aW9uIHRvIGNvbXBhcmUuIFRoaXMgY29udGFpbnMgdGhlIGVsZW1lbnRzIHRoZSB0ZXN0DQorICAgICAgICAgICAgZXhwZWN0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgY29sbGVjdGlvbiB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBjb2xsZWN0aW9uIHByb2R1Y2VkIGJ5DQorICAgICAgICAgICAgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiBhbiBlbGVtZW50IHdhcyBmb3VuZA0KKyAgICAgICAgICAgIGluIG9uZSBvZiB0aGUgY29sbGVjdGlvbnMgYnV0IG5vdCB0aGUgb3RoZXIuIFRoZSBtZXNzYWdlIGlzIHNob3duDQorICAgICAgICAgICAgaW4gdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlcnMiPg0KKyAgICAgICAgICAgIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZm9ybWF0dGluZyA8cGFyYW1yZWYgbmFtZT0ibWVzc2FnZSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiBhbiBlbGVtZW50IHdhcyBmb3VuZCBpbiBvbmUgb2YgdGhlIGNvbGxlY3Rpb25zIGJ1dCBub3QNCisgICAgICAgICAgICB0aGUgb3RoZXIuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LkFyZU5vdEVxdWl2YWxlbnQoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdHdvIGNvbGxlY3Rpb25zIGNvbnRhaW4gdGhlIGRpZmZlcmVudCBlbGVtZW50cyBhbmQgdGhyb3dzIGFuDQorICAgICAgICAgICAgZXhjZXB0aW9uIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgY29udGFpbiBpZGVudGljYWwgZWxlbWVudHMgd2l0aG91dCByZWdhcmQNCisgICAgICAgICAgICB0byBvcmRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3QgY29sbGVjdGlvbiB0byBjb21wYXJlLiBUaGlzIGNvbnRhaW5zIHRoZSBlbGVtZW50cyB0aGUgdGVzdA0KKyAgICAgICAgICAgIGV4cGVjdHMgdG8gYmUgZGlmZmVyZW50IHRoYW4gdGhlIGFjdHVhbCBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBjb2xsZWN0aW9uIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gcHJvZHVjZWQgYnkNCisgICAgICAgICAgICB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgY29udGFpbmVkIHRoZSBzYW1lIGVsZW1lbnRzLCBpbmNsdWRpbmcNCisgICAgICAgICAgICB0aGUgc2FtZSBudW1iZXIgb2YgZHVwbGljYXRlIG9jY3VycmVuY2VzIG9mIGVhY2ggZWxlbWVudC4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNvbGxlY3Rpb25Bc3NlcnQuQXJlTm90RXF1aXZhbGVudChTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHR3byBjb2xsZWN0aW9ucyBjb250YWluIHRoZSBkaWZmZXJlbnQgZWxlbWVudHMgYW5kIHRocm93cyBhbg0KKyAgICAgICAgICAgIGV4Y2VwdGlvbiBpZiB0aGUgdHdvIGNvbGxlY3Rpb25zIGNvbnRhaW4gaWRlbnRpY2FsIGVsZW1lbnRzIHdpdGhvdXQgcmVnYXJkDQorICAgICAgICAgICAgdG8gb3JkZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IGNvbGxlY3Rpb24gdG8gY29tcGFyZS4gVGhpcyBjb250YWlucyB0aGUgZWxlbWVudHMgdGhlIHRlc3QNCisgICAgICAgICAgICBleHBlY3RzIHRvIGJlIGRpZmZlcmVudCB0aGFuIHRoZSBhY3R1YWwgY29sbGVjdGlvbi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgY29sbGVjdGlvbiB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBjb2xsZWN0aW9uIHByb2R1Y2VkIGJ5DQorICAgICAgICAgICAgdGhlIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+DQorICAgICAgICAgICAgY29udGFpbnMgdGhlIHNhbWUgZWxlbWVudHMgYXMgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+LiBUaGUgbWVzc2FnZQ0KKyAgICAgICAgICAgIGlzIHNob3duIGluIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiB0aGUgdHdvIGNvbGxlY3Rpb25zIGNvbnRhaW5lZCB0aGUgc2FtZSBlbGVtZW50cywgaW5jbHVkaW5nDQorICAgICAgICAgICAgdGhlIHNhbWUgbnVtYmVyIG9mIGR1cGxpY2F0ZSBvY2N1cnJlbmNlcyBvZiBlYWNoIGVsZW1lbnQuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LkFyZU5vdEVxdWl2YWxlbnQoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdHdvIGNvbGxlY3Rpb25zIGNvbnRhaW4gdGhlIGRpZmZlcmVudCBlbGVtZW50cyBhbmQgdGhyb3dzIGFuDQorICAgICAgICAgICAgZXhjZXB0aW9uIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgY29udGFpbiBpZGVudGljYWwgZWxlbWVudHMgd2l0aG91dCByZWdhcmQNCisgICAgICAgICAgICB0byBvcmRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3QgY29sbGVjdGlvbiB0byBjb21wYXJlLiBUaGlzIGNvbnRhaW5zIHRoZSBlbGVtZW50cyB0aGUgdGVzdA0KKyAgICAgICAgICAgIGV4cGVjdHMgdG8gYmUgZGlmZmVyZW50IHRoYW4gdGhlIGFjdHVhbCBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBjb2xsZWN0aW9uIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gcHJvZHVjZWQgYnkNCisgICAgICAgICAgICB0aGUgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBjb250YWlucyB0aGUgc2FtZSBlbGVtZW50cyBhcyA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4uIFRoZSBtZXNzYWdlDQorICAgICAgICAgICAgaXMgc2hvd24gaW4gdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlcnMiPg0KKyAgICAgICAgICAgIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZm9ybWF0dGluZyA8cGFyYW1yZWYgbmFtZT0ibWVzc2FnZSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiB0aGUgdHdvIGNvbGxlY3Rpb25zIGNvbnRhaW5lZCB0aGUgc2FtZSBlbGVtZW50cywgaW5jbHVkaW5nDQorICAgICAgICAgICAgdGhlIHNhbWUgbnVtYmVyIG9mIGR1cGxpY2F0ZSBvY2N1cnJlbmNlcyBvZiBlYWNoIGVsZW1lbnQuDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LkFsbEl0ZW1zQXJlSW5zdGFuY2VzT2ZUeXBlKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgYWxsIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBhcmUgaW5zdGFuY2VzDQorICAgICAgICAgICAgb2YgdGhlIGV4cGVjdGVkIHR5cGUgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGV4cGVjdGVkIHR5cGUgaXMNCisgICAgICAgICAgICBub3QgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgZWxlbWVudHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj4NCisgICAgICAgICAgICBUaGUgY29sbGVjdGlvbiBjb250YWluaW5nIGVsZW1lbnRzIHRoZSB0ZXN0IGV4cGVjdHMgdG8gYmUgb2YgdGhlDQorICAgICAgICAgICAgc3BlY2lmaWVkIHR5cGUuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWRUeXBlIj4NCisgICAgICAgICAgICBUaGUgZXhwZWN0ZWQgdHlwZSBvZiBlYWNoIGVsZW1lbnQgb2YgPHBhcmFtcmVmIG5hbWU9ImNvbGxlY3Rpb24iLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgYW4gZWxlbWVudCBpbiA8cGFyYW1yZWYgbmFtZT0iY29sbGVjdGlvbiIvPiBpcyBudWxsIG9yDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkVHlwZSIvPiBpcyBub3QgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQ0KKyAgICAgICAgICAgIG9mIGFuIGVsZW1lbnQgaW4gPHBhcmFtcmVmIG5hbWU9ImNvbGxlY3Rpb24iLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LkFsbEl0ZW1zQXJlSW5zdGFuY2VzT2ZUeXBlKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uVHlwZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciBhbGwgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGFyZSBpbnN0YW5jZXMNCisgICAgICAgICAgICBvZiB0aGUgZXhwZWN0ZWQgdHlwZSBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhwZWN0ZWQgdHlwZSBpcw0KKyAgICAgICAgICAgIG5vdCBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IG9mIG9uZSBvciBtb3JlIG9mIHRoZSBlbGVtZW50cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPg0KKyAgICAgICAgICAgIFRoZSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgZWxlbWVudHMgdGhlIHRlc3QgZXhwZWN0cyB0byBiZSBvZiB0aGUNCisgICAgICAgICAgICBzcGVjaWZpZWQgdHlwZS4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZFR5cGUiPg0KKyAgICAgICAgICAgIFRoZSBleHBlY3RlZCB0eXBlIG9mIGVhY2ggZWxlbWVudCBvZiA8cGFyYW1yZWYgbmFtZT0iY29sbGVjdGlvbiIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiBhbiBlbGVtZW50IGluDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImNvbGxlY3Rpb24iLz4gaXMgbm90IGFuIGluc3RhbmNlIG9mDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkVHlwZSIvPi4gVGhlIG1lc3NhZ2UgaXMgc2hvd24gaW4gdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIGFuIGVsZW1lbnQgaW4gPHBhcmFtcmVmIG5hbWU9ImNvbGxlY3Rpb24iLz4gaXMgbnVsbCBvcg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZFR5cGUiLz4gaXMgbm90IGluIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkNCisgICAgICAgICAgICBvZiBhbiBlbGVtZW50IGluIDxwYXJhbXJlZiBuYW1lPSJjb2xsZWN0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ29sbGVjdGlvbkFzc2VydC5BbGxJdGVtc0FyZUluc3RhbmNlc09mVHlwZShTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLlR5cGUsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIGFsbCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gYXJlIGluc3RhbmNlcw0KKyAgICAgICAgICAgIG9mIHRoZSBleHBlY3RlZCB0eXBlIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBleHBlY3RlZCB0eXBlIGlzDQorICAgICAgICAgICAgbm90IGluIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkgb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGVsZW1lbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+DQorICAgICAgICAgICAgVGhlIGNvbGxlY3Rpb24gY29udGFpbmluZyBlbGVtZW50cyB0aGUgdGVzdCBleHBlY3RzIHRvIGJlIG9mIHRoZQ0KKyAgICAgICAgICAgIHNwZWNpZmllZCB0eXBlLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkVHlwZSI+DQorICAgICAgICAgICAgVGhlIGV4cGVjdGVkIHR5cGUgb2YgZWFjaCBlbGVtZW50IG9mIDxwYXJhbXJlZiBuYW1lPSJjb2xsZWN0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIGFuIGVsZW1lbnQgaW4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iY29sbGVjdGlvbiIvPiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWRUeXBlIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVycyI+DQorICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBmb3JtYXR0aW5nIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIGFuIGVsZW1lbnQgaW4gPHBhcmFtcmVmIG5hbWU9ImNvbGxlY3Rpb24iLz4gaXMgbnVsbCBvcg0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZFR5cGUiLz4gaXMgbm90IGluIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkNCisgICAgICAgICAgICBvZiBhbiBlbGVtZW50IGluIDxwYXJhbXJlZiBuYW1lPSJjb2xsZWN0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ29sbGVjdGlvbkFzc2VydC5BcmVFcXVhbChTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb25zIGFyZSBlcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgYXJlIG5vdCBlcXVhbC4gRXF1YWxpdHkgaXMgZGVmaW5lZCBhcyBoYXZpbmcgdGhlIHNhbWUNCisgICAgICAgICAgICBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlciBhbmQgcXVhbnRpdHkuIERpZmZlcmVudCByZWZlcmVuY2VzIHRvIHRoZSBzYW1lDQorICAgICAgICAgICAgdmFsdWUgYXJlIGNvbnNpZGVyZWQgZXF1YWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IGNvbGxlY3Rpb24gdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgY29sbGVjdGlvbiB0aGUgdGVzdHMgZXhwZWN0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgY29sbGVjdGlvbiB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBjb2xsZWN0aW9uIHByb2R1Y2VkIGJ5IHRoZQ0KKyAgICAgICAgICAgIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4gaXMgbm90IGVxdWFsIHRvIA0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9ucyBhcmUgZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGUgdHdvIGNvbGxlY3Rpb25zIGFyZSBub3QgZXF1YWwuIEVxdWFsaXR5IGlzIGRlZmluZWQgYXMgaGF2aW5nIHRoZSBzYW1lDQorICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHF1YW50aXR5LiBEaWZmZXJlbnQgcmVmZXJlbmNlcyB0byB0aGUgc2FtZQ0KKyAgICAgICAgICAgIHZhbHVlIGFyZSBjb25zaWRlcmVkIGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBjb2xsZWN0aW9uIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gdGhlIHRlc3RzIGV4cGVjdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIGNvbGxlY3Rpb24gdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgY29sbGVjdGlvbiBwcm9kdWNlZCBieSB0aGUNCisgICAgICAgICAgICBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPg0KKyAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4uIFRoZSBtZXNzYWdlIGlzIHNob3duIGluDQorICAgICAgICAgICAgdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZCIvPiBpcyBub3QgZXF1YWwgdG8gDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9ucyBhcmUgZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGUgdHdvIGNvbGxlY3Rpb25zIGFyZSBub3QgZXF1YWwuIEVxdWFsaXR5IGlzIGRlZmluZWQgYXMgaGF2aW5nIHRoZSBzYW1lDQorICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHF1YW50aXR5LiBEaWZmZXJlbnQgcmVmZXJlbmNlcyB0byB0aGUgc2FtZQ0KKyAgICAgICAgICAgIHZhbHVlIGFyZSBjb25zaWRlcmVkIGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBjb2xsZWN0aW9uIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gdGhlIHRlc3RzIGV4cGVjdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIGNvbGxlY3Rpb24gdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgY29sbGVjdGlvbiBwcm9kdWNlZCBieSB0aGUNCisgICAgICAgICAgICBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPg0KKyAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4uIFRoZSBtZXNzYWdlIGlzIHNob3duIGluDQorICAgICAgICAgICAgdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlcnMiPg0KKyAgICAgICAgICAgIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZm9ybWF0dGluZyA8cGFyYW1yZWYgbmFtZT0ibWVzc2FnZSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4gaXMgbm90IGVxdWFsIHRvIA0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbnMgYXJlIHVuZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGUgdHdvIGNvbGxlY3Rpb25zIGFyZSBlcXVhbC4gRXF1YWxpdHkgaXMgZGVmaW5lZCBhcyBoYXZpbmcgdGhlIHNhbWUNCisgICAgICAgICAgICBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlciBhbmQgcXVhbnRpdHkuIERpZmZlcmVudCByZWZlcmVuY2VzIHRvIHRoZSBzYW1lDQorICAgICAgICAgICAgdmFsdWUgYXJlIGNvbnNpZGVyZWQgZXF1YWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJub3RFeHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IGNvbGxlY3Rpb24gdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgY29sbGVjdGlvbiB0aGUgdGVzdHMgZXhwZWN0cw0KKyAgICAgICAgICAgIG5vdCB0byBtYXRjaCA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBjb2xsZWN0aW9uIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gcHJvZHVjZWQgYnkgdGhlDQorICAgICAgICAgICAgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPiBpcyBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ29sbGVjdGlvbkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbnMgYXJlIHVuZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGUgdHdvIGNvbGxlY3Rpb25zIGFyZSBlcXVhbC4gRXF1YWxpdHkgaXMgZGVmaW5lZCBhcyBoYXZpbmcgdGhlIHNhbWUNCisgICAgICAgICAgICBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlciBhbmQgcXVhbnRpdHkuIERpZmZlcmVudCByZWZlcmVuY2VzIHRvIHRoZSBzYW1lDQorICAgICAgICAgICAgdmFsdWUgYXJlIGNvbnNpZGVyZWQgZXF1YWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJub3RFeHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IGNvbGxlY3Rpb24gdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgY29sbGVjdGlvbiB0aGUgdGVzdHMgZXhwZWN0cw0KKyAgICAgICAgICAgIG5vdCB0byBtYXRjaCA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBjb2xsZWN0aW9uIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gcHJvZHVjZWQgYnkgdGhlDQorICAgICAgICAgICAgY29kZSB1bmRlciB0ZXN0Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4uIFRoZSBtZXNzYWdlIGlzIHNob3duIGluDQorICAgICAgICAgICAgdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPiBpcyBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ29sbGVjdGlvbkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb25zIGFyZSB1bmVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhlIHR3byBjb2xsZWN0aW9ucyBhcmUgZXF1YWwuIEVxdWFsaXR5IGlzIGRlZmluZWQgYXMgaGF2aW5nIHRoZSBzYW1lDQorICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHF1YW50aXR5LiBEaWZmZXJlbnQgcmVmZXJlbmNlcyB0byB0aGUgc2FtZQ0KKyAgICAgICAgICAgIHZhbHVlIGFyZSBjb25zaWRlcmVkIGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibm90RXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBjb2xsZWN0aW9uIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gdGhlIHRlc3RzIGV4cGVjdHMNCisgICAgICAgICAgICBub3QgdG8gbWF0Y2ggPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgY29sbGVjdGlvbiB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBjb2xsZWN0aW9uIHByb2R1Y2VkIGJ5IHRoZQ0KKyAgICAgICAgICAgIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+DQorICAgICAgICAgICAgaXMgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+IGlzIGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9ucyBhcmUgZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGUgdHdvIGNvbGxlY3Rpb25zIGFyZSBub3QgZXF1YWwuIEVxdWFsaXR5IGlzIGRlZmluZWQgYXMgaGF2aW5nIHRoZSBzYW1lDQorICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHF1YW50aXR5LiBEaWZmZXJlbnQgcmVmZXJlbmNlcyB0byB0aGUgc2FtZQ0KKyAgICAgICAgICAgIHZhbHVlIGFyZSBjb25zaWRlcmVkIGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBjb2xsZWN0aW9uIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gdGhlIHRlc3RzIGV4cGVjdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIGNvbGxlY3Rpb24gdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgY29sbGVjdGlvbiBwcm9kdWNlZCBieSB0aGUNCisgICAgICAgICAgICBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29tcGFyZXIiPg0KKyAgICAgICAgICAgIFRoZSBjb21wYXJlIGltcGxlbWVudGF0aW9uIHRvIHVzZSB3aGVuIGNvbXBhcmluZyBlbGVtZW50cyBvZiB0aGUgY29sbGVjdGlvbi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4gaXMgbm90IGVxdWFsIHRvIA0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlcixTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb25zIGFyZSBlcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgYXJlIG5vdCBlcXVhbC4gRXF1YWxpdHkgaXMgZGVmaW5lZCBhcyBoYXZpbmcgdGhlIHNhbWUNCisgICAgICAgICAgICBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlciBhbmQgcXVhbnRpdHkuIERpZmZlcmVudCByZWZlcmVuY2VzIHRvIHRoZSBzYW1lDQorICAgICAgICAgICAgdmFsdWUgYXJlIGNvbnNpZGVyZWQgZXF1YWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+DQorICAgICAgICAgICAgVGhlIGZpcnN0IGNvbGxlY3Rpb24gdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgY29sbGVjdGlvbiB0aGUgdGVzdHMgZXhwZWN0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgY29sbGVjdGlvbiB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBjb2xsZWN0aW9uIHByb2R1Y2VkIGJ5IHRoZQ0KKyAgICAgICAgICAgIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wYXJlciI+DQorICAgICAgICAgICAgVGhlIGNvbXBhcmUgaW1wbGVtZW50YXRpb24gdG8gdXNlIHdoZW4gY29tcGFyaW5nIGVsZW1lbnRzIG9mIHRoZSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9ImV4cGVjdGVkIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0iZXhwZWN0ZWQiLz4gaXMgbm90IGVxdWFsIHRvIA0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Db2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlcixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9ucyBhcmUgZXF1YWwgYW5kIHRocm93cyBhbiBleGNlcHRpb24NCisgICAgICAgICAgICBpZiB0aGUgdHdvIGNvbGxlY3Rpb25zIGFyZSBub3QgZXF1YWwuIEVxdWFsaXR5IGlzIGRlZmluZWQgYXMgaGF2aW5nIHRoZSBzYW1lDQorICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHF1YW50aXR5LiBEaWZmZXJlbnQgcmVmZXJlbmNlcyB0byB0aGUgc2FtZQ0KKyAgICAgICAgICAgIHZhbHVlIGFyZSBjb25zaWRlcmVkIGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBjb2xsZWN0aW9uIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gdGhlIHRlc3RzIGV4cGVjdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIGNvbGxlY3Rpb24gdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgY29sbGVjdGlvbiBwcm9kdWNlZCBieSB0aGUNCisgICAgICAgICAgICBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29tcGFyZXIiPg0KKyAgICAgICAgICAgIFRoZSBjb21wYXJlIGltcGxlbWVudGF0aW9uIHRvIHVzZSB3aGVuIGNvbXBhcmluZyBlbGVtZW50cyBvZiB0aGUgY29sbGVjdGlvbi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+DQorICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZCIvPi4gVGhlIG1lc3NhZ2UgaXMgc2hvd24gaW4NCisgICAgICAgICAgICB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGFyYW1ldGVycyI+DQorICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBmb3JtYXR0aW5nIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJleHBlY3RlZCIvPiBpcyBub3QgZXF1YWwgdG8gDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNvbGxlY3Rpb25Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb25zIGFyZSB1bmVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhlIHR3byBjb2xsZWN0aW9ucyBhcmUgZXF1YWwuIEVxdWFsaXR5IGlzIGRlZmluZWQgYXMgaGF2aW5nIHRoZSBzYW1lDQorICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHF1YW50aXR5LiBEaWZmZXJlbnQgcmVmZXJlbmNlcyB0byB0aGUgc2FtZQ0KKyAgICAgICAgICAgIHZhbHVlIGFyZSBjb25zaWRlcmVkIGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibm90RXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBjb2xsZWN0aW9uIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gdGhlIHRlc3RzIGV4cGVjdHMNCisgICAgICAgICAgICBub3QgdG8gbWF0Y2ggPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgY29sbGVjdGlvbiB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBjb2xsZWN0aW9uIHByb2R1Y2VkIGJ5IHRoZQ0KKyAgICAgICAgICAgIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wYXJlciI+DQorICAgICAgICAgICAgVGhlIGNvbXBhcmUgaW1wbGVtZW50YXRpb24gdG8gdXNlIHdoZW4gY29tcGFyaW5nIGVsZW1lbnRzIG9mIHRoZSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJub3RFeHBlY3RlZCIvPiBpcyBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ29sbGVjdGlvbkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29tcGFyZXIsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9ucyBhcmUgdW5lcXVhbCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgYXJlIGVxdWFsLiBFcXVhbGl0eSBpcyBkZWZpbmVkIGFzIGhhdmluZyB0aGUgc2FtZQ0KKyAgICAgICAgICAgIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyIGFuZCBxdWFudGl0eS4gRGlmZmVyZW50IHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUNCisgICAgICAgICAgICB2YWx1ZSBhcmUgY29uc2lkZXJlZCBlcXVhbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5vdEV4cGVjdGVkIj4NCisgICAgICAgICAgICBUaGUgZmlyc3QgY29sbGVjdGlvbiB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBjb2xsZWN0aW9uIHRoZSB0ZXN0cyBleHBlY3RzDQorICAgICAgICAgICAgbm90IHRvIG1hdGNoIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj4NCisgICAgICAgICAgICBUaGUgc2Vjb25kIGNvbGxlY3Rpb24gdG8gY29tcGFyZS4gVGhpcyBpcyB0aGUgY29sbGVjdGlvbiBwcm9kdWNlZCBieSB0aGUNCisgICAgICAgICAgICBjb2RlIHVuZGVyIHRlc3QuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29tcGFyZXIiPg0KKyAgICAgICAgICAgIFRoZSBjb21wYXJlIGltcGxlbWVudGF0aW9uIHRvIHVzZSB3aGVuIGNvbXBhcmluZyBlbGVtZW50cyBvZiB0aGUgY29sbGVjdGlvbi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0iYWN0dWFsIi8+DQorICAgICAgICAgICAgaXMgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9Im5vdEV4cGVjdGVkIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4gaXMgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNvbGxlY3Rpb25Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb25zIGFyZSB1bmVxdWFsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uDQorICAgICAgICAgICAgaWYgdGhlIHR3byBjb2xsZWN0aW9ucyBhcmUgZXF1YWwuIEVxdWFsaXR5IGlzIGRlZmluZWQgYXMgaGF2aW5nIHRoZSBzYW1lDQorICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHF1YW50aXR5LiBEaWZmZXJlbnQgcmVmZXJlbmNlcyB0byB0aGUgc2FtZQ0KKyAgICAgICAgICAgIHZhbHVlIGFyZSBjb25zaWRlcmVkIGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibm90RXhwZWN0ZWQiPg0KKyAgICAgICAgICAgIFRoZSBmaXJzdCBjb2xsZWN0aW9uIHRvIGNvbXBhcmUuIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gdGhlIHRlc3RzIGV4cGVjdHMNCisgICAgICAgICAgICBub3QgdG8gbWF0Y2ggPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPg0KKyAgICAgICAgICAgIFRoZSBzZWNvbmQgY29sbGVjdGlvbiB0byBjb21wYXJlLiBUaGlzIGlzIHRoZSBjb2xsZWN0aW9uIHByb2R1Y2VkIGJ5IHRoZQ0KKyAgICAgICAgICAgIGNvZGUgdW5kZXIgdGVzdC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wYXJlciI+DQorICAgICAgICAgICAgVGhlIGNvbXBhcmUgaW1wbGVtZW50YXRpb24gdG8gdXNlIHdoZW4gY29tcGFyaW5nIGVsZW1lbnRzIG9mIHRoZSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJhY3R1YWwiLz4NCisgICAgICAgICAgICBpcyBlcXVhbCB0byA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4uIFRoZSBtZXNzYWdlIGlzIHNob3duIGluDQorICAgICAgICAgICAgdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlcnMiPg0KKyAgICAgICAgICAgIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZm9ybWF0dGluZyA8cGFyYW1yZWYgbmFtZT0ibWVzc2FnZSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0ibm90RXhwZWN0ZWQiLz4gaXMgZXF1YWwgdG8gPHBhcmFtcmVmIG5hbWU9ImFjdHVhbCIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNvbGxlY3Rpb25Bc3NlcnQuR2V0RWxlbWVudENvdW50cyhTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkludDMyQCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdHMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBlYWNoDQorICAgICAgICAgICAgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj4NCisgICAgICAgICAgICBUaGUgY29sbGVjdGlvbiB0byBwcm9jZXNzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im51bGxDb3VudCI+DQorICAgICAgICAgICAgVGhlIG51bWJlciBvZiBudWxsIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBlYWNoIGVsZW1lbnQNCisgICAgICAgICAgICBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ29sbGVjdGlvbkFzc2VydC5Jc1N1YnNldE9mSGVscGVyKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZpcnN0IGNvbGxlY3Rpb24gaXMgYSBzdWJzZXQgb2YgdGhlIHNlY29uZA0KKyAgICAgICAgICAgIGNvbGxlY3Rpb24uIElmIGVpdGhlciBzZXQgY29udGFpbnMgZHVwbGljYXRlIGVsZW1lbnRzLCB0aGUgbnVtYmVyDQorICAgICAgICAgICAgb2Ygb2NjdXJyZW5jZXMgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIHN1YnNldCBtdXN0IGJlIGxlc3MgdGhhbiBvcg0KKyAgICAgICAgICAgIGVxdWFsIHRvIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgaW4gdGhlIHN1cGVyc2V0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3Vic2V0Ij4NCisgICAgICAgICAgICBUaGUgY29sbGVjdGlvbiB0aGUgdGVzdCBleHBlY3RzIHRvIGJlIGNvbnRhaW5lZCBpbiA8cGFyYW1yZWYgbmFtZT0ic3VwZXJzZXQiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3VwZXJzZXQiPg0KKyAgICAgICAgICAgIFRoZSBjb2xsZWN0aW9uIHRoZSB0ZXN0IGV4cGVjdHMgdG8gY29udGFpbiA8cGFyYW1yZWYgbmFtZT0ic3Vic2V0Ii8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgVHJ1ZSBpZiA8cGFyYW1yZWYgbmFtZT0ic3Vic2V0Ii8+IGlzIGEgc3Vic2V0IG9mDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9InN1cGVyc2V0Ii8+LCBmYWxzZSBvdGhlcndpc2UuDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ29sbGVjdGlvbkFzc2VydC5GaW5kTWlzbWF0Y2hlZEVsZW1lbnQoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uSW50MzJALFN5c3RlbS5JbnQzMkAsU3lzdGVtLk9iamVjdEApIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGaW5kcyBhIG1pc21hdGNoZWQgZWxlbWVudCBiZXR3ZWVuIHRoZSB0d28gY29sbGVjdGlvbnMuIEEgbWlzbWF0Y2hlZA0KKyAgICAgICAgICAgIGVsZW1lbnQgaXMgb25lIHRoYXQgYXBwZWFycyBhIGRpZmZlcmVudCBudW1iZXIgb2YgdGltZXMgaW4gdGhlDQorICAgICAgICAgICAgZXhwZWN0ZWQgY29sbGVjdGlvbiB0aGFuIGl0IGRvZXMgaW4gdGhlIGFjdHVhbCBjb2xsZWN0aW9uLiBUaGUNCisgICAgICAgICAgICBjb2xsZWN0aW9ucyBhcmUgYXNzdW1lZCB0byBiZSBkaWZmZXJlbnQgbm9uLW51bGwgcmVmZXJlbmNlcyB3aXRoIHRoZQ0KKyAgICAgICAgICAgIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGxldmVsIG9mDQorICAgICAgICAgICAgdmVyaWZpY2F0aW9uLiBJZiB0aGVyZSBpcyBubyBtaXNtYXRjaGVkIGVsZW1lbnQsIHRoZSBmdW5jdGlvbiByZXR1cm5zDQorICAgICAgICAgICAgZmFsc2UgYW5kIHRoZSBvdXQgcGFyYW1ldGVycyBzaG91bGQgbm90IGJlIHVzZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGZpcnN0IGNvbGxlY3Rpb24gdG8gY29tcGFyZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzZWNvbmQgY29sbGVjdGlvbiB0byBjb21wYXJlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkQ291bnQiPg0KKyAgICAgICAgICAgIFRoZSBleHBlY3RlZCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0ibWlzbWF0Y2hlZEVsZW1lbnQiLz4gb3IgMCBpZiB0aGVyZSBpcyBubyBtaXNtYXRjaGVkDQorICAgICAgICAgICAgZWxlbWVudC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWxDb3VudCI+DQorICAgICAgICAgICAgVGhlIGFjdHVhbCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0ibWlzbWF0Y2hlZEVsZW1lbnQiLz4gb3IgMCBpZiB0aGVyZSBpcyBubyBtaXNtYXRjaGVkDQorICAgICAgICAgICAgZWxlbWVudC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtaXNtYXRjaGVkRWxlbWVudCI+DQorICAgICAgICAgICAgVGhlIG1pc21hdGNoZWQgZWxlbWVudCAobWF5IGJlIG51bGwpIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8NCisgICAgICAgICAgICBtaXNtYXRjaGVkIGVsZW1lbnQuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICB0cnVlIGlmIGEgbWlzbWF0Y2hlZCBlbGVtZW50IHdhcyBmb3VuZDsgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNvbGxlY3Rpb25Bc3NlcnQuT2JqZWN0Q29tcGFyZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIGNvbXBhcmVzIHRoZSBvYmplY3RzIHVzaW5nIG9iamVjdC5FcXVhbHMNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5HZW5lcmljUGFyYW1ldGVySGVscGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGhlbHAgdXNlciBkb2luZyB1bml0IHRlc3RpbmcuDQorICAgICAgICAgICAgR2VuZXJpY1BhcmFtZXRlckhlbHBlciBzYXRpc2ZpZXMgc29tZSBjb21tZW50IGdlbmVyaWMgdHlwZSBjb25zdHJhaW50cw0KKyAgICAgICAgICAgIHN1Y2ggYXM6DQorICAgICAgICAgICAgMS4gcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3INCisgICAgICAgICAgICAyLiBpbXBsZW1lbnRzIGNvbW1vbiBpbnRlcmZhY2U6IElDb21wYXJhYmxlLCBJRW51bWVyYWJsZSwgSUNsb25lYWJsZQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkdlbmVyaWNQYXJhbWV0ZXJIZWxwZXIuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBzYXRpc2ZpZXMgdGhlIGNvbnN0cmFpbnQgaW4gQyMgZ2VuZXJpY3MuDQorICAgICAgICAgICAgVGhpcyBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyB0aGUgRGF0YSBwcm9wZXJ0eSB0byBhIHJhbmRvbSB2YWx1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5HZW5lcmljUGFyYW1ldGVySGVscGVyLiNjdG9yKFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoaXMgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgdGhlIERhdGEgcHJvcGVydHkgdG8gYSB1c2VyLXN1cHBsaWVkIHZhbHVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkYXRhIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuR2VuZXJpY1BhcmFtZXRlckhlbHBlci5FcXVhbHMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERvIHRoZSB2YWx1ZSBjb21wYXJpc29uIGZvciB0d28gR2VuZXJpY1BhcmFtZXRlckhlbHBlciBvYmplY3QNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im9iaiI+b2JqZWN0IHRvIGRvIGNvbXBhcmlzb24gd2l0aDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+dHJ1ZSBpZiBvYmogaGFzIHRoZSBzYW1lIHZhbHVlIGFzICd0aGlzJyBHZW5lcmljUGFyYW1ldGVySGVscGVyIG9iamVjdC4NCisgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuR2VuZXJpY1BhcmFtZXRlckhlbHBlci5HZXRIYXNoQ29kZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGhhc2ggY29kZSBmb3IgdGhpcyBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkdlbmVyaWNQYXJhbWV0ZXJIZWxwZXIuQ29tcGFyZVRvKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb21wYXJlcyB0byB0aGUgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ib2JqIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkdlbmVyaWNQYXJhbWV0ZXJIZWxwZXIuR2V0RW51bWVyYXRvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhbiBJRW51bWVyYXRvciBvYmplY3Qgd2hvc2UgbGVuZ3RoIGlzIGRlcml2ZWQgZnJvbQ0KKyAgICAgICAgICAgIHRoZSBEYXRhIHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5HZW5lcmljUGFyYW1ldGVySGVscGVyLkNsb25lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgR2VuZXJpY1BhcmFtZXRlckhlbHBlciBvYmplY3QgdGhhdCBpcyBlcXVhbCB0byANCisgICAgICAgICAgICAndGhpcycgb25lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5HZW5lcmljUGFyYW1ldGVySGVscGVyLkRhdGEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgRGF0YSBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5SdW50aW1lVHlwZUhlbHBlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvdmlkZXMgbWV0aG9kIHNpZ25hdHVyZSBkaXNjb3ZlcnkgZm9yIGdlbmVyaWMgbWV0aG9kcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5SdW50aW1lVHlwZUhlbHBlci5TZWxlY3RNZXRob2QoU3lzdGVtLlJlZmxlY3Rpb24uQmluZGluZ0ZsYWdzLFN5c3RlbS5SZWZsZWN0aW9uLk1ldGhvZEJhc2VbXSxTeXN0ZW0uVHlwZVtdLFN5c3RlbS5SZWZsZWN0aW9uLlBhcmFtZXRlck1vZGlmaWVyW10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHaXZlbiBhIHNldCBvZiBtZXRob2RzIHRoYXQgbWF0Y2ggdGhlIGJhc2UgY3JpdGVyaWEsIHNlbGVjdCBhIG1ldGhvZCBiYXNlZA0KKyAgICAgICAgICAgIHVwb24gYW4gYXJyYXkgb2YgdHlwZXMuICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIG51bGwgaWYgbm8gbWV0aG9kIG1hdGNoZXMNCisgICAgICAgICAgICB0aGUgY3JpdGVyaWEuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuU3RyaW5nQXNzZXJ0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZXQgb2Ygc3RyaW5nIGFzc2VydGlvbnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuU3RyaW5nQXNzZXJ0LkNvbnRhaW5zKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udGFpbnMgdGhlIHNwZWNpZmllZCBzdWJzdHJpbmcNCisgICAgICAgICAgICBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3Vic3RyaW5nIGRvZXMgbm90IG9jY3VyIHdpdGhpbiB0aGUNCisgICAgICAgICAgICB0ZXN0IHN0cmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj4NCisgICAgICAgICAgICBUaGUgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gY29udGFpbiA8cGFyYW1yZWYgbmFtZT0ic3Vic3RyaW5nIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1YnN0cmluZyI+DQorICAgICAgICAgICAgVGhlIHN0cmluZyBleHBlY3RlZCB0byBvY2N1ciB3aXRoaW4gPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJzdWJzdHJpbmciLz4gaXMgbm90IGZvdW5kIGluDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuU3RyaW5nQXNzZXJ0LkNvbnRhaW5zKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN1YnN0cmluZw0KKyAgICAgICAgICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBzdWJzdHJpbmcgZG9lcyBub3Qgb2NjdXIgd2l0aGluIHRoZQ0KKyAgICAgICAgICAgIHRlc3Qgc3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPg0KKyAgICAgICAgICAgIFRoZSBzdHJpbmcgdGhhdCBpcyBleHBlY3RlZCB0byBjb250YWluIDxwYXJhbXJlZiBuYW1lPSJzdWJzdHJpbmciLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3Vic3RyaW5nIj4NCisgICAgICAgICAgICBUaGUgc3RyaW5nIGV4cGVjdGVkIHRvIG9jY3VyIHdpdGhpbiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9InN1YnN0cmluZyIvPg0KKyAgICAgICAgICAgIGlzIG5vdCBpbiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4uIFRoZSBtZXNzYWdlIGlzIHNob3duIGluDQorICAgICAgICAgICAgdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJzdWJzdHJpbmciLz4gaXMgbm90IGZvdW5kIGluDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuU3RyaW5nQXNzZXJ0LkNvbnRhaW5zKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udGFpbnMgdGhlIHNwZWNpZmllZCBzdWJzdHJpbmcNCisgICAgICAgICAgICBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3Vic3RyaW5nIGRvZXMgbm90IG9jY3VyIHdpdGhpbiB0aGUNCisgICAgICAgICAgICB0ZXN0IHN0cmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj4NCisgICAgICAgICAgICBUaGUgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gY29udGFpbiA8cGFyYW1yZWYgbmFtZT0ic3Vic3RyaW5nIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1YnN0cmluZyI+DQorICAgICAgICAgICAgVGhlIHN0cmluZyBleHBlY3RlZCB0byBvY2N1ciB3aXRoaW4gPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJzdWJzdHJpbmciLz4NCisgICAgICAgICAgICBpcyBub3QgaW4gPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9InN1YnN0cmluZyIvPiBpcyBub3QgZm91bmQgaW4NCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5TdHJpbmdBc3NlcnQuU3RhcnRzV2l0aChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJlZ2lucyB3aXRoIHRoZSBzcGVjaWZpZWQgc3Vic3RyaW5nDQorICAgICAgICAgICAgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHRlc3Qgc3RyaW5nIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlDQorICAgICAgICAgICAgc3Vic3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPg0KKyAgICAgICAgICAgIFRoZSBzdHJpbmcgdGhhdCBpcyBleHBlY3RlZCB0byBiZWdpbiB3aXRoIDxwYXJhbXJlZiBuYW1lPSJzdWJzdHJpbmciLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3Vic3RyaW5nIj4NCisgICAgICAgICAgICBUaGUgc3RyaW5nIGV4cGVjdGVkIHRvIGJlIGEgcHJlZml4IG9mIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4gZG9lcyBub3QgYmVnaW4gd2l0aA0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJzdWJzdHJpbmciLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5TdHJpbmdBc3NlcnQuU3RhcnRzV2l0aChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgYmVnaW5zIHdpdGggdGhlIHNwZWNpZmllZCBzdWJzdHJpbmcNCisgICAgICAgICAgICBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgdGVzdCBzdHJpbmcgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUNCisgICAgICAgICAgICBzdWJzdHJpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+DQorICAgICAgICAgICAgVGhlIHN0cmluZyB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlZ2luIHdpdGggPHBhcmFtcmVmIG5hbWU9InN1YnN0cmluZyIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdWJzdHJpbmciPg0KKyAgICAgICAgICAgIFRoZSBzdHJpbmcgZXhwZWN0ZWQgdG8gYmUgYSBwcmVmaXggb2YgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPg0KKyAgICAgICAgICAgIGRvZXMgbm90IGJlZ2luIHdpdGggPHBhcmFtcmVmIG5hbWU9InN1YnN0cmluZyIvPi4gVGhlIG1lc3NhZ2UgaXMNCisgICAgICAgICAgICBzaG93biBpbiB0ZXN0IHJlc3VsdHMuDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+IGRvZXMgbm90IGJlZ2luIHdpdGgNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0ic3Vic3RyaW5nIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuU3RyaW5nQXNzZXJ0LlN0YXJ0c1dpdGgoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBiZWdpbnMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1YnN0cmluZw0KKyAgICAgICAgICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSB0ZXN0IHN0cmluZyBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZQ0KKyAgICAgICAgICAgIHN1YnN0cmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj4NCisgICAgICAgICAgICBUaGUgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmVnaW4gd2l0aCA8cGFyYW1yZWYgbmFtZT0ic3Vic3RyaW5nIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1YnN0cmluZyI+DQorICAgICAgICAgICAgVGhlIHN0cmluZyBleHBlY3RlZCB0byBiZSBhIHByZWZpeCBvZiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+DQorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uIHdoZW4gPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+DQorICAgICAgICAgICAgZG9lcyBub3QgYmVnaW4gd2l0aCA8cGFyYW1yZWYgbmFtZT0ic3Vic3RyaW5nIi8+LiBUaGUgbWVzc2FnZSBpcw0KKyAgICAgICAgICAgIHNob3duIGluIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+IGRvZXMgbm90IGJlZ2luIHdpdGgNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0ic3Vic3RyaW5nIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuU3RyaW5nQXNzZXJ0LkVuZHNXaXRoKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3Vic3RyaW5nDQorICAgICAgICAgICAgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHRlc3Qgc3RyaW5nIGRvZXMgbm90IGVuZCB3aXRoIHRoZQ0KKyAgICAgICAgICAgIHN1YnN0cmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj4NCisgICAgICAgICAgICBUaGUgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gZW5kIHdpdGggPHBhcmFtcmVmIG5hbWU9InN1YnN0cmluZyIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdWJzdHJpbmciPg0KKyAgICAgICAgICAgIFRoZSBzdHJpbmcgZXhwZWN0ZWQgdG8gYmUgYSBzdWZmaXggb2YgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VydEZhaWxlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgVGhyb3duIGlmIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPiBkb2VzIG5vdCBlbmQgd2l0aA0KKyAgICAgICAgICAgIDxwYXJhbXJlZiBuYW1lPSJzdWJzdHJpbmciLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5TdHJpbmdBc3NlcnQuRW5kc1dpdGgoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1YnN0cmluZw0KKyAgICAgICAgICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSB0ZXN0IHN0cmluZyBkb2VzIG5vdCBlbmQgd2l0aCB0aGUNCisgICAgICAgICAgICBzdWJzdHJpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+DQorICAgICAgICAgICAgVGhlIHN0cmluZyB0aGF0IGlzIGV4cGVjdGVkIHRvIGVuZCB3aXRoIDxwYXJhbXJlZiBuYW1lPSJzdWJzdHJpbmciLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3Vic3RyaW5nIj4NCisgICAgICAgICAgICBUaGUgc3RyaW5nIGV4cGVjdGVkIHRvIGJlIGEgc3VmZml4IG9mIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4NCisgICAgICAgICAgICBkb2VzIG5vdCBlbmQgd2l0aCA8cGFyYW1yZWYgbmFtZT0ic3Vic3RyaW5nIi8+LiBUaGUgbWVzc2FnZSBpcw0KKyAgICAgICAgICAgIHNob3duIGluIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4gZG9lcyBub3QgZW5kIHdpdGgNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0ic3Vic3RyaW5nIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuU3RyaW5nQXNzZXJ0LkVuZHNXaXRoKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3Vic3RyaW5nDQorICAgICAgICAgICAgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHRlc3Qgc3RyaW5nIGRvZXMgbm90IGVuZCB3aXRoIHRoZQ0KKyAgICAgICAgICAgIHN1YnN0cmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj4NCisgICAgICAgICAgICBUaGUgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gZW5kIHdpdGggPHBhcmFtcmVmIG5hbWU9InN1YnN0cmluZyIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdWJzdHJpbmciPg0KKyAgICAgICAgICAgIFRoZSBzdHJpbmcgZXhwZWN0ZWQgdG8gYmUgYSBzdWZmaXggb2YgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPg0KKyAgICAgICAgICAgIGRvZXMgbm90IGVuZCB3aXRoIDxwYXJhbXJlZiBuYW1lPSJzdWJzdHJpbmciLz4uIFRoZSBtZXNzYWdlIGlzDQorICAgICAgICAgICAgc2hvd24gaW4gdGVzdCByZXN1bHRzLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtZXRlcnMiPg0KKyAgICAgICAgICAgIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZm9ybWF0dGluZyA8cGFyYW1yZWYgbmFtZT0ibWVzc2FnZSIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4gZG9lcyBub3QgZW5kIHdpdGgNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0ic3Vic3RyaW5nIi8+Lg0KKyAgICAgICAgICAgIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuU3RyaW5nQXNzZXJ0Lk1hdGNoZXMoU3lzdGVtLlN0cmluZyxTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXgpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIG1hdGNoZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kDQorICAgICAgICAgICAgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IG1hdGNoIHRoZSBleHByZXNzaW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPg0KKyAgICAgICAgICAgIFRoZSBzdHJpbmcgdGhhdCBpcyBleHBlY3RlZCB0byBtYXRjaCA8cGFyYW1yZWYgbmFtZT0icGF0dGVybiIvPi4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXR0ZXJuIj4NCisgICAgICAgICAgICBUaGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+IGlzDQorICAgICAgICAgICAgZXhwZWN0ZWQgdG8gbWF0Y2guDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+IGRvZXMgbm90IG1hdGNoDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9InBhdHRlcm4iLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5TdHJpbmdBc3NlcnQuTWF0Y2hlcyhTeXN0ZW0uU3RyaW5nLFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9ucy5SZWdleCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBtYXRjaGVzIGEgcmVndWxhciBleHByZXNzaW9uIGFuZA0KKyAgICAgICAgICAgIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHN0cmluZyBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwcmVzc2lvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj4NCisgICAgICAgICAgICBUaGUgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gbWF0Y2ggPHBhcmFtcmVmIG5hbWU9InBhdHRlcm4iLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGF0dGVybiI+DQorICAgICAgICAgICAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPiBpcw0KKyAgICAgICAgICAgIGV4cGVjdGVkIHRvIG1hdGNoLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPg0KKyAgICAgICAgICAgIGRvZXMgbm90IG1hdGNoIDxwYXJhbXJlZiBuYW1lPSJwYXR0ZXJuIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4gZG9lcyBub3QgbWF0Y2gNCisgICAgICAgICAgICA8cGFyYW1yZWYgbmFtZT0icGF0dGVybiIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlN0cmluZ0Fzc2VydC5NYXRjaGVzKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zLlJlZ2V4LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBtYXRjaGVzIGEgcmVndWxhciBleHByZXNzaW9uIGFuZA0KKyAgICAgICAgICAgIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHN0cmluZyBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwcmVzc2lvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj4NCisgICAgICAgICAgICBUaGUgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gbWF0Y2ggPHBhcmFtcmVmIG5hbWU9InBhdHRlcm4iLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGF0dGVybiI+DQorICAgICAgICAgICAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPiBpcw0KKyAgICAgICAgICAgIGV4cGVjdGVkIHRvIG1hdGNoLg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPg0KKyAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbiB3aGVuIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPg0KKyAgICAgICAgICAgIGRvZXMgbm90IG1hdGNoIDxwYXJhbXJlZiBuYW1lPSJwYXR0ZXJuIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbg0KKyAgICAgICAgICAgIHRlc3QgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+IGRvZXMgbm90IG1hdGNoDQorICAgICAgICAgICAgPHBhcmFtcmVmIG5hbWU9InBhdHRlcm4iLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5TdHJpbmdBc3NlcnQuRG9lc05vdE1hdGNoKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zLlJlZ2V4KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBkb2VzIG5vdCBtYXRjaCBhIHJlZ3VsYXIgZXhwcmVzc2lvbg0KKyAgICAgICAgICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgbWF0Y2hlcyB0aGUgZXhwcmVzc2lvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj4NCisgICAgICAgICAgICBUaGUgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgbm90IHRvIG1hdGNoIDxwYXJhbXJlZiBuYW1lPSJwYXR0ZXJuIi8+Lg0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhdHRlcm4iPg0KKyAgICAgICAgICAgIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4gaXMNCisgICAgICAgICAgICBleHBlY3RlZCB0byBub3QgbWF0Y2guDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+IG1hdGNoZXMgPHBhcmFtcmVmIG5hbWU9InBhdHRlcm4iLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5TdHJpbmdBc3NlcnQuRG9lc05vdE1hdGNoKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zLlJlZ2V4LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGRvZXMgbm90IG1hdGNoIGEgcmVndWxhciBleHByZXNzaW9uDQorICAgICAgICAgICAgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHN0cmluZyBtYXRjaGVzIHRoZSBleHByZXNzaW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPg0KKyAgICAgICAgICAgIFRoZSBzdHJpbmcgdGhhdCBpcyBleHBlY3RlZCBub3QgdG8gbWF0Y2ggPHBhcmFtcmVmIG5hbWU9InBhdHRlcm4iLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGF0dGVybiI+DQorICAgICAgICAgICAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPiBpcw0KKyAgICAgICAgICAgIGV4cGVjdGVkIHRvIG5vdCBtYXRjaC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4NCisgICAgICAgICAgICBtYXRjaGVzIDxwYXJhbXJlZiBuYW1lPSJwYXR0ZXJuIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0DQorICAgICAgICAgICAgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxleGNlcHRpb24gY3JlZj0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlcnRGYWlsZWRFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIFRocm93biBpZiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4gbWF0Y2hlcyA8cGFyYW1yZWYgbmFtZT0icGF0dGVybiIvPi4NCisgICAgICAgICAgICA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlN0cmluZ0Fzc2VydC5Eb2VzTm90TWF0Y2goU3lzdGVtLlN0cmluZyxTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXgsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGRvZXMgbm90IG1hdGNoIGEgcmVndWxhciBleHByZXNzaW9uDQorICAgICAgICAgICAgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHN0cmluZyBtYXRjaGVzIHRoZSBleHByZXNzaW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPg0KKyAgICAgICAgICAgIFRoZSBzdHJpbmcgdGhhdCBpcyBleHBlY3RlZCBub3QgdG8gbWF0Y2ggPHBhcmFtcmVmIG5hbWU9InBhdHRlcm4iLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGF0dGVybiI+DQorICAgICAgICAgICAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPiBpcw0KKyAgICAgICAgICAgIGV4cGVjdGVkIHRvIG5vdCBtYXRjaC4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj4NCisgICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24gd2hlbiA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4NCisgICAgICAgICAgICBtYXRjaGVzIDxwYXJhbXJlZiBuYW1lPSJwYXR0ZXJuIi8+LiBUaGUgbWVzc2FnZSBpcyBzaG93biBpbiB0ZXN0DQorICAgICAgICAgICAgcmVzdWx0cy4NCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbWV0ZXJzIj4NCisgICAgICAgICAgICBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHBhcmFtcmVmIG5hbWU9Im1lc3NhZ2UiLz4uDQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZXJ0RmFpbGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICBUaHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9InZhbHVlIi8+IG1hdGNoZXMgPHBhcmFtcmVmIG5hbWU9InBhdHRlcm4iLz4uDQorICAgICAgICAgICAgPC9leGNlcHRpb24+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UZXN0Q29udGV4dCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdENvbnRleHQgY2xhc3MuIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIGZ1bGx5IGFic3RyYWN0IGFuZCBub3QgY29udGFpbiBhbnkgDQorICAgICAgICAgICAgbWVtYmVycy4gVGhlIGFkYXB0ZXIgd2lsbCBpbXBsZW1lbnQgdGhlIG1lbWJlcnMuIFVzZXJzIGluIHRoZSBmcmFtZXdvcmsgc2hvdWxkDQorICAgICAgICAgICAgb25seSBhY2Nlc3MgdGhpcyB2aWEgYSB3ZWxsLWRlZmluZWQgaW50ZXJmYWNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3RDb250ZXh0LldyaXRlTGluZShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVzZWQgdG8gd3JpdGUgdHJhY2UgbWVzc2FnZXMgd2hpbGUgdGhlIHRlc3QgaXMgcnVubmluZw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZm9ybWF0Ij5mb3JtYXQgc3RyaW5nPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+dGhlIGFyZ3VtZW50czwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UZXN0Q29udGV4dC5BZGRSZXN1bHRGaWxlKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBZGRzIGEgZmlsZSBuYW1lIHRvIHRoZSBsaXN0IGluIFRlc3RSZXN1bHQuUmVzdWx0RmlsZU5hbWVzDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVGVzdENvbnRleHQuQmVnaW5UaW1lcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmVnaW5zIGEgdGltZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UZXN0Q29udGV4dC5FbmRUaW1lcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRW5kcyBhIHRpbWVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVGVzdENvbnRleHQuUHJvcGVydGllcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUGVyIHRlc3QgcHJvcGVydGllcw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+PC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3RDb250ZXh0LkRhdGFSb3ciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEN1cnJlbnQgZGF0YSByb3cgd2hlbiB0ZXN0IGlzIHVzZWQgZm9yIGRhdGEgZHJpdmVuIHRlc3RpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVGVzdENvbnRleHQuRGF0YUNvbm5lY3Rpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEN1cnJlbnQgZGF0YSBjb25uZWN0aW9uIHJvdyB3aGVuIHRlc3QgaXMgdXNlZCBmb3IgZGF0YSBkcml2ZW4gdGVzdGluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UZXN0Q29udGV4dC5UZXN0TG9nc0RpciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdGVzdCBsb2dzIGRpcmVjdG9yeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UZXN0Q29udGV4dC5UZXN0RGlyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB0ZXN0IGRpcmVjdG9yeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UZXN0Q29udGV4dC5UZXN0RGVwbG95bWVudERpciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdGVzdCBkZXBsb3ltZW50IGRpcmVjdG9yeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UZXN0Q29udGV4dC5UZXN0TmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdGVzdCBuYW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3RDb250ZXh0LkN1cnJlbnRUZXN0T3V0Y29tZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgQ3VycmVudFRlc3RPdXRjb21lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlVuaXRUZXN0T3V0Y29tZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgT3V0Y29tZSBvZiBhIHRlc3Qgb3IgYSBydW4uDQorICAgICAgICAgICAgSWYgYSBuZXcgc3VjY2Vzc2Z1bCBzdGF0ZSBuZWVkcyB0byBiZSBhZGRlZCB5b3Ugd2lsbCBuZWVkIHRvIG1vZGlmeSANCisgICAgICAgICAgICBSdW5SZXN1bHRBbmRTdGF0aXN0aWNzIGluIFRlc3RSdW4gYW5kIFRlc3RPdXRjb21lSGVscGVyIGJlbG93Lg0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIE5PVEU6IHRoZSBvcmRlciBpcyBpbXBvcnRhbnQgYW5kIGlzIHVzZWQgZm9yIGNvbXB1dGluZyBvdXRjb21lIGZvciBhZ2dyZWdhdGlvbnMuIA0KKyAgICAgICAgICAgICAgICAgIE1vcmUgaW1wb3J0YW50IG91dGNvbWVzIGNvbWUgZmlyc3QuIFNlZSBUZXN0T3V0Y29tZUhlbHBlci5HZXRBZ2dyZWdhdGlvbk91dGNvbWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVW5pdFRlc3RPdXRjb21lLkZhaWxlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3YXMgZXhlY3V0ZWQsIGJ1dCB0aGVyZSB3ZXJlIGlzc3Vlcy4NCisgICAgICAgICAgICBJc3N1ZXMgbWF5IGludm9sdmUgZXhjZXB0aW9ucyBvciBmYWlsZWQgYXNzZXJ0aW9ucy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Vbml0VGVzdE91dGNvbWUuSW5jb25jbHVzaXZlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IGhhcyBjb21wbGV0ZWQsIGJ1dCB3ZSBjYW4ndCBzYXkgaWYgaXQgcGFzc2VkIG9yIGZhaWxlZC4NCisgICAgICAgICAgICBNYXkgYmUgdXNlZCBmb3IgYWJvcnRlZCB0ZXN0cy4uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlVuaXRUZXN0T3V0Y29tZS5QYXNzZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2FzIGV4ZWN1dGVkIHcvbyBhbnkgaXNzdWVzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlVuaXRUZXN0T3V0Y29tZS5JblByb2dyZXNzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IGlzIGN1cnJlbnRseSBleGVjdXRpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVW5pdFRlc3RPdXRjb21lLkVycm9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGVyZSB3YXMgYSBzeXN0ZW0gZXJyb3Igd2hpbGUgd2Ugd2VyZSB0cnlpbmcgdG8gZXhlY3V0ZSBhIHRlc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVW5pdFRlc3RPdXRjb21lLlRpbWVvdXQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB0ZXN0IHRpbWVkIG91dC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Vbml0VGVzdE91dGNvbWUuQWJvcnRlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3YXMgYWJvcnRlZCBieSB0aGUgdXNlci4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVW5pdFRlc3RPdXRjb21lLlVua25vd24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3QgaXMgaW4gYW4gdW5rbm93biBzdGF0ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOlN5c3RlbS5EYXRhLkRhdGFSb3ciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBkYXRhIHJvdy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpTeXN0ZW0uRGF0YS5Db21tb24uRGJDb25uZWN0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UZXN0Q2xhc3NBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1hcmtzIGEgdGVzdCBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UZXN0Q2xhc3NBdHRyaWJ1dGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IHRlc3QgY2xhc3MgYXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3RNZXRob2RBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1hcmtzIGEgdGVzdCBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVGVzdE1ldGhvZEF0dHJpYnV0ZS4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgVGVzdE1ldGhvZEF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UZXN0SW5pdGlhbGl6ZUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBtZXRob2QgbWFya2VyIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IG1ldGhvZCBydW5zLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3RJbml0aWFsaXplQXR0cmlidXRlLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBUZXN0SW5pdGlhbGl6ZUF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UZXN0Q2xlYW51cEF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBtZXRob2QgbWFya2VyIGNhbGxlZCBhZnRlciBhIHRlc3QgbWV0aG9kIHJ1bnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVGVzdENsZWFudXBBdHRyaWJ1dGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IFRlc3RDbGVhbnVwQXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLklnbm9yZUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWdub3JlcyBhIHVuaXQgdGVzdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5JZ25vcmVBdHRyaWJ1dGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IElnbm9yZUF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5FeHBlY3RlZEV4Y2VwdGlvbkF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIEV4cGVjdGVkRXhjZXB0aW9uQXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkV4cGVjdGVkRXhjZXB0aW9uQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIEV4cGVjdGVkRXhjZXB0aW9uQXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhjZXB0aW9uVHlwZSI+VGhlIGV4Y2VwdGlvbiB0eXBlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5FeHBlY3RlZEV4Y2VwdGlvbkF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uVHlwZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIEV4cGVjdGVkRXhjZXB0aW9uQXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhjZXB0aW9uVHlwZSI+VGhlIGV4Y2VwdGlvbiB0eXBlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5FeHBlY3RlZEV4Y2VwdGlvbkF0dHJpYnV0ZS5FeGNlcHRpb25UeXBlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBleGNlcHRpb24gdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5FeHBlY3RlZEV4Y2VwdGlvbkF0dHJpYnV0ZS5NZXNzYWdlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBtZXNzYWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3RQcm9wZXJ0eUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3QgcHJvcGVydHkgYXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRlc3RQcm9wZXJ0eUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyB0aGUgVGVzdFByb3BlcnR5QXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UZXN0UHJvcGVydHlBdHRyaWJ1dGUuTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgbmFtZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UZXN0UHJvcGVydHlBdHRyaWJ1dGUuVmFsdWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNsYXNzSW5pdGlhbGl6ZUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIENsYXNzSW5pdGlhbGl6ZUF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5DbGFzc0luaXRpYWxpemVBdHRyaWJ1dGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIHRoZSBDbGFzc0luaXRpYWxpemVBdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ2xhc3NDbGVhbnVwQXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgQ2xhc3NDbGVhbnVwQXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNsYXNzQ2xlYW51cEF0dHJpYnV0ZS4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIENsYXNzQ2xlYW51cEF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlbWJseUluaXRpYWxpemVBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBBc3NlbWJseUluaXRpYWxpemVBdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQXNzZW1ibHlJbml0aWFsaXplQXR0cmlidXRlLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyB0aGUgQXNzZW1ibHlJbml0aWFsaXplQXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkFzc2VtYmx5Q2xlYW51cEF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIEFzc2VtYmx5Q2xlYW51cEF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Bc3NlbWJseUNsZWFudXBBdHRyaWJ1dGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIHRoZSBBc3NlbWJseUNsZWFudXBBdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuRGVzY3JpcHRpb25BdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkRlc2NyaXB0aW9uQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyB0aGUgRGVzY3JpcHRpb25BdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiI+VGhlIGRlc2NyaXB0aW9uLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5EZXNjcmlwdGlvbkF0dHJpYnV0ZS5EZXNjcmlwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgZGVzY3JpcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuT3duZXJBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBPd25lckF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Pd25lckF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIE93bmVyQXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ib3duZXIiPlRoZSBvd25lci48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuT3duZXJBdHRyaWJ1dGUuT3duZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIG93bmVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkNzc1Byb2plY3RTdHJ1Y3R1cmVBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENTUyBQcm9qZWN0IFN0cnVjdHVyZSBVUkkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ3NzUHJvamVjdFN0cnVjdHVyZUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIENTUyBQcm9qZWN0IFN0cnVjdHVyZSBVUkkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjc3NQcm9qZWN0U3RydWN0dXJlIj5UaGUgc3RydWN0dXJlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Dc3NQcm9qZWN0U3RydWN0dXJlQXR0cmlidXRlLkNzc1Byb2plY3RTdHJ1Y3R1cmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHByb3BlcnR5IHN0cnVjdHVyZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Dc3NJdGVyYXRpb25BdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENTUyBJdGVyYXRpb24gVVJJDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuQ3NzSXRlcmF0aW9uQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyB0aGUgQ3NzSXRlcmF0aW9uQXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3NzSXRlcmF0aW9uIj5UaGUgcGFyYW1ldGVyLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Dc3NJdGVyYXRpb25BdHRyaWJ1dGUuQ3NzSXRlcmF0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBDc3NJdGVyYXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuUHJpb3JpdHlBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByaW9yaXR5IGF0dHJpYnV0ZTsgdXNlZCB0byBzcGVjaWZ5IHRoZSBwcmlvcml0eSBvZiBhIHVuaXQgdGVzdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Qcmlvcml0eUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyB0aGUgUHJpb3JpdHlBdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+VGhlIHByaW9yaXR5LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Qcmlvcml0eUF0dHJpYnV0ZS5Qcmlvcml0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgUHJpb3JpdHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuVGltZW91dEF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGltZW91dCBhdHRyaWJ1dGU7IHVzZWQgdG8gc3BlY2lmeSB0aGUgdGltZW91dCBvZiBhIHVuaXQgdGVzdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5UaW1lb3V0QXR0cmlidXRlLiNjdG9yKFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIHRoZSBUaW1lb3V0QXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGltZW91dCI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLlRpbWVvdXRBdHRyaWJ1dGUuVGltZW91dCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgVGltZW91dC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Xb3JrSXRlbUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV29ya0l0ZW0gYXR0cmlidXRlOyB1c2VkIHRvIHNwZWNpZnkgYSB3b3JrIGl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Xb3JrSXRlbUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyB0aGUgV29ya0l0ZW1BdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpZCI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLldvcmtJdGVtQXR0cmlidXRlLklkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBJRC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Ib3N0VHlwZUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSG9zdFR5cGUgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGhvc3QgdGhhdCB0aGlzIHVuaXQgdGVzdCB3aWxsDQorICAgICAgICAgICAgcnVuIGluLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkhvc3RUeXBlQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyB0aGUgaG9zdCB0eXBlIGF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imhvc3RUeXBlIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuSG9zdFR5cGVBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0b3Igb2YgSG9zdFR5cGVBdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJob3N0VHlwZSI+VGhlIHR5cGUgb2YgdGhlIGhvc3QuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaG9zdERhdGEiPkN1c3RvbSBkYXRhIGZvciB0aGUgaG9zdCBhZGFwdGVyLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Ib3N0VHlwZUF0dHJpYnV0ZS5tX2hvc3REYXRhIj4NCisgICAgICAgICAgICBUaGUgcmVhc29uIHRoaXMgaXMgc3RyaW5nIChhbmQgbm90IG9iamVjdCkgaXMgdGhhdCBjdXJyZW50bHkgQ01JIGNhbm5vdCBwYXJzZSBhcmJpdHJhcnkgaW5zdGFuY2VzIG9mIG9iamVjdCBhbmQgd2UgZGVwcmlvcml0aXplZCBjaGFuZ2luZyBDTUkuDQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5Ib3N0VHlwZUF0dHJpYnV0ZS5Ib3N0VHlwZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgaG9zdCB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkhvc3RUeXBlQXR0cmlidXRlLkhvc3REYXRhIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBob3N0IGRhdGEuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3RpbmcuRGVwbG95bWVudEl0ZW1BdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSBkZXBsb3ltZW50IGl0ZW0gKGZpbGUgb3IgZGlyZWN0b3J5KSBmb3IgcGVyLXRlc3QgZGVwbG95bWVudC4NCisgICAgICAgICAgICBDYW4gYmUgc3BlY2lmaWVkIG9uIHRlc3QgY2xhc3Mgb3IgdGVzdCBtZXRob2QuDQorICAgICAgICAgICAgQ2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBtb3JlIHRoYW4gb25lIGl0ZW0uDQorICAgICAgICAgICAgVGhlIGl0ZW0gcGF0aCBjYW4gYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUsIGlmIHJlbGF0aXZlLCBpdCBpcyByZWxhdGl2ZSB0byBSdW5Db25maWcuUmVsYXRpdmVQYXRoUm9vdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPGV4YW1wbGU+DQorICAgICAgICAgICAgW0RlcGxveW1lbnRJdGVtKCJmaWxlMS54bWwiKV0NCisgICAgICAgICAgICBbRGVwbG95bWVudEl0ZW0oImZpbGUyLnhtbCIsICJEYXRhRmlsZXMiKV0NCisgICAgICAgICAgICBbRGVwbG95bWVudEl0ZW0oImJpblxEZWJ1ZyIpXQ0KKyAgICAgICAgICAgIDwvZXhhbXBsZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLkRlcGxveW1lbnRJdGVtQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBEZXBsb3ltZW50SXRlbUF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiPlRoZSBwYXRoLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5EZXBsb3ltZW50SXRlbUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBEZXBsb3ltZW50SXRlbUF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiPlRoZSBwYXRoLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im91dHB1dERpcmVjdG9yeSI+VGhlIG91dHB1dCBkaXJlY3RvcnkuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nLklWZXJpZmlhYmxlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmlhYmxlIGludGVyZmFjZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZy5JVmVyaWZpYWJsZS5Jc1ZhbGlkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgSXNWYWxpZCBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlJldHVybnMgYSB2YWx1ZS48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgPC9tZW1iZXJzPg0KKzwvZG9jPg0KZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvTlVuaXQtY29uZmlnL01pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzIGIvY3NoYXJwL2xpYi9OVW5pdC1jb25maWcvTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxNTFkYQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQtY29uZmlnL01pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzCkBAIC0wLDAgKzEsNTQgQEAKK++7vw0KK3VzaW5nIFN5c3RlbTsNCisjaWYgQ0xJRU5UUFJPRklMRQ0KK25hbWVzcGFjZSBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZw0KK3sNCisgICAgW0F0dHJpYnV0ZVVzYWdlKEF0dHJpYnV0ZVRhcmdldHMuQ2xhc3MsIEluaGVyaXRlZCA9IHRydWUsIEFsbG93TXVsdGlwbGUgPSBmYWxzZSldDQorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgVGVzdENsYXNzQXR0cmlidXRlIDogTlVuaXQuRnJhbWV3b3JrLlRlc3RGaXh0dXJlQXR0cmlidXRlDQorICAgIHsNCisgICAgfQ0KKw0KKyAgICBbQXR0cmlidXRlVXNhZ2UoQXR0cmlidXRlVGFyZ2V0cy5NZXRob2QsIEluaGVyaXRlZCA9IHRydWUsIEFsbG93TXVsdGlwbGUgPSBmYWxzZSldDQorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgVGVzdE1ldGhvZEF0dHJpYnV0ZSA6IE5Vbml0LkZyYW1ld29yay5UZXN0QXR0cmlidXRlDQorICAgIHsNCisgICAgfQ0KKw0KKyAgICBbQXR0cmlidXRlVXNhZ2UoQXR0cmlidXRlVGFyZ2V0cy5NZXRob2QsIEluaGVyaXRlZCA9IHRydWUsIEFsbG93TXVsdGlwbGUgPSBmYWxzZSldDQorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgVGVzdEluaXRpYWxpemVBdHRyaWJ1dGUgOiBOVW5pdC5GcmFtZXdvcmsuU2V0VXBBdHRyaWJ1dGUNCisgICAgew0KKyAgICB9DQorDQorICAgIFtBdHRyaWJ1dGVVc2FnZShBdHRyaWJ1dGVUYXJnZXRzLk1ldGhvZCwgSW5oZXJpdGVkID0gdHJ1ZSwgQWxsb3dNdWx0aXBsZSA9IGZhbHNlKV0NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBJZ25vcmVBdHRyaWJ1dGUgOiBOVW5pdC5GcmFtZXdvcmsuSWdub3JlQXR0cmlidXRlDQorICAgIHsNCisgICAgfQ0KKw0KKyAgICBbQXR0cmlidXRlVXNhZ2UoQXR0cmlidXRlVGFyZ2V0cy5NZXRob2QsIEluaGVyaXRlZCA9IHRydWUsIEFsbG93TXVsdGlwbGUgPSBmYWxzZSldDQorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhwZWN0ZWRFeGNlcHRpb25BdHRyaWJ1dGUgOiBOVW5pdC5GcmFtZXdvcmsuRXhwZWN0ZWRFeGNlcHRpb25BdHRyaWJ1dGUNCisgICAgew0KKyAgICAgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uQXR0cmlidXRlKFR5cGUgdHlwZSkgOiBiYXNlKHR5cGUpDQorICAgICAgICB7IH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgY2xhc3MgQXNzZXJ0IDogTlVuaXQuRnJhbWV3b3JrLkFzc2VydA0KKyAgICB7DQorICAgICAgICBbT2Jzb2xldGUoIkRvIG5vdCB1c2UgQXJlRXF1YWwgb24gQnl0ZVtdLCB1c2UgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbCgsKSIpXQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEFyZUVxdWFsKGJ5dGVbXSBiMSwgYnl0ZVtdIGIyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlRXF1YWwoYjEsIGIyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtPYnNvbGV0ZSgiTm8gbm90IHVzZSBhc3NlcnQgd2l0aCBtaXNzLW1hdGNoZWQgdHlwZXMuIildDQorICAgICAgICBwdWJsaWMgc3RhdGljIG5ldyB2b2lkIEFyZUVxdWFsKG9iamVjdCBiMSwgb2JqZWN0IGIyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlRXF1YWwoYjEsIGIyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vQWxsb3dlZCBpZiB0aGUgdHlwZXMgbWF0Y2gNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBcmVFcXVhbDxUPihUIGIxLCBUIGIyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlRXF1YWwoYjEsIGIyKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0LWNvbmZpZy9udW5pdC1jb25zb2xlLnYyLjAuY29uZmlnIGIvY3NoYXJwL2xpYi9OVW5pdC1jb25maWcvbnVuaXQtY29uc29sZS52Mi4wLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQ1M2M5Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC1jb25maWcvbnVuaXQtY29uc29sZS52Mi4wLmNvbmZpZwpAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxjb25maWd1cmF0aW9uPgorCisgIDxzdGFydHVwPgorICAgIDxyZXF1aXJlZFJ1bnRpbWUgdmVyc2lvbj0idjIuMC41MDcyNyIgLz4KKyAgPC9zdGFydHVwPgorCisgIDxydW50aW1lPgorICAgIDwhLS0gV2UgbmVlZCB0aGlzIHNvIHRlc3QgZXhjZXB0aW9ucyBkb24ndCBjcmFzaCBOVW5pdCAtLT4KKyAgICA8bGVnYWN5VW5oYW5kbGVkRXhjZXB0aW9uUG9saWN5IGVuYWJsZWQ9IjEiIC8+CisKKyAgICA8IS0tIExvb2sgZm9yIGFkZGlucyBpbiB0aGUgYWRkaW5zIGRpcmVjdG9yeSBmb3Igbm93IC0tPgorICAgIDxhc3NlbWJseUJpbmRpbmcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIj4KKyAgICAgIDxwcm9iaW5nIHByaXZhdGVQYXRoPSJsaWI7YWRkaW5zIi8+CisgICA8L2Fzc2VtYmx5QmluZGluZz4KKyAgPC9ydW50aW1lPgorICAKKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0LWNvbmZpZy9udW5pdC1jb25zb2xlLnYzLjUuY29uZmlnIGIvY3NoYXJwL2xpYi9OVW5pdC1jb25maWcvbnVuaXQtY29uc29sZS52My41LmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQ1M2M5Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC1jb25maWcvbnVuaXQtY29uc29sZS52My41LmNvbmZpZwpAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxjb25maWd1cmF0aW9uPgorCisgIDxzdGFydHVwPgorICAgIDxyZXF1aXJlZFJ1bnRpbWUgdmVyc2lvbj0idjIuMC41MDcyNyIgLz4KKyAgPC9zdGFydHVwPgorCisgIDxydW50aW1lPgorICAgIDwhLS0gV2UgbmVlZCB0aGlzIHNvIHRlc3QgZXhjZXB0aW9ucyBkb24ndCBjcmFzaCBOVW5pdCAtLT4KKyAgICA8bGVnYWN5VW5oYW5kbGVkRXhjZXB0aW9uUG9saWN5IGVuYWJsZWQ9IjEiIC8+CisKKyAgICA8IS0tIExvb2sgZm9yIGFkZGlucyBpbiB0aGUgYWRkaW5zIGRpcmVjdG9yeSBmb3Igbm93IC0tPgorICAgIDxhc3NlbWJseUJpbmRpbmcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIj4KKyAgICAgIDxwcm9iaW5nIHByaXZhdGVQYXRoPSJsaWI7YWRkaW5zIi8+CisgICA8L2Fzc2VtYmx5QmluZGluZz4KKyAgPC9ydW50aW1lPgorICAKKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0LWNvbmZpZy9udW5pdC1jb25zb2xlLnY0LjAuY29uZmlnIGIvY3NoYXJwL2xpYi9OVW5pdC1jb25maWcvbnVuaXQtY29uc29sZS52NC4wLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGVlOTU0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC1jb25maWcvbnVuaXQtY29uc29sZS52NC4wLmNvbmZpZwpAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxjb25maWd1cmF0aW9uPgorCisgIDxzdGFydHVwIHVzZUxlZ2FjeVYyUnVudGltZUFjdGl2YXRpb25Qb2xpY3k9InRydWUiPgorICAgIDxyZXF1aXJlZFJ1bnRpbWUgdmVyc2lvbj0idjQuMC4zMDMxOSIgc2FmZW1vZGU9InRydWUiLz4KKyAgPC9zdGFydHVwPgorCisgIDxydW50aW1lPgorICAgIDwhLS0gV2UgbmVlZCB0aGlzIHNvIHRlc3QgZXhjZXB0aW9ucyBkb24ndCBjcmFzaCBOVW5pdCAtLT4KKyAgICA8bGVnYWN5VW5oYW5kbGVkRXhjZXB0aW9uUG9saWN5IGVuYWJsZWQ9IjEiIC8+CisKKyAgICA8IS0tIExvb2sgZm9yIGFkZGlucyBpbiB0aGUgYWRkaW5zIGRpcmVjdG9yeSBmb3Igbm93IC0tPgorICAgIDxhc3NlbWJseUJpbmRpbmcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIj4KKyAgICAgIDxwcm9iaW5nIHByaXZhdGVQYXRoPSJsaWI7YWRkaW5zIi8+CisgICA8L2Fzc2VtYmx5QmluZGluZz4KKyAgPC9ydW50aW1lPgorICAKKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L0xvZ28uaWNvIGIvY3NoYXJwL2xpYi9OVW5pdC9Mb2dvLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2M0ZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC9Mb2dvLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L05Vbml0Lm51cGtnIGIvY3NoYXJwL2xpYi9OVW5pdC9OVW5pdC5udXBrZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTlhNzc3Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC9OVW5pdC5udXBrZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L05Vbml0Rml0VGVzdHMuaHRtbCBiL2NzaGFycC9saWIvTlVuaXQvTlVuaXRGaXRUZXN0cy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZWI1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L05Vbml0Rml0VGVzdHMuaHRtbApAQCAtMCwwICsxLDI3NyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD4NCisJPGJvZHk+DQorCQk8aDE+TlVuaXQgQWNjZXB0YW5jZSBUZXN0czwvaDE+DQorCQk8cD4NCisJCURldmVsb3BlcnMgbG92ZSBzZWxmLXJlZmVyZW50aWFsIHByb2dyYW1zISBIZW5jZSwgTlVuaXQgaGFzIGFsd2F5cyBydW4gYWxsIGl0J3MgDQorCQlvd24gdGVzdHMsIGV2ZW4gdGhvc2UgdGhhdCBhcmUgbm90IHJlYWxseSB1bml0IHRlc3RzLg0KKwkJPHA+Tm93LCBiZWdpbm5pbmcgd2l0aCBOVW5pdCAyLjQsIE5Vbml0IGhhcyB0b3AtbGV2ZWwgdGVzdHMgdXNpbmcgV2FyZCBDdW5uaW5naGFtJ3MgDQorCQkJRklUIGZyYW1ld29yay4gQXQgdGhpcyB0aW1lLCB0aGUgdGVzdHMgYXJlIHByZXR0eSBydWRpbWVudGFyeSwgYnV0IGl0J3MgYSBzdGFydCANCisJCQlhbmQgaXQncyBhIGZyYW1ld29yayBmb3IgZG9pbmcgbW9yZS4NCisJCQk8aDI+UnVubmluZyB0aGUgVGVzdHM8L2gyPg0KKwkJPHA+T3BlbiBhIGNvbnNvbGUgb3Igc2hlbGwgd2luZG93IGFuZCBuYXZpZ2F0ZSB0byB0aGUgTlVuaXQgYmluIGRpcmVjdG9yeSwgd2hpY2ggDQorCQkJY29udGFpbnMgdGhpcyBmaWxlLiBUbyBydW4gdGhlIHRlc3QgdW5kZXIgTWljcm9zb2Z0IC5OZXQsIGVudGVyIHRoZSBjb21tYW5kDQorCQkJPHByZT4gICAgcnVuRmlsZSBOVW5pdEZpdFRlc3RzLmh0bWwgVGVzdFJlc3VsdHMuaHRtbCAuPC9wcmU+DQorCQkJVG8gcnVuIGl0IHVuZGVyIE1vbm8sIGVudGVyDQorCQkJPHByZT4gICAgbW9ubyBydW5GaWxlLmV4ZSBOVW5pdEZpdFRlc3RzLmh0bWwgVGVzdFJlc3VsdHMuaHRtbCAuPC9wcmU+DQorCQkJTm90ZSB0aGUgc3BhY2UgYW5kIGRvdCBhdCB0aGUgZW5kIG9mIGVhY2ggY29tbWFuZC4gVGhlIHJlc3VsdHMgb2YgeW91ciB0ZXN0IA0KKwkJCXdpbGwgYmUgaW4gVGVzdFJlc3VsdHMuaHRtbCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuDQorCQkJPGgyPlBsYXRmb3JtIGFuZCBDTFIgVmVyc2lvbjwvaDI+DQorCQkJPHRhYmxlIEJPUkRFUiBjZWxsU3BhY2luZz0iMCIgY2VsbFBhZGRpbmc9IjUiPg0KKwkJCQk8dHI+DQorCQkJCQk8dGQgY29sc3Bhbj0iMiI+TlVuaXQuRml4dHVyZXMuUGxhdGZvcm1JbmZvPC90ZD4NCisJCQkJPC90cj4NCisJCQk8L3RhYmxlPg0KKwkJCTxoMj5WZXJpZnkgVW5pdCBUZXN0czwvaDI+DQorCQk8cD4NCisJCUxvYWQgYW5kIHJ1biB0aGUgTlVuaXQgdW5pdCB0ZXN0cywgdmVyaWZ5aW5nIHRoYXQgdGhlIHJlc3VsdHMgYXJlIGFzIGV4cGVjdGVkLiANCisJCVdoZW4gdGhlc2UgdGVzdHMgYXJlIHJ1biBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zLCBkaWZmZXJlbnQgbnVtYmVycyBvZiB0ZXN0cyBtYXkgDQorCQliZSBza2lwcGVkLCBzbyB0aGUgdmFsdWVzIGZvciBTa2lwcGVkIGFuZCBSdW4gdGVzdHMgYXJlIGluZm9ybWF0aW9uYWwgb25seS4NCisJCTxwPg0KKwkJVGhlIG51bWJlciBvZiB0ZXN0cyBpbiBlYWNoIGFzc2VtYmx5IHNob3VsZCBiZSBjb25zdGFudCBhY3Jvc3MgYWxsIHBsYXRmb3JtcyAtIA0KKwkJYW55IGRpc2NyZXBhbmN5IHVzdWFsbHkgbWVhbnMgdGhhdCBvbmUgb2YgdGhlIHRlc3Qgc291cmNlIGZpbGVzIHdhcyBub3QgDQorCQljb21waWxlZCBvbiB0aGUgcGxhdGZvcm0uIFRoZXJlIHNob3VsZCBiZSBubyBmYWlsdXJlcyBhbmQgbm8gdGVzdHMgaWdub3JlZC4NCisJCTxwPjxiPk5vdGU6PC9iPg0KKwkJQXQgdGhlIG1vbWVudCwgdGhlIG51bml0LmV4dGVuc2lvbnMudGVzdHMgYXNzZW1ibHkgaXMgZmFpbGluZyBiZWNhdXNlIHRoZSANCisJCWZpeHR1cmUgZG9lc24ndCBpbml0aWFsaXplIGFkZGlucyBpbiB0aGUgdGVzdCBkb21haW4uDQorCQk8cD4NCisJCQk8dGFibGUgQk9SREVSIGNlbGxTcGFjaW5nPSIwIiBjZWxsUGFkZGluZz0iNSI+DQorCQkJCTx0cj4NCisJCQkJCTx0ZCBjb2xzcGFuPSI2Ij5OVW5pdC5GaXh0dXJlcy5Bc3NlbWJseVJ1bm5lcjwvdGQ+DQorCQkJCTwvdHI+DQorCQkJCTx0cj4NCisJCQkJCTx0ZD5Bc3NlbWJseTwvdGQ+DQorCQkJCQk8dGQ+VGVzdHMoKTwvdGQ+DQorCQkJCQk8dGQ+UnVuKCk8L3RkPg0KKwkJCQkJPHRkPlNraXBwZWQoKTwvdGQ+DQorCQkJCQk8dGQ+SWdub3JlZCgpPC90ZD4NCisJCQkJCTx0ZD5GYWlsdXJlcygpPC90ZD4NCisJCQkJPC90cj4NCisJCQkJPHRyPg0KKwkJCQkJPHRkPm51bml0LmZyYW1ld29yay50ZXN0cy5kbGw8L3RkPg0KKwkJCQkJPHRkPjM5NzwvdGQ+DQorCQkJCQk8dGQ+Jm5ic3A7PC90ZD4NCisJCQkJCTx0ZD4mbmJzcDs8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQk8L3RyPg0KKwkJCQk8dHI+DQorCQkJCQk8dGQ+bnVuaXQuY29yZS50ZXN0cy5kbGw8L3RkPg0KKwkJCQkJPHRkPjM1NTwvdGQ+DQorCQkJCQk8dGQ+Jm5ic3A7PC90ZD4NCisJCQkJCTx0ZD4mbmJzcDs8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQk8L3RyPg0KKwkJCQk8dHI+DQorCQkJCQk8dGQ+bnVuaXQudXRpbC50ZXN0cy5kbGw8L3RkPg0KKwkJCQkJPHRkPjIzODwvdGQ+DQorCQkJCQk8dGQ+Jm5ic3A7PC90ZD4NCisJCQkJCTx0ZD4mbmJzcDs8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQk8L3RyPg0KKwkJCQk8dHI+DQorCQkJCQk8dGQ+bnVuaXQubW9ja3MudGVzdHMuZGxsPC90ZD4NCisJCQkJCTx0ZD40MzwvdGQ+DQorCQkJCQk8dGQ+Jm5ic3A7PC90ZD4NCisJCQkJCTx0ZD4mbmJzcDs8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQk8L3RyPg0KKwkJCQk8dHI+DQorCQkJCQk8dGQ+bnVuaXQuZXh0ZW5zaW9ucy50ZXN0cy5kbGw8L3RkPg0KKwkJCQkJPHRkPjU8L3RkPg0KKwkJCQkJPHRkPiZuYnNwOzwvdGQ+DQorCQkJCQk8dGQ+Jm5ic3A7PC90ZD4NCisJCQkJCTx0ZD4wPC90ZD4NCisJCQkJCTx0ZD4wPC90ZD4NCisJCQkJPC90cj4NCisJCQkJPHRyPg0KKwkJCQkJPHRkPm51bml0LWNvbnNvbGUudGVzdHMuZGxsPC90ZD4NCisJCQkJCTx0ZD40MDwvdGQ+DQorCQkJCQk8dGQ+Jm5ic3A7PC90ZD4NCisJCQkJCTx0ZD4mbmJzcDs8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQk8L3RyPg0KKwkJCQk8dHI+DQorCQkJCQk8dGQ+bnVuaXQudWlraXQudGVzdHMuZGxsPC90ZD4NCisJCQkJCTx0ZD4zNDwvdGQ+DQorCQkJCQk8dGQ+Jm5ic3A7PC90ZD4NCisJCQkJCTx0ZD4mbmJzcDs8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQk8L3RyPg0KKwkJCQk8dHI+DQorCQkJCQk8dGQ+bnVuaXQtZ3VpLnRlc3RzLmRsbDwvdGQ+DQorCQkJCQk8dGQ+MTU8L3RkPg0KKwkJCQkJPHRkPiZuYnNwOzwvdGQ+DQorCQkJCQk8dGQ+Jm5ic3A7PC90ZD4NCisJCQkJCTx0ZD4wPC90ZD4NCisJCQkJCTx0ZD4wPC90ZD4NCisJCQkJPC90cj4NCisJCQkJPHRyPg0KKwkJCQkJPHRkPm51bml0LmZpeHR1cmVzLnRlc3RzLmRsbDwvdGQ+DQorCQkJCQk8dGQ+NjwvdGQ+DQorCQkJCQk8dGQ+Jm5ic3A7PC90ZD4NCisJCQkJCTx0ZD4mbmJzcDs8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQk8L3RyPg0KKwkJCTwvdGFibGU+DQorCQkJPGgyPkNvZGUgU25pcHBldCBUZXN0czwvaDI+DQorCQk8cD4NCisJCVRoZXNlIHRlc3RzIGNyZWF0ZSBhIHRlc3QgYXNzZW1ibHkgZnJvbSBhIHNuaXBwZXQgb2YgY29kZSBhbmQgdGhlbiBsb2FkIGFuZCBydW4gDQorCQl0aGUgdGVzdHMgdGhhdCBpdCBjb250YWlucywgdmVyaWZ5aW5nIHRoYXQgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbG9hZGVkIHRlc3RzIGlzIA0KKwkJYXMgZXhwZWN0ZWQgYW5kIHRoYXQgdGhlIG51bWJlciBvZiB0ZXN0cyBydW4sIHNraXBwZWQsIGlnbm9yZWQgb3IgZmFpbGVkIGlzIA0KKwkJY29ycmVjdC4NCisJCTxwPg0KKwkJCTx0YWJsZSBCT1JERVIgY2VsbFNwYWNpbmc9IjAiIGNlbGxQYWRkaW5nPSI1Ij4NCisJCQkJPHRyPg0KKwkJCQkJPHRkIGNvbHNwYW49IjYiPk5Vbml0LkZpeHR1cmVzLlNuaXBwZXRSdW5uZXI8L3RkPg0KKwkJCQk8L3RyPg0KKwkJCQk8dHI+DQorCQkJCQk8dGQ+Q29kZTwvdGQ+DQorCQkJCQk8dGQ+VHJlZSgpPC90ZD4NCisJCQkJCTx0ZD5SdW4oKTwvdGQ+DQorCQkJCQk8dGQ+U2tpcHBlZCgpPC90ZD4NCisJCQkJCTx0ZD5JZ25vcmVkKCk8L3RkPg0KKwkJCQkJPHRkPkZhaWx1cmVzKCk8L3RkPg0KKwkJCQk8L3RyPg0KKwkJCQk8dHI+DQorCQkJCQk8dGQ+PHByZT5wdWJsaWMgY2xhc3MgVGVzdENsYXNzDQorew0KK308L3ByZT4NCisJCQkJCTwvdGQ+DQorCQkJCQk8dGQ+RU1QVFk8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQk8L3RyPg0KKwkJCQk8dHI+DQorCQkJCQk8dGQ+PHByZT51c2luZyBOVW5pdC5GcmFtZXdvcms7DQorDQorW1Rlc3RGaXh0dXJlXQ0KK3B1YmxpYyBjbGFzcyBUZXN0Q2xhc3MNCit7DQorfTwvcHJlPg0KKwkJCQkJPC90ZD4NCisJCQkJCTx0ZD5UZXN0Q2xhc3M8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQk8L3RyPg0KKwkJCQk8dHI+DQorCQkJCQk8dGQ+PHByZT51c2luZyBOVW5pdC5GcmFtZXdvcms7DQorDQorW1Rlc3RGaXh0dXJlXQ0KK3B1YmxpYyBjbGFzcyBUZXN0Q2xhc3MNCit7DQorICAgIFtUZXN0XQ0KKyAgICBwdWJsaWMgdm9pZCBUMSgpIHsgfQ0KKyAgICBbVGVzdF0NCisgICAgcHVibGljIHZvaWQgVDIoKSB7IH0NCisgICAgW1Rlc3RdDQorICAgIHB1YmxpYyB2b2lkIFQzKCkgeyB9DQorfTwvcHJlPg0KKwkJCQkJPC90ZD4NCisJCQkJCTx0ZD48cHJlPlRlc3RDbGFzcw0KKyZndDtUMQ0KKyZndDtUMg0KKyZndDtUMzwvcHJlPg0KKwkJCQkJPC90ZD4NCisJCQkJCTx0ZD4zPC90ZD4NCisJCQkJCTx0ZD4wPC90ZD4NCisJCQkJCTx0ZD4wPC90ZD4NCisJCQkJCTx0ZD4wPC90ZD4NCisJCQkJPC90cj4NCisJCQkJPHRyPg0KKwkJCQkJPHRkPjxwcmU+dXNpbmcgTlVuaXQuRnJhbWV3b3JrOw0KKw0KK1tUZXN0Rml4dHVyZV0NCitwdWJsaWMgY2xhc3MgVGVzdENsYXNzMQ0KK3sNCisgICAgW1Rlc3RdDQorICAgIHB1YmxpYyB2b2lkIFQxKCkgeyB9DQorfQ0KKw0KK1tUZXN0Rml4dHVyZV0NCitwdWJsaWMgY2xhc3MgVGVzdENsYXNzMg0KK3sNCisgICAgW1Rlc3RdDQorICAgIHB1YmxpYyB2b2lkIFQyKCkgeyB9DQorICAgIFtUZXN0XQ0KKyAgICBwdWJsaWMgdm9pZCBUMygpIHsgfQ0KK308L3ByZT4NCisJCQkJCTwvdGQ+DQorCQkJCQk8dGQ+PHByZT5UZXN0Q2xhc3MxDQorJmd0O1QxDQorVGVzdENsYXNzMg0KKyZndDtUMg0KKyZndDtUMzwvcHJlPg0KKwkJCQkJPC90ZD4NCisJCQkJCTx0ZD4zPC90ZD4NCisJCQkJCTx0ZD4wPC90ZD4NCisJCQkJCTx0ZD4wPC90ZD4NCisJCQkJCTx0ZD4wPC90ZD4NCisJCQkJPC90cj4NCisJCQkJPHRyPg0KKwkJCQkJPHRkPjxwcmU+dXNpbmcgTlVuaXQuRnJhbWV3b3JrOw0KKw0KK1tUZXN0Rml4dHVyZV0NCitwdWJsaWMgY2xhc3MgVGVzdENsYXNzDQorew0KKyAgICBbVGVzdF0NCisgICAgcHVibGljIHZvaWQgVDEoKSB7IH0NCisgICAgW1Rlc3QsIElnbm9yZV0NCisgICAgcHVibGljIHZvaWQgVDIoKSB7IH0NCisgICAgW1Rlc3RdDQorICAgIHB1YmxpYyB2b2lkIFQzKCkgeyB9DQorfTwvcHJlPg0KKwkJCQkJPC90ZD4NCisJCQkJCTx0ZD48cHJlPlRlc3RDbGFzcw0KKyZndDtUMQ0KKyZndDtUMg0KKyZndDtUMzwvcHJlPg0KKwkJCQkJPC90ZD4NCisJCQkJCTx0ZD4yPC90ZD4NCisJCQkJCTx0ZD4wPC90ZD4NCisJCQkJCTx0ZD4xPC90ZD4NCisJCQkJCTx0ZD4wPC90ZD4NCisJCQkJPC90cj4NCisJCQkJPHRyPg0KKwkJCQkJPHRkPjxwcmU+dXNpbmcgTlVuaXQuRnJhbWV3b3JrOw0KKw0KK1tUZXN0Rml4dHVyZV0NCitwdWJsaWMgY2xhc3MgVGVzdENsYXNzDQorew0KKyAgICBbVGVzdF0NCisgICAgcHVibGljIHZvaWQgVDEoKSB7IH0NCisgICAgW1Rlc3QsIEV4cGxpY2l0XQ0KKyAgICBwdWJsaWMgdm9pZCBUMigpIHsgfQ0KKyAgICBbVGVzdF0NCisgICAgcHVibGljIHZvaWQgVDMoKSB7IH0NCit9PC9wcmU+DQorCQkJCQk8L3RkPg0KKwkJCQkJPHRkPjxwcmU+VGVzdENsYXNzDQorJmd0O1QxDQorJmd0O1QyDQorJmd0O1QzPC9wcmU+DQorCQkJCQk8L3RkPg0KKwkJCQkJPHRkPjI8L3RkPg0KKwkJCQkJPHRkPjE8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQkJPHRkPjA8L3RkPg0KKwkJCQk8L3RyPg0KKwkJCTwvdGFibGU+DQorCQkJPGgyPlN1bW1hcnkgSW5mb3JtYXRpb248L2gyPg0KKwkJCTx0YWJsZSBCT1JERVIgY2VsbFNwYWNpbmc9IjAiIGNlbGxQYWRkaW5nPSI1Ij4NCisJCQkJPHRyPg0KKwkJCQkJPHRkIGNvbHNwYW49IjIiPmZpdC5TdW1tYXJ5PC90ZD4NCisJCQkJPC90cj4NCisJCQk8L3RhYmxlPg0KKwk8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvTlVuaXQvZml0LWxpY2Vuc2UudHh0IGIvY3NoYXJwL2xpYi9OVW5pdC9maXQtbGljZW5zZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzNzUzMgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvZml0LWxpY2Vuc2UudHh0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvTlVuaXQvbGliL251bml0LmZyYW1ld29yay5kbGwgYi9jc2hhcnAvbGliL05Vbml0L2xpYi9udW5pdC5mcmFtZXdvcmsuZGxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NTZlNTEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L2xpYi9udW5pdC5mcmFtZXdvcmsuZGxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvTlVuaXQvbGliL251bml0LmZyYW1ld29yay54bWwgYi9jc2hhcnAvbGliL05Vbml0L2xpYi9udW5pdC5mcmFtZXdvcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OGU1YWQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L2xpYi9udW5pdC5mcmFtZXdvcmsueG1sCkBAIC0wLDAgKzEsMTA0MDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/Pg0KKzxkb2M+DQorICAgIDxhc3NlbWJseT4NCisgICAgICAgIDxuYW1lPm51bml0LmZyYW1ld29yazwvbmFtZT4NCisgICAgPC9hc3NlbWJseT4NCisgICAgPG1lbWJlcnM+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNhdGVnb3J5QXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBdHRyaWJ1dGUgdXNlZCB0byBhcHBseSBhIGNhdGVnb3J5IHRvIGEgdGVzdA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5DYXRlZ29yeUF0dHJpYnV0ZS5jYXRlZ29yeU5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjYXRlZ29yeQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5DYXRlZ29yeUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGF0dHJpYnV0ZSBmb3IgYSBnaXZlbiBjYXRlZ29yeSBiYXNlZCBvbg0KKyAgICAgICAgICAgIGEgbmFtZS4gVGhlIG5hbWUgbWF5IG5vdCBjb250YWluIHRoZSBjaGFyYWN0ZXJzICcsJywNCisgICAgICAgICAgICAnKycsICctJyBvciAnIScuIEhvd2V2ZXIsIHRoaXMgaXMgbm90IGNoZWNrZWQgaW4gdGhlDQorICAgICAgICAgICAgY29uc3RydWN0b3Igc2luY2UgaXQgd291bGQgY2F1c2UgYW4gZXJyb3IgdG8gYXJpc2UgYXQNCisgICAgICAgICAgICBhcyB0aGUgdGVzdCB3YXMgbG9hZGVkIHdpdGhvdXQgZ2l2aW5nIGEgY2xlYXIgaW5kaWNhdGlvbg0KKyAgICAgICAgICAgIG9mIHdoZXJlIHRoZSBwcm9ibGVtIGlzIGxvY2F0ZWQuIFRoZSBlcnJvciBpcyBoYW5kbGVkDQorICAgICAgICAgICAgaW4gTlVuaXRGcmFtZXdvcmsuY3MgYnkgbWFya2luZyB0aGUgdGVzdCBhcyBub3QNCisgICAgICAgICAgICBydW5uYWJsZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im5hbWUiPlRoZSBuYW1lIG9mIHRoZSBjYXRlZ29yeTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ2F0ZWdvcnlBdHRyaWJ1dGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb3RlY3RlZCBjb25zdHJ1Y3RvciB1c2VzIHRoZSBUeXBlIG5hbWUgYXMgdGhlIG5hbWUNCisgICAgICAgICAgICBvZiB0aGUgY2F0ZWdvcnkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNhdGVnb3J5QXR0cmlidXRlLk5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjYXRlZ29yeQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5EYXRhcG9pbnRBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVzZWQgdG8gbWFyayBhIGZpZWxkIGZvciB1c2UgYXMgYSBkYXRhcG9pbnQgd2hlbiBleGVjdXRpbmcgYSB0aGVvcnkNCisgICAgICAgICAgICB3aXRoaW4gdGhlIHNhbWUgZml4dHVyZSB0aGF0IHJlcXVpcmVzIGFuIGFyZ3VtZW50IG9mIHRoZSBmaWVsZCdzIFR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkRhdGFwb2ludHNBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFVzZWQgdG8gbWFyayBhbiBhcnJheSBhcyBjb250YWluaW5nIGEgc2V0IG9mIGRhdGFwb2ludHMgdG8gYmUgdXNlZA0KKyAgICAgICAgICAgIGV4ZWN1dGluZyBhIHRoZW9yeSB3aXRoaW4gdGhlIHNhbWUgZml4dHVyZSB0aGF0IHJlcXVpcmVzIGFuIGFyZ3VtZW50IA0KKyAgICAgICAgICAgIG9mIHRoZSBUeXBlIG9mIHRoZSBhcnJheSBlbGVtZW50cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuRGVzY3JpcHRpb25BdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEF0dHJpYnV0ZSB1c2VkIHRvIHByb3ZpZGUgZGVzY3JpcHRpdmUgdGV4dCBhYm91dCBhIA0KKyAgICAgICAgICAgIHRlc3QgY2FzZSBvciBmaXh0dXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5EZXNjcmlwdGlvbkF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IHRoZSBhdHRyaWJ1dGUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIj5UZXh0IGRlc2NyaWJpbmcgdGhlIHRlc3Q8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkRlc2NyaXB0aW9uQXR0cmlidXRlLkRlc2NyaXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB0ZXN0IGRlc2NyaXB0aW9uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLk1lc3NhZ2VNYXRjaCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRW51bWVyYXRpb24gaW5kaWNhdGluZyBob3cgdGhlIGV4cGVjdGVkIG1lc3NhZ2UgcGFyYW1ldGVyIGlzIHRvIGJlIHVzZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuTWVzc2FnZU1hdGNoLkV4YWN0Ij4NCisgICAgICAgICAgICBFeHBlY3QgYW4gZXhhY3QgbWF0Y2gNCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5NZXNzYWdlTWF0Y2guQ29udGFpbnMiPg0KKyAgICAgICAgICAgIEV4cGVjdCBhIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcGFyYW1ldGVyIHN0cmluZw0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLk1lc3NhZ2VNYXRjaC5SZWdleCI+DQorICAgICAgICAgICAgTWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwcm92aWRlZCBhcyBhIHBhcmFtZXRlcg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLk1lc3NhZ2VNYXRjaC5TdGFydHNXaXRoIj4NCisgICAgICAgICAgICBFeHBlY3QgYSBtZXNzYWdlIHRoYXQgc3RhcnRzIHdpdGggdGhlIHBhcmFtZXRlciBzdHJpbmcNCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5FeHBlY3RlZEV4Y2VwdGlvbkF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRXhwZWN0ZWRFeGNlcHRpb25BdHRyaWJ1dGUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgDQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRXhwZWN0ZWRFeGNlcHRpb25BdHRyaWJ1dGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdG9yIGZvciBhIG5vbi1zcGVjaWZpYyBleGNlcHRpb24NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRXhwZWN0ZWRFeGNlcHRpb25BdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3RvciBmb3IgYSBnaXZlbiB0eXBlIG9mIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhjZXB0aW9uVHlwZSI+VGhlIHR5cGUgb2YgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRXhwZWN0ZWRFeGNlcHRpb25BdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdG9yIGZvciBhIGdpdmVuIGV4Y2VwdGlvbiBuYW1lDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleGNlcHRpb25OYW1lIj5UaGUgZnVsbCBuYW1lIG9mIHRoZSBleHBlY3RlZCBleGNlcHRpb248L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkV4cGVjdGVkRXhjZXB0aW9uQXR0cmlidXRlLkV4cGVjdGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiB0eXBlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkV4cGVjdGVkRXhjZXB0aW9uQXR0cmlidXRlLkV4cGVjdGVkRXhjZXB0aW9uTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBmdWxsIFR5cGUgbmFtZSBvZiB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkV4cGVjdGVkRXhjZXB0aW9uQXR0cmlidXRlLkV4cGVjdGVkTWVzc2FnZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBleHBlY3RlZCBtZXNzYWdlIHRleHQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuRXhwZWN0ZWRFeGNlcHRpb25BdHRyaWJ1dGUuVXNlck1lc3NhZ2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgdXNlciBtZXNzYWdlIGRpc3BsYXllZCBpbiBjYXNlIG9mIGZhaWx1cmUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuRXhwZWN0ZWRFeGNlcHRpb25BdHRyaWJ1dGUuTWF0Y2hUeXBlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSB0eXBlIG9mIG1hdGNoIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGUgZXhwZWN0ZWQgbWVzc2FnZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5FeHBlY3RlZEV4Y2VwdGlvbkF0dHJpYnV0ZS5IYW5kbGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICAgR2V0cyB0aGUgbmFtZSBvZiBhIG1ldGhvZCB0byBiZSB1c2VkIGFzIGFuIGV4Y2VwdGlvbiBoYW5kbGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkV4cGxpY2l0QXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeHBsaWNpdEF0dHJpYnV0ZSBtYXJrcyBhIHRlc3Qgb3IgdGVzdCBmaXh0dXJlIHNvIHRoYXQgaXQgd2lsbA0KKyAgICAgICAgICAgIG9ubHkgYmUgcnVuIGlmIGV4cGxpY2l0bHkgZXhlY3V0ZWQgZnJvbSB0aGUgZ3VpIG9yIGNvbW1hbmQgbGluZQ0KKyAgICAgICAgICAgIG9yIGlmIGl0IGlzIGluY2x1ZGVkIGJ5IHVzZSBvZiBhIGZpbHRlci4gVGhlIHRlc3Qgd2lsbCBub3QgYmUNCisgICAgICAgICAgICBydW4gc2ltcGx5IGJlY2F1c2UgYW4gZW5jbG9zaW5nIHN1aXRlIGlzIHJ1bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRXhwbGljaXRBdHRyaWJ1dGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERlZmF1bHQgY29uc3RydWN0b3INCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRXhwbGljaXRBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdG9yIHdpdGggYSByZWFzb24NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJlYXNvbiI+VGhlIHJlYXNvbiB0ZXN0IGlzIG1hcmtlZCBleHBsaWNpdDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuRXhwbGljaXRBdHRyaWJ1dGUuUmVhc29uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgcmVhc29uIHRlc3QgaXMgbWFya2VkIGV4cGxpY2l0DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLklnbm9yZUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXR0cmlidXRlIHVzZWQgdG8gbWFyayBhIHRlc3QgdGhhdCBpcyB0byBiZSBpZ25vcmVkLg0KKyAgICAgICAgICAgIElnbm9yZWQgdGVzdHMgcmVzdWx0IGluIGEgd2FybmluZyBtZXNzYWdlIHdoZW4gdGhlDQorICAgICAgICAgICAgdGVzdHMgYXJlIHJ1bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuSWdub3JlQXR0cmlidXRlLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3RzIHRoZSBhdHRyaWJ1dGUgd2l0aG91dCBnaXZpbmcgYSByZWFzb24gDQorICAgICAgICAgICAgZm9yIGlnbm9yaW5nIHRoZSB0ZXN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5JZ25vcmVBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdHMgdGhlIGF0dHJpYnV0ZSBnaXZpbmcgYSByZWFzb24gZm9yIGlnbm9yaW5nIHRoZSB0ZXN0DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyZWFzb24iPlRoZSByZWFzb24gZm9yIGlnbm9yaW5nIHRoZSB0ZXN0PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5JZ25vcmVBdHRyaWJ1dGUuUmVhc29uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgcmVhc29uIGZvciBpZ25vcmluZyBhIHRlc3QNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuSW5jbHVkZUV4Y2x1ZGVBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFic3RyYWN0IGJhc2UgZm9yIEF0dHJpYnV0ZXMgdGhhdCBhcmUgdXNlZCB0byBpbmNsdWRlIHRlc3RzDQorICAgICAgICAgICAgaW4gdGhlIHRlc3QgcnVuIGJhc2VkIG9uIGVudmlyb25tZW50YWwgc2V0dGluZ3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkluY2x1ZGVFeGNsdWRlQXR0cmlidXRlLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3RvciB3aXRoIG5vIGluY2x1ZGVkIGl0ZW1zIHNwZWNpZmllZCwgZm9yIHVzZQ0KKyAgICAgICAgICAgIHdpdGggbmFtZWQgcHJvcGVydHkgc3ludGF4Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5JbmNsdWRlRXhjbHVkZUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0b3IgdGFraW5nIG9uZSBvciBtb3JlIGluY2x1ZGVkIGl0ZW1zDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbmNsdWRlIj5Db21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBpbmNsdWRlZCBpdGVtczwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuSW5jbHVkZUV4Y2x1ZGVBdHRyaWJ1dGUuSW5jbHVkZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTmFtZSBvZiB0aGUgaXRlbSB0aGF0IGlzIG5lZWRlZCBpbiBvcmRlciBmb3INCisgICAgICAgICAgICBhIHRlc3QgdG8gcnVuLiBNdWx0aXBsZSBpdGVtc3MgbWF5IGJlIGdpdmVuLA0KKyAgICAgICAgICAgIHNlcGFyYXRlZCBieSBhIGNvbW1hLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5JbmNsdWRlRXhjbHVkZUF0dHJpYnV0ZS5FeGNsdWRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBOYW1lIG9mIHRoZSBpdGVtIHRvIGJlIGV4Y2x1ZGVkLiBNdWx0aXBsZSBpdGVtcw0KKyAgICAgICAgICAgIG1heSBiZSBnaXZlbiwgc2VwYXJhdGVkIGJ5IGEgY29tbWEuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkluY2x1ZGVFeGNsdWRlQXR0cmlidXRlLlJlYXNvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgaW5jbHVkaW5nIG9yIGV4Y2x1ZGluZyB0aGUgdGVzdA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5QbGF0Zm9ybUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUGxhdGZvcm1BdHRyaWJ1dGUgaXMgdXNlZCB0byBtYXJrIGEgdGVzdCBmaXh0dXJlIG9yIGFuDQorICAgICAgICAgICAgaW5kaXZpZHVhbCBtZXRob2QgYXMgYXBwbHlpbmcgdG8gYSBwYXJ0aWN1bGFyIHBsYXRmb3JtIG9ubHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlBsYXRmb3JtQXR0cmlidXRlLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3RvciB3aXRoIG5vIHBsYXRmb3JtcyBzcGVjaWZpZWQsIGZvciB1c2UNCisgICAgICAgICAgICB3aXRoIG5hbWVkIHByb3BlcnR5IHN5bnRheC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuUGxhdGZvcm1BdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdG9yIHRha2luZyBvbmUgb3IgbW9yZSBwbGF0Zm9ybXMNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBsYXRmb3JtcyI+Q29tbWEtZGVsaW1pbnRlZCBsaXN0IG9mIHBsYXRmb3JtczwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ3VsdHVyZUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3VsdHVyZUF0dHJpYnV0ZSBpcyB1c2VkIHRvIG1hcmsgYSB0ZXN0IGZpeHR1cmUgb3IgYW4NCisgICAgICAgICAgICBpbmRpdmlkdWFsIG1ldGhvZCBhcyBhcHBseWluZyB0byBhIHBhcnRpY3VsYXIgQ3VsdHVyZSBvbmx5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5DdWx0dXJlQXR0cmlidXRlLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3RvciB3aXRoIG5vIGN1bHR1cmVzIHNwZWNpZmllZCwgZm9yIHVzZQ0KKyAgICAgICAgICAgIHdpdGggbmFtZWQgcHJvcGVydHkgc3ludGF4Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5DdWx0dXJlQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3RvciB0YWtpbmcgb25lIG9yIG1vcmUgY3VsdHVyZXMNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImN1bHR1cmVzIj5Db21tYS1kZWxpbWludGVkIGxpc3Qgb2YgY3VsdHVyZXM8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbWJpbmF0b3JpYWxBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1hcmtzIGEgdGVzdCB0byB1c2UgYSBjb21iaW5hdG9yaWFsIGpvaW4gb2YgYW55IGFyZ3VtZW50IGRhdGEgDQorICAgICAgICAgICAgcHJvdmlkZWQuIE5Vbml0IHdpbGwgY3JlYXRlIGEgdGVzdCBjYXNlIGZvciBldmVyeSBjb21iaW5hdGlvbiBvZiANCisgICAgICAgICAgICB0aGUgYXJndW1lbnRzIHByb3ZpZGVkLiBUaGlzIGNhbiByZXN1bHQgaW4gYSBsYXJnZSBudW1iZXIgb2YgdGVzdA0KKyAgICAgICAgICAgIGNhc2VzIGFuZCBzbyBzaG91bGQgYmUgdXNlZCBqdWRpY2lvdXNseS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBqb2luDQorICAgICAgICAgICAgdHlwZSwgc28gdGhlIGF0dHJpYnV0ZSBuZWVkIG5vdCBiZSB1c2VkIGV4Y2VwdCBhcyBkb2N1bWVudGF0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Qcm9wZXJ0eUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvcGVydHlBdHRyaWJ1dGUgaXMgdXNlZCB0byBhdHRhY2ggaW5mb3JtYXRpb24gdG8gYSB0ZXN0IGFzIGEgbmFtZS92YWx1ZSBwYWlyLi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuUHJvcGVydHlBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgUHJvcGVydHlBdHRyaWJ1dGUgd2l0aCBhIG5hbWUgYW5kIHN0cmluZyB2YWx1ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icHJvcGVydHlOYW1lIj5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwcm9wZXJ0eVZhbHVlIj5UaGUgcHJvcGVydHkgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlByb3BlcnR5QXR0cmlidXRlLiNjdG9yKFN5c3RlbS5TdHJpbmcsU3lzdGVtLkludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgUHJvcGVydHlBdHRyaWJ1dGUgd2l0aCBhIG5hbWUgYW5kIGludCB2YWx1ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icHJvcGVydHlOYW1lIj5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwcm9wZXJ0eVZhbHVlIj5UaGUgcHJvcGVydHkgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlByb3BlcnR5QXR0cmlidXRlLiNjdG9yKFN5c3RlbS5TdHJpbmcsU3lzdGVtLkRvdWJsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIFByb3BlcnR5QXR0cmlidXRlIHdpdGggYSBuYW1lIGFuZCBkb3VibGUgdmFsdWUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InByb3BlcnR5TmFtZSI+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icHJvcGVydHlWYWx1ZSI+VGhlIHByb3BlcnR5IHZhbHVlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Qcm9wZXJ0eUF0dHJpYnV0ZS4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0b3IgZm9yIGRlcml2ZWQgY2xhc3NlcyB0aGF0IHNldCB0aGUNCisgICAgICAgICAgICBwcm9wZXJ0eSBkaWN0aW9uYXJ5IGRpcmVjdGx5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Qcm9wZXJ0eUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0b3IgZm9yIHVzZSBieSBkZXJpdmVkIGNsYXNzZXMgdGhhdCB1c2UgdGhlDQorICAgICAgICAgICAgbmFtZSBvZiB0aGUgdHlwZSBhcyB0aGUgcHJvcGVydHkgbmFtZS4gRGVyaXZlZCBjbGFzc2VzDQorICAgICAgICAgICAgbXVzdCBlbnN1cmUgdGhhdCB0aGUgVHlwZSBvZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMNCisgICAgICAgICAgICBhIHN0YW5kYXJkIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBCQ0wuIEFueSBjdXN0b20NCisgICAgICAgICAgICB0eXBlcyB3aWxsIGNhdXNlIGEgc2VyaWFsaXphdGlvbiBFeGNlcHRpb24gd2hlbg0KKyAgICAgICAgICAgIGluIHRoZSBjbGllbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlByb3BlcnR5QXR0cmlidXRlLlByb3BlcnRpZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHByb3BlcnR5IGRpY3Rpb25hcnkgZm9yIHRoaXMgYXR0cmlidXRlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbWJpbmF0b3JpYWxBdHRyaWJ1dGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERlZmF1bHQgY29uc3RydWN0b3INCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuUGFpcndpc2VBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1hcmtzIGEgdGVzdCB0byB1c2UgcGFpcndpc2Ugam9pbiBvZiBhbnkgYXJndW1lbnQgZGF0YSBwcm92aWRlZC4gDQorICAgICAgICAgICAgTlVuaXQgd2lsbCBhdHRlbXB0IHRvbyBleGNlcmNpc2UgZXZlcnkgcGFpciBvZiBhcmd1bWVudCB2YWx1ZXMgYXQgDQorICAgICAgICAgICAgbGVhc3Qgb25jZSwgdXNpbmcgYXMgc21hbGwgYSBudW1iZXIgb2YgdGVzdCBjYXNlcyBhcyBpdCBjYW4uIFdpdGgNCisgICAgICAgICAgICBvbmx5IHR3byBhcmd1bWVudHMsIHRoaXMgaXMgdGhlIHNhbWUgYXMgYSBjb21iaW5hdG9yaWFsIGpvaW4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlBhaXJ3aXNlQXR0cmlidXRlLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZWZhdWx0IGNvbnN0cnVjdG9yDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlNlcXVlbnRpYWxBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1hcmtzIGEgdGVzdCB0byB1c2UgYSBzZXF1ZW50aWFsIGpvaW4gb2YgYW55IGFyZ3VtZW50IGRhdGENCisgICAgICAgICAgICBwcm92aWRlZC4gTlVuaXQgd2lsbCB1c2UgYXJndWVtZW50cyBmb3IgZWFjaCBwYXJhbWV0ZXIgaW4NCisgICAgICAgICAgICBzZXF1ZW5jZSwgZ2VuZXJhdGluZyB0ZXN0IGNhc2VzIHVwIHRvIHRoZSBsYXJnZXN0IG51bWJlcg0KKyAgICAgICAgICAgIG9mIGFyZ3VtZW50IHZhbHVlcyBwcm92aWRlZCBhbmQgdXNpbmcgbnVsbCBmb3IgYW55IGFyZ3VtZW50cw0KKyAgICAgICAgICAgIGZvciB3aGljaCBpdCBydW5zIG91dCBvZiB2YWx1ZXMuIE5vcm1hbGx5LCB0aGlzIHNob3VsZCBiZQ0KKyAgICAgICAgICAgIHVzZWQgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBlYWNoIHBhcmFtZXRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuU2VxdWVudGlhbEF0dHJpYnV0ZS4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGVmYXVsdCBjb25zdHJ1Y3Rvcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5NYXhUaW1lQXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdW1tYXJ5IGRlc2NyaXB0aW9uIGZvciBNYXhUaW1lQXR0cmlidXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5NYXhUaW1lQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIE1heFRpbWVBdHRyaWJ1dGUsIGdpdmVuIGEgdGltZSBpbiBtaWxsaXNlY29uZHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtaWxsaXNlY29uZHMiPlRoZSBtYXhpbXVtIGVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHM8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlJhbmRvbUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmFuZG9tQXR0cmlidXRlIGlzIHVzZWQgdG8gc3VwcGx5IGEgc2V0IG9mIHJhbmRvbSB2YWx1ZXMNCisgICAgICAgICAgICB0byBhIHNpbmdsZSBwYXJhbWV0ZXIgb2YgYSBwYXJhbWV0ZXJpemVkIHRlc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlZhbHVlc0F0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmFsdWVzQXR0cmlidXRlIGlzIHVzZWQgdG8gcHJvdmlkZSBsaXRlcmFsIGFyZ3VtZW50cyBmb3INCisgICAgICAgICAgICBhbiBpbmRpdmlkdWFsIHBhcmFtZXRlciBvZiBhIHRlc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlBhcmFtZXRlckRhdGFBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGF0dHJpYnV0ZXMgdGhhdCBhcHBseSB0byBwYXJhbWV0ZXJzIA0KKyAgICAgICAgICAgIGFuZCBzdXBwbHkgZGF0YSBmb3IgdGhlIHBhcmFtZXRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuUGFyYW1ldGVyRGF0YUF0dHJpYnV0ZS5HZXREYXRhKFN5c3RlbS5SZWZsZWN0aW9uLlBhcmFtZXRlckluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBkYXRhIHRvIGJlIHByb3ZpZGVkIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLlZhbHVlc0F0dHJpYnV0ZS5kYXRhIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgY29sbGVjdGlvbiBvZiBkYXRhIHRvIGJlIHJldHVybmVkLiBNdXN0DQorICAgICAgICAgICAgYmUgc2V0IGJ5IGFueSBkZXJpdmVkIGF0dHJpYnV0ZSBjbGFzc2VzLg0KKyAgICAgICAgICAgIFdlIHVzZSBhbiBvYmplY3RbXSBzbyB0aGF0IHRoZSBpbmRpdmlkdWFsDQorICAgICAgICAgICAgZWxlbWVudHMgbWF5IGhhdmUgdGhlaXIgdHlwZSBjaGFuZ2VkIGluIEdldERhdGENCisgICAgICAgICAgICBpZiBuZWNlc3NhcnkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlZhbHVlc0F0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IHdpdGggb25lIGFyZ3VtZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlZhbHVlc0F0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3Qgd2l0aCB0d28gYXJndW1lbnRzDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlZhbHVlc0F0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCB3aXRoIHRocmVlIGFyZ3VtZW50cw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMyI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5WYWx1ZXNBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IHdpdGggYW4gYXJyYXkgb2YgYXJndW1lbnRzDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlZhbHVlc0F0dHJpYnV0ZS5HZXREYXRhKFN5c3RlbS5SZWZsZWN0aW9uLlBhcmFtZXRlckluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgdGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIHRvIGJlIHVzZWQgYXMgYXJndW1lbnRzDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlJhbmRvbUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSBzZXQgb2YgZG91YmxlcyBmcm9tIDAuMCB0byAxLjAsDQorICAgICAgICAgICAgc3BlY2lmeWluZyBvbmx5IHRoZSBjb3VudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvdW50Ij48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlJhbmRvbUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUsU3lzdGVtLkludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgc2V0IG9mIGRvdWJsZXMgZnJvbSBtaW4gdG8gbWF4DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtaW4iPjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1heCI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY291bnQiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuUmFuZG9tQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5JbnQzMixTeXN0ZW0uSW50MzIsU3lzdGVtLkludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgc2V0IG9mIGludHMgZnJvbSBtaW4gdG8gbWF4DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtaW4iPjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1heCI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY291bnQiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuUmFuZG9tQXR0cmlidXRlLkdldERhdGEoU3lzdGVtLlJlZmxlY3Rpb24uUGFyYW1ldGVySW5mbykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCB0aGUgY29sbGVjdGlvbiBvZiB2YWx1ZXMgdG8gYmUgdXNlZCBhcyBhcmd1bWVudHMNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuUmFuZ2VBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJhbmdlQXR0cmlidXRlIGlzIHVzZWQgdG8gc3VwcGx5IGEgcmFuZ2Ugb2YgdmFsdWVzIHRvIGFuDQorICAgICAgICAgICAgaW5kaXZpZHVhbCBwYXJhbWV0ZXIgb2YgYSBwYXJhbWV0ZXJpemVkIHRlc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlJhbmdlQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5JbnQzMixTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSByYW5nZSBvZiBpbnRzIHVzaW5nIGRlZmF1bHQgc3RlcCBvZiAxDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmcm9tIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0byI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5SYW5nZUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uSW50MzIsU3lzdGVtLkludDMyLFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIHJhbmdlIG9mIGludHMgc3BlY2lmeWluZyB0aGUgc3RlcCBzaXplIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZnJvbSI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idG8iPjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN0ZXAiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuUmFuZ2VBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLkludDY0LFN5c3RlbS5JbnQ2NCxTeXN0ZW0uSW50NjQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSByYW5nZSBvZiBsb25ncw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZnJvbSI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idG8iPjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN0ZXAiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuUmFuZ2VBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSByYW5nZSBvZiBkb3VibGVzDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmcm9tIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0byI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3RlcCI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5SYW5nZUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uU2luZ2xlLFN5c3RlbS5TaW5nbGUsU3lzdGVtLlNpbmdsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIHJhbmdlIG9mIGZsb2F0cw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZnJvbSI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idG8iPjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN0ZXAiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuUmVwZWF0QXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXBlYXRBdHRyaWJ1dGUgbWF5IGJlIGFwcGxpZWQgdG8gdGVzdCBjYXNlIGluIG9yZGVyDQorICAgICAgICAgICAgdG8gcnVuIGl0IG11bHRpcGxlIHRpbWVzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5SZXBlYXRBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLkludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgUmVwZWF0QXR0cmlidXRlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiB0aW1lcyB0byBydW4gdGhlIHRlc3Q8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlJlcXVpcmVkQWRkaW5BdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcXVpcmVkQWRkaW5BdHRyaWJ1dGUgbWF5IGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIG5hbWVzIG9mIGFueSBhZGRpbnMNCisgICAgICAgICAgICB0aGF0IG11c3QgYmUgcHJlc2VudCBpbiBvcmRlciB0byBydW4gc29tZSBvciBhbGwgb2YgdGhlIHRlc3RzIGluIGFuDQorICAgICAgICAgICAgYXNzZW1ibHkuIElmIHRoZSBhZGRpbiBpcyBub3QgbG9hZGVkLCB0aGUgZW50aXJlIGFzc2VtYmx5IGlzIG1hcmtlZA0KKyAgICAgICAgICAgIGFzIE5vdFJ1bm5hYmxlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5SZXF1aXJlZEFkZGluQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUOlJlcXVpcmVkQWRkaW5BdHRyaWJ1dGUiLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyZXF1aXJlZEFkZGluIj5UaGUgcmVxdWlyZWQgYWRkaW4uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5SZXF1aXJlZEFkZGluQXR0cmlidXRlLlJlcXVpcmVkQWRkaW4iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIG5hbWUgb2YgcmVxdWlyZWQgYWRkaW4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT5UaGUgcmVxdWlyZWQgYWRkaW4gbmFtZS48L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlNldEN1bHR1cmVBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN1bW1hcnkgZGVzY3JpcHRpb24gZm9yIFNldEN1bHR1cmVBdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlNldEN1bHR1cmVBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBnaXZlbiB0aGUgbmFtZSBvZiBhIGN1bHR1cmUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImN1bHR1cmUiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuU2V0VUlDdWx0dXJlQXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdW1tYXJ5IGRlc2NyaXB0aW9uIGZvciBTZXRVSUN1bHR1cmVBdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlNldFVJQ3VsdHVyZUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGdpdmVuIHRoZSBuYW1lIG9mIGEgY3VsdHVyZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3VsdHVyZSI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5TZXRVcEF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXR0cmlidXRlIHVzZWQgdG8gbWFyayBhIGNsYXNzIHRoYXQgY29udGFpbnMgb25lLXRpbWUgU2V0VXAgDQorICAgICAgICAgICAgYW5kL29yIFRlYXJEb3duIG1ldGhvZHMgdGhhdCBhcHBseSB0byBhbGwgdGhlIHRlc3RzIGluIGENCisgICAgICAgICAgICBuYW1lc3BhY2Ugb3IgYW4gYXNzZW1ibHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlNldFVwRml4dHVyZUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0VXBGaXh0dXJlQXR0cmlidXRlIGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBTZXRVcEZpeHR1cmUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuU3VpdGVBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEF0dHJpYnV0ZSB1c2VkIHRvIG1hcmsgYSBzdGF0aWMgKHNoYXJlZCBpbiBWQikgcHJvcGVydHkNCisgICAgICAgICAgICB0aGF0IHJldHVybnMgYSBsaXN0IG9mIHRlc3RzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5UZWFyRG93bkF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXR0cmlidXRlIHVzZWQgdG8gaWRlbnRpZnkgYSBtZXRob2QgdGhhdCBpcyBjYWxsZWQgDQorICAgICAgICAgICAgaW1tZWRpYXRlbHkgYWZ0ZXIgZWFjaCB0ZXN0IGlzIHJ1bi4gVGhlIG1ldGhvZCBpcyANCisgICAgICAgICAgICBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCwgZXZlbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5UZXN0QXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBZGRpbmcgdGhpcyBhdHRyaWJ1dGUgdG8gYSBtZXRob2Qgd2l0aGluIGEgPHNlZWFsc28gY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuVGVzdEZpeHR1cmVBdHRyaWJ1dGUiLz4gDQorICAgICAgICAgICAgY2xhc3MgbWFrZXMgdGhlIG1ldGhvZCBjYWxsYWJsZSBmcm9tIHRoZSBOVW5pdCB0ZXN0IHJ1bm5lci4gVGhlcmUgaXMgYSBwcm9wZXJ0eSANCisgICAgICAgICAgICBjYWxsZWQgRGVzY3JpcHRpb24gd2hpY2ggaXMgb3B0aW9uYWwgd2hpY2ggeW91IGNhbiBwcm92aWRlIGEgbW9yZSBkZXRhaWxlZCB0ZXN0DQorICAgICAgICAgICAgZGVzY3JpcHRpb24uIFRoaXMgY2xhc3MgY2Fubm90IGJlIGluaGVyaXRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgPGV4YW1wbGU+DQorICAgICAgICAgICAgW1Rlc3RGaXh0dXJlXQ0KKyAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBGaXh0dXJlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgW1Rlc3RdDQorICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBNZXRob2RUb1Rlc3QoKQ0KKyAgICAgICAgICAgICAge30NCisgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgW1Rlc3QoRGVzY3JpcHRpb24gPSAibW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiIpXQ0KKyAgICAgICAgICAgICAgcHVibGMgdm9pZCBUZXN0RGVzY3JpcHRpb25NZXRob2QoKQ0KKyAgICAgICAgICAgICAge30NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgPC9leGFtcGxlPg0KKyAgICAgICAgICAgIA0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RBdHRyaWJ1dGUuRGVzY3JpcHRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERlc2NyaXB0aXZlIHRleHQgZm9yIHRoaXMgdGVzdA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdENhc2VBdHRyaWJ1dGUgaXMgdXNlZCB0byBtYXJrIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlcw0KKyAgICAgICAgICAgIGFuZCBwcm92aWRlIHRoZW0gd2l0aCB0aGVpciBhcmd1bWVudHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLklUZXN0Q2FzZURhdGEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBJVGVzdENhc2VEYXRhIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBhIGNsYXNzDQorICAgICAgICAgICAgdGhhdCBpcyBhYmxlIHRvIHJldHVybiBjb21wbGV0ZSB0ZXN0Y2FzZXMgZm9yIHVzZSBieQ0KKyAgICAgICAgICAgIGEgcGFyYW1ldGVyaXplZCB0ZXN0IG1ldGhvZC4NCisgICAgICAgICAgICANCisgICAgICAgICAgICBOT1RFOiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGluIGJvdGggdGhlIGZyYW1ld29yaw0KKyAgICAgICAgICAgIGFuZCB0aGUgY29yZSwgZXZlbiB0aG91Z2ggdGhhdCByZXN1bHRzIGluIHR3byBkaWZmZXJlbnQNCisgICAgICAgICAgICB0eXBlcy4gSG93ZXZlciwgc2hhcmluZyB0aGUgc291cmNlIGNvZGUgZ3VhcmFudGVlcyB0aGF0DQorICAgICAgICAgICAgdGhlIHZhcmlvdXMgaW1wbGVtZW50YXRpb25zIHdpbGwgYmUgY29tcGF0aWJsZSBhbmQgdGhhdA0KKyAgICAgICAgICAgIHRoZSBjb3JlIGlzIGFibGUgdG8gcmVmbGVjdCBzdWNjZXNzZnVsbHkgb3ZlciB0aGUNCisgICAgICAgICAgICBmcmFtZXdvcmsgaW1wbGVtZW50YXRpb25zIG9mIElUZXN0Q2FzZURhdGEuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLklUZXN0Q2FzZURhdGEuQXJndW1lbnRzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBhcmd1bWVudCBsaXN0IHRvIGJlIHByb3ZpZGVkIHRvIHRoZSB0ZXN0DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLklUZXN0Q2FzZURhdGEuUmVzdWx0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBleHBlY3RlZCByZXN1bHQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuSVRlc3RDYXNlRGF0YS5FeHBlY3RlZEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgIEdldHMgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiBUeXBlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLklUZXN0Q2FzZURhdGEuRXhwZWN0ZWRFeGNlcHRpb25OYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBGdWxsTmFtZSBvZiB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLklUZXN0Q2FzZURhdGEuVGVzdE5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIG5hbWUgdG8gYmUgdXNlZCBmb3IgdGhlIHRlc3QNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuSVRlc3RDYXNlRGF0YS5EZXNjcmlwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHRlc3QNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuSVRlc3RDYXNlRGF0YS5JZ25vcmVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5JVGVzdENhc2VEYXRhIi8+IGlzIGlnbm9yZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT48Yz50cnVlPC9jPiBpZiBpZ25vcmVkOyBvdGhlcndpc2UsIDxjPmZhbHNlPC9jPi48L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLklUZXN0Q2FzZURhdGEuSWdub3JlUmVhc29uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBpZ25vcmUgcmVhc29uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+VGhlIGlnbm9yZSByZWFzb24uPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSBUZXN0Q2FzZUF0dHJpYnV0ZSB3aXRoIGEgbGlzdCBvZiBhcmd1bWVudHMuDQorICAgICAgICAgICAgVGhpcyBjb25zdHJ1Y3RvciBpcyBub3QgQ0xTLUNvbXBsaWFudA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSBUZXN0Q2FzZUF0dHJpYnV0ZSB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmciPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgVGVzdENhc2VBdHRyaWJ1dGUgd2l0aCBhIHR3byBhcmd1bWVudHMNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSBUZXN0Q2FzZUF0dHJpYnV0ZSB3aXRoIGEgdGhyZWUgYXJndW1lbnRzDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmczIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlQXR0cmlidXRlLkFyZ3VtZW50cyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgbGlzdCBvZiBhcmd1bWVudHMgdG8gYSB0ZXN0IGNhc2UNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VBdHRyaWJ1dGUuUmVzdWx0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIGV4cGVjdGVkIHJlc3VsdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPlRoZSByZXN1bHQuPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZUF0dHJpYnV0ZS5DYXRlZ29yaWVzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgbGlzdCBvZiBjYXRlZ29yaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlc3Q7DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlQXR0cmlidXRlLkNhdGVnb3J5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIGNhdGVnb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlc3QuDQorICAgICAgICAgICAgTWF5IGJlIGEgc2luZ2xlIGNhdGVnb3J5IG9yIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlQXR0cmlidXRlLkV4cGVjdGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPlRoZSBleHBlY3RlZCBleGNlcHRpb24uPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZUF0dHJpYnV0ZS5FeHBlY3RlZEV4Y2VwdGlvbk5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgbmFtZSB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+VGhlIGV4cGVjdGVkIG5hbWUgb2YgdGhlIGV4Y2VwdGlvbi48L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlQXR0cmlidXRlLkV4cGVjdGVkTWVzc2FnZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBleHBlY3RlZCBtZXNzYWdlIG9mIHRoZSBleHBlY3RlZCBleGNlcHRpb24NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPlRoZSBleHBlY3RlZCBtZXNzYWdlIG9mIHRoZSBleGNlcHRpb24uPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZUF0dHJpYnV0ZS5NYXRjaFR5cGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIHR5cGUgb2YgbWF0Y2ggdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBleHBlY3RlZCBtZXNzYWdlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlQXR0cmlidXRlLkRlc2NyaXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIGRlc2NyaXB0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+VGhlIGRlc2NyaXB0aW9uLjwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VBdHRyaWJ1dGUuVGVzdE5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgbmFtZSBvZiB0aGUgdGVzdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPlRoZSBuYW1lIG9mIHRoZSB0ZXN0LjwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VBdHRyaWJ1dGUuSWdub3JlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgdGhlIGlnbm9yZWQgc3RhdHVzIG9mIHRoZSB0ZXN0DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlQXR0cmlidXRlLklnbm9yZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgaWdub3JlZCBzdGF0dXMgb2YgdGhlIHRlc3QNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VBdHRyaWJ1dGUuSWdub3JlUmVhc29uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBpZ25vcmUgcmVhc29uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+VGhlIGlnbm9yZSByZWFzb24uPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZVNvdXJjZUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRmFjdG9yeUF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhlIHNvdXJjZSB0byBiZSB1c2VkIHRvDQorICAgICAgICAgICAgcHJvdmlkZSB0ZXN0IGNhc2VzIGZvciBhIHRlc3QgbWV0aG9kLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZVNvdXJjZUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGZhY3RvcnkgLSBmb3IgdXNlIHdpdGggbGFuZ3VhZ2VzDQorICAgICAgICAgICAgdGhhdCBkb24ndCBzdXBwb3J0IHBhcmFtcyBhcnJheXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzb3VyY2VOYW1lIj5BbiBhcnJheSBvZiB0aGUgbmFtZXMgb2YgdGhlIGZhY3RvcmllcyB0aGF0IHdpbGwgcHJvdmlkZSBkYXRhPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZVNvdXJjZUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uVHlwZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IHdpdGggYSBUeXBlIGFuZCBuYW1lIC0gZm9yIHVzZSB3aXRoIGxhbmd1YWdlcw0KKyAgICAgICAgICAgIHRoYXQgZG9uJ3Qgc3VwcG9ydCBwYXJhbXMgYXJyYXlzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic291cmNlVHlwZSI+VGhlIFR5cGUgdGhhdCB3aWxsIHByb3ZpZGUgZGF0YTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNvdXJjZU5hbWUiPlRoZSBuYW1lIG9mIHRoZSBtZXRob2QsIHByb3BlcnR5IG9yIGZpZWxkIHRoYXQgd2lsbCBwcm92aWRlIGRhdGE8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlU291cmNlQXR0cmlidXRlLlNvdXJjZU5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBuYW1lIG9mIGEgdGhlIG1ldGhvZCwgcHJvcGVydHkgb3IgZmllbmQgdG8gYmUgdXNlZCBhcyBhIHNvdXJjZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZVNvdXJjZUF0dHJpYnV0ZS5Tb3VyY2VUeXBlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIFR5cGUgdG8gYmUgdXNlZCBhcyBhIHNvdXJjZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5UZXN0Rml4dHVyZUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPGV4YW1wbGU+DQorICAgICAgICAgICAgW1Rlc3RGaXh0dXJlXQ0KKyAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBFeGFtcGxlQ2xhc3MgDQorICAgICAgICAgICAge30NCisgICAgICAgICAgICA8L2V4YW1wbGU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGVzdEZpeHR1cmVBdHRyaWJ1dGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERlZmF1bHQgY29uc3RydWN0b3INCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGVzdEZpeHR1cmVBdHRyaWJ1dGUuI2N0b3IoU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IHdpdGggYSBvYmplY3RbXSByZXByZXNlbnRpbmcgYSBzZXQgb2YgYXJndW1lbnRzLiANCisgICAgICAgICAgICBJbiAuTkVUIDIuMCwgdGhlIGFyZ3VtZW50cyBtYXkgbGF0ZXIgYmUgc2VwYXJhdGVkIGludG8NCisgICAgICAgICAgICB0eXBlIGFyZ3VtZW50cyBhbmQgY29uc3RydWN0b3IgYXJndW1lbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RGaXh0dXJlQXR0cmlidXRlLkRlc2NyaXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGlzIGZpeHR1cmUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdEZpeHR1cmVBdHRyaWJ1dGUuQ2F0ZWdvcnkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYW5kIHNldHMgdGhlIGNhdGVnb3J5IGZvciB0aGlzIGZpeHR1cmUuDQorICAgICAgICAgICAgTWF5IGJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY2F0ZWdvcmllcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdEZpeHR1cmVBdHRyaWJ1dGUuQ2F0ZWdvcmllcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIGxpc3Qgb2YgY2F0ZWdvcmllcyBmb3IgdGhpcyBmaXh0dXJlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RGaXh0dXJlQXR0cmlidXRlLkFyZ3VtZW50cyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIGFyZ3VtZW50cyBvcmlnaW5hbGx5IHByb3ZpZGVkIHRvIHRoZSBhdHRyaWJ1dGUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdEZpeHR1cmVBdHRyaWJ1dGUuSWdub3JlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLlRlc3RGaXh0dXJlQXR0cmlidXRlIi8+IHNob3VsZCBiZSBpZ25vcmVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+PGM+dHJ1ZTwvYz4gaWYgaWdub3JlOyBvdGhlcndpc2UsIDxjPmZhbHNlPC9jPi48L3ZhbHVlPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RGaXh0dXJlQXR0cmlidXRlLklnbm9yZVJlYXNvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBvciBzZXRzIHRoZSBpZ25vcmUgcmVhc29uLiBNYXkgc2V0IElnbm9yZWQgYXMgYSBzaWRlIGVmZmVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHZhbHVlPlRoZSBpZ25vcmUgcmVhc29uLjwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdEZpeHR1cmVBdHRyaWJ1dGUuVHlwZUFyZ3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldCBvciBzZXQgdGhlIHR5cGUgYXJndW1lbnRzLiBJZiBub3Qgc2V0DQorICAgICAgICAgICAgZXhwbGljaXRseSwgYW55IGxlYWRpbmcgYXJndW1lbnRzIHRoYXQgYXJlDQorICAgICAgICAgICAgVHlwZXMgYXJlIHRha2VuIGFzIHR5cGUgYXJndW1lbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5UZXN0Rml4dHVyZVNldFVwQXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBdHRyaWJ1dGUgdXNlZCB0byBpZGVudGlmeSBhIG1ldGhvZCB0aGF0IGlzIA0KKyAgICAgICAgICAgIGNhbGxlZCBiZWZvcmUgYW55IHRlc3RzIGluIGEgZml4dHVyZSBhcmUgcnVuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5UZXN0Rml4dHVyZVRlYXJEb3duQXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBdHRyaWJ1dGUgdXNlZCB0byBpZGVudGlmeSBhIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCBhZnRlcg0KKyAgICAgICAgICAgIGFsbCB0aGUgdGVzdHMgaW4gYSBmaXh0dXJlIGhhdmUgcnVuLiBUaGUgbWV0aG9kIGlzIA0KKyAgICAgICAgICAgIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkLCBldmVuIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlRoZW9yeUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQWRkaW5nIHRoaXMgYXR0cmlidXRlIHRvIGEgbWV0aG9kIHdpdGhpbiBhIDxzZWVhbHNvIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLlRlc3RGaXh0dXJlQXR0cmlidXRlIi8+IA0KKyAgICAgICAgICAgIGNsYXNzIG1ha2VzIHRoZSBtZXRob2QgY2FsbGFibGUgZnJvbSB0aGUgTlVuaXQgdGVzdCBydW5uZXIuIFRoZXJlIGlzIGEgcHJvcGVydHkgDQorICAgICAgICAgICAgY2FsbGVkIERlc2NyaXB0aW9uIHdoaWNoIGlzIG9wdGlvbmFsIHdoaWNoIHlvdSBjYW4gcHJvdmlkZSBhIG1vcmUgZGV0YWlsZWQgdGVzdA0KKyAgICAgICAgICAgIGRlc2NyaXB0aW9uLiBUaGlzIGNsYXNzIGNhbm5vdCBiZSBpbmhlcml0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIDxleGFtcGxlPg0KKyAgICAgICAgICAgIFtUZXN0Rml4dHVyZV0NCisgICAgICAgICAgICBwdWJsaWMgY2xhc3MgRml4dHVyZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgTWV0aG9kVG9UZXN0KCkNCisgICAgICAgICAgICAgIHt9DQorICAgICAgICAgICAgICANCisgICAgICAgICAgICAgIFtUZXN0KERlc2NyaXB0aW9uID0gIm1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24iKV0NCisgICAgICAgICAgICAgIHB1YmxjIHZvaWQgVGVzdERlc2NyaXB0aW9uTWV0aG9kKCkNCisgICAgICAgICAgICAgIHt9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIDwvZXhhbXBsZT4NCisgICAgICAgICAgICANCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5UaW1lb3V0QXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXVXNlZCBvbiBhIG1ldGhvZCwgbWFya3MgdGhlIHRlc3Qgd2l0aCBhIHRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmRzLiANCisgICAgICAgICAgICBUaGUgdGVzdCB3aWxsIGJlIHJ1biBpbiBhIHNlcGFyYXRlIHRocmVhZCBhbmQgaXMgY2FuY2VsbGVkIGlmIHRoZSB0aW1lb3V0IA0KKyAgICAgICAgICAgIGlzIGV4Y2VlZGVkLiBVc2VkIG9uIGEgbWV0aG9kIG9yIGFzc2VtYmx5LCBzZXRzIHRoZSBkZWZhdWx0IHRpbWVvdXQgDQorICAgICAgICAgICAgZm9yIGFsbCBjb250YWluZWQgdGVzdCBtZXRob2RzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UaW1lb3V0QXR0cmlidXRlLiNjdG9yKFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIFRpbWVvdXRBdHRyaWJ1dGUgZ2l2ZW4gYSB0aW1lIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idGltZW91dCI+VGhlIHRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmRzPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5SZXF1aXJlc1NUQUF0dHJpYnV0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTWFya3MgYSB0ZXN0IHRoYXQgbXVzdCBydW4gaW4gdGhlIFNUQSwgY2F1c2luZyBpdA0KKyAgICAgICAgICAgIHRvIHJ1biBpbiBhIHNlcGFyYXRlIHRocmVhZCBpZiBuZWNlc3NhcnkuDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgT24gbWV0aG9kcywgeW91IG1heSBhbHNvIHVzZSBTVEFUaHJlYWRBdHRyaWJ1dGUNCisgICAgICAgICAgICB0byBzZXJ2ZSB0aGUgc2FtZSBwdXJwb3NlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5SZXF1aXJlc1NUQUF0dHJpYnV0ZS4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgUmVxdWlyZXNTVEFBdHRyaWJ1dGUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuUmVxdWlyZXNNVEFBdHRyaWJ1dGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1hcmtzIGEgdGVzdCB0aGF0IG11c3QgcnVuIGluIHRoZSBNVEEsIGNhdXNpbmcgaXQNCisgICAgICAgICAgICB0byBydW4gaW4gYSBzZXBhcmF0ZSB0aHJlYWQgaWYgbmVjZXNzYXJ5Lg0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIE9uIG1ldGhvZHMsIHlvdSBtYXkgYWxzbyB1c2UgTVRBVGhyZWFkQXR0cmlidXRlDQorICAgICAgICAgICAgdG8gc2VydmUgdGhlIHNhbWUgcHVycG9zZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuUmVxdWlyZXNNVEFBdHRyaWJ1dGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIFJlcXVpcmVzTVRBQXR0cmlidXRlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlJlcXVpcmVzVGhyZWFkQXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNYXJrcyBhIHRlc3QgdGhhdCBtdXN0IHJ1biBvbiBhIHNlcGFyYXRlIHRocmVhZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuUmVxdWlyZXNUaHJlYWRBdHRyaWJ1dGUuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIFJlcXVpcmVzVGhyZWFkQXR0cmlidXRlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlJlcXVpcmVzVGhyZWFkQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5UaHJlYWRpbmcuQXBhcnRtZW50U3RhdGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSBSZXF1aXJlc1RocmVhZEF0dHJpYnV0ZSwgc3BlY2lmeWluZyB0aGUgYXBhcnRtZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlZhbHVlU291cmNlQXR0cmlidXRlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWYWx1ZVNvdXJjZUF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhlIHNvdXJjZSB0byBiZSB1c2VkIHRvDQorICAgICAgICAgICAgcHJvdmlkZSBkYXRhIGZvciBvbmUgcGFyYW1ldGVyIG9mIGEgdGVzdCBtZXRob2QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlZhbHVlU291cmNlQXR0cmlidXRlLiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3Qgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmFjdG9yeSAtIGZvciB1c2Ugd2l0aCBsYW5ndWFnZXMNCisgICAgICAgICAgICB0aGF0IGRvbid0IHN1cHBvcnQgcGFyYW1zIGFycmF5cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNvdXJjZU5hbWUiPlRoZSBuYW1lIG9mIHRoZSBkYXRhIHNvdXJjZSB0byBiZSB1c2VkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5WYWx1ZVNvdXJjZUF0dHJpYnV0ZS4jY3RvcihTeXN0ZW0uVHlwZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IHdpdGggYSBUeXBlIGFuZCBuYW1lIC0gZm9yIHVzZSB3aXRoIGxhbmd1YWdlcw0KKyAgICAgICAgICAgIHRoYXQgZG9uJ3Qgc3VwcG9ydCBwYXJhbXMgYXJyYXlzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic291cmNlVHlwZSI+VGhlIFR5cGUgdGhhdCB3aWxsIHByb3ZpZGUgZGF0YTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNvdXJjZU5hbWUiPlRoZSBuYW1lIG9mIHRoZSBtZXRob2QsIHByb3BlcnR5IG9yIGZpZWxkIHRoYXQgd2lsbCBwcm92aWRlIGRhdGE8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlZhbHVlU291cmNlQXR0cmlidXRlLlNvdXJjZU5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBuYW1lIG9mIGEgdGhlIG1ldGhvZCwgcHJvcGVydHkgb3IgZmllbmQgdG8gYmUgdXNlZCBhcyBhIHNvdXJjZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5WYWx1ZVNvdXJjZUF0dHJpYnV0ZS5Tb3VyY2VUeXBlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIFR5cGUgdG8gYmUgdXNlZCBhcyBhIHNvdXJjZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BdHRyaWJ1dGVFeGlzdHNDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBdHRyaWJ1dGVFeGlzdHNDb25zdHJhaW50IHRlc3RzIGZvciB0aGUgcHJlc2VuY2Ugb2YgYQ0KKyAgICAgICAgICAgIHNwZWNpZmllZCBhdHRyaWJ1dGUgb24gIGEgVHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIENvbnN0cmFpbnQgY2xhc3MgaXMgdGhlIGJhc2Ugb2YgYWxsIGJ1aWx0LWluIGNvbnN0cmFpbnRzDQorICAgICAgICAgICAgd2l0aGluIE5Vbml0LiBJdCBwcm92aWRlcyB0aGUgb3BlcmF0b3Igb3ZlcmxvYWRzIHVzZWQgdG8gY29tYmluZSANCisgICAgICAgICAgICBjb25zdHJhaW50cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgSUNvbnN0cmFpbnRFeHByZXNzaW9uIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBhbGwNCisgICAgICAgICAgICBjb21wbGV0ZSBhbmQgcmVzb2x2YWJsZSBjb25zdHJhaW50cyBhbmQgZXhwcmVzc2lvbnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLklSZXNvbHZlQ29uc3RyYWludC5SZXNvbHZlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm4gdGhlIHRvcC1sZXZlbCBjb25zdHJhaW50IGZvciB0aGlzIGV4cHJlc3Npb24NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQuVU5TRVQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN0YXRpYyBVbnNldE9iamVjdCB1c2VkIHRvIGRldGVjdCBkZXJpdmVkIGNvbnN0cmFpbnRzDQorICAgICAgICAgICAgZmFpbGluZyB0byBzZXQgdGhlIGFjdHVhbCB2YWx1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludC5hY3R1YWwiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBhY3R1YWwgdmFsdWUgYmVpbmcgdGVzdGVkIGFnYWluc3QgYSBjb25zdHJhaW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQuZGlzcGxheU5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBDb25zdHJhaW50IGZvciB1c2UgYnkgVG9TdHJpbmcoKQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50LmFyZ2NudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXJndW1lbnQgZmllbGRzIHVzZWQgYnkgVG9TdHJpbmcoKTsNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludC5idWlsZGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgYnVpbGRlciBob2xkaW5nIHRoaXMgY29uc3RyYWludA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50LiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSBjb25zdHJhaW50IHdpdGggbm8gYXJndW1lbnRzDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQuI2N0b3IoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIGNvbnN0cmFpbnQgd2l0aCBvbmUgYXJndW1lbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludC4jY3RvcihTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSBjb25zdHJhaW50IHdpdGggdHdvIGFyZ3VtZW50cw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50LlNldEJ1aWxkZXIoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRCdWlsZGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0cyB0aGUgQ29uc3RyYWludEJ1aWxkZXIgaG9sZGluZyB0aGlzIGNvbnN0cmFpbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludC5Xcml0ZU1lc3NhZ2VUbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBmYWlsdXJlIG1lc3NhZ2UgdG8gdGhlIE1lc3NhZ2VXcml0ZXIgcHJvdmlkZWQNCisgICAgICAgICAgICBhcyBhbiBhcmd1bWVudC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IHBhc3Nlcw0KKyAgICAgICAgICAgIHRoZSBjb25zdHJhaW50IGFuZCB0aGUgYWN0dWFsIHZhbHVlIHRvIHRoZSB3cml0ZXIsIHdoaWNoDQorICAgICAgICAgICAgdGhlbiBkaXNwbGF5cyB0aGUgY29uc3RyYWludCBkZXNjcmlwdGlvbiBhbmQgdGhlIHZhbHVlLg0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIENvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBwcm92aWRlIGFkZGl0aW9uYWwgZGV0YWlscywNCisgICAgICAgICAgICBzdWNoIGFzIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkIGNhbiBvdmVycmlkZSB0aGlzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgTWVzc2FnZVdyaXRlciBvbiB3aGljaCB0byBkaXNwbGF5IHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2hldGhlciB0aGUgY29uc3RyYWludCBpcyBzYXRpc2ZpZWQgYnkgYSBnaXZlbiB2YWx1ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgdmFsdWUgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZTwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50Lk1hdGNoZXMoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFjdHVhbFZhbHVlRGVsZWdhdGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IHdoZXRoZXIgdGhlIGNvbnN0cmFpbnQgaXMgc2F0aXNmaWVkIGJ5IGFuDQorICAgICAgICAgICAgQWN0dWFsVmFsdWVEZWxlZ2F0ZSB0aGF0IHJldHVybnMgdGhlIHZhbHVlIHRvIGJlIHRlc3RlZC4NCisgICAgICAgICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgZXZhbHVhdGVzIHRoZSBkZWxlZ2F0ZQ0KKyAgICAgICAgICAgIGJ1dCBkZXJpdmVkIGNsYXNzZXMgbWF5IG92ZXJyaWRlIGl0IHRvIHByb3ZpZGUgZm9yIGRlbGF5ZWQgDQorICAgICAgICAgICAgcHJvY2Vzc2luZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlbCI+QW4gQWN0dWFsVmFsdWVEZWxlZ2F0ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBmb3Igc3VjY2VzcywgZmFsc2UgZm9yIGZhaWx1cmU8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludC5NYXRjaGVzYGAxKGBgMEApIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IHdoZXRoZXIgdGhlIGNvbnN0cmFpbnQgaXMgc2F0aXNmaWVkIGJ5IGEgZ2l2ZW4gcmVmZXJlbmNlLg0KKyAgICAgICAgICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBkZXJlZmVyZW5jZXMgdGhlIHZhbHVlIGJ1dA0KKyAgICAgICAgICAgIGRlcml2ZWQgY2xhc3NlcyBtYXkgb3ZlcnJpZGUgaXQgdG8gcHJvdmlkZSBmb3IgZGVsYXllZCBwcm9jZXNzaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5BIHJlZmVyZW5jZSB0byB0aGUgdmFsdWUgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZTwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBjb25zdHJhaW50IGRlc2NyaXB0aW9uIHRvIGEgTWVzc2FnZVdyaXRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiBpcyBkaXNwbGF5ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQuV3JpdGVBY3R1YWxWYWx1ZVRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGFjdHVhbCB2YWx1ZSBmb3IgYSBmYWlsaW5nIGNvbnN0cmFpbnQgdGVzdCB0byBhDQorICAgICAgICAgICAgTWVzc2FnZVdyaXRlci4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IHdyaXRlcw0KKyAgICAgICAgICAgIHRoZSByYXcgdmFsdWUgb2YgYWN0dWFsLCBsZWF2aW5nIGl0IHRvIHRoZSB3cml0ZXIgdG8NCisgICAgICAgICAgICBwZXJmb3JtIGFueSBmb3JtYXR0aW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBhY3R1YWwgdmFsdWUgaXMgZGlzcGxheWVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50LlRvU3RyaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZWZhdWx0IG92ZXJyaWRlIG9mIFRvU3RyaW5nIHJldHVybnMgdGhlIGNvbnN0cmFpbnQgRGlzcGxheU5hbWUNCisgICAgICAgICAgICBmb2xsb3dlZCBieSBhbnkgYXJndW1lbnRzIHdpdGhpbiBhbmdsZSBicmFja2V0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQuR2V0U3RyaW5nUmVwcmVzZW50YXRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0cmFpbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludC5vcF9CaXR3aXNlQW5kKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50LE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhpcyBvcGVyYXRvciBjcmVhdGVzIGEgY29uc3RyYWludCB0aGF0IGlzIHNhdGlzZmllZCBvbmx5IGlmIGJvdGggDQorICAgICAgICAgICAgYXJndW1lbnQgY29uc3RyYWludHMgYXJlIHNhdGlzZmllZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludC5vcF9CaXR3aXNlT3IoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQsTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGlzIG9wZXJhdG9yIGNyZWF0ZXMgYSBjb25zdHJhaW50IHRoYXQgaXMgc2F0aXNmaWVkIGlmIGVpdGhlciANCisgICAgICAgICAgICBvZiB0aGUgYXJndW1lbnQgY29uc3RyYWludHMgaXMgc2F0aXNmaWVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50Lm9wX0xvZ2ljYWxOb3QoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGlzIG9wZXJhdG9yIGNyZWF0ZXMgYSBjb25zdHJhaW50IHRoYXQgaXMgc2F0aXNmaWVkIGlmIHRoZSANCisgICAgICAgICAgICBhcmd1bWVudCBjb25zdHJhaW50IGlzIG5vdCBzYXRpc2ZpZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQuQWZ0ZXIoU3lzdGVtLkludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIERlbGF5ZWRDb25zdHJhaW50IHdpdGggdGhlIHNwZWNpZmllZCBkZWxheSB0aW1lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVsYXlJbk1pbGxpc2Vjb25kcyI+VGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50LkFmdGVyKFN5c3RlbS5JbnQzMixTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgRGVsYXllZENvbnN0cmFpbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGF5IHRpbWUNCisgICAgICAgICAgICBhbmQgcG9sbGluZyBpbnRlcnZhbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlbGF5SW5NaWxsaXNlY29uZHMiPlRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icG9sbGluZ0ludGVydmFsIj5UaGUgaW50ZXJ2YWwgYXQgd2hpY2ggdG8gdGVzdCB0aGUgY29uc3RyYWludC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50LkRpc3BsYXlOYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgZGlzcGxheSBuYW1lIG9mIHRoaXMgQ29uc3RyYWludCBmb3IgdXNlIGJ5IFRvU3RyaW5nKCkuDQorICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIG5hbWUgb2YgdGhlIGNvbnN0cmFpbnQgd2l0aA0KKyAgICAgICAgICAgIHRyYWlsaW5nICJDb25zdHJhaW50IiByZW1vdmVkLiBEZXJpdmVkIGNsYXNzZXMgbWF5IHNldA0KKyAgICAgICAgICAgIHRoaXMgdG8gYW5vdGhlciBuYW1lIGluIHRoZWlyIGNvbnN0cnVjdG9ycy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludC5BbmQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBDb25zdHJhaW50RXhwcmVzc2lvbiBieSBhcHBlbmRpbmcgQW5kDQorICAgICAgICAgICAgdG8gdGhlIGN1cnJlbnQgY29uc3RyYWludC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludC5XaXRoIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgQ29uc3RyYWludEV4cHJlc3Npb24gYnkgYXBwZW5kaW5nIEFuZA0KKyAgICAgICAgICAgIHRvIHRoZSBjdXJyZW50IGNvbnN0cmFpbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQuT3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBDb25zdHJhaW50RXhwcmVzc2lvbiBieSBhcHBlbmRpbmcgT3INCisgICAgICAgICAgICB0byB0aGUgY3VycmVudCBjb25zdHJhaW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50LlVuc2V0T2JqZWN0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDbGFzcyB1c2VkIHRvIGRldGVjdCBhbnkgZGVyaXZlZCBjb25zdHJhaW50cw0KKyAgICAgICAgICAgIHRoYXQgZmFpbCB0byBzZXQgdGhlIGFjdHVhbCB2YWx1ZSBpbiB0aGVpcg0KKyAgICAgICAgICAgIE1hdGNoZXMgb3ZlcnJpZGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkF0dHJpYnV0ZUV4aXN0c0NvbnN0cmFpbnQuI2N0b3IoU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3RzIGFuIEF0dHJpYnV0ZUV4aXN0c0NvbnN0cmFpbnQgZm9yIGEgc3BlY2lmaWMgYXR0cmlidXRlIFR5cGUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQXR0cmlidXRlRXhpc3RzQ29uc3RyYWludC5NYXRjaGVzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0cyB3aGV0aGVyIHRoZSBvYmplY3QgcHJvdmlkZXMgdGhlIGV4cGVjdGVkIGF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+QSBUeXBlLCBNZXRob2RJbmZvLCBvciBvdGhlciBJQ3VzdG9tQXR0cmlidXRlUHJvdmlkZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgaWYgdGhlIGV4cGVjdGVkIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCBvdGhlcndpc2UgZmFsc2U8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQXR0cmlidXRlRXhpc3RzQ29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25zdHJhaW50IHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkF0dHJpYnV0ZUNvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEF0dHJpYnV0ZUNvbnN0cmFpbnQgdGVzdHMgdGhhdCBhIHNwZWNpZmllZCBhdHRyaWJ1dGUgaXMgcHJlc2VudA0KKyAgICAgICAgICAgIG9uIGEgVHlwZSBvciBvdGhlciBwcm92aWRlciBhbmQgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQ0KKyAgICAgICAgICAgIHNhdGlzZmllcyBzb21lIG90aGVyIGNvbnN0cmFpbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByZWZpeENvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFic3RyYWN0IGJhc2UgY2xhc3MgdXNlZCBmb3IgcHJlZml4ZXMNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJlZml4Q29uc3RyYWludC5iYXNlQ29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIGJhc2UgY29uc3RyYWludA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5QcmVmaXhDb25zdHJhaW50LiNjdG9yKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JUmVzb2x2ZUNvbnN0cmFpbnQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgZ2l2ZW4gYSBiYXNlIGNvbnN0cmFpbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJlc29sdmFibGUiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQXR0cmlidXRlQ29uc3RyYWludC4jY3RvcihTeXN0ZW0uVHlwZSxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdHMgYW4gQXR0cmlidXRlQ29uc3RyYWludCBmb3IgYSBzcGVjaWZpZWQgYXR0cml1dGUNCisgICAgICAgICAgICBUeXBlIGFuZCBiYXNlIGNvbnN0cmFpbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJiYXNlQ29uc3RyYWludCI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BdHRyaWJ1dGVDb25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERldGVybWluZXMgd2hldGhlciB0aGUgVHlwZSBvciBvdGhlciBwcm92aWRlciBoYXMgdGhlIA0KKyAgICAgICAgICAgIGV4cGVjdGVkIGF0dHJpYnV0ZSBhbmQgaWYgaXRzIHZhbHVlIG1hdGNoZXMgdGhlDQorICAgICAgICAgICAgYWRkaXRpb25hbCBjb25zdHJhaW50IHNwZWNpZmllZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQXR0cmlidXRlQ29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYXR0cmlidXRlIHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BdHRyaWJ1dGVDb25zdHJhaW50LldyaXRlQWN0dWFsVmFsdWVUbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlcyB0aGUgYWN0dWFsIHZhbHVlIHN1cHBsaWVkIHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BdHRyaWJ1dGVDb25zdHJhaW50LkdldFN0cmluZ1JlcHJlc2VudGF0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb25zdHJhaW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5CYXNpY0NvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJhc2ljQ29uc3RyYWludCBpcyB0aGUgYWJzdHJhY3QgYmFzZSBmb3IgY29uc3RyYWludHMgdGhhdA0KKyAgICAgICAgICAgIHBlcmZvcm0gYSBzaW1wbGUgY29tcGFyaXNvbiB0byBhIGNvbnN0YW50IHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5CYXNpY0NvbnN0cmFpbnQuI2N0b3IoU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVDpCYXNpY0NvbnN0cmFpbnQiLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIj5UaGUgZGVzY3JpcHRpb24uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5CYXNpY0NvbnN0cmFpbnQuTWF0Y2hlcyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBjb25zdHJhaW50IGlzIHNhdGlzZmllZCBieSBhIGdpdmVuIHZhbHVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSB2YWx1ZSB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgZm9yIHN1Y2Nlc3MsIGZhbHNlIGZvciBmYWlsdXJlPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkJhc2ljQ29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSB0aGUgY29uc3RyYWludCBkZXNjcmlwdGlvbiB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIHdyaXRlciBvbiB3aGljaCB0aGUgZGVzY3JpcHRpb24gaXMgZGlzcGxheWVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdWxsQ29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTnVsbENvbnN0cmFpbnQgdGVzdHMgdGhhdCB0aGUgYWN0dWFsIHZhbHVlIGlzIG51bGwNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVsbENvbnN0cmFpbnQuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlQ6TnVsbENvbnN0cmFpbnQiLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRydWVDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUcnVlQ29uc3RyYWludCB0ZXN0cyB0aGF0IHRoZSBhY3R1YWwgdmFsdWUgaXMgdHJ1ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UcnVlQ29uc3RyYWludC4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVDpUcnVlQ29uc3RyYWludCIvPiBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRmFsc2VDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGYWxzZUNvbnN0cmFpbnQgdGVzdHMgdGhhdCB0aGUgYWN0dWFsIHZhbHVlIGlzIGZhbHNlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkZhbHNlQ29uc3RyYWludC4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVDpGYWxzZUNvbnN0cmFpbnQiLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5hTkNvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE5hTkNvbnN0cmFpbnQgdGVzdHMgdGhhdCB0aGUgYWN0dWFsIHZhbHVlIGlzIGEgZG91YmxlIG9yIGZsb2F0IE5hTg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OYU5Db25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3QgdGhhdCB0aGUgYWN0dWFsIHZhbHVlIGlzIGFuIE5hTg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OYU5Db25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBjb25zdHJhaW50IGRlc2NyaXB0aW9uIHRvIGEgc3BlY2lmaWVkIHdyaXRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkJpbmFyeUNvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJpbmFyeUNvbnN0cmFpbnQgaXMgdGhlIGFic3RyYWN0IGJhc2Ugb2YgYWxsIGNvbnN0cmFpbnRzDQorICAgICAgICAgICAgdGhhdCBjb21iaW5lIHR3byBvdGhlciBjb25zdHJhaW50cyBpbiBzb21lIGZhc2hpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkJpbmFyeUNvbnN0cmFpbnQubGVmdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIGZpcnN0IGNvbnN0cmFpbnQgYmVpbmcgY29tYmluZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQmluYXJ5Q29uc3RyYWludC5yaWdodCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHNlY29uZCBjb25zdHJhaW50IGJlaW5nIGNvbWJpbmVkDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkJpbmFyeUNvbnN0cmFpbnQuI2N0b3IoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQsTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSBCaW5hcnlDb25zdHJhaW50IGZyb20gdHdvIG90aGVyIGNvbnN0cmFpbnRzDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJsZWZ0Ij5UaGUgZmlyc3QgY29uc3RyYWludDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJpZ2h0Ij5UaGUgc2Vjb25kIGNvbnN0cmFpbnQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFuZENvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFuZENvbnN0cmFpbnQgc3VjY2VlZHMgb25seSBpZiBib3RoIG1lbWJlcnMgc3VjY2VlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQW5kQ29uc3RyYWludC4jY3RvcihOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZSBhbiBBbmRDb25zdHJhaW50IGZyb20gdHdvIG90aGVyIGNvbnN0cmFpbnRzDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJsZWZ0Ij5UaGUgZmlyc3QgY29uc3RyYWludDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJpZ2h0Ij5UaGUgc2Vjb25kIGNvbnN0cmFpbnQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFuZENvbnN0cmFpbnQuTWF0Y2hlcyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbHkgYm90aCBtZW1iZXIgY29uc3RyYWludHMgdG8gYW4gYWN0dWFsIHZhbHVlLCBzdWNjZWVkaW5nIA0KKyAgICAgICAgICAgIHN1Y2NlZWRpbmcgb25seSBpZiBib3RoIG9mIHRoZW0gc3VjY2VlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBpZiB0aGUgY29uc3RyYWludHMgYm90aCBzdWNjZWVkZWQ8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQW5kQ29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSBhIGRlc2NyaXB0aW9uIGZvciB0aGlzIGNvbnRyYWludCB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIE1lc3NhZ2VXcml0ZXIgdG8gcmVjZWl2ZSB0aGUgZGVzY3JpcHRpb248L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFuZENvbnN0cmFpbnQuV3JpdGVBY3R1YWxWYWx1ZVRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGFjdHVhbCB2YWx1ZSBmb3IgYSBmYWlsaW5nIGNvbnN0cmFpbnQgdGVzdCB0byBhDQorICAgICAgICAgICAgTWVzc2FnZVdyaXRlci4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IHdyaXRlcw0KKyAgICAgICAgICAgIHRoZSByYXcgdmFsdWUgb2YgYWN0dWFsLCBsZWF2aW5nIGl0IHRvIHRoZSB3cml0ZXIgdG8NCisgICAgICAgICAgICBwZXJmb3JtIGFueSBmb3JtYXR0aW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBhY3R1YWwgdmFsdWUgaXMgZGlzcGxheWVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5PckNvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE9yQ29uc3RyYWludCBzdWNjZWVkcyBpZiBlaXRoZXIgbWVtYmVyIHN1Y2NlZWRzDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk9yQ29uc3RyYWludC4jY3RvcihOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZSBhbiBPckNvbnN0cmFpbnQgZnJvbSB0d28gb3RoZXIgY29uc3RyYWludHMNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImxlZnQiPlRoZSBmaXJzdCBjb25zdHJhaW50PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icmlnaHQiPlRoZSBzZWNvbmQgY29uc3RyYWludDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuT3JDb25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IHRoZSBtZW1iZXIgY29uc3RyYWludHMgdG8gYW4gYWN0dWFsIHZhbHVlLCBzdWNjZWVkaW5nIA0KKyAgICAgICAgICAgIHN1Y2NlZWRpbmcgYXMgc29vbiBhcyBvbmUgb2YgdGhlbSBzdWNjZWVkcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBpZiBlaXRoZXIgY29uc3RyYWludCBzdWNjZWVkZWQ8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuT3JDb25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIGEgZGVzY3JpcHRpb24gZm9yIHRoaXMgY29udHJhaW50IHRvIGEgTWVzc2FnZVdyaXRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgTWVzc2FnZVdyaXRlciB0byByZWNlaXZlIHRoZSBkZXNjcmlwdGlvbjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkNvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbGxlY3Rpb25Db25zdHJhaW50IGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvcg0KKyAgICAgICAgICAgIGNvbnN0cmFpbnRzIHRoYXQgb3BlcmF0ZSBvbiBjb2xsZWN0aW9ucy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkNvbnN0cmFpbnQuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhbiBlbXB0eSBDb2xsZWN0aW9uQ29uc3RyYWludA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uQ29uc3RyYWludC4jY3RvcihTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgQ29sbGVjdGlvbkNvbnN0cmFpbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZyI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uQ29uc3RyYWludC5Jc0VtcHR5KFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGVudW1lcmFibGUgaXMgZW1wdHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbnVtZXJhYmxlIj5UaGUgZW51bWVyYWJsZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPg0KKyAgICAgICAgICAgIAk8Yz50cnVlPC9jPiBpZiB0aGUgc3BlY2lmaWVkIGVudW1lcmFibGUgaXMgZW1wdHk7IG90aGVyd2lzZSwgPGM+ZmFsc2U8L2M+Lg0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uQ29uc3RyYWludC5NYXRjaGVzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IHdoZXRoZXIgdGhlIGNvbnN0cmFpbnQgaXMgc2F0aXNmaWVkIGJ5IGEgZ2l2ZW4gdmFsdWUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHZhbHVlIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBmb3Igc3VjY2VzcywgZmFsc2UgZm9yIGZhaWx1cmU8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkNvbnN0cmFpbnQuZG9NYXRjaChTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm90ZWN0ZWQgbWV0aG9kIHRvIGJlIGltcGxlbWVudGVkIGJ5IGRlcml2ZWQgY2xhc3Nlcw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkl0ZW1zRXF1YWxDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb2xsZWN0aW9uSXRlbXNFcXVhbENvbnN0cmFpbnQgaXMgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbA0KKyAgICAgICAgICAgIGNvbGxlY3Rpb24gY29uc3RyYWludHMgdGhhdCBhcHBseSBzb21lIG5vdGlvbiBvZiBpdGVtIGVxdWFsaXR5DQorICAgICAgICAgICAgYXMgYSBwYXJ0IG9mIHRoZWlyIG9wZXJhdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkl0ZW1zRXF1YWxDb25zdHJhaW50LiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYW4gZW1wdHkgQ29sbGVjdGlvbkNvbnN0cmFpbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkl0ZW1zRXF1YWxDb25zdHJhaW50LiNjdG9yKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSBDb2xsZWN0aW9uQ29uc3RyYWludA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25JdGVtc0VxdWFsQ29uc3RyYWludC5Vc2luZyhTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRmxhZyB0aGUgY29uc3RyYWludCB0byB1c2UgdGhlIHN1cHBsaWVkIElDb21wYXJlciBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wYXJlciI+VGhlIElDb21wYXJlciBvYmplY3QgdG8gdXNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+U2VsZi48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkl0ZW1zRXF1YWxDb25zdHJhaW50LlVzaW5nYGAxKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklDb21wYXJlcntgYDB9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRmxhZyB0aGUgY29uc3RyYWludCB0byB1c2UgdGhlIHN1cHBsaWVkIElDb21wYXJlciBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wYXJlciI+VGhlIElDb21wYXJlciBvYmplY3QgdG8gdXNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+U2VsZi48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkl0ZW1zRXF1YWxDb25zdHJhaW50LlVzaW5nYGAxKFN5c3RlbS5Db21wYXJpc29ue2BgMH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGbGFnIHRoZSBjb25zdHJhaW50IHRvIHVzZSB0aGUgc3VwcGxpZWQgQ29tcGFyaXNvbiBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wYXJlciI+VGhlIElDb21wYXJlciBvYmplY3QgdG8gdXNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+U2VsZi48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkl0ZW1zRXF1YWxDb25zdHJhaW50LlVzaW5nKFN5c3RlbS5Db2xsZWN0aW9ucy5JRXF1YWxpdHlDb21wYXJlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZsYWcgdGhlIGNvbnN0cmFpbnQgdG8gdXNlIHRoZSBzdXBwbGllZCBJRXF1YWxpdHlDb21wYXJlciBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wYXJlciI+VGhlIElDb21wYXJlciBvYmplY3QgdG8gdXNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+U2VsZi48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkl0ZW1zRXF1YWxDb25zdHJhaW50LlVzaW5nYGAxKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklFcXVhbGl0eUNvbXBhcmVye2BgMH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGbGFnIHRoZSBjb25zdHJhaW50IHRvIHVzZSB0aGUgc3VwcGxpZWQgSUVxdWFsaXR5Q29tcGFyZXIgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29tcGFyZXIiPlRoZSBJQ29tcGFyZXIgb2JqZWN0IHRvIHVzZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlNlbGYuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25JdGVtc0VxdWFsQ29uc3RyYWludC5JdGVtc0VxdWFsKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbXBhcmVzIHR3byBjb2xsZWN0aW9uIG1lbWJlcnMgZm9yIGVxdWFsaXR5DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25JdGVtc0VxdWFsQ29uc3RyYWludC5UYWxseShTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm4gYSBuZXcgQ29sbGVjdGlvblRhbGx5IGZvciB1c2UgaW4gbWFraW5nIHRlc3RzDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjIj5UaGUgY29sbGVjdGlvbiB0byBiZSBpbmNsdWRlZCBpbiB0aGUgdGFsbHk8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25JdGVtc0VxdWFsQ29uc3RyYWludC5JZ25vcmVDYXNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGbGFnIHRoZSBjb25zdHJhaW50IHRvIGlnbm9yZSBjYXNlIGFuZCByZXR1cm4gc2VsZi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW1wdHlDb2xsZWN0aW9uQ29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRW1wdHlDb2xsZWN0aW9uQ29uc3RyYWludCB0ZXN0cyB3aGV0aGVyIGEgY29sbGVjdGlvbiBpcyBlbXB0eS4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVtcHR5Q29sbGVjdGlvbkNvbnN0cmFpbnQuZG9NYXRjaChTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDaGVjayB0aGF0IHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbXB0eUNvbGxlY3Rpb25Db25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBjb25zdHJhaW50IGRlc2NyaXB0aW9uIHRvIGEgTWVzc2FnZVdyaXRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlVuaXF1ZUl0ZW1zQ29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVW5pcXVlSXRlbXNDb25zdHJhaW50IHRlc3RzIHdoZXRoZXIgYWxsIHRoZSBpdGVtcyBpbiBhIA0KKyAgICAgICAgICAgIGNvbGxlY3Rpb24gYXJlIHVuaXF1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVW5pcXVlSXRlbXNDb25zdHJhaW50LmRvTWF0Y2goU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2hlY2sgdGhhdCBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVW5pcXVlSXRlbXNDb25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIGEgZGVzY3JpcHRpb24gb2YgdGhpcyBjb25zdHJhaW50IHRvIGEgTWVzc2FnZVdyaXRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25Db250YWluc0NvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbGxlY3Rpb25Db250YWluc0NvbnN0cmFpbnQgaXMgdXNlZCB0byB0ZXN0IHdoZXRoZXIgYSBjb2xsZWN0aW9uDQorICAgICAgICAgICAgY29udGFpbnMgYW4gZXhwZWN0ZWQgb2JqZWN0IGFzIGEgbWVtYmVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uQ29udGFpbnNDb25zdHJhaW50LiNjdG9yKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSBDb2xsZWN0aW9uQ29udGFpbnNDb25zdHJhaW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uQ29udGFpbnNDb25zdHJhaW50LmRvTWF0Y2goU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBleHBlY3RlZCBpdGVtIGlzIGNvbnRhaW5lZCBpbiB0aGUgY29sbGVjdGlvbg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uQ29udGFpbnNDb25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIGEgZGVzY3JpcHRvbiBvZiB0aGUgY29uc3RyYWludCB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uRXF1aXZhbGVudENvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbGxlY3Rpb25FcXVpdmFsZW50Q09uc3RyYWludCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHR3bw0KKyAgICAgICAgICAgIGNvbGxlY3Rpb25zIGFyZSBlcXVpdmFsZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uRXF1aXZhbGVudENvbnN0cmFpbnQuI2N0b3IoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgQ29sbGVjdGlvbkVxdWl2YWxlbnRDb25zdHJhaW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uRXF1aXZhbGVudENvbnN0cmFpbnQuZG9NYXRjaChTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IHdoZXRoZXIgdHdvIGNvbGxlY3Rpb25zIGFyZSBlcXVpdmFsZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25FcXVpdmFsZW50Q29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgY29uc3RyYWludCB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uU3Vic2V0Q29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29sbGVjdGlvblN1YnNldENvbnN0cmFpbnQgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlcg0KKyAgICAgICAgICAgIG9uZSBjb2xsZWN0aW9uIGlzIGEgc3Vic2V0IG9mIGFub3RoZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvblN1YnNldENvbnN0cmFpbnQuI2N0b3IoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgQ29sbGVjdGlvblN1YnNldENvbnN0cmFpbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgY29sbGVjdGlvbiB0aGF0IHRoZSBhY3R1YWwgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgYSBzdWJzZXQgb2Y8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25TdWJzZXRDb25zdHJhaW50LmRvTWF0Y2goU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBhY3R1YWwgY29sbGVjdGlvbiBpcyBhIHN1YnNldCBvZiANCisgICAgICAgICAgICB0aGUgZXhwZWN0ZWQgY29sbGVjdGlvbiBwcm92aWRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvblN1YnNldENvbnN0cmFpbnQuV3JpdGVEZXNjcmlwdGlvblRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgYSBkZXNjcmlwdGlvbiBvZiB0aGlzIGNvbnN0cmFpbnQgdG8gYSBNZXNzYWdlV3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbk9yZGVyZWRDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb2xsZWN0aW9uT3JkZXJlZENvbnN0cmFpbnQgaXMgdXNlZCB0byB0ZXN0IHdoZXRoZXIgYSBjb2xsZWN0aW9uIGlzIG9yZGVyZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25PcmRlcmVkQ29uc3RyYWludC4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgQ29sbGVjdGlvbk9yZGVyZWRDb25zdHJhaW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25PcmRlcmVkQ29uc3RyYWludC5Vc2luZyhTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTW9kaWZpZXMgdGhlIGNvbnN0cmFpbnQgdG8gdXNlIGFuIElDb21wYXJlciBhbmQgcmV0dXJucyBzZWxmLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uT3JkZXJlZENvbnN0cmFpbnQuVXNpbmdgYDEoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUNvbXBhcmVye2BgMH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNb2RpZmllcyB0aGUgY29uc3RyYWludCB0byB1c2UgYW4gSUNvbXBhcmVyJmx0O1QmZ3Q7IGFuZCByZXR1cm5zIHNlbGYuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25PcmRlcmVkQ29uc3RyYWludC5Vc2luZ2BgMShTeXN0ZW0uQ29tcGFyaXNvbntgYDB9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTW9kaWZpZXMgdGhlIGNvbnN0cmFpbnQgdG8gdXNlIGEgQ29tcGFyaXNvbiZsdDtUJmd0OyBhbmQgcmV0dXJucyBzZWxmLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uT3JkZXJlZENvbnN0cmFpbnQuQnkoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1vZGlmaWVzIHRoZSBjb25zdHJhaW50IHRvIHRlc3Qgb3JkZXJpbmcgYnkgdGhlIHZhbHVlIG9mDQorICAgICAgICAgICAgYSBzcGVjaWZpZWQgcHJvcGVydHkgYW5kIHJldHVybnMgc2VsZi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbk9yZGVyZWRDb25zdHJhaW50LmRvTWF0Y2goU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGlzIG9yZGVyZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbk9yZGVyZWRDb25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbnN0cmFpbnQgdG8gYSBNZXNzYWdlV3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbk9yZGVyZWRDb25zdHJhaW50LkdldFN0cmluZ1JlcHJlc2VudGF0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uT3JkZXJlZENvbnN0cmFpbnQuRGVzY2VuZGluZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgIElmIHVzZWQgcGVyZm9ybXMgYSByZXZlcnNlIGNvbXBhcmlzb24NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvblRhbGx5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb2xsZWN0aW9uVGFsbHkgY291bnRzICh0YWxsaWVzKSB0aGUgbnVtYmVyIG9mDQorICAgICAgICAgICAgb2NjdXJlbmNlcyBvZiBlYWNoIG9iamVjdCBpbiBvbmUgb3IgbW9yZSBlbnVtZXJhdGlvbnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25UYWxseS4jY3RvcihOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTlVuaXRFcXVhbGl0eUNvbXBhcmVyLFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIENvbGxlY3Rpb25UYWxseSBvYmplY3QgZnJvbSBhIGNvbXBhcmVyIGFuZCBhIGNvbGxlY3Rpb24NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvblRhbGx5LlRyeVJlbW92ZShTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVHJ5IHRvIHJlbW92ZSBhbiBvYmplY3QgZnJvbSB0aGUgdGFsbHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im8iPlRoZSBvYmplY3QgdG8gcmVtb3ZlPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIHRoZSBvYmplY3Qgd2FzIG5vdCBmb3VuZDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uVGFsbHkuVHJ5UmVtb3ZlKFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRyeSB0byByZW1vdmUgYSBzZXQgb2Ygb2JqZWN0cyBmcm9tIHRoZSB0YWxseQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYyI+VGhlIG9iamVjdHMgdG8gcmVtb3ZlPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIGFueSBvYmplY3Qgd2FzIG5vdCBmb3VuZDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uVGFsbHkuQ291bnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygb2JqZWN0cyByZW1haW5pbmcgaW4gdGhlIHRhbGx5DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmlzb25BZGFwdGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb21wYXJpc29uQWRhcHRlciBjbGFzcyBjZW50cmFsaXplcyBhbGwgY29tcGFyaXNvbnMgb2YNCisgICAgICAgICAgICB2YWx1ZXMgaW4gTlVuaXQsIGFkYXB0aW5nIHRvIHRoZSB1c2Ugb2YgYW55IHByb3ZpZGVkDQorICAgICAgICAgICAgSUNvbXBhcmVyLCBJQ29tcGFyZXImbHQ7VCZndDsgb3IgQ29tcGFyaXNvbiZsdDtUJmd0Ow0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJpc29uQWRhcHRlci5Gb3IoU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBDb21wYXJpc29uQWRhcHRlciB0aGF0IHdyYXBzIGFuIElDb21wYXJlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJpc29uQWRhcHRlci5Gb3JgYDEoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUNvbXBhcmVye2BgMH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgQ29tcGFyaXNvbkFkYXB0ZXIgdGhhdCB3cmFwcyBhbiBJQ29tcGFyZXImbHQ7VCZndDsNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyaXNvbkFkYXB0ZXIuRm9yYGAxKFN5c3RlbS5Db21wYXJpc29ue2BgMH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgQ29tcGFyaXNvbkFkYXB0ZXIgdGhhdCB3cmFwcyBhIENvbXBhcmlzb24mbHQ7VCZndDsNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyaXNvbkFkYXB0ZXIuQ29tcGFyZShTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb21wYXJlcyB0d28gb2JqZWN0cw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJpc29uQWRhcHRlci5EZWZhdWx0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBkZWZhdWx0IENvbXBhcmlzb25BZGFwdGVyLCB3aGljaCB3cmFwcyBhbg0KKyAgICAgICAgICAgIE5Vbml0Q29tcGFyZXIgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJpc29uQWRhcHRlci5Db21wYXJlckFkYXB0ZXIuI2N0b3IoU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIENvbXBhcmlzb25BZGFwdGVyIGZvciBhbiBJQ29tcGFyZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyaXNvbkFkYXB0ZXIuQ29tcGFyZXJBZGFwdGVyLkNvbXBhcmUoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29tcGFyZXMgdHdvIG9iamVjdHMNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmlzb25BZGFwdGVyLkRlZmF1bHRDb21wYXJpc29uQWRhcHRlci4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgZGVmYXVsdCBDb21wYXJpc29uQWRhcHRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJpc29uQWRhcHRlci5Db21wYXJlckFkYXB0ZXJgMSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29tcGFyaXNvbkFkYXB0ZXImbHQ7VCZndDsgZXh0ZW5kcyBDb21wYXJpc29uQWRhcHRlciBhbmQNCisgICAgICAgICAgICBhbGxvd3MgdXNlIG9mIGFuIElDb21wYXJlciZsdDtUJmd0OyBvciBDb21wYXJpc29uJmx0O1QmZ3Q7DQorICAgICAgICAgICAgdG8gYWN0dWFsbHkgcGVyZm9ybSB0aGUgY29tcGFyaXNvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyaXNvbkFkYXB0ZXIuQ29tcGFyZXJBZGFwdGVyYDEuI2N0b3IoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUNvbXBhcmVye2AwfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIENvbXBhcmlzb25BZGFwdGVyIGZvciBhbiBJQ29tcGFyZXImbHQ7VCZndDsNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyaXNvbkFkYXB0ZXIuQ29tcGFyZXJBZGFwdGVyYDEuQ29tcGFyZShTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb21wYXJlIGEgVHlwZSBUIHRvIGFuIG9iamVjdA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJpc29uQWRhcHRlci5Db21wYXJpc29uQWRhcHRlckZvckNvbXBhcmlzb25gMS4jY3RvcihTeXN0ZW0uQ29tcGFyaXNvbntgMH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSBDb21wYXJpc29uQWRhcHRlciBmb3IgYSBDb21wYXJpc29uJmx0O1QmZ3Q7DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmlzb25BZGFwdGVyLkNvbXBhcmlzb25BZGFwdGVyRm9yQ29tcGFyaXNvbmAxLkNvbXBhcmUoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29tcGFyZSBhIFR5cGUgVCB0byBhbiBvYmplY3QNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyaXNvbkNvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNvbnN0cmFpbnRzIHRoYXQgY29tcGFyZSB2YWx1ZXMgdG8NCisgICAgICAgICAgICBkZXRlcm1pbmUgaWYgb25lIGlzIGdyZWF0ZXIgdGhhbiwgZXF1YWwgdG8gb3IgbGVzcyB0aGFuDQorICAgICAgICAgICAgdGhlIG90aGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJpc29uQ29uc3RyYWludC5leHBlY3RlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHZhbHVlIGFnYWluc3Qgd2hpY2ggYSBjb21wYXJpc29uIGlzIHRvIGJlIG1hZGUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyaXNvbkNvbnN0cmFpbnQubHRPSyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWYgdHJ1ZSwgbGVzcyB0aGFuIHJldHVybnMgc3VjY2Vzcw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJpc29uQ29uc3RyYWludC5lcU9LIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBpZiB0cnVlLCBlcXVhbCByZXR1cm5zIHN1Y2Nlc3MNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyaXNvbkNvbnN0cmFpbnQuZ3RPSyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgaWYgdHJ1ZSwgZ3JlYXRlciB0aGFuIHJldHVybnMgc3VjY2Vzcw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJpc29uQ29uc3RyYWludC5wcmVkaWNhdGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBwcmVkaWNhdGUgdXNlZCBhcyBhIHBhcnQgb2YgdGhlIGRlc2NyaXB0aW9uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmlzb25Db25zdHJhaW50LmNvbXBhcmVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb21wYXJpc29uQWRhcHRlciB0byBiZSB1c2VkIGluIG1ha2luZyB0aGUgY29tcGFyaXNvbg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJpc29uQ29uc3RyYWludC4jY3RvcihTeXN0ZW0uT2JqZWN0LFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUOkNvbXBhcmlzb25Db25zdHJhaW50Ii8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZSBhZ2FpbnN0IHdoaWNoIHRvIG1ha2UgYSBjb21wYXJpc29uLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imx0T0siPmlmIHNldCB0byA8Yz50cnVlPC9jPiBsZXNzIHN1Y2NlZWRzLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImVxT0siPmlmIHNldCB0byA8Yz50cnVlPC9jPiBlcXVhbCBzdWNjZWVkcy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJndE9LIj5pZiBzZXQgdG8gPGM+dHJ1ZTwvYz4gZ3JlYXRlciBzdWNjZWVkcy48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwcmVkaWNhdGUiPlN0cmluZyB1c2VkIGluIGRlc2NyaWJpbmcgdGhlIGNvbnN0cmFpbnQuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJpc29uQ29uc3RyYWludC5NYXRjaGVzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IHdoZXRoZXIgdGhlIGNvbnN0cmFpbnQgaXMgc2F0aXNmaWVkIGJ5IGEgZ2l2ZW4gdmFsdWUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHZhbHVlIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBmb3Igc3VjY2VzcywgZmFsc2UgZm9yIGZhaWx1cmU8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyaXNvbkNvbnN0cmFpbnQuV3JpdGVEZXNjcmlwdGlvblRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGNvbnN0cmFpbnQgZGVzY3JpcHRpb24gdG8gYSBNZXNzYWdlV3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPlRoZSB3cml0ZXIgb24gd2hpY2ggdGhlIGRlc2NyaXB0aW9uIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyaXNvbkNvbnN0cmFpbnQuVXNpbmcoU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1vZGlmaWVzIHRoZSBjb25zdHJhaW50IHRvIHVzZSBhbiBJQ29tcGFyZXIgYW5kIHJldHVybnMgc2VsZg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJpc29uQ29uc3RyYWludC5Vc2luZ2BgMShTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JQ29tcGFyZXJ7YGAwfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1vZGlmaWVzIHRoZSBjb25zdHJhaW50IHRvIHVzZSBhbiBJQ29tcGFyZXImbHQ7VCZndDsgYW5kIHJldHVybnMgc2VsZg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJpc29uQ29uc3RyYWludC5Vc2luZ2BgMShTeXN0ZW0uQ29tcGFyaXNvbntgYDB9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTW9kaWZpZXMgdGhlIGNvbnN0cmFpbnQgdG8gdXNlIGEgQ29tcGFyaXNvbiZsdDtUJmd0OyBhbmQgcmV0dXJucyBzZWxmDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuQ29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgc3VwcGxpZWQgdG8gaXRzIGNvbnN0cnVjdG9yDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuQ29uc3RyYWludC4jY3RvcihTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVDpHcmVhdGVyVGhhbkNvbnN0cmFpbnQiLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuR3JlYXRlclRoYW5PckVxdWFsQ29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgdmFsdWUgc3VwcGxpZWQgdG8gaXRzIGNvbnN0cnVjdG9yDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuT3JFcXVhbENvbnN0cmFpbnQuI2N0b3IoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlQ6R3JlYXRlclRoYW5PckVxdWFsQ29uc3RyYWludCIvPiBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5MZXNzVGhhbkNvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgYSB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHZhbHVlIHN1cHBsaWVkIHRvIGl0cyBjb25zdHJ1Y3Rvcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5MZXNzVGhhbkNvbnN0cmFpbnQuI2N0b3IoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlQ6TGVzc1RoYW5Db25zdHJhaW50Ii8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkxlc3NUaGFuT3JFcXVhbENvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHdoZXRoZXIgYSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHZhbHVlIHN1cHBsaWVkIHRvIGl0cyBjb25zdHJ1Y3Rvcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5MZXNzVGhhbk9yRXF1YWxDb25zdHJhaW50LiNjdG9yKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUOkxlc3NUaGFuT3JFcXVhbENvbnN0cmFpbnQiLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWN0dWFsVmFsdWVEZWxlZ2F0ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGVsZWdhdGUgdXNlZCB0byBkZWxheSBldmFsdWF0aW9uIG9mIHRoZSBhY3R1YWwgdmFsdWUNCisgICAgICAgICAgICB0byBiZSB1c2VkIGluIGV2YWx1YXRpbmcgYSBjb25zdHJhaW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRCdWlsZGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJhaW50QnVpbGRlciBtYWludGFpbnMgdGhlIHN0YWNrcyB0aGF0IGFyZSB1c2VkIGluDQorICAgICAgICAgICAgcHJvY2Vzc2luZyBhIENvbnN0cmFpbnRFeHByZXNzaW9uLiBBbiBPcGVyYXRvclN0YWNrDQorICAgICAgICAgICAgaXMgdXNlZCB0byBob2xkIG9wZXJhdG9ycyB0aGF0IGFyZSB3YWl0aW5nIGZvciB0aGVpcg0KKyAgICAgICAgICAgIG9wZXJhbmRzIHRvIGJlIHJlb2duaXplZC4gYSBDb25zdHJhaW50U3RhY2sgaG9sZHMgDQorICAgICAgICAgICAgaW5wdXQgY29uc3RyYWludHMgYXMgd2VsbCBhcyB0aGUgcmVzdWx0cyBvZiBlYWNoDQorICAgICAgICAgICAgb3BlcmF0b3IgYXBwbGllZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEJ1aWxkZXIuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlQ6Q29uc3RyYWludEJ1aWxkZXIiLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRCdWlsZGVyLkFwcGVuZChOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludE9wZXJhdG9yKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwZW5kcyB0aGUgc3BlY2lmaWVkIG9wZXJhdG9yIHRvIHRoZSBleHByZXNzaW9uIGJ5IGZpcnN0DQorICAgICAgICAgICAgcmVkdWNpbmcgdGhlIG9wZXJhdG9yIHN0YWNrIGFuZCB0aGVuIHB1c2hpbmcgdGhlIG5ldw0KKyAgICAgICAgICAgIG9wZXJhdG9yIG9uIHRoZSBzdGFjay4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im9wIj5UaGUgb3BlcmF0b3IgdG8gcHVzaC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRCdWlsZGVyLkFwcGVuZChOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGVuZHMgdGhlIHNwZWNpZmllZCBjb25zdHJhaW50IHRvIHRoZSBleHByZXNzb24gYnkgcHVzaGluZw0KKyAgICAgICAgICAgIGl0IG9uIHRoZSBjb25zdHJhaW50IHN0YWNrLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29uc3RyYWludCI+VGhlIGNvbnN0cmFpbnQgdG8gcHVzaC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRCdWlsZGVyLlNldFRvcE9wZXJhdG9yUmlnaHRDb250ZXh0KFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTZXRzIHRoZSB0b3Agb3BlcmF0b3IgcmlnaHQgY29udGV4dC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJpZ2h0Q29udGV4dCI+VGhlIHJpZ2h0IGNvbnRleHQuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50QnVpbGRlci5SZWR1Y2VPcGVyYXRvclN0YWNrKFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlZHVjZXMgdGhlIG9wZXJhdG9yIHN0YWNrIHVudGlsIHRoZSB0b3Btb3N0IGl0ZW0NCisgICAgICAgICAgICBwcmVjZWRlbmNlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgdGFyZ2V0IHByZWNlZGVuY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YXJnZXRQcmVjZWRlbmNlIj5UaGUgdGFyZ2V0IHByZWNlZGVuY2UuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50QnVpbGRlci5SZXNvbHZlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXNvbHZlcyB0aGlzIGluc3RhbmNlLCByZXR1cm5pbmcgYSBDb25zdHJhaW50LiBJZiB0aGUgYnVpbGRlcg0KKyAgICAgICAgICAgIGlzIG5vdCBjdXJyZW50bHkgaW4gYSByZXNvbHZhYmxlIHN0YXRlLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgcmVzb2x2ZWQgY29uc3RyYWludDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50QnVpbGRlci5Jc1Jlc29sdmFibGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBpbnN0YW5jZSBpcyByZXNvbHZhYmxlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+DQorICAgICAgICAgICAgCTxjPnRydWU8L2M+IGlmIHRoaXMgaW5zdGFuY2UgaXMgcmVzb2x2YWJsZTsgb3RoZXJ3aXNlLCA8Yz5mYWxzZTwvYz4uDQorICAgICAgICAgICAgPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50QnVpbGRlci5PcGVyYXRvclN0YWNrIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBPcGVyYXRvclN0YWNrIGlzIGEgdHlwZS1zYWZlIHN0YWNrIGZvciBob2xkaW5nIENvbnN0cmFpbnRPcGVyYXRvcnMNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEJ1aWxkZXIuT3BlcmF0b3JTdGFjay4jY3RvcihOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEJ1aWxkZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUOk9wZXJhdG9yU3RhY2siLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJidWlsZGVyIj5UaGUgYnVpbGRlci48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRCdWlsZGVyLk9wZXJhdG9yU3RhY2suUHVzaChOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludE9wZXJhdG9yKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHVzaGVzIHRoZSBzcGVjaWZpZWQgb3BlcmF0b3Igb250byB0aGUgc3RhY2suDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJvcCI+VGhlIG9wLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEJ1aWxkZXIuT3BlcmF0b3JTdGFjay5Qb3AiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFBvcHMgdGhlIHRvcG1vc3Qgb3BlcmF0b3IgZnJvbSB0aGUgc3RhY2suDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50QnVpbGRlci5PcGVyYXRvclN0YWNrLkVtcHR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgPHNlZSBjcmVmPSJUOk9wU3RhY2siLz4gaXMgZW1wdHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT48Yz50cnVlPC9jPiBpZiBlbXB0eTsgb3RoZXJ3aXNlLCA8Yz5mYWxzZTwvYz4uPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50QnVpbGRlci5PcGVyYXRvclN0YWNrLlRvcCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgdG9wbW9zdCBvcGVyYXRvciB3aXRob3V0IG1vZGlmeWluZyB0aGUgc3RhY2suDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT5UaGUgdG9wLjwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEJ1aWxkZXIuQ29uc3RyYWludFN0YWNrIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJhaW50U3RhY2sgaXMgYSB0eXBlLXNhZmUgc3RhY2sgZm9yIGhvbGRpbmcgQ29uc3RyYWludHMNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEJ1aWxkZXIuQ29uc3RyYWludFN0YWNrLiNjdG9yKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50QnVpbGRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlQ6Q29uc3RyYWludFN0YWNrIi8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYnVpbGRlciI+VGhlIGJ1aWxkZXIuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50QnVpbGRlci5Db25zdHJhaW50U3RhY2suUHVzaChOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGNvbnN0cmFpbnQuIEFzIGEgc2lkZSBlZmZlY3QsDQorICAgICAgICAgICAgdGhlIGNvbnN0cmFpbnQncyBidWlsZGVyIGZpZWxkIGlzIHNldCB0byB0aGUgDQorICAgICAgICAgICAgQ29uc3RyYWludEJ1aWxkZXIgb3duaW5nIHRoaXMgc3RhY2suDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25zdHJhaW50Ij5UaGUgY29uc3RyYWludC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRCdWlsZGVyLkNvbnN0cmFpbnRTdGFjay5Qb3AiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFBvcHMgdGhpcyB0b3Btb3N0IGNvbnN0cmFpdCBmcm9tIHRoZSBzdGFjay4NCisgICAgICAgICAgICBBcyBhIHNpZGUgZWZmZWN0LCB0aGUgY29uc3RyYWludCdzIGJ1aWxkZXINCisgICAgICAgICAgICBmaWVsZCBpcyBzZXQgdG8gbnVsbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRCdWlsZGVyLkNvbnN0cmFpbnRTdGFjay5FbXB0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGlzIDxzZWUgY3JlZj0iVDpDb25zdHJhaW50U3RhY2siLz4gaXMgZW1wdHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx2YWx1ZT48Yz50cnVlPC9jPiBpZiBlbXB0eTsgb3RoZXJ3aXNlLCA8Yz5mYWxzZTwvYz4uPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50QnVpbGRlci5Db25zdHJhaW50U3RhY2suVG9wIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSB0b3Btb3N0IGNvbnN0cmFpbnQgd2l0aG91dCBtb2RpZnlpbmcgdGhlIHN0YWNrLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+VGhlIHRvcG1vc3QgY29uc3RyYWludDwvdmFsdWU+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cmFpbnRFeHByZXNzaW9uIHJlcHJlc2VudHMgYSBjb21wb3VuZCBjb25zdHJhaW50IGluIHRoZSANCisgICAgICAgICAgICBwcm9jZXNzIG9mIGJlaW5nIGNvbnN0cnVjdGVkIGZyb20gYSBzZXJpZXMgb2Ygc3ludGFjdGljIGVsZW1lbnRzLg0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIEluZGl2aWR1YWwgZWxlbWVudHMgYXJlIGFwcGVuZGVkIHRvIHRoZSBleHByZXNzaW9uIGFzIHRoZXkgYXJlDQorICAgICAgICAgICAgcmVvZ25pemVkLiBPbmNlIGFuIGFjdHVhbCBDb25zdHJhaW50IGlzIGFwcGVuZGVkLCB0aGUgZXhwcmVzc2lvbg0KKyAgICAgICAgICAgIHJldHVybnMgYSByZXNvbHZhYmxlIENvbnN0cmFpbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uQmFzZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RyYWludEV4cHJlc3Npb25CYXNlIGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aGUgDQorICAgICAgICAgICAgZ2VuZXJhdGVkIENvbnN0cmFpbnRFeHByZXNzaW9uIGNsYXNzLCB3aGljaCByZXByZXNlbnRzIGEgDQorICAgICAgICAgICAgY29tcG91bmQgY29uc3RyYWludCBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBjb25zdHJ1Y3RlZCANCisgICAgICAgICAgICBmcm9tIGEgc2VyaWVzIG9mIHN5bnRhY3RpYyBlbGVtZW50cy4NCisgICAgICAgICAgICANCisgICAgICAgICAgICBOT1RFOiBDb25zdHJhaW50RXhwcmVzc2lvbkJhc2UgaXMgYXdhcmUgb2Ygc29tZSBvZiBpdHMNCisgICAgICAgICAgICBkZXJpdmVkIGNsYXNzZXMsIHdoaWNoIGlzIGFuIGFwcGFyZW50IHZpb2xhdGlvbiBvZiANCisgICAgICAgICAgICBlbmNhcHN1bGF0aW9uLiBJZGVhbGx5LCB0aGVzZSBjbGFzc2VzIHdvdWxkIGJlIGEgDQorICAgICAgICAgICAgc2luZ2xlIGNsYXNzLCBidXQgdGhleSBtdXN0IGJlIHNlcGFyYXRlZCBpbiBvcmRlciB0bw0KKyAgICAgICAgICAgIGFsbG93IHBhcnRzIHRvIGJlIGdlbmVyYXRlZCB1bmRlciAuTkVUIDEueCBhbmQgdG8NCisgICAgICAgICAgICBwcm92aWRlIHByb3BlciB1c2VyIGZlZWRiYWNrIGluIHN5bnRhY3RpY2FsbHkgDQorICAgICAgICAgICAgYXdhcmUgSURFcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb25CYXNlLmJ1aWxkZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBDb25zdHJhaW50QnVpbGRlciBob2xkaW5nIHRoZSBlbGVtZW50cyByZWNvZ25pemVkIHNvIGZhcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbkJhc2UuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlQ6Q29uc3RyYWludEV4cHJlc3Npb25CYXNlIi8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbkJhc2UuI2N0b3IoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRCdWlsZGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVDpDb25zdHJhaW50RXhwcmVzc2lvbkJhc2UiLz4gDQorICAgICAgICAgICAgY2xhc3MgcGFzc2luZyBpbiBhIENvbnN0cmFpbnRCdWlsZGVyLCB3aGljaCBtYXkgYmUgcHJlLXBvcHVsYXRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImJ1aWxkZXIiPlRoZSBidWlsZGVyLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb25CYXNlLlRvU3RyaW5nIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBleHByZXNzaW9uIGFzIGl0DQorICAgICAgICAgICAgY3VycmVudGx5IHN0YW5kcy4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0aW5nLA0KKyAgICAgICAgICAgIHNpbmNlIGl0IGhhcyB0aGUgc2lkZS1lZmZlY3Qgb2YgcmVzb2x2aW5nIHRoZSBleHByZXNzaW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb25CYXNlLkFwcGVuZChOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludE9wZXJhdG9yKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwZW5kcyBhbiBvcGVyYXRvciB0byB0aGUgZXhwcmVzc2lvbiBhbmQgcmV0dXJucyB0aGUNCisgICAgICAgICAgICByZXN1bHRpbmcgZXhwcmVzc2lvbiBpdHNlbGYuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uQmFzZS5BcHBlbmQoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNlbGZSZXNvbHZpbmdPcGVyYXRvcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGVuZHMgYSBzZWxmLXJlc29sdmluZyBvcGVyYXRvciB0byB0aGUgZXhwcmVzc2lvbiBhbmQNCisgICAgICAgICAgICByZXR1cm5zIGEgbmV3IFJlc29sdmFibGVDb25zdHJhaW50RXhwcmVzc2lvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb25CYXNlLkFwcGVuZChOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGVuZHMgYSBjb25zdHJhaW50IHRvIHRoZSBleHByZXNzaW9uIGFuZCByZXR1cm5zIHRoYXQNCisgICAgICAgICAgICBjb25zdHJhaW50LCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgc3RhdGUNCisgICAgICAgICAgICBvZiB0aGUgZXhwcmVzc2lvbiBiZWluZyBidWlsdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlQ6Q29uc3RyYWludEV4cHJlc3Npb24iLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLiNjdG9yKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50QnVpbGRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlQ6Q29uc3RyYWludEV4cHJlc3Npb24iLz4gDQorICAgICAgICAgICAgY2xhc3MgcGFzc2luZyBpbiBhIENvbnN0cmFpbnRCdWlsZGVyLCB3aGljaCBtYXkgYmUgcHJlLXBvcHVsYXRlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImJ1aWxkZXIiPlRoZSBidWlsZGVyLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uUHJvcGVydHkoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBuZXcgUHJvcGVydHlDb25zdHJhaW50RXhwcmVzc2lvbiwgd2hpY2ggd2lsbCBlaXRoZXINCisgICAgICAgICAgICB0ZXN0IGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSBuYW1lZCBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0DQorICAgICAgICAgICAgYmVpbmcgdGVzdGVkIG9yIGFwcGx5IGFueSBmb2xsb3dpbmcgY29uc3RyYWludCB0byB0aGF0IHByb3BlcnR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5BdHRyaWJ1dGUoU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IEF0dHJpYnV0ZUNvbnN0cmFpbnQgY2hlY2tpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIHByZXNlbmNlIG9mIGEgcGFydGljdWxhciBhdHRyaWJ1dGUgb24gYW4gb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5BdHRyaWJ1dGVgYDEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBuZXcgQXR0cmlidXRlQ29uc3RyYWludCBjaGVja2luZyBmb3IgdGhlDQorICAgICAgICAgICAgcHJlc2VuY2Ugb2YgYSBwYXJ0aWN1bGFyIGF0dHJpYnV0ZSBvbiBhbiBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLk1hdGNoZXMoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIHRoZSBjb25zdHJhaW50IHByb3ZpZGVkIGFzIGFuIGFyZ3VtZW50IC0gdXNlZCB0byBhbGxvdyBjdXN0b20NCisgICAgICAgICAgICBjdXN0b20gY29uc3RyYWludHMgdG8gZWFzaWx5IHBhcnRpY2lwYXRlIGluIHRoZSBzeW50YXguDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLk1hdGNoZXNgYDEoU3lzdGVtLlByZWRpY2F0ZXtgYDB9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyB0aGUgY29uc3RyYWludCBwcm92aWRlZCBhcyBhbiBhcmd1bWVudCAtIHVzZWQgdG8gYWxsb3cgY3VzdG9tDQorICAgICAgICAgICAgY3VzdG9tIGNvbnN0cmFpbnRzIHRvIGVhc2lseSBwYXJ0aWNpcGF0ZSBpbiB0aGUgc3ludGF4Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5FcXVhbFRvKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHR3byBpdGVtcyBmb3IgZXF1YWxpdHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uU2FtZUFzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHRoYXQgdHdvIHJlZmVyZW5jZXMgYXJlIHRoZSBzYW1lIG9iamVjdA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5HcmVhdGVyVGhhbihTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZQ0KKyAgICAgICAgICAgIGFjdHVhbCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHN1cHBsZWQgYXJndW1lbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uR3JlYXRlclRoYW5PckVxdWFsVG8oU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUNCisgICAgICAgICAgICBhY3R1YWwgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzdXBwbGVkIGFyZ3VtZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLkF0TGVhc3QoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUNCisgICAgICAgICAgICBhY3R1YWwgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzdXBwbGVkIGFyZ3VtZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLkxlc3NUaGFuKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlDQorICAgICAgICAgICAgYWN0dWFsIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc3VwcGxlZCBhcmd1bWVudA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5MZXNzVGhhbk9yRXF1YWxUbyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZQ0KKyAgICAgICAgICAgIGFjdHVhbCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHN1cHBsZWQgYXJndW1lbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uQXRNb3N0KFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlDQorICAgICAgICAgICAgYWN0dWFsIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3VwcGxlZCBhcmd1bWVudA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5UeXBlT2YoU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIGFjdHVhbA0KKyAgICAgICAgICAgIHZhbHVlIGlzIG9mIHRoZSBleGFjdCB0eXBlIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5UeXBlT2ZgYDEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsDQorICAgICAgICAgICAgdmFsdWUgaXMgb2YgdGhlIGV4YWN0IHR5cGUgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLkluc3RhbmNlT2YoU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIGFjdHVhbCB2YWx1ZQ0KKyAgICAgICAgICAgIGlzIG9mIHRoZSB0eXBlIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50IG9yIGEgZGVyaXZlZCB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5JbnN0YW5jZU9mYGAxIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIGFjdHVhbCB2YWx1ZQ0KKyAgICAgICAgICAgIGlzIG9mIHRoZSB0eXBlIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50IG9yIGEgZGVyaXZlZCB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5JbnN0YW5jZU9mVHlwZShTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsIHZhbHVlDQorICAgICAgICAgICAgaXMgb2YgdGhlIHR5cGUgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQgb3IgYSBkZXJpdmVkIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLkluc3RhbmNlT2ZUeXBlYGAxIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIGFjdHVhbCB2YWx1ZQ0KKyAgICAgICAgICAgIGlzIG9mIHRoZSB0eXBlIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50IG9yIGEgZGVyaXZlZCB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5Bc3NpZ25hYmxlRnJvbShTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsIHZhbHVlDQorICAgICAgICAgICAgaXMgYXNzaWduYWJsZSBmcm9tIHRoZSB0eXBlIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5Bc3NpZ25hYmxlRnJvbWBgMSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBhY3R1YWwgdmFsdWUNCisgICAgICAgICAgICBpcyBhc3NpZ25hYmxlIGZyb20gdGhlIHR5cGUgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLkFzc2lnbmFibGVUbyhTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsIHZhbHVlDQorICAgICAgICAgICAgaXMgYXNzaWduYWJsZSBmcm9tIHRoZSB0eXBlIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5Bc3NpZ25hYmxlVG9gYDEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsIHZhbHVlDQorICAgICAgICAgICAgaXMgYXNzaWduYWJsZSBmcm9tIHRoZSB0eXBlIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5FcXVpdmFsZW50VG8oU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBhY3R1YWwgdmFsdWUNCisgICAgICAgICAgICBpcyBhIGNvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgc2FtZSBlbGVtZW50cyBhcyB0aGUgDQorICAgICAgICAgICAgY29sbGVjdGlvbiBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uU3Vic2V0T2YoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBhY3R1YWwgdmFsdWUNCisgICAgICAgICAgICBpcyBhIHN1YnNldCBvZiB0aGUgY29sbGVjdGlvbiBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uTWVtYmVyKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IENvbGxlY3Rpb25Db250YWluc0NvbnN0cmFpbnQgY2hlY2tpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIHByZXNlbmNlIG9mIGEgcGFydGljdWxhciBvYmplY3QgaW4gdGhlIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLkNvbnRhaW5zKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IENvbGxlY3Rpb25Db250YWluc0NvbnN0cmFpbnQgY2hlY2tpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIHByZXNlbmNlIG9mIGEgcGFydGljdWxhciBvYmplY3QgaW4gdGhlIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLkNvbnRhaW5zKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IENvbnRhaW5zQ29uc3RyYWludC4gVGhpcyBjb25zdHJhaW50DQorICAgICAgICAgICAgd2lsbCwgaW4gdHVybiwgbWFrZSB1c2Ugb2YgdGhlIGFwcHJvcHJpYXRlIHNlY29uZC1sZXZlbA0KKyAgICAgICAgICAgIGNvbnN0cmFpbnQsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUgYWN0dWFsIGFyZ3VtZW50LiANCisgICAgICAgICAgICBUaGlzIG92ZXJsb2FkIGlzIG9ubHkgdXNlZCBpZiB0aGUgaXRlbSBzb3VnaHQgaXMgYSBzdHJpbmcsDQorICAgICAgICAgICAgc2luY2UgYW55IG90aGVyIHR5cGUgaW1wbGllcyB0aGF0IHdlIGFyZSBsb29raW5nIGZvciBhIA0KKyAgICAgICAgICAgIGNvbGxlY3Rpb24gbWVtYmVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5TdHJpbmdDb250YWluaW5nKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHN1Y2NlZWRzIGlmIHRoZSBhY3R1YWwNCisgICAgICAgICAgICB2YWx1ZSBjb250YWlucyB0aGUgc3Vic3RyaW5nIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5Db250YWluc1N1YnN0cmluZyhTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCBzdWNjZWVkcyBpZiB0aGUgYWN0dWFsDQorICAgICAgICAgICAgdmFsdWUgY29udGFpbnMgdGhlIHN1YnN0cmluZyBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uU3RhcnRzV2l0aChTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCBzdWNjZWVkcyBpZiB0aGUgYWN0dWFsDQorICAgICAgICAgICAgdmFsdWUgc3RhcnRzIHdpdGggdGhlIHN1YnN0cmluZyBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uU3RyaW5nU3RhcnRpbmcoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgc3VjY2VlZHMgaWYgdGhlIGFjdHVhbA0KKyAgICAgICAgICAgIHZhbHVlIHN0YXJ0cyB3aXRoIHRoZSBzdWJzdHJpbmcgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLkVuZHNXaXRoKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHN1Y2NlZWRzIGlmIHRoZSBhY3R1YWwNCisgICAgICAgICAgICB2YWx1ZSBlbmRzIHdpdGggdGhlIHN1YnN0cmluZyBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uU3RyaW5nRW5kaW5nKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHN1Y2NlZWRzIGlmIHRoZSBhY3R1YWwNCisgICAgICAgICAgICB2YWx1ZSBlbmRzIHdpdGggdGhlIHN1YnN0cmluZyBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uTWF0Y2hlcyhTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCBzdWNjZWVkcyBpZiB0aGUgYWN0dWFsDQorICAgICAgICAgICAgdmFsdWUgbWF0Y2hlcyB0aGUgUmVnZXggcGF0dGVybiBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uU3RyaW5nTWF0Y2hpbmcoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgc3VjY2VlZHMgaWYgdGhlIGFjdHVhbA0KKyAgICAgICAgICAgIHZhbHVlIG1hdGNoZXMgdGhlIFJlZ2V4IHBhdHRlcm4gc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLlNhbWVQYXRoKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIHBhdGggcHJvdmlkZWQgDQorICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgYW4gZXhwZWN0ZWQgcGF0aCBhZnRlciBjYW5vbmljYWxpemF0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5TdWJQYXRoKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIHBhdGggcHJvdmlkZWQgDQorICAgICAgICAgICAgaXMgdGhlIHNhbWUgcGF0aCBvciB1bmRlciBhbiBleHBlY3RlZCBwYXRoIGFmdGVyIGNhbm9uaWNhbGl6YXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLlNhbWVQYXRoT3JVbmRlcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBwYXRoIHByb3ZpZGVkIA0KKyAgICAgICAgICAgIGlzIHRoZSBzYW1lIHBhdGggb3IgdW5kZXIgYW4gZXhwZWN0ZWQgcGF0aCBhZnRlciBjYW5vbmljYWxpemF0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5JblJhbmdlKFN5c3RlbS5JQ29tcGFyYWJsZSxTeXN0ZW0uSUNvbXBhcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIGFjdHVhbCB2YWx1ZSBmYWxscyANCisgICAgICAgICAgICB3aXRoaW4gYSBzcGVjaWZpZWQgcmFuZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLk5vdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIENvbnN0cmFpbnRFeHByZXNzaW9uIHRoYXQgbmVnYXRlcyBhbnkNCisgICAgICAgICAgICBmb2xsb3dpbmcgY29uc3RyYWludC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uTm8iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBDb25zdHJhaW50RXhwcmVzc2lvbiB0aGF0IG5lZ2F0ZXMgYW55DQorICAgICAgICAgICAgZm9sbG93aW5nIGNvbnN0cmFpbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLkFsbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIENvbnN0cmFpbnRFeHByZXNzaW9uLCB3aGljaCB3aWxsIGFwcGx5DQorICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBjb25zdHJhaW50IHRvIGFsbCBtZW1iZXJzIG9mIGEgY29sbGVjdGlvbiwNCisgICAgICAgICAgICBzdWNjZWVkaW5nIGlmIGFsbCBvZiB0aGVtIHN1Y2NlZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLlNvbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBDb25zdHJhaW50RXhwcmVzc2lvbiwgd2hpY2ggd2lsbCBhcHBseQ0KKyAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludCB0byBhbGwgbWVtYmVycyBvZiBhIGNvbGxlY3Rpb24sDQorICAgICAgICAgICAgc3VjY2VlZGluZyBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlbSBzdWNjZWVkcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uTm9uZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIENvbnN0cmFpbnRFeHByZXNzaW9uLCB3aGljaCB3aWxsIGFwcGx5DQorICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBjb25zdHJhaW50IHRvIGFsbCBtZW1iZXJzIG9mIGEgY29sbGVjdGlvbiwNCisgICAgICAgICAgICBzdWNjZWVkaW5nIGlmIGFsbCBvZiB0aGVtIGZhaWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLkxlbmd0aCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIG5ldyBDb25zdHJhaW50RXhwcmVzc2lvbiwgd2hpY2ggd2lsbCBhcHBseSB0aGUgZm9sbG93aW5nDQorICAgICAgICAgICAgY29uc3RyYWludCB0byB0aGUgTGVuZ3RoIHByb3BlcnR5IG9mIHRoZSBvYmplY3QgYmVpbmcgdGVzdGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5Db3VudCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIG5ldyBDb25zdHJhaW50RXhwcmVzc2lvbiwgd2hpY2ggd2lsbCBhcHBseSB0aGUgZm9sbG93aW5nDQorICAgICAgICAgICAgY29uc3RyYWludCB0byB0aGUgQ291bnQgcHJvcGVydHkgb2YgdGhlIG9iamVjdCBiZWluZyB0ZXN0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLk1lc3NhZ2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBuZXcgQ29uc3RyYWludEV4cHJlc3Npb24sIHdoaWNoIHdpbGwgYXBwbHkgdGhlIGZvbGxvd2luZw0KKyAgICAgICAgICAgIGNvbnN0cmFpbnQgdG8gdGhlIE1lc3NhZ2UgcHJvcGVydHkgb2YgdGhlIG9iamVjdCBiZWluZyB0ZXN0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLklubmVyRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IENvbnN0cmFpbnRFeHByZXNzaW9uLCB3aGljaCB3aWxsIGFwcGx5IHRoZSBmb2xsb3dpbmcNCisgICAgICAgICAgICBjb25zdHJhaW50IHRvIHRoZSBJbm5lckV4Y2VwdGlvbiBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0IGJlaW5nIHRlc3RlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uV2l0aCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV2l0aCBpcyBjdXJyZW50bHkgYSBOT1AgLSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uTnVsbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyBmb3IgbnVsbA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5UcnVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIGZvciBUcnVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLkZhbHNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIGZvciBGYWxzZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5OYU4iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgZm9yIE5hTg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5FbXB0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyBmb3IgZW1wdHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uVW5pcXVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgYSBjb2xsZWN0aW9uIA0KKyAgICAgICAgICAgIGNvbnRhaW5zIGFsbCB1bmlxdWUgaXRlbXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRFeHByZXNzaW9uLkJpbmFyeVNlcmlhbGl6YWJsZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIGFuIG9iamVjdCBncmFwaCBpcyBzZXJpYWxpemFibGUgaW4gYmluYXJ5IGZvcm1hdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEV4cHJlc3Npb24uWG1sU2VyaWFsaXphYmxlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgYW4gb2JqZWN0IGdyYXBoIGlzIHNlcmlhbGl6YWJsZSBpbiB4bWwgZm9ybWF0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RXhwcmVzc2lvbi5PcmRlcmVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgYSBjb2xsZWN0aW9uIGlzIG9yZGVyZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhlbHBlciBjbGFzcyB3aXRoIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgdGhhdCBzdXBwbHkNCisgICAgICAgICAgICBhIG51bWJlciBvZiBjb25zdHJhaW50cyB1c2VkIGluIEFzc2VydHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LlByb3BlcnR5KFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IFByb3BlcnR5Q29uc3RyYWludEV4cHJlc3Npb24sIHdoaWNoIHdpbGwgZWl0aGVyDQorICAgICAgICAgICAgdGVzdCBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgbmFtZWQgcHJvcGVydHkgb24gdGhlIG9iamVjdA0KKyAgICAgICAgICAgIGJlaW5nIHRlc3RlZCBvciBhcHBseSBhbnkgZm9sbG93aW5nIGNvbnN0cmFpbnQgdG8gdGhhdCBwcm9wZXJ0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuQXR0cmlidXRlKFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIG5ldyBBdHRyaWJ1dGVDb25zdHJhaW50IGNoZWNraW5nIGZvciB0aGUNCisgICAgICAgICAgICBwcmVzZW5jZSBvZiBhIHBhcnRpY3VsYXIgYXR0cmlidXRlIG9uIGFuIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuQXR0cmlidXRlYGAxIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IEF0dHJpYnV0ZUNvbnN0cmFpbnQgY2hlY2tpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIHByZXNlbmNlIG9mIGEgcGFydGljdWxhciBhdHRyaWJ1dGUgb24gYW4gb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5FcXVhbFRvKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHR3byBpdGVtcyBmb3IgZXF1YWxpdHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuU2FtZUFzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHRoYXQgdHdvIHJlZmVyZW5jZXMgYXJlIHRoZSBzYW1lIG9iamVjdA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5HcmVhdGVyVGhhbihTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZQ0KKyAgICAgICAgICAgIGFjdHVhbCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHN1cHBsZWQgYXJndW1lbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuR3JlYXRlclRoYW5PckVxdWFsVG8oU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUNCisgICAgICAgICAgICBhY3R1YWwgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzdXBwbGVkIGFyZ3VtZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LkF0TGVhc3QoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUNCisgICAgICAgICAgICBhY3R1YWwgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzdXBwbGVkIGFyZ3VtZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5Lkxlc3NUaGFuKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlDQorICAgICAgICAgICAgYWN0dWFsIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc3VwcGxlZCBhcmd1bWVudA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5MZXNzVGhhbk9yRXF1YWxUbyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZQ0KKyAgICAgICAgICAgIGFjdHVhbCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHN1cHBsZWQgYXJndW1lbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuQXRNb3N0KFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlDQorICAgICAgICAgICAgYWN0dWFsIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3VwcGxlZCBhcmd1bWVudA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5UeXBlT2YoU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIGFjdHVhbA0KKyAgICAgICAgICAgIHZhbHVlIGlzIG9mIHRoZSBleGFjdCB0eXBlIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5UeXBlT2ZgYDEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsDQorICAgICAgICAgICAgdmFsdWUgaXMgb2YgdGhlIGV4YWN0IHR5cGUgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5Lkluc3RhbmNlT2YoU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIGFjdHVhbCB2YWx1ZQ0KKyAgICAgICAgICAgIGlzIG9mIHRoZSB0eXBlIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50IG9yIGEgZGVyaXZlZCB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5JbnN0YW5jZU9mYGAxIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIGFjdHVhbCB2YWx1ZQ0KKyAgICAgICAgICAgIGlzIG9mIHRoZSB0eXBlIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50IG9yIGEgZGVyaXZlZCB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5JbnN0YW5jZU9mVHlwZShTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsIHZhbHVlDQorICAgICAgICAgICAgaXMgb2YgdGhlIHR5cGUgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQgb3IgYSBkZXJpdmVkIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5Lkluc3RhbmNlT2ZUeXBlYGAxIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIGFjdHVhbCB2YWx1ZQ0KKyAgICAgICAgICAgIGlzIG9mIHRoZSB0eXBlIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50IG9yIGEgZGVyaXZlZCB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5Bc3NpZ25hYmxlRnJvbShTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsIHZhbHVlDQorICAgICAgICAgICAgaXMgYXNzaWduYWJsZSBmcm9tIHRoZSB0eXBlIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5Bc3NpZ25hYmxlRnJvbWBgMSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBhY3R1YWwgdmFsdWUNCisgICAgICAgICAgICBpcyBhc3NpZ25hYmxlIGZyb20gdGhlIHR5cGUgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LkFzc2lnbmFibGVUbyhTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsIHZhbHVlDQorICAgICAgICAgICAgaXMgYXNzaWduYWJsZSBmcm9tIHRoZSB0eXBlIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5Bc3NpZ25hYmxlVG9gYDEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsIHZhbHVlDQorICAgICAgICAgICAgaXMgYXNzaWduYWJsZSBmcm9tIHRoZSB0eXBlIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5FcXVpdmFsZW50VG8oU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBhY3R1YWwgdmFsdWUNCisgICAgICAgICAgICBpcyBhIGNvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgc2FtZSBlbGVtZW50cyBhcyB0aGUgDQorICAgICAgICAgICAgY29sbGVjdGlvbiBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuU3Vic2V0T2YoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBhY3R1YWwgdmFsdWUNCisgICAgICAgICAgICBpcyBhIHN1YnNldCBvZiB0aGUgY29sbGVjdGlvbiBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuTWVtYmVyKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IENvbGxlY3Rpb25Db250YWluc0NvbnN0cmFpbnQgY2hlY2tpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIHByZXNlbmNlIG9mIGEgcGFydGljdWxhciBvYmplY3QgaW4gdGhlIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LkNvbnRhaW5zKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IENvbGxlY3Rpb25Db250YWluc0NvbnN0cmFpbnQgY2hlY2tpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIHByZXNlbmNlIG9mIGEgcGFydGljdWxhciBvYmplY3QgaW4gdGhlIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LkNvbnRhaW5zKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IENvbnRhaW5zQ29uc3RyYWludC4gVGhpcyBjb25zdHJhaW50DQorICAgICAgICAgICAgd2lsbCwgaW4gdHVybiwgbWFrZSB1c2Ugb2YgdGhlIGFwcHJvcHJpYXRlIHNlY29uZC1sZXZlbA0KKyAgICAgICAgICAgIGNvbnN0cmFpbnQsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUgYWN0dWFsIGFyZ3VtZW50LiANCisgICAgICAgICAgICBUaGlzIG92ZXJsb2FkIGlzIG9ubHkgdXNlZCBpZiB0aGUgaXRlbSBzb3VnaHQgaXMgYSBzdHJpbmcsDQorICAgICAgICAgICAgc2luY2UgYW55IG90aGVyIHR5cGUgaW1wbGllcyB0aGF0IHdlIGFyZSBsb29raW5nIGZvciBhIA0KKyAgICAgICAgICAgIGNvbGxlY3Rpb24gbWVtYmVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5TdHJpbmdDb250YWluaW5nKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHN1Y2NlZWRzIGlmIHRoZSBhY3R1YWwNCisgICAgICAgICAgICB2YWx1ZSBjb250YWlucyB0aGUgc3Vic3RyaW5nIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5Db250YWluc1N1YnN0cmluZyhTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCBzdWNjZWVkcyBpZiB0aGUgYWN0dWFsDQorICAgICAgICAgICAgdmFsdWUgY29udGFpbnMgdGhlIHN1YnN0cmluZyBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuRG9lc05vdENvbnRhaW4oU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgZmFpbHMgaWYgdGhlIGFjdHVhbA0KKyAgICAgICAgICAgIHZhbHVlIGNvbnRhaW5zIHRoZSBzdWJzdHJpbmcgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LlN0YXJ0c1dpdGgoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgc3VjY2VlZHMgaWYgdGhlIGFjdHVhbA0KKyAgICAgICAgICAgIHZhbHVlIHN0YXJ0cyB3aXRoIHRoZSBzdWJzdHJpbmcgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LlN0cmluZ1N0YXJ0aW5nKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHN1Y2NlZWRzIGlmIHRoZSBhY3R1YWwNCisgICAgICAgICAgICB2YWx1ZSBzdGFydHMgd2l0aCB0aGUgc3Vic3RyaW5nIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5Eb2VzTm90U3RhcnRXaXRoKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IGZhaWxzIGlmIHRoZSBhY3R1YWwNCisgICAgICAgICAgICB2YWx1ZSBzdGFydHMgd2l0aCB0aGUgc3Vic3RyaW5nIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5FbmRzV2l0aChTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCBzdWNjZWVkcyBpZiB0aGUgYWN0dWFsDQorICAgICAgICAgICAgdmFsdWUgZW5kcyB3aXRoIHRoZSBzdWJzdHJpbmcgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LlN0cmluZ0VuZGluZyhTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCBzdWNjZWVkcyBpZiB0aGUgYWN0dWFsDQorICAgICAgICAgICAgdmFsdWUgZW5kcyB3aXRoIHRoZSBzdWJzdHJpbmcgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LkRvZXNOb3RFbmRXaXRoKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IGZhaWxzIGlmIHRoZSBhY3R1YWwNCisgICAgICAgICAgICB2YWx1ZSBlbmRzIHdpdGggdGhlIHN1YnN0cmluZyBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuTWF0Y2hlcyhTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCBzdWNjZWVkcyBpZiB0aGUgYWN0dWFsDQorICAgICAgICAgICAgdmFsdWUgbWF0Y2hlcyB0aGUgUmVnZXggcGF0dGVybiBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuU3RyaW5nTWF0Y2hpbmcoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgc3VjY2VlZHMgaWYgdGhlIGFjdHVhbA0KKyAgICAgICAgICAgIHZhbHVlIG1hdGNoZXMgdGhlIFJlZ2V4IHBhdHRlcm4gc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LkRvZXNOb3RNYXRjaChTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCBmYWlscyBpZiB0aGUgYWN0dWFsDQorICAgICAgICAgICAgdmFsdWUgbWF0Y2hlcyB0aGUgcGF0dGVybiBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuU2FtZVBhdGgoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgcGF0aCBwcm92aWRlZCANCisgICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyBhbiBleHBlY3RlZCBwYXRoIGFmdGVyIGNhbm9uaWNhbGl6YXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LlN1YlBhdGgoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgcGF0aCBwcm92aWRlZCANCisgICAgICAgICAgICBpcyB0aGUgc2FtZSBwYXRoIG9yIHVuZGVyIGFuIGV4cGVjdGVkIHBhdGggYWZ0ZXIgY2Fub25pY2FsaXphdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuU2FtZVBhdGhPclVuZGVyKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIHBhdGggcHJvdmlkZWQgDQorICAgICAgICAgICAgaXMgdGhlIHNhbWUgcGF0aCBvciB1bmRlciBhbiBleHBlY3RlZCBwYXRoIGFmdGVyIGNhbm9uaWNhbGl6YXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LkluUmFuZ2UoU3lzdGVtLklDb21wYXJhYmxlLFN5c3RlbS5JQ29tcGFyYWJsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsIHZhbHVlIGZhbGxzIA0KKyAgICAgICAgICAgIHdpdGhpbiBhIHNwZWNpZmllZCByYW5nZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuTm90Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgQ29uc3RyYWludEV4cHJlc3Npb24gdGhhdCBuZWdhdGVzIGFueQ0KKyAgICAgICAgICAgIGZvbGxvd2luZyBjb25zdHJhaW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5ObyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIENvbnN0cmFpbnRFeHByZXNzaW9uIHRoYXQgbmVnYXRlcyBhbnkNCisgICAgICAgICAgICBmb2xsb3dpbmcgY29uc3RyYWludC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuQWxsIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgQ29uc3RyYWludEV4cHJlc3Npb24sIHdoaWNoIHdpbGwgYXBwbHkNCisgICAgICAgICAgICB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnQgdG8gYWxsIG1lbWJlcnMgb2YgYSBjb2xsZWN0aW9uLA0KKyAgICAgICAgICAgIHN1Y2NlZWRpbmcgaWYgYWxsIG9mIHRoZW0gc3VjY2VlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuU29tZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIENvbnN0cmFpbnRFeHByZXNzaW9uLCB3aGljaCB3aWxsIGFwcGx5DQorICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBjb25zdHJhaW50IHRvIGFsbCBtZW1iZXJzIG9mIGEgY29sbGVjdGlvbiwNCisgICAgICAgICAgICBzdWNjZWVkaW5nIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVtIHN1Y2NlZWRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5Ob25lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgQ29uc3RyYWludEV4cHJlc3Npb24sIHdoaWNoIHdpbGwgYXBwbHkNCisgICAgICAgICAgICB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnQgdG8gYWxsIG1lbWJlcnMgb2YgYSBjb2xsZWN0aW9uLA0KKyAgICAgICAgICAgIHN1Y2NlZWRpbmcgaWYgYWxsIG9mIHRoZW0gZmFpbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuTGVuZ3RoIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IENvbnN0cmFpbnRFeHByZXNzaW9uLCB3aGljaCB3aWxsIGFwcGx5IHRoZSBmb2xsb3dpbmcNCisgICAgICAgICAgICBjb25zdHJhaW50IHRvIHRoZSBMZW5ndGggcHJvcGVydHkgb2YgdGhlIG9iamVjdCBiZWluZyB0ZXN0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LkNvdW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IENvbnN0cmFpbnRFeHByZXNzaW9uLCB3aGljaCB3aWxsIGFwcGx5IHRoZSBmb2xsb3dpbmcNCisgICAgICAgICAgICBjb25zdHJhaW50IHRvIHRoZSBDb3VudCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0IGJlaW5nIHRlc3RlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuTWVzc2FnZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIG5ldyBDb25zdHJhaW50RXhwcmVzc2lvbiwgd2hpY2ggd2lsbCBhcHBseSB0aGUgZm9sbG93aW5nDQorICAgICAgICAgICAgY29uc3RyYWludCB0byB0aGUgTWVzc2FnZSBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0IGJlaW5nIHRlc3RlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuSW5uZXJFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBuZXcgQ29uc3RyYWludEV4cHJlc3Npb24sIHdoaWNoIHdpbGwgYXBwbHkgdGhlIGZvbGxvd2luZw0KKyAgICAgICAgICAgIGNvbnN0cmFpbnQgdG8gdGhlIElubmVyRXhjZXB0aW9uIHByb3BlcnR5IG9mIHRoZSBvYmplY3QgYmVpbmcgdGVzdGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5OdWxsIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIGZvciBudWxsDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LlRydWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgZm9yIFRydWUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuRmFsc2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgZm9yIEZhbHNlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5Lk5hTiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyBmb3IgTmFODQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5LkVtcHR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIGZvciBlbXB0eQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5VbmlxdWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciBhIGNvbGxlY3Rpb24gDQorICAgICAgICAgICAgY29udGFpbnMgYWxsIHVuaXF1ZSBpdGVtcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEZhY3RvcnkuQmluYXJ5U2VyaWFsaXphYmxlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgYW4gb2JqZWN0IGdyYXBoIGlzIHNlcmlhbGl6YWJsZSBpbiBiaW5hcnkgZm9ybWF0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50RmFjdG9yeS5YbWxTZXJpYWxpemFibGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciBhbiBvYmplY3QgZ3JhcGggaXMgc2VyaWFsaXphYmxlIGluIHhtbCBmb3JtYXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRGYWN0b3J5Lk9yZGVyZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciBhIGNvbGxlY3Rpb24gaXMgb3JkZXJlZA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50T3BlcmF0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBDb25zdHJhaW50T3BlcmF0b3IgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IGENCisgICAgICAgICAgICBDb25zdHJhaW50QnVpbGRlciB0byByZXByZXNlbnQgYW4gb3BlcmF0b3IgdGhhdCANCisgICAgICAgICAgICBtb2RpZmllcyBvciBjb21iaW5lcyBjb25zdHJhaW50cy4gDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgQ29uc3RyYWludCBvcGVyYXRvcnMgdXNlIGxlZnQgYW5kIHJpZ2h0IHByZWNlZGVuY2UNCisgICAgICAgICAgICB2YWx1ZXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHRvcCBvcGVyYXRvciBvbiB0aGUNCisgICAgICAgICAgICBzdGFjayBzaG91bGQgYmUgcmVkdWNlZCBiZWZvcmUgcHVzaGluZyBhIG5ldyBvcGVyYXRvci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludE9wZXJhdG9yLmxlZnRfcHJlY2VkZW5jZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHByZWNlZGVuY2UgdmFsdWUgdXNlZCB3aGVuIHRoZSBvcGVyYXRvcg0KKyAgICAgICAgICAgIGlzIGFib3V0IHRvIGJlIHB1c2hlZCB0byB0aGUgc3RhY2suDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRPcGVyYXRvci5yaWdodF9wcmVjZWRlbmNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgcHJlY2VkZW5jZSB2YWx1ZSB1c2VkIHdoZW4gdGhlIG9wZXJhdG9yDQorICAgICAgICAgICAgaXMgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRPcGVyYXRvci5SZWR1Y2UoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRCdWlsZGVyLkNvbnN0cmFpbnRTdGFjaykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlZHVjZSBwcm9kdWNlcyBhIGNvbnN0cmFpbnQgZnJvbSB0aGUgb3BlcmF0b3IgYW5kIA0KKyAgICAgICAgICAgIGFueSBhcmd1bWVudHMuIEl0IHRha2VzIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgY29uc3RyYWludCANCisgICAgICAgICAgICBzdGFjayBhbmQgcHVzaGVzIHRoZSByZXN1bHRpbmcgY29uc3RyYWludCBvbiBpdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN0YWNrIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRPcGVyYXRvci5MZWZ0Q29udGV4dCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHN5bnRheCBlbGVtZW50IHByZWNlZGluZyB0aGlzIG9wZXJhdG9yDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRPcGVyYXRvci5SaWdodENvbnRleHQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBzeW50YXggZWxlbWVudCBmb2xvd2luZyB0aGlzIG9wZXJhdG9yDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRPcGVyYXRvci5MZWZ0UHJlY2VkZW5jZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHByZWNlZGVuY2UgdmFsdWUgdXNlZCB3aGVuIHRoZSBvcGVyYXRvcg0KKyAgICAgICAgICAgIGlzIGFib3V0IHRvIGJlIHB1c2hlZCB0byB0aGUgc3RhY2suDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRPcGVyYXRvci5SaWdodFByZWNlZGVuY2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBwcmVjZWRlbmNlIHZhbHVlIHVzZWQgd2hlbiB0aGUgb3BlcmF0b3INCisgICAgICAgICAgICBpcyBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJlZml4T3BlcmF0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByZWZpeE9wZXJhdG9yIHRha2VzIGEgc2luZ2xlIGNvbnN0cmFpbnQgYW5kIG1vZGlmaWVzDQorICAgICAgICAgICAgaXQncyBhY3Rpb24gaW4gc29tZSB3YXkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByZWZpeE9wZXJhdG9yLlJlZHVjZShOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEJ1aWxkZXIuQ29uc3RyYWludFN0YWNrKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmVkdWNlIHByb2R1Y2VzIGEgY29uc3RyYWludCBmcm9tIHRoZSBvcGVyYXRvciBhbmQgDQorICAgICAgICAgICAgYW55IGFyZ3VtZW50cy4gSXQgdGFrZXMgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZSBjb25zdHJhaW50IA0KKyAgICAgICAgICAgIHN0YWNrIGFuZCBwdXNoZXMgdGhlIHJlc3VsdGluZyBjb25zdHJhaW50IG9uIGl0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3RhY2siPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJlZml4T3BlcmF0b3IuQXBwbHlQcmVmaXgoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIHRoZSBjb25zdHJhaW50IGNyZWF0ZWQgYnkgYXBwbHlpbmcgdGhpcw0KKyAgICAgICAgICAgIHByZWZpeCB0byBhbm90aGVyIGNvbnN0cmFpbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25zdHJhaW50Ij48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ob3RPcGVyYXRvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTmVnYXRlcyB0aGUgdGVzdCBvZiB0aGUgY29uc3RyYWludCBpdCB3cmFwcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTm90T3BlcmF0b3IuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdHMgYSBuZXcgTm90T3BlcmF0b3INCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTm90T3BlcmF0b3IuQXBwbHlQcmVmaXgoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgTm90Q29uc3RyYWludCBhcHBsaWVkIHRvIGl0cyBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbk9wZXJhdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBYnN0cmFjdCBiYXNlIGZvciBvcGVyYXRvcnMgdGhhdCBpbmRpY2F0ZSBob3cgdG8NCisgICAgICAgICAgICBhcHBseSBhIGNvbnN0cmFpbnQgdG8gaXRlbXMgaW4gYSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uT3BlcmF0b3IuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdHMgYSBDb2xsZWN0aW9uT3BlcmF0b3INCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWxsT3BlcmF0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcHJlc2VudHMgYSBjb25zdHJhaW50IHRoYXQgc3VjY2VlZHMgaWYgYWxsIHRoZSANCisgICAgICAgICAgICBtZW1iZXJzIG9mIGEgY29sbGVjdGlvbiBtYXRjaCBhIGJhc2UgY29uc3RyYWludC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWxsT3BlcmF0b3IuQXBwbHlQcmVmaXgoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHdpbGwgYXBwbHkgdGhlIGFyZ3VtZW50DQorICAgICAgICAgICAgdG8gdGhlIG1lbWJlcnMgb2YgYSBjb2xsZWN0aW9uLCBzdWNjZWVkaW5nIGlmDQorICAgICAgICAgICAgdGhleSBhbGwgc3VjY2VlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU29tZU9wZXJhdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXByZXNlbnRzIGEgY29uc3RyYWludCB0aGF0IHN1Y2NlZWRzIGlmIGFueSBvZiB0aGUgDQorICAgICAgICAgICAgbWVtYmVycyBvZiBhIGNvbGxlY3Rpb24gbWF0Y2ggYSBiYXNlIGNvbnN0cmFpbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNvbWVPcGVyYXRvci5BcHBseVByZWZpeChOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgd2lsbCBhcHBseSB0aGUgYXJndW1lbnQNCisgICAgICAgICAgICB0byB0aGUgbWVtYmVycyBvZiBhIGNvbGxlY3Rpb24sIHN1Y2NlZWRpbmcgaWYNCisgICAgICAgICAgICBhbnkgb2YgdGhlbSBzdWNjZWVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ob25lT3BlcmF0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlcHJlc2VudHMgYSBjb25zdHJhaW50IHRoYXQgc3VjY2VlZHMgaWYgbm9uZSBvZiB0aGUgDQorICAgICAgICAgICAgbWVtYmVycyBvZiBhIGNvbGxlY3Rpb24gbWF0Y2ggYSBiYXNlIGNvbnN0cmFpbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5vbmVPcGVyYXRvci5BcHBseVByZWZpeChOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgd2lsbCBhcHBseSB0aGUgYXJndW1lbnQNCisgICAgICAgICAgICB0byB0aGUgbWVtYmVycyBvZiBhIGNvbGxlY3Rpb24sIHN1Y2NlZWRpbmcgaWYNCisgICAgICAgICAgICBub25lIG9mIHRoZW0gc3VjY2VlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuV2l0aE9wZXJhdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXByZXNlbnRzIGEgY29uc3RyYWludCB0aGF0IHNpbXBseSB3cmFwcyB0aGUNCisgICAgICAgICAgICBjb25zdHJhaW50IHByb3ZpZGVkIGFzIGFuIGFyZ3VtZW50LCB3aXRob3V0IGFueQ0KKyAgICAgICAgICAgIGZ1cnRoZXIgZnVuY3Rpb25hbGl0eSwgYnV0IHdoaWNoIG1vZGlmZXMgdGhlDQorICAgICAgICAgICAgb3JkZXIgb2YgZXZhbHVhdGlvbiBiZWNhdXNlIG9mIGl0cyBwcmVjZWRlbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5XaXRoT3BlcmF0b3IuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdG9yIGZvciB0aGUgV2l0aE9wZXJhdG9yDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLldpdGhPcGVyYXRvci5BcHBseVByZWZpeChOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgd3JhcHMgaXRzIGFyZ3VtZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNlbGZSZXNvbHZpbmdPcGVyYXRvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igb3BlcmF0b3JzIHRoYXQgYXJlIGFibGUgdG8gcmVkdWNlIHRvIGEgDQorICAgICAgICAgICAgY29uc3RyYWludCB3aGV0aGVyIG9yIG5vdCBhbm90aGVyIHN5bnRhY3RpYyBlbGVtZW50IGZvbGxvd3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByb3BPcGVyYXRvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgT3BlcmF0b3IgdXNlZCB0byB0ZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBuYW1lZCBQcm9wZXJ0eQ0KKyAgICAgICAgICAgIG9uIGFuIG9iamVjdCBhbmQgb3B0aW9uYWxseSBhcHBseSBmdXJ0aGVyIHRlc3RzIHRvIHRoZQ0KKyAgICAgICAgICAgIHZhbHVlIG9mIHRoYXQgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByb3BPcGVyYXRvci4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0cyBhIFByb3BPcGVyYXRvciBmb3IgYSBwYXJ0aWN1bGFyIG5hbWVkIHByb3BlcnR5DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByb3BPcGVyYXRvci5SZWR1Y2UoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRCdWlsZGVyLkNvbnN0cmFpbnRTdGFjaykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlZHVjZSBwcm9kdWNlcyBhIGNvbnN0cmFpbnQgZnJvbSB0aGUgb3BlcmF0b3IgYW5kIA0KKyAgICAgICAgICAgIGFueSBhcmd1bWVudHMuIEl0IHRha2VzIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgY29uc3RyYWludCANCisgICAgICAgICAgICBzdGFjayBhbmQgcHVzaGVzIHRoZSByZXN1bHRpbmcgY29uc3RyYWludCBvbiBpdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN0YWNrIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByb3BPcGVyYXRvci5OYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB3aGljaCB0aGUgb3BlcmF0b3IgYXBwbGllcw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BdHRyaWJ1dGVPcGVyYXRvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgT3BlcmF0b3IgdGhhdCB0ZXN0cyBmb3IgdGhlIHByZXNlbmNlIG9mIGEgcGFydGljdWxhciBhdHRyaWJ1dGUNCisgICAgICAgICAgICBvbiBhIHR5cGUgYW5kIG9wdGlvbmFsbHkgYXBwbGllcyBmdXJ0aGVyIHRlc3RzIHRvIHRoZSBhdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkF0dHJpYnV0ZU9wZXJhdG9yLiNjdG9yKFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGFuIEF0dHJpYnV0ZU9wZXJhdG9yIGZvciBhIHBhcnRpY3VsYXIgVHlwZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idHlwZSI+VGhlIFR5cGUgb2YgYXR0cmlidXRlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQXR0cmlidXRlT3BlcmF0b3IuUmVkdWNlKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50QnVpbGRlci5Db25zdHJhaW50U3RhY2spIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZWR1Y2UgcHJvZHVjZXMgYSBjb25zdHJhaW50IGZyb20gdGhlIG9wZXJhdG9yIGFuZCANCisgICAgICAgICAgICBhbnkgYXJndW1lbnRzLiBJdCB0YWtlcyB0aGUgYXJndW1lbnRzIGZyb20gdGhlIGNvbnN0cmFpbnQgDQorICAgICAgICAgICAgc3RhY2sgYW5kIHB1c2hlcyB0aGUgcmVzdWx0aW5nIGNvbnN0cmFpbnQgb24gaXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c09wZXJhdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBPcGVyYXRvciB0aGF0IHRlc3RzIHRoYXQgYW4gZXhjZXB0aW9uIGlzIHRocm93biBhbmQNCisgICAgICAgICAgICBvcHRpb25hbGx5IGFwcGxpZXMgZnVydGhlciB0ZXN0cyB0byB0aGUgZXhjZXB0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UaHJvd3NPcGVyYXRvci4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgVGhyb3dzT3BlcmF0b3INCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVGhyb3dzT3BlcmF0b3IuUmVkdWNlKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50QnVpbGRlci5Db25zdHJhaW50U3RhY2spIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZWR1Y2UgcHJvZHVjZXMgYSBjb25zdHJhaW50IGZyb20gdGhlIG9wZXJhdG9yIGFuZCANCisgICAgICAgICAgICBhbnkgYXJndW1lbnRzLiBJdCB0YWtlcyB0aGUgYXJndW1lbnRzIGZyb20gdGhlIGNvbnN0cmFpbnQgDQorICAgICAgICAgICAgc3RhY2sgYW5kIHB1c2hlcyB0aGUgcmVzdWx0aW5nIGNvbnN0cmFpbnQgb24gaXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkJpbmFyeU9wZXJhdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgYmluYXJ5IG9wZXJhdG9ycw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5CaW5hcnlPcGVyYXRvci5SZWR1Y2UoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnRCdWlsZGVyLkNvbnN0cmFpbnRTdGFjaykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlZHVjZSBwcm9kdWNlcyBhIGNvbnN0cmFpbnQgZnJvbSB0aGUgb3BlcmF0b3IgYW5kIA0KKyAgICAgICAgICAgIGFueSBhcmd1bWVudHMuIEl0IHRha2VzIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgY29uc3RyYWludCANCisgICAgICAgICAgICBzdGFjayBhbmQgcHVzaGVzIHRoZSByZXN1bHRpbmcgY29uc3RyYWludCBvbiBpdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN0YWNrIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkJpbmFyeU9wZXJhdG9yLkFwcGx5T3BlcmF0b3IoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQsTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBYnN0cmFjdCBtZXRob2QgdGhhdCBwcm9kdWNlcyBhIGNvbnN0cmFpbnQgYnkgYXBwbHlpbmcNCisgICAgICAgICAgICB0aGUgb3BlcmF0b3IgdG8gaXRzIGxlZnQgYW5kIHJpZ2h0IGNvbnN0cmFpbnQgYXJndW1lbnRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5CaW5hcnlPcGVyYXRvci5MZWZ0UHJlY2VkZW5jZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgbGVmdCBwcmVjZWRlbmNlIG9mIHRoZSBvcGVyYXRvcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5CaW5hcnlPcGVyYXRvci5SaWdodFByZWNlZGVuY2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHJpZ2h0IHByZWNlZGVuY2Ugb2YgdGhlIG9wZXJhdG9yDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFuZE9wZXJhdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBPcGVyYXRvciB0aGF0IHJlcXVpcmVzIGJvdGggaXQncyBhcmd1bWVudHMgdG8gc3VjY2VlZA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BbmRPcGVyYXRvci4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGFuIEFuZE9wZXJhdG9yDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFuZE9wZXJhdG9yLkFwcGx5T3BlcmF0b3IoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQsTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBcHBseSB0aGUgb3BlcmF0b3IgdG8gcHJvZHVjZSBhbiBBbmRDb25zdHJhaW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk9yT3BlcmF0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE9wZXJhdG9yIHRoYXQgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIG9mIGl0J3MgYXJndW1lbnRzIHRvIHN1Y2NlZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuT3JPcGVyYXRvci4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGFuIE9yT3BlcmF0b3INCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuT3JPcGVyYXRvci5BcHBseU9wZXJhdG9yKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50LE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbHkgdGhlIG9wZXJhdG9yIHRvIHByb2R1Y2UgYW4gT3JDb25zdHJhaW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnRhaW5zQ29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29udGFpbnNDb25zdHJhaW50IHRlc3RzIGEgd2hldGhlciBhIHN0cmluZyBjb250YWlucyBhIHN1YnN0cmluZw0KKyAgICAgICAgICAgIG9yIGEgY29sbGVjdGlvbiBjb250YWlucyBhbiBvYmplY3QuIEl0IHBvc3Rwb25lcyB0aGUgZGVjaXNpb24gb2YNCisgICAgICAgICAgICB3aGljaCB0ZXN0IHRvIHVzZSB1bnRpbCB0aGUgdHlwZSBvZiB0aGUgYWN0dWFsIGFyZ3VtZW50IGlzIGtub3duLg0KKyAgICAgICAgICAgIFRoaXMgYWxsb3dzIHRlc3Rpbmcgd2hldGhlciBhIHN0cmluZyBpcyBjb250YWluZWQgaW4gYSBjb2xsZWN0aW9uDQorICAgICAgICAgICAgb3IgYXMgYSBzdWJzdHJpbmcgb2YgYW5vdGhlciBzdHJpbmcgdXNpbmcgdGhlIHNhbWUgc3ludGF4Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db250YWluc0NvbnN0cmFpbnQuI2N0b3IoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlQ6Q29udGFpbnNDb25zdHJhaW50Ii8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnRhaW5zQ29uc3RyYWludC5NYXRjaGVzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IHdoZXRoZXIgdGhlIGNvbnN0cmFpbnQgaXMgc2F0aXNmaWVkIGJ5IGEgZ2l2ZW4gdmFsdWUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHZhbHVlIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBmb3Igc3VjY2VzcywgZmFsc2UgZm9yIGZhaWx1cmU8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29udGFpbnNDb25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBjb25zdHJhaW50IGRlc2NyaXB0aW9uIHRvIGEgTWVzc2FnZVdyaXRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiBpcyBkaXNwbGF5ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnRhaW5zQ29uc3RyYWludC5Vc2luZyhTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRmxhZyB0aGUgY29uc3RyYWludCB0byB1c2UgdGhlIHN1cHBsaWVkIElDb21wYXJlciBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wYXJlciI+VGhlIElDb21wYXJlciBvYmplY3QgdG8gdXNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+U2VsZi48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29udGFpbnNDb25zdHJhaW50LlVzaW5nYGAxKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklDb21wYXJlcntgYDB9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRmxhZyB0aGUgY29uc3RyYWludCB0byB1c2UgdGhlIHN1cHBsaWVkIElDb21wYXJlciBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wYXJlciI+VGhlIElDb21wYXJlciBvYmplY3QgdG8gdXNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+U2VsZi48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29udGFpbnNDb25zdHJhaW50LlVzaW5nYGAxKFN5c3RlbS5Db21wYXJpc29ue2BgMH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGbGFnIHRoZSBjb25zdHJhaW50IHRvIHVzZSB0aGUgc3VwcGxpZWQgQ29tcGFyaXNvbiBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wYXJlciI+VGhlIElDb21wYXJlciBvYmplY3QgdG8gdXNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+U2VsZi48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29udGFpbnNDb25zdHJhaW50LlVzaW5nKFN5c3RlbS5Db2xsZWN0aW9ucy5JRXF1YWxpdHlDb21wYXJlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZsYWcgdGhlIGNvbnN0cmFpbnQgdG8gdXNlIHRoZSBzdXBwbGllZCBJRXF1YWxpdHlDb21wYXJlciBvYmplY3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wYXJlciI+VGhlIElDb21wYXJlciBvYmplY3QgdG8gdXNlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+U2VsZi48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29udGFpbnNDb25zdHJhaW50LlVzaW5nYGAxKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklFcXVhbGl0eUNvbXBhcmVye2BgMH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGbGFnIHRoZSBjb25zdHJhaW50IHRvIHVzZSB0aGUgc3VwcGxpZWQgSUVxdWFsaXR5Q29tcGFyZXIgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29tcGFyZXIiPlRoZSBJQ29tcGFyZXIgb2JqZWN0IHRvIHVzZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlNlbGYuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnRhaW5zQ29uc3RyYWludC5JZ25vcmVDYXNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGbGFnIHRoZSBjb25zdHJhaW50IHRvIGlnbm9yZSBjYXNlIGFuZCByZXR1cm4gc2VsZi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRGVsYXllZENvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgICBBcHBsaWVzIGEgZGVsYXkgdG8gdGhlIG1hdGNoIHNvIHRoYXQgYSBtYXRjaCBjYW4gYmUgZXZhbHVhdGVkIGluIHRoZSBmdXR1cmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkRlbGF5ZWRDb25zdHJhaW50LiNjdG9yKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50LFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgICBDcmVhdGVzIGEgbmV3IERlbGF5ZWRDb25zdHJhaW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJiYXNlQ29uc3RyYWludCI+VGhlIGlubmVyIGNvbnN0cmFpbnQgdHdvIGRlY29yYXRlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVsYXlJbk1pbGxpc2Vjb25kcyI+VGhlIHRpbWUgaW50ZXJ2YWwgYWZ0ZXIgd2hpY2ggdGhlIG1hdGNoIGlzIHBlcmZvcm1lZDwvcGFyYW0+DQorICAgICAgICAgICAgPGV4Y2VwdGlvbiBjcmVmPSJUOlN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIj5JZiB0aGUgdmFsdWUgb2YgPHBhcmFtcmVmIG5hbWU9ImRlbGF5SW5NaWxsaXNlY29uZHMiLz4gaXMgbGVzcyB0aGFuIDA8L2V4Y2VwdGlvbj4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5EZWxheWVkQ29uc3RyYWludC4jY3RvcihOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCxTeXN0ZW0uSW50MzIsU3lzdGVtLkludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgRGVsYXllZENvbnN0cmFpbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImJhc2VDb25zdHJhaW50Ij5UaGUgaW5uZXIgY29uc3RyYWludCB0d28gZGVjb3JhdGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWxheUluTWlsbGlzZWNvbmRzIj5UaGUgdGltZSBpbnRlcnZhbCBhZnRlciB3aGljaCB0aGUgbWF0Y2ggaXMgcGVyZm9ybWVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icG9sbGluZ0ludGVydmFsIj5UaGUgdGltZSBpbnRlcnZhbCB1c2VkIGZvciBwb2xsaW5nPC9wYXJhbT4NCisgICAgICAgICAgICA8ZXhjZXB0aW9uIGNyZWY9IlQ6U3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24iPklmIHRoZSB2YWx1ZSBvZiA8cGFyYW1yZWYgbmFtZT0iZGVsYXlJbk1pbGxpc2Vjb25kcyIvPiBpcyBsZXNzIHRoYW4gMDwvZXhjZXB0aW9uPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkRlbGF5ZWRDb25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2hldGhlciB0aGUgY29uc3RyYWludCBpcyBzYXRpc2ZpZWQgYnkgYSBnaXZlbiB2YWx1ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgdmFsdWUgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGZvciBpZiB0aGUgYmFzZSBjb25zdHJhaW50IGZhaWxzLCBmYWxzZSBpZiBpdCBzdWNjZWVkczwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5EZWxheWVkQ29uc3RyYWludC5NYXRjaGVzKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BY3R1YWxWYWx1ZURlbGVnYXRlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBjb25zdHJhaW50IGlzIHNhdGlzZmllZCBieSBhIGRlbGVnYXRlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWwiPlRoZSBkZWxlZ2F0ZSB3aG9zZSB2YWx1ZSBpcyB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgZm9yIGlmIHRoZSBiYXNlIGNvbnN0cmFpbnQgZmFpbHMsIGZhbHNlIGlmIGl0IHN1Y2NlZWRzPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkRlbGF5ZWRDb25zdHJhaW50Lk1hdGNoZXNgYDEoYGAwQCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2hldGhlciB0aGUgY29uc3RyYWludCBpcyBzYXRpc2ZpZWQgYnkgYSBnaXZlbiByZWZlcmVuY2UuDQorICAgICAgICAgICAgT3ZlcnJpZGRlbiB0byB3YWl0IGZvciB0aGUgc3BlY2lmaWVkIGRlbGF5IHBlcmlvZCBiZWZvcmUNCisgICAgICAgICAgICBjYWxsaW5nIHRoZSBiYXNlIGNvbnN0cmFpbnQgd2l0aCB0aGUgZGVyZWZlcmVuY2VkIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5BIHJlZmVyZW5jZSB0byB0aGUgdmFsdWUgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZTwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5EZWxheWVkQ29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSB0aGUgY29uc3RyYWludCBkZXNjcmlwdGlvbiB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIHdyaXRlciBvbiB3aGljaCB0aGUgZGVzY3JpcHRpb24gaXMgZGlzcGxheWVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5EZWxheWVkQ29uc3RyYWludC5Xcml0ZUFjdHVhbFZhbHVlVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSB0aGUgYWN0dWFsIHZhbHVlIGZvciBhIGZhaWxpbmcgY29uc3RyYWludCB0ZXN0IHRvIGEgTWVzc2FnZVdyaXRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIHdyaXRlciBvbiB3aGljaCB0aGUgYWN0dWFsIHZhbHVlIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRGVsYXllZENvbnN0cmFpbnQuR2V0U3RyaW5nUmVwcmVzZW50YXRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uc3RyYWludC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW1wdHlEaXJlY3RvcnlDb250cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEVtcHR5RGlyZWN0b3J5Q29uc3RyYWludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBhIGRpcmVjdG9yeSBpcyBlbXB0eQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbXB0eURpcmVjdG9yeUNvbnRyYWludC5NYXRjaGVzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IHdoZXRoZXIgdGhlIGNvbnN0cmFpbnQgaXMgc2F0aXNmaWVkIGJ5IGEgZ2l2ZW4gdmFsdWUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHZhbHVlIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBmb3Igc3VjY2VzcywgZmFsc2UgZm9yIGZhaWx1cmU8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW1wdHlEaXJlY3RvcnlDb250cmFpbnQuV3JpdGVEZXNjcmlwdGlvblRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGNvbnN0cmFpbnQgZGVzY3JpcHRpb24gdG8gYSBNZXNzYWdlV3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPlRoZSB3cml0ZXIgb24gd2hpY2ggdGhlIGRlc2NyaXB0aW9uIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW1wdHlEaXJlY3RvcnlDb250cmFpbnQuV3JpdGVBY3R1YWxWYWx1ZVRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGFjdHVhbCB2YWx1ZSBmb3IgYSBmYWlsaW5nIGNvbnN0cmFpbnQgdGVzdCB0byBhDQorICAgICAgICAgICAgTWVzc2FnZVdyaXRlci4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IHdyaXRlcw0KKyAgICAgICAgICAgIHRoZSByYXcgdmFsdWUgb2YgYWN0dWFsLCBsZWF2aW5nIGl0IHRvIHRoZSB3cml0ZXIgdG8NCisgICAgICAgICAgICBwZXJmb3JtIGFueSBmb3JtYXR0aW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBhY3R1YWwgdmFsdWUgaXMgZGlzcGxheWVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbXB0eUNvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEVtcHR5Q29uc3RyYWludCB0ZXN0cyBhIHdoZXRoZXIgYSBzdHJpbmcgb3IgY29sbGVjdGlvbiBpcyBlbXB0eSwNCisgICAgICAgICAgICBwb3N0cG9uaW5nIHRoZSBkZWNpc2lvbiBhYm91dCB3aGljaCB0ZXN0IGlzIGFwcGxpZWQgdW50aWwgdGhlDQorICAgICAgICAgICAgdHlwZSBvZiB0aGUgYWN0dWFsIGFyZ3VtZW50IGlzIGtub3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbXB0eUNvbnN0cmFpbnQuTWF0Y2hlcyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBjb25zdHJhaW50IGlzIHNhdGlzZmllZCBieSBhIGdpdmVuIHZhbHVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSB2YWx1ZSB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgZm9yIHN1Y2Nlc3MsIGZhbHNlIGZvciBmYWlsdXJlPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVtcHR5Q29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSB0aGUgY29uc3RyYWludCBkZXNjcmlwdGlvbiB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIHdyaXRlciBvbiB3aGljaCB0aGUgZGVzY3JpcHRpb24gaXMgZGlzcGxheWVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEVxdWFsQ29uc3RyYWludCBpcyBhYmxlIHRvIGNvbXBhcmUgYW4gYWN0dWFsIHZhbHVlIHdpdGggdGhlDQorICAgICAgICAgICAgZXhwZWN0ZWQgdmFsdWUgcHJvdmlkZWQgaW4gaXRzIGNvbnN0cnVjdG9yLiBUd28gb2JqZWN0cyBhcmUgDQorICAgICAgICAgICAgY29uc2lkZXJlZCBlcXVhbCBpZiBib3RoIGFyZSBudWxsLCBvciBpZiBib3RoIGhhdmUgdGhlIHNhbWUgDQorICAgICAgICAgICAgdmFsdWUuIE5Vbml0IGhhcyBzcGVjaWFsIHNlbWFudGljcyBmb3Igc29tZSBvYmplY3QgdHlwZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludC5jbGlwU3RyaW5ncyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWYgdHJ1ZSwgc3RyaW5ncyBpbiBlcnJvciBtZXNzYWdlcyB3aWxsIGJlIGNsaXBwZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50LmNvbXBhcmVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBOVW5pdEVxdWFsaXR5Q29tcGFyZXIgdXNlZCB0byB0ZXN0IGVxdWFsaXR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnQuI2N0b3IoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludCIvPiBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnQuV2l0aGluKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGbGFnIHRoZSBjb25zdHJhaW50IHRvIHVzZSBhIHRvbGVyYW5jZSB3aGVuIGRldGVybWluaW5nIGVxdWFsaXR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYW1vdW50Ij5Ub2xlcmFuY2UgdmFsdWUgdG8gYmUgdXNlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+U2VsZi48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50LkNvbXBhcmVyKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29tcGFyZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGbGFnIHRoZSBjb25zdHJhaW50IHRvIHVzZSB0aGUgc3VwcGxpZWQgSUNvbXBhcmVyIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbXBhcmVyIj5UaGUgSUNvbXBhcmVyIG9iamVjdCB0byB1c2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5TZWxmLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnQuVXNpbmcoU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZsYWcgdGhlIGNvbnN0cmFpbnQgdG8gdXNlIHRoZSBzdXBwbGllZCBJQ29tcGFyZXIgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29tcGFyZXIiPlRoZSBJQ29tcGFyZXIgb2JqZWN0IHRvIHVzZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlNlbGYuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludC5Vc2luZ2BgMShTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JQ29tcGFyZXJ7YGAwfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZsYWcgdGhlIGNvbnN0cmFpbnQgdG8gdXNlIHRoZSBzdXBwbGllZCBJQ29tcGFyZXIgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29tcGFyZXIiPlRoZSBJQ29tcGFyZXIgb2JqZWN0IHRvIHVzZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlNlbGYuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludC5Vc2luZ2BgMShTeXN0ZW0uQ29tcGFyaXNvbntgYDB9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRmxhZyB0aGUgY29uc3RyYWludCB0byB1c2UgdGhlIHN1cHBsaWVkIENvbXBhcmlzb24gb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29tcGFyZXIiPlRoZSBJQ29tcGFyZXIgb2JqZWN0IHRvIHVzZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlNlbGYuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludC5Vc2luZyhTeXN0ZW0uQ29sbGVjdGlvbnMuSUVxdWFsaXR5Q29tcGFyZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGbGFnIHRoZSBjb25zdHJhaW50IHRvIHVzZSB0aGUgc3VwcGxpZWQgSUVxdWFsaXR5Q29tcGFyZXIgb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29tcGFyZXIiPlRoZSBJQ29tcGFyZXIgb2JqZWN0IHRvIHVzZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlNlbGYuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludC5Vc2luZ2BgMShTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRXF1YWxpdHlDb21wYXJlcntgYDB9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRmxhZyB0aGUgY29uc3RyYWludCB0byB1c2UgdGhlIHN1cHBsaWVkIElFcXVhbGl0eUNvbXBhcmVyIG9iamVjdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbXBhcmVyIj5UaGUgSUNvbXBhcmVyIG9iamVjdCB0byB1c2UuPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5TZWxmLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnQuTWF0Y2hlcyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBjb25zdHJhaW50IGlzIHNhdGlzZmllZCBieSBhIGdpdmVuIHZhbHVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSB2YWx1ZSB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgZm9yIHN1Y2Nlc3MsIGZhbHNlIGZvciBmYWlsdXJlPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludC5Xcml0ZU1lc3NhZ2VUbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIGEgZmFpbHVyZSBtZXNzYWdlLiBPdmVycmlkZGVuIHRvIHByb3ZpZGUgY3VzdG9tIA0KKyAgICAgICAgICAgIGZhaWx1cmUgbWVzc2FnZXMgZm9yIEVxdWFsQ29uc3RyYWludC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIE1lc3NhZ2VXcml0ZXIgdG8gd3JpdGUgdG88L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGNvbnN0cmFpbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIE1lc3NhZ2VXcml0ZXIgdG8gd3JpdGUgdG88L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludC5EaXNwbGF5Q29sbGVjdGlvbkRpZmZlcmVuY2VzKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGlzcGxheSB0aGUgZmFpbHVyZSBpbmZvcm1hdGlvbiBmb3IgdHdvIGNvbGxlY3Rpb25zIHRoYXQgZGlkIG5vdCBtYXRjaC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIE1lc3NhZ2VXcml0ZXIgb24gd2hpY2ggdG8gZGlzcGxheTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgY29sbGVjdGlvbi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgY29sbGVjdGlvbjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlcHRoIj5UaGUgZGVwdGggb2YgdGhpcyBmYWlsdXJlIGluIGEgc2V0IG9mIG5lc3RlZCBjb2xsZWN0aW9uczwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50LkRpc3BsYXlDb2xsZWN0aW9uVHlwZXNBbmRTaXplcyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcixTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERpc3BsYXlzIGEgc2luZ2xlIGxpbmUgc2hvd2luZyB0aGUgdHlwZXMgYW5kIHNpemVzIG9mIHRoZSBleHBlY3RlZA0KKyAgICAgICAgICAgIGFuZCBhY3R1YWwgY29sbGVjdGlvbnMgb3IgYXJyYXlzLiBJZiBib3RoIGFyZSBpZGVudGljYWwsIHRoZSB2YWx1ZSBpcyANCisgICAgICAgICAgICBvbmx5IHNob3duIG9uY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPlRoZSBNZXNzYWdlV3JpdGVyIG9uIHdoaWNoIHRvIGRpc3BsYXk8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIGNvbGxlY3Rpb24gb3IgYXJyYXk8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgY29sbGVjdGlvbiBvciBhcnJheTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImluZGVudCI+VGhlIGluZGVudGF0aW9uIGxldmVsIGZvciB0aGUgbWVzc2FnZSBsaW5lPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnQuRGlzcGxheUZhaWx1cmVQb2ludChOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcixTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5JbnQzMixTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEaXNwbGF5cyBhIHNpbmdsZSBsaW5lIHNob3dpbmcgdGhlIHBvaW50IGluIHRoZSBleHBlY3RlZCBhbmQgYWN0dWFsDQorICAgICAgICAgICAgYXJyYXlzIGF0IHdoaWNoIHRoZSBjb21wYXJpc29uIGZhaWxlZC4gSWYgdGhlIGFycmF5cyBoYXZlIGRpZmZlcmVudA0KKyAgICAgICAgICAgIHN0cnVjdHVyZXMgb3IgZGltZW5zaW9ucywgYm90aCB2YWx1ZXMgYXJlIHNob3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgTWVzc2FnZVdyaXRlciBvbiB3aGljaCB0byBkaXNwbGF5PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBhcnJheTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCBhcnJheTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZhaWx1cmVQb2ludCI+SW5kZXggb2YgdGhlIGZhaWx1cmUgcG9pbnQgaW4gdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbnM8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbmRlbnQiPlRoZSBpbmRlbnRhdGlvbiBsZXZlbCBmb3IgdGhlIG1lc3NhZ2UgbGluZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50Lklnbm9yZUNhc2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZsYWcgdGhlIGNvbnN0cmFpbnQgdG8gaWdub3JlIGNhc2UgYW5kIHJldHVybiBzZWxmLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnQuTm9DbGlwIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBGbGFnIHRoZSBjb25zdHJhaW50IHRvIHN1cHByZXNzIHN0cmluZyBjbGlwcGluZyANCisgICAgICAgICAgICBhbmQgcmV0dXJuIHNlbGYuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludC5Bc0NvbGxlY3Rpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEZsYWcgdGhlIGNvbnN0cmFpbnQgdG8gY29tcGFyZSBhcnJheXMgYXMgY29sbGVjdGlvbnMNCisgICAgICAgICAgICBhbmQgcmV0dXJuIHNlbGYuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludC5VbHBzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTd2l0Y2hlcyB0aGUgLldpdGhpbigpIG1vZGlmaWVyIHRvIGludGVycHJldCBpdHMgdG9sZXJhbmNlIGFzDQorICAgICAgICAgICAgYSBkaXN0YW5jZSBpbiByZXByZXNlbnRhYmxlIHZhbHVlcyAoc2VlIHJlbWFya3MpLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5TZWxmLjwvcmV0dXJucz4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICBVbHAgc3RhbmRzIGZvciAidW5pdCBpbiB0aGUgbGFzdCBwbGFjZSIgYW5kIGRlc2NyaWJlcyB0aGUgbWluaW11bQ0KKyAgICAgICAgICAgIGFtb3VudCBhIGdpdmVuIHZhbHVlIGNhbiBjaGFuZ2UuIEZvciBhbnkgaW50ZWdlcnMsIGFuIHVscCBpcyAxIHdob2xlDQorICAgICAgICAgICAgZGlnaXQuIEZvciBmbG9hdGluZyBwb2ludCB2YWx1ZXMsIHRoZSBhY2N1cmFjeSBvZiB3aGljaCBpcyBiZXR0ZXINCisgICAgICAgICAgICBmb3Igc21hbGxlciBudW1iZXJzIGFuZCB3b3JzZSBmb3IgbGFyZ2VyIG51bWJlcnMsIGFuIHVscCBkZXBlbmRzDQorICAgICAgICAgICAgb24gdGhlIHNpemUgb2YgdGhlIG51bWJlci4gVXNpbmcgdWxwcyBmb3IgY29tcGFyaXNvbiBvZiBmbG9hdGluZw0KKyAgICAgICAgICAgIHBvaW50IHJlc3VsdHMgaW5zdGVhZCBvZiBmaXhlZCB0b2xlcmFuY2VzIGlzIHNhZmVyIGJlY2F1c2UgaXQgd2lsbA0KKyAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgY29tcGVuc2F0ZSBmb3IgdGhlIGFkZGVkIGluYWNjdXJhY3kgb2YgbGFyZ2VyIG51bWJlcnMuDQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludC5QZXJjZW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTd2l0Y2hlcyB0aGUgLldpdGhpbigpIG1vZGlmaWVyIHRvIGludGVycHJldCBpdHMgdG9sZXJhbmNlIGFzDQorICAgICAgICAgICAgYSBwZXJjZW50YWdlIHRoYXQgdGhlIGFjdHVhbCB2YWx1ZXMgaXMgYWxsb3dlZCB0byBkZXZpYXRlIGZyb20NCisgICAgICAgICAgICB0aGUgZXhwZWN0ZWQgdmFsdWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlNlbGY8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50LkRheXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhdXNlcyB0aGUgdG9sZXJhbmNlIHRvIGJlIGludGVycHJldGVkIGFzIGEgVGltZVNwYW4gaW4gZGF5cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+U2VsZjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnQuSG91cnMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhdXNlcyB0aGUgdG9sZXJhbmNlIHRvIGJlIGludGVycHJldGVkIGFzIGEgVGltZVNwYW4gaW4gaG91cnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlNlbGY8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50Lk1pbnV0ZXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhdXNlcyB0aGUgdG9sZXJhbmNlIHRvIGJlIGludGVycHJldGVkIGFzIGEgVGltZVNwYW4gaW4gbWludXRlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+U2VsZjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnQuU2Vjb25kcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2F1c2VzIHRoZSB0b2xlcmFuY2UgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSBUaW1lU3BhbiBpbiBzZWNvbmRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5TZWxmPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludC5NaWxsaXNlY29uZHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENhdXNlcyB0aGUgdG9sZXJhbmNlIHRvIGJlIGludGVycHJldGVkIGFzIGEgVGltZVNwYW4gaW4gbWlsbGlzZWNvbmRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5TZWxmPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludC5UaWNrcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2F1c2VzIHRoZSB0b2xlcmFuY2UgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSBUaW1lU3BhbiBpbiBjbG9jayB0aWNrcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+U2VsZjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbGl0eUFkYXB0ZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEVxdWFsaXR5QWRhcHRlciBjbGFzcyBoYW5kbGVzIGFsbCBlcXVhbGl0eSBjb21wYXJpc29ucw0KKyAgICAgICAgICAgIHRoYXQgdXNlIGFuIElFcXVhbGl0eUNvbXBhcmVyLCBJRXF1YWxpdHlDb21wYXJlciZsdDtUJmd0Ow0KKyAgICAgICAgICAgIG9yIGEgQ29tcGFyaXNvbkFkYXB0ZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsaXR5QWRhcHRlci5PYmplY3RzRXF1YWwoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29tcGFyZXMgdHdvIG9iamVjdHMsIHJldHVybmluZyB0cnVlIGlmIHRoZXkgYXJlIGVxdWFsDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsaXR5QWRhcHRlci5Gb3IoU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYW4gRXF1YWxpdHlBZGFwdGVyIHRoYXQgd3JhcHMgYW4gSUNvbXBhcmVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbGl0eUFkYXB0ZXIuRm9yKFN5c3RlbS5Db2xsZWN0aW9ucy5JRXF1YWxpdHlDb21wYXJlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYW4gRXF1YWxpdHlBZGFwdGVyIHRoYXQgd3JhcHMgYW4gSUVxdWFsaXR5Q29tcGFyZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsaXR5QWRhcHRlci5Gb3JgYDEoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUVxdWFsaXR5Q29tcGFyZXJ7YGAwfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYW4gRXF1YWxpdHlBZGFwdGVyIHRoYXQgd3JhcHMgYW4gSUVxdWFsaXR5Q29tcGFyZXImbHQ7VCZndDsuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsaXR5QWRhcHRlci5Gb3JgYDEoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUNvbXBhcmVye2BgMH0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGFuIEVxdWFsaXR5QWRhcHRlciB0aGF0IHdyYXBzIGFuIElDb21wYXJlciZsdDtUJmd0Oy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxpdHlBZGFwdGVyLkZvcmBgMShTeXN0ZW0uQ29tcGFyaXNvbntgYDB9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhbiBFcXVhbGl0eUFkYXB0ZXIgdGhhdCB3cmFwcyBhIENvbXBhcmlzb24mbHQ7VCZndDsuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkZsb2F0aW5nUG9pbnROdW1lcmljcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+SGVscGVyIHJvdXRpbmVzIGZvciB3b3JraW5nIHdpdGggZmxvYXRpbmcgcG9pbnQgbnVtYmVyczwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICAgIDxwYXJhPg0KKyAgICAgICAgICAgICAgICBUaGUgZmxvYXRpbmcgcG9pbnQgY29tcGFyaXNvbiBjb2RlIGlzIGJhc2VkIG9uIHRoaXMgZXhjZWxsZW50IGFydGljbGU6DQorICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuY3lnbnVzLXNvZnR3YXJlLmNvbS9wYXBlcnMvY29tcGFyaW5nZmxvYXRzL2NvbXBhcmluZ2Zsb2F0cy5odG0NCisgICAgICAgICAgICAgIDwvcGFyYT4NCisgICAgICAgICAgICAgIDxwYXJhPg0KKyAgICAgICAgICAgICAgICAiVUxQIiBtZWFucyBVbml0IGluIHRoZSBMYXN0IFBsYWNlIGFuZCBpbiB0aGUgY29udGV4dCBvZiB0aGlzIGxpYnJhcnkgcmVmZXJzIHRvDQorICAgICAgICAgICAgICAgIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBhZGphY2VudCBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBJRUVFIGZsb2F0aW5nIHBvaW50DQorICAgICAgICAgICAgICAgIG51bWJlcnMgY2FuIG9ubHkgcmVwcmVzZW50IGEgZmluaXRlIHN1YnNldCBvZiBuYXR1cmFsIG51bWJlcnMsIHdpdGggZ3JlYXRlcg0KKyAgICAgICAgICAgICAgICBhY2N1cmFjeSBmb3Igc21hbGxlciBudW1iZXJzIGFuZCBsb3dlciBhY2N1cmFjeSBmb3IgdmVyeSBsYXJnZSBudW1iZXJzLg0KKyAgICAgICAgICAgICAgPC9wYXJhPg0KKyAgICAgICAgICAgICAgPHBhcmE+DQorICAgICAgICAgICAgICAgIElmIGEgY29tcGFyaXNvbiBpcyBhbGxvd2VkICIyIHVscHMiIG9mIGRldmlhdGlvbiwgdGhhdCBtZWFucyB0aGUgdmFsdWVzIGFyZQ0KKyAgICAgICAgICAgICAgICBhbGxvd2VkIHRvIGRldmlhdGUgYnkgdXAgdG8gMiBhZGphY2VudCBmbG9hdGluZyBwb2ludCB2YWx1ZXMsIHdoaWNoIG1pZ2h0IGJlDQorICAgICAgICAgICAgICAgIGFzIGxvdyBhcyAwLjAwMDAwMDEgZm9yIHNtYWxsIG51bWJlcnMgb3IgYXMgaGlnaCBhcyAxMC4wIGZvciBsYXJnZSBudW1iZXJzLg0KKyAgICAgICAgICAgICAgPC9wYXJhPg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5GbG9hdGluZ1BvaW50TnVtZXJpY3MuQXJlQWxtb3N0RXF1YWxVbHBzKFN5c3RlbS5TaW5nbGUsU3lzdGVtLlNpbmdsZSxTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT5Db21wYXJlcyB0d28gZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGZvciBlcXVhbGl0eTwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibGVmdCI+Rmlyc3QgZmxvYXRpbmcgcG9pbnQgdmFsdWUgdG8gYmUgY29tcGFyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyaWdodCI+U2Vjb25kIGZsb2F0aW5nIHBvaW50IHZhbHVlIHQgYmUgY29tcGFyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtYXhVbHBzIj4NCisgICAgICAgICAgICAgIE1heGltdW0gbnVtYmVyIG9mIHJlcHJlc2VudGFibGUgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIHRoYXQgYXJlIGFsbG93ZWQgdG8NCisgICAgICAgICAgICAgIGJlIGJldHdlZW4gdGhlIGxlZnQgYW5kIHRoZSByaWdodCBmbG9hdGluZyBwb2ludCB2YWx1ZXMNCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgaWYgYm90aCBudW1iZXJzIGFyZSBlcXVhbCBvciBjbG9zZSB0byBiZWluZyBlcXVhbDwvcmV0dXJucz4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICAgIDxwYXJhPg0KKyAgICAgICAgICAgICAgICBGbG9hdGluZyBwb2ludCB2YWx1ZXMgY2FuIG9ubHkgcmVwcmVzZW50IGEgZmluaXRlIHN1YnNldCBvZiBuYXR1cmFsIG51bWJlcnMuDQorICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgdmFsdWVzIDIuMDAwMDAwMDAgYW5kIDIuMDAwMDAwMjQgY2FuIGJlIHN0b3JlZCBpbiBhIGZsb2F0LA0KKyAgICAgICAgICAgICAgICBidXQgbm90aGluZyBpbmJldHdlZW4gdGhlbS4NCisgICAgICAgICAgICAgIDwvcGFyYT4NCisgICAgICAgICAgICAgIDxwYXJhPg0KKyAgICAgICAgICAgICAgICBUaGlzIGNvbXBhcmlzb24gd2lsbCBjb3VudCBob3cgbWFueSBwb3NzaWJsZSBmbG9hdGluZyBwb2ludCB2YWx1ZXMgYXJlIGJldHdlZW4NCisgICAgICAgICAgICAgICAgdGhlIGxlZnQgYW5kIHRoZSByaWdodCBudW1iZXIuIElmIHRoZSBudW1iZXIgb2YgcG9zc2libGUgdmFsdWVzIGJldHdlZW4gYm90aA0KKyAgICAgICAgICAgICAgICBudW1iZXJzIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBtYXhVbHBzLCB0aGVuIHRoZSBudW1iZXJzIGFyZSBjb25zaWRlcmVkIGFzDQorICAgICAgICAgICAgICAgIGJlaW5nIGVxdWFsLg0KKyAgICAgICAgICAgICAgPC9wYXJhPg0KKyAgICAgICAgICAgICAgPHBhcmE+DQorICAgICAgICAgICAgICAgIEltcGxlbWVudGF0aW9uIHBhcnRpYWxseSBmb2xsb3dzIHRoZSBjb2RlIG91dGxpbmVkIGhlcmU6DQorICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYW50dGlydC5uZXQvMjAwNy8wOC8xOS9wcm9wZXItZmxvYXRpbmctcG9pbnQtY29tcGFyaXNvbnMvDQorICAgICAgICAgICAgICA8L3BhcmE+DQorICAgICAgICAgICAgPC9yZW1hcmtzPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkZsb2F0aW5nUG9pbnROdW1lcmljcy5BcmVBbG1vc3RFcXVhbFVscHMoU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlLFN5c3RlbS5JbnQ2NCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5PkNvbXBhcmVzIHR3byBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlcyBmb3IgZXF1YWxpdHk8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImxlZnQiPkZpcnN0IGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUgdG8gYmUgY29tcGFyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyaWdodCI+U2Vjb25kIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUgdCBiZSBjb21wYXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1heFVscHMiPg0KKyAgICAgICAgICAgICAgTWF4aW11bSBudW1iZXIgb2YgcmVwcmVzZW50YWJsZSBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlcyB0aGF0IGFyZQ0KKyAgICAgICAgICAgICAgYWxsb3dlZCB0byBiZSBiZXR3ZWVuIHRoZSBsZWZ0IGFuZCB0aGUgcmlnaHQgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZXMNCisgICAgICAgICAgICA8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgaWYgYm90aCBudW1iZXJzIGFyZSBlcXVhbCBvciBjbG9zZSB0byBiZWluZyBlcXVhbDwvcmV0dXJucz4NCisgICAgICAgICAgICA8cmVtYXJrcz4NCisgICAgICAgICAgICAgIDxwYXJhPg0KKyAgICAgICAgICAgICAgICBEb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlcyBjYW4gb25seSByZXByZXNlbnQgYSBsaW1pdGVkIHNlcmllcyBvZg0KKyAgICAgICAgICAgICAgICBuYXR1cmFsIG51bWJlcnMuIEZvciBleGFtcGxlLCB0aGUgdmFsdWVzIDIuMDAwMDAwMDAwMDAwMDAwMCBhbmQgMi4wMDAwMDAwMDAwMDAwMDA0DQorICAgICAgICAgICAgICAgIGNhbiBiZSBzdG9yZWQgaW4gYSBkb3VibGUsIGJ1dCBub3RoaW5nIGluYmV0d2VlbiB0aGVtLg0KKyAgICAgICAgICAgICAgPC9wYXJhPg0KKyAgICAgICAgICAgICAgPHBhcmE+DQorICAgICAgICAgICAgICAgIFRoaXMgY29tcGFyaXNvbiB3aWxsIGNvdW50IGhvdyBtYW55IHBvc3NpYmxlIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQNCisgICAgICAgICAgICAgICAgdmFsdWVzIGFyZSBiZXR3ZWVuIHRoZSBsZWZ0IGFuZCB0aGUgcmlnaHQgbnVtYmVyLiBJZiB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlDQorICAgICAgICAgICAgICAgIHZhbHVlcyBiZXR3ZWVuIGJvdGggbnVtYmVycyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWF4VWxwcywgdGhlbiB0aGUgbnVtYmVycw0KKyAgICAgICAgICAgICAgICBhcmUgY29uc2lkZXJlZCBhcyBiZWluZyBlcXVhbC4NCisgICAgICAgICAgICAgIDwvcGFyYT4NCisgICAgICAgICAgICAgIDxwYXJhPg0KKyAgICAgICAgICAgICAgICBJbXBsZW1lbnRhdGlvbiBwYXJ0aWFsbHkgZm9sbG93cyB0aGUgY29kZSBvdXRsaW5lZCBoZXJlOg0KKyAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFudHRpcnQubmV0LzIwMDcvMDgvMTkvcHJvcGVyLWZsb2F0aW5nLXBvaW50LWNvbXBhcmlzb25zLw0KKyAgICAgICAgICAgICAgPC9wYXJhPg0KKyAgICAgICAgICAgIDwvcmVtYXJrcz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5GbG9hdGluZ1BvaW50TnVtZXJpY3MuUmVpbnRlcnByZXRBc0ludChTeXN0ZW0uU2luZ2xlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgICBSZWludGVycHJldHMgdGhlIG1lbW9yeSBjb250ZW50cyBvZiBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIGFzIGFuIGludGVnZXIgdmFsdWUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj4NCisgICAgICAgICAgICAgIEZsb2F0aW5nIHBvaW50IHZhbHVlIHdob3NlIG1lbW9yeSBjb250ZW50cyB0byByZWludGVycHJldA0KKyAgICAgICAgICAgIDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+DQorICAgICAgICAgICAgICBUaGUgbWVtb3J5IGNvbnRlbnRzIG9mIHRoZSBmbG9hdGluZyBwb2ludCB2YWx1ZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyDQorICAgICAgICAgICAgPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkZsb2F0aW5nUG9pbnROdW1lcmljcy5SZWludGVycHJldEFzTG9uZyhTeXN0ZW0uRG91YmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgICBSZWludGVycHJldHMgdGhlIG1lbW9yeSBjb250ZW50cyBvZiBhIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQNCisgICAgICAgICAgICAgIHZhbHVlIGFzIGFuIGludGVnZXIgdmFsdWUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbHVlIj4NCisgICAgICAgICAgICAgIERvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUgd2hvc2UgbWVtb3J5IGNvbnRlbnRzIHRvIHJlaW50ZXJwcmV0DQorICAgICAgICAgICAgPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICAgIFRoZSBtZW1vcnkgY29udGVudHMgb2YgdGhlIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUNCisgICAgICAgICAgICAgIGludGVycHJldGVkIGFzIGFuIGludGVnZXINCisgICAgICAgICAgICA8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRmxvYXRpbmdQb2ludE51bWVyaWNzLlJlaW50ZXJwcmV0QXNGbG9hdChTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICAgIFJlaW50ZXJwcmV0cyB0aGUgbWVtb3J5IGNvbnRlbnRzIG9mIGFuIGludGVnZXIgYXMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPkludGVnZXIgdmFsdWUgd2hvc2UgbWVtb3J5IGNvbnRlbnRzIHRvIHJlaW50ZXJwcmV0PC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICAgIFRoZSBtZW1vcnkgY29udGVudHMgb2YgdGhlIGludGVnZXIgdmFsdWUgaW50ZXJwcmV0ZWQgYXMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZQ0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5GbG9hdGluZ1BvaW50TnVtZXJpY3MuUmVpbnRlcnByZXRBc0RvdWJsZShTeXN0ZW0uSW50NjQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICAgIFJlaW50ZXJwcmV0cyB0aGUgbWVtb3J5IGNvbnRlbnRzIG9mIGFuIGludGVnZXIgdmFsdWUgYXMgYSBkb3VibGUgcHJlY2lzaW9uDQorICAgICAgICAgICAgICBmbG9hdGluZyBwb2ludCB2YWx1ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsdWUiPkludGVnZXIgd2hvc2UgbWVtb3J5IGNvbnRlbnRzIHRvIHJlaW50ZXJwcmV0PC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4NCisgICAgICAgICAgICAgIFRoZSBtZW1vcnkgY29udGVudHMgb2YgdGhlIGludGVnZXIgaW50ZXJwcmV0ZWQgYXMgYSBkb3VibGUgcHJlY2lzaW9uDQorICAgICAgICAgICAgICBmbG9hdGluZyBwb2ludCB2YWx1ZQ0KKyAgICAgICAgICAgIDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5GbG9hdGluZ1BvaW50TnVtZXJpY3MuRmxvYXRJbnRVbmlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+VW5pb24gb2YgYSBmbG9hdGluZyBwb2ludCB2YXJpYWJsZSBhbmQgYW4gaW50ZWdlcjwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5GbG9hdGluZ1BvaW50TnVtZXJpY3MuRmxvYXRJbnRVbmlvbi5GbG9hdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+VGhlIHVuaW9uJ3MgdmFsdWUgYXMgYSBmbG9hdGluZyBwb2ludCB2YXJpYWJsZTwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5GbG9hdGluZ1BvaW50TnVtZXJpY3MuRmxvYXRJbnRVbmlvbi5JbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5PlRoZSB1bmlvbidzIHZhbHVlIGFzIGFuIGludGVnZXI8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRmxvYXRpbmdQb2ludE51bWVyaWNzLkZsb2F0SW50VW5pb24uVUludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+VGhlIHVuaW9uJ3MgdmFsdWUgYXMgYW4gdW5zaWduZWQgaW50ZWdlcjwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5GbG9hdGluZ1BvaW50TnVtZXJpY3MuRG91YmxlTG9uZ1VuaW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT5VbmlvbiBvZiBhIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFyaWFibGUgYW5kIGEgbG9uZzwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5GbG9hdGluZ1BvaW50TnVtZXJpY3MuRG91YmxlTG9uZ1VuaW9uLkRvdWJsZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+VGhlIHVuaW9uJ3MgdmFsdWUgYXMgYSBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhcmlhYmxlPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkZsb2F0aW5nUG9pbnROdW1lcmljcy5Eb3VibGVMb25nVW5pb24uTG9uZyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+VGhlIHVuaW9uJ3MgdmFsdWUgYXMgYSBsb25nPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkZsb2F0aW5nUG9pbnROdW1lcmljcy5Eb3VibGVMb25nVW5pb24uVUxvbmciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5PlRoZSB1bmlvbidzIHZhbHVlIGFzIGFuIHVuc2lnbmVkIGxvbmc8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTWVzc2FnZVdyaXRlciBpcyB0aGUgYWJzdHJhY3QgYmFzZSBmb3IgY2xhc3NlcyB0aGF0IHdyaXRlDQorICAgICAgICAgICAgY29uc3RyYWludCBkZXNjcmlwdGlvbnMgYW5kIG1lc3NhZ2VzIGluIHNvbWUgZm9ybS4gVGhlDQorICAgICAgICAgICAgY2xhc3MgaGFzIHNlcGFyYXRlIG1ldGhvZHMgZm9yIHdyaXRpbmcgdmFyaW91cyBjb21wb25lbnRzDQorICAgICAgICAgICAgb2YgYSBtZXNzYWdlLCBhbGxvd2luZyBpbXBsZW1lbnRhdGlvbnMgdG8gdGFpbG9yIHRoZQ0KKyAgICAgICAgICAgIHByZXNlbnRhdGlvbiBhcyBuZWVkZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIE1lc3NhZ2VXcml0ZXIgZ2l2ZW4gYSBjdWx0dXJlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIuV3JpdGVNZXNzYWdlTGluZShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1ldGhvZCB0byB3cml0ZSBzaW5nbGUgbGluZSAgbWVzc2FnZSB3aXRoIG9wdGlvbmFsIGFyZ3MsIHVzdWFsbHkNCisgICAgICAgICAgICB3cml0dGVuIHRvIHByZWNlZGUgdGhlIGdlbmVyYWwgZmFpbHVyZSBtZXNzYWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gYmUgd3JpdHRlbjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFueSBhcmd1bWVudHMgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyLldyaXRlTWVzc2FnZUxpbmUoU3lzdGVtLkludDMyLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTWV0aG9kIHRvIHdyaXRlIHNpbmdsZSBsaW5lICBtZXNzYWdlIHdpdGggb3B0aW9uYWwgYXJncywgdXN1YWxseQ0KKyAgICAgICAgICAgIHdyaXR0ZW4gdG8gcHJlY2VkZSB0aGUgZ2VuZXJhbCBmYWlsdXJlIG1lc3NhZ2UsIGF0IGEgZ2l2ZWwgDQorICAgICAgICAgICAgaW5kZW50YXRpb24gbGV2ZWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJsZXZlbCI+VGhlIGluZGVudGF0aW9uIGxldmVsIG9mIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gYmUgd3JpdHRlbjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFueSBhcmd1bWVudHMgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyLkRpc3BsYXlEaWZmZXJlbmNlcyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERpc3BsYXkgRXhwZWN0ZWQgYW5kIEFjdHVhbCBsaW5lcyBmb3IgYSBjb25zdHJhaW50LiBUaGlzDQorICAgICAgICAgICAgaXMgY2FsbGVkIGJ5IE1lc3NhZ2VXcml0ZXIncyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIA0KKyAgICAgICAgICAgIFdyaXRlTWVzc2FnZVRvIGFuZCBwcm92aWRlcyB0aGUgZ2VuZXJpYyB0d28tbGluZSBkaXNwbGF5LiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbnN0cmFpbnQiPlRoZSBjb25zdHJhaW50IHRoYXQgZmFpbGVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyLkRpc3BsYXlEaWZmZXJlbmNlcyhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEaXNwbGF5IEV4cGVjdGVkIGFuZCBBY3R1YWwgbGluZXMgZm9yIGdpdmVuIHZhbHVlcy4gVGhpcw0KKyAgICAgICAgICAgIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGJ5IGNvbnN0cmFpbnRzIHRoYXQgbmVlZCBtb3JlIGNvbnRyb2wgb3Zlcg0KKyAgICAgICAgICAgIHRoZSBkaXNwbGF5IG9mIGFjdHVhbCBhbmQgZXhwZWN0ZWQgdmFsdWVzIHRoYW4gaXMgcHJvdmlkZWQNCisgICAgICAgICAgICBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWUgY2F1c2luZyB0aGUgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlci5EaXNwbGF5RGlmZmVyZW5jZXMoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0LE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ub2xlcmFuY2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEaXNwbGF5IEV4cGVjdGVkIGFuZCBBY3R1YWwgbGluZXMgZm9yIGdpdmVuIHZhbHVlcywgaW5jbHVkaW5nDQorICAgICAgICAgICAgYSB0b2xlcmFuY2UgdmFsdWUgb24gdGhlIEV4cGVjdGVkIGxpbmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlIGNhdXNpbmcgdGhlIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0b2xlcmFuY2UiPlRoZSB0b2xlcmFuY2Ugd2l0aGluIHdoaWNoIHRoZSB0ZXN0IHdhcyBtYWRlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyLkRpc3BsYXlTdHJpbmdEaWZmZXJlbmNlcyhTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLkludDMyLFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5Cb29sZWFuKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGlzcGxheSB0aGUgZXhwZWN0ZWQgYW5kIGFjdHVhbCBzdHJpbmcgdmFsdWVzIG9uIHNlcGFyYXRlIGxpbmVzLg0KKyAgICAgICAgICAgIElmIHRoZSBtaXNtYXRjaCBwYXJhbWV0ZXIgaXMgPj0wLCBhbiBhZGRpdGlvbmFsIGxpbmUgaXMgZGlzcGxheWVkDQorICAgICAgICAgICAgbGluZSBjb250YWluaW5nIGEgY2FyZXQgdGhhdCBwb2ludHMgdG8gdGhlIG1pc21hdGNoIHBvaW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmcgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgc3RyaW5nIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWlzbWF0Y2giPlRoZSBwb2ludCBhdCB3aGljaCB0aGUgc3RyaW5ncyBkb24ndCBtYXRjaCBvciAtMTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imlnbm9yZUNhc2UiPklmIHRydWUsIGNhc2UgaXMgaWdub3JlZCBpbiBsb2NhdGluZyB0aGUgcG9pbnQgd2hlcmUgdGhlIHN0cmluZ3MgZGlmZmVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2xpcHBpbmciPklmIHRydWUsIHRoZSBzdHJpbmdzIHNob3VsZCBiZSBjbGlwcGVkIHRvIGZpdCB0aGUgbGluZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlci5Xcml0ZUNvbm5lY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGVzIHRoZSB0ZXh0IGZvciBhIGNvbm5lY3Rvci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbm5lY3RvciI+VGhlIGNvbm5lY3Rvci48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIuV3JpdGVQcmVkaWNhdGUoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlcyB0aGUgdGV4dCBmb3IgYSBwcmVkaWNhdGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwcmVkaWNhdGUiPlRoZSBwcmVkaWNhdGUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyLldyaXRlRXhwZWN0ZWRWYWx1ZShTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGVzIHRoZSB0ZXh0IGZvciBhbiBleHBlY3RlZCB2YWx1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyLldyaXRlTW9kaWZpZXIoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlcyB0aGUgdGV4dCBmb3IgYSBtb2RpZmllcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibW9kaWZpZXIiPlRoZSBtb2RpZmllci48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIuV3JpdGVBY3R1YWxWYWx1ZShTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGVzIHRoZSB0ZXh0IGZvciBhbiBhY3R1YWwgdmFsdWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyLldyaXRlVmFsdWUoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlcyB0aGUgdGV4dCBmb3IgYSBnZW5lcmFsaXplZCB2YWx1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InZhbCI+VGhlIHZhbHVlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlci5Xcml0ZUNvbGxlY3Rpb25FbGVtZW50cyhTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkludDMyLFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlcyB0aGUgdGV4dCBmb3IgYSBjb2xsZWN0aW9uIHZhbHVlLA0KKyAgICAgICAgICAgIHN0YXJ0aW5nIGF0IGEgcGFydGljdWxhciBwb2ludCwgdG8gYSBtYXggbGVuZ3RoDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5UaGUgY29sbGVjdGlvbiBjb250YWluaW5nIGVsZW1lbnRzIHRvIHdyaXRlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN0YXJ0Ij5UaGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGVsZW1lbnRzIHRvIHdyaXRlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWF4Ij5UaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gd3JpdGU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIuTWF4TGluZUxlbmd0aCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQWJzdHJhY3QgbWV0aG9kIHRvIGdldCB0aGUgbWF4IGxpbmUgbGVuZ3RoDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdGF0aWMgbWV0aG9kcyB1c2VkIGluIGNyZWF0aW5nIG1lc3NhZ2VzDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxzLkVMTElQU0lTIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTdGF0aWMgc3RyaW5nIHVzZWQgd2hlbiBzdHJpbmdzIGFyZSBjbGlwcGVkDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxzLkdldFR5cGVSZXByZXNlbnRhdGlvbihTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYSB0eXBlIGFzIHVzZWQgaW4gTlVuaXRMaXRlLg0KKyAgICAgICAgICAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgVHlwZS5Ub1N0cmluZygpIGV4Y2VwdCBmb3IgYXJyYXlzLA0KKyAgICAgICAgICAgIHdoaWNoIGFyZSBkaXNwbGF5ZWQgd2l0aCB0aGVpciBkZWNsYXJlZCBzaXplcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im9iaiI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTXNnVXRpbHMuRXNjYXBlQ29udHJvbENoYXJzKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb252ZXJ0cyBhbnkgY29udHJvbCBjaGFyYWN0ZXJzIGluIGEgc3RyaW5nIA0KKyAgICAgICAgICAgIHRvIHRoZWlyIGVzY2FwZWQgcmVwcmVzZW50YXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzIj5UaGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIGNvbnZlcnRlZCBzdHJpbmc8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTXNnVXRpbHMuR2V0QXJyYXlJbmRpY2VzQXNTdHJpbmcoU3lzdGVtLkludDMyW10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm4gdGhlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciBhIHNldCBvZiBpbmRpY2VzIGludG8gYW4gYXJyYXkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImluZGljZXMiPkFycmF5IG9mIGluZGljZXMgZm9yIHdoaWNoIGEgc3RyaW5nIGlzIG5lZWRlZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTXNnVXRpbHMuR2V0QXJyYXlJbmRpY2VzRnJvbUNvbGxlY3Rpb25JbmRleChTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IGFuIGFycmF5IG9mIGluZGljZXMgcmVwcmVzZW50aW5nIHRoZSBwb2ludCBpbiBhIGNvbGxlY3Rpb24gb3INCisgICAgICAgICAgICBhcnJheSBjb3JyZXNwb25kaW5nIHRvIGEgc2luZ2xlIGludCBpbmRleCBpbnRvIHRoZSBjb2xsZWN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+VGhlIGNvbGxlY3Rpb24gdG8gd2hpY2ggdGhlIGluZGljZXMgYXBwbHk8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbmRleCI+SW5kZXggaW4gdGhlIGNvbGxlY3Rpb248L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPkFycmF5IG9mIGluZGljZXM8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTXNnVXRpbHMuQ2xpcFN0cmluZyhTeXN0ZW0uU3RyaW5nLFN5c3RlbS5JbnQzMixTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDbGlwIGEgc3RyaW5nIHRvIGEgZ2l2ZW4gbGVuZ3RoLCBzdGFydGluZyBhdCBhIHBhcnRpY3VsYXIgb2Zmc2V0LCByZXR1cm5pbmcgdGhlIGNsaXBwZWQNCisgICAgICAgICAgICBzdHJpbmcgd2l0aCBlbGxpcHNlcyByZXByZXNlbnRpbmcgdGhlIHJlbW92ZWQgcGFydHMNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InMiPlRoZSBzdHJpbmcgdG8gYmUgY2xpcHBlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1heFN0cmluZ0xlbmd0aCI+VGhlIG1heGltdW0gcGVybWl0dGVkIGxlbmd0aCBvZiB0aGUgcmVzdWx0IHN0cmluZzwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNsaXBTdGFydCI+VGhlIHBvaW50IGF0IHdoaWNoIHRvIHN0YXJ0IGNsaXBwaW5nPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgY2xpcHBlZCBzdHJpbmc8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTXNnVXRpbHMuQ2xpcEV4cGVjdGVkQW5kQWN0dWFsKFN5c3RlbS5TdHJpbmdALFN5c3RlbS5TdHJpbmdALFN5c3RlbS5JbnQzMixTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDbGlwIHRoZSBleHBlY3RlZCBhbmQgYWN0dWFsIHN0cmluZ3MgaW4gYSBjb29yZGluYXRlZCBmYXNoaW9uLCANCisgICAgICAgICAgICBzbyB0aGF0IHRoZXkgbWF5IGJlIGRpc3BsYXllZCB0b2dldGhlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1heERpc3BsYXlMZW5ndGgiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1pc21hdGNoIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxzLkZpbmRNaXNtYXRjaFBvc2l0aW9uKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uSW50MzIsU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTaG93cyB0aGUgcG9zaXRpb24gdHdvIHN0cmluZ3Mgc3RhcnQgdG8gZGlmZmVyLiAgQ29tcGFyaXNvbiANCisgICAgICAgICAgICBzdGFydHMgYXQgdGhlIHN0YXJ0IGluZGV4Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgc3RyaW5nPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXN0YXJ0Ij5UaGUgaW5kZXggaW4gdGhlIHN0cmluZ3MgYXQgd2hpY2ggY29tcGFyaXNvbiBzaG91bGQgc3RhcnQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpZ25vcmVDYXNlIj5Cb29sZWFuIGluZGljYXRpbmcgd2hldGhlciBjYXNlIHNob3VsZCBiZSBpZ25vcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz4tMSBpZiBubyBtaXNtYXRjaCBmb3VuZCwgb3IgdGhlIGluZGV4IHdoZXJlIG1pc21hdGNoIGZvdW5kPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgTnVtZXJpY3MgY2xhc3MgY29udGFpbnMgY29tbW9uIG9wZXJhdGlvbnMgb24gbnVtZXJpYyB2YWx1ZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzLklzTnVtZXJpY1R5cGUoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENoZWNrcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LCByZXR1cm5pbmcgdHJ1ZSBpZg0KKyAgICAgICAgICAgIHRoZSBvYmplY3QgaXMgYSBudW1lcmljIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJvYmoiPlRoZSBvYmplY3QgdG8gY2hlY2s8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPnRydWUgaWYgdGhlIG9iamVjdCBpcyBhIG51bWVyaWMgdHlwZTwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdW1lcmljcy5Jc0Zsb2F0aW5nUG9pbnROdW1lcmljKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDaGVja3MgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCwgcmV0dXJuaW5nIHRydWUgaWYNCisgICAgICAgICAgICB0aGUgb2JqZWN0IGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtZXJpYyB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ib2JqIj5UaGUgb2JqZWN0IHRvIGNoZWNrPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz50cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBmbG9hdGluZyBwb2ludCBudW1lcmljIHR5cGU8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVtZXJpY3MuSXNGaXhlZFBvaW50TnVtZXJpYyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ2hlY2tzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QsIHJldHVybmluZyB0cnVlIGlmDQorICAgICAgICAgICAgdGhlIG9iamVjdCBpcyBhIGZpeGVkIHBvaW50IG51bWVyaWMgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im9iaiI+VGhlIG9iamVjdCB0byBjaGVjazwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+dHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZml4ZWQgcG9pbnQgbnVtZXJpYyB0eXBlPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzLkFyZUVxdWFsKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVG9sZXJhbmNlQCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3QgdHdvIG51bWVyaWMgdmFsdWVzIGZvciBlcXVhbGl0eSwgcGVyZm9ybWluZyB0aGUgdXN1YWwgbnVtZXJpYyANCisgICAgICAgICAgICBjb252ZXJzaW9ucyBhbmQgdXNpbmcgYSBwcm92aWRlZCBvciBkZWZhdWx0IHRvbGVyYW5jZS4gSWYgdGhlIHRvbGVyYW5jZSANCisgICAgICAgICAgICBwcm92aWRlZCBpcyBFbXB0eSwgdGhpcyBtZXRob2QgbWF5IHNldCBpdCB0byBhIGRlZmF1bHQgdG9sZXJhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRvbGVyYW5jZSI+QSByZWZlcmVuY2UgdG8gdGhlIHRvbGVyYW5jZSBpbiBlZmZlY3Q8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgaWYgdGhlIHZhbHVlcyBhcmUgZXF1YWw8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVtZXJpY3MuQ29tcGFyZShTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb21wYXJlIHR3byBudW1lcmljIHZhbHVlcywgcGVyZm9ybWluZyB0aGUgdXN1YWwgbnVtZXJpYyBjb252ZXJzaW9ucy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRoZSByZWxhdGlvbnNoaXAgb2YgdGhlIHZhbHVlcyB0byBlYWNoIG90aGVyPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5Vbml0Q29tcGFyZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE5Vbml0Q29tcGFyZXIgZW5jYXBzdWxhdGVzIE5Vbml0J3MgZGVmYXVsdCBiZWhhdmlvcg0KKyAgICAgICAgICAgIGluIGNvbXBhcmluZyB0d28gb2JqZWN0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTlVuaXRDb21wYXJlci5Db21wYXJlKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbXBhcmVzIHR3byBvYmplY3RzDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ4Ij48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ5Ij48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OVW5pdENvbXBhcmVyLkRlZmF1bHQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgdGhlIGRlZmF1bHQgTlVuaXRDb21wYXJlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTlVuaXRFcXVhbGl0eUNvbXBhcmVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBOVW5pdEVxdWFsaXR5Q29tcGFyZXIgZW5jYXBzdWxhdGVzIE5Vbml0J3MgaGFuZGxpbmcgb2YNCisgICAgICAgICAgICBlcXVhbGl0eSB0ZXN0cyBiZXR3ZWVuIG9iamVjdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5Vbml0RXF1YWxpdHlDb21wYXJlci5jYXNlSW5zZW5zaXRpdmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIElmIHRydWUsIGFsbCBzdHJpbmcgY29tcGFyaXNvbnMgd2lsbCBpZ25vcmUgY2FzZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OVW5pdEVxdWFsaXR5Q29tcGFyZXIuY29tcGFyZUFzQ29sbGVjdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWYgdHJ1ZSwgYXJyYXlzIHdpbGwgYmUgdHJlYXRlZCBhcyBjb2xsZWN0aW9ucywgYWxsb3dpbmcNCisgICAgICAgICAgICB0aG9zZSBvZiBkaWZmZXJlbnQgZGltZW5zaW9ucyB0byBiZSBjb21wYXJlZA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OVW5pdEVxdWFsaXR5Q29tcGFyZXIudG9sZXJhbmNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJZiBub24temVybywgZXF1YWxpdHkgY29tcGFyaXNvbnMgd2l0aGluIHRoZSBzcGVjaWZpZWQgDQorICAgICAgICAgICAgdG9sZXJhbmNlIHdpbGwgc3VjY2VlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTlVuaXRFcXVhbGl0eUNvbXBhcmVyLmV4dGVybmFsQ29tcGFyZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbXBhcmlzb24gb2JqZWN0IHVzZWQgaW4gY29tcGFyaXNvbnMgZm9yIHNvbWUgY29uc3RyYWludHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5Vbml0RXF1YWxpdHlDb21wYXJlci5PYmplY3RzRXF1YWwoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29tcGFyZXMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OVW5pdEVxdWFsaXR5Q29tcGFyZXIuQXJyYXlzRXF1YWwoU3lzdGVtLkFycmF5LFN5c3RlbS5BcnJheSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhlbHBlciBtZXRob2QgdG8gY29tcGFyZSB0d28gYXJyYXlzDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5Vbml0RXF1YWxpdHlDb21wYXJlci5EaXJlY3Rvcmllc0VxdWFsKFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTWV0aG9kIHRvIGNvbXBhcmUgdHdvIERpcmVjdG9yeUluZm8gb2JqZWN0cw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ieCI+Zmlyc3QgZGlyZWN0b3J5IHRvIGNvbXBhcmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ5Ij5zZWNvbmQgZGlyZWN0b3J5IHRvIGNvbXBhcmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPnRydWUgaWYgZXF1aXZhbGVudCwgZmFsc2UgaWYgbm90PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5Vbml0RXF1YWxpdHlDb21wYXJlci5EZWZhdWx0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIHRoZSBkZWZhdWx0IE5Vbml0RXF1YWxpdHlDb21wYXJlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OVW5pdEVxdWFsaXR5Q29tcGFyZXIuSWdub3JlQ2FzZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhbmQgc2V0cyBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGNhc2Ugc2hvdWxkDQorICAgICAgICAgICAgYmUgaWdub3JlZCBpbiBkZXRlcm1pbmluZyBlcXVhbGl0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTlVuaXRFcXVhbGl0eUNvbXBhcmVyLkNvbXBhcmVBc0NvbGxlY3Rpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYW5kIHNldHMgYSBmbGFnIGluZGljYXRpbmcgdGhhdCBhcnJheXMgc2hvdWxkIGJlDQorICAgICAgICAgICAgY29tcGFyZWQgYXMgY29sbGVjdGlvbnMsIHdpdGhvdXQgcmVnYXJkIHRvIHRoZWlyIHNoYXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OVW5pdEVxdWFsaXR5Q29tcGFyZXIuRXh0ZXJuYWxDb21wYXJlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhbmQgc2V0cyBhbiBleHRlcm5hbCBjb21wYXJlciB0byBiZSB1c2VkIHRvDQorICAgICAgICAgICAgdGVzdCBmb3IgZXF1YWxpdHkuIEl0IGlzIGFwcGxpZWQgdG8gbWVtYmVycyBvZg0KKyAgICAgICAgICAgIGNvbGxlY3Rpb25zLCBpbiBwbGFjZSBvZiBOVW5pdCdzIG93biBsb2dpYy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTlVuaXRFcXVhbGl0eUNvbXBhcmVyLlRvbGVyYW5jZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhbmQgc2V0cyBhIHRvbGVyYW5jZSB1c2VkIHRvIGNvbXBhcmUgb2JqZWN0cyBvZiANCisgICAgICAgICAgICBjZXJ0aW4gdHlwZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5Vbml0RXF1YWxpdHlDb21wYXJlci5GYWlsdXJlUG9pbnRzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBsaXN0IG9mIGZhaWx1cmUgcG9pbnRzIGZvciB0aGUgbGFzdCBNYXRjaCBwZXJmb3JtZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlBhdGhDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQYXRoQ29uc3RyYWludCBzZXJ2ZXMgYXMgdGhlIGFic3RyYWN0IGJhc2Ugb2YgY29uc3RyYWludHMNCisgICAgICAgICAgICB0aGF0IG9wZXJhdGUgb24gcGF0aHMgYW5kIHByb3ZpZGVzIHNldmVyYWwgaGVscGVyIG1ldGhvZHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlBhdGhDb25zdHJhaW50LmV4cGVjdGVkUGF0aCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIGV4cGVjdGVkIHBhdGggdXNlZCBpbiB0aGUgY29uc3RyYWludA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5QYXRoQ29uc3RyYWludC5hY3R1YWxQYXRoIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgYWN0dWFsIHBhdGggYmVpbmcgdGVzdGVkDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlBhdGhDb25zdHJhaW50LmNhc2VJbnNlbnNpdGl2ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYSBjYXNlSW5zZW5zaXRpdmUgY29tcGFyaXNvbiBzaG91bGQgYmUgbWFkZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5QYXRoQ29uc3RyYWludC4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgUGF0aENvbnN0cmFpbnQgZm9yIGEgZ2l2ZSBleHBlY3RlZCBwYXRoDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHBhdGg8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlBhdGhDb25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2hldGhlciB0aGUgY29uc3RyYWludCBpcyBzYXRpc2ZpZWQgYnkgYSBnaXZlbiB2YWx1ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgdmFsdWUgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZTwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5QYXRoQ29uc3RyYWludC5Jc01hdGNoKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXhwZWN0ZWQgcGF0aCBhbmQgYWN0dWFsIHBhdGggbWF0Y2gNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUGF0aENvbnN0cmFpbnQuR2V0U3RyaW5nUmVwcmVzZW50YXRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0cmFpbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUGF0aENvbnN0cmFpbnQuQ2Fub25pY2FsaXplKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDYW5vbmljYWxpemUgdGhlIHByb3ZpZGVkIHBhdGgNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VGhlIHBhdGggaW4gc3RhbmRhcmRpemVkIGZvcm08L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUGF0aENvbnN0cmFpbnQuSXNTYW1lUGF0aChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IHdoZXRoZXIgdHdvIHBhdGhzIGFyZSB0aGUgc2FtZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGF0aDEiPlRoZSBmaXJzdCBwYXRoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGF0aDIiPlRoZSBzZWNvbmQgcGF0aDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Imlnbm9yZUNhc2UiPkluZGljYXRlcyB3aGV0aGVyIGNhc2Ugc2hvdWxkIGJlIGlnbm9yZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5QYXRoQ29uc3RyYWludC5Jc1N1YlBhdGgoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5Cb29sZWFuKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3aGV0aGVyIG9uZSBwYXRoIGlzIHVuZGVyIGFub3RoZXIgcGF0aA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGF0aDEiPlRoZSBmaXJzdCBwYXRoIC0gc3VwcG9zZWQgdG8gYmUgdGhlIHBhcmVudCBwYXRoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGF0aDIiPlRoZSBzZWNvbmQgcGF0aCAtIHN1cHBvc2VkIHRvIGJlIHRoZSBjaGlsZCBwYXRoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaWdub3JlQ2FzZSI+SW5kaWNhdGVzIHdoZXRoZXIgY2FzZSBzaG91bGQgYmUgaWdub3JlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlBhdGhDb25zdHJhaW50LklzU2FtZVBhdGhPclVuZGVyKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2hldGhlciBvbmUgcGF0aCBpcyB0aGUgc2FtZSBhcyBvciB1bmRlciBhbm90aGVyIHBhdGgNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgxIj5UaGUgZmlyc3QgcGF0aCAtIHN1cHBvc2VkIHRvIGJlIHRoZSBwYXJlbnQgcGF0aDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgyIj5UaGUgc2Vjb25kIHBhdGggLSBzdXBwb3NlZCB0byBiZSB0aGUgY2hpbGQgcGF0aDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlBhdGhDb25zdHJhaW50Lklnbm9yZUNhc2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1vZGlmaWVzIHRoZSBjdXJyZW50IGluc3RhbmNlIHRvIGJlIGNhc2UtaW5zZW5zaXR2ZQ0KKyAgICAgICAgICAgIGFuZCByZXR1cm5zIGl0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5QYXRoQ29uc3RyYWludC5SZXNwZWN0Q2FzZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTW9kaWZpZXMgdGhlIGN1cnJlbnQgaW5zdGFuY2UgdG8gYmUgY2FzZS1zZW5zaXR2ZQ0KKyAgICAgICAgICAgIGFuZCByZXR1cm5zIGl0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aENvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN1bW1hcnkgZGVzY3JpcHRpb24gZm9yIFNhbWVQYXRoQ29uc3RyYWludC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhDb25zdHJhaW50LiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUOlNhbWVQYXRoQ29uc3RyYWludCIvPiBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgcGF0aDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhDb25zdHJhaW50LklzTWF0Y2goU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBjb25zdHJhaW50IGlzIHNhdGlzZmllZCBieSBhIGdpdmVuIHZhbHVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZFBhdGgiPlRoZSBleHBlY3RlZCBwYXRoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsUGF0aCI+VGhlIGFjdHVhbCBwYXRoPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZTwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aENvbnN0cmFpbnQuV3JpdGVEZXNjcmlwdGlvblRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGNvbnN0cmFpbnQgZGVzY3JpcHRpb24gdG8gYSBNZXNzYWdlV3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPlRoZSB3cml0ZXIgb24gd2hpY2ggdGhlIGRlc2NyaXB0aW9uIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aENvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN1YlBhdGhDb25zdHJhaW50IHRlc3RzIHRoYXQgdGhlIGFjdHVhbCBwYXRoIGlzIHVuZGVyIHRoZSBleHBlY3RlZCBwYXRoDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YlBhdGhDb25zdHJhaW50LiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUOlN1YlBhdGhDb25zdHJhaW50Ii8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBwYXRoPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoQ29uc3RyYWludC5Jc01hdGNoKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2hldGhlciB0aGUgY29uc3RyYWludCBpcyBzYXRpc2ZpZWQgYnkgYSBnaXZlbiB2YWx1ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWRQYXRoIj5UaGUgZXhwZWN0ZWQgcGF0aDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbFBhdGgiPlRoZSBhY3R1YWwgcGF0aDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBmb3Igc3VjY2VzcywgZmFsc2UgZm9yIGZhaWx1cmU8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aENvbnN0cmFpbnQuV3JpdGVEZXNjcmlwdGlvblRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGNvbnN0cmFpbnQgZGVzY3JpcHRpb24gdG8gYSBNZXNzYWdlV3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPlRoZSB3cml0ZXIgb24gd2hpY2ggdGhlIGRlc2NyaXB0aW9uIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyQ29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2FtZVBhdGhPclVuZGVyQ29uc3RyYWludCB0ZXN0cyB0aGF0IG9uZSBwYXRoIGlzIHVuZGVyIGFub3RoZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyQ29uc3RyYWludC4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVDpTYW1lUGF0aE9yVW5kZXJDb25zdHJhaW50Ii8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBwYXRoPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJDb25zdHJhaW50LklzTWF0Y2goU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBjb25zdHJhaW50IGlzIHNhdGlzZmllZCBieSBhIGdpdmVuIHZhbHVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZFBhdGgiPlRoZSBleHBlY3RlZCBwYXRoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsUGF0aCI+VGhlIGFjdHVhbCBwYXRoPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZTwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJDb25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBjb25zdHJhaW50IGRlc2NyaXB0aW9uIHRvIGEgTWVzc2FnZVdyaXRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiBpcyBkaXNwbGF5ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByZWRpY2F0ZUNvbnN0cmFpbnRgMSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJlZGljYXRlIGNvbnN0cmFpbnQgd3JhcHMgYSBQcmVkaWNhdGUgaW4gYSBjb25zdHJhaW50LA0KKyAgICAgICAgICAgIHJldHVybmluZyBzdWNjZXNzIGlmIHRoZSBwcmVkaWNhdGUgaXMgdHJ1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJlZGljYXRlQ29uc3RyYWludGAxLiNjdG9yKFN5c3RlbS5QcmVkaWNhdGV7YDB9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgUHJlZGljYXRlQ29uc3RyYWludCBmcm9tIGEgcHJlZGljYXRlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByZWRpY2F0ZUNvbnN0cmFpbnRgMS5NYXRjaGVzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHByZWRpY2F0ZSBzdWNjZWVkcyB3aGVuIGFwcGxpZWQNCisgICAgICAgICAgICB0byB0aGUgYWN0dWFsIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5QcmVkaWNhdGVDb25zdHJhaW50YDEuV3JpdGVEZXNjcmlwdGlvblRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGVzIHRoZSBkZXNjcmlwdGlvbiB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTm90Q29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTm90Q29uc3RyYWludCBuZWdhdGVzIHRoZSBlZmZlY3Qgb2Ygc29tZSBvdGhlciBjb25zdHJhaW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5vdENvbnN0cmFpbnQuI2N0b3IoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbnN0cmFpbnQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUOk5vdENvbnN0cmFpbnQiLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJiYXNlQ29uc3RyYWludCI+VGhlIGJhc2UgY29uc3RyYWludCB0byBiZSBuZWdhdGVkLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTm90Q29uc3RyYWludC5NYXRjaGVzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IHdoZXRoZXIgdGhlIGNvbnN0cmFpbnQgaXMgc2F0aXNmaWVkIGJ5IGEgZ2l2ZW4gdmFsdWUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHZhbHVlIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBmb3IgaWYgdGhlIGJhc2UgY29uc3RyYWludCBmYWlscywgZmFsc2UgaWYgaXQgc3VjY2VlZHM8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTm90Q29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSB0aGUgY29uc3RyYWludCBkZXNjcmlwdGlvbiB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIHdyaXRlciBvbiB3aGljaCB0aGUgZGVzY3JpcHRpb24gaXMgZGlzcGxheWVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ob3RDb25zdHJhaW50LldyaXRlQWN0dWFsVmFsdWVUbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBhY3R1YWwgdmFsdWUgZm9yIGEgZmFpbGluZyBjb25zdHJhaW50IHRlc3QgdG8gYSBNZXNzYWdlV3JpdGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBhY3R1YWwgdmFsdWUgaXMgZGlzcGxheWVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BbGxJdGVtc0NvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFsbEl0ZW1zQ29uc3RyYWludCBhcHBsaWVzIGFub3RoZXIgY29uc3RyYWludCB0byBlYWNoDQorICAgICAgICAgICAgaXRlbSBpbiBhIGNvbGxlY3Rpb24sIHN1Y2NlZWRpbmcgaWYgdGhleSBhbGwgc3VjY2VlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWxsSXRlbXNDb25zdHJhaW50LiNjdG9yKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGFuIEFsbEl0ZW1zQ29uc3RyYWludCBvbiB0b3Agb2YgYW4gZXhpc3RpbmcgY29uc3RyYWludA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaXRlbUNvbnN0cmFpbnQiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWxsSXRlbXNDb25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IHRoZSBpdGVtIGNvbnN0cmFpbnQgdG8gZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uLA0KKyAgICAgICAgICAgIGZhaWxpbmcgaWYgYW55IGl0ZW0gZmFpbHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFsbEl0ZW1zQ29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgY29uc3RyYWludCB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Tb21lSXRlbXNDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBTb21lSXRlbXNDb25zdHJhaW50IGFwcGxpZXMgYW5vdGhlciBjb25zdHJhaW50IHRvIGVhY2gNCisgICAgICAgICAgICBpdGVtIGluIGEgY29sbGVjdGlvbiwgc3VjY2VlZGluZyBpZiBhbnkgb2YgdGhlbSBzdWNjZWVkcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU29tZUl0ZW1zQ29uc3RyYWludC4jY3RvcihOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIFNvbWVJdGVtc0NvbnN0cmFpbnQgb24gdG9wIG9mIGFuIGV4aXN0aW5nIGNvbnN0cmFpbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Iml0ZW1Db25zdHJhaW50Ij48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNvbWVJdGVtc0NvbnN0cmFpbnQuTWF0Y2hlcyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbHkgdGhlIGl0ZW0gY29uc3RyYWludCB0byBlYWNoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24sDQorICAgICAgICAgICAgc3VjY2VlZGluZyBpZiBhbnkgaXRlbSBzdWNjZWVkcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU29tZUl0ZW1zQ29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgY29uc3RyYWludCB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ob0l0ZW1Db25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBOb0l0ZW1Db25zdHJhaW50IGFwcGxpZXMgYW5vdGhlciBjb25zdHJhaW50IHRvIGVhY2gNCisgICAgICAgICAgICBpdGVtIGluIGEgY29sbGVjdGlvbiwgZmFpbGluZyBpZiBhbnkgb2YgdGhlbSBzdWNjZWVkcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTm9JdGVtQ29uc3RyYWludC4jY3RvcihOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIFNvbWVJdGVtc0NvbnN0cmFpbnQgb24gdG9wIG9mIGFuIGV4aXN0aW5nIGNvbnN0cmFpbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Iml0ZW1Db25zdHJhaW50Ij48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5vSXRlbUNvbnN0cmFpbnQuTWF0Y2hlcyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbHkgdGhlIGl0ZW0gY29uc3RyYWludCB0byBlYWNoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24sDQorICAgICAgICAgICAgZmFpbGluZyBpZiBhbnkgaXRlbSBmYWlscy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTm9JdGVtQ29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgY29uc3RyYWludCB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eUV4aXN0c0NvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb3BlcnR5RXhpc3RzQ29uc3RyYWludCB0ZXN0cyB0aGF0IGEgbmFtZWQgcHJvcGVydHkNCisgICAgICAgICAgICBleGlzdHMgb24gdGhlIG9iamVjdCBwcm92aWRlZCB0aHJvdWdoIE1hdGNoLg0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIE9yaWdpbmFsbHksIFByb3BlcnR5Q29uc3RyYWludCBwcm92aWRlZCB0aGlzIGZlYXR1cmUNCisgICAgICAgICAgICBpbiBhZGRpdGlvbiB0byBtYWtpbmcgb3B0aW9uYWwgdGVzdHMgb24gdGhlIHZhdWUNCisgICAgICAgICAgICBvZiB0aGUgcHJvcGVydHkuIFRoZSB0d28gY29uc3RyYWludHMgYXJlIG5vdyBzZXBhcmF0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJvcGVydHlFeGlzdHNDb25zdHJhaW50LiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUOlByb3BlcnR5RXhpc3RDb25zdHJhaW50Ii8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJvcGVydHlFeGlzdHNDb25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2hldGhlciB0aGUgcHJvcGVydHkgZXhpc3RzIGZvciBhIGdpdmVuIG9iamVjdA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgb2JqZWN0IHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBmb3Igc3VjY2VzcywgZmFsc2UgZm9yIGZhaWx1cmU8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJvcGVydHlFeGlzdHNDb25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBjb25zdHJhaW50IGRlc2NyaXB0aW9uIHRvIGEgTWVzc2FnZVdyaXRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiBpcyBkaXNwbGF5ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByb3BlcnR5RXhpc3RzQ29uc3RyYWludC5Xcml0ZUFjdHVhbFZhbHVlVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSB0aGUgYWN0dWFsIHZhbHVlIGZvciBhIGZhaWxpbmcgY29uc3RyYWludCB0ZXN0IHRvIGENCisgICAgICAgICAgICBNZXNzYWdlV3JpdGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBhY3R1YWwgdmFsdWUgaXMgZGlzcGxheWVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eUV4aXN0c0NvbnN0cmFpbnQuR2V0U3RyaW5nUmVwcmVzZW50YXRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uc3RyYWludC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByb3BlcnR5Q29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvcGVydHlDb25zdHJhaW50IGV4dHJhY3RzIGEgbmFtZWQgcHJvcGVydHkgYW5kIHVzZXMNCisgICAgICAgICAgICBpdHMgdmFsdWUgYXMgdGhlIGFjdHVhbCB2YWx1ZSBmb3IgYSBjaGFpbmVkIGNvbnN0cmFpbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByb3BlcnR5Q29uc3RyYWludC4jY3RvcihTeXN0ZW0uU3RyaW5nLE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVDpQcm9wZXJ0eUNvbnN0cmFpbnQiLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJuYW1lIj5UaGUgbmFtZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJiYXNlQ29uc3RyYWludCI+VGhlIGNvbnN0cmFpbnQgdG8gYXBwbHkgdG8gdGhlIHByb3BlcnR5LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJvcGVydHlDb25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2hldGhlciB0aGUgY29uc3RyYWludCBpcyBzYXRpc2ZpZWQgYnkgYSBnaXZlbiB2YWx1ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgdmFsdWUgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZTwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eUNvbnN0cmFpbnQuV3JpdGVEZXNjcmlwdGlvblRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGNvbnN0cmFpbnQgZGVzY3JpcHRpb24gdG8gYSBNZXNzYWdlV3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPlRoZSB3cml0ZXIgb24gd2hpY2ggdGhlIGRlc2NyaXB0aW9uIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJvcGVydHlDb25zdHJhaW50LldyaXRlQWN0dWFsVmFsdWVUbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBhY3R1YWwgdmFsdWUgZm9yIGEgZmFpbGluZyBjb25zdHJhaW50IHRlc3QgdG8gYQ0KKyAgICAgICAgICAgIE1lc3NhZ2VXcml0ZXIuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSB3cml0ZXMNCisgICAgICAgICAgICB0aGUgcmF3IHZhbHVlIG9mIGFjdHVhbCwgbGVhdmluZyBpdCB0byB0aGUgd3JpdGVyIHRvDQorICAgICAgICAgICAgcGVyZm9ybSBhbnkgZm9ybWF0dGluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIHdyaXRlciBvbiB3aGljaCB0aGUgYWN0dWFsIHZhbHVlIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJvcGVydHlDb25zdHJhaW50LkdldFN0cmluZ1JlcHJlc2VudGF0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SYW5nZUNvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJhbmdlQ29uc3RyYWludCB0ZXN0cyB3aGV0aGUgdHdvIHZhbHVlcyBhcmUgd2l0aGluIGEgDQorICAgICAgICAgICAgc3BlY2lmaWVkIHJhbmdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SYW5nZUNvbnN0cmFpbnQuI2N0b3IoU3lzdGVtLklDb21wYXJhYmxlLFN5c3RlbS5JQ29tcGFyYWJsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlQ6UmFuZ2VDb25zdHJhaW50Ii8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZnJvbSI+RnJvbS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0byI+VG8uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SYW5nZUNvbnN0cmFpbnQuTWF0Y2hlcyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBjb25zdHJhaW50IGlzIHNhdGlzZmllZCBieSBhIGdpdmVuIHZhbHVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSB2YWx1ZSB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgZm9yIHN1Y2Nlc3MsIGZhbHNlIGZvciBmYWlsdXJlPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlJhbmdlQ29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSB0aGUgY29uc3RyYWludCBkZXNjcmlwdGlvbiB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIHdyaXRlciBvbiB3aGljaCB0aGUgZGVzY3JpcHRpb24gaXMgZGlzcGxheWVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SYW5nZUNvbnN0cmFpbnQuVXNpbmcoU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1vZGlmaWVzIHRoZSBjb25zdHJhaW50IHRvIHVzZSBhbiBJQ29tcGFyZXIgYW5kIHJldHVybnMgc2VsZi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmFuZ2VDb25zdHJhaW50LlVzaW5nYGAxKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklDb21wYXJlcntgYDB9KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTW9kaWZpZXMgdGhlIGNvbnN0cmFpbnQgdG8gdXNlIGFuIElDb21wYXJlciZsdDtUJmd0OyBhbmQgcmV0dXJucyBzZWxmLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SYW5nZUNvbnN0cmFpbnQuVXNpbmdgYDEoU3lzdGVtLkNvbXBhcmlzb257YGAwfSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1vZGlmaWVzIHRoZSBjb25zdHJhaW50IHRvIHVzZSBhIENvbXBhcmlzb24mbHQ7VCZndDsgYW5kIHJldHVybnMgc2VsZi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmVzb2x2YWJsZUNvbnN0cmFpbnRFeHByZXNzaW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXNvbHZhYmxlQ29uc3RyYWludEV4cHJlc3Npb24gaXMgdXNlZCB0byByZXByZXNlbnQgYSBjb21wb3VuZA0KKyAgICAgICAgICAgIGNvbnN0cmFpbnQgYmVpbmcgY29uc3RydWN0ZWQgYXQgYSBwb2ludCB3aGVyZSB0aGUgbGFzdCBvcGVyYXRvcg0KKyAgICAgICAgICAgIG1heSBlaXRoZXIgdGVybWluYXRlIHRoZSBleHByZXNzaW9uIG9yIG1heSBoYXZlIGFkZGl0aW9uYWwgDQorICAgICAgICAgICAgcXVhbGlmeWluZyBjb25zdHJhaW50cyBhZGRlZCB0byBpdC4gDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgSXQgaXMgdXNlZCwgZm9yIGV4YW1wbGUsIGZvciBhIFByb3BlcnR5IGVsZW1lbnQgb3IgZm9yDQorICAgICAgICAgICAgYW4gRXhjZXB0aW9uIGVsZW1lbnQsIGVpdGhlciBvZiB3aGljaCBtYXkgYmUgb3B0aW9uYWxseQ0KKyAgICAgICAgICAgIGZvbGxvd2VkIGJ5IGNvbnN0cmFpbnRzIHRoYXQgYXBwbHkgdG8gdGhlIHByb3BlcnR5IG9yIA0KKyAgICAgICAgICAgIGV4Y2VwdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmVzb2x2YWJsZUNvbnN0cmFpbnRFeHByZXNzaW9uLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzb2x2YWJsZUNvbnN0cmFpbnRFeHByZXNzaW9uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlJlc29sdmFibGVDb25zdHJhaW50RXhwcmVzc2lvbi4jY3RvcihOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludEJ1aWxkZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzb2x2YWJsZUNvbnN0cmFpbnRFeHByZXNzaW9uLA0KKyAgICAgICAgICAgIHBhc3NpbmcgaW4gYSBwcmUtcG9wdWxhdGVkIENvbnN0cmFpbnRCdWlsZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SZXNvbHZhYmxlQ29uc3RyYWludEV4cHJlc3Npb24uTlVuaXQjRnJhbWV3b3JrI0NvbnN0cmFpbnRzI0lSZXNvbHZlQ29uc3RyYWludCNSZXNvbHZlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXNvbHZlIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gdG8gYSBDb25zdHJhaW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlJlc29sdmFibGVDb25zdHJhaW50RXhwcmVzc2lvbi5BbmQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGVuZHMgYW4gQW5kIE9wZXJhdG9yIHRvIHRoZSBleHByZXNzaW9uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlJlc29sdmFibGVDb25zdHJhaW50RXhwcmVzc2lvbi5PciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwZW5kcyBhbiBPciBvcGVyYXRvciB0byB0aGUgZXhwcmVzc2lvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmV1c2FibGVDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXVzYWJsZUNvbnN0cmFpbnQgd3JhcHMgYSByZXNvbHZlZCBjb25zdHJhaW50IHNvIHRoYXQgaXQNCisgICAgICAgICAgICBtYXkgYmUgc2F2ZWQgYW5kIHJldXNlZCBhcyBuZWVkZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlJldXNhYmxlQ29uc3RyYWludC4jY3RvcihOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgUmV1c2FibGVDb25zdHJhaW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjIj5UaGUgY29uc3RyYWludCBvciBleHByZXNzaW9uIHRvIGJlIHJldXNlZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmV1c2FibGVDb25zdHJhaW50Lm9wX0ltcGxpY2l0KE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50KX5OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmV1c2FibGVDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb252ZXJzaW9uIG9wZXJhdG9yIGZyb20gYSBub3JtYWwgY29uc3RyYWludCB0byBhIFJldXNhYmxlQ29uc3RyYWludC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImMiPlRoZSBvcmlnaW5hbCBjb25zdHJhaW50IHRvIGJlIHdyYXBwZWQgYXMgYSBSZXVzYWJsZUNvbnN0cmFpbnQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SZXVzYWJsZUNvbnN0cmFpbnQuVG9TdHJpbmciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uc3RyYWludC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHJldHVybnM+QSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb25zdHJhaW50PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlJldXNhYmxlQ29uc3RyYWludC5SZXNvbHZlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXNvbHZlcyB0aGUgUmV1c2FibGVDb25zdHJhaW50IGJ5IHJldHVybmluZyB0aGUgY29uc3RyYWludA0KKyAgICAgICAgICAgIHRoYXQgaXQgb3JpZ2luYWxseSB3cmFwcGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5BIHJlc29sdmVkIGNvbnN0cmFpbnQ8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZUFzQ29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2FtZUFzQ29uc3RyYWludCB0ZXN0cyB3aGV0aGVyIGFuIG9iamVjdCBpcyBpZGVudGljYWwgdG8NCisgICAgICAgICAgICB0aGUgb2JqZWN0IHBhc3NlZCB0byBpdHMgY29uc3RydWN0b3INCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZUFzQ29uc3RyYWludC4jY3RvcihTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVDpTYW1lQXNDb25zdHJhaW50Ii8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBvYmplY3QuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lQXNDb25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2hldGhlciB0aGUgY29uc3RyYWludCBpcyBzYXRpc2ZpZWQgYnkgYSBnaXZlbiB2YWx1ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgdmFsdWUgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZTwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lQXNDb25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBjb25zdHJhaW50IGRlc2NyaXB0aW9uIHRvIGEgTWVzc2FnZVdyaXRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiBpcyBkaXNwbGF5ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkJpbmFyeVNlcmlhbGl6YWJsZUNvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEJpbmFyeVNlcmlhbGl6YWJsZUNvbnN0cmFpbnQgdGVzdHMgd2hldGhlciANCisgICAgICAgICAgICBhbiBvYmplY3QgaXMgc2VyaWFsaXphYmxlIGluIGJpbmFyeSBmb3JtYXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkJpbmFyeVNlcmlhbGl6YWJsZUNvbnN0cmFpbnQuTWF0Y2hlcyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBjb25zdHJhaW50IGlzIHNhdGlzZmllZCBieSBhIGdpdmVuIHZhbHVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSB2YWx1ZSB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgZm9yIHN1Y2Nlc3MsIGZhbHNlIGZvciBmYWlsdXJlPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkJpbmFyeVNlcmlhbGl6YWJsZUNvbnN0cmFpbnQuV3JpdGVEZXNjcmlwdGlvblRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGNvbnN0cmFpbnQgZGVzY3JpcHRpb24gdG8gYSBNZXNzYWdlV3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPlRoZSB3cml0ZXIgb24gd2hpY2ggdGhlIGRlc2NyaXB0aW9uIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQmluYXJ5U2VyaWFsaXphYmxlQ29uc3RyYWludC5Xcml0ZUFjdHVhbFZhbHVlVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSB0aGUgYWN0dWFsIHZhbHVlIGZvciBhIGZhaWxpbmcgY29uc3RyYWludCB0ZXN0IHRvIGENCisgICAgICAgICAgICBNZXNzYWdlV3JpdGVyLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgd3JpdGVzDQorICAgICAgICAgICAgdGhlIHJhdyB2YWx1ZSBvZiBhY3R1YWwsIGxlYXZpbmcgaXQgdG8gdGhlIHdyaXRlciB0bw0KKyAgICAgICAgICAgIHBlcmZvcm0gYW55IGZvcm1hdHRpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPlRoZSB3cml0ZXIgb24gd2hpY2ggdGhlIGFjdHVhbCB2YWx1ZSBpcyBkaXNwbGF5ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkJpbmFyeVNlcmlhbGl6YWJsZUNvbnN0cmFpbnQuR2V0U3RyaW5nUmVwcmVzZW50YXRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5YbWxTZXJpYWxpemFibGVDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBCaW5hcnlTZXJpYWxpemFibGVDb25zdHJhaW50IHRlc3RzIHdoZXRoZXIgDQorICAgICAgICAgICAgYW4gb2JqZWN0IGlzIHNlcmlhbGl6YWJsZSBpbiBiaW5hcnkgZm9ybWF0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5YbWxTZXJpYWxpemFibGVDb25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2hldGhlciB0aGUgY29uc3RyYWludCBpcyBzYXRpc2ZpZWQgYnkgYSBnaXZlbiB2YWx1ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgdmFsdWUgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZTwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5YbWxTZXJpYWxpemFibGVDb25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBjb25zdHJhaW50IGRlc2NyaXB0aW9uIHRvIGEgTWVzc2FnZVdyaXRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiBpcyBkaXNwbGF5ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlhtbFNlcmlhbGl6YWJsZUNvbnN0cmFpbnQuV3JpdGVBY3R1YWxWYWx1ZVRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGFjdHVhbCB2YWx1ZSBmb3IgYSBmYWlsaW5nIGNvbnN0cmFpbnQgdGVzdCB0byBhDQorICAgICAgICAgICAgTWVzc2FnZVdyaXRlci4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IHdyaXRlcw0KKyAgICAgICAgICAgIHRoZSByYXcgdmFsdWUgb2YgYWN0dWFsLCBsZWF2aW5nIGl0IHRvIHRoZSB3cml0ZXIgdG8NCisgICAgICAgICAgICBwZXJmb3JtIGFueSBmb3JtYXR0aW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBhY3R1YWwgdmFsdWUgaXMgZGlzcGxheWVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5YbWxTZXJpYWxpemFibGVDb25zdHJhaW50LkdldFN0cmluZ1JlcHJlc2VudGF0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdHJhaW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN0cmluZ0NvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN0cmluZ0NvbnN0cmFpbnQgaXMgdGhlIGFic3RyYWN0IGJhc2UgZm9yIGNvbnN0cmFpbnRzDQorICAgICAgICAgICAgdGhhdCBvcGVyYXRlIG9uIHN0cmluZ3MuIEl0IHN1cHBvcnRzIHRoZSBJZ25vcmVDYXNlDQorICAgICAgICAgICAgbW9kaWZpZXIgZm9yIHN0cmluZyBvcGVyYXRpb25zLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdHJpbmdDb25zdHJhaW50LmV4cGVjdGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgZXhwZWN0ZWQgdmFsdWUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RyaW5nQ29uc3RyYWludC5jYXNlSW5zZW5zaXRpdmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluZGljYXRlcyB3aGV0aGVyIHRlc3RzIHNob3VsZCBiZSBjYXNlLWluc2Vuc2l0aXZlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN0cmluZ0NvbnN0cmFpbnQuI2N0b3IoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdHMgYSBTdHJpbmdDb25zdHJhaW50IGdpdmVuIGFuIGV4cGVjdGVkIHZhbHVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdHJpbmdDb25zdHJhaW50Lklnbm9yZUNhc2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1vZGlmeSB0aGUgY29uc3RyYWludCB0byBpZ25vcmUgY2FzZSBpbiBtYXRjaGluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW1wdHlTdHJpbmdDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFbXB0eVN0cmluZ0NvbnN0cmFpbnQgdGVzdHMgd2hldGhlciBhIHN0cmluZyBpcyBlbXB0eS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW1wdHlTdHJpbmdDb25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2hldGhlciB0aGUgY29uc3RyYWludCBpcyBzYXRpc2ZpZWQgYnkgYSBnaXZlbiB2YWx1ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgdmFsdWUgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZTwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbXB0eVN0cmluZ0NvbnN0cmFpbnQuV3JpdGVEZXNjcmlwdGlvblRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGNvbnN0cmFpbnQgZGVzY3JpcHRpb24gdG8gYSBNZXNzYWdlV3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPlRoZSB3cml0ZXIgb24gd2hpY2ggdGhlIGRlc2NyaXB0aW9uIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVsbE9yRW1wdHlTdHJpbmdDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBOdWxsRW1wdHlTdHJpbmdDb25zdHJhaW50IHRlc3RzIHdoZXRoZXIgYSBzdHJpbmcgaXMgZWl0aGVyIG51bGwgb3IgZW1wdHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bGxPckVtcHR5U3RyaW5nQ29uc3RyYWludC4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0cyBhIG5ldyBOdWxsT3JFbXB0eVN0cmluZ0NvbnN0cmFpbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVsbE9yRW1wdHlTdHJpbmdDb25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2hldGhlciB0aGUgY29uc3RyYWludCBpcyBzYXRpc2ZpZWQgYnkgYSBnaXZlbiB2YWx1ZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgdmFsdWUgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZTwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdWxsT3JFbXB0eVN0cmluZ0NvbnN0cmFpbnQuV3JpdGVEZXNjcmlwdGlvblRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGNvbnN0cmFpbnQgZGVzY3JpcHRpb24gdG8gYSBNZXNzYWdlV3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPlRoZSB3cml0ZXIgb24gd2hpY2ggdGhlIGRlc2NyaXB0aW9uIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3Vic3RyaW5nQ29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3Vic3RyaW5nQ29uc3RyYWludCBjYW4gdGVzdCB3aGV0aGVyIGEgc3RyaW5nIGNvbnRhaW5zDQorICAgICAgICAgICAgdGhlIGV4cGVjdGVkIHN1YnN0cmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3Vic3RyaW5nQ29uc3RyYWludC4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVDpTdWJzdHJpbmdDb25zdHJhaW50Ii8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YnN0cmluZ0NvbnN0cmFpbnQuTWF0Y2hlcyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBjb25zdHJhaW50IGlzIHNhdGlzZmllZCBieSBhIGdpdmVuIHZhbHVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSB2YWx1ZSB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgZm9yIHN1Y2Nlc3MsIGZhbHNlIGZvciBmYWlsdXJlPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YnN0cmluZ0NvbnN0cmFpbnQuV3JpdGVEZXNjcmlwdGlvblRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGNvbnN0cmFpbnQgZGVzY3JpcHRpb24gdG8gYSBNZXNzYWdlV3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPlRoZSB3cml0ZXIgb24gd2hpY2ggdGhlIGRlc2NyaXB0aW9uIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aENvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN0YXJ0c1dpdGhDb25zdHJhaW50IGNhbiB0ZXN0IHdoZXRoZXIgYSBzdHJpbmcgc3RhcnRzDQorICAgICAgICAgICAgd2l0aCBhbiBleHBlY3RlZCBzdWJzdHJpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN0YXJ0c1dpdGhDb25zdHJhaW50LiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUOlN0YXJ0c1dpdGhDb25zdHJhaW50Ii8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN0YXJ0c1dpdGhDb25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2hldGhlciB0aGUgY29uc3RyYWludCBpcyBtYXRjaGVkIGJ5IHRoZSBhY3R1YWwgdmFsdWUuDQorICAgICAgICAgICAgVGhpcyBpcyBhIHRlbXBsYXRlIG1ldGhvZCwgd2hpY2ggY2FsbHMgdGhlIElzTWF0Y2ggbWV0aG9kDQorICAgICAgICAgICAgb2YgdGhlIGRlcml2ZWQgY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN0YXJ0c1dpdGhDb25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBjb25zdHJhaW50IGRlc2NyaXB0aW9uIHRvIGEgTWVzc2FnZVdyaXRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiBpcyBkaXNwbGF5ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoQ29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRW5kc1dpdGhDb25zdHJhaW50IGNhbiB0ZXN0IHdoZXRoZXIgYSBzdHJpbmcgZW5kcw0KKyAgICAgICAgICAgIHdpdGggYW4gZXhwZWN0ZWQgc3Vic3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbmRzV2l0aENvbnN0cmFpbnQuI2N0b3IoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlQ6RW5kc1dpdGhDb25zdHJhaW50Ii8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoQ29uc3RyYWludC5NYXRjaGVzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IHdoZXRoZXIgdGhlIGNvbnN0cmFpbnQgaXMgbWF0Y2hlZCBieSB0aGUgYWN0dWFsIHZhbHVlLg0KKyAgICAgICAgICAgIFRoaXMgaXMgYSB0ZW1wbGF0ZSBtZXRob2QsIHdoaWNoIGNhbGxzIHRoZSBJc01hdGNoIG1ldGhvZA0KKyAgICAgICAgICAgIG9mIHRoZSBkZXJpdmVkIGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbmRzV2l0aENvbnN0cmFpbnQuV3JpdGVEZXNjcmlwdGlvblRvKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5NZXNzYWdlV3JpdGVyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGNvbnN0cmFpbnQgZGVzY3JpcHRpb24gdG8gYSBNZXNzYWdlV3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPlRoZSB3cml0ZXIgb24gd2hpY2ggdGhlIGRlc2NyaXB0aW9uIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmVnZXhDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZWdleENvbnN0cmFpbnQgY2FuIHRlc3Qgd2hldGhlciBhIHN0cmluZyBtYXRjaGVzDQorICAgICAgICAgICAgdGhlIHBhdHRlcm4gcHJvdmlkZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlJlZ2V4Q29uc3RyYWludC4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVDpSZWdleENvbnN0cmFpbnQiLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXR0ZXJuIj5UaGUgcGF0dGVybi48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlJlZ2V4Q29uc3RyYWludC5NYXRjaGVzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IHdoZXRoZXIgdGhlIGNvbnN0cmFpbnQgaXMgc2F0aXNmaWVkIGJ5IGEgZ2l2ZW4gdmFsdWUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHZhbHVlIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBmb3Igc3VjY2VzcywgZmFsc2UgZm9yIGZhaWx1cmU8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmVnZXhDb25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBjb25zdHJhaW50IGRlc2NyaXB0aW9uIHRvIGEgTWVzc2FnZVdyaXRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiBpcyBkaXNwbGF5ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRocm93c0NvbnN0cmFpbnQgaXMgdXNlZCB0byB0ZXN0IHRoZSBleGNlcHRpb24gdGhyb3duIGJ5IA0KKyAgICAgICAgICAgIGEgZGVsZWdhdGUgYnkgYXBwbHlpbmcgYSBjb25zdHJhaW50IHRvIGl0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UaHJvd3NDb25zdHJhaW50LiNjdG9yKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVDpUaHJvd3NDb25zdHJhaW50Ii8+IGNsYXNzLA0KKyAgICAgICAgICAgIHVzaW5nIGEgY29uc3RyYWludCB0byBiZSBhcHBsaWVkIHRvIHRoZSBleGNlcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJiYXNlQ29uc3RyYWludCI+QSBjb25zdHJhaW50IHRvIGFwcGx5IHRvIHRoZSBjYXVnaHQgZXhjZXB0aW9uLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVGhyb3dzQ29uc3RyYWludC5NYXRjaGVzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFeGVjdXRlcyB0aGUgY29kZSBvZiB0aGUgZGVsZWdhdGUgYW5kIGNhcHR1cmVzIGFueSBleGNlcHRpb24uDQorICAgICAgICAgICAgSWYgYSBub24tbnVsbCBiYXNlIGNvbnN0cmFpbnQgd2FzIHByb3ZpZGVkLCBpdCBhcHBsaWVzIHRoYXQNCisgICAgICAgICAgICBjb25zdHJhaW50IHRvIHRoZSBleGNlcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPkEgZGVsZWdhdGUgcmVwcmVzZW50aW5nIHRoZSBjb2RlIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGFuZCB0aGUgY29uc3RyYWludCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnQuTWF0Y2hlcyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWN0dWFsVmFsdWVEZWxlZ2F0ZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnZlcnRzIGFuIEFjdHVhbFZhbHVlRGVsZWdhdGUgdG8gYSBUZXN0RGVsZWdhdGUNCisgICAgICAgICAgICBiZWZvcmUgY2FsbGluZyB0aGUgcHJpbWFyeSBvdmVybG9hZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlbCI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVGhyb3dzQ29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSB0aGUgY29uc3RyYWludCBkZXNjcmlwdGlvbiB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIHdyaXRlciBvbiB3aGljaCB0aGUgZGVzY3JpcHRpb24gaXMgZGlzcGxheWVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UaHJvd3NDb25zdHJhaW50LldyaXRlQWN0dWFsVmFsdWVUbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBhY3R1YWwgdmFsdWUgZm9yIGEgZmFpbGluZyBjb25zdHJhaW50IHRlc3QgdG8gYQ0KKyAgICAgICAgICAgIE1lc3NhZ2VXcml0ZXIuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSB3cml0ZXMNCisgICAgICAgICAgICB0aGUgcmF3IHZhbHVlIG9mIGFjdHVhbCwgbGVhdmluZyBpdCB0byB0aGUgd3JpdGVyIHRvDQorICAgICAgICAgICAgcGVyZm9ybSBhbnkgZm9ybWF0dGluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIHdyaXRlciBvbiB3aGljaCB0aGUgYWN0dWFsIHZhbHVlIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVGhyb3dzQ29uc3RyYWludC5HZXRTdHJpbmdSZXByZXNlbnRhdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29uc3RyYWludA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UaHJvd3NDb25zdHJhaW50LkFjdHVhbEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSBhY3R1YWwgZXhjZXB0aW9uIHRocm93biAtIHVzZWQgYnkgQXNzZXJ0LlRocm93cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVGhyb3dzTm90aGluZ0NvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRocm93c05vdGhpbmdDb25zdHJhaW50IHRlc3RzIHRoYXQgYSBkZWxlZ2F0ZSBkb2VzIG5vdA0KKyAgICAgICAgICAgIHRocm93IGFuIGV4Y2VwdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVGhyb3dzTm90aGluZ0NvbnN0cmFpbnQuTWF0Y2hlcyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBjb25zdHJhaW50IGlzIHNhdGlzZmllZCBieSBhIGdpdmVuIHZhbHVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSB2YWx1ZSB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgaWYgbm8gZXhjZXB0aW9uIGlzIHRocm93biwgb3RoZXJ3aXNlIGZhbHNlPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c05vdGhpbmdDb25zdHJhaW50Lk1hdGNoZXMoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFjdHVhbFZhbHVlRGVsZWdhdGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb252ZXJ0cyBhbiBBY3R1YWxWYWx1ZURlbGVnYXRlIHRvIGEgVGVzdERlbGVnYXRlDQorICAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgdGhlIHByaW1hcnkgb3ZlcmxvYWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWwiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c05vdGhpbmdDb25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBjb25zdHJhaW50IGRlc2NyaXB0aW9uIHRvIGEgTWVzc2FnZVdyaXRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgd3JpdGVyIG9uIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiBpcyBkaXNwbGF5ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c05vdGhpbmdDb25zdHJhaW50LldyaXRlQWN0dWFsVmFsdWVUbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBhY3R1YWwgdmFsdWUgZm9yIGEgZmFpbGluZyBjb25zdHJhaW50IHRlc3QgdG8gYQ0KKyAgICAgICAgICAgIE1lc3NhZ2VXcml0ZXIuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSB3cml0ZXMNCisgICAgICAgICAgICB0aGUgcmF3IHZhbHVlIG9mIGFjdHVhbCwgbGVhdmluZyBpdCB0byB0aGUgd3JpdGVyIHRvDQorICAgICAgICAgICAgcGVyZm9ybSBhbnkgZm9ybWF0dGluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIHdyaXRlciBvbiB3aGljaCB0aGUgYWN0dWFsIHZhbHVlIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVG9sZXJhbmNlTW9kZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTW9kZXMgaW4gd2hpY2ggdGhlIHRvbGVyYW5jZSB2YWx1ZSBmb3IgYSBjb21wYXJpc29uIGNhbg0KKyAgICAgICAgICAgIGJlIGludGVycHJldGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ub2xlcmFuY2VNb2RlLk5vbmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB0b2xlcmFuY2Ugd2FzIGNyZWF0ZWQgd2l0aCBhIHZhbHVlLCB3aXRob3V0IHNwZWNpZnlpbmcgDQorICAgICAgICAgICAgaG93IHRoZSB2YWx1ZSB3b3VsZCBiZSB1c2VkLiBUaGlzIGlzIHVzZWQgdG8gcHJldmVudCBzZXR0aW5nDQorICAgICAgICAgICAgdGhlIG1vZGUgbW9yZSB0aGFuIG9uY2UgYW5kIGlzIGdlbmVyYWxseSBjaGFuZ2VkIHRvIExpbmVhcg0KKyAgICAgICAgICAgIHVwb24gZXhlY3V0aW9uIG9mIHRoZSB0ZXN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ub2xlcmFuY2VNb2RlLkxpbmVhciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRvbGVyYW5jZSBpcyB1c2VkIGFzIGEgbnVtZXJpYyByYW5nZSB3aXRoaW4gd2hpY2gNCisgICAgICAgICAgICB0d28gY29tcGFyZWQgdmFsdWVzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ub2xlcmFuY2VNb2RlLlBlcmNlbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEludGVycHJldHMgdGhlIHRvbGVyYW5jZSBhcyB0aGUgcGVyY2VudGFnZSBieSB3aGljaA0KKyAgICAgICAgICAgIHRoZSB0d28gY29tcGFyZWQgdmFsdWVzIG15IGRldmlhdGUgZnJvbSBlYWNoIG90aGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ub2xlcmFuY2VNb2RlLlVscHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbXBhcmVzIHR3byB2YWx1ZXMgYmFzZWQgaW4gdGhlaXIgZGlzdGFuY2UgaW4NCisgICAgICAgICAgICByZXByZXNlbnRhYmxlIG51bWJlcnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRvbGVyYW5jZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIFRvbGVyYW5jZSBjbGFzcyBnZW5lcmFsaXplcyB0aGUgbm90aW9uIG9mIGEgdG9sZXJhbmNlDQorICAgICAgICAgICAgd2l0aGluIHdoaWNoIGFuIGVxdWFsaXR5IHRlc3Qgc3VjY2VlZHMuIE5vcm1hbGx5LCBpdCBpcw0KKyAgICAgICAgICAgIHVzZWQgd2l0aCBudW1lcmljIHR5cGVzLCBidXQgaXQgY2FuIGJlIHVzZWQgd2l0aCBhbnkNCisgICAgICAgICAgICB0eXBlIHRoYXQgc3VwcG9ydHMgdGFraW5nIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byANCisgICAgICAgICAgICBvYmplY3RzIGFuZCBjb21wYXJpbmcgdGhhdCBkaWZmZXJlbmNlIHRvIGEgdmFsdWUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRvbGVyYW5jZS4jY3RvcihTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0cyBhIGxpbmVhciB0b2xlcmFuY2Ugb2YgYSBzcGVjZGlmaWVkIGFtb3VudA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ub2xlcmFuY2UuI2N0b3IoU3lzdGVtLk9iamVjdCxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVG9sZXJhbmNlTW9kZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdHMgYSB0b2xlcmFuY2UgZ2l2ZW4gYW4gYW1vdW50IGFuZCBUb2xlcmFuY2VNb2RlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRvbGVyYW5jZS5DaGVja0xpbmVhckFuZE51bWVyaWMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RzIHRoYXQgdGhlIGN1cnJlbnQgVG9sZXJhbmNlIGlzIGxpbmVhciB3aXRoIGEgDQorICAgICAgICAgICAgbnVtZXJpYyB2YWx1ZSwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIGl0IGlzIG5vdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVG9sZXJhbmNlLkVtcHR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGFuIGVtcHR5IFRvbGVyYW5jZSBvYmplY3QsIGVxdWl2YWxlbnQgdG8gDQorICAgICAgICAgICAgc3BlY2lmeWluZyBhbiBleGFjdCBtYXRjaC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVG9sZXJhbmNlLk1vZGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIFRvbGVyYW5jZU1vZGUgZm9yIHRoZSBjdXJyZW50IFRvbGVyYW5jZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ub2xlcmFuY2UuVmFsdWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IFRvbGVyYW5jZSBpbnN0YW5jZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVG9sZXJhbmNlLlBlcmNlbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBuZXcgdG9sZXJhbmNlLCB1c2luZyB0aGUgY3VycmVudCBhbW91bnQgYXMgYSBwZXJjZW50YWdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ub2xlcmFuY2UuVWxwcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIG5ldyB0b2xlcmFuY2UsIHVzaW5nIHRoZSBjdXJyZW50IGFtb3VudCBpbiBVbHBzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ub2xlcmFuY2UuRGF5cyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIG5ldyB0b2xlcmFuY2Ugd2l0aCBhIFRpbWVTcGFuIGFzIHRoZSBhbW91bnQsIHVzaW5nIA0KKyAgICAgICAgICAgIHRoZSBjdXJyZW50IGFtb3VudCBhcyBhIG51bWJlciBvZiBkYXlzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ub2xlcmFuY2UuSG91cnMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBuZXcgdG9sZXJhbmNlIHdpdGggYSBUaW1lU3BhbiBhcyB0aGUgYW1vdW50LCB1c2luZyANCisgICAgICAgICAgICB0aGUgY3VycmVudCBhbW91bnQgYXMgYSBudW1iZXIgb2YgaG91cnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRvbGVyYW5jZS5NaW51dGVzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IHRvbGVyYW5jZSB3aXRoIGEgVGltZVNwYW4gYXMgdGhlIGFtb3VudCwgdXNpbmcgDQorICAgICAgICAgICAgdGhlIGN1cnJlbnQgYW1vdW50IGFzIGEgbnVtYmVyIG9mIG1pbnV0ZXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRvbGVyYW5jZS5TZWNvbmRzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IHRvbGVyYW5jZSB3aXRoIGEgVGltZVNwYW4gYXMgdGhlIGFtb3VudCwgdXNpbmcgDQorICAgICAgICAgICAgdGhlIGN1cnJlbnQgYW1vdW50IGFzIGEgbnVtYmVyIG9mIHNlY29uZHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRvbGVyYW5jZS5NaWxsaXNlY29uZHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBuZXcgdG9sZXJhbmNlIHdpdGggYSBUaW1lU3BhbiBhcyB0aGUgYW1vdW50LCB1c2luZyANCisgICAgICAgICAgICB0aGUgY3VycmVudCBhbW91bnQgYXMgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ub2xlcmFuY2UuVGlja3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBuZXcgdG9sZXJhbmNlIHdpdGggYSBUaW1lU3BhbiBhcyB0aGUgYW1vdW50LCB1c2luZyANCisgICAgICAgICAgICB0aGUgY3VycmVudCBhbW91bnQgYXMgYSBudW1iZXIgb2YgY2xvY2sgdGlja3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRvbGVyYW5jZS5Jc0VtcHR5Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgdG9sZXJhbmNlIGlzIGVtcHR5Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UeXBlQ29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVHlwZUNvbnN0cmFpbnQgaXMgdGhlIGFic3RyYWN0IGJhc2UgZm9yIGNvbnN0cmFpbnRzDQorICAgICAgICAgICAgdGhhdCB0YWtlIGEgVHlwZSBhcyB0aGVpciBleHBlY3RlZCB2YWx1ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVHlwZUNvbnN0cmFpbnQuZXhwZWN0ZWRUeXBlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgZXhwZWN0ZWQgVHlwZSB1c2VkIGJ5IHRoZSBjb25zdHJhaW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlR5cGVDb25zdHJhaW50LiNjdG9yKFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgVHlwZUNvbnN0cmFpbnQgZm9yIGEgZ2l2ZW4gVHlwZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UeXBlQ29uc3RyYWludC5Xcml0ZUFjdHVhbFZhbHVlVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSB0aGUgYWN0dWFsIHZhbHVlIGZvciBhIGZhaWxpbmcgY29uc3RyYWludCB0ZXN0IHRvIGENCisgICAgICAgICAgICBNZXNzYWdlV3JpdGVyLiBUeXBlQ29uc3RyYWludHMgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gd3JpdGUNCisgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIHdyaXRlciBvbiB3aGljaCB0aGUgYWN0dWFsIHZhbHVlIGlzIGRpc3BsYXllZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXhhY3RUeXBlQ29uc3RyYWludCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRXhhY3RUeXBlQ29uc3RyYWludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBhbiBvYmplY3QNCisgICAgICAgICAgICBpcyBvZiB0aGUgZXhhY3QgdHlwZSBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3INCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXhhY3RUeXBlQ29uc3RyYWludC4jY3RvcihTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhbiBFeGFjdFR5cGVDb25zdHJhaW50IGZvciBhIGdpdmVuIFR5cGUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InR5cGUiPlRoZSBleHBlY3RlZCBUeXBlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXhhY3RUeXBlQ29uc3RyYWludC5NYXRjaGVzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IHRoYXQgYW4gb2JqZWN0IGlzIG9mIHRoZSBleGFjdCB0eXBlIHNwZWNpZmllZA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBpZiB0aGUgdGVzdGVkIG9iamVjdCBpcyBvZiB0aGUgZXhhY3QgdHlwZSBwcm92aWRlZCwgb3RoZXJ3aXNlIGZhbHNlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FeGFjdFR5cGVDb25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGNvbnN0cmFpbnQgdG8gYSBNZXNzYWdlV3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPlRoZSBNZXNzYWdlV3JpdGVyIHRvIHVzZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSW5zdGFuY2VPZlR5cGVDb25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbnN0YW5jZU9mVHlwZUNvbnN0cmFpbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgYW4gb2JqZWN0DQorICAgICAgICAgICAgaXMgb2YgdGhlIHNhbWUgdHlwZSBwcm92aWRlZCBvciBkZXJpdmVkIGZyb20gaXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkluc3RhbmNlT2ZUeXBlQ29uc3RyYWludC4jY3RvcihTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhbiBJbnN0YW5jZU9mVHlwZUNvbnN0cmFpbnQgZm9yIHRoZSB0eXBlIHByb3ZpZGVkDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0eXBlIj5UaGUgZXhwZWN0ZWQgVHlwZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSW5zdGFuY2VPZlR5cGVDb25zdHJhaW50Lk1hdGNoZXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3Qgd2hldGhlciBhbiBvYmplY3QgaXMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIG9yIGEgZGVyaXZlZCB0eXBlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBvYmplY3QgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UcnVlIGlmIHRoZSBvYmplY3QgaXMgb2YgdGhlIHByb3ZpZGVkIHR5cGUgb3IgZGVyaXZlcyBmcm9tIGl0LCBvdGhlcndpc2UgZmFsc2UuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkluc3RhbmNlT2ZUeXBlQ29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgY29uc3RyYWludCB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIE1lc3NhZ2VXcml0ZXIgdG8gdXNlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Bc3NpZ25hYmxlRnJvbUNvbnN0cmFpbnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2lnbmFibGVGcm9tQ29uc3RyYWludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBhbiBvYmplY3QNCisgICAgICAgICAgICBjYW4gYmUgYXNzaWduZWQgZnJvbSBhIGdpdmVuIFR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFzc2lnbmFibGVGcm9tQ29uc3RyYWludC4jY3RvcihTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhbiBBc3NpZ25hYmxlRnJvbUNvbnN0cmFpbnQgZm9yIHRoZSB0eXBlIHByb3ZpZGVkDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFzc2lnbmFibGVGcm9tQ29uc3RyYWludC5NYXRjaGVzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IHdoZXRoZXIgYW4gb2JqZWN0IGNhbiBiZSBhc3NpZ25lZCBmcm9tIHRoZSBzcGVjaWZpZWQgdHlwZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgb2JqZWN0IHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+VHJ1ZSBpZiB0aGUgb2JqZWN0IGNhbiBiZSBhc3NpZ25lZCBhIHZhbHVlIG9mIHRoZSBleHBlY3RlZCBUeXBlLCBvdGhlcndpc2UgZmFsc2UuPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFzc2lnbmFibGVGcm9tQ29uc3RyYWludC5Xcml0ZURlc2NyaXB0aW9uVG8oTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1lc3NhZ2VXcml0ZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgY29uc3RyYWludCB0byBhIE1lc3NhZ2VXcml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9IndyaXRlciI+VGhlIE1lc3NhZ2VXcml0ZXIgdG8gdXNlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Bc3NpZ25hYmxlVG9Db25zdHJhaW50Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NpZ25hYmxlVG9Db25zdHJhaW50IGlzIHVzZWQgdG8gdGVzdCB0aGF0IGFuIG9iamVjdA0KKyAgICAgICAgICAgIGNhbiBiZSBhc3NpZ25lZCB0byBhIGdpdmVuIFR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFzc2lnbmFibGVUb0NvbnN0cmFpbnQuI2N0b3IoU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYW4gQXNzaWduYWJsZVRvQ29uc3RyYWludCBmb3IgdGhlIHR5cGUgcHJvdmlkZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQXNzaWduYWJsZVRvQ29uc3RyYWludC5NYXRjaGVzKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXN0IHdoZXRoZXIgYW4gb2JqZWN0IGNhbiBiZSBhc3NpZ25lZCB0byB0aGUgc3BlY2lmaWVkIHR5cGUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIG9iamVjdCB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRydWUgaWYgdGhlIG9iamVjdCBjYW4gYmUgYXNzaWduZWQgYSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgVHlwZSwgb3RoZXJ3aXNlIGZhbHNlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Bc3NpZ25hYmxlVG9Db25zdHJhaW50LldyaXRlRGVzY3JpcHRpb25UbyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTWVzc2FnZVdyaXRlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIGEgZGVzY3JpcHRpb24gb2YgdGhpcyBjb25zdHJhaW50IHRvIGEgTWVzc2FnZVdyaXRlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0id3JpdGVyIj5UaGUgTWVzc2FnZVdyaXRlciB0byB1c2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhyb3duIHdoZW4gYW4gYXNzZXJ0aW9uIGZhaWxlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgDQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uLiNjdG9yKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIGVycm9yIG1lc3NhZ2UgdGhhdCBleHBsYWlucyANCisgICAgICAgICAgICB0aGUgcmVhc29uIGZvciB0aGUgZXhjZXB0aW9uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24uI2N0b3IoU3lzdGVtLlN0cmluZyxTeXN0ZW0uRXhjZXB0aW9uKSI+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBlcnJvciBtZXNzYWdlIHRoYXQgZXhwbGFpbnMgDQorICAgICAgICAgICAgdGhlIHJlYXNvbiBmb3IgdGhlIGV4Y2VwdGlvbjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImlubmVyIj5UaGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoZSANCisgICAgICAgICAgICBjdXJyZW50IGV4Y2VwdGlvbjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uLiNjdG9yKFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvbkluZm8sU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TdHJlYW1pbmdDb250ZXh0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2VyaWFsaXphdGlvbiBDb25zdHJ1Y3Rvcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5JZ25vcmVFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRocm93biB3aGVuIGFuIGFzc2VydGlvbiBmYWlsZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklnbm9yZUV4Y2VwdGlvbi4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuSWdub3JlRXhjZXB0aW9uLiNjdG9yKFN5c3RlbS5TdHJpbmcsU3lzdGVtLkV4Y2VwdGlvbikiPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgZXJyb3IgbWVzc2FnZSB0aGF0IGV4cGxhaW5zIA0KKyAgICAgICAgICAgIHRoZSByZWFzb24gZm9yIHRoZSBleGNlcHRpb248L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbm5lciI+VGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgDQorICAgICAgICAgICAgY3VycmVudCBleGNlcHRpb248L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklnbm9yZUV4Y2VwdGlvbi4jY3RvcihTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25JbmZvLFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU3RyZWFtaW5nQ29udGV4dCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNlcmlhbGl6YXRpb24gQ29uc3RydWN0b3INCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuSW5jb25jbHVzaXZlRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaHJvd24gd2hlbiBhIHRlc3QgZXhlY3V0ZXMgaW5jb25jbHVzaXZlbHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIA0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkluY29uY2x1c2l2ZUV4Y2VwdGlvbi4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBlcnJvciBtZXNzYWdlIHRoYXQgZXhwbGFpbnMgDQorICAgICAgICAgICAgdGhlIHJlYXNvbiBmb3IgdGhlIGV4Y2VwdGlvbjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuSW5jb25jbHVzaXZlRXhjZXB0aW9uLiNjdG9yKFN5c3RlbS5TdHJpbmcsU3lzdGVtLkV4Y2VwdGlvbikiPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgZXJyb3IgbWVzc2FnZSB0aGF0IGV4cGxhaW5zIA0KKyAgICAgICAgICAgIHRoZSByZWFzb24gZm9yIHRoZSBleGNlcHRpb248L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJpbm5lciI+VGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgDQorICAgICAgICAgICAgY3VycmVudCBleGNlcHRpb248L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkluY29uY2x1c2l2ZUV4Y2VwdGlvbi4jY3RvcihTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25JbmZvLFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU3RyZWFtaW5nQ29udGV4dCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNlcmlhbGl6YXRpb24gQ29uc3RydWN0b3INCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuU3VjY2Vzc0V4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhyb3duIHdoZW4gYW4gYXNzZXJ0aW9uIGZhaWxlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuU3VjY2Vzc0V4Y2VwdGlvbi4jY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuU3VjY2Vzc0V4Y2VwdGlvbi4jY3RvcihTeXN0ZW0uU3RyaW5nLFN5c3RlbS5FeGNlcHRpb24pIj4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIGVycm9yIG1lc3NhZ2UgdGhhdCBleHBsYWlucyANCisgICAgICAgICAgICB0aGUgcmVhc29uIGZvciB0aGUgZXhjZXB0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaW5uZXIiPlRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhlIA0KKyAgICAgICAgICAgIGN1cnJlbnQgZXhjZXB0aW9uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5TdWNjZXNzRXhjZXB0aW9uLiNjdG9yKFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvbkluZm8sU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TdHJlYW1pbmdDb250ZXh0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2VyaWFsaXphdGlvbiBDb25zdHJ1Y3Rvcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERlbGVnYXRlIHVzZWQgYnkgdGVzdHMgdGhhdCBleGVjdXRlIGNvZGUgYW5kDQorICAgICAgICAgICAgY2FwdHVyZSBhbnkgdGhyb3duIGV4Y2VwdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgQXNzZXJ0IGNsYXNzIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBzdGF0aWMgbWV0aG9kcyB0aGF0DQorICAgICAgICAgICAgaW1wbGVtZW50IHRoZSBtb3N0IGNvbW1vbiBhc3NlcnRpb25zIHVzZWQgaW4gTlVuaXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC4jY3RvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV2UgZG9uJ3QgYWN0dWFsbHkgd2FudCBhbnkgaW5zdGFuY2VzIG9mIHRoaXMgb2JqZWN0LCBidXQgc29tZSBwZW9wbGUNCisgICAgICAgICAgICBsaWtlIHRvIGluaGVyaXQgZnJvbSBpdCB0byBhZGQgb3RoZXIgc3RhdGljIG1ldGhvZHMuIEhlbmNlLCB0aGUNCisgICAgICAgICAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IgZGlzYWxsb3dzIGFueSBpbnN0YW5jZXMgb2YgdGhpcyBvYmplY3QuIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuRXF1YWxzKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBFcXVhbHMgbWV0aG9kIHRocm93cyBhbiBBc3NlcnRpb25FeGNlcHRpb24uIFRoaXMgaXMgZG9uZSANCisgICAgICAgICAgICB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gbWlzdGFrZSBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJiIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5SZWZlcmVuY2VFcXVhbHMoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgUmVmZXJlbmNlRXF1YWxzIHRvIHRocm93IGFuIEFzc2VydGlvbkV4Y2VwdGlvbi4gVGhpcyANCisgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBtYWtlcyBzdXJlIHRoZXJlIGlzIG5vIG1pc3Rha2UgaW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uIA0KKyAgICAgICAgICAgIGFzIHBhcnQgb2YgQXNzZXJ0LiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImEiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImIiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFzc2VydERvdWJsZXNBcmVFcXVhbChTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhlbHBlciBmb3IgQXNzZXJ0LkFyZUVxdWFsKGRvdWJsZSBleHBlY3RlZCwgZG91YmxlIGFjdHVhbCwgLi4uKQ0KKyAgICAgICAgICAgIGFsbG93aW5nIGNvZGUgZ2VuZXJhdGlvbiB0byB3b3JrIGNvbnNpc3RlbnRseS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWx0YSI+VGhlIG1heGltdW0gYWNjZXB0YWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlDQorICAgICAgICAgICAgdGhlIGV4cGVjdGVkIGFuZCB0aGUgYWN0dWFsPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlBhc3MoU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaHJvd3MgYSA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLlN1Y2Nlc3NFeGNlcHRpb24iLz4gd2l0aCB0aGUgbWVzc2FnZSBhbmQgYXJndW1lbnRzIA0KKyAgICAgICAgICAgIHRoYXQgYXJlIHBhc3NlZCBpbi4gVGhpcyBhbGxvd3MgYSB0ZXN0IHRvIGJlIGN1dCBzaG9ydCwgd2l0aCBhIHJlc3VsdA0KKyAgICAgICAgICAgIG9mIHN1Y2Nlc3MgcmV0dXJuZWQgdG8gTlVuaXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBpbml0aWFsaXplIHRoZSA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiB3aXRoLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5QYXNzKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaHJvd3MgYSA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLlN1Y2Nlc3NFeGNlcHRpb24iLz4gd2l0aCB0aGUgbWVzc2FnZSBhbmQgYXJndW1lbnRzIA0KKyAgICAgICAgICAgIHRoYXQgYXJlIHBhc3NlZCBpbi4gVGhpcyBhbGxvd3MgYSB0ZXN0IHRvIGJlIGN1dCBzaG9ydCwgd2l0aCBhIHJlc3VsdA0KKyAgICAgICAgICAgIG9mIHN1Y2Nlc3MgcmV0dXJuZWQgdG8gTlVuaXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBpbml0aWFsaXplIHRoZSA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiB3aXRoLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlBhc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRocm93cyBhIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuU3VjY2Vzc0V4Y2VwdGlvbiIvPiB3aXRoIHRoZSBtZXNzYWdlIGFuZCBhcmd1bWVudHMgDQorICAgICAgICAgICAgdGhhdCBhcmUgcGFzc2VkIGluLiBUaGlzIGFsbG93cyBhIHRlc3QgdG8gYmUgY3V0IHNob3J0LCB3aXRoIGEgcmVzdWx0DQorICAgICAgICAgICAgb2Ygc3VjY2VzcyByZXR1cm5lZCB0byBOVW5pdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkZhaWwoU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaHJvd3MgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gd2l0aCB0aGUgbWVzc2FnZSBhbmQgYXJndW1lbnRzIA0KKyAgICAgICAgICAgIHRoYXQgYXJlIHBhc3NlZCBpbi4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBvdGhlciBBc3NlcnQgZnVuY3Rpb25zLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGluaXRpYWxpemUgdGhlIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IHdpdGguPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkZhaWwoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRocm93cyBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiB3aXRoIHRoZSBtZXNzYWdlIHRoYXQgaXMgDQorICAgICAgICAgICAgcGFzc2VkIGluLiBUaGlzIGlzIHVzZWQgYnkgdGhlIG90aGVyIEFzc2VydCBmdW5jdGlvbnMuIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gaW5pdGlhbGl6ZSB0aGUgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gd2l0aC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5GYWlsIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaHJvd3MgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4uIA0KKyAgICAgICAgICAgIFRoaXMgaXMgdXNlZCBieSB0aGUgb3RoZXIgQXNzZXJ0IGZ1bmN0aW9ucy4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5JZ25vcmUoU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaHJvd3MgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5JZ25vcmVFeGNlcHRpb24iLz4gd2l0aCB0aGUgbWVzc2FnZSBhbmQgYXJndW1lbnRzIA0KKyAgICAgICAgICAgIHRoYXQgYXJlIHBhc3NlZCBpbi4gIFRoaXMgY2F1c2VzIHRoZSB0ZXN0IHRvIGJlIHJlcG9ydGVkIGFzIGlnbm9yZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBpbml0aWFsaXplIHRoZSA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiB3aXRoLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5JZ25vcmUoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRocm93cyBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLklnbm9yZUV4Y2VwdGlvbiIvPiB3aXRoIHRoZSBtZXNzYWdlIHRoYXQgaXMgDQorICAgICAgICAgICAgcGFzc2VkIGluLiBUaGlzIGNhdXNlcyB0aGUgdGVzdCB0byBiZSByZXBvcnRlZCBhcyBpZ25vcmVkLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGluaXRpYWxpemUgdGhlIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IHdpdGguPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSWdub3JlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaHJvd3MgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5JZ25vcmVFeGNlcHRpb24iLz4uIA0KKyAgICAgICAgICAgIFRoaXMgY2F1c2VzIHRoZSB0ZXN0IHRvIGJlIHJlcG9ydGVkIGFzIGlnbm9yZWQuIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSW5jb25jbHVzaXZlKFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhyb3dzIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuSW5jb25jbHVzaXZlRXhjZXB0aW9uIi8+IHdpdGggdGhlIG1lc3NhZ2UgYW5kIGFyZ3VtZW50cyANCisgICAgICAgICAgICB0aGF0IGFyZSBwYXNzZWQgaW4uICBUaGlzIGNhdXNlcyB0aGUgdGVzdCB0byBiZSByZXBvcnRlZCBhcyBpbmNvbmNsdXNpdmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBpbml0aWFsaXplIHRoZSA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkluY29uY2x1c2l2ZUV4Y2VwdGlvbiIvPiB3aXRoLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5JbmNvbmNsdXNpdmUoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRocm93cyBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkluY29uY2x1c2l2ZUV4Y2VwdGlvbiIvPiB3aXRoIHRoZSBtZXNzYWdlIHRoYXQgaXMgDQorICAgICAgICAgICAgcGFzc2VkIGluLiBUaGlzIGNhdXNlcyB0aGUgdGVzdCB0byBiZSByZXBvcnRlZCBhcyBpbmNvbmNsdXNpdmUuIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gaW5pdGlhbGl6ZSB0aGUgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5JbmNvbmNsdXNpdmVFeGNlcHRpb24iLz4gd2l0aC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5JbmNvbmNsdXNpdmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRocm93cyBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkluY29uY2x1c2l2ZUV4Y2VwdGlvbiIvPi4gDQorICAgICAgICAgICAgVGhpcyBjYXVzZXMgdGhlIHRlc3QgdG8gYmUgcmVwb3J0ZWQgYXMgSW5jb25jbHVzaXZlLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlRoYXQoU3lzdGVtLk9iamVjdCxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbHkgYSBjb25zdHJhaW50IHRvIGFuIGFjdHVhbCB2YWx1ZSwgc3VjY2VlZGluZyBpZiB0aGUgY29uc3RyYWludA0KKyAgICAgICAgICAgIGlzIHNhdGlzZmllZCBhbmQgdGhyb3dpbmcgYW4gYXNzZXJ0aW9uIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwcmVzc2lvbiI+QSBDb25zdHJhaW50IHRvIGJlIGFwcGxpZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWUgdG8gdGVzdDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlRoYXQoU3lzdGVtLk9iamVjdCxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBcHBseSBhIGNvbnN0cmFpbnQgdG8gYW4gYWN0dWFsIHZhbHVlLCBzdWNjZWVkaW5nIGlmIHRoZSBjb25zdHJhaW50DQorICAgICAgICAgICAgaXMgc2F0aXNmaWVkIGFuZCB0aHJvd2luZyBhbiBhc3NlcnRpb24gZXhjZXB0aW9uIG9uIGZhaWx1cmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHByZXNzaW9uIj5BIENvbnN0cmFpbnQgdG8gYmUgYXBwbGllZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZSB0byB0ZXN0PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuVGhhdChTeXN0ZW0uT2JqZWN0LE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JUmVzb2x2ZUNvbnN0cmFpbnQsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBcHBseSBhIGNvbnN0cmFpbnQgdG8gYW4gYWN0dWFsIHZhbHVlLCBzdWNjZWVkaW5nIGlmIHRoZSBjb25zdHJhaW50DQorICAgICAgICAgICAgaXMgc2F0aXNmaWVkIGFuZCB0aHJvd2luZyBhbiBhc3NlcnRpb24gZXhjZXB0aW9uIG9uIGZhaWx1cmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHByZXNzaW9uIj5BIENvbnN0cmFpbnQgZXhwcmVzc2lvbiB0byBiZSBhcHBsaWVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlIHRvIHRlc3Q8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5Bcmd1bWVudHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuVGhhdChOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWN0dWFsVmFsdWVEZWxlZ2F0ZSxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbHkgYSBjb25zdHJhaW50IHRvIGFuIGFjdHVhbCB2YWx1ZSwgc3VjY2VlZGluZyBpZiB0aGUgY29uc3RyYWludA0KKyAgICAgICAgICAgIGlzIHNhdGlzZmllZCBhbmQgdGhyb3dpbmcgYW4gYXNzZXJ0aW9uIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwciI+QSBDb25zdHJhaW50IGV4cHJlc3Npb24gdG8gYmUgYXBwbGllZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlbCI+QW4gQWN0dWFsVmFsdWVEZWxlZ2F0ZSByZXR1cm5pbmcgdGhlIHZhbHVlIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlRoYXQoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFjdHVhbFZhbHVlRGVsZWdhdGUsTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLklSZXNvbHZlQ29uc3RyYWludCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbHkgYSBjb25zdHJhaW50IHRvIGFuIGFjdHVhbCB2YWx1ZSwgc3VjY2VlZGluZyBpZiB0aGUgY29uc3RyYWludA0KKyAgICAgICAgICAgIGlzIHNhdGlzZmllZCBhbmQgdGhyb3dpbmcgYW4gYXNzZXJ0aW9uIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwciI+QSBDb25zdHJhaW50IGV4cHJlc3Npb24gdG8gYmUgYXBwbGllZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlbCI+QW4gQWN0dWFsVmFsdWVEZWxlZ2F0ZSByZXR1cm5pbmcgdGhlIHZhbHVlIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlRoYXQoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFjdHVhbFZhbHVlRGVsZWdhdGUsTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLklSZXNvbHZlQ29uc3RyYWludCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IGEgY29uc3RyYWludCB0byBhbiBhY3R1YWwgdmFsdWUsIHN1Y2NlZWRpbmcgaWYgdGhlIGNvbnN0cmFpbnQNCisgICAgICAgICAgICBpcyBzYXRpc2ZpZWQgYW5kIHRocm93aW5nIGFuIGFzc2VydGlvbiBleGNlcHRpb24gb24gZmFpbHVyZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlbCI+QW4gQWN0dWFsVmFsdWVEZWxlZ2F0ZSByZXR1cm5pbmcgdGhlIHZhbHVlIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cHIiPkEgQ29uc3RyYWludCBleHByZXNzaW9uIHRvIGJlIGFwcGxpZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5Bcmd1bWVudHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuVGhhdGBgMShgYDBALE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JUmVzb2x2ZUNvbnN0cmFpbnQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBcHBseSBhIGNvbnN0cmFpbnQgdG8gYSByZWZlcmVuY2VkIHZhbHVlLCBzdWNjZWVkaW5nIGlmIHRoZSBjb25zdHJhaW50DQorICAgICAgICAgICAgaXMgc2F0aXNmaWVkIGFuZCB0aHJvd2luZyBhbiBhc3NlcnRpb24gZXhjZXB0aW9uIG9uIGZhaWx1cmUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHByZXNzaW9uIj5BIENvbnN0cmFpbnQgdG8gYmUgYXBwbGllZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZSB0byB0ZXN0PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuVGhhdGBgMShgYDBALE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JUmVzb2x2ZUNvbnN0cmFpbnQsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IGEgY29uc3RyYWludCB0byBhIHJlZmVyZW5jZWQgdmFsdWUsIHN1Y2NlZWRpbmcgaWYgdGhlIGNvbnN0cmFpbnQNCisgICAgICAgICAgICBpcyBzYXRpc2ZpZWQgYW5kIHRocm93aW5nIGFuIGFzc2VydGlvbiBleGNlcHRpb24gb24gZmFpbHVyZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cHJlc3Npb24iPkEgQ29uc3RyYWludCB0byBiZSBhcHBsaWVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlIHRvIHRlc3Q8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5UaGF0YGAxKGBgMEAsTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLklSZXNvbHZlQ29uc3RyYWludCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IGEgY29uc3RyYWludCB0byBhIHJlZmVyZW5jZWQgdmFsdWUsIHN1Y2NlZWRpbmcgaWYgdGhlIGNvbnN0cmFpbnQNCisgICAgICAgICAgICBpcyBzYXRpc2ZpZWQgYW5kIHRocm93aW5nIGFuIGFzc2VydGlvbiBleGNlcHRpb24gb24gZmFpbHVyZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cHJlc3Npb24iPkEgQ29uc3RyYWludCB0byBiZSBhcHBsaWVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlIHRvIHRlc3Q8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5Bcmd1bWVudHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuVGhhdChTeXN0ZW0uQm9vbGVhbixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhIGNvbmRpdGlvbiBpcyB0cnVlLiBJZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlIHRoZSBtZXRob2QgdGhyb3dzDQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5PiANCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29uZGl0aW9uIj5UaGUgZXZhbHVhdGVkIGNvbmRpdGlvbjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5UaGF0KFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgdHJ1ZS4gSWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZSB0aGUgbWV0aG9kIHRocm93cw0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29uZGl0aW9uIj5UaGUgZXZhbHVhdGVkIGNvbmRpdGlvbjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlRoYXQoU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgdHJ1ZS4gSWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZSB0aGUgbWV0aG9kIHRocm93cw0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29uZGl0aW9uIj5UaGUgZXZhbHVhdGVkIGNvbmRpdGlvbjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlRoYXQoTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHRoZSBjb2RlIHJlcHJlc2VudGVkIGJ5IGEgZGVsZWdhdGUgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIHRoYXQgc2F0aXNmaWVzIHRoZSBjb25zdHJhaW50IHByb3ZpZGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29kZSI+QSBUZXN0RGVsZWdhdGUgdG8gYmUgZXhlY3V0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25zdHJhaW50Ij5BIFRocm93c0NvbnN0cmFpbnQgdXNlZCBpbiB0aGUgdGVzdDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlRocm93cyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50LE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IGEgZGVsZWdhdGUgdGhyb3dzIGEgcGFydGljdWxhciBleGNlcHRpb24gd2hlbiBjYWxsZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHByZXNzaW9uIj5BIGNvbnN0cmFpbnQgdG8gYmUgc2F0aXNmaWVkIGJ5IHRoZSBleGNlcHRpb248L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2RlIj5BIFRlc3RTbmlwcGV0IGRlbGVnYXRlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlRocm93cyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50LE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgYSBkZWxlZ2F0ZSB0aHJvd3MgYSBwYXJ0aWN1bGFyIGV4Y2VwdGlvbiB3aGVuIGNhbGxlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cHJlc3Npb24iPkEgY29uc3RyYWludCB0byBiZSBzYXRpc2ZpZWQgYnkgdGhlIGV4Y2VwdGlvbjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvZGUiPkEgVGVzdFNuaXBwZXQgZGVsZWdhdGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5UaHJvd3MoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLklSZXNvbHZlQ29uc3RyYWludCxOVW5pdC5GcmFtZXdvcmsuVGVzdERlbGVnYXRlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCBhIGRlbGVnYXRlIHRocm93cyBhIHBhcnRpY3VsYXIgZXhjZXB0aW9uIHdoZW4gY2FsbGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwcmVzc2lvbiI+QSBjb25zdHJhaW50IHRvIGJlIHNhdGlzZmllZCBieSB0aGUgZXhjZXB0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29kZSI+QSBUZXN0U25pcHBldCBkZWxlZ2F0ZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlRocm93cyhTeXN0ZW0uVHlwZSxOVW5pdC5GcmFtZXdvcmsuVGVzdERlbGVnYXRlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCBhIGRlbGVnYXRlIHRocm93cyBhIHBhcnRpY3VsYXIgZXhjZXB0aW9uIHdoZW4gY2FsbGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWRFeGNlcHRpb25UeXBlIj5UaGUgZXhjZXB0aW9uIFR5cGUgZXhwZWN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2RlIj5BIFRlc3RTbmlwcGV0IGRlbGVnYXRlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlRocm93cyhTeXN0ZW0uVHlwZSxOVW5pdC5GcmFtZXdvcmsuVGVzdERlbGVnYXRlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IGEgZGVsZWdhdGUgdGhyb3dzIGEgcGFydGljdWxhciBleGNlcHRpb24gd2hlbiBjYWxsZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZEV4Y2VwdGlvblR5cGUiPlRoZSBleGNlcHRpb24gVHlwZSBleHBlY3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvZGUiPkEgVGVzdFNuaXBwZXQgZGVsZWdhdGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5UaHJvd3MoU3lzdGVtLlR5cGUsTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgYSBkZWxlZ2F0ZSB0aHJvd3MgYSBwYXJ0aWN1bGFyIGV4Y2VwdGlvbiB3aGVuIGNhbGxlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkRXhjZXB0aW9uVHlwZSI+VGhlIGV4Y2VwdGlvbiBUeXBlIGV4cGVjdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29kZSI+QSBUZXN0U25pcHBldCBkZWxlZ2F0ZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlRocm93c2BgMShOVW5pdC5GcmFtZXdvcmsuVGVzdERlbGVnYXRlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCBhIGRlbGVnYXRlIHRocm93cyBhIHBhcnRpY3VsYXIgZXhjZXB0aW9uIHdoZW4gY2FsbGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPlR5cGUgb2YgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2RlIj5BIFRlc3RTbmlwcGV0IGRlbGVnYXRlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlRocm93c2BgMShOVW5pdC5GcmFtZXdvcmsuVGVzdERlbGVnYXRlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IGEgZGVsZWdhdGUgdGhyb3dzIGEgcGFydGljdWxhciBleGNlcHRpb24gd2hlbiBjYWxsZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVCI+VHlwZSBvZiB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uPC90eXBlcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvZGUiPkEgVGVzdFNuaXBwZXQgZGVsZWdhdGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5UaHJvd3NgYDEoTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgYSBkZWxlZ2F0ZSB0aHJvd3MgYSBwYXJ0aWN1bGFyIGV4Y2VwdGlvbiB3aGVuIGNhbGxlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUIj5UeXBlIG9mIHRoZSBleHBlY3RlZCBleGNlcHRpb248L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29kZSI+QSBUZXN0U25pcHBldCBkZWxlZ2F0ZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkNhdGNoKE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IGEgZGVsZWdhdGUgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGNhbGxlZA0KKyAgICAgICAgICAgIGFuZCByZXR1cm5zIGl0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29kZSI+QSBUZXN0RGVsZWdhdGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5Bcmd1bWVudHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQ2F0Y2goTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCBhIGRlbGVnYXRlIHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBjYWxsZWQNCisgICAgICAgICAgICBhbmQgcmV0dXJucyBpdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvZGUiPkEgVGVzdERlbGVnYXRlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQ2F0Y2goTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgYSBkZWxlZ2F0ZSB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gY2FsbGVkDQorICAgICAgICAgICAgYW5kIHJldHVybnMgaXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2RlIj5BIFRlc3REZWxlZ2F0ZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkNhdGNoKFN5c3RlbS5UeXBlLE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IGEgZGVsZWdhdGUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiBhIGNlcnRhaW4gVHlwZQ0KKyAgICAgICAgICAgIG9yIG9uZSBkZXJpdmVkIGZyb20gaXQgd2hlbiBjYWxsZWQgYW5kIHJldHVybnMgaXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZEV4Y2VwdGlvblR5cGUiPlRoZSBleHBlY3RlZCBFeGNlcHRpb24gVHlwZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvZGUiPkEgVGVzdERlbGVnYXRlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkNhdGNoKFN5c3RlbS5UeXBlLE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgYSBkZWxlZ2F0ZSB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIGEgY2VydGFpbiBUeXBlDQorICAgICAgICAgICAgb3Igb25lIGRlcml2ZWQgZnJvbSBpdCB3aGVuIGNhbGxlZCBhbmQgcmV0dXJucyBpdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkRXhjZXB0aW9uVHlwZSI+VGhlIGV4cGVjdGVkIEV4Y2VwdGlvbiBUeXBlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29kZSI+QSBUZXN0RGVsZWdhdGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5DYXRjaChTeXN0ZW0uVHlwZSxOVW5pdC5GcmFtZXdvcmsuVGVzdERlbGVnYXRlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCBhIGRlbGVnYXRlIHRocm93cyBhbiBleGNlcHRpb24gb2YgYSBjZXJ0YWluIFR5cGUNCisgICAgICAgICAgICBvciBvbmUgZGVyaXZlZCBmcm9tIGl0IHdoZW4gY2FsbGVkIGFuZCByZXR1cm5zIGl0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWRFeGNlcHRpb25UeXBlIj5UaGUgZXhwZWN0ZWQgRXhjZXB0aW9uIFR5cGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2RlIj5BIFRlc3REZWxlZ2F0ZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkNhdGNoYGAxKE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IGEgZGVsZWdhdGUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiBhIGNlcnRhaW4gVHlwZQ0KKyAgICAgICAgICAgIG9yIG9uZSBkZXJpdmVkIGZyb20gaXQgd2hlbiBjYWxsZWQgYW5kIHJldHVybnMgaXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIGV4cGVjdGVkIEV4Y2VwdGlvbiBUeXBlPC90eXBlcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvZGUiPkEgVGVzdERlbGVnYXRlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkNhdGNoYGAxKE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgYSBkZWxlZ2F0ZSB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIGEgY2VydGFpbiBUeXBlDQorICAgICAgICAgICAgb3Igb25lIGRlcml2ZWQgZnJvbSBpdCB3aGVuIGNhbGxlZCBhbmQgcmV0dXJucyBpdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgZXhwZWN0ZWQgRXhjZXB0aW9uIFR5cGU8L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29kZSI+QSBUZXN0RGVsZWdhdGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5DYXRjaGBgMShOVW5pdC5GcmFtZXdvcmsuVGVzdERlbGVnYXRlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCBhIGRlbGVnYXRlIHRocm93cyBhbiBleGNlcHRpb24gb2YgYSBjZXJ0YWluIFR5cGUNCisgICAgICAgICAgICBvciBvbmUgZGVyaXZlZCBmcm9tIGl0IHdoZW4gY2FsbGVkIGFuZCByZXR1cm5zIGl0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSBleHBlY3RlZCBFeGNlcHRpb24gVHlwZTwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2RlIj5BIFRlc3REZWxlZ2F0ZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkRvZXNOb3RUaHJvdyhOVW5pdC5GcmFtZXdvcmsuVGVzdERlbGVnYXRlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCBhIGRlbGVnYXRlIGRvZXMgbm90IHRocm93IGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29kZSI+QSBUZXN0U25pcHBldCBkZWxlZ2F0ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Eb2VzTm90VGhyb3coTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCBhIGRlbGVnYXRlIGRvZXMgbm90IHRocm93IGFuIGV4Y2VwdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvZGUiPkEgVGVzdFNuaXBwZXQgZGVsZWdhdGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Eb2VzTm90VGhyb3coTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgYSBkZWxlZ2F0ZSBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2RlIj5BIFRlc3RTbmlwcGV0IGRlbGVnYXRlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuVHJ1ZShTeXN0ZW0uQm9vbGVhbixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhIGNvbmRpdGlvbiBpcyB0cnVlLiBJZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlIHRoZSBtZXRob2QgdGhyb3dzDQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPlRoZSBldmFsdWF0ZWQgY29uZGl0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlRydWUoU3lzdGVtLkJvb2xlYW4sU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhIGNvbmRpdGlvbiBpcyB0cnVlLiBJZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlIHRoZSBtZXRob2QgdGhyb3dzDQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPlRoZSBldmFsdWF0ZWQgY29uZGl0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5UcnVlKFN5c3RlbS5Cb29sZWFuKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGEgY29uZGl0aW9uIGlzIHRydWUuIElmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UgdGhlIG1ldGhvZCB0aHJvd3MNCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbmRpdGlvbiI+VGhlIGV2YWx1YXRlZCBjb25kaXRpb248L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc1RydWUoU3lzdGVtLkJvb2xlYW4sU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgdHJ1ZS4gSWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZSB0aGUgbWV0aG9kIHRocm93cw0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29uZGl0aW9uIj5UaGUgZXZhbHVhdGVkIGNvbmRpdGlvbjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc1RydWUoU3lzdGVtLkJvb2xlYW4sU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhIGNvbmRpdGlvbiBpcyB0cnVlLiBJZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlIHRoZSBtZXRob2QgdGhyb3dzDQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPlRoZSBldmFsdWF0ZWQgY29uZGl0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc1RydWUoU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgdHJ1ZS4gSWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZSB0aGUgbWV0aG9kIHRocm93cw0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29uZGl0aW9uIj5UaGUgZXZhbHVhdGVkIGNvbmRpdGlvbjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkZhbHNlKFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGEgY29uZGl0aW9uIGlzIGZhbHNlLiBJZiB0aGUgY29uZGl0aW9uIGlzIHRydWUgdGhlIG1ldGhvZCB0aHJvd3MNCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+IA0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPlRoZSBldmFsdWF0ZWQgY29uZGl0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkZhbHNlKFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgZmFsc2UuIElmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSB0aGUgbWV0aG9kIHRocm93cw0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4gDQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbmRpdGlvbiI+VGhlIGV2YWx1YXRlZCBjb25kaXRpb248L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkZhbHNlKFN5c3RlbS5Cb29sZWFuKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGEgY29uZGl0aW9uIGlzIGZhbHNlLiBJZiB0aGUgY29uZGl0aW9uIGlzIHRydWUgdGhlIG1ldGhvZCB0aHJvd3MNCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+IA0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPlRoZSBldmFsdWF0ZWQgY29uZGl0aW9uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNGYWxzZShTeXN0ZW0uQm9vbGVhbixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhIGNvbmRpdGlvbiBpcyBmYWxzZS4gSWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlIHRoZSBtZXRob2QgdGhyb3dzDQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5PiANCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29uZGl0aW9uIj5UaGUgZXZhbHVhdGVkIGNvbmRpdGlvbjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc0ZhbHNlKFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgZmFsc2UuIElmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSB0aGUgbWV0aG9kIHRocm93cw0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4gDQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbmRpdGlvbiI+VGhlIGV2YWx1YXRlZCBjb25kaXRpb248L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzRmFsc2UoU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgZmFsc2UuIElmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSB0aGUgbWV0aG9kIHRocm93cw0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4gDQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbmRpdGlvbiI+VGhlIGV2YWx1YXRlZCBjb25kaXRpb248L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Ob3ROdWxsKFN5c3RlbS5PYmplY3QsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBvYmplY3QgdGhhdCBpcyBwYXNzZWQgaW4gaXMgbm90IGVxdWFsIHRvIDxjb2RlPm51bGw8L2NvZGU+DQorICAgICAgICAgICAgSWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+DQorICAgICAgICAgICAgaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYW5PYmplY3QiPlRoZSBvYmplY3QgdGhhdCBpcyB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTm90TnVsbChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBvYmplY3QgdGhhdCBpcyBwYXNzZWQgaW4gaXMgbm90IGVxdWFsIHRvIDxjb2RlPm51bGw8L2NvZGU+DQorICAgICAgICAgICAgSWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+DQorICAgICAgICAgICAgaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYW5PYmplY3QiPlRoZSBvYmplY3QgdGhhdCBpcyB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lk5vdE51bGwoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIG9iamVjdCB0aGF0IGlzIHBhc3NlZCBpbiBpcyBub3QgZXF1YWwgdG8gPGNvZGU+bnVsbDwvY29kZT4NCisgICAgICAgICAgICBJZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4NCisgICAgICAgICAgICBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhbk9iamVjdCI+VGhlIG9iamVjdCB0aGF0IGlzIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzTm90TnVsbChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIGluIGlzIG5vdCBlcXVhbCB0byA8Y29kZT5udWxsPC9jb2RlPg0KKyAgICAgICAgICAgIElmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPg0KKyAgICAgICAgICAgIGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFuT2JqZWN0Ij5UaGUgb2JqZWN0IHRoYXQgaXMgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzTm90TnVsbChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBvYmplY3QgdGhhdCBpcyBwYXNzZWQgaW4gaXMgbm90IGVxdWFsIHRvIDxjb2RlPm51bGw8L2NvZGU+DQorICAgICAgICAgICAgSWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+DQorICAgICAgICAgICAgaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYW5PYmplY3QiPlRoZSBvYmplY3QgdGhhdCBpcyB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzTm90TnVsbChTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIGluIGlzIG5vdCBlcXVhbCB0byA8Y29kZT5udWxsPC9jb2RlPg0KKyAgICAgICAgICAgIElmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPg0KKyAgICAgICAgICAgIGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFuT2JqZWN0Ij5UaGUgb2JqZWN0IHRoYXQgaXMgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTnVsbChTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIGluIGlzIGVxdWFsIHRvIDxjb2RlPm51bGw8L2NvZGU+DQorICAgICAgICAgICAgSWYgdGhlIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPg0KKyAgICAgICAgICAgIGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFuT2JqZWN0Ij5UaGUgb2JqZWN0IHRoYXQgaXMgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lk51bGwoU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIGluIGlzIGVxdWFsIHRvIDxjb2RlPm51bGw8L2NvZGU+DQorICAgICAgICAgICAgSWYgdGhlIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPg0KKyAgICAgICAgICAgIGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFuT2JqZWN0Ij5UaGUgb2JqZWN0IHRoYXQgaXMgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5OdWxsKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBvYmplY3QgdGhhdCBpcyBwYXNzZWQgaW4gaXMgZXF1YWwgdG8gPGNvZGU+bnVsbDwvY29kZT4NCisgICAgICAgICAgICBJZiB0aGUgb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+DQorICAgICAgICAgICAgaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYW5PYmplY3QiPlRoZSBvYmplY3QgdGhhdCBpcyB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc051bGwoU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIG9iamVjdCB0aGF0IGlzIHBhc3NlZCBpbiBpcyBlcXVhbCB0byA8Y29kZT5udWxsPC9jb2RlPg0KKyAgICAgICAgICAgIElmIHRoZSBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4NCisgICAgICAgICAgICBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhbk9iamVjdCI+VGhlIG9iamVjdCB0aGF0IGlzIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc051bGwoU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIGluIGlzIGVxdWFsIHRvIDxjb2RlPm51bGw8L2NvZGU+DQorICAgICAgICAgICAgSWYgdGhlIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPg0KKyAgICAgICAgICAgIGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFuT2JqZWN0Ij5UaGUgb2JqZWN0IHRoYXQgaXMgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc051bGwoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIG9iamVjdCB0aGF0IGlzIHBhc3NlZCBpbiBpcyBlcXVhbCB0byA8Y29kZT5udWxsPC9jb2RlPg0KKyAgICAgICAgICAgIElmIHRoZSBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4NCisgICAgICAgICAgICBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhbk9iamVjdCI+VGhlIG9iamVjdCB0aGF0IGlzIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzTmFOKFN5c3RlbS5Eb3VibGUsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBkb3VibGUgdGhhdCBpcyBwYXNzZWQgaW4gaXMgYW4gPGNvZGU+TmFOPC9jb2RlPiB2YWx1ZS4NCisgICAgICAgICAgICBJZiB0aGUgb2JqZWN0IGlzIG5vdCA8Y29kZT5OYU48L2NvZGU+IHRoZW4gYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4NCisgICAgICAgICAgICBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhRG91YmxlIj5UaGUgdmFsdWUgdGhhdCBpcyB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNOYU4oU3lzdGVtLkRvdWJsZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZG91YmxlIHRoYXQgaXMgcGFzc2VkIGluIGlzIGFuIDxjb2RlPk5hTjwvY29kZT4gdmFsdWUuDQorICAgICAgICAgICAgSWYgdGhlIG9iamVjdCBpcyBub3QgPGNvZGU+TmFOPC9jb2RlPiB0aGVuIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+DQorICAgICAgICAgICAgaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYURvdWJsZSI+VGhlIHZhbHVlIHRoYXQgaXMgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc05hTihTeXN0ZW0uRG91YmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZG91YmxlIHRoYXQgaXMgcGFzc2VkIGluIGlzIGFuIDxjb2RlPk5hTjwvY29kZT4gdmFsdWUuDQorICAgICAgICAgICAgSWYgdGhlIG9iamVjdCBpcyBub3QgPGNvZGU+TmFOPC9jb2RlPiB0aGVuIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+DQorICAgICAgICAgICAgaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYURvdWJsZSI+VGhlIHZhbHVlIHRoYXQgaXMgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNOYU4oU3lzdGVtLk51bGxhYmxle1N5c3RlbS5Eb3VibGV9LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZG91YmxlIHRoYXQgaXMgcGFzc2VkIGluIGlzIGFuIDxjb2RlPk5hTjwvY29kZT4gdmFsdWUuDQorICAgICAgICAgICAgSWYgdGhlIG9iamVjdCBpcyBub3QgPGNvZGU+TmFOPC9jb2RlPiB0aGVuIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+DQorICAgICAgICAgICAgaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYURvdWJsZSI+VGhlIHZhbHVlIHRoYXQgaXMgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzTmFOKFN5c3RlbS5OdWxsYWJsZXtTeXN0ZW0uRG91YmxlfSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZG91YmxlIHRoYXQgaXMgcGFzc2VkIGluIGlzIGFuIDxjb2RlPk5hTjwvY29kZT4gdmFsdWUuDQorICAgICAgICAgICAgSWYgdGhlIG9iamVjdCBpcyBub3QgPGNvZGU+TmFOPC9jb2RlPiB0aGVuIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+DQorICAgICAgICAgICAgaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYURvdWJsZSI+VGhlIHZhbHVlIHRoYXQgaXMgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc05hTihTeXN0ZW0uTnVsbGFibGV7U3lzdGVtLkRvdWJsZX0pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBkb3VibGUgdGhhdCBpcyBwYXNzZWQgaW4gaXMgYW4gPGNvZGU+TmFOPC9jb2RlPiB2YWx1ZS4NCisgICAgICAgICAgICBJZiB0aGUgb2JqZWN0IGlzIG5vdCA8Y29kZT5OYU48L2NvZGU+IHRoZW4gYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4NCisgICAgICAgICAgICBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhRG91YmxlIj5UaGUgdmFsdWUgdGhhdCBpcyB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc0VtcHR5KFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnQgdGhhdCBhIHN0cmluZyBpcyBlbXB0eSAtIHRoYXQgaXMgZXF1YWwgdG8gc3RyaW5nLkVtcHR5DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhU3RyaW5nIj5UaGUgc3RyaW5nIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc0VtcHR5KFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydCB0aGF0IGEgc3RyaW5nIGlzIGVtcHR5IC0gdGhhdCBpcyBlcXVhbCB0byBzdHJpbmcuRW1wdHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFTdHJpbmciPlRoZSBzdHJpbmcgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc0VtcHR5KFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnQgdGhhdCBhIHN0cmluZyBpcyBlbXB0eSAtIHRoYXQgaXMgZXF1YWwgdG8gc3RyaW5nLkVtcHR5DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhU3RyaW5nIj5UaGUgc3RyaW5nIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzRW1wdHkoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0IHRoYXQgYW4gYXJyYXksIGxpc3Qgb3Igb3RoZXIgY29sbGVjdGlvbiBpcyBlbXB0eQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+QW4gYXJyYXksIGxpc3Qgb3Igb3RoZXIgY29sbGVjdGlvbiBpbXBsZW1lbnRpbmcgSUNvbGxlY3Rpb248L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNFbXB0eShTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydCB0aGF0IGFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaXMgZW1wdHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPkFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaW1wbGVtZW50aW5nIElDb2xsZWN0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc0VtcHR5KFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydCB0aGF0IGFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaXMgZW1wdHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPkFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaW1wbGVtZW50aW5nIElDb2xsZWN0aW9uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNOb3RFbXB0eShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0IHRoYXQgYSBzdHJpbmcgaXMgbm90IGVtcHR5IC0gdGhhdCBpcyBub3QgZXF1YWwgdG8gc3RyaW5nLkVtcHR5DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhU3RyaW5nIj5UaGUgc3RyaW5nIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc05vdEVtcHR5KFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydCB0aGF0IGEgc3RyaW5nIGlzIG5vdCBlbXB0eSAtIHRoYXQgaXMgbm90IGVxdWFsIHRvIHN0cmluZy5FbXB0eQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYVN0cmluZyI+VGhlIHN0cmluZyB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzTm90RW1wdHkoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydCB0aGF0IGEgc3RyaW5nIGlzIG5vdCBlbXB0eSAtIHRoYXQgaXMgbm90IGVxdWFsIHRvIHN0cmluZy5FbXB0eQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYVN0cmluZyI+VGhlIHN0cmluZyB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc05vdEVtcHR5KFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydCB0aGF0IGFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaXMgbm90IGVtcHR5DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5BbiBhcnJheSwgbGlzdCBvciBvdGhlciBjb2xsZWN0aW9uIGltcGxlbWVudGluZyBJQ29sbGVjdGlvbjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc05vdEVtcHR5KFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0IHRoYXQgYW4gYXJyYXksIGxpc3Qgb3Igb3RoZXIgY29sbGVjdGlvbiBpcyBub3QgZW1wdHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPkFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaW1wbGVtZW50aW5nIElDb2xsZWN0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc05vdEVtcHR5KFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydCB0aGF0IGFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaXMgbm90IGVtcHR5DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5BbiBhcnJheSwgbGlzdCBvciBvdGhlciBjb2xsZWN0aW9uIGltcGxlbWVudGluZyBJQ29sbGVjdGlvbjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzTnVsbE9yRW1wdHkoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydCB0aGF0IGEgc3RyaW5nIGlzIGVpdGhlciBudWxsIG9yIGVxdWFsIHRvIHN0cmluZy5FbXB0eQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYVN0cmluZyI+VGhlIHN0cmluZyB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNOdWxsT3JFbXB0eShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnQgdGhhdCBhIHN0cmluZyBpcyBlaXRoZXIgbnVsbCBvciBlcXVhbCB0byBzdHJpbmcuRW1wdHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFTdHJpbmciPlRoZSBzdHJpbmcgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc051bGxPckVtcHR5KFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnQgdGhhdCBhIHN0cmluZyBpcyBlaXRoZXIgbnVsbCBvciBlcXVhbCB0byBzdHJpbmcuRW1wdHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFTdHJpbmciPlRoZSBzdHJpbmcgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNOb3ROdWxsT3JFbXB0eShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0IHRoYXQgYSBzdHJpbmcgaXMgbm90IG51bGwgb3IgZW1wdHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFTdHJpbmciPlRoZSBzdHJpbmcgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzTm90TnVsbE9yRW1wdHkoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0IHRoYXQgYSBzdHJpbmcgaXMgbm90IG51bGwgb3IgZW1wdHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFTdHJpbmciPlRoZSBzdHJpbmcgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc05vdE51bGxPckVtcHR5KFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnQgdGhhdCBhIHN0cmluZyBpcyBub3QgbnVsbCBvciBlbXB0eQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYVN0cmluZyI+VGhlIHN0cmluZyB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc0Fzc2lnbmFibGVGcm9tKFN5c3RlbS5UeXBlLFN5c3RlbS5PYmplY3QsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYW4gb2JqZWN0IG1heSBiZSBhc3NpZ25lZCBhICB2YWx1ZSBvZiBhIGdpdmVuIFR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIFR5cGUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgb2JqZWN0IHVuZGVyIGV4YW1pbmF0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzQXNzaWduYWJsZUZyb20oU3lzdGVtLlR5cGUsU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBtYXkgYmUgYXNzaWduZWQgYSAgdmFsdWUgb2YgYSBnaXZlbiBUeXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBUeXBlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIG9iamVjdCB1bmRlciBleGFtaW5hdGlvbjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNBc3NpZ25hYmxlRnJvbShTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBtYXkgYmUgYXNzaWduZWQgYSAgdmFsdWUgb2YgYSBnaXZlbiBUeXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBUeXBlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIG9iamVjdCB1bmRlciBleGFtaW5hdGlvbjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzQXNzaWduYWJsZUZyb21gYDEoU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgbWF5IGJlIGFzc2lnbmVkIGEgIHZhbHVlIG9mIGEgZ2l2ZW4gVHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgZXhwZWN0ZWQgVHlwZS48L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgb2JqZWN0IHVuZGVyIGV4YW1pbmF0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzQXNzaWduYWJsZUZyb21gYDEoU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBtYXkgYmUgYXNzaWduZWQgYSAgdmFsdWUgb2YgYSBnaXZlbiBUeXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSBleHBlY3RlZCBUeXBlLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBvYmplY3QgdW5kZXIgZXhhbWluYXRpb248L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzQXNzaWduYWJsZUZyb21gYDEoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgbWF5IGJlIGFzc2lnbmVkIGEgIHZhbHVlIG9mIGEgZ2l2ZW4gVHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgZXhwZWN0ZWQgVHlwZS48L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgb2JqZWN0IHVuZGVyIGV4YW1pbmF0aW9uPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNOb3RBc3NpZ25hYmxlRnJvbShTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBtYXkgbm90IGJlIGFzc2lnbmVkIGEgIHZhbHVlIG9mIGEgZ2l2ZW4gVHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgVHlwZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBvYmplY3QgdW5kZXIgZXhhbWluYXRpb248L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNOb3RBc3NpZ25hYmxlRnJvbShTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYW4gb2JqZWN0IG1heSBub3QgYmUgYXNzaWduZWQgYSAgdmFsdWUgb2YgYSBnaXZlbiBUeXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBUeXBlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIG9iamVjdCB1bmRlciBleGFtaW5hdGlvbjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNOb3RBc3NpZ25hYmxlRnJvbShTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBtYXkgbm90IGJlIGFzc2lnbmVkIGEgIHZhbHVlIG9mIGEgZ2l2ZW4gVHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgVHlwZS48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBvYmplY3QgdW5kZXIgZXhhbWluYXRpb248L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc05vdEFzc2lnbmFibGVGcm9tYGAxKFN5c3RlbS5PYmplY3QsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYW4gb2JqZWN0IG1heSBub3QgYmUgYXNzaWduZWQgYSAgdmFsdWUgb2YgYSBnaXZlbiBUeXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSBleHBlY3RlZCBUeXBlLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBvYmplY3QgdW5kZXIgZXhhbWluYXRpb248L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNOb3RBc3NpZ25hYmxlRnJvbWBgMShTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYW4gb2JqZWN0IG1heSBub3QgYmUgYXNzaWduZWQgYSAgdmFsdWUgb2YgYSBnaXZlbiBUeXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSBleHBlY3RlZCBUeXBlLjwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBvYmplY3QgdW5kZXIgZXhhbWluYXRpb248L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzTm90QXNzaWduYWJsZUZyb21gYDEoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgbWF5IG5vdCBiZSBhc3NpZ25lZCBhICB2YWx1ZSBvZiBhIGdpdmVuIFR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIGV4cGVjdGVkIFR5cGUuPC90eXBlcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIG9iamVjdCB1bmRlciBleGFtaW5hdGlvbjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzSW5zdGFuY2VPZihTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBhIGdpdmVuIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIFR5cGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBvYmplY3QgYmVpbmcgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNJbnN0YW5jZU9mKFN5c3RlbS5UeXBlLFN5c3RlbS5PYmplY3QsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBUeXBlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgb2JqZWN0IGJlaW5nIGV4YW1pbmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc0luc3RhbmNlT2YoU3lzdGVtLlR5cGUsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBUeXBlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgb2JqZWN0IGJlaW5nIGV4YW1pbmVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBhIGdpdmVuIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIFR5cGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBvYmplY3QgYmVpbmcgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYW4gb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIGEgZ2l2ZW4gdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgVHlwZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIG9iamVjdCBiZWluZyBleGFtaW5lZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBhIGdpdmVuIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIFR5cGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBvYmplY3QgYmVpbmcgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc0luc3RhbmNlT2ZgYDEoU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSBleHBlY3RlZCBUeXBlPC90eXBlcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIG9iamVjdCBiZWluZyBleGFtaW5lZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc0luc3RhbmNlT2ZgYDEoU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBhIGdpdmVuIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIGV4cGVjdGVkIFR5cGU8L3R5cGVwYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgb2JqZWN0IGJlaW5nIGV4YW1pbmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc0luc3RhbmNlT2ZgYDEoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSBleHBlY3RlZCBUeXBlPC90eXBlcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIG9iamVjdCBiZWluZyBleGFtaW5lZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzTm90SW5zdGFuY2VPZihTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBUeXBlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgb2JqZWN0IGJlaW5nIGV4YW1pbmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzTm90SW5zdGFuY2VPZihTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYW4gb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBhIGdpdmVuIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIFR5cGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBvYmplY3QgYmVpbmcgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzTm90SW5zdGFuY2VPZihTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBUeXBlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgb2JqZWN0IGJlaW5nIGV4YW1pbmVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNOb3RJbnN0YW5jZU9mVHlwZShTeXN0ZW0uVHlwZSxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBUeXBlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgb2JqZWN0IGJlaW5nIGV4YW1pbmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzTm90SW5zdGFuY2VPZlR5cGUoU3lzdGVtLlR5cGUsU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBUeXBlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgb2JqZWN0IGJlaW5nIGV4YW1pbmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc05vdEluc3RhbmNlT2ZUeXBlKFN5c3RlbS5UeXBlLFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYW4gb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBhIGdpdmVuIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIFR5cGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBvYmplY3QgYmVpbmcgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Jc05vdEluc3RhbmNlT2ZgYDEoU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIGEgZ2l2ZW4gdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgZXhwZWN0ZWQgVHlwZTwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBvYmplY3QgYmVpbmcgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuSXNOb3RJbnN0YW5jZU9mYGAxKFN5c3RlbS5PYmplY3QsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIGEgZ2l2ZW4gdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgZXhwZWN0ZWQgVHlwZTwvdHlwZXBhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBvYmplY3QgYmVpbmcgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LklzTm90SW5zdGFuY2VPZmBgMShTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiB0eXBlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSBleHBlY3RlZCBUeXBlPC90eXBlcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIG9iamVjdCBiZWluZyBleGFtaW5lZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5JbnQzMixTeXN0ZW0uSW50MzIsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byB2YWx1ZXMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsIHRoZW4gYW4gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVFcXVhbChTeXN0ZW0uSW50MzIsU3lzdGVtLkludDMyLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byB2YWx1ZXMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsIHRoZW4gYW4gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLkludDMyLFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIHZhbHVlcyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwgdGhlbiBhbiANCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLkludDY0LFN5c3RlbS5JbnQ2NCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIHZhbHVlcyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwgdGhlbiBhbiANCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5JbnQ2NCxTeXN0ZW0uSW50NjQsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIHZhbHVlcyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwgdGhlbiBhbiANCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVFcXVhbChTeXN0ZW0uSW50NjQsU3lzdGVtLkludDY0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gdmFsdWVzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LCB0aGVuIGFuIA0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVFcXVhbChTeXN0ZW0uVUludDMyLFN5c3RlbS5VSW50MzIsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byB2YWx1ZXMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsIHRoZW4gYW4gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVFcXVhbChTeXN0ZW0uVUludDMyLFN5c3RlbS5VSW50MzIsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIHZhbHVlcyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwgdGhlbiBhbiANCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVFcXVhbChTeXN0ZW0uVUludDMyLFN5c3RlbS5VSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byB2YWx1ZXMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsIHRoZW4gYW4gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5VSW50NjQsU3lzdGVtLlVJbnQ2NCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIHZhbHVlcyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwgdGhlbiBhbiANCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5VSW50NjQsU3lzdGVtLlVJbnQ2NCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gdmFsdWVzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LCB0aGVuIGFuIA0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5VSW50NjQsU3lzdGVtLlVJbnQ2NCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIHZhbHVlcyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwgdGhlbiBhbiANCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLkRlY2ltYWwsU3lzdGVtLkRlY2ltYWwsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byB2YWx1ZXMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsIHRoZW4gYW4gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVFcXVhbChTeXN0ZW0uRGVjaW1hbCxTeXN0ZW0uRGVjaW1hbCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gdmFsdWVzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LCB0aGVuIGFuIA0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5EZWNpbWFsLFN5c3RlbS5EZWNpbWFsKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gdmFsdWVzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LCB0aGVuIGFuIA0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVFcXVhbChTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIGRvdWJsZXMgYXJlIGVxdWFsIGNvbnNpZGVyaW5nIGEgZGVsdGEuIElmIHRoZQ0KKyAgICAgICAgICAgIGV4cGVjdGVkIHZhbHVlIGlzIGluZmluaXR5IHRoZW4gdGhlIGRlbHRhIHZhbHVlIGlzIGlnbm9yZWQuIElmIA0KKyAgICAgICAgICAgIHRoZXkgYXJlIG5vdCBlcXVhbCB0aGVuIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzDQorICAgICAgICAgICAgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlbHRhIj5UaGUgbWF4aW11bSBhY2NlcHRhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUNCisgICAgICAgICAgICB0aGUgZXhwZWN0ZWQgYW5kIHRoZSBhY3R1YWw8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIGRvdWJsZXMgYXJlIGVxdWFsIGNvbnNpZGVyaW5nIGEgZGVsdGEuIElmIHRoZQ0KKyAgICAgICAgICAgIGV4cGVjdGVkIHZhbHVlIGlzIGluZmluaXR5IHRoZW4gdGhlIGRlbHRhIHZhbHVlIGlzIGlnbm9yZWQuIElmIA0KKyAgICAgICAgICAgIHRoZXkgYXJlIG5vdCBlcXVhbCB0aGVuIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzDQorICAgICAgICAgICAgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlbHRhIj5UaGUgbWF4aW11bSBhY2NlcHRhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUNCisgICAgICAgICAgICB0aGUgZXhwZWN0ZWQgYW5kIHRoZSBhY3R1YWw8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gZG91YmxlcyBhcmUgZXF1YWwgY29uc2lkZXJpbmcgYSBkZWx0YS4gSWYgdGhlDQorICAgICAgICAgICAgZXhwZWN0ZWQgdmFsdWUgaXMgaW5maW5pdHkgdGhlbiB0aGUgZGVsdGEgdmFsdWUgaXMgaWdub3JlZC4gSWYgDQorICAgICAgICAgICAgdGhleSBhcmUgbm90IGVxdWFsIHRoZW4gYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMNCisgICAgICAgICAgICB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVsdGEiPlRoZSBtYXhpbXVtIGFjY2VwdGFibGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQ0KKyAgICAgICAgICAgIHRoZSBleHBlY3RlZCBhbmQgdGhlIGFjdHVhbDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5Eb3VibGUsU3lzdGVtLk51bGxhYmxle1N5c3RlbS5Eb3VibGV9LFN5c3RlbS5Eb3VibGUsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byBkb3VibGVzIGFyZSBlcXVhbCBjb25zaWRlcmluZyBhIGRlbHRhLiBJZiB0aGUNCisgICAgICAgICAgICBleHBlY3RlZCB2YWx1ZSBpcyBpbmZpbml0eSB0aGVuIHRoZSBkZWx0YSB2YWx1ZSBpcyBpZ25vcmVkLiBJZiANCisgICAgICAgICAgICB0aGV5IGFyZSBub3QgZXF1YWwgdGhlbiBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcw0KKyAgICAgICAgICAgIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWx0YSI+VGhlIG1heGltdW0gYWNjZXB0YWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlDQorICAgICAgICAgICAgdGhlIGV4cGVjdGVkIGFuZCB0aGUgYWN0dWFsPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5Eb3VibGUsU3lzdGVtLk51bGxhYmxle1N5c3RlbS5Eb3VibGV9LFN5c3RlbS5Eb3VibGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIGRvdWJsZXMgYXJlIGVxdWFsIGNvbnNpZGVyaW5nIGEgZGVsdGEuIElmIHRoZQ0KKyAgICAgICAgICAgIGV4cGVjdGVkIHZhbHVlIGlzIGluZmluaXR5IHRoZW4gdGhlIGRlbHRhIHZhbHVlIGlzIGlnbm9yZWQuIElmIA0KKyAgICAgICAgICAgIHRoZXkgYXJlIG5vdCBlcXVhbCB0aGVuIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzDQorICAgICAgICAgICAgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlbHRhIj5UaGUgbWF4aW11bSBhY2NlcHRhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUNCisgICAgICAgICAgICB0aGUgZXhwZWN0ZWQgYW5kIHRoZSBhY3R1YWw8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5Eb3VibGUsU3lzdGVtLk51bGxhYmxle1N5c3RlbS5Eb3VibGV9LFN5c3RlbS5Eb3VibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byBkb3VibGVzIGFyZSBlcXVhbCBjb25zaWRlcmluZyBhIGRlbHRhLiBJZiB0aGUNCisgICAgICAgICAgICBleHBlY3RlZCB2YWx1ZSBpcyBpbmZpbml0eSB0aGVuIHRoZSBkZWx0YSB2YWx1ZSBpcyBpZ25vcmVkLiBJZiANCisgICAgICAgICAgICB0aGV5IGFyZSBub3QgZXF1YWwgdGhlbiBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcw0KKyAgICAgICAgICAgIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWx0YSI+VGhlIG1heGltdW0gYWNjZXB0YWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlDQorICAgICAgICAgICAgdGhlIGV4cGVjdGVkIGFuZCB0aGUgYWN0dWFsPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gb2JqZWN0cyBhcmUgZXF1YWwuICBUd28gb2JqZWN0cyBhcmUgY29uc2lkZXJlZA0KKyAgICAgICAgICAgIGVxdWFsIGlmIGJvdGggYXJlIG51bGwsIG9yIGlmIGJvdGggaGF2ZSB0aGUgc2FtZSB2YWx1ZS4gTlVuaXQNCisgICAgICAgICAgICBoYXMgc3BlY2lhbCBzZW1hbnRpY3MgZm9yIHNvbWUgb2JqZWN0IHR5cGVzLg0KKyAgICAgICAgICAgIElmIHRoZXkgYXJlIG5vdCBlcXVhbCBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byBvYmplY3RzIGFyZSBlcXVhbC4gIFR3byBvYmplY3RzIGFyZSBjb25zaWRlcmVkDQorICAgICAgICAgICAgZXF1YWwgaWYgYm90aCBhcmUgbnVsbCwgb3IgaWYgYm90aCBoYXZlIHRoZSBzYW1lIHZhbHVlLiBOVW5pdA0KKyAgICAgICAgICAgIGhhcyBzcGVjaWFsIHNlbWFudGljcyBmb3Igc29tZSBvYmplY3QgdHlwZXMuDQorICAgICAgICAgICAgSWYgdGhleSBhcmUgbm90IGVxdWFsIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgdmFsdWUgdGhhdCBpcyBleHBlY3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gb2JqZWN0cyBhcmUgZXF1YWwuICBUd28gb2JqZWN0cyBhcmUgY29uc2lkZXJlZA0KKyAgICAgICAgICAgIGVxdWFsIGlmIGJvdGggYXJlIG51bGwsIG9yIGlmIGJvdGggaGF2ZSB0aGUgc2FtZSB2YWx1ZS4gTlVuaXQNCisgICAgICAgICAgICBoYXMgc3BlY2lhbCBzZW1hbnRpY3MgZm9yIHNvbWUgb2JqZWN0IHR5cGVzLg0KKyAgICAgICAgICAgIElmIHRoZXkgYXJlIG5vdCBlcXVhbCBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uSW50MzIsU3lzdGVtLkludDMyLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gdmFsdWVzIGFyZSBub3QgZXF1YWwuIElmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIGFuIA0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLkludDMyLFN5c3RlbS5JbnQzMixTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gdmFsdWVzIGFyZSBub3QgZXF1YWwuIElmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIGFuIA0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5JbnQzMixTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byB2YWx1ZXMgYXJlIG5vdCBlcXVhbC4gSWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gYW4gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5JbnQ2NCxTeXN0ZW0uSW50NjQsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byB2YWx1ZXMgYXJlIG5vdCBlcXVhbC4gSWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gYW4gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uSW50NjQsU3lzdGVtLkludDY0LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byB2YWx1ZXMgYXJlIG5vdCBlcXVhbC4gSWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gYW4gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLkludDY0LFN5c3RlbS5JbnQ2NCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIHZhbHVlcyBhcmUgbm90IGVxdWFsLiBJZiB0aGV5IGFyZSBlcXVhbCwgdGhlbiBhbiANCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLlVJbnQzMixTeXN0ZW0uVUludDMyLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gdmFsdWVzIGFyZSBub3QgZXF1YWwuIElmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIGFuIA0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLlVJbnQzMixTeXN0ZW0uVUludDMyLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byB2YWx1ZXMgYXJlIG5vdCBlcXVhbC4gSWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gYW4gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLlVJbnQzMixTeXN0ZW0uVUludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gdmFsdWVzIGFyZSBub3QgZXF1YWwuIElmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIGFuIA0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uVUludDY0LFN5c3RlbS5VSW50NjQsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byB2YWx1ZXMgYXJlIG5vdCBlcXVhbC4gSWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gYW4gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uVUludDY0LFN5c3RlbS5VSW50NjQsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIHZhbHVlcyBhcmUgbm90IGVxdWFsLiBJZiB0aGV5IGFyZSBlcXVhbCwgdGhlbiBhbiANCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uVUludDY0LFN5c3RlbS5VSW50NjQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byB2YWx1ZXMgYXJlIG5vdCBlcXVhbC4gSWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gYW4gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5EZWNpbWFsLFN5c3RlbS5EZWNpbWFsLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gdmFsdWVzIGFyZSBub3QgZXF1YWwuIElmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIGFuIA0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLkRlY2ltYWwsU3lzdGVtLkRlY2ltYWwsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIHZhbHVlcyBhcmUgbm90IGVxdWFsLiBJZiB0aGV5IGFyZSBlcXVhbCwgdGhlbiBhbiANCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uRGVjaW1hbCxTeXN0ZW0uRGVjaW1hbCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIHZhbHVlcyBhcmUgbm90IGVxdWFsLiBJZiB0aGV5IGFyZSBlcXVhbCwgdGhlbiBhbiANCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU2luZ2xlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gdmFsdWVzIGFyZSBub3QgZXF1YWwuIElmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIGFuIA0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU2luZ2xlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byB2YWx1ZXMgYXJlIG5vdCBlcXVhbC4gSWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gYW4gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU2luZ2xlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gdmFsdWVzIGFyZSBub3QgZXF1YWwuIElmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIGFuIA0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byB2YWx1ZXMgYXJlIG5vdCBlcXVhbC4gSWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gYW4gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIHZhbHVlcyBhcmUgbm90IGVxdWFsLiBJZiB0aGV5IGFyZSBlcXVhbCwgdGhlbiBhbiANCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byB2YWx1ZXMgYXJlIG5vdCBlcXVhbC4gSWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gYW4gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbC4gIFR3byBvYmplY3RzIGFyZSBjb25zaWRlcmVkDQorICAgICAgICAgICAgZXF1YWwgaWYgYm90aCBhcmUgbnVsbCwgb3IgaWYgYm90aCBoYXZlIHRoZSBzYW1lIHZhbHVlLiBOVW5pdA0KKyAgICAgICAgICAgIGhhcyBzcGVjaWFsIHNlbWFudGljcyBmb3Igc29tZSBvYmplY3QgdHlwZXMuDQorICAgICAgICAgICAgSWYgdGhleSBhcmUgZXF1YWwgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsLiAgVHdvIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQNCisgICAgICAgICAgICBlcXVhbCBpZiBib3RoIGFyZSBudWxsLCBvciBpZiBib3RoIGhhdmUgdGhlIHNhbWUgdmFsdWUuIE5Vbml0DQorICAgICAgICAgICAgaGFzIHNwZWNpYWwgc2VtYW50aWNzIGZvciBzb21lIG9iamVjdCB0eXBlcy4NCisgICAgICAgICAgICBJZiB0aGV5IGFyZSBlcXVhbCBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbC4gIFR3byBvYmplY3RzIGFyZSBjb25zaWRlcmVkDQorICAgICAgICAgICAgZXF1YWwgaWYgYm90aCBhcmUgbnVsbCwgb3IgaWYgYm90aCBoYXZlIHRoZSBzYW1lIHZhbHVlLiBOVW5pdA0KKyAgICAgICAgICAgIGhhcyBzcGVjaWFsIHNlbWFudGljcyBmb3Igc29tZSBvYmplY3QgdHlwZXMuDQorICAgICAgICAgICAgSWYgdGhleSBhcmUgZXF1YWwgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlU2FtZShTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgdHdvIG9iamVjdHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0LiBJZiB0aGV5DQorICAgICAgICAgICAgYXJlIG5vdCB0aGUgc2FtZSBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIG9iamVjdDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCBvYmplY3Q8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlU2FtZShTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCB0d28gb2JqZWN0cyByZWZlciB0byB0aGUgc2FtZSBvYmplY3QuIElmIHRoZXkNCisgICAgICAgICAgICBhcmUgbm90IHRoZSBzYW1lIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgb2JqZWN0PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIG9iamVjdDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuQXJlU2FtZShTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgdHdvIG9iamVjdHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0LiBJZiB0aGV5DQorICAgICAgICAgICAgYXJlIG5vdCB0aGUgc2FtZSBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIG9iamVjdDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCBvYmplY3Q8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVOb3RTYW1lKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCB0d28gb2JqZWN0cyBkbyBub3QgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0LiBJZiB0aGV5DQorICAgICAgICAgICAgYXJlIHRoZSBzYW1lIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgb2JqZWN0PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIG9iamVjdDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVOb3RTYW1lKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHR3byBvYmplY3RzIGRvIG5vdCByZWZlciB0byB0aGUgc2FtZSBvYmplY3QuIElmIHRoZXkNCisgICAgICAgICAgICBhcmUgdGhlIHNhbWUgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBvYmplY3Q8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgb2JqZWN0PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5BcmVOb3RTYW1lKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCB0d28gb2JqZWN0cyBkbyBub3QgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0LiBJZiB0aGV5DQorICAgICAgICAgICAgYXJlIHRoZSBzYW1lIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgb2JqZWN0PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIG9iamVjdDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXIoU3lzdGVtLkludDMyLFN5c3RlbS5JbnQzMixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXIoU3lzdGVtLkludDMyLFN5c3RlbS5JbnQzMixTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXIoU3lzdGVtLkludDMyLFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlcihTeXN0ZW0uVUludDMyLFN5c3RlbS5VSW50MzIsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyKFN5c3RlbS5VSW50MzIsU3lzdGVtLlVJbnQzMixTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXIoU3lzdGVtLlVJbnQzMixTeXN0ZW0uVUludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyKFN5c3RlbS5JbnQ2NCxTeXN0ZW0uSW50NjQsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyKFN5c3RlbS5JbnQ2NCxTeXN0ZW0uSW50NjQsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyKFN5c3RlbS5JbnQ2NCxTeXN0ZW0uSW50NjQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXIoU3lzdGVtLlVJbnQ2NCxTeXN0ZW0uVUludDY0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlcihTeXN0ZW0uVUludDY0LFN5c3RlbS5VSW50NjQsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyKFN5c3RlbS5VSW50NjQsU3lzdGVtLlVJbnQ2NCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlcihTeXN0ZW0uRGVjaW1hbCxTeXN0ZW0uRGVjaW1hbCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXIoU3lzdGVtLkRlY2ltYWwsU3lzdGVtLkRlY2ltYWwsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyKFN5c3RlbS5EZWNpbWFsLFN5c3RlbS5EZWNpbWFsKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyKFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXIoU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlcihTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXIoU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU2luZ2xlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlcihTeXN0ZW0uU2luZ2xlLFN5c3RlbS5TaW5nbGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyKFN5c3RlbS5TaW5nbGUsU3lzdGVtLlNpbmdsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlcihTeXN0ZW0uSUNvbXBhcmFibGUsU3lzdGVtLklDb21wYXJhYmxlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlcihTeXN0ZW0uSUNvbXBhcmFibGUsU3lzdGVtLklDb21wYXJhYmxlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlcihTeXN0ZW0uSUNvbXBhcmFibGUsU3lzdGVtLklDb21wYXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzKFN5c3RlbS5JbnQzMixTeXN0ZW0uSW50MzIsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzKFN5c3RlbS5JbnQzMixTeXN0ZW0uSW50MzIsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzKFN5c3RlbS5JbnQzMixTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3MoU3lzdGVtLlVJbnQzMixTeXN0ZW0uVUludDMyLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzcyhTeXN0ZW0uVUludDMyLFN5c3RlbS5VSW50MzIsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzKFN5c3RlbS5VSW50MzIsU3lzdGVtLlVJbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzcyhTeXN0ZW0uSW50NjQsU3lzdGVtLkludDY0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzcyhTeXN0ZW0uSW50NjQsU3lzdGVtLkludDY0LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzcyhTeXN0ZW0uSW50NjQsU3lzdGVtLkludDY0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzKFN5c3RlbS5VSW50NjQsU3lzdGVtLlVJbnQ2NCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3MoU3lzdGVtLlVJbnQ2NCxTeXN0ZW0uVUludDY0LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzcyhTeXN0ZW0uVUludDY0LFN5c3RlbS5VSW50NjQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3MoU3lzdGVtLkRlY2ltYWwsU3lzdGVtLkRlY2ltYWwsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzKFN5c3RlbS5EZWNpbWFsLFN5c3RlbS5EZWNpbWFsLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzcyhTeXN0ZW0uRGVjaW1hbCxTeXN0ZW0uRGVjaW1hbCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzcyhTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzKFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3MoU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzKFN5c3RlbS5TaW5nbGUsU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3MoU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU2luZ2xlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzcyhTeXN0ZW0uU2luZ2xlLFN5c3RlbS5TaW5nbGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3MoU3lzdGVtLklDb21wYXJhYmxlLFN5c3RlbS5JQ29tcGFyYWJsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3MoU3lzdGVtLklDb21wYXJhYmxlLFN5c3RlbS5JQ29tcGFyYWJsZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3MoU3lzdGVtLklDb21wYXJhYmxlLFN5c3RlbS5JQ29tcGFyYWJsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlck9yRXF1YWwoU3lzdGVtLkludDMyLFN5c3RlbS5JbnQzMixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b3RoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlck9yRXF1YWwoU3lzdGVtLkludDMyLFN5c3RlbS5JbnQzMixTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlck9yRXF1YWwoU3lzdGVtLkludDMyLFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b3RoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyT3JFcXVhbChTeXN0ZW0uVUludDMyLFN5c3RlbS5VSW50MzIsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG90aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXJPckVxdWFsKFN5c3RlbS5VSW50MzIsU3lzdGVtLlVJbnQzMixTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlck9yRXF1YWwoU3lzdGVtLlVJbnQzMixTeXN0ZW0uVUludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXJPckVxdWFsKFN5c3RlbS5JbnQ2NCxTeXN0ZW0uSW50NjQsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG90aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXJPckVxdWFsKFN5c3RlbS5JbnQ2NCxTeXN0ZW0uSW50NjQsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b3RoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXJPckVxdWFsKFN5c3RlbS5JbnQ2NCxTeXN0ZW0uSW50NjQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG90aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlck9yRXF1YWwoU3lzdGVtLlVJbnQ2NCxTeXN0ZW0uVUludDY0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyT3JFcXVhbChTeXN0ZW0uVUludDY0LFN5c3RlbS5VSW50NjQsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b3RoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXJPckVxdWFsKFN5c3RlbS5VSW50NjQsU3lzdGVtLlVJbnQ2NCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b3RoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyT3JFcXVhbChTeXN0ZW0uRGVjaW1hbCxTeXN0ZW0uRGVjaW1hbCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b3RoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlck9yRXF1YWwoU3lzdGVtLkRlY2ltYWwsU3lzdGVtLkRlY2ltYWwsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b3RoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXJPckVxdWFsKFN5c3RlbS5EZWNpbWFsLFN5c3RlbS5EZWNpbWFsKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXJPckVxdWFsKFN5c3RlbS5Eb3VibGUsU3lzdGVtLkRvdWJsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b3RoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlck9yRXF1YWwoU3lzdGVtLkRvdWJsZSxTeXN0ZW0uRG91YmxlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG90aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyT3JFcXVhbChTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG90aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuR3JlYXRlck9yRXF1YWwoU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU2luZ2xlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyT3JFcXVhbChTeXN0ZW0uU2luZ2xlLFN5c3RlbS5TaW5nbGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b3RoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkdyZWF0ZXJPckVxdWFsKFN5c3RlbS5TaW5nbGUsU3lzdGVtLlNpbmdsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b3RoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyT3JFcXVhbChTeXN0ZW0uSUNvbXBhcmFibGUsU3lzdGVtLklDb21wYXJhYmxlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyT3JFcXVhbChTeXN0ZW0uSUNvbXBhcmFibGUsU3lzdGVtLklDb21wYXJhYmxlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG90aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5HcmVhdGVyT3JFcXVhbChTeXN0ZW0uSUNvbXBhcmFibGUsU3lzdGVtLklDb21wYXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3NPckVxdWFsKFN5c3RlbS5JbnQzMixTeXN0ZW0uSW50MzIsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzT3JFcXVhbChTeXN0ZW0uSW50MzIsU3lzdGVtLkludDMyLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzc09yRXF1YWwoU3lzdGVtLkludDMyLFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzc09yRXF1YWwoU3lzdGVtLlVJbnQzMixTeXN0ZW0uVUludDMyLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzc09yRXF1YWwoU3lzdGVtLlVJbnQzMixTeXN0ZW0uVUludDMyLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzc09yRXF1YWwoU3lzdGVtLlVJbnQzMixTeXN0ZW0uVUludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzT3JFcXVhbChTeXN0ZW0uSW50NjQsU3lzdGVtLkludDY0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzc09yRXF1YWwoU3lzdGVtLkludDY0LFN5c3RlbS5JbnQ2NCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3NPckVxdWFsKFN5c3RlbS5JbnQ2NCxTeXN0ZW0uSW50NjQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3NPckVxdWFsKFN5c3RlbS5VSW50NjQsU3lzdGVtLlVJbnQ2NCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3NPckVxdWFsKFN5c3RlbS5VSW50NjQsU3lzdGVtLlVJbnQ2NCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3NPckVxdWFsKFN5c3RlbS5VSW50NjQsU3lzdGVtLlVJbnQ2NCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzc09yRXF1YWwoU3lzdGVtLkRlY2ltYWwsU3lzdGVtLkRlY2ltYWwsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzT3JFcXVhbChTeXN0ZW0uRGVjaW1hbCxTeXN0ZW0uRGVjaW1hbCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3NPckVxdWFsKFN5c3RlbS5EZWNpbWFsLFN5c3RlbS5EZWNpbWFsKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzT3JFcXVhbChTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzT3JFcXVhbChTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzT3JFcXVhbChTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlY29uZA0KKyAgICAgICAgICAgIHZhbHVlLiBJZiBpdCBpcyBub3QsIHRoZW4gYW4NCisgICAgICAgICAgICA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMSI+VGhlIGZpcnN0IHZhbHVlLCBleHBlY3RlZCB0byBiZSBsZXNzPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlcjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3NPckVxdWFsKFN5c3RlbS5TaW5nbGUsU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3NPckVxdWFsKFN5c3RlbS5TaW5nbGUsU3lzdGVtLlNpbmdsZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3NPckVxdWFsKFN5c3RlbS5TaW5nbGUsU3lzdGVtLlNpbmdsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuTGVzc09yRXF1YWwoU3lzdGVtLklDb21wYXJhYmxlLFN5c3RlbS5JQ29tcGFyYWJsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BcnJheSBvZiBvYmplY3RzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0Lkxlc3NPckVxdWFsKFN5c3RlbS5JQ29tcGFyYWJsZSxTeXN0ZW0uSUNvbXBhcmFibGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2Vjb25kDQorICAgICAgICAgICAgdmFsdWUuIElmIGl0IGlzIG5vdCwgdGhlbiBhbg0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGxlc3M8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIHZhbHVlLCBleHBlY3RlZCB0byBiZSBncmVhdGVyPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5MZXNzT3JFcXVhbChTeXN0ZW0uSUNvbXBhcmFibGUsU3lzdGVtLklDb21wYXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0aGUgZmlyc3QgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQNCisgICAgICAgICAgICB2YWx1ZS4gSWYgaXQgaXMgbm90LCB0aGVuIGFuDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCB2YWx1ZSwgZXhwZWN0ZWQgdG8gYmUgbGVzczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzIiPlRoZSBzZWNvbmQgdmFsdWUsIGV4cGVjdGVkIHRvIGJlIGdyZWF0ZXI8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Db250YWlucyhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgaXMgY29udGFpbmVkIGluIGEgbGlzdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgb2JqZWN0PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgbGlzdCB0byBiZSBleGFtaW5lZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Db250YWlucyhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbixTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBpcyBjb250YWluZWQgaW4gYSBsaXN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBvYmplY3Q8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBsaXN0IHRvIGJlIGV4YW1pbmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5Db250YWlucyhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgaXMgY29udGFpbmVkIGluIGEgbGlzdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgb2JqZWN0PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgbGlzdCB0byBiZSBleGFtaW5lZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LkNvdW50ZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIG51bWJlciBvZiBhc3NlcnRpb25zIGV4ZWN1dGVkIHNvIGZhciBhbmQgDQorICAgICAgICAgICAgcmVzZXRzIHRoZSBjb3VudGVyIHRvIHplcm8uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkhlbHBlciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0aW9uSGVscGVyIGlzIGFuIG9wdGlvbmFsIGJhc2UgY2xhc3MgZm9yIHVzZXIgdGVzdHMsDQorICAgICAgICAgICAgYWxsb3dpbmcgdGhlIHVzZSBvZiBzaG9ydGVyIG5hbWVzIGZvciBjb25zdHJhaW50cyBhbmQNCisgICAgICAgICAgICBhc3NlcnRzIGFuZCBhdm9pZGluZyBjb25mbGljdCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIA0KKyAgICAgICAgICAgIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuSXMiLz4sIGZyb20gd2hpY2ggaXQgaW5oZXJpdHMgbXVjaCBvZiBpdHMNCisgICAgICAgICAgICBiZWhhdmlvciwgaW4gY2VydGFpbiBtb2NrIG9iamVjdCBmcmFtZXdvcmtzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25IZWxwZXIuRXhwZWN0KFN5c3RlbS5PYmplY3QsTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLklSZXNvbHZlQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IGEgY29uc3RyYWludCB0byBhbiBhY3R1YWwgdmFsdWUsIHN1Y2NlZWRpbmcgaWYgdGhlIGNvbnN0cmFpbnQNCisgICAgICAgICAgICBpcyBzYXRpc2ZpZWQgYW5kIHRocm93aW5nIGFuIGFzc2VydGlvbiBleGNlcHRpb24gb24gZmFpbHVyZS4gV29ya3MNCisgICAgICAgICAgICBpZGVudGljYWxseSB0byA8c2VlIGNyZWY9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5UaGF0KFN5c3RlbS5PYmplY3QsTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLklSZXNvbHZlQ29uc3RyYWludCkiLz4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbnN0cmFpbnQiPkEgQ29uc3RyYWludCB0byBiZSBhcHBsaWVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlIHRvIHRlc3Q8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkhlbHBlci5FeHBlY3QoU3lzdGVtLk9iamVjdCxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50LFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBcHBseSBhIGNvbnN0cmFpbnQgdG8gYW4gYWN0dWFsIHZhbHVlLCBzdWNjZWVkaW5nIGlmIHRoZSBjb25zdHJhaW50DQorICAgICAgICAgICAgaXMgc2F0aXNmaWVkIGFuZCB0aHJvd2luZyBhbiBhc3NlcnRpb24gZXhjZXB0aW9uIG9uIGZhaWx1cmUuIFdvcmtzDQorICAgICAgICAgICAgaWRlbnRpY2FsbHkgdG8gPHNlZSBjcmVmPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuVGhhdChTeXN0ZW0uT2JqZWN0LE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JUmVzb2x2ZUNvbnN0cmFpbnQsU3lzdGVtLlN0cmluZykiLz4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbnN0cmFpbnQiPkEgQ29uc3RyYWludCB0byBiZSBhcHBsaWVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlIHRvIHRlc3Q8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkhlbHBlci5FeHBlY3QoU3lzdGVtLk9iamVjdCxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbHkgYSBjb25zdHJhaW50IHRvIGFuIGFjdHVhbCB2YWx1ZSwgc3VjY2VlZGluZyBpZiB0aGUgY29uc3RyYWludA0KKyAgICAgICAgICAgIGlzIHNhdGlzZmllZCBhbmQgdGhyb3dpbmcgYW4gYXNzZXJ0aW9uIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLiBXb3Jrcw0KKyAgICAgICAgICAgIGlkZW50aWNhbGx5IHRvIDxzZWUgY3JlZj0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0LlRoYXQoU3lzdGVtLk9iamVjdCxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSIvPg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29uc3RyYWludCI+QSBDb25zdHJhaW50IHRvIGJlIGFwcGxpZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWUgdG8gdGVzdDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkhlbHBlci5FeHBlY3QoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFjdHVhbFZhbHVlRGVsZWdhdGUsTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLklSZXNvbHZlQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IGEgY29uc3RyYWludCB0byBhbiBhY3R1YWwgdmFsdWUsIHN1Y2NlZWRpbmcgaWYgdGhlIGNvbnN0cmFpbnQNCisgICAgICAgICAgICBpcyBzYXRpc2ZpZWQgYW5kIHRocm93aW5nIGFuIGFzc2VydGlvbiBleGNlcHRpb24gb24gZmFpbHVyZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cHIiPkEgQ29uc3RyYWludCBleHByZXNzaW9uIHRvIGJlIGFwcGxpZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWwiPkFuIEFjdHVhbFZhbHVlRGVsZWdhdGUgcmV0dXJuaW5nIHRoZSB2YWx1ZSB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkhlbHBlci5FeHBlY3QoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFjdHVhbFZhbHVlRGVsZWdhdGUsTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLklSZXNvbHZlQ29uc3RyYWludCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbHkgYSBjb25zdHJhaW50IHRvIGFuIGFjdHVhbCB2YWx1ZSwgc3VjY2VlZGluZyBpZiB0aGUgY29uc3RyYWludA0KKyAgICAgICAgICAgIGlzIHNhdGlzZmllZCBhbmQgdGhyb3dpbmcgYW4gYXNzZXJ0aW9uIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwciI+QSBDb25zdHJhaW50IGV4cHJlc3Npb24gdG8gYmUgYXBwbGllZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlbCI+QW4gQWN0dWFsVmFsdWVEZWxlZ2F0ZSByZXR1cm5pbmcgdGhlIHZhbHVlIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uSGVscGVyLkV4cGVjdChOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWN0dWFsVmFsdWVEZWxlZ2F0ZSxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbHkgYSBjb25zdHJhaW50IHRvIGFuIGFjdHVhbCB2YWx1ZSwgc3VjY2VlZGluZyBpZiB0aGUgY29uc3RyYWludA0KKyAgICAgICAgICAgIGlzIHNhdGlzZmllZCBhbmQgdGhyb3dpbmcgYW4gYXNzZXJ0aW9uIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVsIj5BbiBBY3R1YWxWYWx1ZURlbGVnYXRlIHJldHVybmluZyB0aGUgdmFsdWUgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwciI+QSBDb25zdHJhaW50IGV4cHJlc3Npb24gdG8gYmUgYXBwbGllZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkhlbHBlci5FeHBlY3RgYDEoYGAwQCxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbHkgYSBjb25zdHJhaW50IHRvIGEgcmVmZXJlbmNlZCB2YWx1ZSwgc3VjY2VlZGluZyBpZiB0aGUgY29uc3RyYWludA0KKyAgICAgICAgICAgIGlzIHNhdGlzZmllZCBhbmQgdGhyb3dpbmcgYW4gYXNzZXJ0aW9uIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29uc3RyYWludCI+QSBDb25zdHJhaW50IHRvIGJlIGFwcGxpZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWUgdG8gdGVzdDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uSGVscGVyLkV4cGVjdGBgMShgYDBALE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JUmVzb2x2ZUNvbnN0cmFpbnQsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IGEgY29uc3RyYWludCB0byBhIHJlZmVyZW5jZWQgdmFsdWUsIHN1Y2NlZWRpbmcgaWYgdGhlIGNvbnN0cmFpbnQNCisgICAgICAgICAgICBpcyBzYXRpc2ZpZWQgYW5kIHRocm93aW5nIGFuIGFzc2VydGlvbiBleGNlcHRpb24gb24gZmFpbHVyZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbnN0cmFpbnQiPkEgQ29uc3RyYWludCB0byBiZSBhcHBsaWVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlIHRvIHRlc3Q8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkhlbHBlci5FeHBlY3RgYDEoYGAwQCxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXBwbHkgYSBjb25zdHJhaW50IHRvIGEgcmVmZXJlbmNlZCB2YWx1ZSwgc3VjY2VlZGluZyBpZiB0aGUgY29uc3RyYWludA0KKyAgICAgICAgICAgIGlzIHNhdGlzZmllZCBhbmQgdGhyb3dpbmcgYW4gYXNzZXJ0aW9uIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwcmVzc2lvbiI+QSBDb25zdHJhaW50IHRvIGJlIGFwcGxpZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWUgdG8gdGVzdDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkhlbHBlci5FeHBlY3QoU3lzdGVtLkJvb2xlYW4sU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgdHJ1ZS4gSWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZSB0aGUgbWV0aG9kIHRocm93cw0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+LiBXb3JrcyBJZGVudGljYWxseSB0byANCisgICAgICAgICAgICA8c2VlIGNyZWY9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5UaGF0KFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSIvPi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+IA0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPlRoZSBldmFsdWF0ZWQgY29uZGl0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uSGVscGVyLkV4cGVjdChTeXN0ZW0uQm9vbGVhbixTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGEgY29uZGl0aW9uIGlzIHRydWUuIElmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UgdGhlIG1ldGhvZCB0aHJvd3MNCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPi4gV29ya3MgSWRlbnRpY2FsbHkgdG8gDQorICAgICAgICAgICAgPHNlZSBjcmVmPSJNOk5Vbml0LkZyYW1ld29yay5Bc3NlcnQuVGhhdChTeXN0ZW0uQm9vbGVhbixTeXN0ZW0uU3RyaW5nKSIvPi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbmRpdGlvbiI+VGhlIGV2YWx1YXRlZCBjb25kaXRpb248L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGlmIHRoZSBjb25kaXRpb24gaXMgZmFsc2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkhlbHBlci5FeHBlY3QoU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgdHJ1ZS4gSWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZSB0aGUgbWV0aG9kIHRocm93cw0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+LiBXb3JrcyBJZGVudGljYWxseSB0byA8c2VlIGNyZWY9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydC5UaGF0KFN5c3RlbS5Cb29sZWFuKSIvPi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbmRpdGlvbiI+VGhlIGV2YWx1YXRlZCBjb25kaXRpb248L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkhlbHBlci5FeHBlY3QoTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHRoZSBjb2RlIHJlcHJlc2VudGVkIGJ5IGEgZGVsZWdhdGUgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIHRoYXQgc2F0aXNmaWVzIHRoZSBjb25zdHJhaW50IHByb3ZpZGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29kZSI+QSBUZXN0RGVsZWdhdGUgdG8gYmUgZXhlY3V0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25zdHJhaW50Ij5BIFRocm93c0NvbnN0cmFpbnQgdXNlZCBpbiB0aGUgdGVzdDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uSGVscGVyLk1hcChTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgTGlzdE1hcHBlciBiYXNlZCBvbiBhIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJvcmlnaW5hbCI+VGhlIG9yaWdpbmFsIGNvbGxlY3Rpb248L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Bc3N1bWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIHRvIGV4cHJlc3MgdGhlIGFzc3VtcHRpb25zDQorICAgICAgICAgICAgdGhhdCBtdXN0IGJlIG1ldCBmb3IgYSB0ZXN0IHRvIGdpdmUgYSBtZWFuaW5nZnVsDQorICAgICAgICAgICAgcmVzdWx0LiBJZiBhbiBhc3N1bXB0aW9uIGlzIG5vdCBtZXQsIHRoZSB0ZXN0DQorICAgICAgICAgICAgc2hvdWxkIHByb2R1Y2UgYW4gaW5jb25jbHVzaXZlIHJlc3VsdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzdW1lLkVxdWFscyhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgRXF1YWxzIG1ldGhvZCB0aHJvd3MgYW4gQXNzZXJ0aW9uRXhjZXB0aW9uLiBUaGlzIGlzIGRvbmUgDQorICAgICAgICAgICAgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG1pc3Rha2UgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYSI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYiI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3N1bWUuUmVmZXJlbmNlRXF1YWxzKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIG92ZXJyaWRlIHRoZSBkZWZhdWx0IFJlZmVyZW5jZUVxdWFscyB0byB0aHJvdyBhbiBBc3NlcnRpb25FeGNlcHRpb24uIFRoaXMgDQorICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gbWFrZXMgc3VyZSB0aGVyZSBpcyBubyBtaXN0YWtlIGluIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiANCisgICAgICAgICAgICBhcyBwYXJ0IG9mIEFzc2VydC4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJiIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc3VtZS5UaGF0KFN5c3RlbS5PYmplY3QsTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLklSZXNvbHZlQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IGEgY29uc3RyYWludCB0byBhbiBhY3R1YWwgdmFsdWUsIHN1Y2NlZWRpbmcgaWYgdGhlIGNvbnN0cmFpbnQNCisgICAgICAgICAgICBpcyBzYXRpc2ZpZWQgYW5kIHRocm93aW5nIGFuIEluY29uY2x1c2l2ZUV4Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwcmVzc2lvbiI+QSBDb25zdHJhaW50IGV4cHJlc3Npb24gdG8gYmUgYXBwbGllZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZSB0byB0ZXN0PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3N1bWUuVGhhdChTeXN0ZW0uT2JqZWN0LE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JUmVzb2x2ZUNvbnN0cmFpbnQsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IGEgY29uc3RyYWludCB0byBhbiBhY3R1YWwgdmFsdWUsIHN1Y2NlZWRpbmcgaWYgdGhlIGNvbnN0cmFpbnQNCisgICAgICAgICAgICBpcyBzYXRpc2ZpZWQgYW5kIHRocm93aW5nIGFuIEluY29uY2x1c2l2ZUV4Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwcmVzc2lvbiI+QSBDb25zdHJhaW50IGV4cHJlc3Npb24gdG8gYmUgYXBwbGllZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZSB0byB0ZXN0PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3N1bWUuVGhhdChTeXN0ZW0uT2JqZWN0LE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JUmVzb2x2ZUNvbnN0cmFpbnQsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBcHBseSBhIGNvbnN0cmFpbnQgdG8gYW4gYWN0dWFsIHZhbHVlLCBzdWNjZWVkaW5nIGlmIHRoZSBjb25zdHJhaW50DQorICAgICAgICAgICAgaXMgc2F0aXNmaWVkIGFuZCB0aHJvd2luZyBhbiBJbmNvbmNsdXNpdmVFeGNlcHRpb24gb24gZmFpbHVyZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cHJlc3Npb24iPkEgQ29uc3RyYWludCBleHByZXNzaW9uIHRvIGJlIGFwcGxpZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWUgdG8gdGVzdDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc3VtZS5UaGF0KE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BY3R1YWxWYWx1ZURlbGVnYXRlLE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JUmVzb2x2ZUNvbnN0cmFpbnQpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBcHBseSBhIGNvbnN0cmFpbnQgdG8gYW4gYWN0dWFsIHZhbHVlLCBzdWNjZWVkaW5nIGlmIHRoZSBjb25zdHJhaW50DQorICAgICAgICAgICAgaXMgc2F0aXNmaWVkIGFuZCB0aHJvd2luZyBhbiBJbmNvbmNsdXNpdmVFeGNlcHRpb24gb24gZmFpbHVyZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cHIiPkEgQ29uc3RyYWludCBleHByZXNzaW9uIHRvIGJlIGFwcGxpZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkZWwiPkFuIEFjdHVhbFZhbHVlRGVsZWdhdGUgcmV0dXJuaW5nIHRoZSB2YWx1ZSB0byBiZSB0ZXN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc3VtZS5UaGF0KE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BY3R1YWxWYWx1ZURlbGVnYXRlLE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JUmVzb2x2ZUNvbnN0cmFpbnQsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IGEgY29uc3RyYWludCB0byBhbiBhY3R1YWwgdmFsdWUsIHN1Y2NlZWRpbmcgaWYgdGhlIGNvbnN0cmFpbnQNCisgICAgICAgICAgICBpcyBzYXRpc2ZpZWQgYW5kIHRocm93aW5nIGFuIEluY29uY2x1c2l2ZUV4Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwciI+QSBDb25zdHJhaW50IGV4cHJlc3Npb24gdG8gYmUgYXBwbGllZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlbCI+QW4gQWN0dWFsVmFsdWVEZWxlZ2F0ZSByZXR1cm5pbmcgdGhlIHZhbHVlIHRvIGJlIHRlc3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzdW1lLlRoYXQoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFjdHVhbFZhbHVlRGVsZWdhdGUsTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLklSZXNvbHZlQ29uc3RyYWludCxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IGEgY29uc3RyYWludCB0byBhbiBhY3R1YWwgdmFsdWUsIHN1Y2NlZWRpbmcgaWYgdGhlIGNvbnN0cmFpbnQNCisgICAgICAgICAgICBpcyBzYXRpc2ZpZWQgYW5kIHRocm93aW5nIGFuIEluY29uY2x1c2l2ZUV4Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGVsIj5BbiBBY3R1YWxWYWx1ZURlbGVnYXRlIHJldHVybmluZyB0aGUgdmFsdWUgdG8gYmUgdGVzdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwciI+QSBDb25zdHJhaW50IGV4cHJlc3Npb24gdG8gYmUgYXBwbGllZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc3VtZS5UaGF0YGAxKGBgMEAsTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLklSZXNvbHZlQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IGEgY29uc3RyYWludCB0byBhIHJlZmVyZW5jZWQgdmFsdWUsIHN1Y2NlZWRpbmcgaWYgdGhlIGNvbnN0cmFpbnQNCisgICAgICAgICAgICBpcyBzYXRpc2ZpZWQgYW5kIHRocm93aW5nIGFuIEluY29uY2x1c2l2ZUV4Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwcmVzc2lvbiI+QSBDb25zdHJhaW50IGV4cHJlc3Npb24gdG8gYmUgYXBwbGllZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZSB0byB0ZXN0PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3N1bWUuVGhhdGBgMShgYDBALE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JUmVzb2x2ZUNvbnN0cmFpbnQsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGx5IGEgY29uc3RyYWludCB0byBhIHJlZmVyZW5jZWQgdmFsdWUsIHN1Y2NlZWRpbmcgaWYgdGhlIGNvbnN0cmFpbnQNCisgICAgICAgICAgICBpcyBzYXRpc2ZpZWQgYW5kIHRocm93aW5nIGFuIEluY29uY2x1c2l2ZUV4Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwcmVzc2lvbiI+QSBDb25zdHJhaW50IGV4cHJlc3Npb24gdG8gYmUgYXBwbGllZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZSB0byB0ZXN0PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3N1bWUuVGhhdGBgMShgYDBALE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JUmVzb2x2ZUNvbnN0cmFpbnQsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBcHBseSBhIGNvbnN0cmFpbnQgdG8gYSByZWZlcmVuY2VkIHZhbHVlLCBzdWNjZWVkaW5nIGlmIHRoZSBjb25zdHJhaW50DQorICAgICAgICAgICAgaXMgc2F0aXNmaWVkIGFuZCB0aHJvd2luZyBhbiBJbmNvbmNsdXNpdmVFeGNlcHRpb24gb24gZmFpbHVyZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cHJlc3Npb24iPkEgQ29uc3RyYWludCBleHByZXNzaW9uIHRvIGJlIGFwcGxpZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWUgdG8gdGVzdDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkFzc3VtZS5UaGF0KFN5c3RlbS5Cb29sZWFuLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGEgY29uZGl0aW9uIGlzIHRydWUuIElmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UgdGhlIG1ldGhvZCB0aHJvd3MNCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkluY29uY2x1c2l2ZUV4Y2VwdGlvbiIvPi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+IA0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPlRoZSBldmFsdWF0ZWQgY29uZGl0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzdW1lLlRoYXQoU3lzdGVtLkJvb2xlYW4sU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhIGNvbmRpdGlvbiBpcyB0cnVlLiBJZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlIHRoZSBtZXRob2QgdGhyb3dzDQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5JbmNvbmNsdXNpdmVFeGNlcHRpb24iLz4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPlRoZSBldmFsdWF0ZWQgY29uZGl0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Bc3N1bWUuVGhhdChTeXN0ZW0uQm9vbGVhbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhIGNvbmRpdGlvbiBpcyB0cnVlLiBJZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlIHRoZSANCisgICAgICAgICAgICBtZXRob2QgdGhyb3dzIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuSW5jb25jbHVzaXZlRXhjZXB0aW9uIi8+Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29uZGl0aW9uIj5UaGUgZXZhbHVhdGVkIGNvbmRpdGlvbjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQXNzdW1lLlRoYXQoTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSVJlc29sdmVDb25zdHJhaW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHRoZSBjb2RlIHJlcHJlc2VudGVkIGJ5IGEgZGVsZWdhdGUgdGhyb3dzIGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIHRoYXQgc2F0aXNmaWVzIHRoZSBjb25zdHJhaW50IHByb3ZpZGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29kZSI+QSBUZXN0RGVsZWdhdGUgdG8gYmUgZXhlY3V0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb25zdHJhaW50Ij5BIFRocm93c0NvbnN0cmFpbnQgdXNlZCBpbiB0aGUgdGVzdDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQSBzZXQgb2YgQXNzZXJ0IG1ldGhvZHMgb3BlcmF0aW9uZyBvbiBvbmUgb3IgbW9yZSBjb2xsZWN0aW9ucw0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LkVxdWFscyhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgRXF1YWxzIG1ldGhvZCB0aHJvd3MgYW4gQXNzZXJ0aW9uRXhjZXB0aW9uLiBUaGlzIGlzIGRvbmUgDQorICAgICAgICAgICAgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG1pc3Rha2UgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYSI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYiI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LlJlZmVyZW5jZUVxdWFscyhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBvdmVycmlkZSB0aGUgZGVmYXVsdCBSZWZlcmVuY2VFcXVhbHMgdG8gdGhyb3cgYW4gQXNzZXJ0aW9uRXhjZXB0aW9uLiBUaGlzIA0KKyAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG1ha2VzIHN1cmUgdGhlcmUgaXMgbm8gbWlzdGFrZSBpbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gDQorICAgICAgICAgICAgYXMgcGFydCBvZiBBc3NlcnQuIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYSI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYiI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LkFsbEl0ZW1zQXJlSW5zdGFuY2VzT2ZUeXBlKFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhbGwgaXRlbXMgY29udGFpbmVkIGluIGNvbGxlY3Rpb24gYXJlIG9mIHRoZSB0eXBlIHNwZWNpZmllZCBieSBleHBlY3RlZFR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5JRW51bWVyYWJsZSBjb250YWluaW5nIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkVHlwZSI+U3lzdGVtLlR5cGUgdGhhdCBhbGwgb2JqZWN0cyBpbiBjb2xsZWN0aW9uIG11c3QgYmUgaW5zdGFuY2VzIG9mPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LkFsbEl0ZW1zQXJlSW5zdGFuY2VzT2ZUeXBlKFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uVHlwZSxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFsbCBpdGVtcyBjb250YWluZWQgaW4gY29sbGVjdGlvbiBhcmUgb2YgdGhlIHR5cGUgc3BlY2lmaWVkIGJ5IGV4cGVjdGVkVHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPklFbnVtZXJhYmxlIGNvbnRhaW5pbmcgb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWRUeXBlIj5TeXN0ZW0uVHlwZSB0aGF0IGFsbCBvYmplY3RzIGluIGNvbGxlY3Rpb24gbXVzdCBiZSBpbnN0YW5jZXMgb2Y8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuQWxsSXRlbXNBcmVJbnN0YW5jZXNPZlR5cGUoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5UeXBlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGFsbCBpdGVtcyBjb250YWluZWQgaW4gY29sbGVjdGlvbiBhcmUgb2YgdGhlIHR5cGUgc3BlY2lmaWVkIGJ5IGV4cGVjdGVkVHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPklFbnVtZXJhYmxlIGNvbnRhaW5pbmcgb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWRUeXBlIj5TeXN0ZW0uVHlwZSB0aGF0IGFsbCBvYmplY3RzIGluIGNvbGxlY3Rpb24gbXVzdCBiZSBpbnN0YW5jZXMgb2Y8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5Bcmd1bWVudHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LkFsbEl0ZW1zQXJlTm90TnVsbChTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYWxsIGl0ZW1zIGNvbnRhaW5lZCBpbiBjb2xsZWN0aW9uIGFyZSBub3QgZXF1YWwgdG8gbnVsbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPklFbnVtZXJhYmxlIGNvbnRhaW5pbmcgb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LkFsbEl0ZW1zQXJlTm90TnVsbChTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhbGwgaXRlbXMgY29udGFpbmVkIGluIGNvbGxlY3Rpb24gYXJlIG5vdCBlcXVhbCB0byBudWxsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+SUVudW1lcmFibGUgY29udGFpbmluZyBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuQWxsSXRlbXNBcmVOb3ROdWxsKFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhbGwgaXRlbXMgY29udGFpbmVkIGluIGNvbGxlY3Rpb24gYXJlIG5vdCBlcXVhbCB0byBudWxsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+SUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5BbGxJdGVtc0FyZVVuaXF1ZShTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFbnN1cmVzIHRoYXQgZXZlcnkgb2JqZWN0IGNvbnRhaW5lZCBpbiBjb2xsZWN0aW9uIGV4aXN0cyB3aXRoaW4gdGhlIGNvbGxlY3Rpb24NCisgICAgICAgICAgICBvbmNlIGFuZCBvbmx5IG9uY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5JRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuQWxsSXRlbXNBcmVVbmlxdWUoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBFbnN1cmVzIHRoYXQgZXZlcnkgb2JqZWN0IGNvbnRhaW5lZCBpbiBjb2xsZWN0aW9uIGV4aXN0cyB3aXRoaW4gdGhlIGNvbGxlY3Rpb24NCisgICAgICAgICAgICBvbmNlIGFuZCBvbmx5IG9uY2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5JRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuQWxsSXRlbXNBcmVVbmlxdWUoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRW5zdXJlcyB0aGF0IGV2ZXJ5IG9iamVjdCBjb250YWluZWQgaW4gY29sbGVjdGlvbiBleGlzdHMgd2l0aGluIHRoZSBjb2xsZWN0aW9uDQorICAgICAgICAgICAgb25jZSBhbmQgb25seSBvbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+SUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5BcmVFcXVhbChTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGV4cGVjdGVkIGFuZCBhY3R1YWwgYXJlIGV4YWN0bHkgZXF1YWwuICBUaGUgY29sbGVjdGlvbnMgbXVzdCBoYXZlIHRoZSBzYW1lIGNvdW50LCANCisgICAgICAgICAgICBhbmQgY29udGFpbiB0aGUgZXhhY3Qgc2FtZSBvYmplY3RzIGluIHRoZSBzYW1lIG9yZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBmaXJzdCBJRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzZWNvbmQgSUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBleHBlY3RlZCBhbmQgYWN0dWFsIGFyZSBleGFjdGx5IGVxdWFsLiAgVGhlIGNvbGxlY3Rpb25zIG11c3QgaGF2ZSB0aGUgc2FtZSBjb3VudCwgDQorICAgICAgICAgICAgYW5kIGNvbnRhaW4gdGhlIGV4YWN0IHNhbWUgb2JqZWN0cyBpbiB0aGUgc2FtZSBvcmRlci4NCisgICAgICAgICAgICBJZiBjb21wYXJlciBpcyBub3QgbnVsbCB0aGVuIGl0IHdpbGwgYmUgdXNlZCB0byBjb21wYXJlIHRoZSBvYmplY3RzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBmaXJzdCBJRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzZWNvbmQgSUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29tcGFyZXIiPlRoZSBJQ29tcGFyZXIgdG8gdXNlIGluIGNvbXBhcmluZyBvYmplY3RzIGZyb20gZWFjaCBJRW51bWVyYWJsZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5BcmVFcXVhbChTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgZXhwZWN0ZWQgYW5kIGFjdHVhbCBhcmUgZXhhY3RseSBlcXVhbC4gIFRoZSBjb2xsZWN0aW9ucyBtdXN0IGhhdmUgdGhlIHNhbWUgY291bnQsIA0KKyAgICAgICAgICAgIGFuZCBjb250YWluIHRoZSBleGFjdCBzYW1lIG9iamVjdHMgaW4gdGhlIHNhbWUgb3JkZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGZpcnN0IElFbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHNlY29uZCBJRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgZXhwZWN0ZWQgYW5kIGFjdHVhbCBhcmUgZXhhY3RseSBlcXVhbC4gIFRoZSBjb2xsZWN0aW9ucyBtdXN0IGhhdmUgdGhlIHNhbWUgY291bnQsIA0KKyAgICAgICAgICAgIGFuZCBjb250YWluIHRoZSBleGFjdCBzYW1lIG9iamVjdHMgaW4gdGhlIHNhbWUgb3JkZXIuDQorICAgICAgICAgICAgSWYgY29tcGFyZXIgaXMgbm90IG51bGwgdGhlbiBpdCB3aWxsIGJlIHVzZWQgdG8gY29tcGFyZSB0aGUgb2JqZWN0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZmlyc3QgSUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgc2Vjb25kIElFbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbXBhcmVyIj5UaGUgSUNvbXBhcmVyIHRvIHVzZSBpbiBjb21wYXJpbmcgb2JqZWN0cyBmcm9tIGVhY2ggSUVudW1lcmFibGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBleHBlY3RlZCBhbmQgYWN0dWFsIGFyZSBleGFjdGx5IGVxdWFsLiAgVGhlIGNvbGxlY3Rpb25zIG11c3QgaGF2ZSB0aGUgc2FtZSBjb3VudCwgDQorICAgICAgICAgICAgYW5kIGNvbnRhaW4gdGhlIGV4YWN0IHNhbWUgb2JqZWN0cyBpbiB0aGUgc2FtZSBvcmRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZmlyc3QgSUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgc2Vjb25kIElFbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGV4cGVjdGVkIGFuZCBhY3R1YWwgYXJlIGV4YWN0bHkgZXF1YWwuICBUaGUgY29sbGVjdGlvbnMgbXVzdCBoYXZlIHRoZSBzYW1lIGNvdW50LCANCisgICAgICAgICAgICBhbmQgY29udGFpbiB0aGUgZXhhY3Qgc2FtZSBvYmplY3RzIGluIHRoZSBzYW1lIG9yZGVyLg0KKyAgICAgICAgICAgIElmIGNvbXBhcmVyIGlzIG5vdCBudWxsIHRoZW4gaXQgd2lsbCBiZSB1c2VkIHRvIGNvbXBhcmUgdGhlIG9iamVjdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGZpcnN0IElFbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHNlY29uZCBJRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wYXJlciI+VGhlIElDb21wYXJlciB0byB1c2UgaW4gY29tcGFyaW5nIG9iamVjdHMgZnJvbSBlYWNoIElFbnVtZXJhYmxlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5BcmVFcXVpdmFsZW50KFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgZXhwZWN0ZWQgYW5kIGFjdHVhbCBhcmUgZXF1aXZhbGVudCwgY29udGFpbmluZyB0aGUgc2FtZSBvYmplY3RzIGJ1dCB0aGUgbWF0Y2ggbWF5IGJlIGluIGFueSBvcmRlci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZmlyc3QgSUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgc2Vjb25kIElFbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5BcmVFcXVpdmFsZW50KFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBleHBlY3RlZCBhbmQgYWN0dWFsIGFyZSBlcXVpdmFsZW50LCBjb250YWluaW5nIHRoZSBzYW1lIG9iamVjdHMgYnV0IHRoZSBtYXRjaCBtYXkgYmUgaW4gYW55IG9yZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBmaXJzdCBJRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzZWNvbmQgSUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWl2YWxlbnQoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBleHBlY3RlZCBhbmQgYWN0dWFsIGFyZSBlcXVpdmFsZW50LCBjb250YWluaW5nIHRoZSBzYW1lIG9iamVjdHMgYnV0IHRoZSBtYXRjaCBtYXkgYmUgaW4gYW55IG9yZGVyLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBmaXJzdCBJRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzZWNvbmQgSUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGV4cGVjdGVkIGFuZCBhY3R1YWwgYXJlIG5vdCBleGFjdGx5IGVxdWFsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBmaXJzdCBJRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzZWNvbmQgSUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLkNvbGxlY3Rpb25zLklDb21wYXJlcikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBleHBlY3RlZCBhbmQgYWN0dWFsIGFyZSBub3QgZXhhY3RseSBlcXVhbC4NCisgICAgICAgICAgICBJZiBjb21wYXJlciBpcyBub3QgbnVsbCB0aGVuIGl0IHdpbGwgYmUgdXNlZCB0byBjb21wYXJlIHRoZSBvYmplY3RzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBmaXJzdCBJRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzZWNvbmQgSUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29tcGFyZXIiPlRoZSBJQ29tcGFyZXIgdG8gdXNlIGluIGNvbXBhcmluZyBvYmplY3RzIGZyb20gZWFjaCBJRW51bWVyYWJsZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgZXhwZWN0ZWQgYW5kIGFjdHVhbCBhcmUgbm90IGV4YWN0bHkgZXF1YWwuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGZpcnN0IElFbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHNlY29uZCBJRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgZXhwZWN0ZWQgYW5kIGFjdHVhbCBhcmUgbm90IGV4YWN0bHkgZXF1YWwuDQorICAgICAgICAgICAgSWYgY29tcGFyZXIgaXMgbm90IG51bGwgdGhlbiBpdCB3aWxsIGJlIHVzZWQgdG8gY29tcGFyZSB0aGUgb2JqZWN0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZmlyc3QgSUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgc2Vjb25kIElFbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbXBhcmVyIj5UaGUgSUNvbXBhcmVyIHRvIHVzZSBpbiBjb21wYXJpbmcgb2JqZWN0cyBmcm9tIGVhY2ggSUVudW1lcmFibGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBleHBlY3RlZCBhbmQgYWN0dWFsIGFyZSBub3QgZXhhY3RseSBlcXVhbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZmlyc3QgSUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgc2Vjb25kIElFbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGV4cGVjdGVkIGFuZCBhY3R1YWwgYXJlIG5vdCBleGFjdGx5IGVxdWFsLg0KKyAgICAgICAgICAgIElmIGNvbXBhcmVyIGlzIG5vdCBudWxsIHRoZW4gaXQgd2lsbCBiZSB1c2VkIHRvIGNvbXBhcmUgdGhlIG9iamVjdHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGZpcnN0IElFbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHNlY29uZCBJRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wYXJlciI+VGhlIElDb21wYXJlciB0byB1c2UgaW4gY29tcGFyaW5nIG9iamVjdHMgZnJvbSBlYWNoIElFbnVtZXJhYmxlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5BcmVOb3RFcXVpdmFsZW50KFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgZXhwZWN0ZWQgYW5kIGFjdHVhbCBhcmUgbm90IGVxdWl2YWxlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGZpcnN0IElFbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHNlY29uZCBJRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuQXJlTm90RXF1aXZhbGVudChTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgZXhwZWN0ZWQgYW5kIGFjdHVhbCBhcmUgbm90IGVxdWl2YWxlbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGZpcnN0IElFbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHNlY29uZCBJRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuQXJlTm90RXF1aXZhbGVudChTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGV4cGVjdGVkIGFuZCBhY3R1YWwgYXJlIG5vdCBlcXVpdmFsZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBmaXJzdCBJRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzZWNvbmQgSUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5Db250YWlucyhTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBjb2xsZWN0aW9uIGNvbnRhaW5zIGFjdHVhbCBhcyBhbiBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+SUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5PYmplY3QgdG8gYmUgZm91bmQgd2l0aGluIGNvbGxlY3Rpb248L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuQ29udGFpbnMoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5PYmplY3QsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBjb2xsZWN0aW9uIGNvbnRhaW5zIGFjdHVhbCBhcyBhbiBpdGVtLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+SUVudW1lcmFibGUgb2Ygb2JqZWN0cyB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5PYmplY3QgdG8gYmUgZm91bmQgd2l0aGluIGNvbGxlY3Rpb248L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuQ29udGFpbnMoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5PYmplY3QsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgY29sbGVjdGlvbiBjb250YWlucyBhY3R1YWwgYXMgYW4gaXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPklFbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+T2JqZWN0IHRvIGJlIGZvdW5kIHdpdGhpbiBjb2xsZWN0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5Eb2VzTm90Q29udGFpbihTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBjb2xsZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gYWN0dWFsIGFzIGFuIGl0ZW0uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5JRW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPk9iamVjdCB0aGF0IGNhbm5vdCBleGlzdCB3aXRoaW4gY29sbGVjdGlvbjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5Eb2VzTm90Q29udGFpbihTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLk9iamVjdCxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGNvbGxlY3Rpb24gZG9lcyBub3QgY29udGFpbiBhY3R1YWwgYXMgYW4gaXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPklFbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+T2JqZWN0IHRoYXQgY2Fubm90IGV4aXN0IHdpdGhpbiBjb2xsZWN0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LkRvZXNOb3RDb250YWluKFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uT2JqZWN0LFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGNvbGxlY3Rpb24gZG9lcyBub3QgY29udGFpbiBhY3R1YWwgYXMgYW4gaXRlbS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPklFbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+T2JqZWN0IHRoYXQgY2Fubm90IGV4aXN0IHdpdGhpbiBjb2xsZWN0aW9uPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5Jc05vdFN1YnNldE9mKFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgc3VwZXJzZXQgaXMgbm90IGEgc3ViamVjdCBvZiBzdWJzZXQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdWJzZXQiPlRoZSBJRW51bWVyYWJsZSBzdXBlcnNldCB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3VwZXJzZXQiPlRoZSBJRW51bWVyYWJsZSBzdWJzZXQgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5Jc05vdFN1YnNldE9mKFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBzdXBlcnNldCBpcyBub3QgYSBzdWJqZWN0IG9mIHN1YnNldC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1YnNldCI+VGhlIElFbnVtZXJhYmxlIHN1cGVyc2V0IHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdXBlcnNldCI+VGhlIElFbnVtZXJhYmxlIHN1YnNldCB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LklzTm90U3Vic2V0T2YoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBzdXBlcnNldCBpcyBub3QgYSBzdWJqZWN0IG9mIHN1YnNldC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1YnNldCI+VGhlIElFbnVtZXJhYmxlIHN1cGVyc2V0IHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdXBlcnNldCI+VGhlIElFbnVtZXJhYmxlIHN1YnNldCB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5Jc1N1YnNldE9mKFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgc3VwZXJzZXQgaXMgYSBzdWJzZXQgb2Ygc3Vic2V0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3Vic2V0Ij5UaGUgSUVudW1lcmFibGUgc3VwZXJzZXQgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1cGVyc2V0Ij5UaGUgSUVudW1lcmFibGUgc3Vic2V0IHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuSXNTdWJzZXRPZihTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgc3VwZXJzZXQgaXMgYSBzdWJzZXQgb2Ygc3Vic2V0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3Vic2V0Ij5UaGUgSUVudW1lcmFibGUgc3VwZXJzZXQgdG8gYmUgY29uc2lkZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1cGVyc2V0Ij5UaGUgSUVudW1lcmFibGUgc3Vic2V0IHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuSXNTdWJzZXRPZihTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHN1cGVyc2V0IGlzIGEgc3Vic2V0IG9mIHN1YnNldC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1YnNldCI+VGhlIElFbnVtZXJhYmxlIHN1cGVyc2V0IHRvIGJlIGNvbnNpZGVyZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdXBlcnNldCI+VGhlIElFbnVtZXJhYmxlIHN1YnNldCB0byBiZSBjb25zaWRlcmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5Jc0VtcHR5KFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydCB0aGF0IGFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaXMgZW1wdHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPkFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaW1wbGVtZW50aW5nIElFbnVtZXJhYmxlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5Bcmd1bWVudHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LklzRW1wdHkoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnQgdGhhdCBhbiBhcnJheSwgbGlzdCBvciBvdGhlciBjb2xsZWN0aW9uIGlzIGVtcHR5DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5BbiBhcnJheSwgbGlzdCBvciBvdGhlciBjb2xsZWN0aW9uIGltcGxlbWVudGluZyBJRW51bWVyYWJsZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LklzRW1wdHkoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0IHRoYXQgYW4gYXJyYXksbGlzdCBvciBvdGhlciBjb2xsZWN0aW9uIGlzIGVtcHR5DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5BbiBhcnJheSwgbGlzdCBvciBvdGhlciBjb2xsZWN0aW9uIGltcGxlbWVudGluZyBJRW51bWVyYWJsZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5Jc05vdEVtcHR5KFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydCB0aGF0IGFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaXMgZW1wdHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPkFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaW1wbGVtZW50aW5nIElFbnVtZXJhYmxlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5Bcmd1bWVudHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LklzTm90RW1wdHkoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnQgdGhhdCBhbiBhcnJheSwgbGlzdCBvciBvdGhlciBjb2xsZWN0aW9uIGlzIGVtcHR5DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5BbiBhcnJheSwgbGlzdCBvciBvdGhlciBjb2xsZWN0aW9uIGltcGxlbWVudGluZyBJRW51bWVyYWJsZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db2xsZWN0aW9uQXNzZXJ0LklzTm90RW1wdHkoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0IHRoYXQgYW4gYXJyYXksbGlzdCBvciBvdGhlciBjb2xsZWN0aW9uIGlzIGVtcHR5DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5BbiBhcnJheSwgbGlzdCBvciBvdGhlciBjb2xsZWN0aW9uIGltcGxlbWVudGluZyBJRW51bWVyYWJsZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5Jc09yZGVyZWQoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0IHRoYXQgYW4gYXJyYXksIGxpc3Qgb3Igb3RoZXIgY29sbGVjdGlvbiBpcyBvcmRlcmVkDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5BbiBhcnJheSwgbGlzdCBvciBvdGhlciBjb2xsZWN0aW9uIGltcGxlbWVudGluZyBJRW51bWVyYWJsZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5Jc09yZGVyZWQoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnQgdGhhdCBhbiBhcnJheSwgbGlzdCBvciBvdGhlciBjb2xsZWN0aW9uIGlzIG9yZGVyZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPkFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaW1wbGVtZW50aW5nIElFbnVtZXJhYmxlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIG9uIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuSXNPcmRlcmVkKFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydCB0aGF0IGFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaXMgb3JkZXJlZA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+QW4gYXJyYXksIGxpc3Qgb3Igb3RoZXIgY29sbGVjdGlvbiBpbXBsZW1lbnRpbmcgSUVudW1lcmFibGU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbGxlY3Rpb25Bc3NlcnQuSXNPcmRlcmVkKFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZSxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0IHRoYXQgYW4gYXJyYXksIGxpc3Qgb3Igb3RoZXIgY29sbGVjdGlvbiBpcyBvcmRlcmVkDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5BbiBhcnJheSwgbGlzdCBvciBvdGhlciBjb2xsZWN0aW9uIGltcGxlbWVudGluZyBJRW51bWVyYWJsZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbXBhcmVyIj5BIGN1c3RvbSBjb21wYXJlciB0byBwZXJmb3JtIHRoZSBjb21wYXJpc29uczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBvbiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5Jc09yZGVyZWQoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29tcGFyZXIsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydCB0aGF0IGFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaXMgb3JkZXJlZA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+QW4gYXJyYXksIGxpc3Qgb3Igb3RoZXIgY29sbGVjdGlvbiBpbXBsZW1lbnRpbmcgSUVudW1lcmFibGU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb21wYXJlciI+QSBjdXN0b20gY29tcGFyZXIgdG8gcGVyZm9ybSB0aGUgY29tcGFyaXNvbnM8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgb24gZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuQ29sbGVjdGlvbkFzc2VydC5Jc09yZGVyZWQoU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29tcGFyZXIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnQgdGhhdCBhbiBhcnJheSwgbGlzdCBvciBvdGhlciBjb2xsZWN0aW9uIGlzIG9yZGVyZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPkFuIGFycmF5LCBsaXN0IG9yIG90aGVyIGNvbGxlY3Rpb24gaW1wbGVtZW50aW5nIElFbnVtZXJhYmxlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29tcGFyZXIiPkEgY3VzdG9tIGNvbXBhcmVyIHRvIHBlcmZvcm0gdGhlIGNvbXBhcmlzb25zPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5Db250YWlucyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU3RhdGljIGhlbHBlciBjbGFzcyB1c2VkIGluIHRoZSBjb25zdHJhaW50LWJhc2VkIHN5bnRheA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Db250YWlucy5TdWJzdHJpbmcoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgU3Vic3RyaW5nQ29uc3RyYWludA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic3Vic3RyaW5nIj5UaGUgdmFsdWUgb2YgdGhlIHN1YnN0cmluZzwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+QSBTdWJzdHJpbmdDb25zdHJhaW50PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkNvbnRhaW5zLkl0ZW0oU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBuZXcgQ29sbGVjdGlvbkNvbnRhaW5zQ29uc3RyYWludC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Iml0ZW0iPlRoZSBpdGVtIHRoYXQgc2hvdWxkIGJlIGZvdW5kLjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+QSBuZXcgQ29sbGVjdGlvbkNvbnRhaW5zQ29uc3RyYWludDwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5EaXJlY3RvcnlBc3NlcnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN1bW1hcnkgZGVzY3JpcHRpb24gZm9yIERpcmVjdG9yeUFzc2VydA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5EaXJlY3RvcnlBc3NlcnQuRXF1YWxzKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBFcXVhbHMgbWV0aG9kIHRocm93cyBhbiBBc3NlcnRpb25FeGNlcHRpb24uIFRoaXMgaXMgZG9uZSANCisgICAgICAgICAgICB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gbWlzdGFrZSBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJiIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkRpcmVjdG9yeUFzc2VydC5SZWZlcmVuY2VFcXVhbHMoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgUmVmZXJlbmNlRXF1YWxzIHRvIHRocm93IGFuIEFzc2VydGlvbkV4Y2VwdGlvbi4gVGhpcyANCisgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBtYWtlcyBzdXJlIHRoZXJlIGlzIG5vIG1pc3Rha2UgaW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uIA0KKyAgICAgICAgICAgIGFzIHBhcnQgb2YgQXNzZXJ0LiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImEiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImIiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXZSBkb24ndCBhY3R1YWxseSB3YW50IGFueSBpbnN0YW5jZXMgb2YgdGhpcyBvYmplY3QsIGJ1dCBzb21lIHBlb3BsZQ0KKyAgICAgICAgICAgIGxpa2UgdG8gaW5oZXJpdCBmcm9tIGl0IHRvIGFkZCBvdGhlciBzdGF0aWMgbWV0aG9kcy4gSGVuY2UsIHRoZQ0KKyAgICAgICAgICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvciBkaXNhbGxvd3MgYW55IGluc3RhbmNlcyBvZiB0aGlzIG9iamVjdC4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkRpcmVjdG9yeUFzc2VydC5BcmVFcXVhbChTeXN0ZW0uSU8uRGlyZWN0b3J5SW5mbyxTeXN0ZW0uSU8uRGlyZWN0b3J5SW5mbyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIGRpcmVjdG9yaWVzIGFyZSBlcXVhbC4gIFR3byBkaXJlY3RvcmllcyBhcmUgY29uc2lkZXJlZA0KKyAgICAgICAgICAgIGVxdWFsIGlmIGJvdGggYXJlIG51bGwsIG9yIGlmIGJvdGggaGF2ZSB0aGUgc2FtZSB2YWx1ZSBieXRlIGZvciBieXRlLg0KKyAgICAgICAgICAgIElmIHRoZXkgYXJlIG5vdCBlcXVhbCBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+QSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdmFsdWUgdGhhdCBpcyBleHBlY3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+QSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiBkaXJlY3RvcmllcyBhcmUgbm90IGVxdWFsPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byBkaXJlY3RvcmllcyBhcmUgZXF1YWwuICBUd28gZGlyZWN0b3JpZXMgYXJlIGNvbnNpZGVyZWQNCisgICAgICAgICAgICBlcXVhbCBpZiBib3RoIGFyZSBudWxsLCBvciBpZiBib3RoIGhhdmUgdGhlIHNhbWUgdmFsdWUgYnl0ZSBmb3IgYnl0ZS4NCisgICAgICAgICAgICBJZiB0aGV5IGFyZSBub3QgZXF1YWwgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPkEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPkEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgZGlyZWN0b3JpZXMgYXJlIG5vdCBlcXVhbDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gZGlyZWN0b3JpZXMgYXJlIGVxdWFsLiAgVHdvIGRpcmVjdG9yaWVzIGFyZSBjb25zaWRlcmVkDQorICAgICAgICAgICAgZXF1YWwgaWYgYm90aCBhcmUgbnVsbCwgb3IgaWYgYm90aCBoYXZlIHRoZSBzYW1lIHZhbHVlIGJ5dGUgZm9yIGJ5dGUuDQorICAgICAgICAgICAgSWYgdGhleSBhcmUgbm90IGVxdWFsIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5BIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5BIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkRpcmVjdG9yeUFzc2VydC5BcmVFcXVhbChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byBkaXJlY3RvcmllcyBhcmUgZXF1YWwuICBUd28gZGlyZWN0b3JpZXMgYXJlIGNvbnNpZGVyZWQNCisgICAgICAgICAgICBlcXVhbCBpZiBib3RoIGFyZSBudWxsLCBvciBpZiBib3RoIGhhdmUgdGhlIHNhbWUgdmFsdWUgYnl0ZSBmb3IgYnl0ZS4NCisgICAgICAgICAgICBJZiB0aGV5IGFyZSBub3QgZXF1YWwgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPkEgZGlyZWN0b3J5IHBhdGggc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPkEgZGlyZWN0b3J5IHBhdGggc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgZGlyZWN0b3JpZXMgYXJlIG5vdCBlcXVhbDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkRpcmVjdG9yeUFzc2VydC5BcmVFcXVhbChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIGRpcmVjdG9yaWVzIGFyZSBlcXVhbC4gIFR3byBkaXJlY3RvcmllcyBhcmUgY29uc2lkZXJlZA0KKyAgICAgICAgICAgIGVxdWFsIGlmIGJvdGggYXJlIG51bGwsIG9yIGlmIGJvdGggaGF2ZSB0aGUgc2FtZSB2YWx1ZSBieXRlIGZvciBieXRlLg0KKyAgICAgICAgICAgIElmIHRoZXkgYXJlIG5vdCBlcXVhbCBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+QSBkaXJlY3RvcnkgcGF0aCBzdHJpbmcgY29udGFpbmluZyB0aGUgdmFsdWUgdGhhdCBpcyBleHBlY3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+QSBkaXJlY3RvcnkgcGF0aCBzdHJpbmcgY29udGFpbmluZyB0aGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiBkaXJlY3RvcmllcyBhcmUgbm90IGVxdWFsPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5EaXJlY3RvcnlBc3NlcnQuQXJlRXF1YWwoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gZGlyZWN0b3JpZXMgYXJlIGVxdWFsLiAgVHdvIGRpcmVjdG9yaWVzIGFyZSBjb25zaWRlcmVkDQorICAgICAgICAgICAgZXF1YWwgaWYgYm90aCBhcmUgbnVsbCwgb3IgaWYgYm90aCBoYXZlIHRoZSBzYW1lIHZhbHVlIGJ5dGUgZm9yIGJ5dGUuDQorICAgICAgICAgICAgSWYgdGhleSBhcmUgbm90IGVxdWFsIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5BIGRpcmVjdG9yeSBwYXRoIHN0cmluZyBjb250YWluaW5nIHRoZSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5BIGRpcmVjdG9yeSBwYXRoIHN0cmluZyBjb250YWluaW5nIHRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkRpcmVjdG9yeUFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uSU8uRGlyZWN0b3J5SW5mbyxTeXN0ZW0uSU8uRGlyZWN0b3J5SW5mbyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCB0d28gZGlyZWN0b3JpZXMgYXJlIG5vdCBlcXVhbC4gSWYgdGhleSBhcmUgZXF1YWwNCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+QSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdmFsdWUgdGhhdCBpcyBleHBlY3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+QSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiBkaXJlY3RvcmllcyBhcmUgbm90IGVxdWFsPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgdHdvIGRpcmVjdG9yaWVzIGFyZSBub3QgZXF1YWwuIElmIHRoZXkgYXJlIGVxdWFsDQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPkEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPkEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgZGlyZWN0b3JpZXMgYXJlIG5vdCBlcXVhbDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHR3byBkaXJlY3RvcmllcyBhcmUgbm90IGVxdWFsLiBJZiB0aGV5IGFyZSBlcXVhbA0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5BIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5BIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkRpcmVjdG9yeUFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgdHdvIGRpcmVjdG9yaWVzIGFyZSBub3QgZXF1YWwuIElmIHRoZXkgYXJlIGVxdWFsDQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPkEgZGlyZWN0b3J5IHBhdGggc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPkEgZGlyZWN0b3J5IHBhdGggc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgZGlyZWN0b3JpZXMgYXJlIGVxdWFsPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHR3byBkaXJlY3RvcmllcyBhcmUgbm90IGVxdWFsLiBJZiB0aGV5IGFyZSBlcXVhbA0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5BIGRpcmVjdG9yeSBwYXRoIHN0cmluZyBjb250YWluaW5nIHRoZSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5BIGRpcmVjdG9yeSBwYXRoIHN0cmluZyBjb250YWluaW5nIHRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGlmIGRpcmVjdG9yaWVzIGFyZSBlcXVhbDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCB0d28gZGlyZWN0b3JpZXMgYXJlIG5vdCBlcXVhbC4gSWYgdGhleSBhcmUgZXF1YWwNCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+QSBkaXJlY3RvcnkgcGF0aCBzdHJpbmcgY29udGFpbmluZyB0aGUgdmFsdWUgdGhhdCBpcyBleHBlY3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+QSBkaXJlY3RvcnkgcGF0aCBzdHJpbmcgY29udGFpbmluZyB0aGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5EaXJlY3RvcnlBc3NlcnQuSXNFbXB0eShTeXN0ZW0uSU8uRGlyZWN0b3J5SW5mbyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGVtcHR5LiBJZiBpdCBpcyBub3QgZW1wdHkNCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnkiPkEgZGlyZWN0b3J5IHRvIHNlYXJjaDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgZGlyZWN0b3JpZXMgYXJlIG5vdCBlcXVhbDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkRpcmVjdG9yeUFzc2VydC5Jc0VtcHR5KFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgdGhlIGRpcmVjdG9yeSBpcyBlbXB0eS4gSWYgaXQgaXMgbm90IGVtcHR5DQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5Ij5BIGRpcmVjdG9yeSB0byBzZWFyY2g8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGlmIGRpcmVjdG9yaWVzIGFyZSBub3QgZXF1YWw8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkRpcmVjdG9yeUFzc2VydC5Jc0VtcHR5KFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgZW1wdHkuIElmIGl0IGlzIG5vdCBlbXB0eQ0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRpcmVjdG9yeSI+QSBkaXJlY3RvcnkgdG8gc2VhcmNoPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5EaXJlY3RvcnlBc3NlcnQuSXNFbXB0eShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgZW1wdHkuIElmIGl0IGlzIG5vdCBlbXB0eQ0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRpcmVjdG9yeSI+QSBkaXJlY3RvcnkgdG8gc2VhcmNoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiBkaXJlY3RvcmllcyBhcmUgbm90IGVxdWFsPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LklzRW1wdHkoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgZW1wdHkuIElmIGl0IGlzIG5vdCBlbXB0eQ0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRpcmVjdG9yeSI+QSBkaXJlY3RvcnkgdG8gc2VhcmNoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiBkaXJlY3RvcmllcyBhcmUgbm90IGVxdWFsPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5EaXJlY3RvcnlBc3NlcnQuSXNFbXB0eShTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgZW1wdHkuIElmIGl0IGlzIG5vdCBlbXB0eQ0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRpcmVjdG9yeSI+QSBkaXJlY3RvcnkgdG8gc2VhcmNoPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5EaXJlY3RvcnlBc3NlcnQuSXNOb3RFbXB0eShTeXN0ZW0uSU8uRGlyZWN0b3J5SW5mbyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIG5vdCBlbXB0eS4gSWYgaXQgaXMgZW1wdHkNCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnkiPkEgZGlyZWN0b3J5IHRvIHNlYXJjaDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgZGlyZWN0b3JpZXMgYXJlIG5vdCBlcXVhbDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkRpcmVjdG9yeUFzc2VydC5Jc05vdEVtcHR5KFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgdGhlIGRpcmVjdG9yeSBpcyBub3QgZW1wdHkuIElmIGl0IGlzIGVtcHR5DQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5Ij5BIGRpcmVjdG9yeSB0byBzZWFyY2g8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGlmIGRpcmVjdG9yaWVzIGFyZSBub3QgZXF1YWw8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkRpcmVjdG9yeUFzc2VydC5Jc05vdEVtcHR5KFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgbm90IGVtcHR5LiBJZiBpdCBpcyBlbXB0eQ0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRpcmVjdG9yeSI+QSBkaXJlY3RvcnkgdG8gc2VhcmNoPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5EaXJlY3RvcnlBc3NlcnQuSXNOb3RFbXB0eShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgbm90IGVtcHR5LiBJZiBpdCBpcyBlbXB0eQ0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRpcmVjdG9yeSI+QSBkaXJlY3RvcnkgdG8gc2VhcmNoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiBkaXJlY3RvcmllcyBhcmUgbm90IGVxdWFsPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LklzTm90RW1wdHkoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgbm90IGVtcHR5LiBJZiBpdCBpcyBlbXB0eQ0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRpcmVjdG9yeSI+QSBkaXJlY3RvcnkgdG8gc2VhcmNoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiBkaXJlY3RvcmllcyBhcmUgbm90IGVxdWFsPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5EaXJlY3RvcnlBc3NlcnQuSXNOb3RFbXB0eShTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgbm90IGVtcHR5LiBJZiBpdCBpcyBlbXB0eQ0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRpcmVjdG9yeSI+QSBkaXJlY3RvcnkgdG8gc2VhcmNoPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5EaXJlY3RvcnlBc3NlcnQuSXNXaXRoaW4oU3lzdGVtLklPLkRpcmVjdG9yeUluZm8sU3lzdGVtLklPLkRpcmVjdG9yeUluZm8sU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgcGF0aCBjb250YWlucyBhY3R1YWwgYXMgYSBzdWJkaXJlY3Rvcnkgb3INCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnkiPkEgZGlyZWN0b3J5IHRvIHNlYXJjaDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+c3ViLWRpcmVjdG9yeSBhc3NlcnRlZCB0byBleGlzdCB1bmRlciBkaXJlY3Rvcnk8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGlmIGRpcmVjdG9yeSBpcyBub3Qgd2l0aGluIHRoZSBwYXRoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LklzV2l0aGluKFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgcGF0aCBjb250YWlucyBhY3R1YWwgYXMgYSBzdWJkaXJlY3Rvcnkgb3INCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnkiPkEgZGlyZWN0b3J5IHRvIHNlYXJjaDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+c3ViLWRpcmVjdG9yeSBhc3NlcnRlZCB0byBleGlzdCB1bmRlciBkaXJlY3Rvcnk8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGlmIGRpcmVjdG9yeSBpcyBub3Qgd2l0aGluIHRoZSBwYXRoPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5EaXJlY3RvcnlBc3NlcnQuSXNXaXRoaW4oU3lzdGVtLklPLkRpcmVjdG9yeUluZm8sU3lzdGVtLklPLkRpcmVjdG9yeUluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgcGF0aCBjb250YWlucyBhY3R1YWwgYXMgYSBzdWJkaXJlY3Rvcnkgb3INCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnkiPkEgZGlyZWN0b3J5IHRvIHNlYXJjaDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+c3ViLWRpcmVjdG9yeSBhc3NlcnRlZCB0byBleGlzdCB1bmRlciBkaXJlY3Rvcnk8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkRpcmVjdG9yeUFzc2VydC5Jc1dpdGhpbihTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgcGF0aCBjb250YWlucyBhY3R1YWwgYXMgYSBzdWJkaXJlY3Rvcnkgb3INCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnkiPkEgZGlyZWN0b3J5IHRvIHNlYXJjaDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+c3ViLWRpcmVjdG9yeSBhc3NlcnRlZCB0byBleGlzdCB1bmRlciBkaXJlY3Rvcnk8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGlmIGRpcmVjdG9yeSBpcyBub3Qgd2l0aGluIHRoZSBwYXRoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LklzV2l0aGluKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHBhdGggY29udGFpbnMgYWN0dWFsIGFzIGEgc3ViZGlyZWN0b3J5IG9yDQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5Ij5BIGRpcmVjdG9yeSB0byBzZWFyY2g8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPnN1Yi1kaXJlY3RvcnkgYXNzZXJ0ZWQgdG8gZXhpc3QgdW5kZXIgZGlyZWN0b3J5PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiBkaXJlY3RvcnkgaXMgbm90IHdpdGhpbiB0aGUgcGF0aDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LklzV2l0aGluKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBwYXRoIGNvbnRhaW5zIGFjdHVhbCBhcyBhIHN1YmRpcmVjdG9yeSBvcg0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRpcmVjdG9yeSI+QSBkaXJlY3RvcnkgdG8gc2VhcmNoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5zdWItZGlyZWN0b3J5IGFzc2VydGVkIHRvIGV4aXN0IHVuZGVyIGRpcmVjdG9yeTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LklzTm90V2l0aGluKFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHBhdGggZG9lcyBub3QgY29udGFpbiBhY3R1YWwgYXMgYSBzdWJkaXJlY3Rvcnkgb3INCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnkiPkEgZGlyZWN0b3J5IHRvIHNlYXJjaDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+c3ViLWRpcmVjdG9yeSBhc3NlcnRlZCB0byBleGlzdCB1bmRlciBkaXJlY3Rvcnk8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGlmIGRpcmVjdG9yeSBpcyBub3Qgd2l0aGluIHRoZSBwYXRoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LklzTm90V2l0aGluKFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgcGF0aCBkb2VzIG5vdCBjb250YWluIGFjdHVhbCBhcyBhIHN1YmRpcmVjdG9yeSBvcg0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRpcmVjdG9yeSI+QSBkaXJlY3RvcnkgdG8gc2VhcmNoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5zdWItZGlyZWN0b3J5IGFzc2VydGVkIHRvIGV4aXN0IHVuZGVyIGRpcmVjdG9yeTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgZGlyZWN0b3J5IGlzIG5vdCB3aXRoaW4gdGhlIHBhdGg8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkRpcmVjdG9yeUFzc2VydC5Jc05vdFdpdGhpbihTeXN0ZW0uSU8uRGlyZWN0b3J5SW5mbyxTeXN0ZW0uSU8uRGlyZWN0b3J5SW5mbykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBwYXRoIGRvZXMgbm90IGNvbnRhaW4gYWN0dWFsIGFzIGEgc3ViZGlyZWN0b3J5IG9yDQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5Ij5BIGRpcmVjdG9yeSB0byBzZWFyY2g8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPnN1Yi1kaXJlY3RvcnkgYXNzZXJ0ZWQgdG8gZXhpc3QgdW5kZXIgZGlyZWN0b3J5PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5EaXJlY3RvcnlBc3NlcnQuSXNOb3RXaXRoaW4oU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHBhdGggZG9lcyBub3QgY29udGFpbiBhY3R1YWwgYXMgYSBzdWJkaXJlY3Rvcnkgb3INCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnkiPkEgZGlyZWN0b3J5IHRvIHNlYXJjaDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+c3ViLWRpcmVjdG9yeSBhc3NlcnRlZCB0byBleGlzdCB1bmRlciBkaXJlY3Rvcnk8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGlmIGRpcmVjdG9yeSBpcyBub3Qgd2l0aGluIHRoZSBwYXRoPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRGlyZWN0b3J5QXNzZXJ0LklzTm90V2l0aGluKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHBhdGggZG9lcyBub3QgY29udGFpbiBhY3R1YWwgYXMgYSBzdWJkaXJlY3Rvcnkgb3INCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnkiPkEgZGlyZWN0b3J5IHRvIHNlYXJjaDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+c3ViLWRpcmVjdG9yeSBhc3NlcnRlZCB0byBleGlzdCB1bmRlciBkaXJlY3Rvcnk8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGlmIGRpcmVjdG9yeSBpcyBub3Qgd2l0aGluIHRoZSBwYXRoPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5EaXJlY3RvcnlBc3NlcnQuSXNOb3RXaXRoaW4oU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHBhdGggZG9lcyBub3QgY29udGFpbiBhY3R1YWwgYXMgYSBzdWJkaXJlY3Rvcnkgb3INCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnkiPkEgZGlyZWN0b3J5IHRvIHNlYXJjaDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+c3ViLWRpcmVjdG9yeSBhc3NlcnRlZCB0byBleGlzdCB1bmRlciBkaXJlY3Rvcnk8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkZpbGVBc3NlcnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFN1bW1hcnkgZGVzY3JpcHRpb24gZm9yIEZpbGVBc3NlcnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkZpbGVBc3NlcnQuRXF1YWxzKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBFcXVhbHMgbWV0aG9kIHRocm93cyBhbiBBc3NlcnRpb25FeGNlcHRpb24uIFRoaXMgaXMgZG9uZSANCisgICAgICAgICAgICB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gbWlzdGFrZSBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJiIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkZpbGVBc3NlcnQuUmVmZXJlbmNlRXF1YWxzKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIG92ZXJyaWRlIHRoZSBkZWZhdWx0IFJlZmVyZW5jZUVxdWFscyB0byB0aHJvdyBhbiBBc3NlcnRpb25FeGNlcHRpb24uIFRoaXMgDQorICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gbWFrZXMgc3VyZSB0aGVyZSBpcyBubyBtaXN0YWtlIGluIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiANCisgICAgICAgICAgICBhcyBwYXJ0IG9mIEFzc2VydC4gDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJiIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkZpbGVBc3NlcnQuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdlIGRvbid0IGFjdHVhbGx5IHdhbnQgYW55IGluc3RhbmNlcyBvZiB0aGlzIG9iamVjdCwgYnV0IHNvbWUgcGVvcGxlDQorICAgICAgICAgICAgbGlrZSB0byBpbmhlcml0IGZyb20gaXQgdG8gYWRkIG90aGVyIHN0YXRpYyBtZXRob2RzLiBIZW5jZSwgdGhlDQorICAgICAgICAgICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yIGRpc2FsbG93cyBhbnkgaW5zdGFuY2VzIG9mIHRoaXMgb2JqZWN0LiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRmlsZUFzc2VydC5BcmVFcXVhbChTeXN0ZW0uSU8uU3RyZWFtLFN5c3RlbS5JTy5TdHJlYW0sU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byBTdHJlYW1zIGFyZSBlcXVhbC4gIFR3byBTdHJlYW1zIGFyZSBjb25zaWRlcmVkDQorICAgICAgICAgICAgZXF1YWwgaWYgYm90aCBhcmUgbnVsbCwgb3IgaWYgYm90aCBoYXZlIHRoZSBzYW1lIHZhbHVlIGJ5dGUgZm9yIGJ5dGUuDQorICAgICAgICAgICAgSWYgdGhleSBhcmUgbm90IGVxdWFsIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgU3RyZWFtPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIFN0cmVhbTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgU3RyZWFtcyBhcmUgbm90IGVxdWFsPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRmlsZUFzc2VydC5BcmVFcXVhbChTeXN0ZW0uSU8uU3RyZWFtLFN5c3RlbS5JTy5TdHJlYW0sU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIFN0cmVhbXMgYXJlIGVxdWFsLiAgVHdvIFN0cmVhbXMgYXJlIGNvbnNpZGVyZWQNCisgICAgICAgICAgICBlcXVhbCBpZiBib3RoIGFyZSBudWxsLCBvciBpZiBib3RoIGhhdmUgdGhlIHNhbWUgdmFsdWUgYnl0ZSBmb3IgYnl0ZS4NCisgICAgICAgICAgICBJZiB0aGV5IGFyZSBub3QgZXF1YWwgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBTdHJlYW08L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgU3RyZWFtPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiBvYmplY3RzIGFyZSBub3QgZXF1YWw8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkZpbGVBc3NlcnQuQXJlRXF1YWwoU3lzdGVtLklPLlN0cmVhbSxTeXN0ZW0uSU8uU3RyZWFtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gU3RyZWFtcyBhcmUgZXF1YWwuICBUd28gU3RyZWFtcyBhcmUgY29uc2lkZXJlZA0KKyAgICAgICAgICAgIGVxdWFsIGlmIGJvdGggYXJlIG51bGwsIG9yIGlmIGJvdGggaGF2ZSB0aGUgc2FtZSB2YWx1ZSBieXRlIGZvciBieXRlLg0KKyAgICAgICAgICAgIElmIHRoZXkgYXJlIG5vdCBlcXVhbCBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIFN0cmVhbTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCBTdHJlYW08L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkZpbGVBc3NlcnQuQXJlRXF1YWwoU3lzdGVtLklPLkZpbGVJbmZvLFN5c3RlbS5JTy5GaWxlSW5mbyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIGZpbGVzIGFyZSBlcXVhbC4gIFR3byBmaWxlcyBhcmUgY29uc2lkZXJlZA0KKyAgICAgICAgICAgIGVxdWFsIGlmIGJvdGggYXJlIG51bGwsIG9yIGlmIGJvdGggaGF2ZSB0aGUgc2FtZSB2YWx1ZSBieXRlIGZvciBieXRlLg0KKyAgICAgICAgICAgIElmIHRoZXkgYXJlIG5vdCBlcXVhbCBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+QSBmaWxlIGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPkEgZmlsZSBjb250YWluaW5nIHRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGlmIFN0cmVhbXMgYXJlIG5vdCBlcXVhbDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkZpbGVBc3NlcnQuQXJlRXF1YWwoU3lzdGVtLklPLkZpbGVJbmZvLFN5c3RlbS5JTy5GaWxlSW5mbyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gZmlsZXMgYXJlIGVxdWFsLiAgVHdvIGZpbGVzIGFyZSBjb25zaWRlcmVkDQorICAgICAgICAgICAgZXF1YWwgaWYgYm90aCBhcmUgbnVsbCwgb3IgaWYgYm90aCBoYXZlIHRoZSBzYW1lIHZhbHVlIGJ5dGUgZm9yIGJ5dGUuDQorICAgICAgICAgICAgSWYgdGhleSBhcmUgbm90IGVxdWFsIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5BIGZpbGUgY29udGFpbmluZyB0aGUgdmFsdWUgdGhhdCBpcyBleHBlY3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+QSBmaWxlIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgb2JqZWN0cyBhcmUgbm90IGVxdWFsPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5GaWxlQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5JTy5GaWxlSW5mbyxTeXN0ZW0uSU8uRmlsZUluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byBmaWxlcyBhcmUgZXF1YWwuICBUd28gZmlsZXMgYXJlIGNvbnNpZGVyZWQNCisgICAgICAgICAgICBlcXVhbCBpZiBib3RoIGFyZSBudWxsLCBvciBpZiBib3RoIGhhdmUgdGhlIHNhbWUgdmFsdWUgYnl0ZSBmb3IgYnl0ZS4NCisgICAgICAgICAgICBJZiB0aGV5IGFyZSBub3QgZXF1YWwgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPkEgZmlsZSBjb250YWluaW5nIHRoZSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5BIGZpbGUgY29udGFpbmluZyB0aGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5GaWxlQXNzZXJ0LkFyZUVxdWFsKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFZlcmlmaWVzIHRoYXQgdHdvIGZpbGVzIGFyZSBlcXVhbC4gIFR3byBmaWxlcyBhcmUgY29uc2lkZXJlZA0KKyAgICAgICAgICAgIGVxdWFsIGlmIGJvdGggYXJlIG51bGwsIG9yIGlmIGJvdGggaGF2ZSB0aGUgc2FtZSB2YWx1ZSBieXRlIGZvciBieXRlLg0KKyAgICAgICAgICAgIElmIHRoZXkgYXJlIG5vdCBlcXVhbCBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIHBhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBwYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIHRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGlmIFN0cmVhbXMgYXJlIG5vdCBlcXVhbDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkZpbGVBc3NlcnQuQXJlRXF1YWwoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBWZXJpZmllcyB0aGF0IHR3byBmaWxlcyBhcmUgZXF1YWwuICBUd28gZmlsZXMgYXJlIGNvbnNpZGVyZWQNCisgICAgICAgICAgICBlcXVhbCBpZiBib3RoIGFyZSBudWxsLCBvciBpZiBib3RoIGhhdmUgdGhlIHNhbWUgdmFsdWUgYnl0ZSBmb3IgYnl0ZS4NCisgICAgICAgICAgICBJZiB0aGV5IGFyZSBub3QgZXF1YWwgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBwYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIHRoZSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgcGF0aCB0byBhIGZpbGUgY29udGFpbmluZyB0aGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiBvYmplY3RzIGFyZSBub3QgZXF1YWw8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkZpbGVBc3NlcnQuQXJlRXF1YWwoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVmVyaWZpZXMgdGhhdCB0d28gZmlsZXMgYXJlIGVxdWFsLiAgVHdvIGZpbGVzIGFyZSBjb25zaWRlcmVkDQorICAgICAgICAgICAgZXF1YWwgaWYgYm90aCBhcmUgbnVsbCwgb3IgaWYgYm90aCBoYXZlIHRoZSBzYW1lIHZhbHVlIGJ5dGUgZm9yIGJ5dGUuDQorICAgICAgICAgICAgSWYgdGhleSBhcmUgbm90IGVxdWFsIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgcGF0aCB0byBhIGZpbGUgY29udGFpbmluZyB0aGUgdmFsdWUgdGhhdCBpcyBleHBlY3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHBhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRmlsZUFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uSU8uU3RyZWFtLFN5c3RlbS5JTy5TdHJlYW0sU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgdHdvIFN0cmVhbXMgYXJlIG5vdCBlcXVhbC4gSWYgdGhleSBhcmUgZXF1YWwNCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIFN0cmVhbTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCBTdHJlYW08L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgd2hlbiB0aGUgdHdvIFN0cmVhbSBhcmUgdGhlIHNhbWUuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRmlsZUFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uSU8uU3RyZWFtLFN5c3RlbS5JTy5TdHJlYW0sU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCB0d28gU3RyZWFtcyBhcmUgbm90IGVxdWFsLiBJZiB0aGV5IGFyZSBlcXVhbA0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgU3RyZWFtPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIFN0cmVhbTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCB3aGVuIHRoZSBTdHJlYW1zIGFyZSB0aGUgc2FtZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkZpbGVBc3NlcnQuQXJlTm90RXF1YWwoU3lzdGVtLklPLlN0cmVhbSxTeXN0ZW0uSU8uU3RyZWFtKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHR3byBTdHJlYW1zIGFyZSBub3QgZXF1YWwuIElmIHRoZXkgYXJlIGVxdWFsDQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBTdHJlYW08L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgU3RyZWFtPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5GaWxlQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5JTy5GaWxlSW5mbyxTeXN0ZW0uSU8uRmlsZUluZm8sU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgdHdvIGZpbGVzIGFyZSBub3QgZXF1YWwuIElmIHRoZXkgYXJlIGVxdWFsDQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPkEgZmlsZSBjb250YWluaW5nIHRoZSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5BIGZpbGUgY29udGFpbmluZyB0aGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiBTdHJlYW1zIGFyZSBub3QgZXF1YWw8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5Bcmd1bWVudHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5GaWxlQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5JTy5GaWxlSW5mbyxTeXN0ZW0uSU8uRmlsZUluZm8sU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCB0d28gZmlsZXMgYXJlIG5vdCBlcXVhbC4gSWYgdGhleSBhcmUgZXF1YWwNCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+QSBmaWxlIGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPkEgZmlsZSBjb250YWluaW5nIHRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGlmIG9iamVjdHMgYXJlIG5vdCBlcXVhbDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRmlsZUFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uSU8uRmlsZUluZm8sU3lzdGVtLklPLkZpbGVJbmZvKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHR3byBmaWxlcyBhcmUgbm90IGVxdWFsLiBJZiB0aGV5IGFyZSBlcXVhbA0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5BIGZpbGUgY29udGFpbmluZyB0aGUgdmFsdWUgdGhhdCBpcyBleHBlY3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+QSBmaWxlIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuRmlsZUFzc2VydC5BcmVOb3RFcXVhbChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgdHdvIGZpbGVzIGFyZSBub3QgZXF1YWwuIElmIHRoZXkgYXJlIGVxdWFsDQorICAgICAgICAgICAgYW4gPHNlZSBjcmVmPSJUOk5Vbml0LkZyYW1ld29yay5Bc3NlcnRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBwYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIHRoZSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgcGF0aCB0byBhIGZpbGUgY29udGFpbmluZyB0aGUgYWN0dWFsIHZhbHVlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiBTdHJlYW1zIGFyZSBub3QgZXF1YWw8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5Bcmd1bWVudHMgdG8gYmUgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5GaWxlQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHR3byBmaWxlcyBhcmUgbm90IGVxdWFsLiBJZiB0aGV5IGFyZSBlcXVhbA0KKyAgICAgICAgICAgIGFuIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuQXNzZXJ0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgcGF0aCB0byBhIGZpbGUgY29udGFpbmluZyB0aGUgdmFsdWUgdGhhdCBpcyBleHBlY3RlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHBhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgb2JqZWN0cyBhcmUgbm90IGVxdWFsPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5GaWxlQXNzZXJ0LkFyZU5vdEVxdWFsKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCB0d28gZmlsZXMgYXJlIG5vdCBlcXVhbC4gSWYgdGhleSBhcmUgZXF1YWwNCisgICAgICAgICAgICBhbiA8c2VlIGNyZWY9IlQ6TlVuaXQuRnJhbWV3b3JrLkFzc2VydGlvbkV4Y2VwdGlvbiIvPiBpcyB0aHJvd24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIHBhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBwYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIHRoZSBhY3R1YWwgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkdsb2JhbFNldHRpbmdzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHbG9iYWxTZXR0aW5ncyBpcyBhIHBsYWNlIGZvciBzZXR0aW5nIGRlZmF1bHQgdmFsdWVzIHVzZWQNCisgICAgICAgICAgICBieSB0aGUgZnJhbWV3b3JrIGluIHBlcmZvcm1pbmcgYXNzZXJ0cy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuR2xvYmFsU2V0dGluZ3MuRGVmYXVsdEZsb2F0aW5nUG9pbnRUb2xlcmFuY2UiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIERlZmF1bHQgdG9sZXJhbmNlIGZvciBmbG9hdGluZyBwb2ludCBlcXVhbGl0eQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5IYXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhlbHBlciBjbGFzcyB3aXRoIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgdGhhdCBzdXBwbHkNCisgICAgICAgICAgICBhIG51bWJlciBvZiBjb25zdHJhaW50cyB1c2VkIGluIEFzc2VydHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkhhcy5Qcm9wZXJ0eShTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIG5ldyBQcm9wZXJ0eUNvbnN0cmFpbnRFeHByZXNzaW9uLCB3aGljaCB3aWxsIGVpdGhlcg0KKyAgICAgICAgICAgIHRlc3QgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIG5hbWVkIHByb3BlcnR5IG9uIHRoZSBvYmplY3QNCisgICAgICAgICAgICBiZWluZyB0ZXN0ZWQgb3IgYXBwbHkgYW55IGZvbGxvd2luZyBjb25zdHJhaW50IHRvIHRoYXQgcHJvcGVydHkuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkhhcy5BdHRyaWJ1dGUoU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IEF0dHJpYnV0ZUNvbnN0cmFpbnQgY2hlY2tpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIHByZXNlbmNlIG9mIGEgcGFydGljdWxhciBhdHRyaWJ1dGUgb24gYW4gb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5IYXMuQXR0cmlidXRlYGAxIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IEF0dHJpYnV0ZUNvbnN0cmFpbnQgY2hlY2tpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIHByZXNlbmNlIG9mIGEgcGFydGljdWxhciBhdHRyaWJ1dGUgb24gYW4gb2JqZWN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5IYXMuTWVtYmVyKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IENvbGxlY3Rpb25Db250YWluc0NvbnN0cmFpbnQgY2hlY2tpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgIHByZXNlbmNlIG9mIGEgcGFydGljdWxhciBvYmplY3QgaW4gdGhlIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkhhcy5ObyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIENvbnN0cmFpbnRFeHByZXNzaW9uIHRoYXQgbmVnYXRlcyBhbnkNCisgICAgICAgICAgICBmb2xsb3dpbmcgY29uc3RyYWludC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuSGFzLkFsbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIENvbnN0cmFpbnRFeHByZXNzaW9uLCB3aGljaCB3aWxsIGFwcGx5DQorICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBjb25zdHJhaW50IHRvIGFsbCBtZW1iZXJzIG9mIGEgY29sbGVjdGlvbiwNCisgICAgICAgICAgICBzdWNjZWVkaW5nIGlmIGFsbCBvZiB0aGVtIHN1Y2NlZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkhhcy5Tb21lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgQ29uc3RyYWludEV4cHJlc3Npb24sIHdoaWNoIHdpbGwgYXBwbHkNCisgICAgICAgICAgICB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnQgdG8gYWxsIG1lbWJlcnMgb2YgYSBjb2xsZWN0aW9uLA0KKyAgICAgICAgICAgIHN1Y2NlZWRpbmcgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZW0gc3VjY2VlZHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLkhhcy5Ob25lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgQ29uc3RyYWludEV4cHJlc3Npb24sIHdoaWNoIHdpbGwgYXBwbHkNCisgICAgICAgICAgICB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnQgdG8gYWxsIG1lbWJlcnMgb2YgYSBjb2xsZWN0aW9uLA0KKyAgICAgICAgICAgIHN1Y2NlZWRpbmcgaWYgYWxsIG9mIHRoZW0gZmFpbC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuSGFzLkxlbmd0aCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIG5ldyBDb25zdHJhaW50RXhwcmVzc2lvbiwgd2hpY2ggd2lsbCBhcHBseSB0aGUgZm9sbG93aW5nDQorICAgICAgICAgICAgY29uc3RyYWludCB0byB0aGUgTGVuZ3RoIHByb3BlcnR5IG9mIHRoZSBvYmplY3QgYmVpbmcgdGVzdGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5IYXMuQ291bnQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBuZXcgQ29uc3RyYWludEV4cHJlc3Npb24sIHdoaWNoIHdpbGwgYXBwbHkgdGhlIGZvbGxvd2luZw0KKyAgICAgICAgICAgIGNvbnN0cmFpbnQgdG8gdGhlIENvdW50IHByb3BlcnR5IG9mIHRoZSBvYmplY3QgYmVpbmcgdGVzdGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5IYXMuTWVzc2FnZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIG5ldyBDb25zdHJhaW50RXhwcmVzc2lvbiwgd2hpY2ggd2lsbCBhcHBseSB0aGUgZm9sbG93aW5nDQorICAgICAgICAgICAgY29uc3RyYWludCB0byB0aGUgTWVzc2FnZSBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0IGJlaW5nIHRlc3RlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuSGFzLklubmVyRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgbmV3IENvbnN0cmFpbnRFeHByZXNzaW9uLCB3aGljaCB3aWxsIGFwcGx5IHRoZSBmb2xsb3dpbmcNCisgICAgICAgICAgICBjb25zdHJhaW50IHRvIHRoZSBJbm5lckV4Y2VwdGlvbiBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0IGJlaW5nIHRlc3RlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuSUV4cGVjdEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGEgdXNlciBmaXh0dXJlIGluIG9yZGVyIHRvDQorICAgICAgICAgICAgdmFsaWRhdGUgYW55IGV4cGVjdGVkIGV4Y2VwdGlvbnMuIEl0IGlzIG9ubHkgY2FsbGVkDQorICAgICAgICAgICAgZm9yIHRlc3QgbWV0aG9kcyBtYXJrZWQgd2l0aCB0aGUgRXhwZWN0ZWRFeGNlcHRpb24NCisgICAgICAgICAgICBhdHRyaWJ1dGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklFeHBlY3RFeGNlcHRpb24uSGFuZGxlRXhjZXB0aW9uKFN5c3RlbS5FeGNlcHRpb24pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBNZXRob2QgdG8gaGFuZGxlIGFuIGV4cGVjdGVkIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXgiPlRoZSBleGNlcHRpb24gdG8gYmUgaGFuZGxlZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuSXMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEhlbHBlciBjbGFzcyB3aXRoIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgdGhhdCBzdXBwbHkNCisgICAgICAgICAgICBhIG51bWJlciBvZiBjb25zdHJhaW50cyB1c2VkIGluIEFzc2VydHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklzLkVxdWFsVG8oU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgdHdvIGl0ZW1zIGZvciBlcXVhbGl0eQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Jcy5TYW1lQXMoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgdGhhdCB0d28gcmVmZXJlbmNlcyBhcmUgdGhlIHNhbWUgb2JqZWN0DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklzLkdyZWF0ZXJUaGFuKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlDQorICAgICAgICAgICAgYWN0dWFsIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3VwcGxlZCBhcmd1bWVudA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Jcy5HcmVhdGVyVGhhbk9yRXF1YWxUbyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZQ0KKyAgICAgICAgICAgIGFjdHVhbCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHN1cHBsZWQgYXJndW1lbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuSXMuQXRMZWFzdChTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZQ0KKyAgICAgICAgICAgIGFjdHVhbCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHN1cHBsZWQgYXJndW1lbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuSXMuTGVzc1RoYW4oU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUNCisgICAgICAgICAgICBhY3R1YWwgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzdXBwbGVkIGFyZ3VtZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklzLkxlc3NUaGFuT3JFcXVhbFRvKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlDQorICAgICAgICAgICAgYWN0dWFsIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3VwcGxlZCBhcmd1bWVudA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Jcy5BdE1vc3QoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUNCisgICAgICAgICAgICBhY3R1YWwgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzdXBwbGVkIGFyZ3VtZW50DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklzLlR5cGVPZihTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsDQorICAgICAgICAgICAgdmFsdWUgaXMgb2YgdGhlIGV4YWN0IHR5cGUgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklzLlR5cGVPZmBgMSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBhY3R1YWwNCisgICAgICAgICAgICB2YWx1ZSBpcyBvZiB0aGUgZXhhY3QgdHlwZSBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuSXMuSW5zdGFuY2VPZihTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsIHZhbHVlDQorICAgICAgICAgICAgaXMgb2YgdGhlIHR5cGUgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQgb3IgYSBkZXJpdmVkIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklzLkluc3RhbmNlT2ZgYDEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsIHZhbHVlDQorICAgICAgICAgICAgaXMgb2YgdGhlIHR5cGUgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQgb3IgYSBkZXJpdmVkIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklzLkluc3RhbmNlT2ZUeXBlKFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBhY3R1YWwgdmFsdWUNCisgICAgICAgICAgICBpcyBvZiB0aGUgdHlwZSBzdXBwbGllZCBhcyBhbiBhcmd1bWVudCBvciBhIGRlcml2ZWQgdHlwZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuSXMuSW5zdGFuY2VPZlR5cGVgYDEiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgd2hldGhlciB0aGUgYWN0dWFsIHZhbHVlDQorICAgICAgICAgICAgaXMgb2YgdGhlIHR5cGUgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQgb3IgYSBkZXJpdmVkIHR5cGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklzLkFzc2lnbmFibGVGcm9tKFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBhY3R1YWwgdmFsdWUNCisgICAgICAgICAgICBpcyBhc3NpZ25hYmxlIGZyb20gdGhlIHR5cGUgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklzLkFzc2lnbmFibGVGcm9tYGAxIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIGFjdHVhbCB2YWx1ZQ0KKyAgICAgICAgICAgIGlzIGFzc2lnbmFibGUgZnJvbSB0aGUgdHlwZSBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuSXMuQXNzaWduYWJsZVRvKFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBhY3R1YWwgdmFsdWUNCisgICAgICAgICAgICBpcyBhc3NpZ25hYmxlIGZyb20gdGhlIHR5cGUgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklzLkFzc2lnbmFibGVUb2BgMSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBhY3R1YWwgdmFsdWUNCisgICAgICAgICAgICBpcyBhc3NpZ25hYmxlIGZyb20gdGhlIHR5cGUgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklzLkVxdWl2YWxlbnRUbyhTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIGFjdHVhbCB2YWx1ZQ0KKyAgICAgICAgICAgIGlzIGEgY29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBzYW1lIGVsZW1lbnRzIGFzIHRoZSANCisgICAgICAgICAgICBjb2xsZWN0aW9uIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Jcy5TdWJzZXRPZihTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIGFjdHVhbCB2YWx1ZQ0KKyAgICAgICAgICAgIGlzIGEgc3Vic2V0IG9mIHRoZSBjb2xsZWN0aW9uIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Jcy5TdHJpbmdDb250YWluaW5nKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHN1Y2NlZWRzIGlmIHRoZSBhY3R1YWwNCisgICAgICAgICAgICB2YWx1ZSBjb250YWlucyB0aGUgc3Vic3RyaW5nIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Jcy5TdHJpbmdTdGFydGluZyhTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCBzdWNjZWVkcyBpZiB0aGUgYWN0dWFsDQorICAgICAgICAgICAgdmFsdWUgc3RhcnRzIHdpdGggdGhlIHN1YnN0cmluZyBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuSXMuU3RyaW5nRW5kaW5nKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHN1Y2NlZWRzIGlmIHRoZSBhY3R1YWwNCisgICAgICAgICAgICB2YWx1ZSBlbmRzIHdpdGggdGhlIHN1YnN0cmluZyBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuSXMuU3RyaW5nTWF0Y2hpbmcoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgc3VjY2VlZHMgaWYgdGhlIGFjdHVhbA0KKyAgICAgICAgICAgIHZhbHVlIG1hdGNoZXMgdGhlIFJlZ2V4IHBhdHRlcm4gc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklzLlNhbWVQYXRoKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIHBhdGggcHJvdmlkZWQgDQorICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgYW4gZXhwZWN0ZWQgcGF0aCBhZnRlciBjYW5vbmljYWxpemF0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Jcy5TdWJQYXRoKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIHBhdGggcHJvdmlkZWQgDQorICAgICAgICAgICAgaXMgdGhlIHNhbWUgcGF0aCBvciB1bmRlciBhbiBleHBlY3RlZCBwYXRoIGFmdGVyIGNhbm9uaWNhbGl6YXRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLklzLlNhbWVQYXRoT3JVbmRlcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBwYXRoIHByb3ZpZGVkIA0KKyAgICAgICAgICAgIGlzIHRoZSBzYW1lIHBhdGggb3IgdW5kZXIgYW4gZXhwZWN0ZWQgcGF0aCBhZnRlciBjYW5vbmljYWxpemF0aW9uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5Jcy5JblJhbmdlKFN5c3RlbS5JQ29tcGFyYWJsZSxTeXN0ZW0uSUNvbXBhcmFibGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIGFjdHVhbCB2YWx1ZSBmYWxscyANCisgICAgICAgICAgICB3aXRoaW4gYSBzcGVjaWZpZWQgcmFuZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLklzLk5vdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIENvbnN0cmFpbnRFeHByZXNzaW9uIHRoYXQgbmVnYXRlcyBhbnkNCisgICAgICAgICAgICBmb2xsb3dpbmcgY29uc3RyYWludC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuSXMuQWxsIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgQ29uc3RyYWludEV4cHJlc3Npb24sIHdoaWNoIHdpbGwgYXBwbHkNCisgICAgICAgICAgICB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnQgdG8gYWxsIG1lbWJlcnMgb2YgYSBjb2xsZWN0aW9uLA0KKyAgICAgICAgICAgIHN1Y2NlZWRpbmcgaWYgYWxsIG9mIHRoZW0gc3VjY2VlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuSXMuTnVsbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyBmb3IgbnVsbA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Jcy5UcnVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIGZvciBUcnVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLklzLkZhbHNlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIGZvciBGYWxzZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Jcy5OYU4iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgdGVzdHMgZm9yIE5hTg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Jcy5FbXB0eSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyBmb3IgZW1wdHkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuSXMuVW5pcXVlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgYSBjb2xsZWN0aW9uIA0KKyAgICAgICAgICAgIGNvbnRhaW5zIGFsbCB1bmlxdWUgaXRlbXMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLklzLkJpbmFyeVNlcmlhbGl6YWJsZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCB0ZXN0cyB3aGV0aGVyIGFuIG9iamVjdCBncmFwaCBpcyBzZXJpYWxpemFibGUgaW4gYmluYXJ5IGZvcm1hdC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuSXMuWG1sU2VyaWFsaXphYmxlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgYW4gb2JqZWN0IGdyYXBoIGlzIHNlcmlhbGl6YWJsZSBpbiB4bWwgZm9ybWF0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5Jcy5PcmRlcmVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHRlc3RzIHdoZXRoZXIgYSBjb2xsZWN0aW9uIGlzIG9yZGVyZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuSXoiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBJeiBjbGFzcyBpcyBhIHN5bm9ueW0gZm9yIElzIGludGVuZGVkIGZvciB1c2UgaW4gVkIsDQorICAgICAgICAgICAgd2hpY2ggcmVnYXJkcyBJcyBhcyBhIGtleXdvcmQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkxpc3QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBMaXN0IGNsYXNzIGlzIGEgaGVscGVyIGNsYXNzIHdpdGggcHJvcGVydGllcyBhbmQgbWV0aG9kcw0KKyAgICAgICAgICAgIHRoYXQgc3VwcGx5IGEgbnVtYmVyIG9mIGNvbnN0cmFpbnRzIHVzZWQgd2l0aCBsaXN0cyBhbmQgY29sbGVjdGlvbnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkxpc3QuTWFwKFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29sbGVjdGlvbikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIExpc3QuTWFwIHJldHVybnMgYSBMaXN0TWFwcGVyLCB3aGljaCBjYW4gYmUgdXNlZCB0byBtYXANCisgICAgICAgICAgICB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiB0byBhbm90aGVyIGNvbGxlY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLkxpc3RNYXBwZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIExpc3RNYXBwZXIgaXMgdXNlZCB0byB0cmFuc2Zvcm0gYSBjb2xsZWN0aW9uIHVzZWQgYXMgYW4gYWN0dWFsIGFyZ3VtZW50DQorICAgICAgICAgICAgcHJvZHVjaW5nIGFub3RoZXIgY29sbGVjdGlvbiB0byBiZSB1c2VkIGluIHRoZSBhc3NlcnRpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLkxpc3RNYXBwZXIuI2N0b3IoU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgTGlzdE1hcHBlciBiYXNlZCBvbiBhIGNvbGxlY3Rpb24NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im9yaWdpbmFsIj5UaGUgY29sbGVjdGlvbiB0byBiZSB0cmFuc2Zvcm1lZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuTGlzdE1hcHBlci5Qcm9wZXJ0eShTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUHJvZHVjZXMgYSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgYWxsIHRoZSB2YWx1ZXMgb2YgYSBwcm9wZXJ0eQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIGNvbGxlY3Rpb24gb2YgcHJvcGVydHkgdmFsdWVzPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuUmFuZG9taXplciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmFuZG9taXplciByZXR1cm5zIGEgc2V0IG9mIHJhbmRvbSB2YWx1ZXMgaW4gYSByZXBlYXRhYmxlDQorICAgICAgICAgICAgd2F5LCB0byBhbGxvdyByZS1ydW5uaW5nIG9mIHRlc3RzIGlmIG5lY2Vzc2FyeS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuUmFuZG9taXplci5HZXRSYW5kb21pemVyKFN5c3RlbS5SZWZsZWN0aW9uLk1lbWJlckluZm8pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXQgYSByYW5kb21pemVyIGZvciBhIHBhcnRpY3VsYXIgbWVtYmVyLCByZXR1cm5pbmcNCisgICAgICAgICAgICBvbmUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgaWYgaXQgZXhpc3RzLg0KKyAgICAgICAgICAgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBzYW1lIHZhbHVlcyBhcmUgZ2VuZXJhdGVkDQorICAgICAgICAgICAgZWFjaCB0aW1lIHRoZSB0ZXN0cyBhcmUgcmVsb2FkZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlJhbmRvbWl6ZXIuR2V0UmFuZG9taXplcihTeXN0ZW0uUmVmbGVjdGlvbi5QYXJhbWV0ZXJJbmZvKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IGEgcmFuZG9taXplciBmb3IgYSBwYXJ0aWN1bGFyIHBhcmFtZXRlciwgcmV0dXJuaW5nDQorICAgICAgICAgICAgb25lIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGlmIGl0IGV4aXN0cy4NCisgICAgICAgICAgICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgc2FtZSB2YWx1ZXMgYXJlIGdlbmVyYXRlZA0KKyAgICAgICAgICAgIGVhY2ggdGltZSB0aGUgdGVzdHMgYXJlIHJlbG9hZGVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5SYW5kb21pemVyLiNjdG9yIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSByYW5kb21pemVyIHVzaW5nIGEgcmFuZG9tIHNlZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuUmFuZG9taXplci4jY3RvcihTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3QgYSByYW5kb21pemVyIHVzaW5nIGEgc3BlY2lmaWVkIHNlZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuUmFuZG9taXplci5HZXREb3VibGVzKFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybiBhbiBhcnJheSBvZiByYW5kb20gZG91YmxlcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY291bnQiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlJhbmRvbWl6ZXIuR2V0RG91YmxlcyhTeXN0ZW0uRG91YmxlLFN5c3RlbS5Eb3VibGUsU3lzdGVtLkludDMyKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJuIGFuIGFycmF5IG9mIHJhbmRvbSBkb3VibGVzIHdpdGggdmFsdWVzIGluIGEgc3BlY2lmaWVkIHJhbmdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5SYW5kb21pemVyLkdldEludHMoU3lzdGVtLkludDMyLFN5c3RlbS5JbnQzMixTeXN0ZW0uSW50MzIpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm4gYW4gYXJyYXkgb2YgcmFuZG9tIGludHMgd2l0aCB2YWx1ZXMgaW4gYSBzcGVjaWZpZWQgcmFuZ2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlJhbmRvbWl6ZXIuUmFuZG9tU2VlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IGEgcmFuZG9tIHNlZWQgZm9yIHVzZSBpbiBjcmVhdGluZyBhIHJhbmRvbWl6ZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlNwZWNpYWxWYWx1ZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIFNwZWNpYWxWYWx1ZSBlbnVtIGlzIHVzZWQgdG8gcmVwcmVzZW50IFRlc3RDYXNlIGFyZ3VtZW50cw0KKyAgICAgICAgICAgIHRoYXQgY2Fubm90IGJlIHVzZWQgYXMgYXJndW1lbnRzIHRvIGFuIEF0dHJpYnV0ZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuU3BlY2lhbFZhbHVlLk51bGwiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE51bGwgcmVwcmVzZW50cyBhIG51bGwgdmFsdWUsIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGFuIA0KKyAgICAgICAgICAgIGFyZ3VtZW50IHRvIGFuIGF0dHJpdXRlIHVuZGVyIC5ORVQgMS54DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlN0cmluZ0Fzc2VydCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQmFzaWMgQXNzZXJ0cyBvbiBzdHJpbmdzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5TdHJpbmdBc3NlcnQuRXF1YWxzKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBFcXVhbHMgbWV0aG9kIHRocm93cyBhbiBBc3NlcnRpb25FeGNlcHRpb24uIFRoaXMgaXMgZG9uZSANCisgICAgICAgICAgICB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gbWlzdGFrZSBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJiIj48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlN0cmluZ0Fzc2VydC5SZWZlcmVuY2VFcXVhbHMoU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgUmVmZXJlbmNlRXF1YWxzIHRvIHRocm93IGFuIEFzc2VydGlvbkV4Y2VwdGlvbi4gVGhpcyANCisgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBtYWtlcyBzdXJlIHRoZXJlIGlzIG5vIG1pc3Rha2UgaW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uIA0KKyAgICAgICAgICAgIGFzIHBhcnQgb2YgQXNzZXJ0LiANCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImEiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImIiPjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuU3RyaW5nQXNzZXJ0LkNvbnRhaW5zKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhIHN0cmluZyBpcyBmb3VuZCB3aXRoaW4gYW5vdGhlciBzdHJpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHN0cmluZzwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHN0cmluZyB0byBiZSBleGFtaW5lZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuU3RyaW5nQXNzZXJ0LkNvbnRhaW5zKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGEgc3RyaW5nIGlzIGZvdW5kIHdpdGhpbiBhbm90aGVyIHN0cmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgc3RyaW5nPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgc3RyaW5nIHRvIGJlIGV4YW1pbmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlN0cmluZ0Fzc2VydC5Db250YWlucyhTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBzdHJpbmcgaXMgZm91bmQgd2l0aGluIGFub3RoZXIgc3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzdHJpbmcgdG8gYmUgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlN0cmluZ0Fzc2VydC5Eb2VzTm90Q29udGFpbihTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBzdHJpbmcgaXMgbm90IGZvdW5kIHdpdGhpbiBhbm90aGVyIHN0cmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgc3RyaW5nPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgc3RyaW5nIHRvIGJlIGV4YW1pbmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5Bcmd1bWVudHMgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5TdHJpbmdBc3NlcnQuRG9lc05vdENvbnRhaW4oU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBzdHJpbmcgaXMgZm91bmQgd2l0aGluIGFub3RoZXIgc3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzdHJpbmcgdG8gYmUgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuU3RyaW5nQXNzZXJ0LkRvZXNOb3RDb250YWluKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhIHN0cmluZyBpcyBmb3VuZCB3aXRoaW4gYW5vdGhlciBzdHJpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHN0cmluZzwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHN0cmluZyB0byBiZSBleGFtaW5lZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuU3RyaW5nQXNzZXJ0LlN0YXJ0c1dpdGgoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGEgc3RyaW5nIHN0YXJ0cyB3aXRoIGFub3RoZXIgc3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzdHJpbmcgdG8gYmUgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlN0cmluZ0Fzc2VydC5TdGFydHNXaXRoKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGEgc3RyaW5nIHN0YXJ0cyB3aXRoIGFub3RoZXIgc3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzdHJpbmcgdG8gYmUgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuU3RyaW5nQXNzZXJ0LlN0YXJ0c1dpdGgoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGEgc3RyaW5nIHN0YXJ0cyB3aXRoIGFub3RoZXIgc3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzdHJpbmcgdG8gYmUgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlN0cmluZ0Fzc2VydC5Eb2VzTm90U3RhcnRXaXRoKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhIHN0cmluZyBkb2VzIG5vdCBzdGFydCB3aXRoIGFub3RoZXIgc3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzdHJpbmcgdG8gYmUgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlN0cmluZ0Fzc2VydC5Eb2VzTm90U3RhcnRXaXRoKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGEgc3RyaW5nIGRvZXMgbm90IHN0YXJ0IHdpdGggYW5vdGhlciBzdHJpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHN0cmluZzwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHN0cmluZyB0byBiZSBleGFtaW5lZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5TdHJpbmdBc3NlcnQuRG9lc05vdFN0YXJ0V2l0aChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBzdHJpbmcgZG9lcyBub3Qgc3RhcnQgd2l0aCBhbm90aGVyIHN0cmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgc3RyaW5nPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgc3RyaW5nIHRvIGJlIGV4YW1pbmVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5TdHJpbmdBc3NlcnQuRW5kc1dpdGgoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGEgc3RyaW5nIGVuZHMgd2l0aCBhbm90aGVyIHN0cmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgc3RyaW5nPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgc3RyaW5nIHRvIGJlIGV4YW1pbmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5Bcmd1bWVudHMgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5TdHJpbmdBc3NlcnQuRW5kc1dpdGgoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBzdHJpbmcgZW5kcyB3aXRoIGFub3RoZXIgc3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzdHJpbmcgdG8gYmUgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuU3RyaW5nQXNzZXJ0LkVuZHNXaXRoKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhIHN0cmluZyBlbmRzIHdpdGggYW5vdGhlciBzdHJpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHN0cmluZzwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHN0cmluZyB0byBiZSBleGFtaW5lZDwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuU3RyaW5nQXNzZXJ0LkRvZXNOb3RFbmRXaXRoKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhIHN0cmluZyBkb2VzIG5vdCBlbmQgd2l0aCBhbm90aGVyIHN0cmluZy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgc3RyaW5nPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgc3RyaW5nIHRvIGJlIGV4YW1pbmVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5Bcmd1bWVudHMgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5TdHJpbmdBc3NlcnQuRG9lc05vdEVuZFdpdGgoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBzdHJpbmcgZG9lcyBub3QgZW5kIHdpdGggYW5vdGhlciBzdHJpbmcuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHN0cmluZzwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIHN0cmluZyB0byBiZSBleGFtaW5lZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5TdHJpbmdBc3NlcnQuRG9lc05vdEVuZFdpdGgoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGEgc3RyaW5nIGRvZXMgbm90IGVuZCB3aXRoIGFub3RoZXIgc3RyaW5nLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBzdHJpbmcgdG8gYmUgZXhhbWluZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlN0cmluZ0Fzc2VydC5BcmVFcXVhbElnbm9yaW5nQ2FzZShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgdHdvIHN0cmluZ3MgYXJlIGVxdWFsLCB3aXRob3V0IHJlZ2FyZCB0byBjYXNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgc3RyaW5nPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5Bcmd1bWVudHMgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5TdHJpbmdBc3NlcnQuQXJlRXF1YWxJZ25vcmluZ0Nhc2UoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgdHdvIHN0cmluZ3MgYXJlIGVxdWFsLCB3aXRob3V0IHJlZ2FyZCB0byBjYXNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgc3RyaW5nPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlN0cmluZ0Fzc2VydC5BcmVFcXVhbElnbm9yaW5nQ2FzZShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgdHdvIHN0cmluZ3MgYXJlIGVxdWFsLCB3aXRob3V0IHJlZ2FyZCB0byBjYXNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgc3RyaW5nPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5TdHJpbmdBc3NlcnQuQXJlTm90RXF1YWxJZ25vcmluZ0Nhc2UoU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IHR3byBzdHJpbmdzIGFyZSBub3QgZXF1YWwsIHdpdGhvdXQgcmVnYXJkIHRvIGNhc2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHN0cmluZzwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZ3MiPkFyZ3VtZW50cyB1c2VkIGluIGZvcm1hdHRpbmcgdGhlIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlN0cmluZ0Fzc2VydC5BcmVOb3RFcXVhbElnbm9yaW5nQ2FzZShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCB0d28gc3RyaW5ncyBhcmUgTm90ZXF1YWwsIHdpdGhvdXQgcmVnYXJkIHRvIGNhc2UuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHN0cmluZzwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuU3RyaW5nQXNzZXJ0LkFyZU5vdEVxdWFsSWdub3JpbmdDYXNlKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCB0d28gc3RyaW5ncyBhcmUgbm90IGVxdWFsLCB3aXRob3V0IHJlZ2FyZCB0byBjYXNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgc3RyaW5nPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5TdHJpbmdBc3NlcnQuSXNNYXRjaChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBzdHJpbmcgbWF0Y2hlcyBhbiBleHBlY3RlZCByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhdHRlcm4iPlRoZSByZWdleCBwYXR0ZXJuIHRvIGJlIG1hdGNoZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgc3RyaW5nPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5Bcmd1bWVudHMgdXNlZCBpbiBmb3JtYXR0aW5nIHRoZSBtZXNzYWdlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5TdHJpbmdBc3NlcnQuSXNNYXRjaChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhIHN0cmluZyBtYXRjaGVzIGFuIGV4cGVjdGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGF0dGVybiI+VGhlIHJlZ2V4IHBhdHRlcm4gdG8gYmUgbWF0Y2hlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBkaXNwbGF5IGluIGNhc2Ugb2YgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuU3RyaW5nQXNzZXJ0LklzTWF0Y2goU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGEgc3RyaW5nIG1hdGNoZXMgYW4gZXhwZWN0ZWQgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXR0ZXJuIj5UaGUgcmVnZXggcGF0dGVybiB0byBiZSBtYXRjaGVkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHN0cmluZzwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuU3RyaW5nQXNzZXJ0LkRvZXNOb3RNYXRjaChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uT2JqZWN0W10pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBc3NlcnRzIHRoYXQgYSBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggYW4gZXhwZWN0ZWQgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXR0ZXJuIj5UaGUgcmVnZXggcGF0dGVybiB0byBiZSB1c2VkPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHN0cmluZzwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gY2FzZSBvZiBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+QXJndW1lbnRzIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuU3RyaW5nQXNzZXJ0LkRvZXNOb3RNYXRjaChTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFzc2VydHMgdGhhdCBhIHN0cmluZyBkb2VzIG5vdCBtYXRjaCBhbiBleHBlY3RlZCByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhdHRlcm4iPlRoZSByZWdleCBwYXR0ZXJuIHRvIGJlIHVzZWQ8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgc3RyaW5nPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBjYXNlIG9mIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlN0cmluZ0Fzc2VydC5Eb2VzTm90TWF0Y2goU3lzdGVtLlN0cmluZyxTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQXNzZXJ0cyB0aGF0IGEgc3RyaW5nIGRvZXMgbm90IG1hdGNoIGFuIGV4cGVjdGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icGF0dGVybiI+VGhlIHJlZ2V4IHBhdHRlcm4gdG8gYmUgdXNlZDwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCBzdHJpbmc8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlRGF0YSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIFRlc3RDYXNlRGF0YSBjbGFzcyByZXByZXNlbnRzIGEgc2V0IG9mIGFyZ3VtZW50cw0KKyAgICAgICAgICAgIGFuZCBvdGhlciBwYXJhbWV0ZXIgaW5mbyB0byBiZSB1c2VkIGZvciBhIHBhcmFtZXRlcml6ZWQNCisgICAgICAgICAgICB0ZXN0IGNhc2UuIEl0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIGluc3RhbmNlIG1vZGlmaWVycw0KKyAgICAgICAgICAgIGZvciB1c2UgaW4gaW5pdGlhbGl6aW5nIHRoZSB0ZXN0IGNhc2UuDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgTm90ZTogSW5zdGFuY2UgbW9kaWZpZXJzIGFyZSBnZXR0ZXJzIHRoYXQgcmV0dXJuDQorICAgICAgICAgICAgdGhlIHNhbWUgaW5zdGFuY2UgYWZ0ZXIgbW9kaWZ5aW5nIGl0J3Mgc3RhdGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlRGF0YS5hcmd1bWVudHMiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBhcmd1bWVudCBsaXN0IHRvIGJlIHByb3ZpZGVkIHRvIHRoZSB0ZXN0DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlRGF0YS5yZXN1bHQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBleHBlY3RlZCByZXN1bHQgdG8gYmUgcmV0dXJuZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VEYXRhLmV4cGVjdGVkRXhjZXB0aW9uVHlwZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgIFRoZSBleHBlY3RlZCBleGNlcHRpb24gVHlwZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZURhdGEuZXhwZWN0ZWRFeGNlcHRpb25OYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgRnVsbE5hbWUgb2YgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZURhdGEudGVzdE5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBuYW1lIHRvIGJlIHVzZWQgZm9yIHRoZSB0ZXN0DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlRGF0YS5kZXNjcmlwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlRGF0YS5wcm9wZXJ0aWVzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBIGRpY3Rpb25hcnkgb2YgcHJvcGVydGllcywgdXNlZCB0byBhZGQgaW5mb3JtYXRpb24NCisgICAgICAgICAgICB0byB0ZXN0cyB3aXRob3V0IHJlcXVpcmluZyB0aGUgY2xhc3MgdG8gY2hhbmdlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZURhdGEuaXNJZ25vcmVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJZiB0cnVlLCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGVzdCBjYXNlIGlzIHRvIGJlIGlnbm9yZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VEYXRhLmlnbm9yZVJlYXNvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgaWdub3JpbmcgYSB0ZXN0IGNhc2UNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VEYXRhLiNjdG9yKFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlQ6VGVzdENhc2VEYXRhIi8+IGNsYXNzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+VGhlIGFyZ3VtZW50cy48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlRGF0YS4jY3RvcihTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVDpUZXN0Q2FzZURhdGEiLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmciPlRoZSBhcmd1bWVudC48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlRGF0YS4jY3RvcihTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUOlRlc3RDYXNlRGF0YSIvPiBjbGFzcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFyZzEiPlRoZSBmaXJzdCBhcmd1bWVudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcyIj5UaGUgc2Vjb25kIGFyZ3VtZW50LjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VEYXRhLiNjdG9yKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCxTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVDpUZXN0Q2FzZURhdGEiLz4gY2xhc3MuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmcxIj5UaGUgZmlyc3QgYXJndW1lbnQuPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJnMiI+VGhlIHNlY29uZCBhcmd1bWVudC48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmczIj5UaGUgdGhpcmQgYXJndW1lbnQuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZURhdGEuUmV0dXJucyhTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0cyB0aGUgZXhwZWN0ZWQgcmVzdWx0IGZvciB0aGUgdGVzdA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icmVzdWx0Ij5UaGUgZXhwZWN0ZWQgcmVzdWx0PC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5BIG1vZGlmaWVkIFRlc3RDYXNlRGF0YTwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZURhdGEuVGhyb3dzKFN5c3RlbS5UeXBlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0cyB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUgZm9yIHRoZSB0ZXN0DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleGNlcHRpb25UeXBlIj5UeXBlIG9mIHRoZSBleHBlY3RlZCBleGNlcHRpb24uPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgbW9kaWZpZWQgVGVzdENhc2VEYXRhIGluc3RhbmNlPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlRGF0YS5UaHJvd3MoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNldHMgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiB0eXBlIGZvciB0aGUgdGVzdA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhjZXB0aW9uTmFtZSI+RnVsbE5hbWUgb2YgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbi48L3BhcmFtPg0KKyAgICAgICAgICAgIDxyZXR1cm5zPlRoZSBtb2RpZmllZCBUZXN0Q2FzZURhdGEgaW5zdGFuY2U8L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VEYXRhLlNldE5hbWUoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFNldHMgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQ0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgbW9kaWZpZWQgVGVzdENhc2VEYXRhIGluc3RhbmNlPC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlRGF0YS5TZXREZXNjcmlwdGlvbihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgU2V0cyB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSB0ZXN0IGNhc2UNCisgICAgICAgICAgICBiZWluZyBjb25zdHJ1Y3RlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIj5UaGUgZGVzY3JpcHRpb24uPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz5UaGUgbW9kaWZpZWQgVGVzdENhc2VEYXRhIGluc3RhbmNlLjwvcmV0dXJucz4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZURhdGEuU2V0Q2F0ZWdvcnkoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGxpZXMgYSBjYXRlZ29yeSB0byB0aGUgdGVzdA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2F0ZWdvcnkiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlRGF0YS5TZXRQcm9wZXJ0eShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBBcHBsaWVzIGEgbmFtZWQgcHJvcGVydHkgdG8gdGhlIHRlc3QNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InByb3BOYW1lIj48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwcm9wVmFsdWUiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRlc3RDYXNlRGF0YS5TZXRQcm9wZXJ0eShTeXN0ZW0uU3RyaW5nLFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGxpZXMgYSBuYW1lZCBwcm9wZXJ0eSB0byB0aGUgdGVzdA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icHJvcE5hbWUiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InByb3BWYWx1ZSI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VEYXRhLlNldFByb3BlcnR5KFN5c3RlbS5TdHJpbmcsU3lzdGVtLkRvdWJsZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEFwcGxpZXMgYSBuYW1lZCBwcm9wZXJ0eSB0byB0aGUgdGVzdA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icHJvcE5hbWUiPjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InByb3BWYWx1ZSI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VEYXRhLklnbm9yZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWdub3JlcyB0aGlzIFRlc3RDYXNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VEYXRhLklnbm9yZShTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgSWdub3JlcyB0aGlzIFRlc3RDYXNlLCBzcGVjaWZ5aW5nIHRoZSByZWFzb24uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyZWFzb24iPlRoZSByZWFzb24uPC9wYXJhbT4NCisgICAgICAgICAgICA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VEYXRhLkFyZ3VtZW50cyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgYXJndW1lbnQgbGlzdCB0byBiZSBwcm92aWRlZCB0byB0aGUgdGVzdA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZURhdGEuUmVzdWx0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBleHBlY3RlZCByZXN1bHQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VEYXRhLkV4cGVjdGVkRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICAgR2V0cyB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uIFR5cGUNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VEYXRhLkV4cGVjdGVkRXhjZXB0aW9uTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgRnVsbE5hbWUgb2YgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZURhdGEuVGVzdE5hbWUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgdGhlIG5hbWUgdG8gYmUgdXNlZCBmb3IgdGhlIHRlc3QNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdENhc2VEYXRhLkRlc2NyaXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGVzdA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZURhdGEuSWdub3JlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGlzIDxzZWUgY3JlZj0iVDpOVW5pdC5GcmFtZXdvcmsuSVRlc3RDYXNlRGF0YSIvPiBpcyBpZ25vcmVkLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+PGM+dHJ1ZTwvYz4gaWYgaWdub3JlZDsgb3RoZXJ3aXNlLCA8Yz5mYWxzZTwvYz4uPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZURhdGEuSWdub3JlUmVhc29uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBHZXRzIHRoZSBpZ25vcmUgcmVhc29uLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8dmFsdWU+VGhlIGlnbm9yZSByZWFzb24uPC92YWx1ZT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZURhdGEuQ2F0ZWdvcmllcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIGxpc3Qgb2YgY2F0ZWdvcmllcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UZXN0Q2FzZURhdGEuUHJvcGVydGllcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgcHJvcGVydHkgZGljdGlvbmFyeSBmb3IgdGhpcyB0ZXN0DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlRlc3RDb250ZXh0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcm92aWRlIHRoZSBjb250ZXh0IGluZm9ybWF0aW9uIG9mIHRoZSBjdXJyZW50IHRlc3QNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGVzdENvbnRleHQuI2N0b3IoU3lzdGVtLkNvbGxlY3Rpb25zLklEaWN0aW9uYXJ5KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0cyBhIFRlc3RDb250ZXh0IHVzaW5nIHRoZSBwcm92aWRlZCBjb250ZXh0IGRpY3Rpb25hcnkNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbnRleHQiPkEgY29udGV4dCBkaWN0aW9uYXJ5PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UZXN0Q29udGV4dC5DdXJyZW50Q29udGV4dCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0IHRoZSBjdXJyZW50IHRlc3QgY29udGV4dC4gVGhpcyBpcyBjcmVhdGVkDQorICAgICAgICAgICAgYXMgbmVlZGVkLiBUaGUgdXNlciBtYXkgc2F2ZSB0aGUgY29udGV4dCBmb3INCisgICAgICAgICAgICB1c2Ugd2l0aGluIGEgdGVzdCwgYnV0IGl0IHNob3VsZCBub3QgYmUgdXNlZA0KKyAgICAgICAgICAgIG91dHNpZGUgdGhlIHRlc3QgZm9yIHdoaWNoIGl0IGlzIGNyZWF0ZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RDb250ZXh0LlRlc3QiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgYSBUZXN0QWRhcHRlciByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGVzdCBpbiB0aGlzIGNvbnRleHQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RDb250ZXh0LlJlc3VsdCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyBhIFJlc3VsdEFkYXB0ZXIgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHJlc3VsdCBmb3IgdGhlIHRlc3QgDQorICAgICAgICAgICAgZXhlY3V0aW5nIGluIHRoaXMgY29udGV4dC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdENvbnRleHQuVGVzdERpcmVjdG9yeSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgR2V0cyB0aGUgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoaXMgVGVzdENvbnRleHQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuVGVzdENvbnRleHQuVGVzdEFkYXB0ZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRlc3RBZGFwdGVyIGFkYXB0cyBhIFRlc3QgZm9yIGNvbnN1bXB0aW9uIGJ5DQorICAgICAgICAgICAgdGhlIHVzZXIgdGVzdCBjb2RlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXN0Q29udGV4dC5UZXN0QWRhcHRlci4jY3RvcihTeXN0ZW0uQ29sbGVjdGlvbnMuSURpY3Rpb25hcnkpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDb25zdHJ1Y3RzIGEgVGVzdEFkYXB0ZXIgZm9yIHRoaXMgY29udGV4dA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29udGV4dCI+VGhlIGNvbnRleHQgZGljdGlvbmFyeTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdENvbnRleHQuVGVzdEFkYXB0ZXIuTmFtZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHRlc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RDb250ZXh0LlRlc3RBZGFwdGVyLkZ1bGxOYW1lIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgRnVsbE5hbWUgb2YgdGhlIHRlc3QNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGVzdENvbnRleHQuVGVzdEFkYXB0ZXIuUHJvcGVydGllcyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHByb3BlcnRpZXMgb2YgdGhlIHRlc3QuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlRlc3RDb250ZXh0LlJlc3VsdEFkYXB0ZXIiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJlc3VsdEFkYXB0ZXIgYWRhcHRzIGEgVGVzdFJlc3VsdCBmb3IgY29uc3VtcHRpb24gYnkNCisgICAgICAgICAgICB0aGUgdXNlciB0ZXN0IGNvZGUuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRlc3RDb250ZXh0LlJlc3VsdEFkYXB0ZXIuI2N0b3IoU3lzdGVtLkNvbGxlY3Rpb25zLklEaWN0aW9uYXJ5KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgUmVzdWx0QWRhcHRlciBmb3IgYSBjb250ZXh0DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb250ZXh0Ij5UaGUgY29udGV4dCBob2xkaW5nIHRoZSByZXN1bHQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRlc3RDb250ZXh0LlJlc3VsdEFkYXB0ZXIuU3RhdGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBUZXN0U3RhdGUgb2YgY3VycmVudCB0ZXN0LiBUaGlzIG1hcHMgdG8gdGhlIFJlc3VsdFN0YXRlDQorICAgICAgICAgICAgdXNlZCBpbiBudW5pdC5jb3JlIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZSBpbiB0aGUgZnV0dXJlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UZXN0Q29udGV4dC5SZXN1bHRBZGFwdGVyLlN0YXR1cyI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIFRlc3RTdGF0dXMgb2YgY3VycmVudCB0ZXN0LiBUaGlzIGVudW0gd2lsbCBiZSB1c2VkDQorICAgICAgICAgICAgaW4gZnV0dXJlIHZlcnNpb25zIG9mIE5Vbml0IGFuZCBzbyBpcyB0byBiZSBwcmVmZXJyZWQNCisgICAgICAgICAgICB0byB0aGUgVGVzdFN0YXRlIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5UZXN0U3RhdGUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSBSZXN1bHRTdGF0ZSBlbnVtIGluZGljYXRlcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgYSB0ZXN0DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLlRlc3RTdGF0ZS5JbmNvbmNsdXNpdmUiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSByZXN1bHQgaXMgaW5jb25jbHVzaXZlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLlRlc3RTdGF0ZS5Ob3RSdW5uYWJsZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3Qgd2FzIG5vdCBydW5uYWJsZS4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuVGVzdFN0YXRlLlNraXBwZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB0ZXN0IGhhcyBiZWVuIHNraXBwZWQuIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5UZXN0U3RhdGUuSWdub3JlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3QgaGFzIGJlZW4gaWdub3JlZC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuVGVzdFN0YXRlLlN1Y2Nlc3MiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB0ZXN0IHN1Y2NlZWRlZA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJGOk5Vbml0LkZyYW1ld29yay5UZXN0U3RhdGUuRmFpbHVyZSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3QgZmFpbGVkDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLlRlc3RTdGF0ZS5FcnJvciI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3QgZW5jb3VudGVyZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuVGVzdFN0YXRlLkNhbmNlbGxlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3Qgd2FzIGNhbmNlbGxlZCBieSB0aGUgdXNlcg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5UZXN0U3RhdHVzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgVGVzdFN0YXR1cyBlbnVtIGluZGljYXRlcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgYSB0ZXN0DQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLlRlc3RTdGF0dXMuSW5jb25jbHVzaXZlIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdGVzdCB3YXMgaW5jb25jbHVzaXZlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLlRlc3RTdGF0dXMuU2tpcHBlZCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgVGhlIHRlc3QgaGFzIHNraXBwZWQgDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLlRlc3RTdGF0dXMuUGFzc2VkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUaGUgdGVzdCBzdWNjZWVkZWQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuVGVzdFN0YXR1cy5GYWlsZWQiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFRoZSB0ZXN0IGZhaWxlZA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJUOk5Vbml0LkZyYW1ld29yay5UZXh0Ij4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIZWxwZXIgY2xhc3Mgd2l0aCBzdGF0aWMgbWV0aG9kcyB1c2VkIHRvIHN1cHBseSBjb25zdHJhaW50cw0KKyAgICAgICAgICAgIHRoYXQgb3BlcmF0ZSBvbiBzdHJpbmdzLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXh0LkNvbnRhaW5zKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IHN1Y2NlZWRzIGlmIHRoZSBhY3R1YWwNCisgICAgICAgICAgICB2YWx1ZSBjb250YWlucyB0aGUgc3Vic3RyaW5nIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXh0LkRvZXNOb3RDb250YWluKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IGZhaWxzIGlmIHRoZSBhY3R1YWwNCisgICAgICAgICAgICB2YWx1ZSBjb250YWlucyB0aGUgc3Vic3RyaW5nIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXh0LlN0YXJ0c1dpdGgoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgc3VjY2VlZHMgaWYgdGhlIGFjdHVhbA0KKyAgICAgICAgICAgIHZhbHVlIHN0YXJ0cyB3aXRoIHRoZSBzdWJzdHJpbmcgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRleHQuRG9lc05vdFN0YXJ0V2l0aChTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCBmYWlscyBpZiB0aGUgYWN0dWFsDQorICAgICAgICAgICAgdmFsdWUgc3RhcnRzIHdpdGggdGhlIHN1YnN0cmluZyBzdXBwbGllZCBhcyBhbiBhcmd1bWVudC4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGV4dC5FbmRzV2l0aChTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIGNvbnN0cmFpbnQgdGhhdCBzdWNjZWVkcyBpZiB0aGUgYWN0dWFsDQorICAgICAgICAgICAgdmFsdWUgZW5kcyB3aXRoIHRoZSBzdWJzdHJpbmcgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRleHQuRG9lc05vdEVuZFdpdGgoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgZmFpbHMgaWYgdGhlIGFjdHVhbA0KKyAgICAgICAgICAgIHZhbHVlIGVuZHMgd2l0aCB0aGUgc3Vic3RyaW5nIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXh0Lk1hdGNoZXMoU3lzdGVtLlN0cmluZykiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFJldHVybnMgYSBjb25zdHJhaW50IHRoYXQgc3VjY2VlZHMgaWYgdGhlIGFjdHVhbA0KKyAgICAgICAgICAgIHZhbHVlIG1hdGNoZXMgdGhlIFJlZ2V4IHBhdHRlcm4gc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRleHQuRG9lc05vdE1hdGNoKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBSZXR1cm5zIGEgY29uc3RyYWludCB0aGF0IGZhaWxzIGlmIHRoZSBhY3R1YWwNCisgICAgICAgICAgICB2YWx1ZSBtYXRjaGVzIHRoZSBwYXR0ZXJuIHN1cHBsaWVkIGFzIGFuIGFyZ3VtZW50Lg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UZXh0LkFsbCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgUmV0dXJucyBhIENvbnN0cmFpbnRFeHByZXNzaW9uLCB3aGljaCB3aWxsIGFwcGx5DQorICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBjb25zdHJhaW50IHRvIGFsbCBtZW1iZXJzIG9mIGEgY29sbGVjdGlvbiwNCisgICAgICAgICAgICBzdWNjZWVkaW5nIGlmIGFsbCBvZiB0aGVtIHN1Y2NlZWQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlQ6TlVuaXQuRnJhbWV3b3JrLlRleHRNZXNzYWdlV3JpdGVyIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBUZXh0TWVzc2FnZVdyaXRlciB3cml0ZXMgY29uc3RyYWludCBkZXNjcmlwdGlvbnMgYW5kIG1lc3NhZ2VzDQorICAgICAgICAgICAgaW4gZGlzcGxheWFibGUgZm9ybSBhcyBhIHRleHQgc3RyZWFtLiBJdCB0YWlsb3JzIHRoZSBkaXNwbGF5DQorICAgICAgICAgICAgb2YgaW5kaXZpZHVhbCBtZXNzYWdlIGNvbXBvbmVudHMgdG8gZm9ybSB0aGUgc3RhbmRhcmQgbWVzc2FnZQ0KKyAgICAgICAgICAgIGZvcm1hdCBvZiBOVW5pdCBhc3NlcnRpb24gZmFpbHVyZSBtZXNzYWdlcy4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iRjpOVW5pdC5GcmFtZXdvcmsuVGV4dE1lc3NhZ2VXcml0ZXIuUGZ4X0V4cGVjdGVkIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBQcmVmaXggdXNlZCBmb3IgdGhlIGV4cGVjdGVkIHZhbHVlIGxpbmUgb2YgYSBtZXNzYWdlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLlRleHRNZXNzYWdlV3JpdGVyLlBmeF9BY3R1YWwiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFByZWZpeCB1c2VkIGZvciB0aGUgYWN0dWFsIHZhbHVlIGxpbmUgb2YgYSBtZXNzYWdlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IkY6TlVuaXQuRnJhbWV3b3JrLlRleHRNZXNzYWdlV3JpdGVyLlByZWZpeExlbmd0aCI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgTGVuZ3RoIG9mIGEgbWVzc2FnZSBwcmVmaXgNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGV4dE1lc3NhZ2VXcml0ZXIuI2N0b3IiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENvbnN0cnVjdCBhIFRleHRNZXNzYWdlV3JpdGVyDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRleHRNZXNzYWdlV3JpdGVyLiNjdG9yKFN5c3RlbS5TdHJpbmcsU3lzdGVtLk9iamVjdFtdKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ29uc3RydWN0IGEgVGV4dE1lc3NhZ2VXcml0ZXIsIHNwZWNpZnlpbmcgYSB1c2VyIG1lc3NhZ2UNCisgICAgICAgICAgICBhbmQgb3B0aW9uYWwgZm9ybWF0dGluZyBhcmd1bWVudHMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ1c2VyTWVzc2FnZSI+PC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYXJncyI+PC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXh0TWVzc2FnZVdyaXRlci5Xcml0ZU1lc3NhZ2VMaW5lKFN5c3RlbS5JbnQzMixTeXN0ZW0uU3RyaW5nLFN5c3RlbS5PYmplY3RbXSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIE1ldGhvZCB0byB3cml0ZSBzaW5nbGUgbGluZSAgbWVzc2FnZSB3aXRoIG9wdGlvbmFsIGFyZ3MsIHVzdWFsbHkNCisgICAgICAgICAgICB3cml0dGVuIHRvIHByZWNlZGUgdGhlIGdlbmVyYWwgZmFpbHVyZSBtZXNzYWdlLCBhdCBhIGdpdmVsIA0KKyAgICAgICAgICAgIGluZGVudGF0aW9uIGxldmVsLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibGV2ZWwiPlRoZSBpbmRlbnRhdGlvbiBsZXZlbCBvZiB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGJlIHdyaXR0ZW48L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhcmdzIj5BbnkgYXJndW1lbnRzIHVzZWQgaW4gZm9ybWF0dGluZyB0aGUgbWVzc2FnZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGV4dE1lc3NhZ2VXcml0ZXIuRGlzcGxheURpZmZlcmVuY2VzKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGlzcGxheSBFeHBlY3RlZCBhbmQgQWN0dWFsIGxpbmVzIGZvciBhIGNvbnN0cmFpbnQuIFRoaXMNCisgICAgICAgICAgICBpcyBjYWxsZWQgYnkgTWVzc2FnZVdyaXRlcidzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgDQorICAgICAgICAgICAgV3JpdGVNZXNzYWdlVG8gYW5kIHByb3ZpZGVzIHRoZSBnZW5lcmljIHR3by1saW5lIGRpc3BsYXkuIA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29uc3RyYWludCI+VGhlIGNvbnN0cmFpbnQgdGhhdCBmYWlsZWQ8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRleHRNZXNzYWdlV3JpdGVyLkRpc3BsYXlEaWZmZXJlbmNlcyhTeXN0ZW0uT2JqZWN0LFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEaXNwbGF5IEV4cGVjdGVkIGFuZCBBY3R1YWwgbGluZXMgZm9yIGdpdmVuIHZhbHVlcy4gVGhpcw0KKyAgICAgICAgICAgIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGJ5IGNvbnN0cmFpbnRzIHRoYXQgbmVlZCBtb3JlIGNvbnRyb2wgb3Zlcg0KKyAgICAgICAgICAgIHRoZSBkaXNwbGF5IG9mIGFjdHVhbCBhbmQgZXhwZWN0ZWQgdmFsdWVzIHRoYW4gaXMgcHJvdmlkZWQNCisgICAgICAgICAgICBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4cGVjdGVkIj5UaGUgZXhwZWN0ZWQgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWUgY2F1c2luZyB0aGUgZmFpbHVyZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGV4dE1lc3NhZ2VXcml0ZXIuRGlzcGxheURpZmZlcmVuY2VzKFN5c3RlbS5PYmplY3QsU3lzdGVtLk9iamVjdCxOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVG9sZXJhbmNlKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgRGlzcGxheSBFeHBlY3RlZCBhbmQgQWN0dWFsIGxpbmVzIGZvciBnaXZlbiB2YWx1ZXMsIGluY2x1ZGluZw0KKyAgICAgICAgICAgIGEgdG9sZXJhbmNlIHZhbHVlIG9uIHRoZSBleHBlY3RlZCBsaW5lLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCB2YWx1ZSBjYXVzaW5nIHRoZSBmYWlsdXJlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idG9sZXJhbmNlIj5UaGUgdG9sZXJhbmNlIHdpdGhpbiB3aGljaCB0aGUgdGVzdCB3YXMgbWFkZTwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGV4dE1lc3NhZ2VXcml0ZXIuRGlzcGxheVN0cmluZ0RpZmZlcmVuY2VzKFN5c3RlbS5TdHJpbmcsU3lzdGVtLlN0cmluZyxTeXN0ZW0uSW50MzIsU3lzdGVtLkJvb2xlYW4sU3lzdGVtLkJvb2xlYW4pIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBEaXNwbGF5IHRoZSBleHBlY3RlZCBhbmQgYWN0dWFsIHN0cmluZyB2YWx1ZXMgb24gc2VwYXJhdGUgbGluZXMuDQorICAgICAgICAgICAgSWYgdGhlIG1pc21hdGNoIHBhcmFtZXRlciBpcyA+PTAsIGFuIGFkZGl0aW9uYWwgbGluZSBpcyBkaXNwbGF5ZWQNCisgICAgICAgICAgICBsaW5lIGNvbnRhaW5pbmcgYSBjYXJldCB0aGF0IHBvaW50cyB0byB0aGUgbWlzbWF0Y2ggcG9pbnQuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHN0cmluZyB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFjdHVhbCI+VGhlIGFjdHVhbCBzdHJpbmcgdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtaXNtYXRjaCI+VGhlIHBvaW50IGF0IHdoaWNoIHRoZSBzdHJpbmdzIGRvbid0IG1hdGNoIG9yIC0xPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iaWdub3JlQ2FzZSI+SWYgdHJ1ZSwgY2FzZSBpcyBpZ25vcmVkIGluIHN0cmluZyBjb21wYXJpc29uczwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNsaXBwaW5nIj5JZiB0cnVlLCBjbGlwIHRoZSBzdHJpbmdzIHRvIGZpdCB0aGUgbWF4IGxpbmUgbGVuZ3RoPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXh0TWVzc2FnZVdyaXRlci5Xcml0ZUNvbm5lY3RvcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGVzIHRoZSB0ZXh0IGZvciBhIGNvbm5lY3Rvci4NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbm5lY3RvciI+VGhlIGNvbm5lY3Rvci48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRleHRNZXNzYWdlV3JpdGVyLldyaXRlUHJlZGljYXRlKFN5c3RlbS5TdHJpbmcpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZXMgdGhlIHRleHQgZm9yIGEgcHJlZGljYXRlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icHJlZGljYXRlIj5UaGUgcHJlZGljYXRlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGV4dE1lc3NhZ2VXcml0ZXIuV3JpdGVNb2RpZmllcihTeXN0ZW0uU3RyaW5nKSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIHRleHQgZm9yIGEgbW9kaWZpZXIuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtb2RpZmllciI+VGhlIG1vZGlmaWVyLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGV4dE1lc3NhZ2VXcml0ZXIuV3JpdGVFeHBlY3RlZFZhbHVlKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZXMgdGhlIHRleHQgZm9yIGFuIGV4cGVjdGVkIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZS48L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRleHRNZXNzYWdlV3JpdGVyLldyaXRlQWN0dWFsVmFsdWUoU3lzdGVtLk9iamVjdCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlcyB0aGUgdGV4dCBmb3IgYW4gYWN0dWFsIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWN0dWFsIj5UaGUgYWN0dWFsIHZhbHVlLjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGV4dE1lc3NhZ2VXcml0ZXIuV3JpdGVWYWx1ZShTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGVzIHRoZSB0ZXh0IGZvciBhIGdlbmVyYWxpemVkIHZhbHVlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0idmFsIj5UaGUgdmFsdWUuPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXh0TWVzc2FnZVdyaXRlci5Xcml0ZUNvbGxlY3Rpb25FbGVtZW50cyhTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb24sU3lzdGVtLkludDMyLFN5c3RlbS5JbnQzMikiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlcyB0aGUgdGV4dCBmb3IgYSBjb2xsZWN0aW9uIHZhbHVlLA0KKyAgICAgICAgICAgIHN0YXJ0aW5nIGF0IGEgcGFydGljdWxhciBwb2ludCwgdG8gYSBtYXggbGVuZ3RoDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5UaGUgY29sbGVjdGlvbiBjb250YWluaW5nIGVsZW1lbnRzIHRvIHdyaXRlLjwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN0YXJ0Ij5UaGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGVsZW1lbnRzIHRvIHdyaXRlPC9wYXJhbT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ibWF4Ij5UaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gd3JpdGU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRleHRNZXNzYWdlV3JpdGVyLldyaXRlRXhwZWN0ZWRMaW5lKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db25zdHJhaW50KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGdlbmVyaWMgJ0V4cGVjdGVkJyBsaW5lIGZvciBhIGNvbnN0cmFpbnQNCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbnN0cmFpbnQiPlRoZSBjb25zdHJhaW50IHRoYXQgZmFpbGVkPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXh0TWVzc2FnZVdyaXRlci5Xcml0ZUV4cGVjdGVkTGluZShTeXN0ZW0uT2JqZWN0KSI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgV3JpdGUgdGhlIGdlbmVyaWMgJ0V4cGVjdGVkJyBsaW5lIGZvciBhIGdpdmVuIHZhbHVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJleHBlY3RlZCI+VGhlIGV4cGVjdGVkIHZhbHVlPC9wYXJhbT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UZXh0TWVzc2FnZVdyaXRlci5Xcml0ZUV4cGVjdGVkTGluZShTeXN0ZW0uT2JqZWN0LE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ub2xlcmFuY2UpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSB0aGUgZ2VuZXJpYyAnRXhwZWN0ZWQnIGxpbmUgZm9yIGEgZ2l2ZW4gdmFsdWUNCisgICAgICAgICAgICBhbmQgdG9sZXJhbmNlLg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZXhwZWN0ZWQiPlRoZSBleHBlY3RlZCB2YWx1ZTwvcGFyYW0+DQorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRvbGVyYW5jZSI+VGhlIHRvbGVyYW5jZSB3aXRoaW4gd2hpY2ggdGhlIHRlc3Qgd2FzIG1hZGU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRleHRNZXNzYWdlV3JpdGVyLldyaXRlQWN0dWFsTGluZShOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29uc3RyYWludCkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIFdyaXRlIHRoZSBnZW5lcmljICdBY3R1YWwnIGxpbmUgZm9yIGEgY29uc3RyYWludA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29uc3RyYWludCI+VGhlIGNvbnN0cmFpbnQgZm9yIHdoaWNoIHRoZSBhY3R1YWwgdmFsdWUgaXMgdG8gYmUgd3JpdHRlbjwvcGFyYW0+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iTTpOVW5pdC5GcmFtZXdvcmsuVGV4dE1lc3NhZ2VXcml0ZXIuV3JpdGVBY3R1YWxMaW5lKFN5c3RlbS5PYmplY3QpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBXcml0ZSB0aGUgZ2VuZXJpYyAnQWN0dWFsJyBsaW5lIGZvciBhIGdpdmVuIHZhbHVlDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhY3R1YWwiPlRoZSBhY3R1YWwgdmFsdWUgY2F1c2luZyBhIGZhaWx1cmU8L3BhcmFtPg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRleHRNZXNzYWdlV3JpdGVyLk1heExpbmVMZW5ndGgiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIEdldHMgb3Igc2V0cyB0aGUgbWF4aW11bSBsaW5lIGxlbmd0aCBmb3IgdGhpcyB3cml0ZXINCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iVDpOVW5pdC5GcmFtZXdvcmsuVGhyb3dzIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBIZWxwZXIgY2xhc3Mgd2l0aCBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIHRoYXQgc3VwcGx5DQorICAgICAgICAgICAgY29uc3RyYWludHMgdGhhdCBvcGVyYXRlIG9uIGV4Y2VwdGlvbnMuDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRocm93cy5UeXBlT2YoU3lzdGVtLlR5cGUpIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGVzIGEgY29uc3RyYWludCBzcGVjaWZ5aW5nIHRoZSBleGFjdCB0eXBlIG9mIGV4Y2VwdGlvbiBleHBlY3RlZA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UaHJvd3MuVHlwZU9mYGAxIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGVzIGEgY29uc3RyYWludCBzcGVjaWZ5aW5nIHRoZSBleGFjdCB0eXBlIG9mIGV4Y2VwdGlvbiBleHBlY3RlZA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJNOk5Vbml0LkZyYW1ld29yay5UaHJvd3MuSW5zdGFuY2VPZihTeXN0ZW0uVHlwZSkiPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBjb25zdHJhaW50IHNwZWNpZnlpbmcgdGhlIHR5cGUgb2YgZXhjZXB0aW9uIGV4cGVjdGVkDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9Ik06TlVuaXQuRnJhbWV3b3JrLlRocm93cy5JbnN0YW5jZU9mYGAxIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGVzIGEgY29uc3RyYWludCBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIGV4Y2VwdGlvbiBleHBlY3RlZA0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UaHJvd3MuRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGVzIGEgY29uc3RyYWludCBzcGVjaWZ5aW5nIGFuIGV4cGVjdGVkIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UaHJvd3MuSW5uZXJFeGNlcHRpb24iPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBjb25zdHJhaW50IHNwZWNpZnlpbmcgYW4gZXhjZXB0aW9uIHdpdGggYSBnaXZlbiBJbm5lckV4Y2VwdGlvbg0KKyAgICAgICAgICAgIDwvc3VtbWFyeT4NCisgICAgICAgIDwvbWVtYmVyPg0KKyAgICAgICAgPG1lbWJlciBuYW1lPSJQOk5Vbml0LkZyYW1ld29yay5UaHJvd3MuVGFyZ2V0SW52b2NhdGlvbkV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyBhIGNvbnN0cmFpbnQgc3BlY2lmeWluZyBhbiBleHBlY3RlZCBUYXJnZXRJbnZvY2F0aW9uRXhjZXB0aW9uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRocm93cy5Bcmd1bWVudEV4Y2VwdGlvbiI+DQorICAgICAgICAgICAgPHN1bW1hcnk+DQorICAgICAgICAgICAgQ3JlYXRlcyBhIGNvbnN0cmFpbnQgc3BlY2lmeWluZyBhbiBleHBlY3RlZCBUYXJnZXRJbnZvY2F0aW9uRXhjZXB0aW9uDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgICAgICA8bWVtYmVyIG5hbWU9IlA6TlVuaXQuRnJhbWV3b3JrLlRocm93cy5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8c3VtbWFyeT4NCisgICAgICAgICAgICBDcmVhdGVzIGEgY29uc3RyYWludCBzcGVjaWZ5aW5nIGFuIGV4cGVjdGVkIFRhcmdldEludm9jYXRpb25FeGNlcHRpb24NCisgICAgICAgICAgICA8L3N1bW1hcnk+DQorICAgICAgICA8L21lbWJlcj4NCisgICAgICAgIDxtZW1iZXIgbmFtZT0iUDpOVW5pdC5GcmFtZXdvcmsuVGhyb3dzLk5vdGhpbmciPg0KKyAgICAgICAgICAgIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIENyZWF0ZXMgYSBjb25zdHJhaW50IHNwZWNpZnlpbmcgdGhhdCBubyBleGNlcHRpb24gaXMgdGhyb3duDQorICAgICAgICAgICAgPC9zdW1tYXJ5Pg0KKyAgICAgICAgPC9tZW1iZXI+DQorICAgIDwvbWVtYmVycz4NCis8L2RvYz4NCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L2xpYi9udW5pdC5tb2Nrcy5kbGwgYi9jc2hhcnAvbGliL05Vbml0L2xpYi9udW5pdC5tb2Nrcy5kbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVlMmMxYwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvbGliL251bml0Lm1vY2tzLmRsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L2xpYi9wbnVuaXQuZnJhbWV3b3JrLmRsbCBiL2NzaGFycC9saWIvTlVuaXQvbGliL3BudW5pdC5mcmFtZXdvcmsuZGxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMTA1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L2xpYi9wbnVuaXQuZnJhbWV3b3JrLmRsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L2xpY2Vuc2UudHh0IGIvY3NoYXJwL2xpYi9OVW5pdC9saWNlbnNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjkxZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC9saWNlbnNlLnR4dApAQCAtMCwwICsxLDE1IEBACitDb3B5cmlnaHQgqSAyMDAyLTIwMDggQ2hhcmxpZSBQb29sZQ0KK0NvcHlyaWdodCCpIDIwMDItMjAwNCBKYW1lcyBXLiBOZXdraXJrLCBNaWNoYWVsIEMuIFR3bywgQWxleGVpIEEuIFZvcm9udHNvdg0KK0NvcHlyaWdodCCpIDIwMDAtMjAwMiBQaGlsaXAgQS4gQ3JhaWcNCisNCitUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4NCisNCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6DQorDQorMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCAoc2VlIHRoZSBmb2xsb3dpbmcpIGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gaXMgcmVxdWlyZWQuDQorDQorUG9ydGlvbnMgQ29weXJpZ2h0IKkgMjAwMi0yMDA4IENoYXJsaWUgUG9vbGUgb3IgQ29weXJpZ2h0IKkgMjAwMi0yMDA0IEphbWVzIFcuIE5ld2tpcmssIE1pY2hhZWwgQy4gVHdvLCBBbGV4ZWkgQS4gVm9yb250c292IG9yIENvcHlyaWdodCCpIDIwMDAtMjAwMiBQaGlsaXAgQS4gQ3JhaWcNCisNCisyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuDQorDQorMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4NCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL05Vbml0VGVzdHMuVmlzdWFsU3RhdGUueG1sIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9OVW5pdFRlc3RzLlZpc3VhbFN0YXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDNjZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9OVW5pdFRlc3RzLlZpc3VhbFN0YXRlLnhtbApAQCAtMCwwICsxLDEyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8VmlzdWFsU3RhdGUgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgU2hvd0NoZWNrQm94ZXM9ImZhbHNlIj4NCisgIDxUb3BOb2RlPlswLTEwMDBdRDpcRGV2XE5Vbml0XG51bml0LTIuNVx3b3JrXGJ1aWxkXG5ldFwyLjBccmVsZWFzZVxOVW5pdFRlc3RzLm51bml0PC9Ub3BOb2RlPg0KKyAgPFNlbGVjdGVkTm9kZT5bMC0xMDAwXUQ6XERldlxOVW5pdFxudW5pdC0yLjVcd29ya1xidWlsZFxuZXRcMi4wXHJlbGVhc2VcTlVuaXRUZXN0cy5udW5pdDwvU2VsZWN0ZWROb2RlPg0KKyAgPEV4Y2x1ZGVDYXRlZ29yaWVzPmZhbHNlPC9FeGNsdWRlQ2F0ZWdvcmllcz4NCisgIDxOb2Rlcz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTAwMF1EOlxEZXZcTlVuaXRcbnVuaXQtMi41XHdvcmtcYnVpbGRcbmV0XDIuMFxyZWxlYXNlXE5Vbml0VGVzdHMubnVuaXQiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0yODMyXUQ6XERldlxOVW5pdFxudW5pdC0yLjVcd29ya1xidWlsZFxuZXRcMi4wXHJlbGVhc2VcdGVzdHMvbnVuaXQuZnJhbWV3b3JrLnRlc3RzLmRsbCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTI4MzNdTlVuaXQiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0yODM0XU5Vbml0LkZyYW1ld29yayIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTI4MzVdTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTAwMV1OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWZ0ZXJDb25zdHJhaW50VGVzdCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTEwMjNdTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFuZFRlc3QiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xOTE0XU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Bc3NpZ25hYmxlRnJvbVRlc3QiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xOTI0XU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Bc3NpZ25hYmxlVG9UZXN0IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTkzNF1OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQXR0cmlidXRlRXhpc3RzQ29uc3RyYWludFRlc3QiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xNjk3XU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5CaW5hcnlTZXJpYWxpemFibGVUZXN0IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTE0NF1OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyZXJUZXN0cyIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTEyNzFdTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVtcHR5Q29uc3RyYWludFRlc3QiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xODA2XU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbmRzV2l0aFRlc3QiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xODI2XU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbmRzV2l0aFRlc3RJZ25vcmluZ0Nhc2UiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xMzAwXU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTg5M11OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXhhY3RUeXBlVGVzdCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTEwNjBdTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkZhbHNlQ29uc3RyYWludFRlc3QiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xMTk2XU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5HcmVhdGVyVGhhbk9yRXF1YWxUZXN0IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTE3Nl1OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuR3JlYXRlclRoYW5UZXN0IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTkwNF1OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSW5zdGFuY2VPZlR5cGVUZXN0IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTIzNF1OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTGVzc1RoYW5PckVxdWFsVGVzdCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTEyMTRdTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkxlc3NUaGFuVGVzdCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTEzOThdTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxUZXN0cyIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTEwNzZdTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5hTkNvbnN0cmFpbnRUZXN0IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTQyOV1OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTm90VGVzdCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTEwMzVdTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bGxDb25zdHJhaW50VGVzdCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTEyODhdTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bGxPckVtcHR5U3RyaW5nQ29uc3RyYWludFRlc3QiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xNDQzXU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdW1lcmljc1Rlc3QiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xNDc3XU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5PclRlc3QiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xNjQzXU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eUV4aXN0c1Rlc3QiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xNjYwXU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eVRlc3QiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xMjUyXU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SYW5nZUNvbnN0cmFpbnRUZXN0IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTY3N11OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmV1c2FibGVDb25zdHJhaW50VGVzdHMiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xNjg0XU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lQXNUZXN0IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTYxNV1OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyVGVzdF9MaW51eCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTE1OTJdTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoT3JVbmRlclRlc3RfV2luZG93cyIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTE1MDddTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9MaW51eCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTE0ODhdTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9XaW5kb3dzIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTc2Nl1OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3QiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xNzg2XU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdGFydHNXaXRoVGVzdElnbm9yaW5nQ2FzZSIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTE1NTldTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YlBhdGhUZXN0X0xpbnV4IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTUyOV1OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfV2luZG93cyIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTE3MjhdTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YnN0cmluZ1Rlc3QiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xNzQ4XU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJzdHJpbmdUZXN0SWdub3JpbmdDYXNlIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTg0Nl1OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVGhyb3dzQ29uc3RyYWludFRlc3RfRXhhY3RUeXBlIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMTg1OV1OVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVGhyb3dzQ29uc3RyYWludFRlc3RfSW5zdGFuY2VPZlR5cGUiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0xODczXU5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UaHJvd3NDb25zdHJhaW50VGVzdF9XaXRoQ29uc3RyYWludCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTEwNDRdTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRydWVDb25zdHJhaW50VGVzdCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTE3MTFdTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlhtbFNlcmlhbGl6YWJsZVRlc3QiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0yODM2XU5Vbml0LkZyYW1ld29yay5TeW50YXgiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0yMDkzXU5Vbml0LkZyYW1ld29yay5TeW50YXguSW52YWxpZENvZGVUZXN0cyIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTI4MzddTlVuaXQuRnJhbWV3b3JrLlRlc3RzIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMjc3Ml1OVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0zODc4XUQ6XERldlxOVW5pdFxudW5pdC0yLjVcd29ya1xidWlsZFxuZXRcMi4wXHJlbGVhc2VcdGVzdHMvbnVuaXQuY29yZS50ZXN0cy5kbGwiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0zODc5XU5Vbml0IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMzg4MF1OVW5pdC5Db3JlIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMzg4MV1OVW5pdC5Db3JlLlRlc3RzIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMjkxOV1OVW5pdC5Db3JlLlRlc3RzLkNhdGVnb3J5QXR0cmlidXRlVGVzdHMiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0yOTI5XU5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMjk5OF1OVW5pdC5Db3JlLlRlc3RzLkN1bHR1cmVTZXR0aW5nQW5kRGV0ZWN0aW9uVGVzdHMiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0zMDIxXU5Vbml0LkNvcmUuVGVzdHMuRXZlbnRRdWV1ZVRlc3RzIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMzg4Ml1OVW5pdC5Db3JlLlRlc3RzLkdlbmVyaWMiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0yODM4XU5Vbml0LkNvcmUuVGVzdHMuR2VuZXJpYy5EZWR1Y2VUeXBlQXJnc0Zyb21BcmdzJmx0O1QxLFQyJmd0OyIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTI4MzldTlVuaXQuQ29yZS5UZXN0cy5HZW5lcmljLkRlZHVjZVR5cGVBcmdzRnJvbUFyZ3MmbHQ7RG91YmxlLEludDMyJmd0OygxMDAuMGQsNDIpIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMjg0Ml1OVW5pdC5Db3JlLlRlc3RzLkdlbmVyaWMuRGVkdWNlVHlwZUFyZ3NGcm9tQXJncyZsdDtJbnQzMixEb3VibGUmZ3Q7KDQyLDEwMC4wZCkiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0yODQ1XU5Vbml0LkNvcmUuVGVzdHMuR2VuZXJpYy5TaW1wbGVHZW5lcmljRml4dHVyZSZsdDtUTGlzdCZndDsiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0yODUwXU5Vbml0LkNvcmUuVGVzdHMuR2VuZXJpYy5TaW1wbGVHZW5lcmljTWV0aG9kcyIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTI4NjZdTlVuaXQuQ29yZS5UZXN0cy5HZW5lcmljLlR5cGVQYXJhbWV0ZXJVc2VkV2l0aFRlc3RNZXRob2QmbHQ7VCZndDsiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0yODY3XU5Vbml0LkNvcmUuVGVzdHMuR2VuZXJpYy5UeXBlUGFyYW1ldGVyVXNlZFdpdGhUZXN0TWV0aG9kJmx0O0RvdWJsZSZndDsiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0zMTU4XU5Vbml0LkNvcmUuVGVzdHMuUGFpcndpc2VUZXN0IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMzE2OV1OVW5pdC5Db3JlLlRlc3RzLlBhaXJ3aXNlVGVzdCtMaXZlVGVzdCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTMxNzhdTlVuaXQuQ29yZS5UZXN0cy5QYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmUiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0zMTk1XU5Vbml0LkNvcmUuVGVzdHMuUGFyYW1ldGVyaXplZFRlc3RGaXh0dXJlV2l0aERhdGFTb3VyY2VzIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMzE5Nl1OVW5pdC5Db3JlLlRlc3RzLlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZVdpdGhEYXRhU291cmNlcyg0MikiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0zMTg4XU5Vbml0LkNvcmUuVGVzdHMuUGFyYW1ldGVyaXplZFRlc3RGaXh0dXJlV2l0aE51bGxBcmd1bWVudHMiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0zMjk3XU5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMzQ2Nl1OVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlQXR0cmlidXRlVGVzdHMiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0zNTM2XU5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cyIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTM3NTNdTlVuaXQuQ29yZS5UZXN0cy5UaGVvcnlUZXN0cyIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTM3NzVdTlVuaXQuQ29yZS5UZXN0cy5UaGVvcnlUZXN0cytTcXJ0VGVzdHNfRGlzcGxheVJlc3VsdHMiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC0zODE3XU5Vbml0LkNvcmUuVGVzdHMuVHlwZUhlbHBlclRlc3RzIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtMzg0NF1OVW5pdC5Db3JlLlRlc3RzLlZhbHVlU291cmNlVGVzdHMiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC00MjUwXUQ6XERldlxOVW5pdFxudW5pdC0yLjVcd29ya1xidWlsZFxuZXRcMi4wXHJlbGVhc2VcdGVzdHMvbnVuaXQudXRpbC50ZXN0cy5kbGwiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC00MjUxXU5Vbml0IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtNDI1Ml1OVW5pdC5VdGlsIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtNDEzNF1OVW5pdC5VdGlsLlRlc3RzLlNlcnZpY2VNYW5hZ2VyU2V0VXBGaXh0dXJlIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtNDExMF1OVW5pdC5VdGlsLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtTZWxlY3RvclRlc3RzIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtNDMwMl1EOlxEZXZcTlVuaXRcbnVuaXQtMi41XHdvcmtcYnVpbGRcbmV0XDIuMFxyZWxlYXNlXHRlc3RzL251bml0Lm1vY2tzLnRlc3RzLmRsbCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTQzMDNdTlVuaXQiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC00MzA0XU5Vbml0Lk1vY2tzIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtNDMwNV1OVW5pdC5Nb2Nrcy5UZXN0cyIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTQzNjFdRDpcRGV2XE5Vbml0XG51bml0LTIuNVx3b3JrXGJ1aWxkXG5ldFwyLjBccmVsZWFzZVx0ZXN0cy9udW5pdC1jb25zb2xlLnRlc3RzLmRsbCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTQzNjJdTlVuaXQiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC00MzYzXU5Vbml0LkNvbnNvbGVSdW5uZXIiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC00MzY0XU5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC00MzQ1XU5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuVGVzdE5hbWVQYXJzZXJUZXN0cyIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTQ2MDRdRDpcRGV2XE5Vbml0XG51bml0LTIuNVx3b3JrXGJ1aWxkXG5ldFwyLjBccmVsZWFzZVx0ZXN0cy9udW5pdC51aWV4Y2VwdGlvbi50ZXN0cy5kbGwiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC00NjA1XU5Vbml0IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtNDYwNl1OVW5pdC5VaUV4Y2VwdGlvbiIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTQ2MDddTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC00NjA4XU5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtNDYwOV1OVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scyIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTQ2MTBdTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuU3RhY2tUcmFjZUFuYWx5emVycyIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTQ2NjVdRDpcRGV2XE5Vbml0XG51bml0LTIuNVx3b3JrXGJ1aWxkXG5ldFwyLjBccmVsZWFzZVx0ZXN0cy9udW5pdC51aWtpdC50ZXN0cy5kbGwiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC00NjY2XU5Vbml0IiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtNDY2N11OVW5pdC5VaUtpdCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTQ2NjhdTlVuaXQuVWlLaXQuVGVzdHMiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC00Njg3XUQ6XERldlxOVW5pdFxudW5pdC0yLjVcd29ya1xidWlsZFxuZXRcMi4wXHJlbGVhc2VcdGVzdHMvbnVuaXQtZ3VpLnRlc3RzLmRsbCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTQ2ODhdTlVuaXQiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC00Njg5XU5Vbml0Lkd1aSIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTQ2OTBdTlVuaXQuR3VpLlRlc3RzIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtNDY5OV1EOlxEZXZcTlVuaXRcbnVuaXQtMi41XHdvcmtcYnVpbGRcbmV0XDIuMFxyZWxlYXNlXHRlc3RzL251bml0LmZpeHR1cmVzLnRlc3RzLmRsbCIgRXhwYW5kZWQ9InRydWUiIC8+DQorICAgIDxOb2RlIFVuaXF1ZU5hbWU9IlswLTQ3MDBdTlVuaXQiIEV4cGFuZGVkPSJ0cnVlIiAvPg0KKyAgICA8Tm9kZSBVbmlxdWVOYW1lPSJbMC00NzAxXU5Vbml0LkZpeHR1cmVzIiBFeHBhbmRlZD0idHJ1ZSIgLz4NCisgICAgPE5vZGUgVW5pcXVlTmFtZT0iWzAtNDcwMl1OVW5pdC5GaXh0dXJlcy5UZXN0cyIgRXhwYW5kZWQ9InRydWUiIC8+DQorICA8L05vZGVzPg0KKzwvVmlzdWFsU3RhdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9OVW5pdFRlc3RzLmNvbmZpZyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvTlVuaXRUZXN0cy5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4N2MwNwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvTlVuaXRUZXN0cy5jb25maWcKQEAgLTAsMCArMSw4NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+DQorPGNvbmZpZ3VyYXRpb24+DQorPCEtLQ0KKwkgVGhpcyBpcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgTlVuaXRUZXN0cy5udW5pdCB0ZXN0IHByb2plY3QuIFlvdSBtYXkNCisJIG5lZWQgdG8gY3JlYXRlIGEgc2ltaWxhciBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHlvdXIgb3duIHRlc3QgcHJvamVjdC4gDQorIC0tPgkgDQorDQorPCEtLQ0KKwkgVGhlIDxOVW5pdD4gc2VjdGlvbiBpcyBvbmx5IG5lZWRlZCBpZiB5b3Ugd2FudCB0byB1c2UgYSBub24tZGVmYXVsdCB2YWx1ZQ0KKwkgZm9yIGFueSBvZiB0aGUgc2V0dGluZ3MuIEl0IGlzIGNvbW1lbnRlZCBvdXQgYmVsb3cuIElmIHlvdSBhcmUgZ29pbmcgdG8gdXNlDQorICAgaXQsIHlvdSBtdXN0IGRlaWZuZSB0aGUgTlVuaXQgc2VjdGlvbiBncm91cCBhbmQgdGhlIHNlY3Rpb25zIHlvdSBuZWVkLg0KKyANCisgICBUaGUgc3ludGF4IHNob3duIGhlcmUgd29ya3MgZm9yIG1vc3QgcnVudGltZXMuIElmIE5Vbml0IGZhaWxzIGF0IHN0YXJ0dXAsIHlvdQ0KKyAgIGNhbiB0cnkgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgYXNzZW1ibHkgY29udGFpbmluZyB0aGUgTmFtZVZhbHVlU2VjdGlvbkhhbmRsZXI6DQorICAgDQorICAgICAgPHNlY3Rpb24gbmFtZT0iVGVzdENhc2VCdWlsZGVyIiB0eXBlPSJTeXN0ZW0uQ29uZmlndXJhdGlvbi5OYW1lVmFsdWVTZWN0aW9uSGFuZGxlciwgU3lzdGVtIiAvPg0KKyAgICAgIA0KKyAgIElmIHRoYXQgZmFpbHMsIHRyeSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFzc2VtYmx5Og0KKyAgIA0KKyAgICAgIDxzZWN0aW9uIG5hbWU9IlRlc3RDYXNlQnVpbGRlciIgdHlwZT0iU3lzdGVtLkNvbmZpZ3VyYXRpb24uTmFtZVZhbHVlU2VjdGlvbkhhbmRsZXIsIFN5c3RlbSwgDQorICAgICAgICAgICAgIFZlcnNpb249Mi4wLjUwNzI3LjgzMiwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5IiAvPg0KKyAgICAgICAgICAgICANCisgICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGxhc3QgYXBwcm9hY2ggbWFrZXMgeW91ciBjb25maWcgZmlsZSBub24tcG9ydGFibGUgYWNyb3NzIHJ1bnRpbWVzLg0KKyAgIC0tPg0KKw0KKzwhLS0NCisgIDxjb25maWdTZWN0aW9ucz4NCisJCTxzZWN0aW9uR3JvdXAgbmFtZT0iTlVuaXQiPg0KKwkJCTxzZWN0aW9uIG5hbWU9IlRlc3RDYXNlQnVpbGRlciIgdHlwZT0iU3lzdGVtLkNvbmZpZ3VyYXRpb24uTmFtZVZhbHVlU2VjdGlvbkhhbmRsZXIiLz4NCisJCQk8c2VjdGlvbiBuYW1lPSJUZXN0UnVubmVyIiB0eXBlPSJTeXN0ZW0uQ29uZmlndXJhdGlvbi5OYW1lVmFsdWVTZWN0aW9uSGFuZGxlciIvPg0KKwkJPC9zZWN0aW9uR3JvdXA+DQorCTwvY29uZmlnU2VjdGlvbnM+DQorIC0tPg0KKw0KKyAgPGFwcFNldHRpbmdzPg0KKwkJPCEtLSAgIFVzZXIgYXBwbGljYXRpb24gYW5kIGNvbmZpZ3VyZWQgcHJvcGVydHkgc2V0dGluZ3MgZ28gaGVyZS4tLT4NCisJCTwhLS0gICBFeGFtcGxlOiA8YWRkIGtleT0ic2V0dGluZ05hbWUiIHZhbHVlPSJzZXR0aW5nVmFsdWUiLz4gLS0+DQorCQk8YWRkIGtleT0idGVzdC5zZXR0aW5nIiB2YWx1ZT0iNTQzMjEiIC8+DQorCTwvYXBwU2V0dGluZ3M+DQorDQorPCEtLSBTYW1wbGUgTlVuaXQgc2VjdGlvbiBncm91cCBzaG93aW5nIGFsbCBkZWZhdWx0IHZhbHVlcyAtLT4NCis8IS0tDQorCTxOVW5pdD4NCisJCTxUZXN0Q2FzZUJ1aWxkZXI+DQorCQkJPGFkZCBrZXk9Ik9sZFN0eWxlVGVzdENhc2VzIiB2YWx1ZT0iZmFsc2UiIC8+DQorCQk8L1Rlc3RDYXNlQnVpbGRlcj4NCisJCTxUZXN0UnVubmVyPg0KKwkJCTxhZGQga2V5PSJBcGFydG1lbnRTdGF0ZSIgdmFsdWU9Ik1UQSIgLz4NCisJCQk8YWRkIGtleT0iVGhyZWFkUHJpb3JpdHkiIHZhbHVlPSJOb3JtYWwiIC8+DQorICAgICAgPGFkZCBrZXk9IkRlZmF1bHRMb2dUaHJlc2hvbGQiIHZhbHVlPSJJbmZvIiAvPg0KKwkJPC9UZXN0UnVubmVyPg0KKwk8L05Vbml0Pg0KKy0tPg0KKyAgDQorICAgPCEtLQ0KKyAgICBUaGUgZm9sbG93aW5nIDxydW50aW1lPiBzZWN0aW9uIGFsbG93cyBydW5uaW5nIG51bml0IHRlc3RzIHVuZGVyIA0KKyAgICAuTkVUIDEuMCBieSByZWRpcmVjdGluZyBhc3NlbWJsaWVzLiBUaGUgYXBwbGllc1RvIGF0dHJpYnV0ZQ0KKyAgICBjYXVzZXMgdGhlIHNlY3Rpb24gdG8gYmUgaWdub3JlZCBleGNlcHQgdW5kZXIgLk5FVCAxLjAuDQorICAgLS0+IA0KKwk8cnVudGltZT4NCisJCTxhc3NlbWJseUJpbmRpbmcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIg0KKwkJCQlhcHBsaWVzVG89InYxLjAuMzcwNSI+DQorCQkJPGRlcGVuZGVudEFzc2VtYmx5Pg0KKwkJCQk8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0iIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5IiBjdWx0dXJlPSIiIC8+DQorCQkJCTxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjUwMDAuMCIgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIgLz4NCisJCQk8L2RlcGVuZGVudEFzc2VtYmx5Pg0KKwkJCTxkZXBlbmRlbnRBc3NlbWJseT4NCisJCQkJPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLkRhdGEiIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5IiBjdWx0dXJlPSIiIC8+DQorCQkJCTxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjUwMDAuMCIgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIgLz4NCisJCQk8L2RlcGVuZGVudEFzc2VtYmx5Pg0KKwkJCTxkZXBlbmRlbnRBc3NlbWJseT4NCisJCQkJPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLkRyYXdpbmciIHB1YmxpY0tleVRva2VuPSJiMDNmNWY3ZjExZDUwYTNhIiBjdWx0dXJlPSIiIC8+DQorCQkJCTxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjUwMDAuMCIgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIgLz4NCisJCQk8L2RlcGVuZGVudEFzc2VtYmx5Pg0KKwkJCTxkZXBlbmRlbnRBc3NlbWJseT4NCisJCQkJPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldpbmRvd3MuRm9ybXMiIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5IiBjdWx0dXJlPSIiIC8+DQorCQkJCTxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjUwMDAuMCIgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIgLz4NCisJCQk8L2RlcGVuZGVudEFzc2VtYmx5Pg0KKwkJCTxkZXBlbmRlbnRBc3NlbWJseT4NCisJCQkJPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLlhtbCIgcHVibGljS2V5VG9rZW49ImI3N2E1YzU2MTkzNGUwODkiIGN1bHR1cmU9IiIgLz4NCisJCQkJPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuNTAwMC4wIiBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIiAvPg0KKwkJCTwvZGVwZW5kZW50QXNzZW1ibHk+DQorCQk8L2Fzc2VtYmx5QmluZGluZz4NCisJPC9ydW50aW1lPg0KKzwvY29uZmlndXJhdGlvbj4gDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9OVW5pdFRlc3RzLm51bml0IGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9OVW5pdFRlc3RzLm51bml0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODBkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL05Vbml0VGVzdHMubnVuaXQKQEAgLTAsMCArMSwxNCBAQAorPE5Vbml0UHJvamVjdD4NCisgIDxTZXR0aW5ncyBhcHBiYXNlPSIuIi8+DQorICA8Q29uZmlnIG5hbWU9IkRlZmF1bHQiIGJpbnBhdGg9ImxpYjt0ZXN0cztmcmFtZXdvcmsiIHJ1bnRpbWVGcmFtZXdvcms9InYyLjAiPg0KKyAgICA8YXNzZW1ibHkgcGF0aD0idGVzdHMvbnVuaXQuZnJhbWV3b3JrLnRlc3RzLmRsbCIgLz4NCisgICAgPGFzc2VtYmx5IHBhdGg9InRlc3RzL251bml0LmNvcmUudGVzdHMuZGxsIiAvPg0KKyAgICA8YXNzZW1ibHkgcGF0aD0idGVzdHMvbnVuaXQudXRpbC50ZXN0cy5kbGwiIC8+DQorICAgIDxhc3NlbWJseSBwYXRoPSJ0ZXN0cy9udW5pdC5tb2Nrcy50ZXN0cy5kbGwiIC8+DQorICAgIDxhc3NlbWJseSBwYXRoPSJ0ZXN0cy9udW5pdC1jb25zb2xlLnRlc3RzLmRsbCIgLz4NCisgICAgPGFzc2VtYmx5IHBhdGg9InRlc3RzL251bml0LnVpZXhjZXB0aW9uLnRlc3RzLmRsbCIgLz4NCisgICAgPGFzc2VtYmx5IHBhdGg9InRlc3RzL251bml0LnVpa2l0LnRlc3RzLmRsbCIgLz4NCisgICAgPGFzc2VtYmx5IHBhdGg9InRlc3RzL251bml0LWd1aS50ZXN0cy5kbGwiIC8+DQorICAgIDxhc3NlbWJseSBwYXRoPSJ0ZXN0cy9udW5pdC5maXh0dXJlcy50ZXN0cy5kbGwiIC8+DQorICA8L0NvbmZpZz4NCis8L05Vbml0UHJvamVjdD4NCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL1Rlc3RSZXN1bHQueG1sIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9UZXN0UmVzdWx0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNThkNDJiCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9UZXN0UmVzdWx0LnhtbApAQCAtMCwwICsxLDU5NzEgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiBzdGFuZGFsb25lPSJubyI/Pg0KKzwhLS1UaGlzIGZpbGUgcmVwcmVzZW50cyB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGEgdGVzdCBzdWl0ZS0tPg0KKzx0ZXN0LXJlc3VsdHMgbmFtZT0iRDpcRGV2XE5Vbml0XG51bml0LTIuNVx3b3JrXGJ1aWxkXG5ldFwyLjBccmVsZWFzZVxOVW5pdFRlc3RzLm51bml0IiB0b3RhbD0iMzAwMSIgZXJyb3JzPSIwIiBmYWlsdXJlcz0iMCIgbm90LXJ1bj0iMiIgaW5jb25jbHVzaXZlPSIxMyIgaWdub3JlZD0iMCIgc2tpcHBlZD0iMiIgaW52YWxpZD0iMCIgZGF0ZT0iMjAxMS0wNC0wMiIgdGltZT0iMjA6MDg6NTkiPg0KKyAgPGVudmlyb25tZW50IG51bml0LXZlcnNpb249IjIuNS4xMC4xMTA5MiIgY2xyLXZlcnNpb249IjIuMC41MDcyNy40OTUyIiBvcy12ZXJzaW9uPSJNaWNyb3NvZnQgV2luZG93cyBOVCA2LjEuNzYwMC4wIiBwbGF0Zm9ybT0iV2luMzJOVCIgY3dkPSJEOlxEZXZcTlVuaXRcbnVuaXQtMi41XHdvcmtcYnVpbGRcbmV0XDIuMFxyZWxlYXNlIiBtYWNoaW5lLW5hbWU9IkNIQVJMSUUtTEFQVE9QIiB1c2VyPSJjaGFybGllIiB1c2VyLWRvbWFpbj0iY2hhcmxpZS1sYXB0b3AiIC8+DQorICA8Y3VsdHVyZS1pbmZvIGN1cnJlbnQtY3VsdHVyZT0iZW4tVVMiIGN1cnJlbnQtdWljdWx0dXJlPSJlbi1VUyIgLz4NCisgIDx0ZXN0LXN1aXRlIHR5cGU9IlByb2plY3QiIG5hbWU9IkQ6XERldlxOVW5pdFxudW5pdC0yLjVcd29ya1xidWlsZFxuZXRcMi4wXHJlbGVhc2VcTlVuaXRUZXN0cy5udW5pdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iODguODQ3IiBhc3NlcnRzPSIwIj4NCisgICAgPHJlc3VsdHM+DQorICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iQXNzZW1ibHkiIG5hbWU9IkQ6XERldlxOVW5pdFxudW5pdC0yLjVcd29ya1xidWlsZFxuZXRcMi4wXHJlbGVhc2VcdGVzdHMvbnVuaXQuZnJhbWV3b3JrLnRlc3RzLmRsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMTcuNDc1IiBhc3NlcnRzPSIwIj4NCisgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJOYW1lc3BhY2UiIG5hbWU9Ik5Vbml0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIxNy40NzQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iTmFtZXNwYWNlIiBuYW1lPSJGcmFtZXdvcmsiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjE3LjQ3NCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9Ik5hbWVzcGFjZSIgbmFtZT0iQ29uc3RyYWludHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjEwLjM0OSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFmdGVyQ29uc3RyYWludFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjYuMzE2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFmdGVyQ29uc3RyYWludFRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE4IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWZ0ZXJDb25zdHJhaW50VGVzdC5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJTdHJpbmdSZXByZXNlbnRhdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iRmFpbHNXaXRoQmFkRGVsZWdhdGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIxLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFmdGVyQ29uc3RyYWludFRlc3QuRmFpbHNXaXRoQmFkRGVsZWdhdGVzKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BY3R1YWxWYWx1ZURlbGVnYXRlKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC41MDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWZ0ZXJDb25zdHJhaW50VGVzdC5GYWlsc1dpdGhCYWREZWxlZ2F0ZXMoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFjdHVhbFZhbHVlRGVsZWdhdGUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjUwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMS41MDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BZnRlckNvbnN0cmFpbnRUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyhGYWxzZSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNTAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFmdGVyQ29uc3RyYWludFRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKDApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjUwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BZnRlckNvbnN0cmFpbnRUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyhudWxsKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC41MDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIxLjUwOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFmdGVyQ29uc3RyYWludFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZShGYWxzZSwmcXVvdDtGYWxzZSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNTAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFmdGVyQ29uc3RyYWludFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgwLCZxdW90OzAmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjUwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BZnRlckNvbnN0cmFpbnRUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UobnVsbCwmcXVvdDtudWxsJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC41MDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFmdGVyQ29uc3RyYWludFRlc3QuU2ltcGxlVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC42MDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BZnRlckNvbnN0cmFpbnRUZXN0LlNpbXBsZVRlc3RVc2luZ1JlZmVyZW5jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC42MDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3VjY2VlZHNXaXRoR29vZERlbGVnYXRlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC41MDIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BZnRlckNvbnN0cmFpbnRUZXN0LlN1Y2NlZWRzV2l0aEdvb2REZWxlZ2F0ZXMoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFjdHVhbFZhbHVlRGVsZWdhdGUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjUwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNTAyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWZ0ZXJDb25zdHJhaW50VGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKFRydWUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjUwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWZ0ZXJDb25zdHJhaW50VGVzdC5UaGF0T3ZlcmxvYWRfRG9lc05vdEFjY2VwdE5lZ2F0aXZlRGVsYXlWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWZ0ZXJDb25zdHJhaW50VGVzdC5UaGF0T3ZlcmxvYWRfWmVyb0RlbGF5SXNBbGxvd2VkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFsbEl0ZW1zVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDM5IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFsbEl0ZW1zVGVzdHMuQWxsSXRlbXNBcmVJblJhbmdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFsbEl0ZW1zVGVzdHMuQWxsSXRlbXNBcmVJblJhbmdlX1VzaW5nQ29tcGFyaXNvbk9mVCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BbGxJdGVtc1Rlc3RzLkFsbEl0ZW1zQXJlSW5SYW5nZV9Vc2luZ0lDb21wYXJlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BbGxJdGVtc1Rlc3RzLkFsbEl0ZW1zQXJlSW5SYW5nZV9Vc2luZ0lDb21wYXJlck9mVCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BbGxJdGVtc1Rlc3RzLkFsbEl0ZW1zQXJlSW5SYW5nZUZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFsbEl0ZW1zVGVzdHMuQWxsSXRlbXNBcmVJbnN0YW5jZXNPZlR5cGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQWxsSXRlbXNUZXN0cy5BbGxJdGVtc0FyZUluc3RhbmNlc09mVHlwZUZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFsbEl0ZW1zVGVzdHMuQWxsSXRlbXNBcmVOb3ROdWxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFsbEl0ZW1zVGVzdHMuQWxsSXRlbXNBcmVOb3ROdWxsRmFpbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQW5kVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQW5kVGVzdC5DYW5Db21iaW5lVGVzdHNXaXRoQW5kT3BlcmF0b3IiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQW5kVGVzdC5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJEZXNjcmlwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BbmRUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlclN0cmluZ1JlcHJlc2VudGF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJGYWlsc1dpdGhCYWRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQW5kVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoMzcpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BbmRUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyg1MykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BbmRUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoMzcsJnF1b3Q7MzcmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BbmRUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoNTMsJnF1b3Q7NTMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQW5kVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKDQyKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFzc2lnbmFibGVGcm9tVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQXNzaWduYWJsZUZyb21UZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFzc2lnbmFibGVGcm9tVGVzdC5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJTdHJpbmdSZXByZXNlbnRhdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iRmFpbHNXaXRoQmFkVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFzc2lnbmFibGVGcm9tVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkQyKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFzc2lnbmFibGVGcm9tVGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5EMiwmcXVvdDsmbHQ7TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkQyJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3VjY2VlZHNXaXRoR29vZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Bc3NpZ25hYmxlRnJvbVRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRDEpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Bc3NpZ25hYmxlRnJvbVRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJBc3NpZ25hYmxlVG9UZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxOCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Bc3NpZ25hYmxlVG9UZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkFzc2lnbmFibGVUb1Rlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Bc3NpZ25hYmxlVG9UZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Bc3NpZ25hYmxlVG9UZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkIsJnF1b3Q7Jmx0O05Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5CJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3VjY2VlZHNXaXRoR29vZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Bc3NpZ25hYmxlVG9UZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkQxKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQXNzaWduYWJsZVRvVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5EMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJBdHRyaWJ1dGVFeGlzdHNDb25zdHJhaW50VGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQXR0cmlidXRlRXhpc3RzQ29uc3RyYWludFRlc3QuQXR0cmlidXRlRXhpc3RzT25NZXRob2RJbmZvIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkF0dHJpYnV0ZUV4aXN0c0NvbnN0cmFpbnRUZXN0LkF0dHJpYnV0ZVRlc3RQcm9wZXJ0eVZhbHVlT25NZXRob2RJbmZvIiBkZXNjcmlwdGlvbj0ibXkgZGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQXR0cmlidXRlRXhpc3RzQ29uc3RyYWludFRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQXR0cmlidXRlRXhpc3RzQ29uc3RyYWludFRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BdHRyaWJ1dGVFeGlzdHNDb25zdHJhaW50VGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkQyKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkF0dHJpYnV0ZUV4aXN0c0NvbnN0cmFpbnRUZXN0Lk5vbkF0dHJpYnV0ZVRocm93c0V4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BdHRyaWJ1dGVFeGlzdHNDb25zdHJhaW50VGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5EMiwmcXVvdDsmbHQ7TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkQyJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3VjY2VlZHNXaXRoR29vZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BdHRyaWJ1dGVFeGlzdHNDb25zdHJhaW50VGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5BdHRyaWJ1dGVFeGlzdHNDb25zdHJhaW50VGVzdCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJCaW5hcnlTZXJpYWxpemFibGVUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5CaW5hcnlTZXJpYWxpemFibGVUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkJpbmFyeVNlcmlhbGl6YWJsZVRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5CaW5hcnlTZXJpYWxpemFibGVUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSW50ZXJuYWxDbGFzcykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iSW52YWxpZERhdGFUaHJvd3NBcmd1bWVudEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5CaW5hcnlTZXJpYWxpemFibGVUZXN0LkludmFsaWREYXRhVGhyb3dzQXJndW1lbnRFeGNlcHRpb24obnVsbCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5CaW5hcnlTZXJpYWxpemFibGVUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkludGVybmFsQ2xhc3MsJnF1b3Q7Jmx0O0ludGVybmFsQ2xhc3MmZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkJpbmFyeVNlcmlhbGl6YWJsZVRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcygxKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQmluYXJ5U2VyaWFsaXphYmxlVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O2EmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5CaW5hcnlTZXJpYWxpemFibGVUZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkJpbmFyeVNlcmlhbGl6YWJsZVRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSW50ZXJuYWxXaXRoU2VyaWFsaXphYmxlQXR0cmlidXRlQ2xhc3MpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQ29sbGVjdGlvbkNvbnRhaW5zVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDQxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25Db250YWluc1Rlc3RzLkNhblRlc3RDb250ZW50c09mQXJyYXkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkNvbnRhaW5zVGVzdHMuQ2FuVGVzdENvbnRlbnRzT2ZBcnJheUxpc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkNvbnRhaW5zVGVzdHMuQ2FuVGVzdENvbnRlbnRzT2ZDb2xsZWN0aW9uTm90SW1wbGVtZW50aW5nSUxpc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkNvbnRhaW5zVGVzdHMuQ2FuVGVzdENvbnRlbnRzT2ZTb3J0ZWRMaXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25Db250YWluc1Rlc3RzLklnbm9yZUNhc2VJc0hvbm9yZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkNvbnRhaW5zVGVzdHMuVXNlc1Byb3ZpZGVkQ29tcGFyZXJPZlQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkNvbnRhaW5zVGVzdHMuVXNlc1Byb3ZpZGVkQ29tcGFyaXNvbk9mVCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uQ29udGFpbnNUZXN0cy5Vc2VzUHJvdmlkZWRFcXVhbGl0eUNvbXBhcmVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25Db250YWluc1Rlc3RzLlVzZXNQcm92aWRlZEVxdWFsaXR5Q29tcGFyZXJPZlQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkNvbnRhaW5zVGVzdHMuVXNlc1Byb3ZpZGVkSUNvbXBhcmVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkNvbGxlY3Rpb25FcXVpdmFsZW50VGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDIyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25FcXVpdmFsZW50VGVzdHMuRXF1YWxDb2xsZWN0aW9uc0FyZUVxdWl2YWxlbnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkVxdWl2YWxlbnRUZXN0cy5FcXVpdmFsZW50RmFpbHNXaXRoRHVwbGljYXRlRWxlbWVudEluQWN0dWFsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25FcXVpdmFsZW50VGVzdHMuRXF1aXZhbGVudEZhaWxzV2l0aER1cGxpY2F0ZUVsZW1lbnRJbkV4cGVjdGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25FcXVpdmFsZW50VGVzdHMuRXF1aXZhbGVudEhhbmRsZXNOdWxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25FcXVpdmFsZW50VGVzdHMuRXF1aXZhbGVudEhvbm9yc0lnbm9yZUNhc2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbkVxdWl2YWxlbnRUZXN0cy5FcXVpdmFsZW50SWdub3Jlc09yZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25FcXVpdmFsZW50VGVzdHMuV29ya3NXaXRoQ29sbGVjdGlvbnNPZkFycmF5cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDb2xsZWN0aW9uT3JkZXJlZFRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA0OSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uT3JkZXJlZFRlc3RzLklzT3JkZXJlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uT3JkZXJlZFRlc3RzLklzT3JkZXJlZF8yIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25PcmRlcmVkVGVzdHMuSXNPcmRlcmVkX0FsbG93c19hZGphY2VudF9lcXVhbF92YWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbk9yZGVyZWRUZXN0cy5Jc09yZGVyZWRfQXRMZWFzdE9uZUFyZ011c3RJbXBsZW1lbnRJQ29tcGFyYWJsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uT3JkZXJlZFRlc3RzLklzT3JkZXJlZF9GYWlscyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uT3JkZXJlZFRlc3RzLklzT3JkZXJlZF9IYW5kbGVzX2N1c3RvbV9jb21wYXJpc29uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25PcmRlcmVkVGVzdHMuSXNPcmRlcmVkX0hhbmRsZXNfY3VzdG9tX2NvbXBhcmlzb24yIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25PcmRlcmVkVGVzdHMuSXNPcmRlcmVkX0hhbmRsZXNfbnVsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uT3JkZXJlZFRlc3RzLklzT3JkZXJlZF9UeXBlc011c3RCZUNvbXBhcmFibGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29sbGVjdGlvbk9yZGVyZWRUZXN0cy5Jc09yZGVyZWRCeSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uT3JkZXJlZFRlc3RzLklzT3JkZXJlZEJ5X0NvbXBhcmVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25PcmRlcmVkVGVzdHMuSXNPcmRlcmVkQnlfSGFuZGxlc19oZXRlcm9nZW5lb3VzX2NsYXNzZXNfYXNfbG9uZ19hc190aGVfcHJvcGVydHlfaXNfb2Zfc2FtZV90eXBlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25PcmRlcmVkVGVzdHMuSXNPcmRlcmVkRGVzY2VuZGluZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uT3JkZXJlZFRlc3RzLklzT3JkZXJlZERlc2NlbmRpbmdfMiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db2xsZWN0aW9uT3JkZXJlZFRlc3RzLlVzZXNQcm92aWRlZENvbXBhcmVyT2ZUIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbGxlY3Rpb25PcmRlcmVkVGVzdHMuVXNlc1Byb3ZpZGVkQ29tcGFyaXNvbk9mVCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDb21wYXJlclRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA3MSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iRXF1YWxJdGVtcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJlclRlc3RzLkVxdWFsSXRlbXMoNC4wZCw0KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyZXJUZXN0cy5FcXVhbEl0ZW1zKDQuMGQsNC4wZikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuRXF1YWxJdGVtcyhudWxsLG51bGwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJlclRlc3RzLkVxdWFsSXRlbXMoNCw0KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyZXJUZXN0cy5FcXVhbEl0ZW1zKDQuMGQsNC4wZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuRXF1YWxJdGVtcyg0LjBmLDQuMGYpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJlclRlc3RzLkVxdWFsSXRlbXMoNCw0LjBkKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyZXJUZXN0cy5FcXVhbEl0ZW1zKDQsNC4wZikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuRXF1YWxJdGVtcyg0LjBmLDQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJlclRlc3RzLkVxdWFsSXRlbXMoNC4wZiw0LjBkKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyZXJUZXN0cy5FcXVhbEl0ZW1zKG51bGwsbnVsbCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3BlY2lhbEZsb2F0aW5nUG9pbnRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDExIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyZXJUZXN0cy5TcGVjaWFsRmxvYXRpbmdQb2ludFZhbHVlcyhkb3VibGUuTmFOKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyZXJUZXN0cy5TcGVjaWFsRmxvYXRpbmdQb2ludFZhbHVlcyhmbG9hdC5OZWdhdGl2ZUluZmluaXR5KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyZXJUZXN0cy5TcGVjaWFsRmxvYXRpbmdQb2ludFZhbHVlcyhmbG9hdC5OYU4pIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Db21wYXJlclRlc3RzLlNwZWNpYWxGbG9hdGluZ1BvaW50VmFsdWVzKGRvdWJsZS5Qb3NpdGl2ZUluZmluaXR5KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQ29tcGFyZXJUZXN0cy5TcGVjaWFsRmxvYXRpbmdQb2ludFZhbHVlcyhkb3VibGUuTmVnYXRpdmVJbmZpbml0eSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuU3BlY2lhbEZsb2F0aW5nUG9pbnRWYWx1ZXMoZmxvYXQuUG9zaXRpdmVJbmZpbml0eSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iVW5lcXVhbEl0ZW1zIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyMiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuVW5lcXVhbEl0ZW1zKDQsbnVsbCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuVW5lcXVhbEl0ZW1zKDQsMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuVW5lcXVhbEl0ZW1zKDQsbnVsbCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuVW5lcXVhbEl0ZW1zKDQuMGQsMi4wZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuVW5lcXVhbEl0ZW1zKDQuMGYsMi4wZikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuVW5lcXVhbEl0ZW1zKDQuMGYsMi4wZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuVW5lcXVhbEl0ZW1zKDQsMi4wZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuVW5lcXVhbEl0ZW1zKDQsMi4wZikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuVW5lcXVhbEl0ZW1zKDQuMGQsMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuVW5lcXVhbEl0ZW1zKDQuMGQsMi4wZikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkNvbXBhcmVyVGVzdHMuVW5lcXVhbEl0ZW1zKDQuMGYsMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJFbXB0eUNvbnN0cmFpbnRUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbXB0eUNvbnN0cmFpbnRUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVtcHR5Q29uc3RyYWludFRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbXB0eUNvbnN0cmFpbnRUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtIZWxsbyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVtcHR5Q29uc3RyYWludFRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKFN5c3RlbS5PYmplY3RbXSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iSW52YWxpZERhdGFUaHJvd3NBcmd1bWVudEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbXB0eUNvbnN0cmFpbnRUZXN0LkludmFsaWREYXRhVGhyb3dzQXJndW1lbnRFeGNlcHRpb24obnVsbCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVtcHR5Q29uc3RyYWludFRlc3QuSW52YWxpZERhdGFUaHJvd3NBcmd1bWVudEV4Y2VwdGlvbig1KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVtcHR5Q29uc3RyYWludFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtIZWxsbyZxdW90OywmcXVvdDtcJnF1b3Q7SGVsbG9cJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW1wdHlDb25zdHJhaW50VGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKFN5c3RlbS5PYmplY3RbXSwmcXVvdDsmbHQ7IDEsIDIsIDMgJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3VjY2VlZHNXaXRoR29vZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbXB0eUNvbnN0cmFpbnRUZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW1wdHlDb25zdHJhaW50VGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKFN5c3RlbS5PYmplY3RbXSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVtcHR5Q29uc3RyYWludFRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcyhTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW1wdHlDb25zdHJhaW50VGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtTeXN0ZW0uSW50MzJdKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkVuZHNXaXRoVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW5kc1dpdGhUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoVGVzdC5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJTdHJpbmdSZXByZXNlbnRhdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iRmFpbHNXaXRoQmFkVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxNCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7Z29vZGJ5ZSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7V2hhdCB0aGUgaGVsbD8mcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbmRzV2l0aFRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKCZxdW90O2hlbGxvIHRoZXJlJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW5kc1dpdGhUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtzYXkgaGVsbG8gdG8gZnJlZCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW5kc1dpdGhUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyhudWxsKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoVGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90O2dvb2RieWUmcXVvdDssJnF1b3Q7XCZxdW90O2dvb2RieWVcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW5kc1dpdGhUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7V2hhdCB0aGUgaGVsbD8mcXVvdDssJnF1b3Q7XCZxdW90O1doYXQgdGhlIGhlbGw/XCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoVGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90O2hlbGxvIHRoZXJlJnF1b3Q7LCZxdW90O1wmcXVvdDtoZWxsbyB0aGVyZVwmcXVvdDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbmRzV2l0aFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtzYXkgaGVsbG8gdG8gZnJlZCZxdW90OywmcXVvdDtcJnF1b3Q7c2F5IGhlbGxvIHRvIGZyZWRcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW5kc1dpdGhUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7JnF1b3Q7LCZxdW90OyZsdDtzdHJpbmcuRW1wdHkmZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW5kc1dpdGhUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UobnVsbCwmcXVvdDtudWxsJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O2hlbGxvJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW5kc1dpdGhUZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7SSBzYWlkIGhlbGxvJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkVuZHNXaXRoVGVzdElnbm9yaW5nQ2FzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW5kc1dpdGhUZXN0SWdub3JpbmdDYXNlLkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoVGVzdElnbm9yaW5nQ2FzZS5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJTdHJpbmdSZXByZXNlbnRhdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iRmFpbHNXaXRoQmFkVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoVGVzdElnbm9yaW5nQ2FzZS5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7Z29vZGJ5ZSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoVGVzdElnbm9yaW5nQ2FzZS5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7V2hhdCB0aGUgaGVsbD8mcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbmRzV2l0aFRlc3RJZ25vcmluZ0Nhc2UuRmFpbHNXaXRoQmFkVmFsdWVzKCZxdW90O2hlbGxvIHRoZXJlJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW5kc1dpdGhUZXN0SWdub3JpbmdDYXNlLkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtzYXkgaGVsbG8gdG8gZnJlZCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoVGVzdElnbm9yaW5nQ2FzZS5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW5kc1dpdGhUZXN0SWdub3JpbmdDYXNlLkZhaWxzV2l0aEJhZFZhbHVlcyhudWxsKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxNCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoVGVzdElnbm9yaW5nQ2FzZS5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90O2dvb2RieWUmcXVvdDssJnF1b3Q7XCZxdW90O2dvb2RieWVcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW5kc1dpdGhUZXN0SWdub3JpbmdDYXNlLlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7V2hhdCB0aGUgaGVsbD8mcXVvdDssJnF1b3Q7XCZxdW90O1doYXQgdGhlIGhlbGw/XCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoVGVzdElnbm9yaW5nQ2FzZS5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90O2hlbGxvIHRoZXJlJnF1b3Q7LCZxdW90O1wmcXVvdDtoZWxsbyB0aGVyZVwmcXVvdDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FbmRzV2l0aFRlc3RJZ25vcmluZ0Nhc2UuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtzYXkgaGVsbG8gdG8gZnJlZCZxdW90OywmcXVvdDtcJnF1b3Q7c2F5IGhlbGxvIHRvIGZyZWRcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW5kc1dpdGhUZXN0SWdub3JpbmdDYXNlLlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7JnF1b3Q7LCZxdW90OyZsdDtzdHJpbmcuRW1wdHkmZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW5kc1dpdGhUZXN0SWdub3JpbmdDYXNlLlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UobnVsbCwmcXVvdDtudWxsJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVuZHNXaXRoVGVzdElnbm9yaW5nQ2FzZS5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O0hFTExPJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRW5kc1dpdGhUZXN0SWdub3JpbmdDYXNlLlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7SSBzYWlkIEhlbGxvJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkVxdWFsQ29uc3RyYWludFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMjA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuQ2FuTWF0Y2hEYXRlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkNhbk1hdGNoRGF0ZXNXaXRoaW5EYXlzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuQ2FuTWF0Y2hEYXRlc1dpdGhpbkhvdXJzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuQ2FuTWF0Y2hEYXRlc1dpdGhpbk1pbGxpc2Vjb25kcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkNhbk1hdGNoRGF0ZXNXaXRoaW5NaW51dGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuQ2FuTWF0Y2hEYXRlc1dpdGhpblNlY29uZHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5DYW5NYXRjaERhdGVzV2l0aGluVGlja3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5DYW5NYXRjaERhdGVzV2l0aGluVGltZVNwYW4iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkNhbk1hdGNoRG91Ymxlc1dpdGhSZWxhdGl2ZVRvbGVyYW5jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkNhbk1hdGNoRG91Ymxlc1dpdGhSZWxhdGl2ZVRvbGVyYW5jZSgxMDAwMC4wZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuQ2FuTWF0Y2hEb3VibGVzV2l0aFJlbGF0aXZlVG9sZXJhbmNlKDk1MDAuMGQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkNhbk1hdGNoRG91Ymxlc1dpdGhSZWxhdGl2ZVRvbGVyYW5jZSgxMDUwMC4wZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ2FuTWF0Y2hEb3VibGVzV2l0aFVscFRvbGVyYW5jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkNhbk1hdGNoRG91Ymxlc1dpdGhVbHBUb2xlcmFuY2UoMkUrMTYuMGQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkNhbk1hdGNoRG91Ymxlc1dpdGhVbHBUb2xlcmFuY2UoMkUrMTYuMGQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkNhbk1hdGNoU2luZ2xlc1dpdGhSZWxhdGl2ZVRvbGVyYW5jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkNhbk1hdGNoU2luZ2xlc1dpdGhSZWxhdGl2ZVRvbGVyYW5jZSgxMDAwMC4wZikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuQ2FuTWF0Y2hTaW5nbGVzV2l0aFJlbGF0aXZlVG9sZXJhbmNlKDEwNTAwLjBmKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5DYW5NYXRjaFNpbmdsZXNXaXRoUmVsYXRpdmVUb2xlcmFuY2UoOTUwMC4wZikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ2FuTWF0Y2hTaW5nbGVzV2l0aFVscFRvbGVyYW5jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkNhbk1hdGNoU2luZ2xlc1dpdGhVbHBUb2xlcmFuY2UoMkUrMDcuMGYpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkNhbk1hdGNoU2luZ2xlc1dpdGhVbHBUb2xlcmFuY2UoMkUrMDcuMGYpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkNhbk1hdGNoU3BlY2lhbEZsb2F0aW5nUG9pbnRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDExIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5DYW5NYXRjaFNwZWNpYWxGbG9hdGluZ1BvaW50VmFsdWVzKGRvdWJsZS5Qb3NpdGl2ZUluZmluaXR5KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5DYW5NYXRjaFNwZWNpYWxGbG9hdGluZ1BvaW50VmFsdWVzKGZsb2F0Lk5lZ2F0aXZlSW5maW5pdHkpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkNhbk1hdGNoU3BlY2lhbEZsb2F0aW5nUG9pbnRWYWx1ZXMoZmxvYXQuUG9zaXRpdmVJbmZpbml0eSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuQ2FuTWF0Y2hTcGVjaWFsRmxvYXRpbmdQb2ludFZhbHVlcyhkb3VibGUuTmFOKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5DYW5NYXRjaFNwZWNpYWxGbG9hdGluZ1BvaW50VmFsdWVzKGRvdWJsZS5OZWdhdGl2ZUluZmluaXR5KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5DYW5NYXRjaFNwZWNpYWxGbG9hdGluZ1BvaW50VmFsdWVzKGZsb2F0Lk5hTikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkNhbk1hdGNoVGltZVNwYW5XaXRoaW5NaW51dGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJTdHJpbmdSZXByZXNlbnRhdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkVycm9ySWZEYXlzUHJlY2VkZXNXaXRoaW4iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5FcnJvcklmSG91cnNQcmVjZWRlc1dpdGhpbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkVycm9ySWZNaWxsaXNlY29uZHNQcmVjZWRlc1dpdGhpbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkVycm9ySWZNaW51dGVzUHJlY2VkZXNXaXRoaW4iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5FcnJvcklmUGVyY2VudFByZWNlZGVzV2l0aGluIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuRXJyb3JJZlNlY29uZHNQcmVjZWRlc1dpdGhpbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkVycm9ySWZUaWNrc1ByZWNlZGVzV2l0aGluIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuRXJyb3JJZlVscHNJc1VzZWRPbkRlY2ltYWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkVycm9ySWZVbHBzSXNVc2VkT25JbnRlZ3JhbFR5cGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA5IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5FcnJvcklmVWxwc0lzVXNlZE9uSW50ZWdyYWxUeXBlKDEwMDAsMTAxMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuRXJyb3JJZlVscHNJc1VzZWRPbkludGVncmFsVHlwZSgxMDAwVUwsMTAxMFVMKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5FcnJvcklmVWxwc0lzVXNlZE9uSW50ZWdyYWxUeXBlKDEwMDAsMTAxMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuRXJyb3JJZlVscHNJc1VzZWRPbkludGVncmFsVHlwZSgxMDAwTCwxMDEwTCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkVycm9ySWZVbHBzUHJlY2VkZXNXaXRoaW4iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5FcnJvcldpdGhQZXJjZW50QW5kVWxwc1RvbGVyYW5jZU1vZGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuRXJyb3JXaXRoVWxwc0FuZFBlcmNlbnRUb2xlcmFuY2VNb2RlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iRmFpbHNPbkRvdWJsZXNPdXRzaWRlT2ZSZWxhdGl2ZVRvbGVyYW5jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkZhaWxzT25Eb3VibGVzT3V0c2lkZU9mUmVsYXRpdmVUb2xlcmFuY2UoMTE1MDAuMGQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkZhaWxzT25Eb3VibGVzT3V0c2lkZU9mUmVsYXRpdmVUb2xlcmFuY2UoODUwMC4wZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iRmFpbHNPbkRvdWJsZXNPdXRzaWRlT2ZVbHBUb2xlcmFuY2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5GYWlsc09uRG91Ymxlc091dHNpZGVPZlVscFRvbGVyYW5jZSgyRSsxNi4wZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuRmFpbHNPbkRvdWJsZXNPdXRzaWRlT2ZVbHBUb2xlcmFuY2UoMkUrMTYuMGQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzT25TaW5nbGVzT3V0c2lkZU9mUmVsYXRpdmVUb2xlcmFuY2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5GYWlsc09uU2luZ2xlc091dHNpZGVPZlJlbGF0aXZlVG9sZXJhbmNlKDg1MDAuMGYpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkZhaWxzT25TaW5nbGVzT3V0c2lkZU9mUmVsYXRpdmVUb2xlcmFuY2UoMTE1MDAuMGYpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzT25TaW5nbGVzT3V0c2lkZU9mVWxwVG9sZXJhbmNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuRmFpbHNPblNpbmdsZXNPdXRzaWRlT2ZVbHBUb2xlcmFuY2UoMkUrMDcuMGYpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkZhaWxzT25TaW5nbGVzT3V0c2lkZU9mVWxwVG9sZXJhbmNlKDJFKzA3LjBmKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJGYWlsc1dpdGhCYWRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA5IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoNSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKG51bGwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtIZWxsbyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKGRvdWJsZS5OYU4pIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyhkb3VibGUuUG9zaXRpdmVJbmZpbml0eSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoNSwmcXVvdDs1JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKG51bGwsJnF1b3Q7bnVsbCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtIZWxsbyZxdW90OywmcXVvdDtcJnF1b3Q7SGVsbG9cJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKGRvdWJsZS5OYU4sJnF1b3Q7TmFOJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKGRvdWJsZS5Qb3NpdGl2ZUluZmluaXR5LCZxdW90O0luZmluaXR5JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcyg0KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKDQuMGYpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoNC4wZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcyg0LjAwMDBtKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuVXNlc1Byb3ZpZGVkQ29tcGFyZXJPZlQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5Vc2VzUHJvdmlkZWRDb21wYXJpc29uT2ZUIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsQ29uc3RyYWludFRlc3QuVXNlc1Byb3ZpZGVkRXF1YWxpdHlDb21wYXJlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbENvbnN0cmFpbnRUZXN0LlVzZXNQcm92aWRlZEVxdWFsaXR5Q29tcGFyZXJPZlQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxDb25zdHJhaW50VGVzdC5Vc2VzUHJvdmlkZWRJQ29tcGFyZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRXF1YWxpdHlDb21wYXJlclRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbGl0eUNvbXBhcmVyVGVzdHMuQ2FuQ29tcGFyZUFycmF5Q29udGFpbmluZ1NlbGZUb1NlbGYiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRXF1YWxUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbFRlc3QuRmFpbGVkU3RyaW5nTWF0Y2hTaG93c0ZhaWx1cmVQb3NpdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbFRlc3QuTG9uZ1N0cmluZ3NBcmVUcnVuY2F0ZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXF1YWxUZXN0LkxvbmdTdHJpbmdzQXJlVHJ1bmNhdGVkQXRCb3RoRW5kc0lmTmVjZXNzYXJ5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkVxdWFsVGVzdC5Mb25nU3RyaW5nc0FyZVRydW5jYXRlZEF0RnJvbnRFbmRJZk5lY2Vzc2FyeSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FcXVhbFRlc3QuVGVzdFByb3BlcnR5V2l0aFByaXZhdGVTZXR0ZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRXhhY3RUeXBlVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXhhY3RUeXBlVGVzdC5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJEZXNjcmlwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FeGFjdFR5cGVUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlclN0cmluZ1JlcHJlc2VudGF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJGYWlsc1dpdGhCYWRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXhhY3RUeXBlVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkIpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FeGFjdFR5cGVUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRDIpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRXhhY3RUeXBlVGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5CLCZxdW90OyZsdDtOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQiZndDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5FeGFjdFR5cGVUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkQyLCZxdW90OyZsdDtOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRDImZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkV4YWN0VHlwZVRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRDEpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRmFsc2VDb25zdHJhaW50VGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRmFsc2VDb25zdHJhaW50VGVzdC5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJEZXNjcmlwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5GYWxzZUNvbnN0cmFpbnRUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlclN0cmluZ1JlcHJlc2VudGF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJGYWlsc1dpdGhCYWRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRmFsc2VDb25zdHJhaW50VGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMobnVsbCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkZhbHNlQ29uc3RyYWludFRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKCZxdW90O2hlbGxvJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRmFsc2VDb25zdHJhaW50VGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoVHJ1ZSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkZhbHNlQ29uc3RyYWludFRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKFRydWUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRmFsc2VDb25zdHJhaW50VGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKG51bGwsJnF1b3Q7bnVsbCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkZhbHNlQ29uc3RyYWludFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtoZWxsbyZxdW90OywmcXVvdDtcJnF1b3Q7aGVsbG9cJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRmFsc2VDb25zdHJhaW50VGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKFRydWUsJnF1b3Q7VHJ1ZSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkZhbHNlQ29uc3RyYWludFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZShUcnVlLCZxdW90O1RydWUmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRmFsc2VDb25zdHJhaW50VGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKEZhbHNlKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuRmFsc2VDb25zdHJhaW50VGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKEZhbHNlKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkZsb2F0aW5nUG9pbnROdW1lcmljc1Rlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE1IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkZsb2F0aW5nUG9pbnROdW1lcmljc1Rlc3QuRG91YmxlRXF1YWxpdHlXaXRoVWxwcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5GbG9hdGluZ1BvaW50TnVtZXJpY3NUZXN0LkZsb2F0RXF1YWxpdHlXaXRoVWxwcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5GbG9hdGluZ1BvaW50TnVtZXJpY3NUZXN0Lk1pcnJvcmVkRG91YmxlUmVpbnRlcnByZXRhdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5GbG9hdGluZ1BvaW50TnVtZXJpY3NUZXN0Lk1pcnJvcmVkRmxvYXRSZWludGVycHJldGF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkZsb2F0aW5nUG9pbnROdW1lcmljc1Rlc3QuTWlycm9yZWRJbnRlZ2VyUmVpbnRlcnByZXRhdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5GbG9hdGluZ1BvaW50TnVtZXJpY3NUZXN0Lk1pcnJvcmVkTG9uZ1JlaW50ZXJwcmV0YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iR3JlYXRlclRoYW5PckVxdWFsVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuR3JlYXRlclRoYW5PckVxdWFsVGVzdC5DYW5Db21wYXJlSUNvbXBhcmFibGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuT3JFcXVhbFRlc3QuQ2FuQ29tcGFyZUlDb21wYXJhYmxlc09mVCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5HcmVhdGVyVGhhbk9yRXF1YWxUZXN0LkNvbXBhcmlzb25Db25zdHJhaW50VGVzdC5Vc2VzUHJvdmlkZWRDb21wYXJlck9mVCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5HcmVhdGVyVGhhbk9yRXF1YWxUZXN0LkNvbXBhcmlzb25Db25zdHJhaW50VGVzdC5Vc2VzUHJvdmlkZWRDb21wYXJpc29uT2ZUIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuT3JFcXVhbFRlc3QuQ29tcGFyaXNvbkNvbnN0cmFpbnRUZXN0LlVzZXNQcm92aWRlZElDb21wYXJlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5HcmVhdGVyVGhhbk9yRXF1YWxUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuT3JFcXVhbFRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5HcmVhdGVyVGhhbk9yRXF1YWxUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyg0KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJJbnZhbGlkRGF0YVRocm93c0FyZ3VtZW50RXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuT3JFcXVhbFRlc3QuSW52YWxpZERhdGFUaHJvd3NBcmd1bWVudEV4Y2VwdGlvbihudWxsKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuR3JlYXRlclRoYW5PckVxdWFsVGVzdC5JbnZhbGlkRGF0YVRocm93c0FyZ3VtZW50RXhjZXB0aW9uKCZxdW90O3h4eCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5HcmVhdGVyVGhhbk9yRXF1YWxUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoNCwmcXVvdDs0JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuT3JFcXVhbFRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcyg2KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuR3JlYXRlclRoYW5PckVxdWFsVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKDUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iR3JlYXRlclRoYW5UZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5HcmVhdGVyVGhhblRlc3QuQ2FuQ29tcGFyZUlDb21wYXJhYmxlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5HcmVhdGVyVGhhblRlc3QuQ2FuQ29tcGFyZUlDb21wYXJhYmxlc09mVCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5HcmVhdGVyVGhhblRlc3QuQ29tcGFyaXNvbkNvbnN0cmFpbnRUZXN0LlVzZXNQcm92aWRlZENvbXBhcmVyT2ZUIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuVGVzdC5Db21wYXJpc29uQ29uc3RyYWludFRlc3QuVXNlc1Byb3ZpZGVkQ29tcGFyaXNvbk9mVCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5HcmVhdGVyVGhhblRlc3QuQ29tcGFyaXNvbkNvbnN0cmFpbnRUZXN0LlVzZXNQcm92aWRlZElDb21wYXJlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5HcmVhdGVyVGhhblRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuR3JlYXRlclRoYW5UZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlclN0cmluZ1JlcHJlc2VudGF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJGYWlsc1dpdGhCYWRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuR3JlYXRlclRoYW5UZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyg0KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuR3JlYXRlclRoYW5UZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyg1KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJJbnZhbGlkRGF0YVRocm93c0FyZ3VtZW50RXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuVGVzdC5JbnZhbGlkRGF0YVRocm93c0FyZ3VtZW50RXhjZXB0aW9uKG51bGwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5HcmVhdGVyVGhhblRlc3QuSW52YWxpZERhdGFUaHJvd3NBcmd1bWVudEV4Y2VwdGlvbigmcXVvdDt4eHgmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuR3JlYXRlclRoYW5UZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoNCwmcXVvdDs0JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuR3JlYXRlclRoYW5UZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoNSwmcXVvdDs1JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKDYpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5HcmVhdGVyVGhhblRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcyg1LjAwMWQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iSW5zdGFuY2VPZlR5cGVUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JbnN0YW5jZU9mVHlwZVRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSW5zdGFuY2VPZlR5cGVUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlclN0cmluZ1JlcHJlc2VudGF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJGYWlsc1dpdGhCYWRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSW5zdGFuY2VPZlR5cGVUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JbnN0YW5jZU9mVHlwZVRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZShOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuQiwmcXVvdDsmbHQ7TlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkImZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkluc3RhbmNlT2ZUeXBlVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5EMSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkluc3RhbmNlT2ZUeXBlVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5EMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJMZXNzVGhhbk9yRXF1YWxUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5MZXNzVGhhbk9yRXF1YWxUZXN0LkNhbkNvbXBhcmVJQ29tcGFyYWJsZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTGVzc1RoYW5PckVxdWFsVGVzdC5DYW5Db21wYXJlSUNvbXBhcmFibGVzT2ZUIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkxlc3NUaGFuT3JFcXVhbFRlc3QuQ29tcGFyaXNvbkNvbnN0cmFpbnRUZXN0LlVzZXNQcm92aWRlZENvbXBhcmVyT2ZUIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkxlc3NUaGFuT3JFcXVhbFRlc3QuQ29tcGFyaXNvbkNvbnN0cmFpbnRUZXN0LlVzZXNQcm92aWRlZENvbXBhcmlzb25PZlQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTGVzc1RoYW5PckVxdWFsVGVzdC5Db21wYXJpc29uQ29uc3RyYWludFRlc3QuVXNlc1Byb3ZpZGVkSUNvbXBhcmVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkxlc3NUaGFuT3JFcXVhbFRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTGVzc1RoYW5PckVxdWFsVGVzdC5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJTdHJpbmdSZXByZXNlbnRhdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iRmFpbHNXaXRoQmFkVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkxlc3NUaGFuT3JFcXVhbFRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKDYpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkludmFsaWREYXRhVGhyb3dzQXJndW1lbnRFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTGVzc1RoYW5PckVxdWFsVGVzdC5JbnZhbGlkRGF0YVRocm93c0FyZ3VtZW50RXhjZXB0aW9uKG51bGwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5MZXNzVGhhbk9yRXF1YWxUZXN0LkludmFsaWREYXRhVGhyb3dzQXJndW1lbnRFeGNlcHRpb24oJnF1b3Q7eHh4JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkxlc3NUaGFuT3JFcXVhbFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSg2LCZxdW90OzYmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTGVzc1RoYW5PckVxdWFsVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKDQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5MZXNzVGhhbk9yRXF1YWxUZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoNSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJMZXNzVGhhblRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDM4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkxlc3NUaGFuVGVzdC5DYW5Db21wYXJlSUNvbXBhcmFibGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkxlc3NUaGFuVGVzdC5DYW5Db21wYXJlSUNvbXBhcmFibGVzT2ZUIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkxlc3NUaGFuVGVzdC5Db21wYXJpc29uQ29uc3RyYWludFRlc3QuVXNlc1Byb3ZpZGVkQ29tcGFyZXJPZlQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTGVzc1RoYW5UZXN0LkNvbXBhcmlzb25Db25zdHJhaW50VGVzdC5Vc2VzUHJvdmlkZWRDb21wYXJpc29uT2ZUIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkxlc3NUaGFuVGVzdC5Db21wYXJpc29uQ29uc3RyYWludFRlc3QuVXNlc1Byb3ZpZGVkSUNvbXBhcmVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkxlc3NUaGFuVGVzdC5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJEZXNjcmlwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5MZXNzVGhhblRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5MZXNzVGhhblRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKDYpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5MZXNzVGhhblRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKDUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkludmFsaWREYXRhVGhyb3dzQXJndW1lbnRFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTGVzc1RoYW5UZXN0LkludmFsaWREYXRhVGhyb3dzQXJndW1lbnRFeGNlcHRpb24obnVsbCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkxlc3NUaGFuVGVzdC5JbnZhbGlkRGF0YVRocm93c0FyZ3VtZW50RXhjZXB0aW9uKCZxdW90O3h4eCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5MZXNzVGhhblRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSg2LCZxdW90OzYmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5MZXNzVGhhblRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSg1LCZxdW90OzUmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTGVzc1RoYW5UZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoNCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkxlc3NUaGFuVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKDQuOTk5ZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJNc2dVdGlsVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDY1IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxUZXN0cy5DbGlwRXhwZWN0ZWRBbmRBY3R1YWxfU3RyaW5nc0RvTm90Rml0SW5MaW5lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxUZXN0cy5DbGlwRXhwZWN0ZWRBbmRBY3R1YWxfU3RyaW5nc0ZpdEluTGluZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Nc2dVdGlsVGVzdHMuQ2xpcEV4cGVjdGVkQW5kQWN0dWFsX1N0cmluZ1RhaWxzRml0SW5MaW5lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJFc2NhcGVDb250cm9sQ2hhcnNUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA0NiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxUZXN0cy5Fc2NhcGVDb250cm9sQ2hhcnNUZXN0KCZxdW90O1xhJnF1b3Q7LCZxdW90O1xcYSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxUZXN0cy5Fc2NhcGVDb250cm9sQ2hhcnNUZXN0KCZxdW90O1xyXHJcciZxdW90OywmcXVvdDtcXHJcXHJcXHImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Nc2dVdGlsVGVzdHMuRXNjYXBlQ29udHJvbENoYXJzVGVzdCgmcXVvdDtcclxuJnF1b3Q7LCZxdW90O1xcclxcbiZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxUZXN0cy5Fc2NhcGVDb250cm9sQ2hhcnNUZXN0KCZxdW90O1xuXHImcXVvdDssJnF1b3Q7XFxuXFxyJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTXNnVXRpbFRlc3RzLkVzY2FwZUNvbnRyb2xDaGFyc1Rlc3QoJnF1b3Q7VGhpcyBpcyBhXHJ0ZXN0IG1lc3NhZ2UmcXVvdDssJnF1b3Q7VGhpcyBpcyBhXFxydGVzdCBtZXNzYWdlJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTXNnVXRpbFRlc3RzLkVzY2FwZUNvbnRyb2xDaGFyc1Rlc3QoJnF1b3Q7JnF1b3Q7LCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxUZXN0cy5Fc2NhcGVDb250cm9sQ2hhcnNUZXN0KG51bGwsbnVsbCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxUZXN0cy5Fc2NhcGVDb250cm9sQ2hhcnNUZXN0KCZxdW90O1x0JnF1b3Q7LCZxdW90O1xcdCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxUZXN0cy5Fc2NhcGVDb250cm9sQ2hhcnNUZXN0KCZxdW90O1x0XG4mcXVvdDssJnF1b3Q7XFx0XFxuJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTXNnVXRpbFRlc3RzLkVzY2FwZUNvbnRyb2xDaGFyc1Rlc3QoJnF1b3Q7XFxyXFxuJnF1b3Q7LCZxdW90O1xcXFxyXFxcXG4mcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Nc2dVdGlsVGVzdHMuRXNjYXBlQ29udHJvbENoYXJzVGVzdCgmcXVvdDtcbiZxdW90OywmcXVvdDtcXG4mcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Nc2dVdGlsVGVzdHMuRXNjYXBlQ29udHJvbENoYXJzVGVzdCgmcXVvdDtcYiZxdW90OywmcXVvdDtcXGImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Nc2dVdGlsVGVzdHMuRXNjYXBlQ29udHJvbENoYXJzVGVzdCgmcXVvdDtcZiZxdW90OywmcXVvdDtcXGYmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Nc2dVdGlsVGVzdHMuRXNjYXBlQ29udHJvbENoYXJzVGVzdCgmcXVvdDtcdiZxdW90OywmcXVvdDtcXHYmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Nc2dVdGlsVGVzdHMuRXNjYXBlQ29udHJvbENoYXJzVGVzdCgmcXVvdDtceDAwODUmcXVvdDssJnF1b3Q7XFx4MDA4NSZxdW90OykiIGRlc2NyaXB0aW9uPSJOZXh0IGxpbmUgY2hhcmFjdGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Nc2dVdGlsVGVzdHMuRXNjYXBlQ29udHJvbENoYXJzVGVzdCgmcXVvdDtceDIwMjgmcXVvdDssJnF1b3Q7XFx4MjAyOCZxdW90OykiIGRlc2NyaXB0aW9uPSJMaW5lIHNlcGFyYXRvciBjaGFyYWN0ZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxUZXN0cy5Fc2NhcGVDb250cm9sQ2hhcnNUZXN0KCZxdW90O1x4MjAyOSZxdW90OywmcXVvdDtcXHgyMDI5JnF1b3Q7KSIgZGVzY3JpcHRpb249IlBhcmFncmFwaCBzZXBhcmF0b3IgY2hhcmFjdGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Nc2dVdGlsVGVzdHMuRXNjYXBlQ29udHJvbENoYXJzVGVzdCgmcXVvdDtcblxuJnF1b3Q7LCZxdW90O1xcblxcbiZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxUZXN0cy5Fc2NhcGVDb250cm9sQ2hhcnNUZXN0KCZxdW90O1xuXG5cbiZxdW90OywmcXVvdDtcXG5cXG5cXG4mcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Nc2dVdGlsVGVzdHMuRXNjYXBlQ29udHJvbENoYXJzVGVzdCgmcXVvdDtcciZxdW90OywmcXVvdDtcXHImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Nc2dVdGlsVGVzdHMuRXNjYXBlQ29udHJvbENoYXJzVGVzdCgmcXVvdDtcclxyJnF1b3Q7LCZxdW90O1xcclxcciZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iVGVzdENsaXBTdHJpbmciIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTXNnVXRpbFRlc3RzLkNsaXBBdEVuZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTXNnVXRpbFRlc3RzLk5vQ2xpcHBpbmdOZWVkZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk1zZ1V0aWxUZXN0cy5DbGlwQXRTdGFydCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTXNnVXRpbFRlc3RzLkNsaXBBdFN0YXJ0QW5kRW5kIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTmFOQ29uc3RyYWludFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDQyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5hTkNvbnN0cmFpbnRUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5hTkNvbnN0cmFpbnRUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlclN0cmluZ1JlcHJlc2VudGF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJGYWlsc1dpdGhCYWRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTmFOQ29uc3RyYWludFRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKG51bGwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OYU5Db25zdHJhaW50VGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7aGVsbG8mcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OYU5Db25zdHJhaW50VGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoNDIpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OYU5Db25zdHJhaW50VGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoZG91YmxlLlBvc2l0aXZlSW5maW5pdHkpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OYU5Db25zdHJhaW50VGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoZG91YmxlLk5lZ2F0aXZlSW5maW5pdHkpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OYU5Db25zdHJhaW50VGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoZmxvYXQuUG9zaXRpdmVJbmZpbml0eSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5hTkNvbnN0cmFpbnRUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyhmbG9hdC5OZWdhdGl2ZUluZmluaXR5KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5hTkNvbnN0cmFpbnRUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UobnVsbCwmcXVvdDtudWxsJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTmFOQ29uc3RyYWludFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtoZWxsbyZxdW90OywmcXVvdDtcJnF1b3Q7aGVsbG9cJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTmFOQ29uc3RyYWludFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSg0MiwmcXVvdDs0MiZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5hTkNvbnN0cmFpbnRUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoZG91YmxlLlBvc2l0aXZlSW5maW5pdHksJnF1b3Q7SW5maW5pdHkmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OYU5Db25zdHJhaW50VGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKGRvdWJsZS5OZWdhdGl2ZUluZmluaXR5LCZxdW90Oy1JbmZpbml0eSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5hTkNvbnN0cmFpbnRUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoZmxvYXQuUG9zaXRpdmVJbmZpbml0eSwmcXVvdDtJbmZpbml0eSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5hTkNvbnN0cmFpbnRUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoZmxvYXQuTmVnYXRpdmVJbmZpbml0eSwmcXVvdDstSW5maW5pdHkmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTmFOQ29uc3RyYWludFRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcyhkb3VibGUuTmFOKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTmFOQ29uc3RyYWludFRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcyhmbG9hdC5OYU4pIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTm90VGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTm90VGVzdC5DYW5Vc2VOb3RPcGVyYXRvciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ob3RUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5vdFRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ob3RUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyhudWxsKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5vdFRlc3QuTm90SG9ub3JzSWdub3JlQ2FzZVVzaW5nQ29uc3RydWN0b3JzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk5vdFRlc3QuTm90SG9ub3JzSWdub3JlQ2FzZVVzaW5nUHJlZml4Tm90YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTm90VGVzdC5Ob3RIb25vcnNUb2xlcmFuY2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTm90VGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKG51bGwsJnF1b3Q7bnVsbCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3VjY2VlZHNXaXRoR29vZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ob3RUZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoNDIpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ob3RUZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7SGVsbG8mcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTnVsbENvbnN0cmFpbnRUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdWxsQ29uc3RyYWludFRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVsbENvbnN0cmFpbnRUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlclN0cmluZ1JlcHJlc2VudGF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJGYWlsc1dpdGhCYWRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVsbENvbnN0cmFpbnRUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtoZWxsbyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdWxsQ29uc3RyYWludFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtoZWxsbyZxdW90OywmcXVvdDtcJnF1b3Q7aGVsbG9cJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bGxDb25zdHJhaW50VGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKG51bGwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTnVsbE9yRW1wdHlTdHJpbmdDb25zdHJhaW50VGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVsbE9yRW1wdHlTdHJpbmdDb25zdHJhaW50VGVzdC5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJEZXNjcmlwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdWxsT3JFbXB0eVN0cmluZ0NvbnN0cmFpbnRUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlclN0cmluZ1JlcHJlc2VudGF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJGYWlsc1dpdGhCYWRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVsbE9yRW1wdHlTdHJpbmdDb25zdHJhaW50VGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7SGVsbG8mcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkludmFsaWREYXRhVGhyb3dzQXJndW1lbnRFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVsbE9yRW1wdHlTdHJpbmdDb25zdHJhaW50VGVzdC5JbnZhbGlkRGF0YVRocm93c0FyZ3VtZW50RXhjZXB0aW9uKDUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVsbE9yRW1wdHlTdHJpbmdDb25zdHJhaW50VGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90O0hlbGxvJnF1b3Q7LCZxdW90O1wmcXVvdDtIZWxsb1wmcXVvdDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVsbE9yRW1wdHlTdHJpbmdDb25zdHJhaW50VGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bGxPckVtcHR5U3RyaW5nQ29uc3RyYWludFRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcyhudWxsKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9Ik51bWVyaWNzVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNzkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVtZXJpY3NUZXN0LkNhbk1hdGNoRGVjaW1hbFdpdGhvdXRUb2xlcmFuY2VNb2RlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzVGVzdC5DYW5NYXRjaERlY2ltYWxXaXRoUGVyY2VudGFnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ2FuTWF0Y2hJbnRlZ3JhbHNXaXRoUGVyY2VudGFnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdW1lcmljc1Rlc3QuQ2FuTWF0Y2hJbnRlZ3JhbHNXaXRoUGVyY2VudGFnZSgxMDUwMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzVGVzdC5DYW5NYXRjaEludGVncmFsc1dpdGhQZXJjZW50YWdlKDk1MDBMKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVtZXJpY3NUZXN0LkNhbk1hdGNoSW50ZWdyYWxzV2l0aFBlcmNlbnRhZ2UoMTA1MDBVTCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzVGVzdC5DYW5NYXRjaEludGVncmFsc1dpdGhQZXJjZW50YWdlKDk1MDBVTCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzVGVzdC5DYW5NYXRjaEludGVncmFsc1dpdGhQZXJjZW50YWdlKDEwMDAwTCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzVGVzdC5DYW5NYXRjaEludGVncmFsc1dpdGhQZXJjZW50YWdlKDEwMDAwVUwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdW1lcmljc1Rlc3QuQ2FuTWF0Y2hJbnRlZ3JhbHNXaXRoUGVyY2VudGFnZSgxMDUwMEwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdW1lcmljc1Rlc3QuQ2FuTWF0Y2hJbnRlZ3JhbHNXaXRoUGVyY2VudGFnZSgxMDAwMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzVGVzdC5DYW5NYXRjaEludGVncmFsc1dpdGhQZXJjZW50YWdlKDk1MDApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdW1lcmljc1Rlc3QuQ2FuTWF0Y2hJbnRlZ3JhbHNXaXRoUGVyY2VudGFnZSgxMDUwMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzVGVzdC5DYW5NYXRjaEludGVncmFsc1dpdGhQZXJjZW50YWdlKDk1MDApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdW1lcmljc1Rlc3QuQ2FuTWF0Y2hJbnRlZ3JhbHNXaXRoUGVyY2VudGFnZSgxMDAwMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ2FuTWF0Y2hXaXRob3V0VG9sZXJhbmNlTW9kZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdW1lcmljc1Rlc3QuQ2FuTWF0Y2hXaXRob3V0VG9sZXJhbmNlTW9kZSgxMjM0NTY3ODkpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdW1lcmljc1Rlc3QuQ2FuTWF0Y2hXaXRob3V0VG9sZXJhbmNlTW9kZSgxMjM0NTY3ODlVTCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzVGVzdC5DYW5NYXRjaFdpdGhvdXRUb2xlcmFuY2VNb2RlKDEyMzQ1Njc4OUwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdW1lcmljc1Rlc3QuQ2FuTWF0Y2hXaXRob3V0VG9sZXJhbmNlTW9kZSgxMjM0NTY3ODkpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdW1lcmljc1Rlc3QuQ2FuTWF0Y2hXaXRob3V0VG9sZXJhbmNlTW9kZSgxMjM0LjU2OGYpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdW1lcmljc1Rlc3QuQ2FuTWF0Y2hXaXRob3V0VG9sZXJhbmNlTW9kZSgxMjM0LjU2NzhkKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzVGVzdC5GYWlsc09uRGVjaW1hbEFib3ZlUGVyY2VudGFnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5OdW1lcmljc1Rlc3QuRmFpbHNPbkRlY2ltYWxCZWxvd1BlcmNlbnRhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzT25JbnRlZ3JhbHNPdXRzaWRlT2ZQZXJjZW50YWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzVGVzdC5GYWlsc09uSW50ZWdyYWxzT3V0c2lkZU9mUGVyY2VudGFnZSg4NTAwKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVtZXJpY3NUZXN0LkZhaWxzT25JbnRlZ3JhbHNPdXRzaWRlT2ZQZXJjZW50YWdlKDg1MDBVTCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzVGVzdC5GYWlsc09uSW50ZWdyYWxzT3V0c2lkZU9mUGVyY2VudGFnZSgxMTUwMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzVGVzdC5GYWlsc09uSW50ZWdyYWxzT3V0c2lkZU9mUGVyY2VudGFnZSgxMTUwMFVMKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVtZXJpY3NUZXN0LkZhaWxzT25JbnRlZ3JhbHNPdXRzaWRlT2ZQZXJjZW50YWdlKDg1MDBMKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVtZXJpY3NUZXN0LkZhaWxzT25JbnRlZ3JhbHNPdXRzaWRlT2ZQZXJjZW50YWdlKDExNTAwKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuTnVtZXJpY3NUZXN0LkZhaWxzT25JbnRlZ3JhbHNPdXRzaWRlT2ZQZXJjZW50YWdlKDExNTAwTCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk51bWVyaWNzVGVzdC5GYWlsc09uSW50ZWdyYWxzT3V0c2lkZU9mUGVyY2VudGFnZSg4NTAwKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9Ik9yVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuT3JUZXN0LkNhbkNvbWJpbmVUZXN0c1dpdGhPck9wZXJhdG9yIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk9yVGVzdC5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJEZXNjcmlwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5PclRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5PclRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKDM3KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk9yVGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKDM3LCZxdW90OzM3JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLk9yVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKDk5KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuT3JUZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoNDIpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUHJvcGVydHlFeGlzdHNUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzMiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eUV4aXN0c1Rlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJvcGVydHlFeGlzdHNUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlclN0cmluZ1JlcHJlc2VudGF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJGYWlsc1dpdGhCYWRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJvcGVydHlFeGlzdHNUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyg0MikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByb3BlcnR5RXhpc3RzVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByb3BlcnR5RXhpc3RzVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoU3lzdGVtLkludDMyKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJJbnZhbGlkRGF0YVRocm93c0V4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eUV4aXN0c1Rlc3QuSW52YWxpZERhdGFUaHJvd3NFeGNlcHRpb24obnVsbCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eUV4aXN0c1Rlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSg0MiwmcXVvdDsmbHQ7U3lzdGVtLkludDMyJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByb3BlcnR5RXhpc3RzVGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QsJnF1b3Q7Jmx0O1N5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QmZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJvcGVydHlFeGlzdHNUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoU3lzdGVtLkludDMyLCZxdW90OyZsdDtTeXN0ZW0uSW50MzImZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByb3BlcnR5RXhpc3RzVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKFN5c3RlbS5JbnQzMltdKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJvcGVydHlFeGlzdHNUZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7aGVsbG8mcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eUV4aXN0c1Rlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcyhTeXN0ZW0uQXJyYXkpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUHJvcGVydHlUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzNSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eVRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJvcGVydHlUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlclN0cmluZ1JlcHJlc2VudGF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJGYWlsc1dpdGhCYWRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJvcGVydHlUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyhTeXN0ZW0uSW50MzJbXSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByb3BlcnR5VGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7Z29vZGJ5ZSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iSW52YWxpZERhdGFUaHJvd3NFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJvcGVydHlUZXN0LkludmFsaWREYXRhVGhyb3dzRXhjZXB0aW9uKG51bGwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eVRlc3QuSW52YWxpZERhdGFUaHJvd3NFeGNlcHRpb24oNDIpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eVRlc3QuSW52YWxpZERhdGFUaHJvd3NFeGNlcHRpb24oU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eVRlc3QuUHJvcGVydHlFcXVhbFRvVmFsdWVXaXRoVG9sZXJhbmNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlByb3BlcnR5VGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKFN5c3RlbS5JbnQzMltdLCZxdW90OzMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eVRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtnb29kYnllJnF1b3Q7LCZxdW90OzcmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUHJvcGVydHlUZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoU3lzdGVtLkludDMyW10pIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Qcm9wZXJ0eVRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDtoZWxsbyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJSYW5nZUNvbnN0cmFpbnRUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SYW5nZUNvbnN0cmFpbnRUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlJhbmdlQ29uc3RyYWludFRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SYW5nZUNvbnN0cmFpbnRUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyg0KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmFuZ2VDb25zdHJhaW50VGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoNDMpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkludmFsaWREYXRhVGhyb3dzQXJndW1lbnRFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmFuZ2VDb25zdHJhaW50VGVzdC5JbnZhbGlkRGF0YVRocm93c0FyZ3VtZW50RXhjZXB0aW9uKG51bGwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SYW5nZUNvbnN0cmFpbnRUZXN0LkludmFsaWREYXRhVGhyb3dzQXJndW1lbnRFeGNlcHRpb24oJnF1b3Q7eHh4JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlJhbmdlQ29uc3RyYWludFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSg0LCZxdW90OzQmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SYW5nZUNvbnN0cmFpbnRUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoNDMsJnF1b3Q7NDMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmFuZ2VDb25zdHJhaW50VGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKDUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SYW5nZUNvbnN0cmFpbnRUZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoMjMpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SYW5nZUNvbnN0cmFpbnRUZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoNDIpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmFuZ2VDb25zdHJhaW50VGVzdC5Vc2VzUHJvdmlkZWRDb21wYXJlck9mVCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SYW5nZUNvbnN0cmFpbnRUZXN0LlVzZXNQcm92aWRlZENvbXBhcmlzb25PZlQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmFuZ2VDb25zdHJhaW50VGVzdC5Vc2VzUHJvdmlkZWRJQ29tcGFyZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUmV1c2FibGVDb25zdHJhaW50VGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlJldXNhYmxlQ29uc3RyYWludFRlc3RzLkNhbkNyZWF0ZVJldXNhYmxlQ29uc3RyYWludEJ5SW1wbGljaXRDb252ZXJzaW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRoZW9yeSIgbmFtZT0iQ2FuUmV1c2VSZXVzYWJsZUNvbnN0cmFpbnRNdWx0aXBsZVRpbWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlJldXNhYmxlQ29uc3RyYWludFRlc3RzLkNhblJldXNlUmV1c2FibGVDb25zdHJhaW50TXVsdGlwbGVUaW1lcygmbHQ7bm90ICZsdDtlbXB0eSZndDsmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuUmV1c2FibGVDb25zdHJhaW50VGVzdHMuQ2FuUmV1c2VSZXVzYWJsZUNvbnN0cmFpbnRNdWx0aXBsZVRpbWVzKCZsdDtub3QgJmx0O251bGwmZ3Q7Jmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlJldXNhYmxlQ29uc3RyYWludFRlc3RzLkNhblJldXNlUmV1c2FibGVDb25zdHJhaW50TXVsdGlwbGVUaW1lcygmbHQ7cHJvcGVydHkgTGVuZ3RoICZsdDtncmVhdGVydGhhbiAzJmd0OyZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5SZXVzYWJsZUNvbnN0cmFpbnRUZXN0cy5DYW5SZXVzZVJldXNhYmxlQ29uc3RyYWludE11bHRpcGxlVGltZXMoJmx0O2FuZCAmbHQ7cHJvcGVydHkgTGVuZ3RoICZsdDtlcXVhbCA0Jmd0OyZndDsgJmx0O3N0YXJ0c3dpdGggJnF1b3Q7dGUmcXVvdDsmZ3Q7Jmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTYW1lQXNUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyMiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lQXNUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVBc1Rlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lQXNUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyhTeXN0ZW0uT2JqZWN0KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZUFzVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoMykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVBc1Rlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKCZxdW90O0hlbGxvJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVBc1Rlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZShTeXN0ZW0uT2JqZWN0LCZxdW90OyZsdDtTeXN0ZW0uT2JqZWN0Jmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVBc1Rlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgzLCZxdW90OzMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lQXNUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7SGVsbG8mcXVvdDssJnF1b3Q7XCZxdW90O0hlbGxvXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3VjY2VlZHNXaXRoR29vZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lQXNUZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoU3lzdGVtLk9iamVjdCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTYW1lUGF0aE9yVW5kZXJUZXN0X0xpbnV4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA2MiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X0xpbnV4LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoT3JVbmRlclRlc3RfTGludXguQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X0xpbnV4LkZhaWxzV2l0aEJhZFZhbHVlcygxMjMpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X0xpbnV4LkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDsvRm9sZGVyMS9Gb2xkZXIyJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyVGVzdF9MaW51eC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7L0ZPTERFUjEvLi9qdW5rLy4uL0ZvbGRlcjImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X0xpbnV4LkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDsvRk9MREVSMS8uL2p1bmsvLi4vRm9sZGVyMi90ZW1wLy4uL0ZvbGRlcjMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X0xpbnV4LkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDsvZm9sZGVyMS9mb2xkZXIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyVGVzdF9MaW51eC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7L2ZvbGRlcjEvLi9mb2xkZXIyLy4uL2ZvbGRlcjMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X0xpbnV4LkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDsvZm9sZGVyMSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X0xpbnV4LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoMTIzLCZxdW90OzEyMyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoT3JVbmRlclRlc3RfTGludXguUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDsvRm9sZGVyMS9Gb2xkZXIyJnF1b3Q7LCZxdW90O1wmcXVvdDsvRm9sZGVyMS9Gb2xkZXIyXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoT3JVbmRlclRlc3RfTGludXguUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDsvRk9MREVSMS8uL2p1bmsvLi4vRm9sZGVyMiZxdW90OywmcXVvdDtcJnF1b3Q7L0ZPTERFUjEvLi9qdW5rLy4uL0ZvbGRlcjJcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyVGVzdF9MaW51eC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90Oy9GT0xERVIxLy4vanVuay8uLi9Gb2xkZXIyL3RlbXAvLi4vRm9sZGVyMyZxdW90OywmcXVvdDtcJnF1b3Q7L0ZPTERFUjEvLi9qdW5rLy4uL0ZvbGRlcjIvdGVtcC8uLi9Gb2xkZXIzXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoT3JVbmRlclRlc3RfTGludXguUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDsvZm9sZGVyMS9mb2xkZXIzJnF1b3Q7LCZxdW90O1wmcXVvdDsvZm9sZGVyMS9mb2xkZXIzXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoT3JVbmRlclRlc3RfTGludXguUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDsvZm9sZGVyMS8uL2ZvbGRlcjIvLi4vZm9sZGVyMyZxdW90OywmcXVvdDtcJnF1b3Q7L2ZvbGRlcjEvLi9mb2xkZXIyLy4uL2ZvbGRlcjNcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyVGVzdF9MaW51eC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90Oy9mb2xkZXIxJnF1b3Q7LCZxdW90O1wmcXVvdDsvZm9sZGVyMVwmcXVvdDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyVGVzdF9MaW51eC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90Oy9mb2xkZXIxL2ZvbGRlcjImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X0xpbnV4LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7L2ZvbGRlcjEvLi9mb2xkZXIyJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyVGVzdF9MaW51eC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90Oy9mb2xkZXIxL2p1bmsvLi4vZm9sZGVyMiZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoT3JVbmRlclRlc3RfTGludXguU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDtcXGZvbGRlcjFcXGZvbGRlcjImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X0xpbnV4LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7L2ZvbGRlcjEvZm9sZGVyMi9mb2xkZXIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyVGVzdF9MaW51eC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90Oy9mb2xkZXIxLy4vZm9sZGVyMi9mb2xkZXIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyVGVzdF9MaW51eC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90Oy9mb2xkZXIxL2p1bmsvLi4vZm9sZGVyMi9mb2xkZXIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyVGVzdF9MaW51eC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O1xcZm9sZGVyMVxcZm9sZGVyMlxcZm9sZGVyMyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTYW1lUGF0aE9yVW5kZXJUZXN0X1dpbmRvd3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDQ2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoT3JVbmRlclRlc3RfV2luZG93cy5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJEZXNjcmlwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X1dpbmRvd3MuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X1dpbmRvd3MuRmFpbHNXaXRoQmFkVmFsdWVzKDEyMykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoT3JVbmRlclRlc3RfV2luZG93cy5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7QzpcXGZvbGRlcjFcXGZvbGRlcjMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X1dpbmRvd3MuRmFpbHNXaXRoQmFkVmFsdWVzKCZxdW90O0M6XFxmb2xkZXIxXFwuXFxmb2xkZXIyXFwuLlxcZmlsZS50ZW1wJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoT3JVbmRlclRlc3RfV2luZG93cy5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKDEyMywmcXVvdDsxMjMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X1dpbmRvd3MuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtDOlxcZm9sZGVyMVxcZm9sZGVyMyZxdW90OywmcXVvdDtcJnF1b3Q7QzpcXGZvbGRlcjFcXGZvbGRlcjNcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyVGVzdF9XaW5kb3dzLlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7QzpcXGZvbGRlcjFcXC5cXGZvbGRlcjJcXC4uXFxmaWxlLnRlbXAmcXVvdDssJnF1b3Q7XCZxdW90O0M6XFxmb2xkZXIxXFwuXFxmb2xkZXIyXFwuLlxcZmlsZS50ZW1wXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3VjY2VlZHNXaXRoR29vZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X1dpbmRvd3MuU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDtDOlxcZm9sZGVyMVxcZm9sZGVyMiZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoT3JVbmRlclRlc3RfV2luZG93cy5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O0M6XFxGb2xkZXIxXFxGb2xkZXIyJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyVGVzdF9XaW5kb3dzLlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7QzpcXGZvbGRlcjFcXC5cXGZvbGRlcjImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X1dpbmRvd3MuU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDtDOlxcZm9sZGVyMVxcanVua1xcLi5cXGZvbGRlcjImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X1dpbmRvd3MuU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDtDOlxcRk9MREVSMVxcLlxcanVua1xcLi5cXEZvbGRlcjImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X1dpbmRvd3MuU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDtDOi9mb2xkZXIxL2ZvbGRlcjImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aE9yVW5kZXJUZXN0X1dpbmRvd3MuU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDtDOlxcZm9sZGVyMVxcZm9sZGVyMlxcZm9sZGVyMyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoT3JVbmRlclRlc3RfV2luZG93cy5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O0M6XFxmb2xkZXIxXFwuXFxmb2xkZXIyXFxmb2xkZXIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyVGVzdF9XaW5kb3dzLlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7QzpcXGZvbGRlcjFcXGp1bmtcXC4uXFxmb2xkZXIyXFxmb2xkZXIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhPclVuZGVyVGVzdF9XaW5kb3dzLlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7QzpcXEZPTERFUjFcXC5cXGp1bmtcXC4uXFxGb2xkZXIyXFx0ZW1wXFwuLlxcRm9sZGVyMyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoT3JVbmRlclRlc3RfV2luZG93cy5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O0M6L2ZvbGRlcjEvZm9sZGVyMi9mb2xkZXIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlNhbWVQYXRoVGVzdF9MaW51eCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhUZXN0X0xpbnV4LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9MaW51eC5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJTdHJpbmdSZXByZXNlbnRhdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iRmFpbHNXaXRoQmFkVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9MaW51eC5GYWlsc1dpdGhCYWRWYWx1ZXMoMTIzKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhUZXN0X0xpbnV4LkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDsvZm9sZGVyMi9maWxlLnRtcCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9MaW51eC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7L2ZvbGRlcjEvLi9mb2xkZXIyLy4uL2ZpbGUudGVtcCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9MaW51eC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7L0ZvbGRlcjEvRmlsZS5UTVAmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aFRlc3RfTGludXguRmFpbHNXaXRoQmFkVmFsdWVzKCZxdW90Oy9GT0xERVIxLy4vZm9sZGVyMi8uLi9GaWxlLlRNUCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aFRlc3RfTGludXguUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgxMjMsJnF1b3Q7MTIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhUZXN0X0xpbnV4LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7L2ZvbGRlcjIvZmlsZS50bXAmcXVvdDssJnF1b3Q7XCZxdW90Oy9mb2xkZXIyL2ZpbGUudG1wXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9MaW51eC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90Oy9mb2xkZXIxLy4vZm9sZGVyMi8uLi9maWxlLnRlbXAmcXVvdDssJnF1b3Q7XCZxdW90Oy9mb2xkZXIxLy4vZm9sZGVyMi8uLi9maWxlLnRlbXBcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhUZXN0X0xpbnV4LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7L0ZvbGRlcjEvRmlsZS5UTVAmcXVvdDssJnF1b3Q7XCZxdW90Oy9Gb2xkZXIxL0ZpbGUuVE1QXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9MaW51eC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90Oy9GT0xERVIxLy4vZm9sZGVyMi8uLi9GaWxlLlRNUCZxdW90OywmcXVvdDtcJnF1b3Q7L0ZPTERFUjEvLi9mb2xkZXIyLy4uL0ZpbGUuVE1QXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aFRlc3RfTGludXguUm9vdFBhdGhFcXVhbGl0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3VjY2VlZHNXaXRoR29vZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aFRlc3RfTGludXguU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDsvZm9sZGVyMS9maWxlLnRtcCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9MaW51eC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90Oy9mb2xkZXIxLy4vZmlsZS50bXAmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aFRlc3RfTGludXguU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDsvZm9sZGVyMS9mb2xkZXIyLy4uL2ZpbGUudG1wJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhUZXN0X0xpbnV4LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7L2ZvbGRlcjEvLi9mb2xkZXIyLy4uL2ZpbGUudG1wJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhUZXN0X0xpbnV4LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7XFxmb2xkZXIxXFxmaWxlLnRtcCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTYW1lUGF0aFRlc3RfV2luZG93cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhUZXN0X1dpbmRvd3MuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhUZXN0X1dpbmRvd3MuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aFRlc3RfV2luZG93cy5GYWlsc1dpdGhCYWRWYWx1ZXMoMTIzKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhUZXN0X1dpbmRvd3MuRmFpbHNXaXRoQmFkVmFsdWVzKCZxdW90O0M6XFxmb2xkZXIyXFxmaWxlLnRtcCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9XaW5kb3dzLkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtDOlxcZm9sZGVyMVxcLlxcZm9sZGVyMlxcLi5cXGZpbGUudGVtcCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aFRlc3RfV2luZG93cy5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKDEyMywmcXVvdDsxMjMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aFRlc3RfV2luZG93cy5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90O0M6XFxmb2xkZXIyXFxmaWxlLnRtcCZxdW90OywmcXVvdDtcJnF1b3Q7QzpcXGZvbGRlcjJcXGZpbGUudG1wXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9XaW5kb3dzLlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7QzpcXGZvbGRlcjFcXC5cXGZvbGRlcjJcXC4uXFxmaWxlLnRlbXAmcXVvdDssJnF1b3Q7XCZxdW90O0M6XFxmb2xkZXIxXFwuXFxmb2xkZXIyXFwuLlxcZmlsZS50ZW1wXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aFRlc3RfV2luZG93cy5Sb290UGF0aEVxdWFsaXR5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxNSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9XaW5kb3dzLlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7QzpcXGZvbGRlcjFcXGZpbGUudG1wJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU2FtZVBhdGhUZXN0X1dpbmRvd3MuU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDtDOlxcRm9sZGVyMVxcRmlsZS5UTVAmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TYW1lUGF0aFRlc3RfV2luZG93cy5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O0M6XFxmb2xkZXIxXFwuXFxmaWxlLnRtcCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9XaW5kb3dzLlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7QzpcXGZvbGRlcjFcXGZvbGRlcjJcXC4uXFxmaWxlLnRtcCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9XaW5kb3dzLlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7QzpcXEZPTERFUjFcXC5cXGZvbGRlcjJcXC4uXFxGaWxlLlRNUCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlNhbWVQYXRoVGVzdF9XaW5kb3dzLlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7QzovZm9sZGVyMS9maWxlLnRtcCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTdGFydHNXaXRoVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdGFydHNXaXRoVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7Z29vZGJ5ZSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN0YXJ0c1dpdGhUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtIRUxMTyBUSEVSRSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN0YXJ0c1dpdGhUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtJIHNhaWQgaGVsbG8mcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdGFydHNXaXRoVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7c2F5IGhlbGxvIHRvIGZyZWQmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdGFydHNXaXRoVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKG51bGwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtnb29kYnllJnF1b3Q7LCZxdW90O1wmcXVvdDtnb29kYnllXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN0YXJ0c1dpdGhUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7SEVMTE8gVEhFUkUmcXVvdDssJnF1b3Q7XCZxdW90O0hFTExPIFRIRVJFXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN0YXJ0c1dpdGhUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7SSBzYWlkIGhlbGxvJnF1b3Q7LCZxdW90O1wmcXVvdDtJIHNhaWQgaGVsbG9cJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtzYXkgaGVsbG8gdG8gZnJlZCZxdW90OywmcXVvdDtcJnF1b3Q7c2F5IGhlbGxvIHRvIGZyZWRcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDsmcXVvdDssJnF1b3Q7Jmx0O3N0cmluZy5FbXB0eSZndDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdGFydHNXaXRoVGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKG51bGwsJnF1b3Q7bnVsbCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3VjY2VlZHNXaXRoR29vZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdGFydHNXaXRoVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O2hlbGxvJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDtoZWxsbyB0aGVyZSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTdGFydHNXaXRoVGVzdElnbm9yaW5nQ2FzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3RJZ25vcmluZ0Nhc2UuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3RJZ25vcmluZ0Nhc2UuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdGFydHNXaXRoVGVzdElnbm9yaW5nQ2FzZS5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7Z29vZGJ5ZSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN0YXJ0c1dpdGhUZXN0SWdub3JpbmdDYXNlLkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtXaGF0IHRoZSBoZWxsPyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN0YXJ0c1dpdGhUZXN0SWdub3JpbmdDYXNlLkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtJIHNhaWQgaGVsbG8mcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdGFydHNXaXRoVGVzdElnbm9yaW5nQ2FzZS5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7c2F5IEhlbGxvIHRvIGZyZWQmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdGFydHNXaXRoVGVzdElnbm9yaW5nQ2FzZS5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3RJZ25vcmluZ0Nhc2UuRmFpbHNXaXRoQmFkVmFsdWVzKG51bGwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3RJZ25vcmluZ0Nhc2UuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtnb29kYnllJnF1b3Q7LCZxdW90O1wmcXVvdDtnb29kYnllXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN0YXJ0c1dpdGhUZXN0SWdub3JpbmdDYXNlLlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7V2hhdCB0aGUgaGVsbD8mcXVvdDssJnF1b3Q7XCZxdW90O1doYXQgdGhlIGhlbGw/XCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN0YXJ0c1dpdGhUZXN0SWdub3JpbmdDYXNlLlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7SSBzYWlkIGhlbGxvJnF1b3Q7LCZxdW90O1wmcXVvdDtJIHNhaWQgaGVsbG9cJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3RJZ25vcmluZ0Nhc2UuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtzYXkgSGVsbG8gdG8gZnJlZCZxdW90OywmcXVvdDtcJnF1b3Q7c2F5IEhlbGxvIHRvIGZyZWRcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3RJZ25vcmluZ0Nhc2UuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDsmcXVvdDssJnF1b3Q7Jmx0O3N0cmluZy5FbXB0eSZndDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdGFydHNXaXRoVGVzdElnbm9yaW5nQ2FzZS5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKG51bGwsJnF1b3Q7bnVsbCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3VjY2VlZHNXaXRoR29vZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdGFydHNXaXRoVGVzdElnbm9yaW5nQ2FzZS5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O0hlbGxvJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3RhcnRzV2l0aFRlc3RJZ25vcmluZ0Nhc2UuU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDtIRUxMTyB0aGVyZSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTdWJQYXRoVGVzdF9MaW51eCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNzAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfTGludXguQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfTGludXguQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9MaW51eC5GYWlsc1dpdGhCYWRWYWx1ZXMoMTIzKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfTGludXguRmFpbHNXaXRoQmFkVmFsdWVzKCZxdW90Oy9Gb2xkZXIxL0ZvbGRlcjImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9MaW51eC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7L0ZPTERFUjEvLi9qdW5rLy4uL0ZvbGRlcjImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9MaW51eC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7L0ZPTERFUjEvLi9qdW5rLy4uL0ZvbGRlcjIvdGVtcC8uLi9Gb2xkZXIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfTGludXguRmFpbHNXaXRoQmFkVmFsdWVzKCZxdW90Oy9mb2xkZXIxL2ZvbGRlcjMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9MaW51eC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7L2ZvbGRlcjEvLi9mb2xkZXIyLy4uL2ZvbGRlcjMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9MaW51eC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7L2ZvbGRlcjEmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9MaW51eC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7L2ZvbGRlcjEvZm9sZGVyMiZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YlBhdGhUZXN0X0xpbnV4LkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDsvZm9sZGVyMS8uL2ZvbGRlcjImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9MaW51eC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7L2ZvbGRlcjEvanVuay8uLi9mb2xkZXIyJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfTGludXguRmFpbHNXaXRoQmFkVmFsdWVzKCZxdW90O1xcZm9sZGVyMVxcZm9sZGVyMiZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9MaW51eC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKDEyMywmcXVvdDsxMjMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9MaW51eC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90Oy9Gb2xkZXIxL0ZvbGRlcjImcXVvdDssJnF1b3Q7XCZxdW90Oy9Gb2xkZXIxL0ZvbGRlcjJcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfTGludXguUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDsvRk9MREVSMS8uL2p1bmsvLi4vRm9sZGVyMiZxdW90OywmcXVvdDtcJnF1b3Q7L0ZPTERFUjEvLi9qdW5rLy4uL0ZvbGRlcjJcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfTGludXguUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDsvRk9MREVSMS8uL2p1bmsvLi4vRm9sZGVyMi90ZW1wLy4uL0ZvbGRlcjMmcXVvdDssJnF1b3Q7XCZxdW90Oy9GT0xERVIxLy4vanVuay8uLi9Gb2xkZXIyL3RlbXAvLi4vRm9sZGVyM1wmcXVvdDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9MaW51eC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90Oy9mb2xkZXIxL2ZvbGRlcjMmcXVvdDssJnF1b3Q7XCZxdW90Oy9mb2xkZXIxL2ZvbGRlcjNcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfTGludXguUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDsvZm9sZGVyMS8uL2ZvbGRlcjIvLi4vZm9sZGVyMyZxdW90OywmcXVvdDtcJnF1b3Q7L2ZvbGRlcjEvLi9mb2xkZXIyLy4uL2ZvbGRlcjNcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfTGludXguUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDsvZm9sZGVyMSZxdW90OywmcXVvdDtcJnF1b3Q7L2ZvbGRlcjFcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfTGludXguUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDsvZm9sZGVyMS9mb2xkZXIyJnF1b3Q7LCZxdW90O1wmcXVvdDsvZm9sZGVyMS9mb2xkZXIyXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YlBhdGhUZXN0X0xpbnV4LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7L2ZvbGRlcjEvLi9mb2xkZXIyJnF1b3Q7LCZxdW90O1wmcXVvdDsvZm9sZGVyMS8uL2ZvbGRlcjJcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfTGludXguUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDsvZm9sZGVyMS9qdW5rLy4uL2ZvbGRlcjImcXVvdDssJnF1b3Q7XCZxdW90Oy9mb2xkZXIxL2p1bmsvLi4vZm9sZGVyMlwmcXVvdDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9MaW51eC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90O1xcZm9sZGVyMVxcZm9sZGVyMiZxdW90OywmcXVvdDtcJnF1b3Q7XFxmb2xkZXIxXFxmb2xkZXIyXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9MaW51eC5TdWJQYXRoT2ZSb290IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YlBhdGhUZXN0X0xpbnV4LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7L2ZvbGRlcjEvZm9sZGVyMi9mb2xkZXIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfTGludXguU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDsvZm9sZGVyMS8uL2ZvbGRlcjIvZm9sZGVyMyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YlBhdGhUZXN0X0xpbnV4LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoJnF1b3Q7L2ZvbGRlcjEvanVuay8uLi9mb2xkZXIyL2ZvbGRlcjMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9MaW51eC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O1xcZm9sZGVyMVxcZm9sZGVyMlxcZm9sZGVyMyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTdWJQYXRoVGVzdF9XaW5kb3dzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA2MyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9XaW5kb3dzLkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YlBhdGhUZXN0X1dpbmRvd3MuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9XaW5kb3dzLkZhaWxzV2l0aEJhZFZhbHVlcygxMjMpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9XaW5kb3dzLkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtDOlxcZm9sZGVyMVxcZm9sZGVyMyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YlBhdGhUZXN0X1dpbmRvd3MuRmFpbHNXaXRoQmFkVmFsdWVzKCZxdW90O0M6XFxmb2xkZXIxXFwuXFxmb2xkZXIyXFwuLlxcZmlsZS50ZW1wJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfV2luZG93cy5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7QzpcXGZvbGRlcjFcXGZvbGRlcjImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9XaW5kb3dzLkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtDOlxcRm9sZGVyMVxcRm9sZGVyMiZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YlBhdGhUZXN0X1dpbmRvd3MuRmFpbHNXaXRoQmFkVmFsdWVzKCZxdW90O0M6XFxmb2xkZXIxXFwuXFxmb2xkZXIyJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfV2luZG93cy5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7QzpcXGZvbGRlcjFcXGp1bmtcXC4uXFxmb2xkZXIyJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfV2luZG93cy5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7QzpcXEZPTERFUjFcXC5cXGp1bmtcXC4uXFxGb2xkZXIyJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfV2luZG93cy5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7QzovZm9sZGVyMS9mb2xkZXIyJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YlBhdGhUZXN0X1dpbmRvd3MuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgxMjMsJnF1b3Q7MTIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfV2luZG93cy5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90O0M6XFxmb2xkZXIxXFxmb2xkZXIzJnF1b3Q7LCZxdW90O1wmcXVvdDtDOlxcZm9sZGVyMVxcZm9sZGVyM1wmcXVvdDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9XaW5kb3dzLlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7QzpcXGZvbGRlcjFcXC5cXGZvbGRlcjJcXC4uXFxmaWxlLnRlbXAmcXVvdDssJnF1b3Q7XCZxdW90O0M6XFxmb2xkZXIxXFwuXFxmb2xkZXIyXFwuLlxcZmlsZS50ZW1wXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YlBhdGhUZXN0X1dpbmRvd3MuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtDOlxcZm9sZGVyMVxcZm9sZGVyMiZxdW90OywmcXVvdDtcJnF1b3Q7QzpcXGZvbGRlcjFcXGZvbGRlcjJcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfV2luZG93cy5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90O0M6XFxGb2xkZXIxXFxGb2xkZXIyJnF1b3Q7LCZxdW90O1wmcXVvdDtDOlxcRm9sZGVyMVxcRm9sZGVyMlwmcXVvdDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9XaW5kb3dzLlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7QzpcXGZvbGRlcjFcXC5cXGZvbGRlcjImcXVvdDssJnF1b3Q7XCZxdW90O0M6XFxmb2xkZXIxXFwuXFxmb2xkZXIyXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YlBhdGhUZXN0X1dpbmRvd3MuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtDOlxcZm9sZGVyMVxcanVua1xcLi5cXGZvbGRlcjImcXVvdDssJnF1b3Q7XCZxdW90O0M6XFxmb2xkZXIxXFxqdW5rXFwuLlxcZm9sZGVyMlwmcXVvdDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9XaW5kb3dzLlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7QzpcXEZPTERFUjFcXC5cXGp1bmtcXC4uXFxGb2xkZXIyJnF1b3Q7LCZxdW90O1wmcXVvdDtDOlxcRk9MREVSMVxcLlxcanVua1xcLi5cXEZvbGRlcjJcJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfV2luZG93cy5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90O0M6L2ZvbGRlcjEvZm9sZGVyMiZxdW90OywmcXVvdDtcJnF1b3Q7QzovZm9sZGVyMS9mb2xkZXIyXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJQYXRoVGVzdF9XaW5kb3dzLlN1YlBhdGhPZlJvb3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA5IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfV2luZG93cy5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O0M6XFxmb2xkZXIxXFxmb2xkZXIyXFxmb2xkZXIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfV2luZG93cy5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O0M6XFxmb2xkZXIxXFwuXFxmb2xkZXIyXFxmb2xkZXIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfV2luZG93cy5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O0M6XFxmb2xkZXIxXFxqdW5rXFwuLlxcZm9sZGVyMlxcZm9sZGVyMyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YlBhdGhUZXN0X1dpbmRvd3MuU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDtDOlxcRk9MREVSMVxcLlxcanVua1xcLi5cXEZvbGRlcjJcXHRlbXBcXC4uXFxGb2xkZXIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3ViUGF0aFRlc3RfV2luZG93cy5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O0M6L2ZvbGRlcjEvZm9sZGVyMi9mb2xkZXIzJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlN1YnN0cmluZ1Rlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDM5IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YnN0cmluZ1Rlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3Vic3RyaW5nVGVzdC5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJTdHJpbmdSZXByZXNlbnRhdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iRmFpbHNXaXRoQmFkVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YnN0cmluZ1Rlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKCZxdW90O2dvb2RieWUmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJzdHJpbmdUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtIRUxMTyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YnN0cmluZ1Rlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKCZxdW90O1doYXQgdGhlIGhlbGw/JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3Vic3RyaW5nVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3Vic3RyaW5nVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMobnVsbCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJzdHJpbmdUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7Z29vZGJ5ZSZxdW90OywmcXVvdDtcJnF1b3Q7Z29vZGJ5ZVwmcXVvdDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJzdHJpbmdUZXN0LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoJnF1b3Q7SEVMTE8mcXVvdDssJnF1b3Q7XCZxdW90O0hFTExPXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YnN0cmluZ1Rlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtXaGF0IHRoZSBoZWxsPyZxdW90OywmcXVvdDtcJnF1b3Q7V2hhdCB0aGUgaGVsbD9cJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3Vic3RyaW5nVGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90OyZxdW90OywmcXVvdDsmbHQ7c3RyaW5nLkVtcHR5Jmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YnN0cmluZ1Rlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZShudWxsLCZxdW90O251bGwmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3Vic3RyaW5nVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O2hlbGxvJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3Vic3RyaW5nVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O2hlbGxvIHRoZXJlJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3Vic3RyaW5nVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O0kgc2FpZCBoZWxsbyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YnN0cmluZ1Rlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDtzYXkgaGVsbG8gdG8gZnJlZCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTdWJzdHJpbmdUZXN0SWdub3JpbmdDYXNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzNSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJzdHJpbmdUZXN0SWdub3JpbmdDYXNlLkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YnN0cmluZ1Rlc3RJZ25vcmluZ0Nhc2UuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJzdHJpbmdUZXN0SWdub3JpbmdDYXNlLkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtnb29kYnllJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3Vic3RyaW5nVGVzdElnbm9yaW5nQ2FzZS5GYWlsc1dpdGhCYWRWYWx1ZXMoJnF1b3Q7V2hhdCB0aGUgaGVsbD8mcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJzdHJpbmdUZXN0SWdub3JpbmdDYXNlLkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5TdWJzdHJpbmdUZXN0SWdub3JpbmdDYXNlLkZhaWxzV2l0aEJhZFZhbHVlcyhudWxsKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YnN0cmluZ1Rlc3RJZ25vcmluZ0Nhc2UuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtnb29kYnllJnF1b3Q7LCZxdW90O1wmcXVvdDtnb29kYnllXCZxdW90OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YnN0cmluZ1Rlc3RJZ25vcmluZ0Nhc2UuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZSgmcXVvdDtXaGF0IHRoZSBoZWxsPyZxdW90OywmcXVvdDtcJnF1b3Q7V2hhdCB0aGUgaGVsbD9cJnF1b3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3Vic3RyaW5nVGVzdElnbm9yaW5nQ2FzZS5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90OyZxdW90OywmcXVvdDsmbHQ7c3RyaW5nLkVtcHR5Jmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YnN0cmluZ1Rlc3RJZ25vcmluZ0Nhc2UuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZShudWxsLCZxdW90O251bGwmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3Vic3RyaW5nVGVzdElnbm9yaW5nQ2FzZS5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O0hlbGxvJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3Vic3RyaW5nVGVzdElnbm9yaW5nQ2FzZS5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O0hlbGxPIHRoZXJlJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuU3Vic3RyaW5nVGVzdElnbm9yaW5nQ2FzZS5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKCZxdW90O0kgc2FpZCBIRUxMTyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlN1YnN0cmluZ1Rlc3RJZ25vcmluZ0Nhc2UuU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDtzYXkgaGVsbG8gdG8gZnJlZCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUaHJvd3NDb25zdHJhaW50VGVzdF9FeGFjdFR5cGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDI0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnRUZXN0X0V4YWN0VHlwZS5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJEZXNjcmlwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UaHJvd3NDb25zdHJhaW50VGVzdF9FeGFjdFR5cGUuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyU3RyaW5nUmVwcmVzZW50YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkZhaWxzV2l0aEJhZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UaHJvd3NDb25zdHJhaW50VGVzdF9FeGFjdFR5cGUuRmFpbHNXaXRoQmFkVmFsdWVzKE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UaHJvd3NDb25zdHJhaW50VGVzdF9FeGFjdFR5cGUuRmFpbHNXaXRoQmFkVmFsdWVzKE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UaHJvd3NDb25zdHJhaW50VGVzdF9FeGFjdFR5cGUuRmFpbHNXaXRoQmFkVmFsdWVzKE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVGhyb3dzQ29uc3RyYWludFRlc3RfRXhhY3RUeXBlLlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSwmcXVvdDsmbHQ7U3lzdGVtLkFwcGxpY2F0aW9uRXhjZXB0aW9uJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnRUZXN0X0V4YWN0VHlwZS5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUsJnF1b3Q7bm8gZXhjZXB0aW9uIHRocm93biZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnRUZXN0X0V4YWN0VHlwZS5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUsJnF1b3Q7Jmx0O1N5c3RlbS5FeGNlcHRpb24mZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnRUZXN0X0V4YWN0VHlwZS5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGhyb3dzQ29uc3RyYWludFRlc3RfSW5zdGFuY2VPZlR5cGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDI3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnRUZXN0X0luc3RhbmNlT2ZUeXBlLkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnRUZXN0X0luc3RhbmNlT2ZUeXBlLkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlclN0cmluZ1JlcHJlc2VudGF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJGYWlsc1dpdGhCYWRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVGhyb3dzQ29uc3RyYWludFRlc3RfSW5zdGFuY2VPZlR5cGUuRmFpbHNXaXRoQmFkVmFsdWVzKE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UaHJvd3NDb25zdHJhaW50VGVzdF9JbnN0YW5jZU9mVHlwZS5GYWlsc1dpdGhCYWRWYWx1ZXMoTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnRUZXN0X0luc3RhbmNlT2ZUeXBlLkZhaWxzV2l0aEJhZFZhbHVlcyhOVW5pdC5GcmFtZXdvcmsuVGVzdERlbGVnYXRlKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnRUZXN0X0luc3RhbmNlT2ZUeXBlLlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSwmcXVvdDsmbHQ7U3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnRUZXN0X0luc3RhbmNlT2ZUeXBlLlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSwmcXVvdDtubyBleGNlcHRpb24gdGhyb3duJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVGhyb3dzQ29uc3RyYWludFRlc3RfSW5zdGFuY2VPZlR5cGUuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZShOVW5pdC5GcmFtZXdvcmsuVGVzdERlbGVnYXRlLCZxdW90OyZsdDtTeXN0ZW0uRXhjZXB0aW9uJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3VjY2VlZHNXaXRoR29vZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UaHJvd3NDb25zdHJhaW50VGVzdF9JbnN0YW5jZU9mVHlwZS5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UaHJvd3NDb25zdHJhaW50VGVzdF9JbnN0YW5jZU9mVHlwZS5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGhyb3dzQ29uc3RyYWludFRlc3RfV2l0aENvbnN0cmFpbnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDIzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnRUZXN0X1dpdGhDb25zdHJhaW50LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlckRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnRUZXN0X1dpdGhDb25zdHJhaW50LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlclN0cmluZ1JlcHJlc2VudGF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJGYWlsc1dpdGhCYWRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVGhyb3dzQ29uc3RyYWludFRlc3RfV2l0aENvbnN0cmFpbnQuRmFpbHNXaXRoQmFkVmFsdWVzKE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UaHJvd3NDb25zdHJhaW50VGVzdF9XaXRoQ29uc3RyYWludC5GYWlsc1dpdGhCYWRWYWx1ZXMoTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnRUZXN0X1dpdGhDb25zdHJhaW50LkZhaWxzV2l0aEJhZFZhbHVlcyhOVW5pdC5GcmFtZXdvcmsuVGVzdERlbGVnYXRlKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnRUZXN0X1dpdGhDb25zdHJhaW50LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSwmcXVvdDsmbHQ7U3lzdGVtLkFwcGxpY2F0aW9uRXhjZXB0aW9uJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRocm93c0NvbnN0cmFpbnRUZXN0X1dpdGhDb25zdHJhaW50LlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UoTlVuaXQuRnJhbWV3b3JrLlRlc3REZWxlZ2F0ZSwmcXVvdDtubyBleGNlcHRpb24gdGhyb3duJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVGhyb3dzQ29uc3RyYWludFRlc3RfV2l0aENvbnN0cmFpbnQuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZShOVW5pdC5GcmFtZXdvcmsuVGVzdERlbGVnYXRlLCZxdW90OyZsdDtTeXN0ZW0uRXhjZXB0aW9uJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3VjY2VlZHNXaXRoR29vZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UaHJvd3NDb25zdHJhaW50VGVzdF9XaXRoQ29uc3RyYWludC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKE5Vbml0LkZyYW1ld29yay5UZXN0RGVsZWdhdGUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVG9TdHJpbmdUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVG9TdHJpbmdUZXN0cy5DYW5EaXNwbGF5UHJlZml4Q29uc3RyYWludHNfUmVzb2x2ZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVG9TdHJpbmdUZXN0cy5DYW5EaXNwbGF5U2ltcGxlQ29uc3RyYWludHNfUmVzb2x2ZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVG9TdHJpbmdUZXN0cy5DYW5EaXNwbGF5U2ltcGxlQ29uc3RyYWludHNfVW5yZXNvbHZlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ub1N0cmluZ1Rlc3RzLkRpc3BsYXlCaW5hcnlDb25zdHJhaW50c19SZXNvbHZlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5Ub1N0cmluZ1Rlc3RzLkRpc3BsYXlCaW5hcnlDb25zdHJhaW50c19VblJlc29sdmVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRvU3RyaW5nVGVzdHMuRGlzcGxheVByZWZpeENvbnN0cmFpbnRzX1VucmVzb2x2ZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVHJ1ZUNvbnN0cmFpbnRUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzMCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UcnVlQ29uc3RyYWludFRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVHJ1ZUNvbnN0cmFpbnRUZXN0LkNvbnN0cmFpbnRUZXN0QmFzZU5vRGF0YS5Qcm92aWRlc1Byb3BlclN0cmluZ1JlcHJlc2VudGF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJGYWlsc1dpdGhCYWRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVHJ1ZUNvbnN0cmFpbnRUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyhudWxsKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuVHJ1ZUNvbnN0cmFpbnRUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcygmcXVvdDtoZWxsbyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRydWVDb25zdHJhaW50VGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoRmFsc2UpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UcnVlQ29uc3RyYWludFRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKEZhbHNlKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJQcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRydWVDb25zdHJhaW50VGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKG51bGwsJnF1b3Q7bnVsbCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRydWVDb25zdHJhaW50VGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKCZxdW90O2hlbGxvJnF1b3Q7LCZxdW90O1wmcXVvdDtoZWxsb1wmcXVvdDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UcnVlQ29uc3RyYWludFRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZShGYWxzZSwmcXVvdDtGYWxzZSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRydWVDb25zdHJhaW50VGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKEZhbHNlLCZxdW90O0ZhbHNlJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTdWNjZWVkc1dpdGhHb29kVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlRydWVDb25zdHJhaW50VGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKFRydWUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5UcnVlQ29uc3RyYWludFRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcyhUcnVlKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlhtbFNlcmlhbGl6YWJsZVRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjEuODI0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlhtbFNlcmlhbGl6YWJsZVRlc3QuQ29uc3RyYWludFRlc3RCYXNlTm9EYXRhLlByb3ZpZGVzUHJvcGVyRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuWG1sU2VyaWFsaXphYmxlVGVzdC5Db25zdHJhaW50VGVzdEJhc2VOb0RhdGEuUHJvdmlkZXNQcm9wZXJTdHJpbmdSZXByZXNlbnRhdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iRmFpbHNXaXRoQmFkVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjcwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlhtbFNlcmlhbGl6YWJsZVRlc3QuRmFpbHNXaXRoQmFkVmFsdWVzKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmddKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4zMzkiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuWG1sU2VyaWFsaXphYmxlVGVzdC5GYWlsc1dpdGhCYWRWYWx1ZXMoTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLkludGVybmFsQ2xhc3MpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjIwNiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5YbWxTZXJpYWxpemFibGVUZXN0LkZhaWxzV2l0aEJhZFZhbHVlcyhOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSW50ZXJuYWxXaXRoU2VyaWFsaXphYmxlQXR0cmlidXRlQ2xhc3MpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjE1MiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkludmFsaWREYXRhVGhyb3dzQXJndW1lbnRFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuWG1sU2VyaWFsaXphYmxlVGVzdC5JbnZhbGlkRGF0YVRocm93c0FyZ3VtZW50RXhjZXB0aW9uKG51bGwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlByb3ZpZGVzUHJvcGVyRmFpbHVyZU1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNDcxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuWG1sU2VyaWFsaXphYmxlVGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltTeXN0ZW0uU3RyaW5nLFN5c3RlbS5TdHJpbmddLCZxdW90OyZsdDtEaWN0aW9uYXJ5YDImZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4xNTYiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuWG1sU2VyaWFsaXphYmxlVGVzdC5Qcm92aWRlc1Byb3BlckZhaWx1cmVNZXNzYWdlKE5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5JbnRlcm5hbENsYXNzLCZxdW90OyZsdDtJbnRlcm5hbENsYXNzJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTU3IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlhtbFNlcmlhbGl6YWJsZVRlc3QuUHJvdmlkZXNQcm9wZXJGYWlsdXJlTWVzc2FnZShOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuSW50ZXJuYWxXaXRoU2VyaWFsaXphYmxlQXR0cmlidXRlQ2xhc3MsJnF1b3Q7Jmx0O0ludGVybmFsV2l0aFNlcmlhbGl6YWJsZUF0dHJpYnV0ZUNsYXNzJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTUyIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU3VjY2VlZHNXaXRoR29vZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC42MzMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5Db25zdHJhaW50cy5YbWxTZXJpYWxpemFibGVUZXN0LlN1Y2NlZWRzV2l0aEdvb2RWYWx1ZXMoMSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDMwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLkNvbnN0cmFpbnRzLlhtbFNlcmlhbGl6YWJsZVRlc3QuU3VjY2VlZHNXaXRoR29vZFZhbHVlcygmcXVvdDthJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuQ29uc3RyYWludHMuWG1sU2VyaWFsaXphYmxlVGVzdC5TdWNjZWVkc1dpdGhHb29kVmFsdWVzKFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjU4OSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJOYW1lc3BhY2UiIG5hbWU9IlN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iNS4yNjciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJBZnRlclN5bnRheFVzaW5nQWN0dWFsUGFzc2VkQnlSZWYiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjEuNDM5IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BZnRlclN5bnRheFVzaW5nQWN0dWFsUGFzc2VkQnlSZWYuRXF1YWxUb1Rlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMjAzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFmdGVyU3ludGF4VXNpbmdBY3R1YWxQYXNzZWRCeVJlZi5HcmVhdGVyVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4yMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQWZ0ZXJTeW50YXhVc2luZ0FjdHVhbFBhc3NlZEJ5UmVmLkhhc01lbWJlclRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMjAzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFmdGVyU3ludGF4VXNpbmdBY3R1YWxQYXNzZWRCeVJlZi5OdWxsVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4yMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQWZ0ZXJTeW50YXhVc2luZ0FjdHVhbFBhc3NlZEJ5UmVmLlNhbWVBc1Rlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMjAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFmdGVyU3ludGF4VXNpbmdBY3R1YWxQYXNzZWRCeVJlZi5UZXh0VGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4yMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQWZ0ZXJTeW50YXhVc2luZ0FjdHVhbFBhc3NlZEJ5UmVmLlRydWVUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjIwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFmdGVyU3ludGF4VXNpbmdBbm9ueW1vdXNEZWxlZ2F0ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjEuNDI2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BZnRlclN5bnRheFVzaW5nQW5vbnltb3VzRGVsZWdhdGVzLkVxdWFsVG9UZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjIwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BZnRlclN5bnRheFVzaW5nQW5vbnltb3VzRGVsZWdhdGVzLkdyZWF0ZXJUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjIwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BZnRlclN5bnRheFVzaW5nQW5vbnltb3VzRGVsZWdhdGVzLkhhc01lbWJlclRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMjAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFmdGVyU3ludGF4VXNpbmdBbm9ueW1vdXNEZWxlZ2F0ZXMuTnVsbFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMjAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFmdGVyU3ludGF4VXNpbmdBbm9ueW1vdXNEZWxlZ2F0ZXMuU2FtZUFzVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4yMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQWZ0ZXJTeW50YXhVc2luZ0Fub255bW91c0RlbGVnYXRlcy5UZXh0VGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4yMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQWZ0ZXJTeW50YXhVc2luZ0Fub255bW91c0RlbGVnYXRlcy5UcnVlVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4yMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJBZnRlclRlc3RfQW5kT3BlcmF0b3IiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BZnRlclRlc3RfQW5kT3BlcmF0b3IuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BZnRlclRlc3RfQW5kT3BlcmF0b3IuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQWZ0ZXJUZXN0X0FuZE9wZXJhdG9yLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQWZ0ZXJUZXN0X1Byb3BlcnlUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQWZ0ZXJUZXN0X1Byb3BlcnlUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQWZ0ZXJUZXN0X1Byb3BlcnlUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFmdGVyVGVzdF9Qcm9wZXJ5VGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFmdGVyVGVzdF9TaW1wbGVDb25zdHJhaW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQWZ0ZXJUZXN0X1NpbXBsZUNvbnN0cmFpbnQuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BZnRlclRlc3RfU2ltcGxlQ29uc3RyYWludC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BZnRlclRlc3RfU2ltcGxlQ29uc3RyYWludC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFsbFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BbGxUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQWxsVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BbGxUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQW5kSXNFdmFsdWF0ZWRCZWZvcmVGb2xsb3dpbmdPciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFuZElzRXZhbHVhdGVkQmVmb3JlRm9sbG93aW5nT3IuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BbmRJc0V2YWx1YXRlZEJlZm9yZUZvbGxvd2luZ09yLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFuZElzRXZhbHVhdGVkQmVmb3JlRm9sbG93aW5nT3IuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJBbmRJc0V2YWx1YXRlZEJlZm9yZVByZWNlZGluZ09yIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQW5kSXNFdmFsdWF0ZWRCZWZvcmVQcmVjZWRpbmdPci5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFuZElzRXZhbHVhdGVkQmVmb3JlUHJlY2VkaW5nT3IuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQW5kSXNFdmFsdWF0ZWRCZWZvcmVQcmVjZWRpbmdPci5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFuZE9wZXJhdG9yT3ZlcnJpZGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BbmRPcGVyYXRvck92ZXJyaWRlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQW5kT3BlcmF0b3JPdmVycmlkZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BbmRPcGVyYXRvck92ZXJyaWRlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQW5kVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFuZFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BbmRUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFuZFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJBbmRUZXN0X1RocmVlQW5kc1dpdGhOb3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BbmRUZXN0X1RocmVlQW5kc1dpdGhOb3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BbmRUZXN0X1RocmVlQW5kc1dpdGhOb3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQW5kVGVzdF9UaHJlZUFuZHNXaXRoTm90LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQXJiaXRyYXJ5Q29uc3RyYWludE1hdGNoaW5nIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQXJiaXRyYXJ5Q29uc3RyYWludE1hdGNoaW5nLkNhbk1hdGNoQ3VzdG9tQ29uc3RyYWludCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQXJiaXRyYXJ5Q29uc3RyYWludE1hdGNoaW5nLkNhbk1hdGNoQ3VzdG9tQ29uc3RyYWludEFmdGVyUHJlZml4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BcmJpdHJhcnlDb25zdHJhaW50TWF0Y2hpbmcuQ2FuTWF0Y2hDdXN0b21Db25zdHJhaW50c1VuZGVyQW5kT3BlcmF0b3IiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFyYml0cmFyeUNvbnN0cmFpbnRNYXRjaGluZy5DYW5NYXRjaFByZWRpY2F0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJBc3NpZ25hYmxlRnJvbVRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Bc3NpZ25hYmxlRnJvbVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Bc3NpZ25hYmxlRnJvbVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQXNzaWduYWJsZUZyb21UZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQXNzaWduYWJsZUZyb21UZXN0X0dlbmVyaWMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Bc3NpZ25hYmxlRnJvbVRlc3RfR2VuZXJpYy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFzc2lnbmFibGVGcm9tVGVzdF9HZW5lcmljLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFzc2lnbmFibGVGcm9tVGVzdF9HZW5lcmljLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQXNzaWduYWJsZVRvVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFzc2lnbmFibGVUb1Rlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Bc3NpZ25hYmxlVG9UZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkFzc2lnbmFibGVUb1Rlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJBc3NpZ25hYmxlVG9UZXN0X0dlbmVyaWMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Bc3NpZ25hYmxlVG9UZXN0X0dlbmVyaWMuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Bc3NpZ25hYmxlVG9UZXN0X0dlbmVyaWMuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQXNzaWduYWJsZVRvVGVzdF9HZW5lcmljLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQXRMZWFzdFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BdExlYXN0VGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkF0TGVhc3RUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkF0TGVhc3RUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQXRNb3N0VGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkF0TW9zdFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BdE1vc3RUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkF0TW9zdFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJBdHRyaWJ1dGVUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQXR0cmlidXRlVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkF0dHJpYnV0ZVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQXR0cmlidXRlVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkF0dHJpYnV0ZVRlc3RfR2VuZXJpYyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkF0dHJpYnV0ZVRlc3RfR2VuZXJpYy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkF0dHJpYnV0ZVRlc3RfR2VuZXJpYy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BdHRyaWJ1dGVUZXN0X0dlbmVyaWMuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJBdHRyaWJ1dGVUZXN0V2l0aEZvbGxvd2luZ0NvbnN0cmFpbnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BdHRyaWJ1dGVUZXN0V2l0aEZvbGxvd2luZ0NvbnN0cmFpbnQuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5BdHRyaWJ1dGVUZXN0V2l0aEZvbGxvd2luZ0NvbnN0cmFpbnQuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQXR0cmlidXRlVGVzdFdpdGhGb2xsb3dpbmdDb25zdHJhaW50LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQmluYXJ5U2VyaWFsaXphYmxlVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkJpbmFyeVNlcmlhbGl6YWJsZVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5CaW5hcnlTZXJpYWxpemFibGVUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkJpbmFyeVNlcmlhbGl6YWJsZVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDb2xsZWN0aW9uQ29udGFpbnNUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbkNvbnRhaW5zVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25Db250YWluc1Rlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbkNvbnRhaW5zVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkNvbGxlY3Rpb25Db250YWluc1Rlc3RfQ29tcGFyZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Db2xsZWN0aW9uQ29udGFpbnNUZXN0X0NvbXBhcmVyLkNvbXBhcmVySXNDYWxsZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25Db250YWluc1Rlc3RfQ29tcGFyZXIuQ29tcGFyZXJJc0NhbGxlZEluRXhwcmVzc2lvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbkNvbnRhaW5zVGVzdF9Db21wYXJlci5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25Db250YWluc1Rlc3RfQ29tcGFyZXIuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbkNvbnRhaW5zVGVzdF9Db21wYXJlci5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkNvbGxlY3Rpb25Db250YWluc1Rlc3RfQ29tcGFyZXJfU3RyaW5nIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbkNvbnRhaW5zVGVzdF9Db21wYXJlcl9TdHJpbmcuQ29tcGFyZXJJc0NhbGxlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbkNvbnRhaW5zVGVzdF9Db21wYXJlcl9TdHJpbmcuQ29tcGFyZXJJc0NhbGxlZEluRXhwcmVzc2lvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbkNvbnRhaW5zVGVzdF9Db21wYXJlcl9TdHJpbmcuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Db2xsZWN0aW9uQ29udGFpbnNUZXN0X0NvbXBhcmVyX1N0cmluZy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Db2xsZWN0aW9uQ29udGFpbnNUZXN0X0NvbXBhcmVyX1N0cmluZy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkNvbGxlY3Rpb25Db250YWluc1Rlc3RfU3RyaW5nIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbkNvbnRhaW5zVGVzdF9TdHJpbmcuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Db2xsZWN0aW9uQ29udGFpbnNUZXN0X1N0cmluZy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Db2xsZWN0aW9uQ29udGFpbnNUZXN0X1N0cmluZy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkNvbGxlY3Rpb25FcXVpdmFsZW50VGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25FcXVpdmFsZW50VGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25FcXVpdmFsZW50VGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Db2xsZWN0aW9uRXF1aXZhbGVudFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDb2xsZWN0aW9uTWVtYmVyVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25NZW1iZXJUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk1lbWJlclRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk1lbWJlclRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDb2xsZWN0aW9uTWVtYmVyVGVzdF9Db21wYXJlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25NZW1iZXJUZXN0X0NvbXBhcmVyLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk1lbWJlclRlc3RfQ29tcGFyZXIuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk1lbWJlclRlc3RfQ29tcGFyZXIuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDb2xsZWN0aW9uT3JkZXJlZEJ5VGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25PcmRlcmVkQnlUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk9yZGVyZWRCeVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk9yZGVyZWRCeVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDb2xsZWN0aW9uT3JkZXJlZEJ5VGVzdF9Db21wYXJlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25PcmRlcmVkQnlUZXN0X0NvbXBhcmVyLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk9yZGVyZWRCeVRlc3RfQ29tcGFyZXIuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk9yZGVyZWRCeVRlc3RfQ29tcGFyZXIuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDb2xsZWN0aW9uT3JkZXJlZEJ5VGVzdF9Db21wYXJlcl9EZXNjZW5kaW5nIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk9yZGVyZWRCeVRlc3RfQ29tcGFyZXJfRGVzY2VuZGluZy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25PcmRlcmVkQnlUZXN0X0NvbXBhcmVyX0Rlc2NlbmRpbmcuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk9yZGVyZWRCeVRlc3RfQ29tcGFyZXJfRGVzY2VuZGluZy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkNvbGxlY3Rpb25PcmRlcmVkQnlUZXN0X0Rlc2NlbmRpbmciIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Db2xsZWN0aW9uT3JkZXJlZEJ5VGVzdF9EZXNjZW5kaW5nLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk9yZGVyZWRCeVRlc3RfRGVzY2VuZGluZy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Db2xsZWN0aW9uT3JkZXJlZEJ5VGVzdF9EZXNjZW5kaW5nLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQ29sbGVjdGlvbk9yZGVyZWRUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk9yZGVyZWRUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk9yZGVyZWRUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25PcmRlcmVkVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkNvbGxlY3Rpb25PcmRlcmVkVGVzdF9Db21wYXJlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25PcmRlcmVkVGVzdF9Db21wYXJlci5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25PcmRlcmVkVGVzdF9Db21wYXJlci5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Db2xsZWN0aW9uT3JkZXJlZFRlc3RfQ29tcGFyZXIuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDb2xsZWN0aW9uT3JkZXJlZFRlc3RfQ29tcGFyZXJfRGVzY2VuZGluZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25PcmRlcmVkVGVzdF9Db21wYXJlcl9EZXNjZW5kaW5nLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk9yZGVyZWRUZXN0X0NvbXBhcmVyX0Rlc2NlbmRpbmcuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk9yZGVyZWRUZXN0X0NvbXBhcmVyX0Rlc2NlbmRpbmcuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDb2xsZWN0aW9uT3JkZXJlZFRlc3RfRGVzY2VuZGluZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25PcmRlcmVkVGVzdF9EZXNjZW5kaW5nLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk9yZGVyZWRUZXN0X0Rlc2NlbmRpbmcuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvbk9yZGVyZWRUZXN0X0Rlc2NlbmRpbmcuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDb2xsZWN0aW9uU3Vic2V0VGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkNvbGxlY3Rpb25TdWJzZXRUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvblN1YnNldFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ29sbGVjdGlvblN1YnNldFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDb3VudFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Db3VudFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Db3VudFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguQ291bnRUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRW1wdHlUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguRW1wdHlUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguRW1wdHlUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkVtcHR5VGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkVuZHNXaXRoVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkVuZHNXaXRoVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkVuZHNXaXRoVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5FbmRzV2l0aFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJFbmRzV2l0aFRlc3RfSWdub3JlQ2FzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkVuZHNXaXRoVGVzdF9JZ25vcmVDYXNlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguRW5kc1dpdGhUZXN0X0lnbm9yZUNhc2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguRW5kc1dpdGhUZXN0X0lnbm9yZUNhc2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJFcXVhbGl0eVRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguRXF1YWxpdHlUZXN0cy5FcXVhbGl0eVRlc3RzVXNpbmdEZWZhdWx0RmxvYXRpbmdQb2ludFRvbGVyYW5jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguRXF1YWxpdHlUZXN0cy5FcXVhbGl0eVRlc3RzV2l0aFRvbGVyYW5jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjgiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguRXF1YWxpdHlUZXN0cy5FcXVhbGl0eVRlc3RzV2l0aFRvbGVyYW5jZV9NaXhlZEZsb2F0QW5kRG91YmxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5FcXVhbGl0eVRlc3RzLkVxdWFsaXR5VGVzdHNXaXRoVG9sZXJhbmNlX01peGluZ1R5cGVzR2VuZXJhbGx5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iNyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5FcXVhbGl0eVRlc3RzLlNpbXBsZUVxdWFsaXR5VGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI2IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRXF1YWxUb1Rlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5FcXVhbFRvVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkVxdWFsVG9UZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkVxdWFsVG9UZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRXF1YWxUb1Rlc3RfSWdub3JlQ2FzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkVxdWFsVG9UZXN0X0lnbm9yZUNhc2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5FcXVhbFRvVGVzdF9JZ25vcmVDYXNlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkVxdWFsVG9UZXN0X0lnbm9yZUNhc2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJFcXVhbFRvVGVzdF9XaXRoaW5Ub2xlcmFuY2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5FcXVhbFRvVGVzdF9XaXRoaW5Ub2xlcmFuY2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5FcXVhbFRvVGVzdF9XaXRoaW5Ub2xlcmFuY2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguRXF1YWxUb1Rlc3RfV2l0aGluVG9sZXJhbmNlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRXhhY3RUeXBlVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkV4YWN0VHlwZVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5FeGFjdFR5cGVUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkV4YWN0VHlwZVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJFeGFjdFR5cGVUZXN0X0dlbmVyaWMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5FeGFjdFR5cGVUZXN0X0dlbmVyaWMuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5FeGFjdFR5cGVUZXN0X0dlbmVyaWMuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguRXhhY3RUeXBlVGVzdF9HZW5lcmljLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRmFsc2VUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguRmFsc2VUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguRmFsc2VUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkZhbHNlVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkdyZWF0ZXJUaGFuT3JFcXVhbFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA5IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5HcmVhdGVyVGhhbk9yRXF1YWxUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguR3JlYXRlclRoYW5PckVxdWFsVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5HcmVhdGVyVGhhbk9yRXF1YWxUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iR3JlYXRlclRoYW5UZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguR3JlYXRlclRoYW5UZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguR3JlYXRlclRoYW5UZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkdyZWF0ZXJUaGFuVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9Ikluc3RhbmNlT2ZUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguSW5zdGFuY2VPZlRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5JbnN0YW5jZU9mVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5JbnN0YW5jZU9mVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9Ikluc3RhbmNlT2ZUZXN0X0dlbmVyaWMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5JbnN0YW5jZU9mVGVzdF9HZW5lcmljLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguSW5zdGFuY2VPZlRlc3RfR2VuZXJpYy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5JbnN0YW5jZU9mVGVzdF9HZW5lcmljLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iSW5zdGFuY2VPZlR5cGVUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguSW5zdGFuY2VPZlR5cGVUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguSW5zdGFuY2VPZlR5cGVUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lkluc3RhbmNlT2ZUeXBlVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9Ikluc3RhbmNlT2ZUeXBlVGVzdF9HZW5lcmljIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguSW5zdGFuY2VPZlR5cGVUZXN0X0dlbmVyaWMuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5JbnN0YW5jZU9mVHlwZVRlc3RfR2VuZXJpYy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5JbnN0YW5jZU9mVHlwZVRlc3RfR2VuZXJpYy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkludmFsaWRDb2RlVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjEuMjgzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDb2RlU2hvdWxkTm90Q29tcGlsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC43OTAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguSW52YWxpZENvZGVUZXN0cy5Db2RlU2hvdWxkTm90Q29tcGlsZSgmcXVvdDtJcy5OdWxsLk5vdCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMjI4IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5JbnZhbGlkQ29kZVRlc3RzLkNvZGVTaG91bGROb3RDb21waWxlKCZxdW90O0lzLk51bGwuQW5kLlRocm93cyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTEwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5JbnZhbGlkQ29kZVRlc3RzLkNvZGVTaG91bGROb3RDb21waWxlKCZxdW90O0lzLkFsbC5BbmQuQW5kJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4xMDkiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkludmFsaWRDb2RlVGVzdHMuQ29kZVNob3VsZE5vdENvbXBpbGUoJnF1b3Q7SXMuTm90Lk51bGwuR3JlYXRlclRoYW4oMTApKSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTA3IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5JbnZhbGlkQ29kZVRlc3RzLkNvZGVTaG91bGROb3RDb21waWxlKCZxdW90O0lzLk51bGwuQWxsJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4xMTEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkludmFsaWRDb2RlVGVzdHMuQ29kZVNob3VsZE5vdENvbXBpbGUoJnF1b3Q7SXMuQW5kJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4xMDkiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDb2RlU2hvdWxkTm90Q29tcGlsZUFzRmluaXNoZWRDb25zdHJhaW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjQ4OCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5JbnZhbGlkQ29kZVRlc3RzLkNvZGVTaG91bGROb3RDb21waWxlQXNGaW5pc2hlZENvbnN0cmFpbnQoJnF1b3Q7SXMuQWxsJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4xMTUiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkludmFsaWRDb2RlVGVzdHMuQ29kZVNob3VsZE5vdENvbXBpbGVBc0ZpbmlzaGVkQ29uc3RyYWludCgmcXVvdDtJcy5BbGwuTm90JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4xMTciIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LkludmFsaWRDb2RlVGVzdHMuQ29kZVNob3VsZE5vdENvbXBpbGVBc0ZpbmlzaGVkQ29uc3RyYWludCgmcXVvdDtJcy5Ob3QmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjEyOCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguSW52YWxpZENvZGVUZXN0cy5Db2RlU2hvdWxkTm90Q29tcGlsZUFzRmluaXNoZWRDb25zdHJhaW50KCZxdW90O0lzLk5vdC5BbGwmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjEyMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTGVuZ3RoVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lkxlbmd0aFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5MZW5ndGhUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lkxlbmd0aFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJMZXNzVGhhbk9yRXF1YWxUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTGVzc1RoYW5PckVxdWFsVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lkxlc3NUaGFuT3JFcXVhbFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTGVzc1RoYW5PckVxdWFsVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9Ikxlc3NUaGFuVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lkxlc3NUaGFuVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lkxlc3NUaGFuVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5MZXNzVGhhblRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJNZXNzYWdlVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk1lc3NhZ2VUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTWVzc2FnZVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTWVzc2FnZVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJNaXhlZE9wZXJhdG9yT3ZlcnJpZGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTWl4ZWRPcGVyYXRvck92ZXJyaWRlcy5Db21wbGV4VGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTmFOVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk5hTlRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5OYU5UZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk5hTlRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJOb25lVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk5vbmVUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTm9uZVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTm9uZVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJOb3RPcGVyYXRvck92ZXJyaWRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTm90T3BlcmF0b3JPdmVycmlkZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk5vdE9wZXJhdG9yT3ZlcnJpZGUuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTm90T3BlcmF0b3JPdmVycmlkZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9Ik5vdFNhbWVQYXRoT3JVbmRlclRlc3RfSWdub3JlQ2FzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk5vdFNhbWVQYXRoT3JVbmRlclRlc3RfSWdub3JlQ2FzZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk5vdFNhbWVQYXRoT3JVbmRlclRlc3RfSWdub3JlQ2FzZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Ob3RTYW1lUGF0aE9yVW5kZXJUZXN0X0lnbm9yZUNhc2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJOb3RTYW1lUGF0aE9yVW5kZXJUZXN0X1Jlc3BlY3RDYXNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTm90U2FtZVBhdGhPclVuZGVyVGVzdF9SZXNwZWN0Q2FzZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk5vdFNhbWVQYXRoT3JVbmRlclRlc3RfUmVzcGVjdENhc2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTm90U2FtZVBhdGhPclVuZGVyVGVzdF9SZXNwZWN0Q2FzZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9Ik5vdFNhbWVQYXRoVGVzdF9JZ25vcmVDYXNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTm90U2FtZVBhdGhUZXN0X0lnbm9yZUNhc2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Ob3RTYW1lUGF0aFRlc3RfSWdub3JlQ2FzZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Ob3RTYW1lUGF0aFRlc3RfSWdub3JlQ2FzZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9Ik5vdFNhbWVQYXRoVGVzdF9SZXNwZWN0Q2FzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk5vdFNhbWVQYXRoVGVzdF9SZXNwZWN0Q2FzZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk5vdFNhbWVQYXRoVGVzdF9SZXNwZWN0Q2FzZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Ob3RTYW1lUGF0aFRlc3RfUmVzcGVjdENhc2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJOb3RUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTm90VGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk5vdFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTm90VGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9Ik5vdFRlc3RfQ2FzY2FkZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Ob3RUZXN0X0Nhc2NhZGVkLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguTm90VGVzdF9DYXNjYWRlZC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Ob3RUZXN0X0Nhc2NhZGVkLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTnVsbFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5OdWxsVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk51bGxUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk51bGxUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iT3BlcmF0b3JQcmVjZWRlbmNlVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5PcGVyYXRvclByZWNlZGVuY2VUZXN0cy5Tb21lVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk9wZXJhdG9yUHJlY2VkZW5jZVRlc3RzLldpdGhUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjYiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJPck9wZXJhdG9yT3ZlcnJpZGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Pck9wZXJhdG9yT3ZlcnJpZGUuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Pck9wZXJhdG9yT3ZlcnJpZGUuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguT3JPcGVyYXRvck92ZXJyaWRlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iT3JUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguT3JUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguT3JUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk9yVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9Ik9yVGVzdF9UaHJlZU9ycyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk9yVGVzdF9UaHJlZU9ycy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4Lk9yVGVzdF9UaHJlZU9ycy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5PclRlc3RfVGhyZWVPcnMuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJQcm9wZXJ0eUV4aXN0c1Rlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Qcm9wZXJ0eUV4aXN0c1Rlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Qcm9wZXJ0eUV4aXN0c1Rlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguUHJvcGVydHlFeGlzdHNUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUHJvcGVydHlFeGlzdHNUZXN0X0FuZEZvbGxvd3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Qcm9wZXJ0eUV4aXN0c1Rlc3RfQW5kRm9sbG93cy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlByb3BlcnR5RXhpc3RzVGVzdF9BbmRGb2xsb3dzLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlByb3BlcnR5RXhpc3RzVGVzdF9BbmRGb2xsb3dzLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUHJvcGVydHlTeW50YXhWYXJpYXRpb25zIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguUHJvcGVydHlTeW50YXhWYXJpYXRpb25zLkV4aXN0ZW5jZVRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlByb3BlcnR5U3ludGF4VmFyaWF0aW9ucy5TZXBhcmF0ZUNvbnN0cmFpbnRUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlByb3BlcnR5VGVzdF9Db25zdHJhaW50Rm9sbG93cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlByb3BlcnR5VGVzdF9Db25zdHJhaW50Rm9sbG93cy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlByb3BlcnR5VGVzdF9Db25zdHJhaW50Rm9sbG93cy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Qcm9wZXJ0eVRlc3RfQ29uc3RyYWludEZvbGxvd3MuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJQcm9wZXJ0eVRlc3RfTm90Rm9sbG93cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlByb3BlcnR5VGVzdF9Ob3RGb2xsb3dzLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguUHJvcGVydHlUZXN0X05vdEZvbGxvd3MuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguUHJvcGVydHlUZXN0X05vdEZvbGxvd3MuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJSZWdleFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5SZWdleFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5SZWdleFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguUmVnZXhUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUmVnZXhUZXN0X0lnbm9yZUNhc2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5SZWdleFRlc3RfSWdub3JlQ2FzZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlJlZ2V4VGVzdF9JZ25vcmVDYXNlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlJlZ2V4VGVzdF9JZ25vcmVDYXNlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iU2FtZVBhdGhPclVuZGVyVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlNhbWVQYXRoT3JVbmRlclRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5TYW1lUGF0aE9yVW5kZXJUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlNhbWVQYXRoT3JVbmRlclRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTYW1lUGF0aE9yVW5kZXJUZXN0X0lnbm9yZUNhc2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5TYW1lUGF0aE9yVW5kZXJUZXN0X0lnbm9yZUNhc2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5TYW1lUGF0aE9yVW5kZXJUZXN0X0lnbm9yZUNhc2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguU2FtZVBhdGhPclVuZGVyVGVzdF9JZ25vcmVDYXNlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iU2FtZVBhdGhPclVuZGVyVGVzdF9SZXNwZWN0Q2FzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlNhbWVQYXRoT3JVbmRlclRlc3RfUmVzcGVjdENhc2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5TYW1lUGF0aE9yVW5kZXJUZXN0X1Jlc3BlY3RDYXNlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlNhbWVQYXRoT3JVbmRlclRlc3RfUmVzcGVjdENhc2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTYW1lUGF0aFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5TYW1lUGF0aFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5TYW1lUGF0aFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguU2FtZVBhdGhUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iU2FtZVBhdGhUZXN0X0lnbm9yZUNhc2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5TYW1lUGF0aFRlc3RfSWdub3JlQ2FzZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlNhbWVQYXRoVGVzdF9JZ25vcmVDYXNlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlNhbWVQYXRoVGVzdF9JZ25vcmVDYXNlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iU2FtZVBhdGhUZXN0X1Jlc3BlY3RDYXNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguU2FtZVBhdGhUZXN0X1Jlc3BlY3RDYXNlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguU2FtZVBhdGhUZXN0X1Jlc3BlY3RDYXNlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlNhbWVQYXRoVGVzdF9SZXNwZWN0Q2FzZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlNvbWVUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguU29tZVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Tb21lVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Tb21lVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlNvbWVUZXN0X0JlZm9yZUJpbmFyeU9wZXJhdG9ycyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlNvbWVUZXN0X0JlZm9yZUJpbmFyeU9wZXJhdG9ycy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlNvbWVUZXN0X0JlZm9yZUJpbmFyeU9wZXJhdG9ycy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Tb21lVGVzdF9CZWZvcmVCaW5hcnlPcGVyYXRvcnMuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTb21lVGVzdF9OZXN0ZWRTb21lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguU29tZVRlc3RfTmVzdGVkU29tZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlNvbWVUZXN0X05lc3RlZFNvbWUuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguU29tZVRlc3RfTmVzdGVkU29tZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlNvbWVUZXN0X1VzZU9mQW5kU29tZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlNvbWVUZXN0X1VzZU9mQW5kU29tZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlNvbWVUZXN0X1VzZU9mQW5kU29tZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5Tb21lVGVzdF9Vc2VPZkFuZFNvbWUuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTdGFydHNXaXRoVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlN0YXJ0c1dpdGhUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguU3RhcnRzV2l0aFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguU3RhcnRzV2l0aFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTdGFydHNXaXRoVGVzdF9JZ25vcmVDYXNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguU3RhcnRzV2l0aFRlc3RfSWdub3JlQ2FzZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlN0YXJ0c1dpdGhUZXN0X0lnbm9yZUNhc2UuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguU3RhcnRzV2l0aFRlc3RfSWdub3JlQ2FzZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlN1YnN0cmluZ1Rlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5TdWJzdHJpbmdUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguU3Vic3RyaW5nVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5TdWJzdHJpbmdUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iU3Vic3RyaW5nVGVzdF9JZ25vcmVDYXNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguU3Vic3RyaW5nVGVzdF9JZ25vcmVDYXNlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguU3Vic3RyaW5nVGVzdF9JZ25vcmVDYXNlLlN5bnRheFRlc3QuU3VwcG9ydGVkQnlJbmhlcml0ZWRTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlN1YnN0cmluZ1Rlc3RfSWdub3JlQ2FzZS5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRleHRDb250YWlucyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlRleHRDb250YWlucy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlRleHRDb250YWlucy5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5UZXh0Q29udGFpbnMuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXh0RW5kc1dpdGhUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVGV4dEVuZHNXaXRoVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlRleHRFbmRzV2l0aFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVGV4dEVuZHNXaXRoVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRleHRNYXRjaGVzVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlRleHRNYXRjaGVzVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlRleHRNYXRjaGVzVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5UZXh0TWF0Y2hlc1Rlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXh0U3RhcnRzV2l0aFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5UZXh0U3RhcnRzV2l0aFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUNvbnN0cmFpbnRCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5UZXh0U3RhcnRzV2l0aFRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVGV4dFN0YXJ0c1dpdGhUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGhyb3dzVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDUyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5UaHJvd3NUZXN0cy5EZWxlZ2F0ZVRocm93c0V4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVGhyb3dzVGVzdHMuVGhyb3dzQXJndW1lbnRFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlRocm93c1Rlc3RzLlRocm93c0V4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVGhyb3dzVGVzdHMuVGhyb3dzRXhjZXB0aW9uSW5zdGFuY2VPZiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVGhyb3dzVGVzdHMuVGhyb3dzRXhjZXB0aW9uVHlwZU9mIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5UaHJvd3NUZXN0cy5UaHJvd3NFeGNlcHRpb25UeXBlT2ZBbmRDb25zdHJhaW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5UaHJvd3NUZXN0cy5UaHJvd3NFeGNlcHRpb25XaXRoQ29uc3RyYWludCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVGhyb3dzVGVzdHMuVGhyb3dzRXhjZXB0aW9uV2l0aElubmVyRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5UaHJvd3NUZXN0cy5UaHJvd3NJbm5lckV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVGhyb3dzVGVzdHMuVGhyb3dzSW5zdGFuY2VPZiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVGhyb3dzVGVzdHMuVGhyb3dzSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVGhyb3dzVGVzdHMuVGhyb3dzVGFyZ2V0SW52b2NhdGlvbkV4Y2VwdGlvbldpdGhJbm5lckV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVGhyb3dzVGVzdHMuVGhyb3dzVHlwZU9mIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5UaHJvd3NUZXN0cy5UaHJvd3NUeXBlT2ZBbmRDb25zdHJhaW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5UaHJvd3NUZXN0cy5UaHJvd3NUeXBlT2ZXaXRoQ29uc3RyYWludCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVGhyb3dzVGVzdHMuVGhyb3dzVHlwZU9mV2l0aElubmVyRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5UaHJvd3NUZXN0cy5UaHJvd3NUeXBlb2ZXaXRoTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUcnVlVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlRydWVUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVHJ1ZVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVHJ1ZVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeVN0YXRpY1N5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJVbmlxdWVUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVW5pcXVlVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5Q29uc3RyYWludEJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuU3ludGF4LlVuaXF1ZVRlc3QuU3ludGF4VGVzdC5TdXBwb3J0ZWRCeUluaGVyaXRlZFN5bnRheCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguVW5pcXVlVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5U3RhdGljU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlhtbFNlcmlhbGl6YWJsZVRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5YbWxTZXJpYWxpemFibGVUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlDb25zdHJhaW50QnVpbGRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5TeW50YXguWG1sU2VyaWFsaXphYmxlVGVzdC5TeW50YXhUZXN0LlN1cHBvcnRlZEJ5SW5oZXJpdGVkU3ludGF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlN5bnRheC5YbWxTZXJpYWxpemFibGVUZXN0LlN5bnRheFRlc3QuU3VwcG9ydGVkQnlTdGF0aWNTeW50YXgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJOYW1lc3BhY2UiIG5hbWU9IlRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIxLjYyNSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFycmF5RXF1YWxzRmFpbHVyZU1lc3NhZ2VGaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1OCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5BcnJheUVxdWFsc0ZhaWx1cmVNZXNzYWdlRml4dHVyZS5BY3R1YWxBcnJheUlzTG9uZ2VyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5RXF1YWxzRmFpbHVyZU1lc3NhZ2VGaXh0dXJlLkFycmF5QW5kQ29sbGVjdGlvbl9GYWlsdXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5RXF1YWxzRmFpbHVyZU1lc3NhZ2VGaXh0dXJlLkFycmF5c0RlY2xhcmVkQXNEaWZmZXJlbnRUeXBlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5BcnJheUVxdWFsc0ZhaWx1cmVNZXNzYWdlRml4dHVyZS5BcnJheXNIYXZlRGlmZmVyZW50UmFua3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXJyYXlFcXVhbHNGYWlsdXJlTWVzc2FnZUZpeHR1cmUuQXJyYXlzV2l0aERpZmZlcmVudERpbWVuc2lvbnNBc0NvbGxlY3Rpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXJyYXlFcXVhbHNGYWlsdXJlTWVzc2FnZUZpeHR1cmUuQXJyYXlzV2l0aERpZmZlcmVudFJhbmtzQXNDb2xsZWN0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5RXF1YWxzRmFpbHVyZU1lc3NhZ2VGaXh0dXJlLkRpZmZlcmVudEFycmF5VHlwZXNFcXVhbEZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5RXF1YWxzRmFpbHVyZU1lc3NhZ2VGaXh0dXJlLkRvdWJsZURpbWVuc2lvbmVkQXJyYXlzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5RXF1YWxzRmFpbHVyZU1lc3NhZ2VGaXh0dXJlLkV4cGVjdGVkQXJyYXlJc0xvbmdlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5BcnJheUVxdWFsc0ZhaWx1cmVNZXNzYWdlRml4dHVyZS5GYWlsdXJlT25TaW5nbGVEaW1lbnNpb25lZEFycmF5cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5BcnJheUVxdWFsc0ZhaWx1cmVNZXNzYWdlRml4dHVyZS5GaXZlRGltZW5zaW9uZWRBcnJheXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXJyYXlFcXVhbHNGYWlsdXJlTWVzc2FnZUZpeHR1cmUuSmFnZ2VkQXJyYXlDb21wYXJlZFRvU2ltcGxlQXJyYXkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXJyYXlFcXVhbHNGYWlsdXJlTWVzc2FnZUZpeHR1cmUuSmFnZ2VkQXJyYXlzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5RXF1YWxzRmFpbHVyZU1lc3NhZ2VGaXh0dXJlLlNhbWVMZW5ndGhEaWZmZXJlbnRDb250ZW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5RXF1YWxzRmFpbHVyZU1lc3NhZ2VGaXh0dXJlLlRyaXBsZURpbWVuc2lvbmVkQXJyYXlzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFycmF5RXF1YWxzRml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXJyYXlFcXVhbHNGaXh0dXJlLkFycmF5QW5kQ29sbGVjdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5BcnJheUVxdWFsc0ZpeHR1cmUuQXJyYXlJc0VxdWFsVG9JdHNlbGYiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXJyYXlFcXVhbHNGaXh0dXJlLkFycmF5T2ZJbnRBbmRBcnJheU9mRG91YmxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5RXF1YWxzRml4dHVyZS5BcnJheXNEZWNsYXJlZEFzRGlmZmVyZW50VHlwZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXJyYXlFcXVhbHNGaXh0dXJlLkFycmF5c09mQXJyYXlzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5RXF1YWxzRml4dHVyZS5BcnJheXNPZkRlY2ltYWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXJyYXlFcXVhbHNGaXh0dXJlLkFycmF5c09mRG91YmxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5RXF1YWxzRml4dHVyZS5BcnJheXNPZkludCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5BcnJheUVxdWFsc0ZpeHR1cmUuQXJyYXlzT2ZNaXhlZFR5cGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5RXF1YWxzRml4dHVyZS5BcnJheXNPZlN0cmluZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5BcnJheUVxdWFsc0ZpeHR1cmUuQXJyYXlzUGFzc2VkQXNPYmplY3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5RXF1YWxzRml4dHVyZS5BcnJheXNXaXRoRGlmZmVyZW50RGltZW5zaW9uc01hdGNoZWRBc0NvbGxlY3Rpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXJyYXlFcXVhbHNGaXh0dXJlLkFycmF5c1dpdGhEaWZmZXJlbnRSYW5rc0NvbXBhcmVkQXNDb2xsZWN0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5RXF1YWxzRml4dHVyZS5Eb3VibGVEaW1lbnNpb25lZEFycmF5cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5BcnJheUVxdWFsc0ZpeHR1cmUuRml2ZURpbWVuc2lvbmVkQXJyYXlzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5RXF1YWxzRml4dHVyZS5KYWdnZWRBcnJheXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXJyYXlFcXVhbHNGaXh0dXJlLlRyaXBsZURpbWVuc2lvbmVkQXJyYXlzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFycmF5Tm90RXF1YWxGaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5BcnJheU5vdEVxdWFsRml4dHVyZS5BcnJheXNEZWNsYXJlZEFzRGlmZmVyZW50VHlwZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXJyYXlOb3RFcXVhbEZpeHR1cmUuRGlmZmVyZW50TGVuZ3RoQXJyYXlzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFycmF5Tm90RXF1YWxGaXh0dXJlLlNhbWVMZW5ndGhEaWZmZXJlbnRDb250ZW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFzc2VydFRocm93c1Rlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA0MSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Bc3NlcnRUaHJvd3NUZXN0cy5CYXNlRXhjZXB0aW9uVGhyb3duIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFzc2VydFRocm93c1Rlc3RzLkNhbkNhdGNoRXhjZXB0aW9uT2ZEZXJpdmVkVHlwZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Bc3NlcnRUaHJvd3NUZXN0cy5DYW5DYXRjaEV4Y2VwdGlvbk9mRXhhY3RUeXBlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFzc2VydFRocm93c1Rlc3RzLkNhbkNhdGNoVW5zcGVjaWZpZWRFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXNzZXJ0VGhyb3dzVGVzdHMuQ29ycmVjdEV4Y2VwdGlvbklzUmV0dXJuZWRUb01ldGhvZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjE2IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXNzZXJ0VGhyb3dzVGVzdHMuQ29ycmVjdEV4Y2VwdGlvblRocm93biIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Bc3NlcnRUaHJvd3NUZXN0cy5EZXJpdmVkRXhjZXB0aW9uVGhyb3duIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFzc2VydFRocm93c1Rlc3RzLkRvZXNOb3RUaHJvd0ZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFzc2VydFRocm93c1Rlc3RzLkRvZXNOb3RUaHJvd1N1Y2VlZHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXNzZXJ0VGhyb3dzVGVzdHMuTm9FeGNlcHRpb25UaHJvd24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXNzZXJ0VGhyb3dzVGVzdHMuVW5yZWxhdGVkRXhjZXB0aW9uVGhyb3duIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFzc3VtZVRoYXRUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNzkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXNzdW1lVGhhdFRlc3RzLkFzc3VtcHRpb25QYXNzZXNfQWN0dWFsQW5kQ29uc3RyYWludCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Bc3N1bWVUaGF0VGVzdHMuQXNzdW1wdGlvblBhc3Nlc19BY3R1YWxBbmRDb25zdHJhaW50V2l0aE1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXNzdW1lVGhhdFRlc3RzLkFzc3VtcHRpb25QYXNzZXNfQWN0dWFsQW5kQ29uc3RyYWludFdpdGhNZXNzYWdlQW5kQXJncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Bc3N1bWVUaGF0VGVzdHMuQXNzdW1wdGlvblBhc3Nlc19Cb29sZWFuIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFzc3VtZVRoYXRUZXN0cy5Bc3N1bXB0aW9uUGFzc2VzX0Jvb2xlYW5XaXRoTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Bc3N1bWVUaGF0VGVzdHMuQXNzdW1wdGlvblBhc3Nlc19Cb29sZWFuV2l0aE1lc3NhZ2VBbmRBcmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFzc3VtZVRoYXRUZXN0cy5Bc3N1bXB0aW9uUGFzc2VzX0RlbGVnYXRlQW5kQ29uc3RyYWludCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Bc3N1bWVUaGF0VGVzdHMuQXNzdW1wdGlvblBhc3Nlc19EZWxlZ2F0ZUFuZENvbnN0cmFpbnRXaXRoTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Bc3N1bWVUaGF0VGVzdHMuQXNzdW1wdGlvblBhc3Nlc19EZWxlZ2F0ZUFuZENvbnN0cmFpbnRXaXRoTWVzc2FnZUFuZEFyZ3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXNzdW1lVGhhdFRlc3RzLkFzc3VtcHRpb25QYXNzZXNfUmVmZXJlbmNlQW5kQ29uc3RyYWludCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Bc3N1bWVUaGF0VGVzdHMuQXNzdW1wdGlvblBhc3Nlc19SZWZlcmVuY2VBbmRDb25zdHJhaW50V2l0aE1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXNzdW1lVGhhdFRlc3RzLkFzc3VtcHRpb25QYXNzZXNfUmVmZXJlbmNlQW5kQ29uc3RyYWludFdpdGhNZXNzYWdlQW5kQXJncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Bc3N1bWVUaGF0VGVzdHMuRmFpbHVyZVRocm93c0luY29uY2x1c2l2ZUV4Y2VwdGlvbl9BY3R1YWxBbmRDb25zdHJhaW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFzc3VtZVRoYXRUZXN0cy5GYWlsdXJlVGhyb3dzSW5jb25jbHVzaXZlRXhjZXB0aW9uX0FjdHVhbEFuZENvbnN0cmFpbnRXaXRoTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Bc3N1bWVUaGF0VGVzdHMuRmFpbHVyZVRocm93c0luY29uY2x1c2l2ZUV4Y2VwdGlvbl9BY3R1YWxBbmRDb25zdHJhaW50V2l0aE1lc3NhZ2VBbmRBcmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFzc3VtZVRoYXRUZXN0cy5GYWlsdXJlVGhyb3dzSW5jb25jbHVzaXZlRXhjZXB0aW9uX0Jvb2xlYW4iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXNzdW1lVGhhdFRlc3RzLkZhaWx1cmVUaHJvd3NJbmNvbmNsdXNpdmVFeGNlcHRpb25fQm9vbGVhbldpdGhNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFzc3VtZVRoYXRUZXN0cy5GYWlsdXJlVGhyb3dzSW5jb25jbHVzaXZlRXhjZXB0aW9uX0Jvb2xlYW5XaXRoTWVzc2FnZUFuZEFyZ3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQXNzdW1lVGhhdFRlc3RzLkZhaWx1cmVUaHJvd3NJbmNvbmNsdXNpdmVFeGNlcHRpb25fRGVsZWdhdGVBbmRDb25zdHJhaW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFzc3VtZVRoYXRUZXN0cy5GYWlsdXJlVGhyb3dzSW5jb25jbHVzaXZlRXhjZXB0aW9uX0RlbGVnYXRlQW5kQ29uc3RyYWludFdpdGhNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFzc3VtZVRoYXRUZXN0cy5GYWlsdXJlVGhyb3dzSW5jb25jbHVzaXZlRXhjZXB0aW9uX0RlbGVnYXRlQW5kQ29uc3RyYWludFdpdGhNZXNzYWdlQW5kQXJncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Bc3N1bWVUaGF0VGVzdHMuRmFpbHVyZVRocm93c0luY29uY2x1c2l2ZUV4Y2VwdGlvbl9SZWZlcmVuY2VBbmRDb25zdHJhaW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkFzc3VtZVRoYXRUZXN0cy5GYWlsdXJlVGhyb3dzSW5jb25jbHVzaXZlRXhjZXB0aW9uX1JlZmVyZW5jZUFuZENvbnN0cmFpbnRXaXRoTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Bc3N1bWVUaGF0VGVzdHMuRmFpbHVyZVRocm93c0luY29uY2x1c2l2ZUV4Y2VwdGlvbl9SZWZlcmVuY2VBbmRDb25zdHJhaW50V2l0aE1lc3NhZ2VBbmRBcmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkNvbGxlY3Rpb25Bc3NlcnRUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjE2NCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5BcmVFcXVhbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5BcmVFcXVhbF9IYW5kbGVzTnVsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5BcmVFcXVhbF9Vc2luZ0l0ZXJhdG9yIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LkFyZUVxdWFsRmFpbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5BcmVFcXVhbEZhaWxDb3VudCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5BcmVFcXVpdmFsZW50SGFuZGxlc051bGwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29sbGVjdGlvbkFzc2VydFRlc3QuQXJlTm90RXF1YWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSI2IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29sbGVjdGlvbkFzc2VydFRlc3QuQXJlTm90RXF1YWxfRmFpbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29sbGVjdGlvbkFzc2VydFRlc3QuQXJlTm90RXF1YWxfSGFuZGxlc051bGwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29sbGVjdGlvbkFzc2VydFRlc3QuQ29udGFpbnNfSUNvbGxlY3Rpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29sbGVjdGlvbkFzc2VydFRlc3QuQ29udGFpbnNfSUxpc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29sbGVjdGlvbkFzc2VydFRlc3QuQ29udGFpbnNGYWlsc19FbXB0eUlDb2xsZWN0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LkNvbnRhaW5zRmFpbHNfRW1wdHlJTGlzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5Db250YWluc0ZhaWxzX0lDb2xsZWN0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LkNvbnRhaW5zRmFpbHNfSUxJc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29sbGVjdGlvbkFzc2VydFRlc3QuQ29udGFpbnNOdWxsX0lDb2xsZWN0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LkNvbnRhaW5zTnVsbF9JTGlzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5Eb2VzTm90Q29udGFpbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5Eb2VzTm90Q29udGFpbl9FbXB0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5Eb2VzTm90Q29udGFpbl9GYWlscyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5FbnN1cmVDb21wYXJlcklzVXNlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5FcXVpdmFsZW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LkVxdWl2YWxlbnRGYWlsT25lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LkVxdWl2YWxlbnRGYWlsVHdvIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LklzTm90U3Vic2V0T2YiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29sbGVjdGlvbkFzc2VydFRlc3QuSXNOb3RTdWJzZXRPZl9GYWlscyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5Jc05vdFN1YnNldE9mSGFuZGxlc051bGwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29sbGVjdGlvbkFzc2VydFRlc3QuSXNPcmRlcmVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LklzT3JkZXJlZF9BbGxvd3NfYWRqYWNlbnRfZXF1YWxfdmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LklzT3JkZXJlZF9Db250YWluZWRUeXBlc011c3RCZUNvbXBhdGlibGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29sbGVjdGlvbkFzc2VydFRlc3QuSXNPcmRlcmVkX0ZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LklzT3JkZXJlZF9IYW5kbGVzX2N1c3RvbV9jb21wYXJpc29uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LklzT3JkZXJlZF9IYW5kbGVzX2N1c3RvbV9jb21wYXJpc29uMiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5Jc09yZGVyZWRfSGFuZGxlc19udWxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LklzT3JkZXJlZF9UeXBlc011c3RJbXBsZW1lbnRJQ29tcGFyYWJsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5Jc1N1YnNldE9mIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LklzU3Vic2V0T2ZfRmFpbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29sbGVjdGlvbkFzc2VydFRlc3QuSXNTdWJzZXRPZkhhbmRsZXNOdWxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0Lkl0ZW1zTm90TnVsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5JdGVtc05vdE51bGxGYWlsdXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0Lkl0ZW1zT2ZUeXBlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0Lkl0ZW1zT2ZUeXBlRmFpbHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5Ob3RFcXVpdmFsZW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0Lk5vdEVxdWl2YWxlbnRfRmFpbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29sbGVjdGlvbkFzc2VydFRlc3QuTm90RXF1aXZhbGVudEhhbmRsZXNOdWxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LlVuaXF1ZV9XaXRoTnVsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db2xsZWN0aW9uQXNzZXJ0VGVzdC5VbmlxdWVfV2l0aE9iamVjdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29sbGVjdGlvbkFzc2VydFRlc3QuVW5pcXVlX1dpdGhTdHJpbmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbGxlY3Rpb25Bc3NlcnRUZXN0LlVuaXF1ZUZhaWx1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29sbGVjdGlvbkFzc2VydFRlc3QuVW5pcXVlRmFpbHVyZV9XaXRoVHdvTnVsbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQ29uZGl0aW9uQXNzZXJ0VGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDU3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbmRpdGlvbkFzc2VydFRlc3RzLklzRW1wdHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29uZGl0aW9uQXNzZXJ0VGVzdHMuSXNFbXB0eUZhaWxzT25Ob25FbXB0eUFycmF5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbmRpdGlvbkFzc2VydFRlc3RzLklzRW1wdHlGYWlsc09uTnVsbFN0cmluZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db25kaXRpb25Bc3NlcnRUZXN0cy5Jc0VtcHR5RmFpbHNPblN0cmluZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db25kaXRpb25Bc3NlcnRUZXN0cy5Jc0ZhbHNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbmRpdGlvbkFzc2VydFRlc3RzLklzRmFsc2VGYWlscyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db25kaXRpb25Bc3NlcnRUZXN0cy5Jc05hTiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db25kaXRpb25Bc3NlcnRUZXN0cy5Jc05hTkZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbmRpdGlvbkFzc2VydFRlc3RzLklzTm90RW1wdHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29uZGl0aW9uQXNzZXJ0VGVzdHMuSXNOb3RFbXB0eUZhaWxzT25FbXB0eUFycmF5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbmRpdGlvbkFzc2VydFRlc3RzLklzTm90RW1wdHlGYWlsc09uRW1wdHlBcnJheUxpc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29uZGl0aW9uQXNzZXJ0VGVzdHMuSXNOb3RFbXB0eUZhaWxzT25FbXB0eUhhc2hUYWJsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db25kaXRpb25Bc3NlcnRUZXN0cy5Jc05vdEVtcHR5RmFpbHNPbkVtcHR5U3RyaW5nIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbmRpdGlvbkFzc2VydFRlc3RzLklzTm90TnVsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db25kaXRpb25Bc3NlcnRUZXN0cy5Jc05vdE51bGxGYWlscyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Db25kaXRpb25Bc3NlcnRUZXN0cy5Jc051bGwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29uZGl0aW9uQXNzZXJ0VGVzdHMuSXNOdWxsRmFpbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuQ29uZGl0aW9uQXNzZXJ0VGVzdHMuSXNUcnVlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkNvbmRpdGlvbkFzc2VydFRlc3RzLklzVHJ1ZUZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkRpcmVjdG9yeUFzc2VydFRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjIxMiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5BcmVFcXVhbEZhaWxzV2hlbk9uZURvZXNOb3RFeGlzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5BcmVFcXVhbEZhaWxzV2hlbk9uZUlzTnVsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5BcmVFcXVhbEZhaWxzV2l0aERpcmVjdG9yeUluZm9zIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkRpcmVjdG9yeUFzc2VydFRlc3RzLkFyZUVxdWFsRmFpbHNXaXRoU3RyaW5nUGF0aCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5BcmVFcXVhbFBhc3Nlc1doZW5Cb3RoQXJlTnVsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5BcmVFcXVhbFBhc3Nlc1dpdGhEaXJlY3RvcnlJbmZvcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5BcmVFcXVhbFBhc3Nlc1dpdGhTdHJpbmdQYXRoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkRpcmVjdG9yeUFzc2VydFRlc3RzLkFyZU5vdEVxdWFsRmFpbHNXaGVuQm90aEFyZU51bGwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRGlyZWN0b3J5QXNzZXJ0VGVzdHMuQXJlTm90RXF1YWxGYWlsc1dpdGhEaXJlY3RvcnlJbmZvcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5BcmVOb3RFcXVhbEZhaWxzV2l0aFN0cmluZ1BhdGgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRGlyZWN0b3J5QXNzZXJ0VGVzdHMuQXJlTm90RXF1YWxQYXNzZXNJZk9uZUlzTnVsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5BcmVOb3RFcXVhbFBhc3Nlc1doZW5PbmVEb2VzTm90RXhpc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRGlyZWN0b3J5QXNzZXJ0VGVzdHMuQXJlTm90RXF1YWxQYXNzZXNXaXRoU3RyaW5nUGF0aCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5Jc0VtcHR5RmFpbHNXaXRoSW52YWxpZERpcmVjdG9yeSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5Jc0VtcHR5RmFpbHNXaXRoTm9uRW1wdHlEaXJlY3RvcnlVc2luZ0RpcmVjdG9yeUluZm8iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRGlyZWN0b3J5QXNzZXJ0VGVzdHMuSXNFbXB0eUZhaWxzV2l0aE5vbkVtcHR5RGlyZWN0b3J5VXNpbmdTdHJpbmdQYXRoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkRpcmVjdG9yeUFzc2VydFRlc3RzLklzRW1wdHlQYXNzZXNXaXRoRW1wdHlEaXJlY3RvcnlVc2luZ0RpcmVjdG9yeUluZm8iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRGlyZWN0b3J5QXNzZXJ0VGVzdHMuSXNFbXB0eVBhc3Nlc1dpdGhFbXB0eURpcmVjdG9yeVVzaW5nU3RyaW5nUGF0aCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5Jc0VtcHR5VGhyb3dzVXNpbmdOdWxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkRpcmVjdG9yeUFzc2VydFRlc3RzLklzTm90RW1wdHlGYWlsc1dpdGhFbXB0eURpcmVjdG9yeVVzaW5nRGlyZWN0b3J5SW5mbyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5Jc05vdEVtcHR5RmFpbHNXaXRoRW1wdHlEaXJlY3RvcnlVc2luZ1N0cmluZ1BhdGgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRGlyZWN0b3J5QXNzZXJ0VGVzdHMuSXNOb3RFbXB0eUZhaWxzV2l0aEludmFsaWREaXJlY3RvcnkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRGlyZWN0b3J5QXNzZXJ0VGVzdHMuSXNOb3RFbXB0eVBhc3Nlc1dpdGhOb25FbXB0eURpcmVjdG9yeVVzaW5nRGlyZWN0b3J5SW5mbyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5Jc05vdEVtcHR5UGFzc2VzV2l0aE5vbkVtcHR5RGlyZWN0b3J5VXNpbmdTdHJpbmdQYXRoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkRpcmVjdG9yeUFzc2VydFRlc3RzLklzTm90RW1wdHlUaHJvd3NVc2luZ051bGwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRGlyZWN0b3J5QXNzZXJ0VGVzdHMuSXNOb3RXaXRoaW5GYWlsc1dpdGhEaXJlY3RvcnlJbmZvIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkRpcmVjdG9yeUFzc2VydFRlc3RzLklzTm90V2l0aGluRmFpbHNXaXRoU3RyaW5nUGF0aCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5Jc05vdFdpdGhpblBhc3Nlc1doZW5PdXRzaWRlUGF0aFVzaW5nRGlyZWN0b3J5SW5mbyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5Jc05vdFdpdGhpblBhc3Nlc1doZW5PdXRzaWRlUGF0aFVzaW5nU3RyaW5nUGF0aCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5Jc05vdFdpdGhpblRocm93c1doZW5Cb3RoQXJlTnVsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5Jc1dpdGhpbkZhaWxzV2hlbk91dHNpZGVQYXRoVXNpbmdEaXJlY3RvcnlJbmZvIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkRpcmVjdG9yeUFzc2VydFRlc3RzLklzV2l0aGluRmFpbHNXaGVuT3V0c2lkZVBhdGhVc2luZ1N0cmluZ1BhdGgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRGlyZWN0b3J5QXNzZXJ0VGVzdHMuSXNXaXRoaW5QYXNzZXNXaXRoRGlyZWN0b3J5SW5mbyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5EaXJlY3RvcnlBc3NlcnRUZXN0cy5Jc1dpdGhpblBhc3Nlc1dpdGhTdHJpbmdQYXRoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkRpcmVjdG9yeUFzc2VydFRlc3RzLklzV2l0aGluUGFzc2VzV2l0aFRlbXBQYXRoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkRpcmVjdG9yeUFzc2VydFRlc3RzLklzV2l0aGluVGhyb3dzV2hlbkJvdGhBcmVOdWxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkVxdWFsc0ZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTE3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkVxdWFsc0ZpeHR1cmUuQnVnNTc1OTM2SW50MzJJbnQ2NENvbXBhcmlzb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRXF1YWxzRml4dHVyZS5CeXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkVxdWFsc0ZpeHR1cmUuRGF0ZVRpbWVFcXVhbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5FcXVhbHNGaXh0dXJlLkRhdGVUaW1lTm90RXF1YWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRXF1YWxzRml4dHVyZS5EZWNpbWFsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkVxdWFsc0ZpeHR1cmUuRGlyZWN0b3J5SW5mb0VxdWFsaXR5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkVxdWFsc0ZpeHR1cmUuRGlyZWN0b3J5SW5mb0VxdWFsaXR5SWdub3Jlc1RyYWlsaW5nRGlyZWN0b3J5U2VwYXJhdG9yIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkVxdWFsc0ZpeHR1cmUuRG91YmxlTm90RXF1YWxNZXNzYWdlRGlzcGxheXNBbGxEaWdpdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRXF1YWxzRml4dHVyZS5Eb3VibGVOb3RFcXVhbE1lc3NhZ2VEaXNwbGF5c0RlZmF1bHRUb2xlcmFuY2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRXF1YWxzRml4dHVyZS5Eb3VibGVOb3RFcXVhbE1lc3NhZ2VEaXNwbGF5c1RvbGVyYW5jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5FcXVhbHNGaXh0dXJlLkRvdWJsZU5vdEVxdWFsV2l0aE5hbkRvZXNOb3REaXNwbGF5RGVmYXVsdFRvbGVyYW5jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5FcXVhbHNGaXh0dXJlLkVudW1zRXF1YWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRXF1YWxzRml4dHVyZS5FbnVtc05vdEVxdWFsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkVxdWFsc0ZpeHR1cmUuRXF1YWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkVxdWFsc0ZpeHR1cmUuRXF1YWxzRmFpbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5FcXVhbHNGaXh0dXJlLkVxdWFsc05hTkZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkVxdWFsc0ZpeHR1cmUuRXF1YWxzTnVsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5FcXVhbHNGaXh0dXJlLkVxdWFsc1NhbWVUeXBlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjMxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRXF1YWxzRml4dHVyZS5FcXVhbHNUaHJvd3NFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRXF1YWxzRml4dHVyZS5GbG9hdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5FcXVhbHNGaXh0dXJlLkZsb2F0Tm90RXF1YWxNZXNzYWdlRGlzcGxheXNBbGxEaWdpdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRXF1YWxzRml4dHVyZS5GbG9hdE5vdEVxdWFsTWVzc2FnZURpc3BsYXlzVG9sZXJhbmNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkVxdWFsc0ZpeHR1cmUuSW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkVxdWFsc0ZpeHR1cmUuSW50ZWdlckVxdWFscyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5FcXVhbHNGaXh0dXJlLkludGVnZXJMb25nQ29tcGFyaXNvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5FcXVhbHNGaXh0dXJlLk5hbkVxdWFsc0ZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkVxdWFsc0ZpeHR1cmUuTmFuRXF1YWxzTmFOU3VjY2VlZHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRXF1YWxzRml4dHVyZS5OZWdJbmZpbml0eUVxdWFsc0luZmluaXR5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkVxdWFsc0ZpeHR1cmUuUG9zSW5maW5pdHlFcXVhbHNJbmZpbml0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5FcXVhbHNGaXh0dXJlLlBvc0luZmluaXR5Tm90RXF1YWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkVxdWFsc0ZpeHR1cmUuUG9zSW5maW5pdHlOb3RFcXVhbHNOZWdJbmZpbml0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5FcXVhbHNGaXh0dXJlLlJlZmVyZW5jZUVxdWFsc1Rocm93c0V4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5FcXVhbHNGaXh0dXJlLlNob3J0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkVxdWFsc0ZpeHR1cmUuU2luZ2xlUG9zSW5maW5pdHlOb3RFcXVhbHNOZWdJbmZpbml0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5FcXVhbHNGaXh0dXJlLlN0cmluZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5FcXVhbHNGaXh0dXJlLlVJbnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRmlsZUFzc2VydFRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjE0MyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5GaWxlQXNzZXJ0VGVzdHMuQXJlRXF1YWxGYWlsc1doZW5PbmVJc051bGwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRmlsZUFzc2VydFRlc3RzLkFyZUVxdWFsRmFpbHNXaXRoRmlsZUluZm9zIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkZpbGVBc3NlcnRUZXN0cy5BcmVFcXVhbEZhaWxzV2l0aEZpbGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkZpbGVBc3NlcnRUZXN0cy5BcmVFcXVhbEZhaWxzV2l0aFN0cmVhbXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRmlsZUFzc2VydFRlc3RzLkFyZUVxdWFsRmFpbHNXaXRoVGV4dEZpbGVzQWZ0ZXJSZWFkaW5nQm90aEZpbGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkZpbGVBc3NlcnRUZXN0cy5BcmVFcXVhbFBhc3Nlc1VzaW5nU2FtZUZpbGVUd2ljZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5GaWxlQXNzZXJ0VGVzdHMuQXJlRXF1YWxQYXNzZXNXaGVuQm90aEFyZU51bGwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRmlsZUFzc2VydFRlc3RzLkFyZUVxdWFsUGFzc2VzV2l0aEVxdWFsU3RyZWFtcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5GaWxlQXNzZXJ0VGVzdHMuQXJlRXF1YWxQYXNzZXNXaXRoRmlsZUluZm9zIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkZpbGVBc3NlcnRUZXN0cy5BcmVFcXVhbFBhc3Nlc1dpdGhGaWxlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5GaWxlQXNzZXJ0VGVzdHMuQXJlRXF1YWxQYXNzZXNXaXRoU2FtZVN0cmVhbSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5GaWxlQXNzZXJ0VGVzdHMuQXJlRXF1YWxQYXNzZXNXaXRoVGV4dEZpbGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkZpbGVBc3NlcnRUZXN0cy5BcmVOb3RFcXVhbEZhaWxzV2hlbkJvdGhBcmVOdWxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkZpbGVBc3NlcnRUZXN0cy5BcmVOb3RFcXVhbEZhaWxzV2l0aEZpbGVJbmZvcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5GaWxlQXNzZXJ0VGVzdHMuQXJlTm90RXF1YWxGYWlsc1dpdGhGaWxlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5GaWxlQXNzZXJ0VGVzdHMuQXJlTm90RXF1YWxGYWlsc1dpdGhTdHJlYW1zIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkZpbGVBc3NlcnRUZXN0cy5BcmVOb3RFcXVhbEl0ZXJhdGVzT3ZlclRoZUVudGlyZUZpbGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRmlsZUFzc2VydFRlc3RzLkFyZU5vdEVxdWFsSXRlcmF0ZXNPdmVyVGhlRW50aXJlRmlsZUFuZEZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkZpbGVBc3NlcnRUZXN0cy5BcmVOb3RFcXVhbFBhc3Nlc0lmT25lSXNOdWxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkZpbGVBc3NlcnRUZXN0cy5BcmVOb3RFcXVhbFBhc3Nlc1dpdGhGaWxlSW5mb3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuRmlsZUFzc2VydFRlc3RzLkFyZU5vdEVxdWFsUGFzc2VzV2l0aEZpbGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkZpbGVBc3NlcnRUZXN0cy5BcmVOb3RFcXVhbFBhc3Nlc1dpdGhTdHJlYW1zIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkZpbGVBc3NlcnRUZXN0cy5Ob25SZWFkYWJsZVN0cmVhbUdpdmVzRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkZpbGVBc3NlcnRUZXN0cy5Ob25TZWVrYWJsZVN0cmVhbUdpdmVzRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkdyZWF0ZXJFcXVhbEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDUzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkdyZWF0ZXJFcXVhbEZpeHR1cmUuRmFpbHVyZU1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuR3JlYXRlckVxdWFsRml4dHVyZS5HcmVhdGVyT3JFcXVhbF9EZWNpbWFsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkdyZWF0ZXJFcXVhbEZpeHR1cmUuR3JlYXRlck9yRXF1YWxfRG91YmxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkdyZWF0ZXJFcXVhbEZpeHR1cmUuR3JlYXRlck9yRXF1YWxfRmxvYXQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuR3JlYXRlckVxdWFsRml4dHVyZS5HcmVhdGVyT3JFcXVhbF9JbnQzMiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5HcmVhdGVyRXF1YWxGaXh0dXJlLkdyZWF0ZXJPckVxdWFsX0xvbmciIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuR3JlYXRlckVxdWFsRml4dHVyZS5HcmVhdGVyT3JFcXVhbF9VSW50MzIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuR3JlYXRlckVxdWFsRml4dHVyZS5HcmVhdGVyT3JFcXVhbF9VTG9uZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5HcmVhdGVyRXF1YWxGaXh0dXJlLk1peGVkVHlwZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSI0MiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkdyZWF0ZXJFcXVhbEZpeHR1cmUuTm90R3JlYXRlckVxdWFsSUNvbXBhcmFibGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuR3JlYXRlckVxdWFsRml4dHVyZS5Ob3RHcmVhdGVyT3JFcXVhbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJHcmVhdGVyRml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuR3JlYXRlckZpeHR1cmUuRmFpbHVyZU1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuR3JlYXRlckZpeHR1cmUuR3JlYXRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5HcmVhdGVyRml4dHVyZS5NaXhlZFR5cGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iNDIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5HcmVhdGVyRml4dHVyZS5Ob3RHcmVhdGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkdyZWF0ZXJGaXh0dXJlLk5vdEdyZWF0ZXJJQ29tcGFyYWJsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5HcmVhdGVyRml4dHVyZS5Ob3RHcmVhdGVyV2hlbkVxdWFsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9Ikxlc3NFcXVhbEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDI0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkxlc3NFcXVhbEZpeHR1cmUuRmFpbHVyZU1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuTGVzc0VxdWFsRml4dHVyZS5MZXNzT3JFcXVhbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjQyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuTGVzc0VxdWFsRml4dHVyZS5NaXhlZFR5cGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iNDIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5MZXNzRXF1YWxGaXh0dXJlLk5vdExlc3NFcXVhbElDb21wYXJhYmxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkxlc3NFcXVhbEZpeHR1cmUuTm90TGVzc09yRXF1YWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTGVzc0ZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDI4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkxlc3NGaXh0dXJlLkZhaWx1cmVNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkxlc3NGaXh0dXJlLkxlc3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIxOCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkxlc3NGaXh0dXJlLk1peGVkVHlwZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSI0MiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkxlc3NGaXh0dXJlLk5vdExlc3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuTGVzc0ZpeHR1cmUuTm90TGVzc0lDb21wYXJhYmxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkxlc3NGaXh0dXJlLk5vdExlc3NXaGVuRXF1YWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTGlzdENvbnRlbnRzVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDIwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkxpc3RDb250ZW50c1Rlc3RzLkFycmF5RmFpbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuTGlzdENvbnRlbnRzVGVzdHMuQXJyYXlMaXN0RmFpbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuTGlzdENvbnRlbnRzVGVzdHMuQXJyYXlMaXN0U3VjY2VlZHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuTGlzdENvbnRlbnRzVGVzdHMuQXJyYXlTdWNjZWVkcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5MaXN0Q29udGVudHNUZXN0cy5EaWZmZXJlbnRUeXBlc01heUJlRXF1YWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuTGlzdENvbnRlbnRzVGVzdHMuRW1wdHlBcnJheUZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLkxpc3RDb250ZW50c1Rlc3RzLk51bGxBcnJheUlzRXJyb3IiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTm90RXF1YWxGaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5Ob3RFcXVhbEZpeHR1cmUuQXJyYXlzTm90RXF1YWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuTm90RXF1YWxGaXh0dXJlLkFycmF5c05vdEVxdWFsRmFpbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuTm90RXF1YWxGaXh0dXJlLk5vdEVxdWFsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLk5vdEVxdWFsRml4dHVyZS5Ob3RFcXVhbEZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLk5vdEVxdWFsRml4dHVyZS5Ob3RFcXVhbFNhbWVUeXBlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuTm90RXF1YWxGaXh0dXJlLk51bGxFcXVhbHNOdWxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLk5vdEVxdWFsRml4dHVyZS5OdWxsTm90RXF1YWxUb05vbk51bGwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuTm90RXF1YWxGaXh0dXJlLlVJbnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTm90U2FtZUZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLk5vdFNhbWVGaXh0dXJlLk5vdFNhbWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuTm90U2FtZUZpeHR1cmUuTm90U2FtZUZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9Ik51bGxhYmxlVHlwZXNUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjYXRlZ29yaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkdlbmVyaWNzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY2F0ZWdvcmllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLk51bGxhYmxlVHlwZXNUZXN0cy5DYW5Db21wYXJlTnVsbGFibGVEZWNpbWFscyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuTnVsbGFibGVUeXBlc1Rlc3RzLkNhbkNvbXBhcmVOdWxsYWJsZURvdWJsZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLk51bGxhYmxlVHlwZXNUZXN0cy5DYW5Db21wYXJlTnVsbGFibGVFbnVtcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5OdWxsYWJsZVR5cGVzVGVzdHMuQ2FuQ29tcGFyZU51bGxhYmxlSW50cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuTnVsbGFibGVUeXBlc1Rlc3RzLkNhbkNvbXBhcmVOdWxsYWJsZU1peGVkTnVtZXJpY3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSI1NCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLk51bGxhYmxlVHlwZXNUZXN0cy5DYW5Db21wYXJlTnVsbGFibGVTdHJ1Y3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLk51bGxhYmxlVHlwZXNUZXN0cy5DYW5Db21wYXJlV2l0aFRvbGVyYW5jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5OdWxsYWJsZVR5cGVzVGVzdHMuQ2FuVGVzdEZvck5hTiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5OdWxsYWJsZVR5cGVzVGVzdHMuQ2FuVGVzdEZvck51bGwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUmFuZG9taXplclRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5SYW5kb21pemVyVGVzdHMuUmFuZG9tRG91Ymxlc0FyZVVuaXF1ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5SYW5kb21pemVyVGVzdHMuUmFuZG9tSW50c0FyZVVuaXF1ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5SYW5kb21pemVyVGVzdHMuUmFuZG9taXplcnNXaXRoRGlmZmVyZW50U2VlZHNSZXR1cm5EaWZmZXJlbnRWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlJhbmRvbWl6ZXJUZXN0cy5SYW5kb21pemVyc1dpdGhTYW1lU2VlZHNSZXR1cm5TYW1lVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMTAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5SYW5kb21pemVyVGVzdHMuUmFuZG9tU2VlZHNBcmVVbmlxdWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuUmFuZG9taXplclRlc3RzLlJldHVybnNEaWZmZXJlbnRSYW5kb21pemVyc0ZvckRpZmZlcmVudE1ldGhvZHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuUmFuZG9taXplclRlc3RzLlJldHVybnNTYW1lUmFuZG9taXplckZvckRpZmZlcmVudFBhcmFtZXRlcnNPZlNhbWVNZXRob2QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuUmFuZG9taXplclRlc3RzLlJldHVybnNTYW1lUmFuZG9taXplckZvclNhbWVNZXRob2QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuUmFuZG9taXplclRlc3RzLlJldHVybnNTYW1lUmFuZG9taXplckZvclNhbWVQYXJhbWV0ZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUmFuZ2VUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuUmFuZ2VUZXN0cy5JblJhbmdlRmFpbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuUmFuZ2VUZXN0cy5JblJhbmdlU3VjY2VlZHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuUmFuZ2VUZXN0cy5Ob3RJblJhbmdlRmFpbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuUmFuZ2VUZXN0cy5Ob3RJblJhbmdlU3VjY2VlZHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iU2FtZUZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDExIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlNhbWVGaXh0dXJlLlNhbWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuU2FtZUZpeHR1cmUuU2FtZUZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlNhbWVGaXh0dXJlLlNhbWVWYWx1ZVR5cGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlN0cmluZ0Fzc2VydFRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1OCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5TdHJpbmdBc3NlcnRUZXN0cy5DYXNlSW5zZW5zaXRpdmVDb21wYXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlN0cmluZ0Fzc2VydFRlc3RzLkNhc2VJbnNlbnNpdGl2ZUNvbXBhcmVGYWlscyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5TdHJpbmdBc3NlcnRUZXN0cy5Db250YWlucyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5TdHJpbmdBc3NlcnRUZXN0cy5Db250YWluc0ZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlN0cmluZ0Fzc2VydFRlc3RzLkRpZmZlcmVudEVuY29kaW5nc09mU2FtZVN0cmluZ0FyZU5vdEVxdWFsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlN0cmluZ0Fzc2VydFRlc3RzLkRvZXNOb3RDb250YWluIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlN0cmluZ0Fzc2VydFRlc3RzLkRvZXNOb3RDb250YWluRmFpbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuU3RyaW5nQXNzZXJ0VGVzdHMuRG9lc05vdEVuZFdpdGgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuU3RyaW5nQXNzZXJ0VGVzdHMuRG9lc05vdEVuZFdpdGhGYWlscyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5TdHJpbmdBc3NlcnRUZXN0cy5Eb2VzTm90U3RhcnRXaXRoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlN0cmluZ0Fzc2VydFRlc3RzLkRvZXNOb3RTdGFydFdpdGhGYWlscyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5TdHJpbmdBc3NlcnRUZXN0cy5FbmRzV2l0aCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5TdHJpbmdBc3NlcnRUZXN0cy5FbmRzV2l0aEZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlN0cmluZ0Fzc2VydFRlc3RzLklzTWF0Y2giIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuU3RyaW5nQXNzZXJ0VGVzdHMuSXNNYXRjaEZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlN0cmluZ0Fzc2VydFRlc3RzLlN0YXJ0c1dpdGgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuU3RyaW5nQXNzZXJ0VGVzdHMuU3RhcnRzV2l0aEZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RGaXh0dXJlQXR0cmlidXRlVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlRlc3RGaXh0dXJlQXR0cmlidXRlVGVzdHMuQ29uc3RydWN0V2l0aENvbWJpbmVkQXJncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2F0ZWdvcmllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iR2VuZXJpY3MiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2F0ZWdvcmllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVGVzdEZpeHR1cmVBdHRyaWJ1dGVUZXN0cy5Db25zdHJ1Y3RXaXRoRml4dHVyZUFyZ3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVGVzdEZpeHR1cmVBdHRyaWJ1dGVUZXN0cy5Db25zdHJ1Y3RXaXRoRml4dHVyZUFyZ3NBbmRTZXRUeXBlQXJncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2F0ZWdvcmllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iR2VuZXJpY3MiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2F0ZWdvcmllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVGVzdEZpeHR1cmVBdHRyaWJ1dGVUZXN0cy5Db25zdHJ1Y3RXaXRoSnVzdFR5cGVBcmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYXRlZ29yaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBuYW1lPSJHZW5lcmljcyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYXRlZ29yaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LWNhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5UZXN0Rml4dHVyZUF0dHJpYnV0ZVRlc3RzLkNvbnN0cnVjdFdpdGhOb0FyZ3VtZW50c0FuZFNldFR5cGVBcmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYXRlZ29yaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBuYW1lPSJHZW5lcmljcyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYXRlZ29yaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LWNhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5UZXN0Rml4dHVyZUF0dHJpYnV0ZVRlc3RzLkNvbnN0cnVjdFdpdGhvdXRBcmd1bWVudHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGV4dE1lc3NhZ2VXcml0ZXJUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVGV4dE1lc3NhZ2VXcml0ZXJUZXN0cy5Db25uZWN0b3JJc1dyaXR0ZW5XaXRoU3Vycm91bmRpbmdTcGFjZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVGV4dE1lc3NhZ2VXcml0ZXJUZXN0cy5EYXRlVGltZVRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVGV4dE1lc3NhZ2VXcml0ZXJUZXN0cy5EZWNpbWFsSXNXcml0dGVuVG9Ud2VudHlOaW5lRGlnaXRzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlRleHRNZXNzYWdlV3JpdGVyVGVzdHMuRGVjaW1hbElzV3JpdHRlbldpdGhUcmFpbGluZ00iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVGV4dE1lc3NhZ2VXcml0ZXJUZXN0cy5EaXNwbGF5U3RyaW5nRGlmZmVyZW5jZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVGV4dE1lc3NhZ2VXcml0ZXJUZXN0cy5EaXNwbGF5U3RyaW5nRGlmZmVyZW5jZXNfTm9DbGlwcGluZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5UZXh0TWVzc2FnZVdyaXRlclRlc3RzLkRvdWJsZUlzV3JpdHRlblRvU2V2ZW50ZWVuRGlnaXRzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlRleHRNZXNzYWdlV3JpdGVyVGVzdHMuRG91YmxlSXNXcml0dGVuV2l0aFRyYWlsaW5nRCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5UZXh0TWVzc2FnZVdyaXRlclRlc3RzLkZsb2F0SXNXcml0dGVuVG9OaW5lRGlnaXRzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlRleHRNZXNzYWdlV3JpdGVyVGVzdHMuRmxvYXRJc1dyaXR0ZW5XaXRoVHJhaWxpbmdGIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlRleHRNZXNzYWdlV3JpdGVyVGVzdHMuSW50ZWdlcklzV3JpdHRlbkFzSXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVGV4dE1lc3NhZ2VXcml0ZXJUZXN0cy5QcmVkaWNhdGVJc1dyaXR0ZW5XaXRoVHJhaWxpbmdTcGFjZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5UZXh0TWVzc2FnZVdyaXRlclRlc3RzLlN0cmluZ0lzV3JpdHRlbldpdGhRdW90ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVHlwZUFzc2VydFRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzNCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5UeXBlQXNzZXJ0VGVzdHMuRXhhY3RUeXBlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlR5cGVBc3NlcnRUZXN0cy5FeGFjdFR5cGVGYWlscyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5UeXBlQXNzZXJ0VGVzdHMuSXNBc3NpZ25hYmxlRnJvbSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5UeXBlQXNzZXJ0VGVzdHMuSXNBc3NpZ25hYmxlRnJvbUZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlR5cGVBc3NlcnRUZXN0cy5Jc0luc3RhbmNlT2YiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVHlwZUFzc2VydFRlc3RzLklzSW5zdGFuY2VPZkZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlR5cGVBc3NlcnRUZXN0cy5Jc05vdEFzc2lnbmFibGVGcm9tIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlR5cGVBc3NlcnRUZXN0cy5Jc05vdEFzc2lnbmFibGVGcm9tRmFpbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVHlwZUFzc2VydFRlc3RzLklzTm90SW5zdGFuY2VPZiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5UeXBlQXNzZXJ0VGVzdHMuSXNOb3RJbnN0YW5jZU9mRmFpbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVmFsdWVzQXR0cmlidXRlVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTQ1IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5Db252ZXJEb3VibGVUb0RlY2ltYWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVyRG91YmxlVG9EZWNpbWFsKDEyLjVtKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5Db252ZXJ0RG91YmxlUmFuZ2VUb0RlY2ltYWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA5IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVydERvdWJsZVJhbmdlVG9EZWNpbWFsKDFtKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVydERvdWJsZVJhbmdlVG9EZWNpbWFsKDEuMW0pIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5WYWx1ZXNBdHRyaWJ1dGVUZXN0cy5DYW5Db252ZXJ0RG91YmxlUmFuZ2VUb0RlY2ltYWwoMS4ybSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlZhbHVlc0F0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnREb3VibGVSYW5nZVRvRGVjaW1hbCgxLjNtKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5Db252ZXJ0SW50UmFuZ2VUb0J5dGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVydEludFJhbmdlVG9CeXRlKDEpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5WYWx1ZXNBdHRyaWJ1dGVUZXN0cy5DYW5Db252ZXJ0SW50UmFuZ2VUb0J5dGUoMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlZhbHVlc0F0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRJbnRSYW5nZVRvQnl0ZSgzKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5Db252ZXJ0SW50UmFuZ2VUb0RlY2ltYWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVydEludFJhbmdlVG9EZWNpbWFsKDFtKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVydEludFJhbmdlVG9EZWNpbWFsKDJtKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVydEludFJhbmdlVG9EZWNpbWFsKDNtKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5Db252ZXJ0SW50UmFuZ2VUb1NCeXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlZhbHVlc0F0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRJbnRSYW5nZVRvU0J5dGUoMSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlZhbHVlc0F0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRJbnRSYW5nZVRvU0J5dGUoMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlZhbHVlc0F0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRJbnRSYW5nZVRvU0J5dGUoMykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ2FuQ29udmVydEludFJhbmdlVG9TaG9ydCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5WYWx1ZXNBdHRyaWJ1dGVUZXN0cy5DYW5Db252ZXJ0SW50UmFuZ2VUb1Nob3J0KDEpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5WYWx1ZXNBdHRyaWJ1dGVUZXN0cy5DYW5Db252ZXJ0SW50UmFuZ2VUb1Nob3J0KDIpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5WYWx1ZXNBdHRyaWJ1dGVUZXN0cy5DYW5Db252ZXJ0SW50UmFuZ2VUb1Nob3J0KDMpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkNhbkNvbnZlcnRJbnRUb0RlY2ltYWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVydEludFRvRGVjaW1hbCgxMm0pIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkNhbkNvbnZlcnRSYW5kb21Eb3VibGVUb0RlY2ltYWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVydFJhbmRvbURvdWJsZVRvRGVjaW1hbCg2LjExMTM1MzA1MzI5NzU1bSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlZhbHVlc0F0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRSYW5kb21Eb3VibGVUb0RlY2ltYWwoNi44ODQ3Njk4MjUyMTExNW0pIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5WYWx1ZXNBdHRyaWJ1dGVUZXN0cy5DYW5Db252ZXJ0UmFuZG9tRG91YmxlVG9EZWNpbWFsKDcuMDg5NzkxODUxNjI1NjhtKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5Db252ZXJ0UmFuZG9tSW50VG9CeXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlZhbHVlc0F0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRSYW5kb21JbnRUb0J5dGUoMSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlZhbHVlc0F0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRSYW5kb21JbnRUb0J5dGUoMSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlZhbHVlc0F0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRSYW5kb21JbnRUb0J5dGUoNykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ2FuQ29udmVydFJhbmRvbUludFRvRGVjaW1hbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5WYWx1ZXNBdHRyaWJ1dGVUZXN0cy5DYW5Db252ZXJ0UmFuZG9tSW50VG9EZWNpbWFsKDltKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVydFJhbmRvbUludFRvRGVjaW1hbCg1bSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlZhbHVlc0F0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRSYW5kb21JbnRUb0RlY2ltYWwoMm0pIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkNhbkNvbnZlcnRSYW5kb21JbnRUb1NCeXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlZhbHVlc0F0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRSYW5kb21JbnRUb1NCeXRlKDcpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5WYWx1ZXNBdHRyaWJ1dGVUZXN0cy5DYW5Db252ZXJ0UmFuZG9tSW50VG9TQnl0ZSgzKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVydFJhbmRvbUludFRvU0J5dGUoMykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ2FuQ29udmVydFJhbmRvbUludFRvU2hvcnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVydFJhbmRvbUludFRvU2hvcnQoOSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlZhbHVlc0F0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRSYW5kb21JbnRUb1Nob3J0KDMpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5WYWx1ZXNBdHRyaWJ1dGVUZXN0cy5DYW5Db252ZXJ0UmFuZG9tSW50VG9TaG9ydCgyKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5Db252ZXJ0U21hbGxJbnRzVG9CeXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlZhbHVlc0F0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRTbWFsbEludHNUb0J5dGUoNSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ2FuQ29udmVydFNtYWxsSW50c1RvU0J5dGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVydFNtYWxsSW50c1RvU0J5dGUoNSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ2FuQ29udmVydFNtYWxsSW50c1RvU2hvcnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVydFNtYWxsSW50c1RvU2hvcnQoNSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ2FuQ29udmVydFN0cmluZ1RvRGVjaW1hbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5WYWx1ZXNBdHRyaWJ1dGVUZXN0cy5DYW5Db252ZXJ0U3RyaW5nVG9EZWNpbWFsKDEyLjVtKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRnJhbWV3b3JrLlRlc3RzLlZhbHVlc0F0dHJpYnV0ZVRlc3RzLlJhbmdlQXR0cmlidXRlV2l0aERvdWJsZVJhbmdlQW5kU3RlcCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5WYWx1ZXNBdHRyaWJ1dGVUZXN0cy5SYW5nZUF0dHJpYnV0ZVdpdGhGbG9hdFJhbmdlQW5kU3RlcCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5WYWx1ZXNBdHRyaWJ1dGVUZXN0cy5SYW5nZUF0dHJpYnV0ZVdpdGhJbnRSYW5nZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5WYWx1ZXNBdHRyaWJ1dGVUZXN0cy5SYW5nZUF0dHJpYnV0ZVdpdGhJbnRSYW5nZUFuZFN0ZXAiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5GcmFtZXdvcmsuVGVzdHMuVmFsdWVzQXR0cmlidXRlVGVzdHMuUmFuZ2VBdHRyaWJ1dGVXaXRoTG9uZ1JhbmdlQW5kU3RlcCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZyYW1ld29yay5UZXN0cy5WYWx1ZXNBdHRyaWJ1dGVUZXN0cy5WYWx1ZXNBdHRyaWJ1dGVQcm92aWRlc1NwZWNpZmllZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IkFzc2VtYmx5IiBuYW1lPSJEOlxEZXZcTlVuaXRcbnVuaXQtMi41XHdvcmtcYnVpbGRcbmV0XDIuMFxyZWxlYXNlXHRlc3RzL251bml0LmNvcmUudGVzdHMuZGxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIxMS4wODQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9Ik5hbWVzcGFjZSIgbmFtZT0iTlVuaXQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjExLjA4MyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJOYW1lc3BhY2UiIG5hbWU9IkNvcmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjExLjA4MyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9Ik5hbWVzcGFjZSIgbmFtZT0iVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjExLjA4MyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFzc2VtYmx5SGVscGVyVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Bc3NlbWJseUhlbHBlclRlc3RzLkdldFBhdGhGb3JBc3NlbWJseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQXNzZW1ibHlIZWxwZXJUZXN0cy5HZXRQYXRoRm9yVHlwZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJBc3NlbWJseVJlYWRlclRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQXNzZW1ibHlSZWFkZXJUZXN0cy5DcmVhdGVGcm9tQXNzZW1ibHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkFzc2VtYmx5UmVhZGVyVGVzdHMuQ3JlYXRlRnJvbVBhdGgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkFzc2VtYmx5UmVhZGVyVGVzdHMuSW1hZ2VSdW50aW1lVmVyc2lvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQXNzZW1ibHlSZWFkZXJUZXN0cy5Jc0RvdE5ldEZpbGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkFzc2VtYmx5UmVhZGVyVGVzdHMuSXNWYWxpZFBlRmlsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQXNzZW1ibHlSZWFkZXJUZXN0cy5Jc1ZhbGlkUGVGaWxlX0ZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFzc2VtYmx5UmVzb2x2ZXJUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wODUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkFzc2VtYmx5UmVzb2x2ZXJUZXN0cy5BZGRGaWxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA4MCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFzc2VtYmx5VGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNTU2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Bc3NlbWJseVRlc3RzLkFwcFNldHRpbmdzTG9hZGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Bc3NlbWJseVRlc3RzLkxvYWRBc3NlbWJseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC40OTAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQXNzZW1ibHlUZXN0cy5Mb2FkQXNzZW1ibHlOb3RGb3VuZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQXNzZW1ibHlUZXN0cy5Mb2FkQXNzZW1ibHlXaXRob3V0VGVzdEZpeHR1cmVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyNSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Bc3NlbWJseVRlc3RzLkxvYWRUZXN0Rml4dHVyZUZyb21Bc3NlbWJseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTkiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQXNzZW1ibHlUZXN0cy5OVW5pdFRyYWNlSXNFbmFibGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Bc3NlbWJseVRlc3RzLlJ1blNldHNDdXJyZW50RGlyZWN0b3J5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFzc2VtYmx5VmVyc2lvbkZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Bc3NlbWJseVZlcnNpb25GaXh0dXJlLlZlcnNpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQXNzZXJ0SW5jb25jbHVzaXZlRml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkFzc2VydEluY29uY2x1c2l2ZUZpeHR1cmUuQXNzZXJ0SW5jb25jbHVzaXZlVGhyb3dzRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFzc2VydFBhc3NGaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQXNzZXJ0UGFzc0ZpeHR1cmUuQXNzZXJ0UGFzc1JldHVybnNTdWNjZXNzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWFzb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lc3NhZ2U+PCFbQ0RBVEFbVGhpcyB0ZXN0IGlzIE9LIV1dPjwvbWVzc2FnZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWFzb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Bc3NlcnRQYXNzRml4dHVyZS5TdWJzZXF1ZW50RmFpbHVyZUlzSXJyZWxldmFudCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVhc29uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXNzYWdlPjwhW0NEQVRBW1RoaXMgdGVzdCBpcyBPSyFdXT48L21lc3NhZ2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVhc29uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LWNhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJBdHRyaWJ1dGVJbmhlcml0YW5jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkF0dHJpYnV0ZUluaGVyaXRhbmNlLkluaGVyaXRlZEV4cGxpY2l0QXR0cmlidXRlSXNSZWNvZ25pemVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5BdHRyaWJ1dGVJbmhlcml0YW5jZS5Jbmhlcml0ZWRGaXh0dXJlQXR0cmlidXRlSXNSZWNvZ25pemVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5BdHRyaWJ1dGVJbmhlcml0YW5jZS5Jbmhlcml0ZWRJZ25vcmVBdHRyaWJ1dGVJc1JlY29nbml6ZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkF0dHJpYnV0ZUluaGVyaXRhbmNlLkluaGVyaXRlZFRlc3RBdHRyaWJ1dGVJc1JlY29nbml6ZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQ2FsbENvbnRleHRUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNhbGxDb250ZXh0VGVzdHMuR2VuZXJpY1ByaW5jaXBhbFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNhbGxDb250ZXh0VGVzdHMuSUxvZ2ljYWxUaHJlYWRBZmZpbmF0aXZlVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ2FsbENvbnRleHRUZXN0cy5JTG9naWNhbFRocmVhZEFmZmluYXRpdmVUZXN0Q29uc29sZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ2FsbENvbnRleHRUZXN0cy5TZXRDdXN0b21QcmluY2lwYWxPblRocmVhZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ2FsbENvbnRleHRUZXN0cy5TZXRHZW5lcmljUHJpbmNpcGFsT25UaHJlYWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNhbGxDb250ZXh0VGVzdHMuVXNlQ3VzdG9tSWRlbnRpdHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQ2F0ZWdvcnlBdHRyaWJ1dGVUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNhdGVnb3J5QXR0cmlidXRlVGVzdHMuQ2FuRGVyaXZlRnJvbUNhdGVnb3J5QXR0cmlidXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5DYXRlZ29yeUF0dHJpYnV0ZVRlc3RzLkNhdGVnb3J5T25GaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5DYXRlZ29yeUF0dHJpYnV0ZVRlc3RzLkNhdGVnb3J5T25UZXN0Q2FzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ291bnRUZXN0c1VzaW5nQ2F0ZWdvcnlGaWx0ZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE1IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNhdGVnb3J5QXR0cmlidXRlVGVzdHMuQ291bnRUZXN0c1VzaW5nQ2F0ZWdvcnlGaWx0ZXIoJnF1b3Q7RGF0YWJhc2UmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ2F0ZWdvcnlBdHRyaWJ1dGVUZXN0cy5Db3VudFRlc3RzVXNpbmdDYXRlZ29yeUZpbHRlcigmcXVvdDtDcml0aWNhbCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5DYXRlZ29yeUF0dHJpYnV0ZVRlc3RzLkNvdW50VGVzdHNVc2luZ0NhdGVnb3J5RmlsdGVyKCZxdW90O0xvbmcmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNhdGVnb3J5QXR0cmlidXRlVGVzdHMuQ291bnRUZXN0c1dpdGhvdXRDYXRlZ29yeUZpbHRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ2F0ZWdvcnlBdHRyaWJ1dGVUZXN0cy5EZXJpdmVkQ2F0ZWdvcnlNYXlCZUluaGVyaXRlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDb21iaW5hdG9yaWFsVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTI5IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJSYW5kb21BcmdzQXJlSW5kZXBlbmRlbnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5SYW5kb21BcmdzQXJlSW5kZXBlbmRlbnQoMC45NzU1ODAzNjM1MjMwMmQsMC4xNDkzNTA3NTgyNDU4NDRkKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJSYW5kb21UZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Db21iaW5hdG9yaWFsVGVzdHMuUmFuZG9tVGVzdCg4NywwLjY3ODUxOTQ2ODYwNDgyOWQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlJhbmRvbVRlc3QoMjAzLDAuMjU1Njk1NDQyNzg4MTYxZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Db21iaW5hdG9yaWFsVGVzdHMuUmFuZG9tVGVzdCg5OSwwLjA4NTQzMjg0NjEzODkyMWQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlJhbmRvbVRlc3QoOTIsMC4yMzIzNzIxNTIyNjE2MDlkKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5SYW5kb21UZXN0KDc0LDAuMjg0ODIyNzIyMDk4MjQyZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iUmFuZ2VUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Db21iaW5hdG9yaWFsVGVzdHMuUmFuZ2VUZXN0KDAuMmQsMTApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlJhbmdlVGVzdCgwLjJkLDE1KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5SYW5nZVRlc3QoMC4yZCwyMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Db21iaW5hdG9yaWFsVGVzdHMuUmFuZ2VUZXN0KDAuNGQsMTApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlJhbmdlVGVzdCgwLjRkLDE1KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5SYW5nZVRlc3QoMC40ZCwyMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Db21iaW5hdG9yaWFsVGVzdHMuUmFuZ2VUZXN0KDAuNmQsMTApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlJhbmdlVGVzdCgwLjZkLDE1KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5SYW5nZVRlc3QoMC42ZCwyMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU2luZ2xlQXJndW1lbnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5TaW5nbGVBcmd1bWVudCgxLjNkKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5TaW5nbGVBcmd1bWVudCgxLjdkKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5TaW5nbGVBcmd1bWVudCgxLjVkKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJUaHJlZUFyZ3VtZW50c19Db21iaW5hdG9yaWFsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA0MiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Db21iaW5hdG9yaWFsVGVzdHMuVGhyZWVBcmd1bWVudHNfQ29tYmluYXRvcmlhbCgxLDEwLCZxdW90O0NoYXJsaWUmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlRocmVlQXJndW1lbnRzX0NvbWJpbmF0b3JpYWwoMSwxMCwmcXVvdDtKb2UmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlRocmVlQXJndW1lbnRzX0NvbWJpbmF0b3JpYWwoMSwxMCwmcXVvdDtGcmFuayZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Db21iaW5hdG9yaWFsVGVzdHMuVGhyZWVBcmd1bWVudHNfQ29tYmluYXRvcmlhbCgxLDIwLCZxdW90O0NoYXJsaWUmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlRocmVlQXJndW1lbnRzX0NvbWJpbmF0b3JpYWwoMSwyMCwmcXVvdDtKb2UmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlRocmVlQXJndW1lbnRzX0NvbWJpbmF0b3JpYWwoMSwyMCwmcXVvdDtGcmFuayZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Db21iaW5hdG9yaWFsVGVzdHMuVGhyZWVBcmd1bWVudHNfQ29tYmluYXRvcmlhbCgyLDEwLCZxdW90O0NoYXJsaWUmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlRocmVlQXJndW1lbnRzX0NvbWJpbmF0b3JpYWwoMiwxMCwmcXVvdDtKb2UmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlRocmVlQXJndW1lbnRzX0NvbWJpbmF0b3JpYWwoMiwxMCwmcXVvdDtGcmFuayZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Db21iaW5hdG9yaWFsVGVzdHMuVGhyZWVBcmd1bWVudHNfQ29tYmluYXRvcmlhbCgyLDIwLCZxdW90O0NoYXJsaWUmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlRocmVlQXJndW1lbnRzX0NvbWJpbmF0b3JpYWwoMiwyMCwmcXVvdDtKb2UmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlRocmVlQXJndW1lbnRzX0NvbWJpbmF0b3JpYWwoMiwyMCwmcXVvdDtGcmFuayZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Db21iaW5hdG9yaWFsVGVzdHMuVGhyZWVBcmd1bWVudHNfQ29tYmluYXRvcmlhbCgzLDEwLCZxdW90O0NoYXJsaWUmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlRocmVlQXJndW1lbnRzX0NvbWJpbmF0b3JpYWwoMywxMCwmcXVvdDtKb2UmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlRocmVlQXJndW1lbnRzX0NvbWJpbmF0b3JpYWwoMywxMCwmcXVvdDtGcmFuayZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Db21iaW5hdG9yaWFsVGVzdHMuVGhyZWVBcmd1bWVudHNfQ29tYmluYXRvcmlhbCgzLDIwLCZxdW90O0NoYXJsaWUmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlRocmVlQXJndW1lbnRzX0NvbWJpbmF0b3JpYWwoMywyMCwmcXVvdDtKb2UmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlRocmVlQXJndW1lbnRzX0NvbWJpbmF0b3JpYWwoMywyMCwmcXVvdDtGcmFuayZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iVGhyZWVBcmd1bWVudHNfU2VxdWVudGlhbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlRocmVlQXJndW1lbnRzX1NlcXVlbnRpYWwoMSwxMCwmcXVvdDtDaGFybGllJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5UaHJlZUFyZ3VtZW50c19TZXF1ZW50aWFsKDIsMjAsJnF1b3Q7Sm9lJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5UaHJlZUFyZ3VtZW50c19TZXF1ZW50aWFsKDMsbnVsbCwmcXVvdDtGcmFuayZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iVHdvQXJndW1lbnRzX0NvbWJpbmF0b3JpYWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5Ud29Bcmd1bWVudHNfQ29tYmluYXRvcmlhbCgxLDEwKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5Ud29Bcmd1bWVudHNfQ29tYmluYXRvcmlhbCgxLDIwKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5Ud29Bcmd1bWVudHNfQ29tYmluYXRvcmlhbCgyLDEwKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5Ud29Bcmd1bWVudHNfQ29tYmluYXRvcmlhbCgyLDIwKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5Ud29Bcmd1bWVudHNfQ29tYmluYXRvcmlhbCgzLDEwKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvbWJpbmF0b3JpYWxUZXN0cy5Ud29Bcmd1bWVudHNfQ29tYmluYXRvcmlhbCgzLDIwKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJUd29Bcmd1bWVudHNfU2VxdWVudGlhbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlR3b0FyZ3VtZW50c19TZXF1ZW50aWFsKDEsMTApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlR3b0FyZ3VtZW50c19TZXF1ZW50aWFsKDIsMjApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29tYmluYXRvcmlhbFRlc3RzLlR3b0FyZ3VtZW50c19TZXF1ZW50aWFsKDMsbnVsbCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDb3JlRXh0ZW5zaW9uc1Rlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29yZUV4dGVuc2lvbnNUZXN0cy5DYW5BZGREZWNvcmF0b3IiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvcmVFeHRlbnNpb25zVGVzdHMuQ2FuQWRkRXZlbnRMaXN0ZW5lciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29yZUV4dGVuc2lvbnNUZXN0cy5DYW5BZGRTdWl0ZUJ1aWxkZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvcmVFeHRlbnNpb25zVGVzdHMuQ2FuQWRkVGVzdENhc2VCdWlsZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Db3JlRXh0ZW5zaW9uc1Rlc3RzLkNhbkFkZFRlc3RDYXNlQnVpbGRlcjIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvcmVFeHRlbnNpb25zVGVzdHMuRGVjb3JhdG9yc1J1bkluT3JkZXJPZlByaW9yaXRpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvcmVFeHRlbnNpb25zVGVzdHMuSGFzRXZlbnRMaXN0ZW5lckV4dGVuc2lvblBvaW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Db3JlRXh0ZW5zaW9uc1Rlc3RzLkhhc1N1aXRlQnVpbGRlcnNFeHRlbnNpb25Qb2ludCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29yZUV4dGVuc2lvbnNUZXN0cy5IYXNUZXN0Q2FzZUJ1aWxkZXJzRXh0ZW5zaW9uUG9pbnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkNvcmVFeHRlbnNpb25zVGVzdHMuSGFzVGVzdERlY29yYXRvcnNFeHRlbnNpb25Qb2ludCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ29yZUV4dGVuc2lvbnNUZXN0cy5IYXNUZXN0RnJhbWV3b3JrUmVnaXN0cnkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQ3VsdHVyZVNldHRpbmdBbmREZXRlY3Rpb25UZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNjUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkN1bHR1cmVTZXR0aW5nQW5kRGV0ZWN0aW9uVGVzdHMuQ2FuTWF0Y2hBdHRyaWJ1dGVXaXRoRXhjbHVkZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ3VsdHVyZVNldHRpbmdBbmREZXRlY3Rpb25UZXN0cy5DYW5NYXRjaEF0dHJpYnV0ZVdpdGhJbmNsdWRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5DdWx0dXJlU2V0dGluZ0FuZERldGVjdGlvblRlc3RzLkNhbk1hdGNoQXR0cmlidXRlV2l0aEluY2x1ZGVBbmRFeGNsdWRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5DdWx0dXJlU2V0dGluZ0FuZERldGVjdGlvblRlc3RzLkNhbk1hdGNoU3RyaW5ncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ3VsdHVyZVNldHRpbmdBbmREZXRlY3Rpb25UZXN0cy5Mb2FkV2l0aEZyZW5jaENhbmFkaWFuQ3VsdHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ3VsdHVyZVNldHRpbmdBbmREZXRlY3Rpb25UZXN0cy5Mb2FkV2l0aEZyZW5jaEN1bHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkN1bHR1cmVTZXR0aW5nQW5kRGV0ZWN0aW9uVGVzdHMuTG9hZFdpdGhSdXNzaWFuQ3VsdHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuQ3VsdHVyZVNldHRpbmdBbmREZXRlY3Rpb25UZXN0cy5TZXR0aW5nSW52YWxpZEN1bHR1cmVHaXZlc0Vycm9yIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyNiIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJVc2VXaXRoUGFyYW1ldGVyaXplZFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkN1bHR1cmVTZXR0aW5nQW5kRGV0ZWN0aW9uVGVzdHMuVXNlV2l0aFBhcmFtZXRlcml6ZWRUZXN0KCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDdWx0dXJlU2V0dGluZ0FuZERldGVjdGlvblRlc3RzK05lc3RlZEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5DdWx0dXJlU2V0dGluZ0FuZERldGVjdGlvblRlc3RzK05lc3RlZEZpeHR1cmUuQ2FuU2V0Q3VsdHVyZU9uRml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJEYXRhcG9pbnRUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkRhdGFwb2ludFRlc3RzLldvcmtzT25BcnJheSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRGF0YXBvaW50VGVzdHMuV29ya3NPbkZpZWxkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5EYXRhcG9pbnRUZXN0cy5Xb3Jrc09uTWV0aG9kUmV0dXJuaW5nQXJyYXkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkRhdGFwb2ludFRlc3RzLldvcmtzT25Qcm9wZXJ0eVJldHVybmluZ0FycmF5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkRpcmVjdG9yeUNoYW5nZVRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRGlyZWN0b3J5Q2hhbmdlVGVzdHMuQ2hhbmdpbmdDdXJyZW50RGlyZWN0b3J5R2l2ZXNXYXJuaW5nIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkRpcmVjdG9yeVN3YXBwZXJUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkRpcmVjdG9yeVN3YXBwZXJUZXN0cy5DaGFuZ2VBbmRSZXN0b3JlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5EaXJlY3RvcnlTd2FwcGVyVGVzdHMuU3dhcEFuZFJlc3RvcmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRXZlbnRRdWV1ZVRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjI4OSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXZlbnRRdWV1ZVRlc3RzLkRlcXVldWVFbXB0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXZlbnRRdWV1ZVRlc3RzLlB1bXBBdXRvU3RvcHNPblJ1bkZpbmlzaGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjEwMiIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FdmVudFF1ZXVlVGVzdHMuUHVtcEV2ZW50cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjEyIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlRpbWVvdXQiIHZhbHVlPSIzMDAwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FdmVudFF1ZXVlVGVzdHMuUHVtcEV2ZW50c1dpdGhBdXRvU3RvcCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iVGltZW91dCIgdmFsdWU9IjIwMDAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV2ZW50UXVldWVUZXN0cy5QdW1wUGVuZGluZ0V2ZW50c0FmdGVyQXV0b1N0b3AiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTAyIiBhc3NlcnRzPSIyIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlRpbWVvdXQiIHZhbHVlPSIyMDAwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FdmVudFF1ZXVlVGVzdHMuUHVtcFN5bmNocm9ub3VzQW5kQXN5bmNocm9ub3VzRXZlbnRzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iNiI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJUaW1lb3V0IiB2YWx1ZT0iMTAwMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LWNhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXZlbnRRdWV1ZVRlc3RzLlF1ZXVlRXZlbnRzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iOSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FdmVudFF1ZXVlVGVzdHMuU2VuZEV2ZW50cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjkiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXZlbnRRdWV1ZVRlc3RzLlN0YXJ0QW5kU3RvcFB1bXBPbkVtcHR5UXVldWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV2ZW50UXVldWVUZXN0cy5UcmFjaW5nRXZlbnRMaXN0ZW5lckRvZXNOb3REZWFkbG9jayIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iVGltZW91dCIgdmFsdWU9IjEwMDAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRXZlbnRRdWV1ZVRlc3RzK0RlcXVldWVCbG9ja2luZ19TdG9wVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV2ZW50UXVldWVUZXN0cytEZXF1ZXVlQmxvY2tpbmdfU3RvcFRlc3QuRGVxdWV1ZUJsb2NraW5nX1N0b3AiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDMyIiBhc3NlcnRzPSIzIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlRpbWVvdXQiIHZhbHVlPSIxMDAwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkV2ZW50UXVldWVUZXN0cytTZXRXYWl0SGFuZGxlX0VucXVldWVfQXN5bmNocm9ub3VzVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV2ZW50UXVldWVUZXN0cytTZXRXYWl0SGFuZGxlX0VucXVldWVfQXN5bmNocm9ub3VzVGVzdC5TZXRXYWl0SGFuZGxlX0VucXVldWVfQXN5bmNocm9ub3VzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzMSIgYXNzZXJ0cz0iNCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJUaW1lb3V0IiB2YWx1ZT0iMTAwMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LWNhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJFdmVudFF1ZXVlVGVzdHMrU2V0V2FpdEhhbmRsZV9FbnF1ZXVlX1N5bmNocm9ub3VzVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNjMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV2ZW50UXVldWVUZXN0cytTZXRXYWl0SGFuZGxlX0VucXVldWVfU3luY2hyb25vdXNUZXN0LlNldFdhaXRIYW5kbGVfRW5xdWV1ZV9TeW5jaHJvbm91cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNjEiIGFzc2VydHM9IjUiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iVGltZW91dCIgdmFsdWU9IjEwMDAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRXZlbnRUZXN0Rml4dHVyZSIgZGVzY3JpcHRpb249IlRlc3RzIHRoYXQgcHJvcGVyIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIHdoZW4gcnVubmluZyAgdGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wODIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV2ZW50VGVzdEZpeHR1cmUuQ2hlY2tFdmVudExpc3RlbmluZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTQiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJFeHBlY3RFeGNlcHRpb25UZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjIwMCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXhwZWN0RXhjZXB0aW9uVGVzdC5Bc3NlcnRGYWlsQmVmb3JlRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FeHBlY3RFeGNlcHRpb25UZXN0LkNhbkV4cGVjdFVuc3BlY2lmaWVkRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FeHBlY3RFeGNlcHRpb25UZXN0LkV4Y2VwdGlvbkhhbmRsZXJJc0NhbGxlZFdoZW5FeGNlcHRpb25NYXRjaGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FeHBlY3RFeGNlcHRpb25UZXN0LkV4Y2VwdGlvbkhhbmRsZXJJc0NhbGxlZFdoZW5FeGNlcHRpb25NYXRjaGVzX0FsdGVybmF0ZUhhbmRsZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuRXhjZXB0aW9uSGFuZGxlcklzTm90Q2FsbGVkV2hlbkV4Y2VwdGlvbkRvZXNOb3RNYXRjaCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXhwZWN0RXhjZXB0aW9uVGVzdC5FeGNlcHRpb25IYW5kbGVySXNOb3RDYWxsZWRXaGVuRXhjZXB0aW9uRG9lc05vdE1hdGNoX0FsdGVybmF0ZUhhbmRsZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuTWV0aG9kVGhyb3dzQXJndW1lbnRPdXRPZlJhbmdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FeHBlY3RFeGNlcHRpb25UZXN0Lk1ldGhvZFRocm93c0V4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXhwZWN0RXhjZXB0aW9uVGVzdC5NZXRob2RUaHJvd3NSaWdodEV4Y2VwdGlvbk1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuTWV0aG9kVGhyb3dzV3JvbmdFeGNlcHRpb25NZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FeHBlY3RFeGNlcHRpb25UZXN0LlNldFVwVGhyb3dzU2FtZUV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXhwZWN0RXhjZXB0aW9uVGVzdC5UZWFyRG93blRocm93c1NhbWVFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuVGVzdEV4Y2VwdGlvbk5hbWVOb3RUaHJvd24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuVGVzdEV4Y2VwdGlvbk5hbWVOb3RUaHJvd25XaXRoVXNlck1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuVGVzdEV4Y2VwdGlvblR5cGVOb3RUaHJvd24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuVGVzdEV4Y2VwdGlvblR5cGVOb3RUaHJvd25XaXRoVXNlck1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuVGVzdEZhaWxzV2hlbkJhc2VFeGNlcHRpb25Jc1Rocm93biIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXhwZWN0RXhjZXB0aW9uVGVzdC5UZXN0RmFpbHNXaGVuRGVyaXZlZEV4Y2VwdGlvbklzVGhyb3duIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FeHBlY3RFeGNlcHRpb25UZXN0LlRlc3RJc05vdFJ1bm5hYmxlV2hlbkFsdGVybmF0ZUhhbmRsZXJJc05vdEZvdW5kIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FeHBlY3RFeGNlcHRpb25UZXN0LlRlc3RNaXNtYXRjaGVkRXhjZXB0aW9uTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXhwZWN0RXhjZXB0aW9uVGVzdC5UZXN0TWlzbWF0Y2hlZEV4Y2VwdGlvbk1lc3NhZ2VXaXRoVXNlck1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuVGVzdE1pc21hdGNoZWRFeGNlcHRpb25OYW1lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FeHBlY3RFeGNlcHRpb25UZXN0LlRlc3RNaXNtYXRjaGVkRXhjZXB0aW9uTmFtZVdpdGhVc2VyTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXhwZWN0RXhjZXB0aW9uVGVzdC5UZXN0TWlzbWF0Y2hlZEV4Y2VwdGlvblR5cGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuVGVzdE1pc21hdGNoZWRFeGNlcHRpb25UeXBlQXNOYW1lZFBhcmFtZXRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXhwZWN0RXhjZXB0aW9uVGVzdC5UZXN0TWlzbWF0Y2hlZEV4Y2VwdGlvblR5cGVXaXRoVXNlck1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuVGVzdFN1Y2NlZWRzV2hlblNwZWNpZmllZEV4Y2VwdGlvbk5hbWVBbmRDb250YWluc01hdGNoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FeHBlY3RFeGNlcHRpb25UZXN0LlRlc3RTdWNjZWVkc1doZW5TcGVjaWZpZWRFeGNlcHRpb25OYW1lQW5kUmVnZXhNYXRjaCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXhwZWN0RXhjZXB0aW9uVGVzdC5UZXN0U3VjY2VlZHNXaXRoU3BlY2lmaWVkRXhjZXB0aW9uTmFtZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXhwZWN0RXhjZXB0aW9uVGVzdC5UZXN0U3VjY2VlZHNXaXRoU3BlY2lmaWVkRXhjZXB0aW9uTmFtZUFuZEV4YWN0TWF0Y2giIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuVGVzdFN1Y2NlZWRzV2l0aFNwZWNpZmllZEV4Y2VwdGlvbk5hbWVBbmRNZXNzYWdlX05ld0Zvcm1hdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXhwZWN0RXhjZXB0aW9uVGVzdC5UZXN0U3VjY2VlZHNXaXRoU3BlY2lmaWVkRXhjZXB0aW9uTmFtZUFzTmFtZWRQYXJhbWV0ZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuVGVzdFN1Y2NlZWRzV2l0aFNwZWNpZmllZEV4Y2VwdGlvblR5cGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuVGVzdFN1Y2NlZWRzV2l0aFNwZWNpZmllZEV4Y2VwdGlvblR5cGVBbmRDb250YWluc01hdGNoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FeHBlY3RFeGNlcHRpb25UZXN0LlRlc3RTdWNjZWVkc1dpdGhTcGVjaWZpZWRFeGNlcHRpb25UeXBlQW5kRXhhY3RNYXRjaCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXhwZWN0RXhjZXB0aW9uVGVzdC5UZXN0U3VjY2VlZHNXaXRoU3BlY2lmaWVkRXhjZXB0aW9uVHlwZUFuZE1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuVGVzdFN1Y2NlZWRzV2l0aFNwZWNpZmllZEV4Y2VwdGlvblR5cGVBbmRSZWdleE1hdGNoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FeHBlY3RFeGNlcHRpb25UZXN0LlRlc3RTdWNjZWVkc1dpdGhTcGVjaWZpZWRFeGNlcHRpb25UeXBlQW5kU3RhcnRzV2l0aE1hdGNoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FeHBlY3RFeGNlcHRpb25UZXN0LlRlc3RTdWNjZWVkc1dpdGhTcGVjaWZpZWRFeGNlcHRpb25UeXBlQXNOYW1lZFBhcmFtZXRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRXhwZWN0RXhjZXB0aW9uVGVzdC5UZXN0VW5zcGVjaWZpZWRFeGNlcHRpb25Ob3RUaHJvd24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuVGVzdFVuc3BlY2lmaWVkRXhjZXB0aW9uTm90VGhyb3duV2l0aFVzZXJNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FeHBlY3RFeGNlcHRpb25UZXN0LlRocm93aW5nTXlBcHBFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkV4cGVjdEV4Y2VwdGlvblRlc3QuVGhyb3dpbmdNeUFwcEV4Y2VwdGlvbldpdGhNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5FeHBlY3RFeGNlcHRpb25UZXN0LlRocm93TlVuaXRFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRmFpbEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDI1IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5GYWlsRml4dHVyZS5CYWRTdGFja1RyYWNlSXNIYW5kbGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5GYWlsRml4dHVyZS5DdXN0b21FeGNlcHRpb25Jc0hhbmRsZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkZhaWxGaXh0dXJlLkZhaWxJbmhlcml0c0Zyb21TeXN0ZW1FeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkZhaWxGaXh0dXJlLkZhaWxSZWNvcmRzSW5uZXJFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkZhaWxGaXh0dXJlLkZhaWxUaHJvd3NBc3NlcnRpb25FeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkZhaWxGaXh0dXJlLlZlcmlmeUZhaWxXb3JrcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJGaXh0dXJlU2V0dXBUZWFyRG93blRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTM1IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5GaXh0dXJlU2V0dXBUZWFyRG93blRlc3QuQmFzZVNldFVwQ2FsbGVkRmlyc3RBbmRUZWFyRG93bkNhbGxlZExhc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSI2IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkZpeHR1cmVTZXR1cFRlYXJEb3duVGVzdC5DaGVja0luaGVyaXRlZFNldFVwQW5kVGVhckRvd25BcmVDYWxsZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkZpeHR1cmVTZXR1cFRlYXJEb3duVGVzdC5EaXNwb3NlQ2FsbGVkV2hlbkZpeHR1cmVJbXBsZW1lbnRzSURpc3Bvc2FibGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkZpeHR1cmVTZXR1cFRlYXJEb3duVGVzdC5GaXh0dXJlV2l0aE5vVGVzdHNDYWxsc0ZpeHR1cmVTZXRVcEFuZFRlYXJEb3duIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5GaXh0dXJlU2V0dXBUZWFyRG93blRlc3QuSGFuZGxlRXJyb3JJbkZpeHR1cmVTZXR1cCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjExIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkZpeHR1cmVTZXR1cFRlYXJEb3duVGVzdC5IYW5kbGVFcnJvckluRml4dHVyZVRlYXJEb3duIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iOSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5GaXh0dXJlU2V0dXBUZWFyRG93blRlc3QuSGFuZGxlRXhjZXB0aW9uSW5GaXh0dXJlQ29uc3RydWN0b3IiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSI5IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkZpeHR1cmVTZXR1cFRlYXJEb3duVGVzdC5IYW5kbGVJZ25vcmVJbkZpeHR1cmVTZXR1cCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRml4dHVyZVNldHVwVGVhckRvd25UZXN0LkhhbmRsZVNldFVwQW5kVGVhckRvd25XaXRoVGVzdEluTmFtZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRml4dHVyZVNldHVwVGVhckRvd25UZXN0Lklnbm9yZWRGaXh0dXJlU2hvdWxkTm90Q2FsbEZpeHR1cmVTZXRVcE9yVGVhckRvd24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkZpeHR1cmVTZXR1cFRlYXJEb3duVGVzdC5NYWtlU3VyZVNldFVwQW5kVGVhckRvd25BcmVDYWxsZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkZpeHR1cmVTZXR1cFRlYXJEb3duVGVzdC5NYWtlU3VyZVNldFVwQW5kVGVhckRvd25BcmVDYWxsZWRPbkV4cGxpY2l0Rml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRml4dHVyZVNldHVwVGVhckRvd25UZXN0Lk92ZXJyaWRkZW5TZXRVcEFuZFRlYXJEb3duQXJlTm90Q2FsbGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5GaXh0dXJlU2V0dXBUZWFyRG93blRlc3QuUmVydW5GaXh0dXJlQWZ0ZXJTZXRVcEZpeGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5GaXh0dXJlU2V0dXBUZWFyRG93blRlc3QuUmVydW5GaXh0dXJlQWZ0ZXJUZWFyRG93bkZpeGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5GaXh0dXJlU2V0dXBUZWFyRG93blRlc3QuUnVubmluZ1NpbmdsZU1ldGhvZENhbGxzU2V0VXBBbmRUZWFyRG93biIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuRml4dHVyZVNldHVwVGVhckRvd25UZXN0LlN0YXRpY0Jhc2VTZXRVcENhbGxlZEZpcnN0QW5kVGVhckRvd25DYWxsZWRMYXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5GaXh0dXJlU2V0dXBUZWFyRG93blRlc3QuU3RhdGljQ2xhc3NTZXRVcEFuZFRlYXJEb3duQXJlQ2FsbGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5GaXh0dXJlU2V0dXBUZWFyRG93blRlc3QuU3RhdGljU2V0VXBBbmRUZWFyRG93bkFyZUNhbGxlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJGaXh0dXJlU2V0dXBUZWFyRG93blRlc3QrQ2hhbmdlc01hZGVJbkZpeHR1cmVTZXRVcCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkZpeHR1cmVTZXR1cFRlYXJEb3duVGVzdCtDaGFuZ2VzTWFkZUluRml4dHVyZVNldFVwLlRlc3RUaGF0Q2hhbmdlc1BlcnNpc3RVc2luZ1NhbWVUaHJlYWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkZpeHR1cmVTZXR1cFRlYXJEb3duVGVzdCtDaGFuZ2VzTWFkZUluRml4dHVyZVNldFVwLlRlc3RUaGF0Q2hhbmdlc1BlcnNpc3RVc2luZ1NlcGFyYXRlVGhyZWFkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJSZXF1aXJlc1RocmVhZCIgdmFsdWU9IlRydWUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJOYW1lc3BhY2UiIG5hbWU9IkdlbmVyaWMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDgzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IkdlbmVyaWNGaXh0dXJlIiBuYW1lPSJEZWR1Y2VUeXBlQXJnc0Zyb21BcmdzJmx0O1QxLFQyJmd0OyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRGVkdWNlVHlwZUFyZ3NGcm9tQXJncyZsdDtEb3VibGUsSW50MzImZ3Q7KDEwMC4wZCw0MikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYXRlZ29yaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iR2VuZXJpY3MiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhdGVnb3JpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlRlc3RNeUFyZ1R5cGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuR2VuZXJpYy5EZWR1Y2VUeXBlQXJnc0Zyb21BcmdzJmx0O0RvdWJsZSxJbnQzMiZndDsoMTAwLjBkLDQyKS5UZXN0TXlBcmdUeXBlcyg1LDcpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkRlZHVjZVR5cGVBcmdzRnJvbUFyZ3MmbHQ7SW50MzIsRG91YmxlJmd0Oyg0MiwxMDAuMGQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2F0ZWdvcmllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkdlbmVyaWNzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYXRlZ29yaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJUZXN0TXlBcmdUeXBlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkdlbmVyaWMuRGVkdWNlVHlwZUFyZ3NGcm9tQXJncyZsdDtJbnQzMixEb3VibGUmZ3Q7KDQyLDEwMC4wZCkuVGVzdE15QXJnVHlwZXMoNSw3KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJHZW5lcmljRml4dHVyZSIgbmFtZT0iU2ltcGxlR2VuZXJpY0ZpeHR1cmUmbHQ7VExpc3QmZ3Q7IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTaW1wbGVHZW5lcmljRml4dHVyZSZsdDtBcnJheUxpc3QmZ3Q7IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2F0ZWdvcmllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkdlbmVyaWNzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYXRlZ29yaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5HZW5lcmljLlNpbXBsZUdlbmVyaWNGaXh0dXJlJmx0O0FycmF5TGlzdCZndDsuVGVzdENvbGxlY3Rpb25Db3VudCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTaW1wbGVHZW5lcmljRml4dHVyZSZsdDtMaXN0Jmx0O0ludDMyJmd0OyZndDsiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYXRlZ29yaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iR2VuZXJpY3MiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhdGVnb3JpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkdlbmVyaWMuU2ltcGxlR2VuZXJpY0ZpeHR1cmUmbHQ7TGlzdCZsdDtJbnQzMiZndDsmZ3Q7LlRlc3RDb2xsZWN0aW9uQ291bnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlNpbXBsZUdlbmVyaWNNZXRob2RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzOCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYXRlZ29yaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBuYW1lPSJHZW5lcmljcyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYXRlZ29yaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iR2VuZXJpY1Rlc3RNZXRob2RXaXRoT25lVHlwZVBhcmFtZXRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5HZW5lcmljLlNpbXBsZUdlbmVyaWNNZXRob2RzLkdlbmVyaWNUZXN0TWV0aG9kV2l0aE9uZVR5cGVQYXJhbWV0ZXImbHQ7RG91YmxlJmd0Oyg1LjBkLDIuMGQsJnF1b3Q7QUJDJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5HZW5lcmljLlNpbXBsZUdlbmVyaWNNZXRob2RzLkdlbmVyaWNUZXN0TWV0aG9kV2l0aE9uZVR5cGVQYXJhbWV0ZXImbHQ7RG91YmxlJmd0Oyg1LjBkLDIuMGQsJnF1b3Q7QUJDJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5HZW5lcmljLlNpbXBsZUdlbmVyaWNNZXRob2RzLkdlbmVyaWNUZXN0TWV0aG9kV2l0aE9uZVR5cGVQYXJhbWV0ZXImbHQ7SW50MzImZ3Q7KDUsMiwmcXVvdDtBQkMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkdlbmVyaWMuU2ltcGxlR2VuZXJpY01ldGhvZHMuR2VuZXJpY1Rlc3RNZXRob2RXaXRoT25lVHlwZVBhcmFtZXRlciZsdDtEb3VibGUmZ3Q7KDUuMGQsMi4wZCwmcXVvdDtBQkMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkdlbmVyaWNUZXN0TWV0aG9kV2l0aFR3b1R5cGVQYXJhbWV0ZXJzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkdlbmVyaWMuU2ltcGxlR2VuZXJpY01ldGhvZHMuR2VuZXJpY1Rlc3RNZXRob2RXaXRoVHdvVHlwZVBhcmFtZXRlcnMmbHQ7SW50MzIsRG91YmxlJmd0Oyg1LDIuMGQsJnF1b3Q7QUJDJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5HZW5lcmljLlNpbXBsZUdlbmVyaWNNZXRob2RzLkdlbmVyaWNUZXN0TWV0aG9kV2l0aFR3b1R5cGVQYXJhbWV0ZXJzJmx0O0RvdWJsZSxJbnQ2NCZndDsoNS4wZCwyTCwmcXVvdDtBQkMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkdlbmVyaWMuU2ltcGxlR2VuZXJpY01ldGhvZHMuR2VuZXJpY1Rlc3RNZXRob2RXaXRoVHdvVHlwZVBhcmFtZXRlcnMmbHQ7SW50MzIsSW50MzImZ3Q7KDUsMiwmcXVvdDtBQkMmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkdlbmVyaWMuU2ltcGxlR2VuZXJpY01ldGhvZHMuR2VuZXJpY1Rlc3RNZXRob2RXaXRoVHdvVHlwZVBhcmFtZXRlcnMmbHQ7RG91YmxlLERvdWJsZSZndDsoNS4wZCwyLjBkLCZxdW90O0FCQyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iR2VuZXJpY1Rlc3RNZXRob2RXaXRoVHdvVHlwZVBhcmFtZXRlcnNfUmV2ZXJzZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDExIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuR2VuZXJpYy5TaW1wbGVHZW5lcmljTWV0aG9kcy5HZW5lcmljVGVzdE1ldGhvZFdpdGhUd29UeXBlUGFyYW1ldGVyc19SZXZlcnNlZCZsdDtJbnQzMixJbnQzMiZndDsoNSwyLCZxdW90O0FCQyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuR2VuZXJpYy5TaW1wbGVHZW5lcmljTWV0aG9kcy5HZW5lcmljVGVzdE1ldGhvZFdpdGhUd29UeXBlUGFyYW1ldGVyc19SZXZlcnNlZCZsdDtEb3VibGUsRG91YmxlJmd0Oyg1LjBkLDIuMGQsJnF1b3Q7QUJDJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5HZW5lcmljLlNpbXBsZUdlbmVyaWNNZXRob2RzLkdlbmVyaWNUZXN0TWV0aG9kV2l0aFR3b1R5cGVQYXJhbWV0ZXJzX1JldmVyc2VkJmx0O0RvdWJsZSxJbnQzMiZndDsoNSwyLjBkLCZxdW90O0FCQyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuR2VuZXJpYy5TaW1wbGVHZW5lcmljTWV0aG9kcy5HZW5lcmljVGVzdE1ldGhvZFdpdGhUd29UeXBlUGFyYW1ldGVyc19SZXZlcnNlZCZsdDtJbnQ2NCxEb3VibGUmZ3Q7KDUuMGQsMkwsJnF1b3Q7QUJDJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJHZW5lcmljRml4dHVyZSIgbmFtZT0iVHlwZVBhcmFtZXRlclVzZWRXaXRoVGVzdE1ldGhvZCZsdDtUJmd0OyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVHlwZVBhcmFtZXRlclVzZWRXaXRoVGVzdE1ldGhvZCZsdDtEb3VibGUmZ3Q7IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2F0ZWdvcmllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkdlbmVyaWNzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYXRlZ29yaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJUZXN0TXlBcmdUeXBlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuR2VuZXJpYy5UeXBlUGFyYW1ldGVyVXNlZFdpdGhUZXN0TWV0aG9kJmx0O0RvdWJsZSZndDsuVGVzdE15QXJnVHlwZSg1KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuR2VuZXJpYy5UeXBlUGFyYW1ldGVyVXNlZFdpdGhUZXN0TWV0aG9kJmx0O0RvdWJsZSZndDsuVGVzdE15QXJnVHlwZSgxLjIzZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iSWdub3JlRml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLklnbm9yZUZpeHR1cmUuSWdub3JlVGFrZXNQcmVjZWRlbmNlT3ZlckV4cGVjdGVkRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5JZ25vcmVGaXh0dXJlLklnbm9yZVRocm93c0lnbm9yZUV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuSWdub3JlRml4dHVyZS5JZ25vcmVXaXRoVXNlck1lc3NhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLklnbm9yZUZpeHR1cmUuSWdub3JlV2l0aFVzZXJNZXNzYWdlX0FycmF5T2ZBcmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5JZ25vcmVGaXh0dXJlLklnbm9yZVdpdGhVc2VyTWVzc2FnZV9PbmVBcmciIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLklnbm9yZUZpeHR1cmUuSWdub3JlV2l0aFVzZXJNZXNzYWdlX1RocmVlQXJncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuSWdub3JlRml4dHVyZS5JZ25vcmVXb3Jrc0ZvclRlc3RDYXNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5JZ25vcmVGaXh0dXJlLklnbm9yZVdvcmtzRm9yVGVzdFN1aXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5JZ25vcmVGaXh0dXJlLklnbm9yZVdvcmtzRnJvbVNldFVwIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkxlZ2FjeVN1aXRlVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDgwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5MZWdhY3lTdWl0ZVRlc3RzLlNldFVwQW5kVGVhckRvd25BcmVDYWxsZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkxlZ2FjeVN1aXRlVGVzdHMuU3VpdGVQcm9wZXJ0eVdpdGhJbnZhbGlkVHlwZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuTGVnYWN5U3VpdGVUZXN0cy5TdWl0ZVJldHVybmluZ0ZpeHR1cmVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzNSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5MZWdhY3lTdWl0ZVRlc3RzLlN1aXRlUmV0dXJuaW5nRml4dHVyZVdpdGhBcmd1bWVudHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkxlZ2FjeVN1aXRlVGVzdHMuU3VpdGVSZXR1cm5pbmdUZXN0U3VpdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDExIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLkxlZ2FjeVN1aXRlVGVzdHMuU3VpdGVSZXR1cm5pbmdUeXBlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJNYXhUaW1lVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDg4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5NYXhUaW1lVGVzdHMuRXJyb3JSZXBvcnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Ik1heFRpbWUiIHZhbHVlPSIxMDAwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5NYXhUaW1lVGVzdHMuRXJyb3JSZXBvcnRIYXNQcmlvcml0eU92ZXJNYXhUaW1lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyMyIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5NYXhUaW1lVGVzdHMuRmFpbHVyZVJlcG9ydCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iTWF4VGltZSIgdmFsdWU9IjEwMDAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLk1heFRpbWVUZXN0cy5GYWlsdXJlUmVwb3J0SGFzUHJpb3JpdHlPdmVyTWF4VGltZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjQiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuTWF4VGltZVRlc3RzLk1heFRpbWVFeGNlZWRlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjMiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuTWF4VGltZVRlc3RzLk1heFRpbWVOb3RFeGNlZWRlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iTWF4VGltZSIgdmFsdWU9IjEwMDAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTmFtZUZpbHRlclRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDg0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5OYW1lRmlsdGVyVGVzdC5FeHBsaWNpdFRlc3RDYXNlRG9lc05vdE1hdGNoV2hlbk5vdFNlbGVjdGVkRGlyZWN0bHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLk5hbWVGaWx0ZXJUZXN0LkV4cGxpY2l0VGVzdENhc2VNYXRjaGVzV2hlblNlbGVjdGVkRGlyZWN0bHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLk5hbWVGaWx0ZXJUZXN0LkV4cGxpY2l0VGVzdFN1aXRlRG9lc05vdE1hdGNoV2hlbk5vdFNlbGVjdGVkRGlyZWN0bHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLk5hbWVGaWx0ZXJUZXN0LkV4cGxpY2l0VGVzdFN1aXRlTWF0Y2hlc1doZW5TZWxlY3RlZERpcmVjdGx5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5OYW1lRmlsdGVyVGVzdC5IaWdoTGV2ZWxTdWl0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuTmFtZUZpbHRlclRlc3QuTXVsdGlwbGVOYW1lTWF0Y2giIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLk5hbWVGaWx0ZXJUZXN0LlNpbmdsZU5hbWVNYXRjaCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuTmFtZUZpbHRlclRlc3QuU3VpdGVOYW1lTWF0Y2giIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLk5hbWVGaWx0ZXJUZXN0LlRlc3REb2VzTm90TWF0Y2giIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTmFtZXNwYWNlQXNzZW1ibHlUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4xMzQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLk5hbWVzcGFjZUFzc2VtYmx5VGVzdHMuSGllcmFyY2h5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA0NCIgYXNzZXJ0cz0iMTciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuTmFtZXNwYWNlQXNzZW1ibHlUZXN0cy5Mb2FkVGVzdEZpeHR1cmVGcm9tQXNzZW1ibHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE5IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLk5hbWVzcGFjZUFzc2VtYmx5VGVzdHMuTm9OYW1lc3BhY2VJbkFzc2VtYmx5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxNiIgYXNzZXJ0cz0iNSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5OYW1lc3BhY2VBc3NlbWJseVRlc3RzLlRlc3RSb290IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA0NCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlBhaXJ3aXNlVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDMyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBhaXJ3aXNlVGVzdC5UZXN0IDJ4NCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBhaXJ3aXNlVGVzdC5UZXN0IDJ4MngyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGFpcndpc2VUZXN0LlRlc3QgM3gyeDIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYWlyd2lzZVRlc3QuVGVzdCAzeDJ4MngyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGFpcndpc2VUZXN0LlRlc3QgM3gyeDJ4MngyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGFpcndpc2VUZXN0LlRlc3QgM3gyeDJ4MngyeDIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYWlyd2lzZVRlc3QuVGVzdCAzeDN4MyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBhaXJ3aXNlVGVzdC5UZXN0IDR4NHg0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGFpcndpc2VUZXN0LlRlc3QgNXg1eDUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJQYWlyd2lzZVRlc3QrTGl2ZVRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDIzIiBhc3NlcnRzPSIxIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyMiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYWlyd2lzZVRlc3QrTGl2ZVRlc3QuVGVzdCgmcXVvdDthJnF1b3Q7LCZxdW90Oy0mcXVvdDssJnF1b3Q7eCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYWlyd2lzZVRlc3QrTGl2ZVRlc3QuVGVzdCgmcXVvdDtiJnF1b3Q7LCZxdW90OysmcXVvdDssJnF1b3Q7eSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYWlyd2lzZVRlc3QrTGl2ZVRlc3QuVGVzdCgmcXVvdDtjJnF1b3Q7LCZxdW90OysmcXVvdDssJnF1b3Q7eCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYWlyd2lzZVRlc3QrTGl2ZVRlc3QuVGVzdCgmcXVvdDtiJnF1b3Q7LCZxdW90Oy0mcXVvdDssJnF1b3Q7eCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYWlyd2lzZVRlc3QrTGl2ZVRlc3QuVGVzdCgmcXVvdDthJnF1b3Q7LCZxdW90Oy0mcXVvdDssJnF1b3Q7eSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYWlyd2lzZVRlc3QrTGl2ZVRlc3QuVGVzdCgmcXVvdDtjJnF1b3Q7LCZxdW90Oy0mcXVvdDssJnF1b3Q7eSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYWlyd2lzZVRlc3QrTGl2ZVRlc3QuVGVzdCgmcXVvdDthJnF1b3Q7LCZxdW90OysmcXVvdDssJnF1b3Q7eCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRGaXh0dXJlIiBuYW1lPSJQYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE5IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJQYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmUoJnF1b3Q7aGVsbG8mcXVvdDssJnF1b3Q7aGVsbG8mcXVvdDssJnF1b3Q7Z29vZGJ5ZSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZSgmcXVvdDtoZWxsbyZxdW90OywmcXVvdDtoZWxsbyZxdW90OywmcXVvdDtnb29kYnllJnF1b3Q7KS5UZXN0RXF1YWxpdHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmUoJnF1b3Q7aGVsbG8mcXVvdDssJnF1b3Q7aGVsbG8mcXVvdDssJnF1b3Q7Z29vZGJ5ZSZxdW90OykuVGVzdEluZXF1YWxpdHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUGFyYW1ldGVyaXplZFRlc3RGaXh0dXJlKCZxdW90O3ppcCZxdW90OywmcXVvdDt6aXAmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmUoJnF1b3Q7emlwJnF1b3Q7LCZxdW90O3ppcCZxdW90OykuVGVzdEVxdWFsaXR5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGFyYW1ldGVyaXplZFRlc3RGaXh0dXJlKCZxdW90O3ppcCZxdW90OywmcXVvdDt6aXAmcXVvdDspLlRlc3RJbmVxdWFsaXR5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZSg0Miw0Miw5OSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZSg0Miw0Miw5OSkuVGVzdEVxdWFsaXR5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGFyYW1ldGVyaXplZFRlc3RGaXh0dXJlKDQyLDQyLDk5KS5UZXN0SW5lcXVhbGl0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZU5hbWluZ1Rlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGFyYW1ldGVyaXplZFRlc3RGaXh0dXJlTmFtaW5nVGVzdHMuRml4dHVyZUluc3RhbmNlc0FyZU5hbWVkQ29ycmVjdGx5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmVOYW1pbmdUZXN0cy5NZXRob2RXaXRob3V0UGFyYW1zSXNOYW1lZENvcnJlY3RseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGFyYW1ldGVyaXplZFRlc3RGaXh0dXJlTmFtaW5nVGVzdHMuTWV0aG9kV2l0aFBhcmFtc0lzTmFtZWRDb3JyZWN0bHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZU5hbWluZ1Rlc3RzLlN1aXRlSGFzQ29ycmVjdE51bWJlck9mSW5zdGFuY2VzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmVOYW1pbmdUZXN0cy5Ub3BMZXZlbFN1aXRlSXNOYW1lZENvcnJlY3RseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJQYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmVUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZVRlc3RzLkNhblNwZWNpZnlDYXRlZ29yeSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGFyYW1ldGVyaXplZFRlc3RGaXh0dXJlVGVzdHMuQ2FuU3BlY2lmeU11bHRpcGxlQ2F0ZWdvcmllcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRGaXh0dXJlIiBuYW1lPSJQYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmVXaXRoRGF0YVNvdXJjZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDM1IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJQYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmVXaXRoRGF0YVNvdXJjZXMoNDIpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzNCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5BY2Nlc3NUZXN0Q2FzZVNvdXJjZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmVXaXRoRGF0YVNvdXJjZXMoNDIpLkNhbkFjY2Vzc1Rlc3RDYXNlU291cmNlKDYsNykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGFyYW1ldGVyaXplZFRlc3RGaXh0dXJlV2l0aERhdGFTb3VyY2VzKDQyKS5DYW5BY2Nlc3NUZXN0Q2FzZVNvdXJjZSgzLDE0KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5BY2Nlc3NWYWx1ZVNvdXJjZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmVXaXRoRGF0YVNvdXJjZXMoNDIpLkNhbkFjY2Vzc1ZhbHVlU291cmNlKDEpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZVdpdGhEYXRhU291cmNlcyg0MikuQ2FuQWNjZXNzVmFsdWVTb3VyY2UoMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGFyYW1ldGVyaXplZFRlc3RGaXh0dXJlV2l0aERhdGFTb3VyY2VzKDQyKS5DYW5BY2Nlc3NWYWx1ZVNvdXJjZSgzKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5HZW5lcmF0ZURhdGFGcm9tUGFyYW1ldGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyMCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZVdpdGhEYXRhU291cmNlcyg0MikuQ2FuR2VuZXJhdGVEYXRhRnJvbVBhcmFtZXRlcigxLDQyKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmVXaXRoRGF0YVNvdXJjZXMoNDIpLkNhbkdlbmVyYXRlRGF0YUZyb21QYXJhbWV0ZXIoMiwyMSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGFyYW1ldGVyaXplZFRlc3RGaXh0dXJlV2l0aERhdGFTb3VyY2VzKDQyKS5DYW5HZW5lcmF0ZURhdGFGcm9tUGFyYW1ldGVyKDMsMTQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZVdpdGhEYXRhU291cmNlcyg0MikuQ2FuR2VuZXJhdGVEYXRhRnJvbVBhcmFtZXRlcig2LDcpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZVdpdGhEYXRhU291cmNlcyg0MikuQ2FuR2VuZXJhdGVEYXRhRnJvbVBhcmFtZXRlcig3LDYpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZVdpdGhEYXRhU291cmNlcyg0MikuQ2FuR2VuZXJhdGVEYXRhRnJvbVBhcmFtZXRlcigxNCwzKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmVXaXRoRGF0YVNvdXJjZXMoNDIpLkNhbkdlbmVyYXRlRGF0YUZyb21QYXJhbWV0ZXIoMjEsMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGFyYW1ldGVyaXplZFRlc3RGaXh0dXJlV2l0aERhdGFTb3VyY2VzKDQyKS5DYW5HZW5lcmF0ZURhdGFGcm9tUGFyYW1ldGVyKDQyLDEpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZEZpeHR1cmUiIG5hbWU9IlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZVdpdGhOdWxsQXJndW1lbnRzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUGFyYW1ldGVyaXplZFRlc3RGaXh0dXJlV2l0aE51bGxBcmd1bWVudHMoJnF1b3Q7QSZxdW90OyxudWxsKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGFyYW1ldGVyaXplZFRlc3RGaXh0dXJlV2l0aE51bGxBcmd1bWVudHMoJnF1b3Q7QSZxdW90OyxudWxsKS5UZXN0TWV0aG9kIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZVdpdGhOdWxsQXJndW1lbnRzKG51bGwsJnF1b3Q7QSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBhcmFtZXRlcml6ZWRUZXN0Rml4dHVyZVdpdGhOdWxsQXJndW1lbnRzKG51bGwsJnF1b3Q7QSZxdW90OykuVGVzdE1ldGhvZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJQYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmVXaXRoTnVsbEFyZ3VtZW50cyhudWxsLG51bGwpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QYXJhbWV0ZXJpemVkVGVzdEZpeHR1cmVXaXRoTnVsbEFyZ3VtZW50cyhudWxsLG51bGwpLlRlc3RNZXRob2QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJQbGF0Zm9ybURldGVjdGlvblRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA4NiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGxhdGZvcm1EZXRlY3Rpb25UZXN0cy5BcnJheU9mUGxhdGZvcm1zIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QbGF0Zm9ybURldGVjdGlvblRlc3RzLkRldGVjdEV4YWN0VmVyc2lvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGxhdGZvcm1EZXRlY3Rpb25UZXN0cy5EZXRlY3RNb25vMTAiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSI4IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBsYXRmb3JtRGV0ZWN0aW9uVGVzdHMuRGV0ZWN0TW9ubzIwIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iOCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QbGF0Zm9ybURldGVjdGlvblRlc3RzLkRldGVjdE5ldDEwIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iOCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QbGF0Zm9ybURldGVjdGlvblRlc3RzLkRldGVjdE5ldDExIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iOCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QbGF0Zm9ybURldGVjdGlvblRlc3RzLkRldGVjdE5ldDIwIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iOCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QbGF0Zm9ybURldGVjdGlvblRlc3RzLkRldGVjdE5ldDQwIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iOSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QbGF0Zm9ybURldGVjdGlvblRlc3RzLkRldGVjdE5ldENGIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iOSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QbGF0Zm9ybURldGVjdGlvblRlc3RzLkRldGVjdE5UMyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjE4IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBsYXRmb3JtRGV0ZWN0aW9uVGVzdHMuRGV0ZWN0TlQ0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMTgiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGxhdGZvcm1EZXRlY3Rpb25UZXN0cy5EZXRlY3RTU0NMSSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjgiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGxhdGZvcm1EZXRlY3Rpb25UZXN0cy5EZXRlY3RVbml4VW5kZXJNaWNyb3NvZnREb3ROZXQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QbGF0Zm9ybURldGVjdGlvblRlc3RzLkRldGVjdFVuaXhVbmRlck1vbm8iIGV4ZWN1dGVkPSJGYWxzZSIgcmVzdWx0PSJTa2lwcGVkIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlYXNvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVzc2FnZT48IVtDREFUQVtOb3Qgc3VwcG9ydGVkIG9uIE5ldF1dPjwvbWVzc2FnZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWFzb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QbGF0Zm9ybURldGVjdGlvblRlc3RzLkRldGVjdFZpc3RhIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMTciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGxhdGZvcm1EZXRlY3Rpb25UZXN0cy5EZXRlY3RXaW4yMDAzU2VydmVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMTciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGxhdGZvcm1EZXRlY3Rpb25UZXN0cy5EZXRlY3RXaW4yMDA4U2VydmVyT3JpZ2luYWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxNyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QbGF0Zm9ybURldGVjdGlvblRlc3RzLkRldGVjdFdpbjIwMDhTZXJ2ZXJSMiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjE2IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBsYXRmb3JtRGV0ZWN0aW9uVGVzdHMuRGV0ZWN0V2luMksiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxNyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QbGF0Zm9ybURldGVjdGlvblRlc3RzLkRldGVjdFdpbjk1IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMTgiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGxhdGZvcm1EZXRlY3Rpb25UZXN0cy5EZXRlY3RXaW45OCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjE4IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBsYXRmb3JtRGV0ZWN0aW9uVGVzdHMuRGV0ZWN0V2luQ0UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxOSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QbGF0Zm9ybURldGVjdGlvblRlc3RzLkRldGVjdFdpbmRvd3M3IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMTciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGxhdGZvcm1EZXRlY3Rpb25UZXN0cy5EZXRlY3RXaW5NZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjE4IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBsYXRmb3JtRGV0ZWN0aW9uVGVzdHMuRGV0ZWN0V2luWFAiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxNyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QbGF0Zm9ybURldGVjdGlvblRlc3RzLkRldGVjdFdpblhQUHJvZmVzc2lvbmFsWDY0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMTciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUGxhdGZvcm1EZXRlY3Rpb25UZXN0cy5QbGF0Zm9ybUF0dHJpYnV0ZV9FeGNsdWRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5QbGF0Zm9ybURldGVjdGlvblRlc3RzLlBsYXRmb3JtQXR0cmlidXRlX0luY2x1ZGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBsYXRmb3JtRGV0ZWN0aW9uVGVzdHMuUGxhdGZvcm1BdHRyaWJ1dGVfSW5jbHVkZUFuZEV4Y2x1ZGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI3IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlBsYXRmb3JtRGV0ZWN0aW9uVGVzdHMuUGxhdGZvcm1BdHRyaWJ1dGVfSW52YWxpZFBsYXRmb3JtIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlByb3BlcnR5QXR0cmlidXRlVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDI2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5Qcm9wZXJ0eUF0dHJpYnV0ZVRlc3RzLkNhbkRlcml2ZUZyb21Qcm9wZXJ0eUF0dHJpYnV0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUHJvcGVydHlBdHRyaWJ1dGVUZXN0cy5Qcm9wZXJ0aWVzV2l0aE51bWVyaWNWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlByb3BlcnR5QXR0cmlidXRlVGVzdHMuUHJvcGVydHlXaXRoU3RyaW5nVmFsdWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlByb3BlcnR5QXR0cmlidXRlVGVzdHMuUHJvcGVydHlXb3Jrc09uRml4dHVyZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUmVmbGVjdFRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1MCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUmVmbGVjdFRlc3RzLkNhbkRldGVjdEF0dHJpYnV0ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJlZmxlY3RUZXN0cy5DYW5EZXRlY3RJbmhlcml0ZWRBdHRyaWJ1dGVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SZWZsZWN0VGVzdHMuQ29uc3RydWN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SZWZsZWN0VGVzdHMuR2V0QXR0cmlidXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SZWZsZWN0VGVzdHMuR2V0QXR0cmlidXRlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUmVmbGVjdFRlc3RzLkdldENvbnN0cnVjdG9yIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SZWZsZWN0VGVzdHMuR2V0SW5oZXJpdGVkQXR0cmlidXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SZWZsZWN0VGVzdHMuR2V0SW5oZXJpdGVkQXR0cmlidXRlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUmVmbGVjdFRlc3RzLkdldE1ldGhvZHNXaXRoQXR0cmlidXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SZWZsZWN0VGVzdHMuR2V0TmFtZWRNZXRob2QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJlZmxlY3RUZXN0cy5HZXROYW1lZE1ldGhvZFdpdGhBcmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SZWZsZWN0VGVzdHMuR2V0TmFtZWRQcm9wZXJ0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUmVmbGVjdFRlc3RzLkdldFByb3BlcnR5VmFsdWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJlZmxlY3RUZXN0cy5HZXRQcm9wZXJ0eVdpdGhBdHRyaWJ1dGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJlZmxlY3RUZXN0cy5IYXNJbnRlcmZhY2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJlZmxlY3RUZXN0cy5Jbmhlcml0c0Zyb20iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJlZmxlY3RUZXN0cy5JbnZva2VNZXRob2QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUmVtb3RlUnVubmVyVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNjUxIiBhc3NlcnRzPSIxIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SZW1vdGVSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkNoZWNrUnVubmVySUQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJlbW90ZVJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuQ291bnRUZXN0Q2FzZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDQ2IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJlbW90ZVJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuQ291bnRUZXN0Q2FzZXNBY3Jvc3NNdWx0aXBsZUFzc2VtYmxpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDU2IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJlbW90ZVJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuTG9hZEFuZFJlbG9hZEFzc2VtYmx5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA4NyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SZW1vdGVSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRBc3NlbWJseVdpdGhGaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxOSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SZW1vdGVSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRBc3NlbWJseVdpdGhvdXROYW1lc3BhY2VzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA0MyIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SZW1vdGVSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRBc3NlbWJseVdpdGhTdWl0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTQiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUmVtb3RlUnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5Mb2FkTXVsdGlwbGVBc3NlbWJsaWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1NSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SZW1vdGVSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRNdWx0aXBsZUFzc2VtYmxpZXNXaXRoRml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUmVtb3RlUnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5Mb2FkTXVsdGlwbGVBc3NlbWJsaWVzV2l0aFN1aXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyNiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SZW1vdGVSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLlJ1bkFzc2VtYmx5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1MiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SZW1vdGVSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLlJ1bkFzc2VtYmx5VXNpbmdCZWdpbkFuZEVuZFJ1biIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDkiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUmVtb3RlUnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5SdW5NdWx0aXBsZUFzc2VtYmxpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDY0IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJlbW90ZVJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuUnVuTXVsdGlwbGVBc3NlbWJsaWVzVXNpbmdCZWdpbkFuZEVuZFJ1biIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNjMiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJSZXBlYXRlZFRlc3RGaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUmVwZWF0ZWRUZXN0Rml4dHVyZS5DYXRlZ29yeVdvcmtzV2l0aFJlcGVhdGVkVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUmVwZWF0ZWRUZXN0Rml4dHVyZS5JZ25vcmVXb3Jrc1dpdGhSZXBlYXRlZFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJlcGVhdGVkVGVzdEZpeHR1cmUuUmVwZWF0RmFpbE9uRmlyc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJlcGVhdGVkVGVzdEZpeHR1cmUuUmVwZWF0RmFpbE9uVGhpcmQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJlcGVhdGVkVGVzdEZpeHR1cmUuUmVwZWF0U3VjY2VzcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjYiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJSdW50aW1lRnJhbWV3b3JrVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMjQ3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5DcmVhdGVOZXdSdW50aW1lRnJhbWV3b3JrIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1NyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuQ3JlYXRlTmV3UnVudGltZUZyYW1ld29yaygmbHQ7TmV0LTEuMCZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkNyZWF0ZU5ld1J1bnRpbWVGcmFtZXdvcmsoJmx0O05ldC0xLjAuMzcwNSZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkNyZWF0ZU5ld1J1bnRpbWVGcmFtZXdvcmsoJmx0O05ldC0xLjEmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5DcmVhdGVOZXdSdW50aW1lRnJhbWV3b3JrKCZsdDtOZXQtMS4xLjQzMjImZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5DcmVhdGVOZXdSdW50aW1lRnJhbWV3b3JrKCZsdDtOZXQtMi4wJmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuQ3JlYXRlTmV3UnVudGltZUZyYW1ld29yaygmbHQ7TmV0LTIuMC40MDYwNyZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkNyZWF0ZU5ld1J1bnRpbWVGcmFtZXdvcmsoJmx0O05ldC0yLjAuNTA3MjcmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5DcmVhdGVOZXdSdW50aW1lRnJhbWV3b3JrKCZsdDtOZXQtMy4wJmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuQ3JlYXRlTmV3UnVudGltZUZyYW1ld29yaygmbHQ7TmV0LTMuNSZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkNyZWF0ZU5ld1J1bnRpbWVGcmFtZXdvcmsoJmx0O05ldC00LjAmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5DcmVhdGVOZXdSdW50aW1lRnJhbWV3b3JrKCZsdDtOZXQtMC4wJmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuQ3JlYXRlTmV3UnVudGltZUZyYW1ld29yaygmbHQ7TW9uby0xLjAmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5DcmVhdGVOZXdSdW50aW1lRnJhbWV3b3JrKCZsdDtNb25vLTIuMCZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkNyZWF0ZU5ld1J1bnRpbWVGcmFtZXdvcmsoJmx0O01vbm8tMi4wLjUwNzI3Jmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuQ3JlYXRlTmV3UnVudGltZUZyYW1ld29yaygmbHQ7TW9uby0zLjUmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5DcmVhdGVOZXdSdW50aW1lRnJhbWV3b3JrKCZsdDtNb25vLTAuMCZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkNyZWF0ZU5ld1J1bnRpbWVGcmFtZXdvcmsoJmx0O0FueS0xLjEmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5DcmVhdGVOZXdSdW50aW1lRnJhbWV3b3JrKCZsdDtBbnktMi4wJmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuQ3JlYXRlTmV3UnVudGltZUZyYW1ld29yaygmbHQ7QW55LTIuMC41MDcyNyZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkNyZWF0ZU5ld1J1bnRpbWVGcmFtZXdvcmsoJmx0O0FueS0zLjUmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5DcmVhdGVOZXdSdW50aW1lRnJhbWV3b3JrKCZsdDtBbnktNC4wJmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuQ3JlYXRlTmV3UnVudGltZUZyYW1ld29yaygmbHQ7QW55LTAuMCZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkNhbkRpc3BsYXlGcmFtZXdvcmtBc1N0cmluZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkRpc3BsYXlGcmFtZXdvcmtBc1N0cmluZygmbHQ7TmV0LTEuMCZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkRpc3BsYXlGcmFtZXdvcmtBc1N0cmluZygmbHQ7TmV0LTEuMC4zNzA1Jmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuRGlzcGxheUZyYW1ld29ya0FzU3RyaW5nKCZsdDtOZXQtMS4xJmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuRGlzcGxheUZyYW1ld29ya0FzU3RyaW5nKCZsdDtOZXQtMS4xLjQzMjImZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5EaXNwbGF5RnJhbWV3b3JrQXNTdHJpbmcoJmx0O05ldC0yLjAmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5EaXNwbGF5RnJhbWV3b3JrQXNTdHJpbmcoJmx0O05ldC0yLjAuNDA2MDcmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5EaXNwbGF5RnJhbWV3b3JrQXNTdHJpbmcoJmx0O05ldC0yLjAuNTA3MjcmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5EaXNwbGF5RnJhbWV3b3JrQXNTdHJpbmcoJmx0O05ldC0zLjAmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5EaXNwbGF5RnJhbWV3b3JrQXNTdHJpbmcoJmx0O05ldC0zLjUmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5EaXNwbGF5RnJhbWV3b3JrQXNTdHJpbmcoJmx0O05ldC00LjAmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5EaXNwbGF5RnJhbWV3b3JrQXNTdHJpbmcoJmx0O05ldC0wLjAmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5EaXNwbGF5RnJhbWV3b3JrQXNTdHJpbmcoJmx0O01vbm8tMS4wJmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuRGlzcGxheUZyYW1ld29ya0FzU3RyaW5nKCZsdDtNb25vLTIuMCZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkRpc3BsYXlGcmFtZXdvcmtBc1N0cmluZygmbHQ7TW9uby0yLjAuNTA3MjcmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5EaXNwbGF5RnJhbWV3b3JrQXNTdHJpbmcoJmx0O01vbm8tMy41Jmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuRGlzcGxheUZyYW1ld29ya0FzU3RyaW5nKCZsdDtNb25vLTAuMCZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkRpc3BsYXlGcmFtZXdvcmtBc1N0cmluZygmbHQ7QW55LTEuMSZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkRpc3BsYXlGcmFtZXdvcmtBc1N0cmluZygmbHQ7QW55LTIuMCZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkRpc3BsYXlGcmFtZXdvcmtBc1N0cmluZygmbHQ7QW55LTIuMC41MDcyNyZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkRpc3BsYXlGcmFtZXdvcmtBc1N0cmluZygmbHQ7QW55LTMuNSZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkRpc3BsYXlGcmFtZXdvcmtBc1N0cmluZygmbHQ7QW55LTQuMCZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbkRpc3BsYXlGcmFtZXdvcmtBc1N0cmluZygmbHQ7QW55LTAuMCZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5HZXRDdXJyZW50RnJhbWV3b3JrIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuTGlzdEF2YWlsYWJsZUZyYW1ld29ya3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkNhbk1hdGNoUnVudGltZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDQwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5NYXRjaFJ1bnRpbWVzKG5ldC0yLjAsbmV0LTIuMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuTWF0Y2hSdW50aW1lcyhuZXQtMi4wLG5ldC0yLjAuNTA3MjcpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbk1hdGNoUnVudGltZXMobmV0LTIuMC41MDcyNyxuZXQtMi4wKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5NYXRjaFJ1bnRpbWVzKG5ldC0yLjAuNTA3MjcsbmV0LTIuMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuTWF0Y2hSdW50aW1lcyhuZXQtMy41LG5ldC0yLjApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbk1hdGNoUnVudGltZXMobmV0LTIuMCxtb25vLTIuMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuTWF0Y2hSdW50aW1lcyhuZXQtMi4wLG5ldC0xLjEpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbk1hdGNoUnVudGltZXMobmV0LTIuMC41MDcyNyxuZXQtMi4wLjQwNjA3KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5NYXRjaFJ1bnRpbWVzKG1vbm8tMS4xLG1vbm8tMS4wKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5NYXRjaFJ1bnRpbWVzKG1vbm8tMi4wLHYyLjApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbk1hdGNoUnVudGltZXModjIuMCxtb25vLTIuMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuTWF0Y2hSdW50aW1lcyh2Mi4wLHYyLjApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhbk1hdGNoUnVudGltZXModjIuMCx2NC4wKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5NYXRjaFJ1bnRpbWVzKG5ldCxuZXQtMi4wKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5NYXRjaFJ1bnRpbWVzKG5ldC0yLjAsbmV0KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5NYXRjaFJ1bnRpbWVzKGFueSxuZXQtMi4wKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5NYXRjaFJ1bnRpbWVzKG5ldC0yLjAsYW55KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5QYXJzZVJ1bnRpbWVGcmFtZXdvcmsiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDUyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5QYXJzZVJ1bnRpbWVGcmFtZXdvcmsoJmx0O05ldC0xLjAmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5QYXJzZVJ1bnRpbWVGcmFtZXdvcmsoJmx0O05ldC0xLjAuMzcwNSZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhblBhcnNlUnVudGltZUZyYW1ld29yaygmbHQ7TmV0LTEuMSZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhblBhcnNlUnVudGltZUZyYW1ld29yaygmbHQ7TmV0LTEuMS40MzIyJmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuUGFyc2VSdW50aW1lRnJhbWV3b3JrKCZsdDtOZXQtMi4wJmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuUGFyc2VSdW50aW1lRnJhbWV3b3JrKCZsdDtOZXQtMi4wLjQwNjA3Jmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuUGFyc2VSdW50aW1lRnJhbWV3b3JrKCZsdDtOZXQtMi4wLjUwNzI3Jmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuUGFyc2VSdW50aW1lRnJhbWV3b3JrKCZsdDtOZXQtMy4wJmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuUGFyc2VSdW50aW1lRnJhbWV3b3JrKCZsdDtOZXQtMy41Jmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuUGFyc2VSdW50aW1lRnJhbWV3b3JrKCZsdDtOZXQtNC4wJmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuUGFyc2VSdW50aW1lRnJhbWV3b3JrKCZsdDtOZXQtMC4wJmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuUGFyc2VSdW50aW1lRnJhbWV3b3JrKCZsdDtNb25vLTEuMCZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhblBhcnNlUnVudGltZUZyYW1ld29yaygmbHQ7TW9uby0yLjAmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5QYXJzZVJ1bnRpbWVGcmFtZXdvcmsoJmx0O01vbm8tMi4wLjUwNzI3Jmd0OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ2FuUGFyc2VSdW50aW1lRnJhbWV3b3JrKCZsdDtNb25vLTMuNSZndDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuUnVudGltZUZyYW1ld29ya1Rlc3RzLkNhblBhcnNlUnVudGltZUZyYW1ld29yaygmbHQ7TW9uby0wLjAmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5QYXJzZVJ1bnRpbWVGcmFtZXdvcmsoJmx0O0FueS0xLjEmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5QYXJzZVJ1bnRpbWVGcmFtZXdvcmsoJmx0O0FueS0yLjAmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5QYXJzZVJ1bnRpbWVGcmFtZXdvcmsoJmx0O0FueS0yLjAuNTA3MjcmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5QYXJzZVJ1bnRpbWVGcmFtZXdvcmsoJmx0O0FueS0zLjUmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5QYXJzZVJ1bnRpbWVGcmFtZXdvcmsoJmx0O0FueS00LjAmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtUZXN0cy5DYW5QYXJzZVJ1bnRpbWVGcmFtZXdvcmsoJmx0O0FueS0wLjAmZ3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ3VycmVudEZyYW1ld29ya0hhc0J1aWxkU3BlY2lmaWVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5SdW50aW1lRnJhbWV3b3JrVGVzdHMuQ3VycmVudEZyYW1ld29ya011c3RCZUF2YWlsYWJsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTZXJpYWxpemF0aW9uQnVnIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2VyaWFsaXphdGlvbkJ1Zy5TYXZlQW5kTG9hZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTZXRDdWx0dXJlQXR0cmlidXRlVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDIwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TZXRDdWx0dXJlQXR0cmlidXRlVGVzdHMuU2V0Qm90aEN1bHR1cmVzVG9GcmVuY2giIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlNldEN1bHR1cmVBdHRyaWJ1dGVUZXN0cy5TZXRCb3RoQ3VsdHVyZXNUb0ZyZW5jaENhbmFkaWFuIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TZXRDdWx0dXJlQXR0cmlidXRlVGVzdHMuU2V0Qm90aEN1bHR1cmVzVG9SdXNzaWFuIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TZXRDdWx0dXJlQXR0cmlidXRlVGVzdHMuU2V0TWl4ZWRDdWx0dXJlc1RvRnJlbmNoQW5kVUlGcmVuY2hDYW5hZGlhbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2V0Q3VsdHVyZUF0dHJpYnV0ZVRlc3RzLlNldE1peGVkQ3VsdHVyZXNUb1J1c3NpYW5BbmRVSUVuZ2xpc2hVUyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2V0Q3VsdHVyZUF0dHJpYnV0ZVRlc3RzLlNldFVJQ3VsdHVyZU9ubHlUb0ZyZW5jaCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2V0Q3VsdHVyZUF0dHJpYnV0ZVRlc3RzLlNldFVJQ3VsdHVyZU9ubHlUb0ZyZW5jaENhbmFkaWFuIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TZXRDdWx0dXJlQXR0cmlidXRlVGVzdHMuU2V0VUlDdWx0dXJlT25seVRvUnVzc2lhbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTZXRDdWx0dXJlQXR0cmlidXRlVGVzdHMrTmVzdGVkQmVoYXZpb3IiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TZXRDdWx0dXJlQXR0cmlidXRlVGVzdHMrTmVzdGVkQmVoYXZpb3IuSW5oZXJpdGVkUnVzc2lhbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2V0Q3VsdHVyZUF0dHJpYnV0ZVRlc3RzK05lc3RlZEJlaGF2aW9yLkluaGVyaXRlZFJ1c3NpYW5XaXRoVUlGcmVuY2giIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iU2V0VXBGaXh0dXJlVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjEuMDY5IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TZXRVcEZpeHR1cmVUZXN0cy5Bc3NlbWJseVNldFVwRml4dHVyZVJlcGxhY2VzQXNzZW1ibHlOb2RlSW5UcmVlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjQ2NSIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TZXRVcEZpeHR1cmVUZXN0cy5Bc3NlbWJseVNldHVwRml4dHVyZVdyYXBzRXhlY3V0aW9uT2ZUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjQ0OCIgYXNzZXJ0cz0iNSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TZXRVcEZpeHR1cmVUZXN0cy5OYW1lc3BhY2VTZXRVcEZpeHR1cmVSZXBsYWNlc05hbWVzcGFjZU5vZGVJblRyZWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDIwIiBhc3NlcnRzPSIxNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TZXRVcEZpeHR1cmVUZXN0cy5OYW1lc3BhY2VTZXRVcEZpeHR1cmVXcmFwc0V4ZWN1dGlvbk9mU2luZ2xlVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjAiIGFzc2VydHM9IjgiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2V0VXBGaXh0dXJlVGVzdHMuTmFtZXNwYWNlU2V0VXBGaXh0dXJlV3JhcHNFeGVjdXRpb25PZlR3b1Rlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyNCIgYXNzZXJ0cz0iMTMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2V0VXBGaXh0dXJlVGVzdHMuTmFtZXNwYWNlU2V0VXBGaXh0dXJlV3JhcHNOZXN0ZWROYW1lc3BhY2VTZXRVcEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDI0IiBhc3NlcnRzPSIxNSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TZXRVcEZpeHR1cmVUZXN0cy5OYW1lc3BhY2VTZXRVcE1ldGhvZHNNYXlCZVN0YXRpYyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjQiIGFzc2VydHM9IjgiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2V0VXBGaXh0dXJlVGVzdHMuV2l0aFR3b1NldFVwRml4dHVlc09ubHlPbmVJc1VzZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDIxIiBhc3NlcnRzPSI4IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iU2V0VXBUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1MiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2V0VXBUZXN0LkJhc2VTZXRVcElzQ2FsbGVkRmlyc3RUZWFyRG93bkxhc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSI2IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlNldFVwVGVzdC5DaGVja0luaGVyaXRlZFNldFVwQW5kVGVhckRvd25BcmVDYWxsZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlNldFVwVGVzdC5DaGVja092ZXJyaWRkZW5TZXRVcEFuZFRlYXJEb3duQXJlTm90Q2FsbGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TZXRVcFRlc3QuTWFrZVN1cmVTZXRVcEFuZFRlYXJEb3duQXJlQ2FsbGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TZXRVcFRlc3QuTXVsdGlwbGVTZXRVcEFuZFRlYXJEb3duTWV0aG9kc0FyZUNhbGxlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2V0VXBUZXN0LlNldFVwQW5kVGVhckRvd25Db3VudGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TZXRVcFRlc3QuU2V0dXBSZWNvcmRzT3JpZ2luYWxFeGNlcHRpb25UaG93bkJ5VGVzdENhc2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlNldFVwVGVzdC5UZWFyRG93blJlY29yZHNPcmlnaW5hbEV4Y2VwdGlvblRob3duQnlUZXN0Q2FzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTZXRVcFRlc3QrU2V0dXBDYWxsRGVyaXZlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlNldFVwVGVzdCtTZXR1cENhbGxEZXJpdmVkLkFzc2VydENvdW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlNpbXBsZU5hbWVGaWx0ZXJUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wODIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlNpbXBsZU5hbWVGaWx0ZXJUZXN0cy5FeHBsaWNpdFRlc3RDYXNlRG9lc05vdE1hdGNoV2hlbk5vdFNlbGVjdGVkRGlyZWN0bHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlNpbXBsZU5hbWVGaWx0ZXJUZXN0cy5FeHBsaWNpdFRlc3RDYXNlTWF0Y2hlc1doZW5TZWxlY3RlZERpcmVjdGx5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TaW1wbGVOYW1lRmlsdGVyVGVzdHMuRXhwbGljaXRUZXN0U3VpdGVEb2VzTm90TWF0Y2hXaGVuTm90U2VsZWN0ZWREaXJlY3RseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2ltcGxlTmFtZUZpbHRlclRlc3RzLkV4cGxpY2l0VGVzdFN1aXRlTWF0Y2hlc1doZW5TZWxlY3RlZERpcmVjdGx5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TaW1wbGVOYW1lRmlsdGVyVGVzdHMuSGlnaExldmVsU3VpdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlNpbXBsZU5hbWVGaWx0ZXJUZXN0cy5NdWx0aXBsZU5hbWVNYXRjaCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2ltcGxlTmFtZUZpbHRlclRlc3RzLlNpbmdsZU5hbWVNYXRjaCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2ltcGxlTmFtZUZpbHRlclRlc3RzLlN1aXRlTmFtZU1hdGNoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TaW1wbGVOYW1lRmlsdGVyVGVzdHMuVGVzdERvZXNOb3RNYXRjaCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTaW1wbGVUZXN0UnVubmVyVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNjI1IiBhc3NlcnRzPSIxIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TaW1wbGVUZXN0UnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5DaGVja1J1bm5lcklEIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TaW1wbGVUZXN0UnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5Db3VudFRlc3RDYXNlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2ltcGxlVGVzdFJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuQ291bnRUZXN0Q2FzZXNBY3Jvc3NNdWx0aXBsZUFzc2VtYmxpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDU4IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlNpbXBsZVRlc3RSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRBbmRSZWxvYWRBc3NlbWJseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wODIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2ltcGxlVGVzdFJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuTG9hZEFzc2VtYmx5V2l0aEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE4IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlNpbXBsZVRlc3RSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRBc3NlbWJseVdpdGhvdXROYW1lc3BhY2VzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA0MyIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TaW1wbGVUZXN0UnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5Mb2FkQXNzZW1ibHlXaXRoU3VpdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlNpbXBsZVRlc3RSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRNdWx0aXBsZUFzc2VtYmxpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDU1IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlNpbXBsZVRlc3RSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRNdWx0aXBsZUFzc2VtYmxpZXNXaXRoRml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjkiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2ltcGxlVGVzdFJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuTG9hZE11bHRpcGxlQXNzZW1ibGllc1dpdGhTdWl0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjUiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2ltcGxlVGVzdFJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuUnVuQXNzZW1ibHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDQ3IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlNpbXBsZVRlc3RSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLlJ1bkFzc2VtYmx5VXNpbmdCZWdpbkFuZEVuZFJ1biIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDYiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU2ltcGxlVGVzdFJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuUnVuTXVsdGlwbGVBc3NlbWJsaWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA2MSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TaW1wbGVUZXN0UnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5SdW5NdWx0aXBsZUFzc2VtYmxpZXNVc2luZ0JlZ2luQW5kRW5kUnVuIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA2MiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlN0YWNrT3ZlcmZsb3dUZXN0Rml4dHVyZSIgZXhlY3V0ZWQ9IkZhbHNlIiByZXN1bHQ9IlNraXBwZWQiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWFzb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVzc2FnZT48IVtDREFUQVtDYW5ub3QgaGFuZGxlIFN0YWNrT3ZlcmZsb3dFeGNlcHRpb24gaW4gbWFuYWdlZCBjb2RlXV0+PC9tZXNzYWdlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVhc29uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlN0YWNrT3ZlcmZsb3dUZXN0Rml4dHVyZS5TaW1wbGVPdmVyZmxvdyIgZXhlY3V0ZWQ9IkZhbHNlIiByZXN1bHQ9IlNraXBwZWQiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVhc29uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXNzYWdlPjwhW0NEQVRBW0Nhbm5vdCBoYW5kbGUgU3RhY2tPdmVyZmxvd0V4Y2VwdGlvbiBpbiBtYW5hZ2VkIGNvZGVdXT48L21lc3NhZ2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVhc29uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LWNhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTdWl0ZUJ1aWxkZXJUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMS43MDMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlN1aXRlQnVpbGRlclRlc3RzLkRpc2NvdmVyU3VpdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE3IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlN1aXRlQnVpbGRlclRlc3RzLkZpbGVOb3RGb3VuZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU3VpdGVCdWlsZGVyVGVzdHMuRml4dHVyZU5vdEZvdW5kIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxNSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TdWl0ZUJ1aWxkZXJUZXN0cy5JbnZhbGlkQXNzZW1ibHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlN1aXRlQnVpbGRlclRlc3RzLkxvYWRBc3NlbWJseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC41MjkiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU3VpdGVCdWlsZGVyVGVzdHMuTG9hZEFzc2VtYmx5V2l0aG91dE5hbWVzcGFjZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNTI5IiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlN1aXRlQnVpbGRlclRlc3RzLkxvYWRGaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TdWl0ZUJ1aWxkZXJUZXN0cy5Mb2FkTmFtZXNwYWNlQXNTdWl0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC41MTIiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU3VpdGVCdWlsZGVyVGVzdHMuTG9hZFN1aXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyNCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TdWl0ZUJ1aWxkZXJUZXN0cy5Xcm9uZ1JldHVyblR5cGVTdWl0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTUiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTdWl0ZUJ1aWxkZXJUZXN0c19NdWx0aXBsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4yNDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlN1aXRlQnVpbGRlclRlc3RzX011bHRpcGxlLkJ1aWxkU3VpdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDU1IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlN1aXRlQnVpbGRlclRlc3RzX011bHRpcGxlLkxvYWRGaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA3OCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5TdWl0ZUJ1aWxkZXJUZXN0c19NdWx0aXBsZS5Sb290Tm9kZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuU3VpdGVCdWlsZGVyVGVzdHNfTXVsdGlwbGUuVGVzdENhc2VDb3VudCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0QXR0cmlidXRlRml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RBdHRyaWJ1dGVGaXh0dXJlLkRlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0QXR0cmlidXRlRml4dHVyZS5EZXNjcmlwdGlvbkluUmVzdWx0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0QXR0cmlidXRlRml4dHVyZS5GaXh0dXJlRGVzY3JpcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RBdHRyaWJ1dGVGaXh0dXJlLkZpeHR1cmVEZXNjcmlwdGlvbkluUmVzdWx0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0QXR0cmlidXRlRml4dHVyZS5Ob0Rlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0QXR0cmlidXRlRml4dHVyZS5SZWZsZWN0aW9uVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEF0dHJpYnV0ZUZpeHR1cmUuU2VwYXJhdGVEZXNjcmlwdGlvbkF0dHJpYnV0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEF0dHJpYnV0ZUZpeHR1cmUuU2VwYXJhdGVEZXNjcmlwdGlvbkluUmVzdWx0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RDYXNlQXR0cmlidXRlVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTUxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJBcmd1bWVudHNBcmVDb2FsZXNjZWRJbk9iamVjdEFycmF5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkFyZ3VtZW50c0FyZUNvYWxlc2NlZEluT2JqZWN0QXJyYXkoJnF1b3Q7YSZxdW90OywmcXVvdDtiJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJBcmd1bWVudHNPZkRpZmZlcmVudFR5cGVBcmVDb2FsZXNjZWRJbk9iamVjdEFycmF5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkFyZ3VtZW50c09mRGlmZmVyZW50VHlwZUFyZUNvYWxlc2NlZEluT2JqZWN0QXJyYXkoMSwmcXVvdDtiJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5Db252ZXJ0RG91YmxlVG9EZWNpbWFsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnREb3VibGVUb0RlY2ltYWwoMi4ybSwzLjNtKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5Db252ZXJ0SW50VG9EZWNpbWFsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRJbnRUb0RlY2ltYWwoNW0sMm0pIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkNhbkNvbnZlcnRJbnRUb0RvdWJsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VBdHRyaWJ1dGVUZXN0cy5DYW5Db252ZXJ0SW50VG9Eb3VibGUoMiwyKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5Db252ZXJ0U21hbGxJbnRzVG9CeXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRTbWFsbEludHNUb0J5dGUoNSwyKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5Db252ZXJ0U21hbGxJbnRzVG9TQnl0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VBdHRyaWJ1dGVUZXN0cy5DYW5Db252ZXJ0U21hbGxJbnRzVG9TQnl0ZSg1LDIpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkNhbkNvbnZlcnRTbWFsbEludHNUb1Nob3J0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkNhbkNvbnZlcnRTbWFsbEludHNUb1Nob3J0KDUsMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ2FuQ29udmVydFN0cmluZ1RvRGF0ZVRpbWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlQXR0cmlidXRlVGVzdHMuQ2FuQ29udmVydFN0cmluZ1RvRGF0ZVRpbWUoMTAvMTIvMTk0MiAwMDowMDowMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ2FuQ29udmVydFN0cmluZ1RvRGVjaW1hbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VBdHRyaWJ1dGVUZXN0cy5DYW5Db252ZXJ0U3RyaW5nVG9EZWNpbWFsKDIuMm0sMy4zbSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VBdHRyaWJ1dGVUZXN0cy5DYW5JZ25vcmVJbmRpdmlkdWFsVGVzdENhc2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkNhblBhc3NBcnJheUFzQXJndW1lbnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlQXR0cmlidXRlVGVzdHMuQ2FuUGFzc0FycmF5QXNBcmd1bWVudCgmcXVvdDthJnF1b3Q7LCZxdW90O2ImcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkNhblBhc3NOdWxsQXNBcmd1bWVudCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VBdHRyaWJ1dGVUZXN0cy5DYW5QYXNzTnVsbEFzQXJndW1lbnQobnVsbCxudWxsKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5QYXNzTnVsbEFzU29sZUFyZ3VtZW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkNhblBhc3NOdWxsQXNTb2xlQXJndW1lbnQobnVsbCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ2FuUGFzc09iamVjdEFycmF5QXNGaXJzdEFyZ3VtZW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkNhblBhc3NPYmplY3RBcnJheUFzRmlyc3RBcmd1bWVudCgxLCZxdW90O3R3byZxdW90OywzLjBkKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlQXR0cmlidXRlVGVzdHMuQ2FuUGFzc09iamVjdEFycmF5QXNGaXJzdEFyZ3VtZW50KCZxdW90O3ppcCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VBdHRyaWJ1dGVUZXN0cy5DYW5TcGVjaWZ5Q2F0ZWdvcnkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlQXR0cmlidXRlVGVzdHMuQ2FuU3BlY2lmeURlc2NyaXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJDYW5TcGVjaWZ5RXhjZXB0aW9uTWVzc2FnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VBdHRyaWJ1dGVUZXN0cy5DYW5TcGVjaWZ5RXhjZXB0aW9uTWVzc2FnZSg0MikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iQ2FuU3BlY2lmeUV4Y2VwdGlvbk1lc3NhZ2VBbmRNYXRjaFR5cGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlQXR0cmlidXRlVGVzdHMuQ2FuU3BlY2lmeUV4Y2VwdGlvbk1lc3NhZ2VBbmRNYXRjaFR5cGUoNDIpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlQXR0cmlidXRlVGVzdHMuQ2FuU3BlY2lmeUV4cGVjdGVkRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkNhblNwZWNpZnlFeHBlY3RlZEV4Y2VwdGlvbl9Ob25lVGhyb3duIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkNhblNwZWNpZnlFeHBlY3RlZEV4Y2VwdGlvbl9Xcm9uZ0V4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VBdHRyaWJ1dGVUZXN0cy5DYW5TcGVjaWZ5RXhwZWN0ZWRFeGNlcHRpb25fV3JvbmdNZXNzYWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkNhblNwZWNpZnlNdWx0aXBsZUNhdGVnb3JpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlQXR0cmlidXRlVGVzdHMuQ2FuU3BlY2lmeVRlc3ROYW1lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkNvbnZlcnNpb25PdmVyZmxvd01ha2VzVGVzdE5vblJ1bm5hYmxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJFeHBlY3RlZFJlc3VsdENhbkJlTnVsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VBdHRyaWJ1dGVUZXN0cy5FeHBlY3RlZFJlc3VsdENhbkJlTnVsbCgpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkhhbmRsZXNQYXJhbXNBcnJheUFzTGFzdEFyZ3VtZW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkhhbmRsZXNQYXJhbXNBcnJheUFzTGFzdEFyZ3VtZW50KCZxdW90O2EmcXVvdDssJnF1b3Q7YiZxdW90OywmcXVvdDtjJnF1b3Q7LCZxdW90O2QmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkhhbmRsZXNQYXJhbXNBcnJheUFzU29sZUFyZ3VtZW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkhhbmRsZXNQYXJhbXNBcnJheUFzU29sZUFyZ3VtZW50KCZxdW90O2EmcXVvdDssJnF1b3Q7YiZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VBdHRyaWJ1dGVUZXN0cy5JZ25vcmVUYWtlc1ByZWNlZGVuY2VPdmVyRXhwZWN0ZWRFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkludGVnZXJEaXZpc2lvbldpdGhSZXN1bHRDaGVja2VkQnlOVW5pdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VBdHRyaWJ1dGVUZXN0cy5JbnRlZ2VyRGl2aXNpb25XaXRoUmVzdWx0Q2hlY2tlZEJ5TlVuaXQoMTIsMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkludGVnZXJEaXZpc2lvbldpdGhSZXN1bHRDaGVja2VkQnlOVW5pdCgxMiwzKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlQXR0cmlidXRlVGVzdHMuSW50ZWdlckRpdmlzaW9uV2l0aFJlc3VsdENoZWNrZWRCeU5Vbml0KDEyLDQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VBdHRyaWJ1dGVUZXN0cy5JbnRlZ2VyRGl2aXNpb25XaXRoUmVzdWx0Q2hlY2tlZEJ5TlVuaXQoMTIsMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkRpdmlzaW9uQnlaZXJvVGhyb3dzRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IkludGVnZXJEaXZpc2lvbldpdGhSZXN1bHRQYXNzZWRUb1Rlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlQXR0cmlidXRlVGVzdHMuSW50ZWdlckRpdmlzaW9uV2l0aFJlc3VsdFBhc3NlZFRvVGVzdCgxMiwyLDYpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VBdHRyaWJ1dGVUZXN0cy5JbnRlZ2VyRGl2aXNpb25XaXRoUmVzdWx0UGFzc2VkVG9UZXN0KDEyLDAsMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZUF0dHJpYnV0ZVRlc3RzLkludGVnZXJEaXZpc2lvbldpdGhSZXN1bHRQYXNzZWRUb1Rlc3QoMTIsMyw0KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlQXR0cmlidXRlVGVzdHMuSW50ZWdlckRpdmlzaW9uV2l0aFJlc3VsdFBhc3NlZFRvVGVzdCgxMiw0LDMpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VBdHRyaWJ1dGVUZXN0cy5JbnRlZ2VyRGl2aXNpb25XaXRoUmVzdWx0UGFzc2VkVG9UZXN0KDEyLDAsMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0Q2FzZVJlc3VsdEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVJlc3VsdEZpeHR1cmUuVGVzdENhc2VEZWZhdWx0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVJlc3VsdEZpeHR1cmUuVGVzdENhc2VGYWlsdXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVJlc3VsdEZpeHR1cmUuVGVzdENhc2VOb3RSdW4iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlUmVzdWx0Rml4dHVyZS5UZXN0Q2FzZVN1Y2Nlc3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdENhc2VTb3VyY2VUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4xNDUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuQ2FuSWdub3JlSW5kaXZpZHVhbFRlc3RDYXNlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5DYW5TcGVjaWZ5RXhwZWN0ZWRFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuQ2FuU3BlY2lmeUV4cGVjdGVkRXhjZXB0aW9uX05vbmVUaHJvd24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuQ2FuU3BlY2lmeUV4cGVjdGVkRXhjZXB0aW9uX1dyb25nRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJFeHBlY3RlZFJlc3VsdENhbkJlTnVsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5FeHBlY3RlZFJlc3VsdENhbkJlTnVsbCgpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuSGFuZGxlc0V4Y2VwdGlvbkluVGVzdENhc2VTb3VyY2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuSWdub3JlVGFrZXNQcmVjZWRlbmNlT3ZlckV4cGVjdGVkRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJNZXRob2RUYWtpbmdUd29TdHJpbmdBcnJheXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuTWV0aG9kVGFraW5nVHdvU3RyaW5nQXJyYXlzKFN5c3RlbS5TdHJpbmdbXSxTeXN0ZW0uU3RyaW5nW10pIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlNvdXJjZUNhbkJlSW5zdGFuY2VGaWVsZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5Tb3VyY2VDYW5CZUluc3RhbmNlRmllbGQoJnF1b3Q7SW5zdGFuY2VGaWVsZCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU291cmNlQ2FuQmVJbnN0YW5jZU1ldGhvZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5Tb3VyY2VDYW5CZUluc3RhbmNlTWV0aG9kKCZxdW90O0luc3RhbmNlTWV0aG9kJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTb3VyY2VDYW5CZUluc3RhbmNlUHJvcGVydHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuU291cmNlQ2FuQmVJbnN0YW5jZVByb3BlcnR5KCZxdW90O0luc3RhbmNlUHJvcGVydHkmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlNvdXJjZUNhbkJlU3RhdGljRmllbGQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuU291cmNlQ2FuQmVTdGF0aWNGaWVsZCgmcXVvdDtTdGF0aWNGaWVsZCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU291cmNlQ2FuQmVTdGF0aWNNZXRob2QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuU291cmNlQ2FuQmVTdGF0aWNNZXRob2QoJnF1b3Q7U3RhdGljTWV0aG9kJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTb3VyY2VDYW5CZVN0YXRpY1Byb3BlcnR5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVNvdXJjZVRlc3RzLlNvdXJjZUNhbkJlU3RhdGljUHJvcGVydHkoJnF1b3Q7U3RhdGljUHJvcGVydHkmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlNvdXJjZUlzSW52b2tlZFdpdGhDb3JyZWN0Q3VycmVudERpcmVjdG9yeSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5Tb3VyY2VJc0ludm9rZWRXaXRoQ29ycmVjdEN1cnJlbnREaXJlY3RvcnkoVHJ1ZSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU291cmNlTWF5QmVJbkFub3RoZXJDbGFzcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2F0ZWdvcmllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iVG9wIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhdGVnb3JpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVNvdXJjZVRlc3RzLlRoaXNPbmVTaG91bGRUaHJvdyIgZGVzY3JpcHRpb249IkRlbW9uc3RyYXRlcyB1c2Ugb2YgRXhwZWN0ZWRFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYXRlZ29yaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iSnVuayIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2F0ZWdvcmllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iTXlQcm9wIiB2YWx1ZT0iemlwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVNvdXJjZVRlc3RzLlNvdXJjZU1heUJlSW5Bbm90aGVyQ2xhc3MoMTAwLDIwLDUpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5Tb3VyY2VNYXlCZUluQW5vdGhlckNsYXNzKDEwMCw0LDI1KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTb3VyY2VNYXlCZUluQW5vdGhlckNsYXNzV2l0aFJldHVybiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5UQzEiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVNvdXJjZVRlc3RzLlRDMiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuVEMzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlNvdXJjZU1heVJldHVybkFyZ3VtZW50c0FzSW50QXJyYXkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuU291cmNlTWF5UmV0dXJuQXJndW1lbnRzQXNJbnRBcnJheSgxMiwzLDQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5Tb3VyY2VNYXlSZXR1cm5Bcmd1bWVudHNBc0ludEFycmF5KDEyLDQsMykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVNvdXJjZVRlc3RzLlNvdXJjZU1heVJldHVybkFyZ3VtZW50c0FzSW50QXJyYXkoMTIsNiwyKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJTb3VyY2VNYXlSZXR1cm5Bcmd1bWVudHNBc09iamVjdEFycmF5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVNvdXJjZVRlc3RzLlNvdXJjZU1heVJldHVybkFyZ3VtZW50c0FzT2JqZWN0QXJyYXkoMTIsMyw0KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuU291cmNlTWF5UmV0dXJuQXJndW1lbnRzQXNPYmplY3RBcnJheSgxMiw0LDMpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5Tb3VyY2VNYXlSZXR1cm5Bcmd1bWVudHNBc09iamVjdEFycmF5KDEyLDYsMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iU291cmNlTWF5UmV0dXJuQXJndW1lbnRzQXNQYXJhbVNldCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5Tb3VyY2VNYXlSZXR1cm5Bcmd1bWVudHNBc1BhcmFtU2V0KDI0LDMpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5Tb3VyY2VNYXlSZXR1cm5Bcmd1bWVudHNBc1BhcmFtU2V0KDI0LDIpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlNvdXJjZU1heVJldHVyblNpbmdsZVByaW1pdGl2ZUFyZ3VtZW50QWxvbmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuU291cmNlTWF5UmV0dXJuU2luZ2xlUHJpbWl0aXZlQXJndW1lbnRBbG9uZSgyKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuU291cmNlTWF5UmV0dXJuU2luZ2xlUHJpbWl0aXZlQXJndW1lbnRBbG9uZSg0KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuU291cmNlTWF5UmV0dXJuU2luZ2xlUHJpbWl0aXZlQXJndW1lbnRBbG9uZSg2KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuU291cmNlTWF5UmV0dXJuU2luZ2xlUHJpbWl0aXZlQXJndW1lbnRBbG9uZSg4KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJUZXN0QXR0cmlidXRlSXNPcHRpb25hbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5UZXN0QXR0cmlidXRlSXNPcHRpb25hbCgxMiwzLDQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5UZXN0QXR0cmlidXRlSXNPcHRpb25hbCgxMiw0LDMpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5UZXN0QXR0cmlidXRlSXNPcHRpb25hbCgxMiw2LDIpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlRlc3RNYXlVc2VNdWx0aXBsZVNvdXJjZUF0dHJpYnV0ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuVGVzdE1heVVzZU11bHRpcGxlU291cmNlQXR0cmlidXRlcygxMiwzLDQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5UZXN0TWF5VXNlTXVsdGlwbGVTb3VyY2VBdHRyaWJ1dGVzKDEyLDQsMykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVNvdXJjZVRlc3RzLlRlc3RNYXlVc2VNdWx0aXBsZVNvdXJjZUF0dHJpYnV0ZXMoMTIsNiwyKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuVGVzdE1heVVzZU11bHRpcGxlU291cmNlQXR0cmlidXRlcygxMiwxLDEyKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlU291cmNlVGVzdHMuVGVzdE1heVVzZU11bHRpcGxlU291cmNlQXR0cmlidXRlcygxMiwyLDYpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENhc2VTb3VyY2VUZXN0cy5UZXN0TWF5VXNlTXVsdGlwbGVTb3VyY2VBdHRyaWJ1dGVzKDEyLDAsMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iVGVzdFdpdGhGb3VyQXJndW1lbnRzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVNvdXJjZVRlc3RzLlRlc3RXaXRoRm91ckFyZ3VtZW50cygxMiwzLDQsMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVNvdXJjZVRlc3RzLlRlc3RXaXRoRm91ckFyZ3VtZW50cygxMiw0LDMsMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVNvdXJjZVRlc3RzLlRlc3RXaXRoRm91ckFyZ3VtZW50cygxMiw1LDIsMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0Q2FzZVRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVRlc3QuQ3JlYXRlSWdub3JlZFRlc3RDYXNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q2FzZVRlc3QuTG9hZE1ldGhvZENhdGVnb3JpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDYXNlVGVzdC5SdW5JZ25vcmVkVGVzdENhc2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdENvbnNvbGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q29uc29sZS5Db25zb2xlV3JpdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDb25zb2xlLkNvbnNvbGVXcml0ZUxpbmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdENvbnRleHRUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDb250ZXh0VGVzdHMuQ2FuQWNjZXNzVGVzdENvbnRleHRPblNlcGFyYXRlVGhyZWFkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMSI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJSZXF1aXJlc1RocmVhZCIgdmFsdWU9IlRydWUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDb250ZXh0VGVzdHMuVGVzdENhbkFjY2Vzc0l0c093bkZ1bGxOYW1lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q29udGV4dFRlc3RzLlRlc3RDYW5BY2Nlc3NJdHNPd25OYW1lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q29udGV4dFRlc3RzLlRlc3RDYW5BY2Nlc3NJdHNPd25Qcm9wZXJ0aWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJBbnN3ZXIiIHZhbHVlPSI0MiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LWNhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENvbnRleHRUZXN0cy5UZXN0Q2FuQWNjZXNzVGVzdERpcmVjdG9yeSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENvbnRleHRUZXN0cy5UZXN0Q2FuQWNjZXNzVGVzdFN0YXRlX0ZhaWxpbmdUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Q29udGV4dFRlc3RzLlRlc3RDYW5BY2Nlc3NUZXN0U3RhdGVfRmFpbHVyZUluU2V0VXAiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RDb250ZXh0VGVzdHMuVGVzdENhbkFjY2Vzc1Rlc3RTdGF0ZV9JZ25vcmVkSW5TZXRVcCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdENvbnRleHRUZXN0cy5UZXN0Q2FuQWNjZXNzVGVzdFN0YXRlX1Bhc3NpbmdUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3REZWxlZ2F0ZUZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0RGVsZWdhdGVGaXh0dXJlLkRlbGVnYXRlVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0RXhlY3V0aW9uQ29udGV4dFRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxNCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEV4ZWN1dGlvbkNvbnRleHRUZXN0cy5TZXRBbmRSZXN0b3JlQ3VycmVudEN1bHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RFeGVjdXRpb25Db250ZXh0VGVzdHMuU2V0QW5kUmVzdG9yZUN1cnJlbnREaXJlY3RvcnkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RFeGVjdXRpb25Db250ZXh0VGVzdHMuU2V0QW5kUmVzdG9yZUN1cnJlbnRQcmluY2lwYWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RFeGVjdXRpb25Db250ZXh0VGVzdHMuU2V0QW5kUmVzdG9yZUN1cnJlbnRVSUN1bHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdEZpeHR1cmVCdWlsZGVyVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZUJ1aWxkZXJUZXN0cy5Hb29kU2lnbmF0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZUJ1aWxkZXJUZXN0cy5Mb2FkQ2F0ZWdvcmllcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0Rml4dHVyZUV4dGVuc2lvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNzkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlRXh0ZW5zaW9uLkNoZWNrTXVsdGlwbGVTZXRVcCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTkiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVFeHRlbnNpb24uRGVyaXZlZFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE2IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlRXh0ZW5zaW9uLkluaGVyaXRTZXR1cCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTgiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVFeHRlbnNpb24uSW5oZXJpdFRlYXJEb3duIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxOCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RGaXh0dXJlVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMjQwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzLkNhbm5vdFJ1bkJhZENvbnN0cnVjdG9yIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzLkNhbm5vdFJ1bkNvbnN0cnVjdG9yV2l0aEFyZ3NOb3RTdXBwbGllZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVUZXN0cy5DYW5ub3RSdW5GaXh0dXJlU2V0dXBXaXRoUGFyYW1ldGVycyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVUZXN0cy5DYW5ub3RSdW5GaXh0dXJlU2V0dXBXaXRoUmV0dXJuVmFsdWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ2Fubm90UnVuRml4dHVyZVRlYXJEb3duV2l0aFBhcmFtZXRlcnMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ2Fubm90UnVuRml4dHVyZVRlYXJEb3duV2l0aFJldHVyblZhbHVlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzLkNhbm5vdFJ1bkdlbmVyaWNGaXh0dXJlRGVyaXZlZEZyb21BYnN0cmFjdEZpeHR1cmVXaXRoTm9BcmdzUHJvdmlkZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ2Fubm90UnVuR2VuZXJpY0ZpeHR1cmVXaXRoTm9BcmdzUHJvdmlkZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ2Fubm90UnVuR2VuZXJpY0ZpeHR1cmVXaXRoTm9UZXN0Rml4dHVyZUF0dHJpYnV0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVUZXN0cy5DYW5ub3RSdW5JZ25vcmVkRml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVUZXN0cy5DYW5ub3RSdW5Qcml2YXRlRml4dHVyZVNldFVwIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzLkNhbm5vdFJ1blByaXZhdGVGaXh0dXJlVGVhckRvd24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ2Fubm90UnVuUHJpdmF0ZVNldFVwIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzLkNhbm5vdFJ1blByaXZhdGVUZWFyRG93biIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVUZXN0cy5DYW5ub3RSdW5TZXR1cFdpdGhQYXJhbWV0ZXJzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzLkNhbm5vdFJ1blNldHVwV2l0aFJldHVyblZhbHVlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzLkNhbm5vdFJ1blRlYXJEb3duV2l0aFBhcmFtZXRlcnMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ2Fubm90UnVuVGVhckRvd25XaXRoUmV0dXJuVmFsdWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ2FuUnVuQ29uc3RydWN0b3JXaXRoQXJnc1N1cHBsaWVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzLkNhblJ1bkZpeHR1cmVEZXJpdmVkRnJvbUFic3RyYWN0RGVyaXZlZFRlc3RGaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzLkNhblJ1bkZpeHR1cmVEZXJpdmVkRnJvbUFic3RyYWN0Rml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVUZXN0cy5DYW5SdW5HZW5lcmljRml4dHVyZURlcml2ZWRGcm9tQWJzdHJhY3RGaXh0dXJlV2l0aEFyZ3NQcm92aWRlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVUZXN0cy5DYW5SdW5HZW5lcmljRml4dHVyZVdpdGhQcm9wZXJBcmdzUHJvdmlkZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ2FuUnVuTXVsdGlwbGVTZXRVcCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVUZXN0cy5DYW5SdW5NdWx0aXBsZVRlYXJEb3duIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzLkNhblJ1bk11bHRpcGxlVGVzdEZpeHR1cmVTZXRVcCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVUZXN0cy5DYW5SdW5NdWx0aXBsZVRlc3RGaXh0dXJlVGVhckRvd24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ2FuUnVuUHJvdGVjdGVkRml4dHVyZVNldFVwIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzLkNhblJ1blByb3RlY3RlZEZpeHR1cmVUZWFyRG93biIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVUZXN0cy5DYW5SdW5Qcm90ZWN0ZWRTZXRVcCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVUZXN0cy5DYW5SdW5Qcm90ZWN0ZWRUZWFyRG93biIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVUZXN0cy5DYW5SdW5TdGF0aWNGaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzLkNhblJ1blN0YXRpY0ZpeHR1cmVTZXRVcCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVUZXN0cy5DYW5SdW5TdGF0aWNGaXh0dXJlVGVhckRvd24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ2FuUnVuU3RhdGljU2V0VXAiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ2FuUnVuU3RhdGljVGVhckRvd24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ29uc3RydWN0RnJvbURvdWJseU5lc3RlZFR5cGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ29uc3RydWN0RnJvbU5lc3RlZFR5cGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ29uc3RydWN0RnJvbVN0YXRpY1R5cGVXaXRob3V0VGVzdEZpeHR1cmVBdHRyaWJ1dGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ29uc3RydWN0RnJvbVR5cGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMuQ29uc3RydWN0RnJvbVR5cGVXaXRob3V0TmFtZXNwYWNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzLkNvbnN0cnVjdEZyb21UeXBlV2l0aG91dFRlc3RGaXh0dXJlQXR0cmlidXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzLkZpeHR1cmVJbmhlcml0aW5nVHdvVGVzdEZpeHR1cmVBdHRyaWJ1dGVzSXNMb2FkZWRPbmx5T25jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0Rml4dHVyZVRlc3RzK0ludGVybmFsVGVzdEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Rml4dHVyZVRlc3RzK0ludGVybmFsVGVzdEZpeHR1cmUuQ2FuUnVuVGVzdEluSW50ZXJuYWxUZXN0Rml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0Rml4dHVyZVRlc3RzK1ByaXZhdGVUZXN0Rml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RGaXh0dXJlVGVzdHMrUHJpdmF0ZVRlc3RGaXh0dXJlLkNhblJ1blRlc3RJblByaXZhdGVUZXN0Rml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0Rml4dHVyZVRlc3RzK1Byb3RlY3RlZFRlc3RGaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdEZpeHR1cmVUZXN0cytQcm90ZWN0ZWRUZXN0Rml4dHVyZS5DYW5SdW5UZXN0SW5Qcm90ZWN0ZWRUZXN0Rml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0RnJhbWV3b3JrVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0RnJhbWV3b3JrVGVzdHMuTlVuaXRGcmFtZXdvcmtJc0tub3duQW5kUmVmZXJlbmNlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0SURUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RJRFRlc3RzLkNsb25lZFRlc3RJRHNBcmVFcXVhbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdElEVGVzdHMuRGlmZmVyZW50VGVzdElEc0FyZU5vdEVxdWFsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0SURUZXN0cy5EaWZmZXJlbnRUZXN0SURzRGlzcGxheURpZmZlcmVudFN0cmluZ3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdEluZm9UZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RJbmZvVGVzdHMuQ29uc3RydWN0RnJvbUZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSI4IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RJbmZvVGVzdHMuQ29uc3RydWN0RnJvbVN1aXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iNyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0SW5mb1Rlc3RzLkNvbnN0cnVjdEZyb21UZXN0Q2FzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0TWV0aG9kU2lnbmF0dXJlVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMjcyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0TWV0aG9kU2lnbmF0dXJlVGVzdHMuSW5zdGFuY2VUZXN0TWV0aG9kSXNSdW5uYWJsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdE1ldGhvZFNpZ25hdHVyZVRlc3RzLlByaXZhdGVUZXN0TWV0aG9kSXNOb3RSdW5uYWJsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdE1ldGhvZFNpZ25hdHVyZVRlc3RzLlByb3RlY3RlZFRlc3RNZXRob2RJc05vdFJ1bm5hYmxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0TWV0aG9kU2lnbmF0dXJlVGVzdHMuUnVubmluZ1Rlc3RzVGhyb3VnaEZpeHR1cmVHaXZlc0NvcnJlY3RSZXN1bHRzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxNCIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0TWV0aG9kU2lnbmF0dXJlVGVzdHMuU3RhdGljVGVzdE1ldGhvZElzUnVubmFibGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RNZXRob2RTaWduYXR1cmVUZXN0cy5TdGF0aWNUZXN0TWV0aG9kV2l0aEFyZ3VtZW50c05vdFByb3ZpZGVkSXNOb3RSdW5uYWJsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdE1ldGhvZFNpZ25hdHVyZVRlc3RzLlN0YXRpY1Rlc3RNZXRob2RXaXRoQXJndW1lbnRzUHJvdmlkZWRJc1J1bm5hYmxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0TWV0aG9kU2lnbmF0dXJlVGVzdHMuU3RhdGljVGVzdE1ldGhvZFdpdGhXcm9uZ0FyZ3VtZW50VHlwZXNQcm92aWRlZEdpdmVzRXJyb3IiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDExIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RNZXRob2RTaWduYXR1cmVUZXN0cy5TdGF0aWNUZXN0TWV0aG9kV2l0aFdyb25nTnVtYmVyT2ZBcmd1bWVudHNQcm92aWRlZElzTm90UnVubmFibGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDExIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RNZXRob2RTaWduYXR1cmVUZXN0cy5UZXN0TWV0aG9kV2l0aEFyZ3VtZW50c05vdFByb3ZpZGVkSXNOb3RSdW5uYWJsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdE1ldGhvZFNpZ25hdHVyZVRlc3RzLlRlc3RNZXRob2RXaXRoQXJndW1lbnRzUHJvdmlkZWRJc1J1bm5hYmxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0TWV0aG9kU2lnbmF0dXJlVGVzdHMuVGVzdE1ldGhvZFdpdGhDb252ZXJ0aWJsZUFyZ3VtZW50c0lzUnVubmFibGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RNZXRob2RTaWduYXR1cmVUZXN0cy5UZXN0TWV0aG9kV2l0aE11bHRpcGxlVGVzdENhc2VzRXhlY3V0ZXNNdWx0aXBsZVRpbWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0TWV0aG9kU2lnbmF0dXJlVGVzdHMuVGVzdE1ldGhvZFdpdGhNdWx0aXBsZVRlc3RDYXNlc1VzZXNDb3JyZWN0TmFtZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEzIiBhc3NlcnRzPSI3IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RNZXRob2RTaWduYXR1cmVUZXN0cy5UZXN0TWV0aG9kV2l0aE5vbkNvbnZlcnRpYmxlQXJndW1lbnRzR2l2ZXNFcnJvciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdE1ldGhvZFNpZ25hdHVyZVRlc3RzLlRlc3RNZXRob2RXaXRob3V0UGFyYW1ldGVyc1dpdGhBcmd1bWVudHNQcm92aWRlZElzTm90UnVubmFibGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RNZXRob2RTaWduYXR1cmVUZXN0cy5UZXN0TWV0aG9kV2l0aFBhcmFtc0FyZ3VtZW50SXNSdW5uYWJsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdE1ldGhvZFNpZ25hdHVyZVRlc3RzLlRlc3RNZXRob2RXaXRoUmV0dXJuVHlwZUlzTm90UnVubmFibGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RNZXRob2RTaWduYXR1cmVUZXN0cy5UZXN0TWV0aG9kV2l0aFdyb25nQXJndW1lbnRUeXBlc1Byb3ZpZGVkR2l2ZXNFcnJvciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdE1ldGhvZFNpZ25hdHVyZVRlc3RzLlRlc3RNZXRob2RXaXRoV3JvbmdOdW1iZXJPZkFyZ3VtZW50c1Byb3ZpZGVkSXNOb3RSdW5uYWJsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0TmFtZVRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzMCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdE5hbWVUZXN0cy5DYW5Db21wYXJlU3Ryb25nVGVzdE5hbWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iOSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0TmFtZVRlc3RzLkNhbkNvbXBhcmVXZWFrQW5kU3Ryb25nVGVzdE5hbWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0TmFtZVRlc3RzLkNhbkNvbXBhcmVXZWFrVGVzdE5hbWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0TmFtZVRlc3RzLkNhbkRpc3BsYXlVbmlxdWVOYW1lcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdE5hbWVUZXN0cy5DYW5QYXJzZVNpbXBsZVRlc3ROYW1lcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdE5hbWVUZXN0cy5DYW5QYXJzZVN0cm9uZ1Rlc3ROYW1lcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdE5hbWVUZXN0cy5DYW5QYXJzZVdlYWtUZXN0TmFtZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3ROYW1lVGVzdHMuQ2xvbmVkVGVzdE5hbWVzQXJlRXF1YWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI2IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3ROYW1lVGVzdHMuVGVzdE5hbWVzV2l0aERpZmZlcmVudFJ1bm5lcklEc0FyZU5vdEVxdWFsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3ROb2RlVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDI5IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Tm9kZVRlc3RzLkNvbnN0cnVjdEZyb21NdWx0aXBsZVRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOSIgYXNzZXJ0cz0iOCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0Tm9kZVRlc3RzLkNvbnN0cnVjdEZyb21TdWl0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDciIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdE5vZGVUZXN0cy5Db25zdHJ1Y3RGcm9tVGVzdENhc2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdFJ1bm5lclRocmVhZFRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdFJ1bm5lclRocmVhZFRlc3RzLlJ1bk11bHRpcGxlVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RSdW5uZXJUaHJlYWRUZXN0cy5SdW5OYW1lZFRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RSdW5uZXJUaHJlYWRUZXN0cy5SdW5UZXN0U3VpdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdFN1aXRlVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4yNzEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RTdWl0ZVRlc3QuQ2FuU29ydFVzaW5nRXh0ZXJuYWxDb21wYXJlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDkiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGVzdFN1aXRlVGVzdC5Db3VudFRlc3RDYXNlc0ZpbHRlcmVkQnlOYW1lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0U3VpdGVUZXN0LkRlZmF1bHRTb3J0SXNCeU5hbWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RTdWl0ZVRlc3QuRXhjbHVkaW5nQ2F0ZWdvcnlEb2VzTm90UnVuRXhwbGljaXRUZXN0Q2FzZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDExIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RTdWl0ZVRlc3QuRXhjbHVkaW5nQ2F0ZWdvcnlEb2VzTm90UnVuRXhwbGljaXRUZXN0Rml4dHVyZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDUzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RTdWl0ZVRlc3QuSW5oZXJpdGVkVGVzdENvdW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0U3VpdGVUZXN0LlJ1bkV4cGxpY2l0VGVzdEJ5Q2F0ZWdvcnkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RTdWl0ZVRlc3QuUnVuRXhwbGljaXRUZXN0QnlOYW1lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0U3VpdGVUZXN0LlJ1bkV4cGxpY2l0VGVzdERpcmVjdGx5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0U3VpdGVUZXN0LlJ1bk5vVGVzdFN1aXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0U3VpdGVUZXN0LlJ1blNpbmdsZVRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE0IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RTdWl0ZVRlc3QuUnVuU3VpdGVCeUNhdGVnb3J5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0U3VpdGVUZXN0LlJ1blN1aXRlQnlOYW1lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0U3VpdGVUZXN0LlJ1blRlc3RCeUNhdGVnb3J5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0U3VpdGVUZXN0LlJ1blRlc3RCeU5hbWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA5IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RTdWl0ZVRlc3QuUnVuVGVzdEV4Y2x1ZGluZ0NhdGVnb3J5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0U3VpdGVUZXN0LlJ1blRlc3RzSW5GaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOSIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UZXN0U3VpdGVUZXN0LlN1aXRlUnVuSW5pdGlhbGl6ZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRlc3RTdWl0ZVRlc3QuU3VpdGVXaXRoTm9UZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDgiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUaGVvcnlUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNzAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGhlb3J5IiBuYW1lPSJBcnJheVdpdGhEYXRhcG9pbnRzQXR0cmlidXRlSXNVc2VkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaGVvcnlUZXN0cy5BcnJheVdpdGhEYXRhcG9pbnRzQXR0cmlidXRlSXNVc2VkKCZxdW90O3h5ejEmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhlb3J5VGVzdHMuQXJyYXlXaXRoRGF0YXBvaW50c0F0dHJpYnV0ZUlzVXNlZCgmcXVvdDt4eXoyJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRoZW9yeVRlc3RzLkFycmF5V2l0aERhdGFwb2ludHNBdHRyaWJ1dGVJc1VzZWQoJnF1b3Q7eHl6MyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhlb3J5VGVzdHMuQm9vbGVhbkFyZ3VtZW50c0FyZVN1cHBsaWVkQXV0b21hdGljYWxseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhlb3J5VGVzdHMuRW51bUFyZ3VtZW50c0FyZVN1cHBsaWVkQXV0b21hdGljYWxseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUaGVvcnkiIG5hbWU9Ik51bGxEYXRhcG9pbnRJc09LIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaGVvcnlUZXN0cy5OdWxsRGF0YXBvaW50SXNPSyhudWxsKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaGVvcnlUZXN0cy5TaW1wbGVUZXN0SWdub3Jlc0RhdGFQb2ludHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGhlb3J5IiBuYW1lPSJTcXVhcmVSb290V2l0aEFsbEdvb2RWYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRoZW9yeVRlc3RzLlNxdWFyZVJvb3RXaXRoQWxsR29vZFZhbHVlcygxMi4wZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaGVvcnlUZXN0cy5TcXVhcmVSb290V2l0aEFsbEdvb2RWYWx1ZXMoNC4wZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaGVvcnlUZXN0cy5TcXVhcmVSb290V2l0aEFsbEdvb2RWYWx1ZXMoOS4wZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUaGVvcnkiIG5hbWU9IlNxdWFyZVJvb3RXaXRoT25lQmFkVmFsdWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRoZW9yeVRlc3RzLlNxdWFyZVJvb3RXaXRoT25lQmFkVmFsdWUoMTIuMGQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhlb3J5VGVzdHMuU3F1YXJlUm9vdFdpdGhPbmVCYWRWYWx1ZSgtNC4wZCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IkluY29uY2x1c2l2ZSIgc3VjY2Vzcz0iRmFsc2UiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWFzb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXNzYWdlPjwhW0NEQVRBWyAgRXhwZWN0ZWQ6IFRydWUNCisgIEJ1dCB3YXM6ICBGYWxzZQ0KK11dPjwvbWVzc2FnZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVhc29uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaGVvcnlUZXN0cy5TcXVhcmVSb290V2l0aE9uZUJhZFZhbHVlKDkuMGQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRoZW9yeVRlc3RzLlRoZW9yeUZhaWxzSWZBbGxUZXN0c0FyZUluY29uY2x1c2l2ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhlb3J5VGVzdHMuVGhlb3J5V2l0aERhdGFwb2ludHNJc1J1bm5hYmxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaGVvcnlUZXN0cy5UaGVvcnlXaXRoTm9Bcmd1bWVudHNJc1RyZWF0ZWRBc1Rlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRoZW9yeVRlc3RzLlRoZW9yeVdpdGhOb0RhdGFwb2ludHNJc05vdFJ1bm5hYmxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRoZW9yeVRlc3RzK1NxcnRUZXN0c19EaXNwbGF5UmVzdWx0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGhlb3J5IiBuYW1lPSJTcXJ0VGltZXNJdHNlbGZHaXZlc09yaWdpbmFsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaGVvcnlUZXN0cytTcXJ0VGVzdHNfRGlzcGxheVJlc3VsdHMuU3FydFRpbWVzSXRzZWxmR2l2ZXNPcmlnaW5hbCgwLjBkKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRoZW9yeVRlc3RzK1NxcnRUZXN0c19EaXNwbGF5UmVzdWx0cy5TcXJ0VGltZXNJdHNlbGZHaXZlc09yaWdpbmFsKDEuMGQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhlb3J5VGVzdHMrU3FydFRlc3RzX0Rpc3BsYXlSZXN1bHRzLlNxcnRUaW1lc0l0c2VsZkdpdmVzT3JpZ2luYWwoLTEuMGQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJJbmNvbmNsdXNpdmUiIHN1Y2Nlc3M9IkZhbHNlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVhc29uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVzc2FnZT48IVtDREFUQVsgIEV4cGVjdGVkOiBUcnVlDQorICBCdXQgd2FzOiAgRmFsc2UNCitdXT48L21lc3NhZ2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlYXNvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhlb3J5VGVzdHMrU3FydFRlc3RzX0Rpc3BsYXlSZXN1bHRzLlNxcnRUaW1lc0l0c2VsZkdpdmVzT3JpZ2luYWwoZG91YmxlLk1heFZhbHVlKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iSW5jb25jbHVzaXZlIiBzdWNjZXNzPSJGYWxzZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlYXNvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lc3NhZ2U+PCFbQ0RBVEFbICBFeHBlY3RlZDogVHJ1ZQ0KKyAgQnV0IHdhczogIEZhbHNlDQorXV0+PC9tZXNzYWdlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWFzb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LWNhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRoZW9yeVRlc3RzK1NxcnRUZXN0c19EaXNwbGF5UmVzdWx0cy5TcXJ0VGltZXNJdHNlbGZHaXZlc09yaWdpbmFsKGRvdWJsZS5Qb3NpdGl2ZUluZmluaXR5KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iSW5jb25jbHVzaXZlIiBzdWNjZXNzPSJGYWxzZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlYXNvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lc3NhZ2U+PCFbQ0RBVEFbICBFeHBlY3RlZDogVHJ1ZQ0KKyAgQnV0IHdhczogIEZhbHNlDQorXV0+PC9tZXNzYWdlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWFzb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LWNhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRocmVhZGVkVGVzdFJ1bm5lclRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjU4OCIgYXNzZXJ0cz0iMSI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhyZWFkZWRUZXN0UnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5DaGVja1J1bm5lcklEIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRlZFRlc3RSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkNvdW50VGVzdENhc2VzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA0MSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRlZFRlc3RSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkNvdW50VGVzdENhc2VzQWNyb3NzTXVsdGlwbGVBc3NlbWJsaWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1MSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRlZFRlc3RSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRBbmRSZWxvYWRBc3NlbWJseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wODEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhyZWFkZWRUZXN0UnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5Mb2FkQXNzZW1ibHlXaXRoRml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTYiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhyZWFkZWRUZXN0UnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5Mb2FkQXNzZW1ibHlXaXRob3V0TmFtZXNwYWNlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzkiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhyZWFkZWRUZXN0UnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5Mb2FkQXNzZW1ibHlXaXRoU3VpdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDExIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRocmVhZGVkVGVzdFJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuTG9hZE11bHRpcGxlQXNzZW1ibGllcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhyZWFkZWRUZXN0UnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5Mb2FkTXVsdGlwbGVBc3NlbWJsaWVzV2l0aEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDI2IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRocmVhZGVkVGVzdFJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuTG9hZE11bHRpcGxlQXNzZW1ibGllc1dpdGhTdWl0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhyZWFkZWRUZXN0UnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5SdW5Bc3NlbWJseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDUiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhyZWFkZWRUZXN0UnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5SdW5Bc3NlbWJseVVzaW5nQmVnaW5BbmRFbmRSdW4iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDQ1IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRocmVhZGVkVGVzdFJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuUnVuTXVsdGlwbGVBc3NlbWJsaWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1OCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRlZFRlc3RSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLlJ1bk11bHRpcGxlQXNzZW1ibGllc1VzaW5nQmVnaW5BbmRFbmRSdW4iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDU4IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGhyZWFkaW5nVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTcxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRpbmdUZXN0cy5UZXN0T25TZXBhcmF0ZVRocmVhZFJlcG9ydHNBc3NlcnRDb3VudENvcnJlY3RseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhyZWFkaW5nVGVzdHMuVGVzdFdpdGhJbmZpbml0ZUxvb3BUaW1lc091dCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNjEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhyZWFkaW5nVGVzdHMuVGVzdFdpdGhNVEFUaHJlYWRSdW5zSW5NVEEiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IkFQQVJUTUVOVF9TVEFURSIgdmFsdWU9Ik1UQSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LWNhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVGhyZWFkaW5nVGVzdHMuVGVzdFdpdGhSZXF1aXJlc01UQVJ1bnNJbk1UQSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iQVBBUlRNRU5UX1NUQVRFIiB2YWx1ZT0iTVRBIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRpbmdUZXN0cy5UZXN0V2l0aFJlcXVpcmVzU1RBUnVuc0luU1RBIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJBUEFSVE1FTlRfU1RBVEUiIHZhbHVlPSJTVEEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRocmVhZGluZ1Rlc3RzLlRlc3RXaXRoUmVxdWlyZXNUaHJlYWRSdW5zSW5TZXBhcmF0ZVRocmVhZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUmVxdWlyZXNUaHJlYWQiIHZhbHVlPSJUcnVlIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRpbmdUZXN0cy5UZXN0V2l0aFJlcXVpcmVzVGhyZWFkUnVuc1NldFVwQW5kVGVzdE9uU2FtZVRocmVhZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUmVxdWlyZXNUaHJlYWQiIHZhbHVlPSJUcnVlIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRpbmdUZXN0cy5UZXN0V2l0aFJlcXVpcmVzVGhyZWFkV2l0aE1UQUFyZ1J1bnNPblNlcGFyYXRlVGhyZWFkSW5NVEEiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlJlcXVpcmVzVGhyZWFkIiB2YWx1ZT0iVHJ1ZSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iQVBBUlRNRU5UX1NUQVRFIiB2YWx1ZT0iTVRBIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRpbmdUZXN0cy5UZXN0V2l0aFJlcXVpcmVzVGhyZWFkV2l0aFNUQUFyZ1J1bnNPblNlcGFyYXRlVGhyZWFkSW5TVEEiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IlJlcXVpcmVzVGhyZWFkIiB2YWx1ZT0iVHJ1ZSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iQVBBUlRNRU5UX1NUQVRFIiB2YWx1ZT0iU1RBIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRpbmdUZXN0cy5UZXN0V2l0aFNUQVRocmVhZFJ1bnNJblNUQSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iQVBBUlRNRU5UX1NUQVRFIiB2YWx1ZT0iU1RBIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRpbmdUZXN0cy5UZXN0V2l0aFRpbWVvdXRSdW5zT25TZXBhcmF0ZVRocmVhZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iVGltZW91dCIgdmFsdWU9IjUwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRpbmdUZXN0cy5UZXN0V2l0aFRpbWVvdXRSdW5zU2V0VXBBbmRUZXN0T25TYW1lVGhyZWFkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJUaW1lb3V0IiB2YWx1ZT0iNTAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlRocmVhZGluZ1Rlc3RzLlRpbWVvdXRDYW5CZVNldE9uVGVzdEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDY1IiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGhyZWFkaW5nVGVzdHMrRml4dHVyZVJlcXVpcmVzTVRBIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iQVBBUlRNRU5UX1NUQVRFIiB2YWx1ZT0iTVRBIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRpbmdUZXN0cytGaXh0dXJlUmVxdWlyZXNNVEEuUmVxdWlyZXNNVEFDYW5CZVNldE9uVGVzdEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGhyZWFkaW5nVGVzdHMrRml4dHVyZVJlcXVpcmVzU1RBIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iQVBBUlRNRU5UX1NUQVRFIiB2YWx1ZT0iU1RBIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRpbmdUZXN0cytGaXh0dXJlUmVxdWlyZXNTVEEuUmVxdWlyZXNTVEFDYW5CZVNldE9uVGVzdEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGhyZWFkaW5nVGVzdHMrRml4dHVyZVJlcXVpcmVzVGhyZWFkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iUmVxdWlyZXNUaHJlYWQiIHZhbHVlPSJUcnVlIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UaHJlYWRpbmdUZXN0cytGaXh0dXJlUmVxdWlyZXNUaHJlYWQuUmVxdWlyZXNUaHJlYWRDYW5CZVNldE9uVGVzdEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVHlwZUhlbHBlclRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1MyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iR2V0RGlzcGxheU5hbWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDUzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlR5cGVIZWxwZXJUZXN0cy5HZXREaXNwbGF5TmFtZShOVW5pdC5UZXN0RGF0YS5UeXBlSGVscGVyRml4dHVyZS5HZW5lcmljQ29udGFpbmVyQ2xhc3NgMStOZXN0ZWRDbGFzc1tTeXN0ZW0uU3RyaW5nXSwmcXVvdDtHZW5lcmljQ29udGFpbmVyQ2xhc3MrTmVzdGVkQ2xhc3MmbHQ7U3RyaW5nJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UeXBlSGVscGVyVGVzdHMuR2V0RGlzcGxheU5hbWUoTlVuaXQuVGVzdERhdGEuVHlwZUhlbHBlckZpeHR1cmUuR2VuZXJpY0NvbnRhaW5lckNsYXNzYDErTmVzdGVkQ2xhc3MrRG91Ymx5TmVzdGVkQ2xhc3NbU3lzdGVtLlN0cmluZ10sJnF1b3Q7R2VuZXJpY0NvbnRhaW5lckNsYXNzK05lc3RlZENsYXNzK0RvdWJseU5lc3RlZENsYXNzJmx0O1N0cmluZyZndDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVHlwZUhlbHBlclRlc3RzLkdldERpc3BsYXlOYW1lKE5Vbml0LlRlc3REYXRhLlR5cGVIZWxwZXJGaXh0dXJlLkNvbnRhaW5lckNsYXNzK05lc3RlZEdlbmVyaWNgMStEb3VibHlOZXN0ZWRHZW5lcmljYDFbU3lzdGVtLlN0cmluZyxTeXN0ZW0uSW50MzJdLCZxdW90O0NvbnRhaW5lckNsYXNzK05lc3RlZEdlbmVyaWMrRG91Ymx5TmVzdGVkR2VuZXJpYyZsdDtTdHJpbmcsSW50MzImZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlR5cGVIZWxwZXJUZXN0cy5HZXREaXNwbGF5TmFtZShOVW5pdC5UZXN0RGF0YS5UeXBlSGVscGVyRml4dHVyZS5HZW5lcmljQ29udGFpbmVyQ2xhc3NgMStOZXN0ZWRHZW5lcmljYDErRG91Ymx5TmVzdGVkR2VuZXJpY2AxW1N5c3RlbS5TdHJpbmcsU3lzdGVtLkludDMyLFN5c3RlbS5Cb29sZWFuXSwmcXVvdDtHZW5lcmljQ29udGFpbmVyQ2xhc3MrTmVzdGVkR2VuZXJpYytEb3VibHlOZXN0ZWRHZW5lcmljJmx0O1N0cmluZyxJbnQzMixCb29sZWFuJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UeXBlSGVscGVyVGVzdHMuR2V0RGlzcGxheU5hbWUoTlVuaXQuVGVzdERhdGEuVHlwZUhlbHBlckZpeHR1cmUuTGlzdFRlc3RlcmAxW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtTeXN0ZW0uSW50MzJdXSwmcXVvdDtMaXN0VGVzdGVyJmx0O0xpc3QmbHQ7SW50MzImZ3Q7Jmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UeXBlSGVscGVyVGVzdHMuR2V0RGlzcGxheU5hbWUoTlVuaXQuVGVzdERhdGEuVHlwZUhlbHBlckZpeHR1cmUuTGlzdFRlc3RlcmAxW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbU3lzdGVtLkludDMyXV1dLCZxdW90O0xpc3RUZXN0ZXImbHQ7TGlzdCZsdDtMaXN0Jmx0O0ludDMyJmd0OyZndDsmZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlR5cGVIZWxwZXJUZXN0cy5HZXREaXNwbGF5TmFtZShOVW5pdC5UZXN0RGF0YS5UeXBlSGVscGVyRml4dHVyZS5HZW5lcmljQ29udGFpbmVyQ2xhc3NgMStOZXN0ZWRDbGFzcytEb3VibHlOZXN0ZWRHZW5lcmljYDFbU3lzdGVtLlN0cmluZyxTeXN0ZW0uQm9vbGVhbl0sJnF1b3Q7R2VuZXJpY0NvbnRhaW5lckNsYXNzK05lc3RlZENsYXNzK0RvdWJseU5lc3RlZEdlbmVyaWMmbHQ7U3RyaW5nLEJvb2xlYW4mZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlR5cGVIZWxwZXJUZXN0cy5HZXREaXNwbGF5TmFtZShOVW5pdC5UZXN0RGF0YS5UeXBlSGVscGVyRml4dHVyZS5HZW5lcmljQ29udGFpbmVyQ2xhc3NgMStOZXN0ZWRHZW5lcmljYDFbU3lzdGVtLlN0cmluZyxTeXN0ZW0uSW50MzJdLCZxdW90O0dlbmVyaWNDb250YWluZXJDbGFzcytOZXN0ZWRHZW5lcmljJmx0O1N0cmluZyxJbnQzMiZndDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVHlwZUhlbHBlclRlc3RzLkdldERpc3BsYXlOYW1lKFN5c3RlbS5JbnQzMiwmcXVvdDtJbnQzMiZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UeXBlSGVscGVyVGVzdHMuR2V0RGlzcGxheU5hbWUoTlVuaXQuVGVzdERhdGEuVHlwZUhlbHBlckZpeHR1cmUuR2VuZXJpY0NvbnRhaW5lckNsYXNzYDErTmVzdGVkR2VuZXJpY2AxK0RvdWJseU5lc3RlZENsYXNzW1N5c3RlbS5TdHJpbmcsU3lzdGVtLkludDMyXSwmcXVvdDtHZW5lcmljQ29udGFpbmVyQ2xhc3MrTmVzdGVkR2VuZXJpYytEb3VibHlOZXN0ZWRDbGFzcyZsdDtTdHJpbmcsSW50MzImZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlR5cGVIZWxwZXJUZXN0cy5HZXREaXNwbGF5TmFtZShOVW5pdC5UZXN0RGF0YS5UeXBlSGVscGVyRml4dHVyZS5TaW1wbGVDbGFzcywmcXVvdDtTaW1wbGVDbGFzcyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UeXBlSGVscGVyVGVzdHMuR2V0RGlzcGxheU5hbWUoTXlOb05hbWVzcGFjZUNsYXNzLCZxdW90O015Tm9OYW1lc3BhY2VDbGFzcyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UeXBlSGVscGVyVGVzdHMuR2V0RGlzcGxheU5hbWUoTlVuaXQuVGVzdERhdGEuVHlwZUhlbHBlckZpeHR1cmUuR2VuZXJpY0NsYXNzYDNbU3lzdGVtLkludDMyLFN5c3RlbS5EZWNpbWFsLFN5c3RlbS5TdHJpbmddLCZxdW90O0dlbmVyaWNDbGFzcyZsdDtJbnQzMixEZWNpbWFsLFN0cmluZyZndDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVHlwZUhlbHBlclRlc3RzLkdldERpc3BsYXlOYW1lKE5Vbml0LlRlc3REYXRhLlR5cGVIZWxwZXJGaXh0dXJlLkdlbmVyaWNDbGFzc2AzW1N5c3RlbS5JbnQzMltdLFN5c3RlbS5EZWNpbWFsW10sU3lzdGVtLlN0cmluZ1tdXSwmcXVvdDtHZW5lcmljQ2xhc3MmbHQ7SW50MzJbXSxEZWNpbWFsW10sU3RyaW5nW10mZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlR5cGVIZWxwZXJUZXN0cy5HZXREaXNwbGF5TmFtZShOVW5pdC5UZXN0RGF0YS5UeXBlSGVscGVyRml4dHVyZS5Db250YWluZXJDbGFzcytOZXN0ZWRDbGFzcywmcXVvdDtDb250YWluZXJDbGFzcytOZXN0ZWRDbGFzcyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UeXBlSGVscGVyVGVzdHMuR2V0RGlzcGxheU5hbWUoTlVuaXQuVGVzdERhdGEuVHlwZUhlbHBlckZpeHR1cmUuQ29udGFpbmVyQ2xhc3MrTmVzdGVkQ2xhc3MrRG91Ymx5TmVzdGVkQ2xhc3MsJnF1b3Q7Q29udGFpbmVyQ2xhc3MrTmVzdGVkQ2xhc3MrRG91Ymx5TmVzdGVkQ2xhc3MmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVHlwZUhlbHBlclRlc3RzLkdldERpc3BsYXlOYW1lKE5Vbml0LlRlc3REYXRhLlR5cGVIZWxwZXJGaXh0dXJlLkNvbnRhaW5lckNsYXNzK05lc3RlZENsYXNzK0RvdWJseU5lc3RlZEdlbmVyaWNgMVtTeXN0ZW0uSW50MzJdLCZxdW90O0NvbnRhaW5lckNsYXNzK05lc3RlZENsYXNzK0RvdWJseU5lc3RlZEdlbmVyaWMmbHQ7SW50MzImZ3Q7JnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlR5cGVIZWxwZXJUZXN0cy5HZXREaXNwbGF5TmFtZShOVW5pdC5UZXN0RGF0YS5UeXBlSGVscGVyRml4dHVyZS5Db250YWluZXJDbGFzcytOZXN0ZWRHZW5lcmljYDFbU3lzdGVtLkludDMyXSwmcXVvdDtDb250YWluZXJDbGFzcytOZXN0ZWRHZW5lcmljJmx0O0ludDMyJmd0OyZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5UeXBlSGVscGVyVGVzdHMuR2V0RGlzcGxheU5hbWUoTlVuaXQuVGVzdERhdGEuVHlwZUhlbHBlckZpeHR1cmUuQ29udGFpbmVyQ2xhc3MrTmVzdGVkR2VuZXJpY2AxK0RvdWJseU5lc3RlZENsYXNzW1N5c3RlbS5JbnQzMl0sJnF1b3Q7Q29udGFpbmVyQ2xhc3MrTmVzdGVkR2VuZXJpYytEb3VibHlOZXN0ZWRDbGFzcyZsdDtJbnQzMiZndDsmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVmFsdWVTb3VyY2VUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9Ik11bHRpcGxlQXJndW1lbnRzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5WYWx1ZVNvdXJjZVRlc3RzLk11bHRpcGxlQXJndW1lbnRzKDEyLDMsNCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5WYWx1ZVNvdXJjZVRlc3RzLk11bHRpcGxlQXJndW1lbnRzKDEyLDQsMykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5WYWx1ZVNvdXJjZVRlc3RzLk11bHRpcGxlQXJndW1lbnRzKDEyLDYsMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iVmFsdWVTb3VyY2VDYW5CZUluc3RhbmNlRmllbGQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlZhbHVlU291cmNlVGVzdHMuVmFsdWVTb3VyY2VDYW5CZUluc3RhbmNlRmllbGQoJnF1b3Q7SW5zdGFuY2VGaWVsZCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iVmFsdWVTb3VyY2VDYW5CZUluc3RhbmNlTWV0aG9kIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5WYWx1ZVNvdXJjZVRlc3RzLlZhbHVlU291cmNlQ2FuQmVJbnN0YW5jZU1ldGhvZCgmcXVvdDtJbnN0YW5jZU1ldGhvZCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iVmFsdWVTb3VyY2VDYW5CZUluc3RhbmNlUHJvcGVydHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlZhbHVlU291cmNlVGVzdHMuVmFsdWVTb3VyY2VDYW5CZUluc3RhbmNlUHJvcGVydHkoJnF1b3Q7SW5zdGFuY2VQcm9wZXJ0eSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iVmFsdWVTb3VyY2VDYW5CZVN0YXRpY0ZpZWxkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5WYWx1ZVNvdXJjZVRlc3RzLlZhbHVlU291cmNlQ2FuQmVTdGF0aWNGaWVsZCgmcXVvdDtTdGF0aWNGaWVsZCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iVmFsdWVTb3VyY2VDYW5CZVN0YXRpY01ldGhvZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVmFsdWVTb3VyY2VUZXN0cy5WYWx1ZVNvdXJjZUNhbkJlU3RhdGljTWV0aG9kKCZxdW90O1N0YXRpY01ldGhvZCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iVmFsdWVTb3VyY2VDYW5CZVN0YXRpY1Byb3BlcnR5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5WYWx1ZVNvdXJjZVRlc3RzLlZhbHVlU291cmNlQ2FuQmVTdGF0aWNQcm9wZXJ0eSgmcXVvdDtTdGF0aWNQcm9wZXJ0eSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iVmFsdWVTb3VyY2VJc0ludm9rZWRXaXRoQ29ycmVjdEN1cnJlbnREaXJlY3RvcnkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlZhbHVlU291cmNlVGVzdHMuVmFsdWVTb3VyY2VJc0ludm9rZWRXaXRoQ29ycmVjdEN1cnJlbnREaXJlY3RvcnkoVHJ1ZSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iVmFsdWVTb3VyY2VNYXlCZUdlbmVyaWMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlZhbHVlU291cmNlVGVzdHMuVmFsdWVTb3VyY2VNYXlCZUdlbmVyaWMoMSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5WYWx1ZVNvdXJjZVRlc3RzLlZhbHVlU291cmNlTWF5QmVHZW5lcmljKDIpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVmFsdWVTb3VyY2VUZXN0cy5WYWx1ZVNvdXJjZU1heUJlR2VuZXJpYyg0KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlZhbHVlU291cmNlVGVzdHMuVmFsdWVTb3VyY2VNYXlCZUdlbmVyaWMoOCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJQYXJhbWV0ZXJpemVkVGVzdCIgbmFtZT0iVmFsdWVTb3VyY2VNYXlCZUluQW5vdGhlckNsYXNzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5WYWx1ZVNvdXJjZVRlc3RzLlZhbHVlU291cmNlTWF5QmVJbkFub3RoZXJDbGFzcygxMiwzLDQpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuVmFsdWVTb3VyY2VUZXN0cy5WYWx1ZVNvdXJjZU1heUJlSW5Bbm90aGVyQ2xhc3MoMTIsNCwzKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db3JlLlRlc3RzLlZhbHVlU291cmNlVGVzdHMuVmFsdWVTb3VyY2VNYXlCZUluQW5vdGhlckNsYXNzKDEyLDYsMikiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJYbWxUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjYzOCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvcmUuVGVzdHMuWG1sVGVzdC5yZW1vdmVUaW1lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5YbWxUZXN0LlRlc3RTY2hlbWFWYWxpZGF0b3JGcmVuY2hDdWx0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjQwNCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5YbWxUZXN0LlRlc3RTY2hlbWFWYWxpZGF0b3JJbnZhcmlhbnRDdWx0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1MiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5YbWxUZXN0LlRlc3RTY2hlbWFWYWxpZGF0b3JVbml0ZWRTdGF0ZXNDdWx0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA0OCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29yZS5UZXN0cy5YbWxUZXN0LlRlc3RTdHJlYW0iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTE2IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJBc3NlbWJseSIgbmFtZT0iRDpcRGV2XE5Vbml0XG51bml0LTIuNVx3b3JrXGJ1aWxkXG5ldFwyLjBccmVsZWFzZVx0ZXN0cy9udW5pdC51dGlsLnRlc3RzLmRsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iNDEuMDY2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJOYW1lc3BhY2UiIG5hbWU9Ik5Vbml0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSI0MS4wNjYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iTmFtZXNwYWNlIiBuYW1lPSJVdGlsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSI0MS4wNjYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJTZXRVcEZpeHR1cmUiIG5hbWU9IlRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSI0MS4wNjUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJBc3NlbWJseUxpc3RUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkFzc2VtYmx5TGlzdFRlc3RzLkFkZEZpcmVzQ2hhbmdlZEV2ZW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Bc3NlbWJseUxpc3RUZXN0cy5DYW5BZGRBc3NlbWJsaWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Bc3NlbWJseUxpc3RUZXN0cy5DYW5SZW1vdmVBc3NlbWJsaWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Bc3NlbWJseUxpc3RUZXN0cy5FbXB0eUxpc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkFzc2VtYmx5TGlzdFRlc3RzLk11c3RBZGRBYnNvbHV0ZVBhdGgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkFzc2VtYmx5TGlzdFRlc3RzLlJlbW92ZUF0RmlyZXNDaGFuZ2VkRXZlbnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkFzc2VtYmx5TGlzdFRlc3RzLlJlbW92ZUZpcmVzQ2hhbmdlZEV2ZW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Bc3NlbWJseUxpc3RUZXN0cy5TZXR0aW5nRnVsbFBhdGhGaXJlc0NoYW5nZWRFdmVudCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJDYXRlZ29yeU1hbmFnZXJUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA5NyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuQ2F0ZWdvcnlNYW5hZ2VyVGVzdC5DYW5BZGRBbGxBdmFpbGFibGVDYXRlZ29yaWVzSW5UZXN0VHJlZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuQ2F0ZWdvcnlNYW5hZ2VyVGVzdC5DYW5BZGRTdHJpbmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5DYXRlZ29yeU1hbmFnZXJUZXN0LkNhbkFkZFN0cmluZ3NXaXRob3V0RHVwbGljYXRpbmciIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkNhdGVnb3J5TWFuYWdlclRlc3QuQ2FuQWRkVGVzdENhdGVnb3JpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDQwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkNhdGVnb3J5TWFuYWdlclRlc3QuQ2FuQ2xlYXJFbnRyaWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkNhdGVnb3J5UGFyc2VUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkNhdGVnb3J5UGFyc2VUZXN0cy5DYW5QYXJzZUNvbXBvdW5kQ2F0ZWdvcnkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkNhdGVnb3J5UGFyc2VUZXN0cy5DYW5QYXJzZUV4Y2x1ZGVkQ2F0ZWdvcmllcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuQ2F0ZWdvcnlQYXJzZVRlc3RzLkNhblBhcnNlTXVsdGlwbGVBbHRlcm5hdGl2ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkNhdGVnb3J5UGFyc2VUZXN0cy5DYW5QYXJzZU11bHRpcGxlQ2F0ZWdvcmllc1dpdGhBbmQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkNhdGVnb3J5UGFyc2VUZXN0cy5DYW5QYXJzZVNpbXBsZUNhdGVnb3J5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5DYXRlZ29yeVBhcnNlVGVzdHMuRW1wdHlTdHJpbmdSZXR1cm5zRW1wdHlGaWx0ZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkNhdGVnb3J5UGFyc2VUZXN0cy5PckFuZE1pbnVzQ29tYmluZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkNhdGVnb3J5UGFyc2VUZXN0cy5QbHVzQW5kTWludXNDb21iaW5lZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjYiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuQ2F0ZWdvcnlQYXJzZVRlc3RzLlByZWNlZGVuY2VUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5DYXRlZ29yeVBhcnNlVGVzdHMuUHJlY2VkZW5jZVRlc3RXaXRoUGFyZW50aGVzZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRG9tYWluTWFuYWdlclRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuRG9tYWluTWFuYWdlclRlc3RzLkdldENvbW1vbkFwcEJhc2VfT25lRWxlbWVudCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuRG9tYWluTWFuYWdlclRlc3RzLkdldENvbW1vbkFwcEJhc2VfVGhyZWVFbGVtZW50c19EaWZlcmVudERpcmVjdG9yaWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Eb21haW5NYW5hZ2VyVGVzdHMuR2V0Q29tbW9uQXBwQmFzZV9Ud29FbGVtZW50c19EaWZmZXJlbnREaXJlY3RvcmllcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuRG9tYWluTWFuYWdlclRlc3RzLkdldENvbW1vbkFwcEJhc2VfVHdvRWxlbWVudHNfU2FtZURpcmVjdG9yeSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuRG9tYWluTWFuYWdlclRlc3RzLkdldFByaXZhdGVCaW5QYXRoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Eb21haW5NYW5hZ2VyVGVzdHMuVW5sb2FkVW5sb2FkZWREb21haW4iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRXZlbnREaXNwYXRjaGVyVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDc2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5FdmVudERpc3BhdGNoZXJUZXN0cy5Qcm9qZWN0TG9hZGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5FdmVudERpc3BhdGNoZXJUZXN0cy5Qcm9qZWN0TG9hZEZhaWxlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuRXZlbnREaXNwYXRjaGVyVGVzdHMuUHJvamVjdExvYWRpbmciIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkV2ZW50RGlzcGF0Y2hlclRlc3RzLlByb2plY3RVbmxvYWRlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuRXZlbnREaXNwYXRjaGVyVGVzdHMuUHJvamVjdFVubG9hZEZhaWxlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuRXZlbnREaXNwYXRjaGVyVGVzdHMuUHJvamVjdFVubG9hZGluZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuRXZlbnREaXNwYXRjaGVyVGVzdHMuUnVuRmFpbGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5FdmVudERpc3BhdGNoZXJUZXN0cy5SdW5GaW5pc2hlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuRXZlbnREaXNwYXRjaGVyVGVzdHMuUnVuU3RhcnRpbmciIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkV2ZW50RGlzcGF0Y2hlclRlc3RzLlN1aXRlRmluaXNoZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkV2ZW50RGlzcGF0Y2hlclRlc3RzLlN1aXRlU3RhcnRpbmciIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkV2ZW50RGlzcGF0Y2hlclRlc3RzLlRlc3RGaW5pc2hlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuRXZlbnREaXNwYXRjaGVyVGVzdHMuVGVzdExvYWRlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuRXZlbnREaXNwYXRjaGVyVGVzdHMuVGVzdExvYWRGYWlsZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkV2ZW50RGlzcGF0Y2hlclRlc3RzLlRlc3RMb2FkaW5nIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5FdmVudERpc3BhdGNoZXJUZXN0cy5UZXN0UmVsb2FkZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkV2ZW50RGlzcGF0Y2hlclRlc3RzLlRlc3RSZWxvYWRGYWlsZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkV2ZW50RGlzcGF0Y2hlclRlc3RzLlRlc3RSZWxvYWRpbmciIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkV2ZW50RGlzcGF0Y2hlclRlc3RzLlRlc3RTdGFydGluZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuRXZlbnREaXNwYXRjaGVyVGVzdHMuVGVzdFVubG9hZGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5FdmVudERpc3BhdGNoZXJUZXN0cy5UZXN0VW5sb2FkRmFpbGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5FdmVudERpc3BhdGNoZXJUZXN0cy5UZXN0VW5sb2FkaW5nIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkZpbGVXYXRjaGVyVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC45MDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkZpbGVXYXRjaGVyVGVzdC5DaGFuZ2luZ0F0dHJpYnV0ZXNEb2VzTm90VHJpZ2dlcldhdGNoZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMjE3IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkZpbGVXYXRjaGVyVGVzdC5DaGFuZ2luZ0ZpbGVUcmlnZ2Vyc1dhdGNoZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMjA0IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLkZpbGVXYXRjaGVyVGVzdC5Db3B5aW5nRmlsZURvZXNOb3RUcmlnZ2VyV2F0Y2hlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4yMDUiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuRmlsZVdhdGNoZXJUZXN0Lk11bHRpcGxlQ2xvc2VseVNwYWNlZENoYW5nZXNUcmlnZ2VyV2F0Y2hlck9ubHlPbmNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjI2MyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9Ik1lbW9yeVNldHRpbmdzU3RvcmFnZVRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyNSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTWVtb3J5U2V0dGluZ3NTdG9yYWdlVGVzdHMuTWFrZVN0b3JhZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLk1lbW9yeVNldHRpbmdzU3RvcmFnZVRlc3RzLk1ha2VTdWJTdG9yYWdlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTWVtb3J5U2V0dGluZ3NTdG9yYWdlVGVzdHMuUmVtb3ZlU2V0dGluZ3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLk1lbW9yeVNldHRpbmdzU3RvcmFnZVRlc3RzLlNhdmVBbmRMb2FkU2V0dGluZ3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLk1lbW9yeVNldHRpbmdzU3RvcmFnZVRlc3RzLlN1YnN0b3JhZ2VTZXR0aW5ncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTWVtb3J5U2V0dGluZ3NTdG9yYWdlVGVzdHMuVHlwZVNhZmVTZXR0aW5ncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJOVW5pdFByb2plY3RMb2FkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA0NSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0TG9hZC5Gcm9tQXNzZW1ibHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLk5Vbml0UHJvamVjdExvYWQuTG9hZEVtcHR5Q29uZmlncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0TG9hZC5Mb2FkRW1wdHlQcm9qZWN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFByb2plY3RMb2FkLkxvYWROb3JtYWxQcm9qZWN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iNyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFByb2plY3RMb2FkLkxvYWRQcm9qZWN0V2l0aE1hbnVhbEJpblBhdGgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLk5Vbml0UHJvamVjdExvYWQuU2F2ZUNsZWFyc0Fzc2VtYmx5V3JhcHBlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJOVW5pdFByb2plY3RTYXZlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0U2F2ZS5TYXZlRW1wdHlDb25maWdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFByb2plY3RTYXZlLlNhdmVFbXB0eVByb2plY3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLk5Vbml0UHJvamVjdFNhdmUuU2F2ZU5vcm1hbFByb2plY3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTlVuaXRQcm9qZWN0VGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTEzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFByb2plY3RUZXN0cy5BZGRDb25maWdNYWtlc1Byb2plY3REaXJ0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0VGVzdHMuQ2FuQWRkQXNzZW1ibGllcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0VGVzdHMuQ2FuQWRkQ29uZmlncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0VGVzdHMuQ2FuU2V0QWN0aXZlQ29uZmlnIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFByb2plY3RUZXN0cy5DYW5TZXRBcHBCYXNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFByb2plY3RUZXN0cy5Db25maWd1cmF0aW9uRmlsZUZyb21Bc3NlbWJsaWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFByb2plY3RUZXN0cy5Db25maWd1cmF0aW9uRmlsZUZyb21Bc3NlbWJseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0VGVzdHMuRGVmYXVsdEFjdGl2ZUNvbmZpZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0VGVzdHMuRGVmYXVsdEFwcGxpY2F0aW9uQmFzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0VGVzdHMuRGVmYXVsdENvbmZpZ3VyYXRpb25GaWxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFByb2plY3RUZXN0cy5EZWZhdWx0UHJvamVjdE5hbWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLk5Vbml0UHJvamVjdFRlc3RzLklzUHJvamVjdEZpbGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLk5Vbml0UHJvamVjdFRlc3RzLkxvYWRNYWtlc1Byb2plY3ROb3REaXJ0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0VGVzdHMuTmV3UHJvamVjdERlZmF1bHRQYXRoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFByb2plY3RUZXN0cy5OZXdQcm9qZWN0SXNFbXB0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0VGVzdHMuTmV3UHJvamVjdElzTm90RGlydHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLk5Vbml0UHJvamVjdFRlc3RzLk5ld1Byb2plY3ROb3RMb2FkYWJsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0VGVzdHMuUmVtb3ZlQWN0aXZlQ29uZmlnIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFByb2plY3RUZXN0cy5SZW1vdmVDb25maWdNYWtlc1Byb2plY3REaXJ0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0VGVzdHMuUmVuYW1lQWN0aXZlQ29uZmlnIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFByb2plY3RUZXN0cy5SZW5hbWVDb25maWdNYWtlc1Byb2plY3REaXJ0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0VGVzdHMuU2F2ZUFuZExvYWRDb25maWdzV2l0aEFzc2VtYmxpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSI4IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLk5Vbml0UHJvamVjdFRlc3RzLlNhdmVBbmRMb2FkRW1wdHlDb25maWdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFByb2plY3RUZXN0cy5TYXZlQW5kTG9hZEVtcHR5UHJvamVjdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRQcm9qZWN0VGVzdHMuU2F2ZU1ha2VzUHJvamVjdE5vdERpcnR5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFByb2plY3RUZXN0cy5TYXZlU2V0c1Byb2plY3RQYXRoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFByb2plY3RUZXN0cy5TZXR0aW5nQWN0aXZlQ29uZmlnTWFrZXNQcm9qZWN0RGlydHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iTlVuaXRSZWdpc3RyeVRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxNCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRSZWdpc3RyeVRlc3RzLkN1cnJlbnRVc2VyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5OVW5pdFJlZ2lzdHJ5VGVzdHMuQ3VycmVudFVzZXJUZXN0TW9kZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuTlVuaXRSZWdpc3RyeVRlc3RzLlRlc3RDbGVhclJvdXRpbmVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlBhdGhVdGlsVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5QYXRoVXRpbFRlc3RzLkNoZWNrRGVmYXVsdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUGF0aFV0aWxUZXN0c19Vbml4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUGF0aFV0aWxUZXN0c19Vbml4LkNhbm9uaWNhbGl6ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUGF0aFV0aWxUZXN0c19Vbml4LklzQXNzZW1ibHlGaWxlVHlwZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUGF0aFV0aWxUZXN0c19Vbml4LlBhdGhGcm9tVXJpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5QYXRoVXRpbFRlc3RzX1VuaXguUmVsYXRpdmVQYXRoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMTAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUGF0aFV0aWxUZXN0c19Vbml4LlNhbWVQYXRoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5QYXRoVXRpbFRlc3RzX1VuaXguU2FtZVBhdGhPclVuZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlBhdGhVdGlsVGVzdHNfV2luZG93cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlBhdGhVdGlsVGVzdHNfV2luZG93cy5DYW5vbmljYWxpemUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlBhdGhVdGlsVGVzdHNfV2luZG93cy5Jc0Fzc2VtYmx5RmlsZVR5cGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlBhdGhVdGlsVGVzdHNfV2luZG93cy5QYXRoRnJvbVVyaSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUGF0aFV0aWxUZXN0c19XaW5kb3dzLlJlbGF0aXZlUGF0aCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlBhdGhVdGlsVGVzdHNfV2luZG93cy5TYW1lUGF0aCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUGF0aFV0aWxUZXN0c19XaW5kb3dzLlNhbWVQYXRoT3JVbmRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjkiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJQcm9jZXNzUnVubmVyVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjEyLjM2NCIgYXNzZXJ0cz0iMSI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iVGltZW91dCIgdmFsdWU9IjMwMDAwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydGllcz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9jZXNzUnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5DaGVja1J1bm5lcklEIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9jZXNzUnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5Db3VudFRlc3RDYXNlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMS4xMjYiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvY2Vzc1J1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuQ291bnRUZXN0Q2FzZXNBY3Jvc3NNdWx0aXBsZUFzc2VtYmxpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNzQ2IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2Nlc3NSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRBbmRSZWxvYWRBc3NlbWJseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMS4zNzQiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvY2Vzc1J1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuTG9hZEFzc2VtYmx5V2l0aEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNjU1IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2Nlc3NSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRBc3NlbWJseVdpdGhvdXROYW1lc3BhY2VzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjY5NiIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9jZXNzUnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5Mb2FkQXNzZW1ibHlXaXRoU3VpdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNTkzIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2Nlc3NSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRNdWx0aXBsZUFzc2VtYmxpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNjgxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2Nlc3NSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRNdWx0aXBsZUFzc2VtYmxpZXNXaXRoRml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC42NzQiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvY2Vzc1J1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuTG9hZE11bHRpcGxlQXNzZW1ibGllc1dpdGhTdWl0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC42MzAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvY2Vzc1J1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuUnVuQXNzZW1ibHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuODc5IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2Nlc3NSdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLlJ1bkFzc2VtYmx5VXNpbmdCZWdpbkFuZEVuZFJ1biIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC45MDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvY2Vzc1J1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuUnVuTXVsdGlwbGVBc3NlbWJsaWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjkzOCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9jZXNzUnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5SdW5NdWx0aXBsZUFzc2VtYmxpZXNVc2luZ0JlZ2luQW5kRW5kUnVuIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjkxNCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9jZXNzUnVubmVyVGVzdHMuVGVzdFByb2Nlc3NJc1JldXNlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMS40NDkiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJQcm9qZWN0Q29uZmlnVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTI3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9qZWN0Q29uZmlnVGVzdHMuQWJzb2x1dGVCYXNlUGF0aCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvamVjdENvbmZpZ1Rlc3RzLkFic29sdXRlQ29uZmlndXJhdGlvbkZpbGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5BZGRpbmdDb25maWdNYXJrc1Byb2plY3REaXJ0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvamVjdENvbmZpZ1Rlc3RzLkFkZGluZ0luaXRpYWxDb25maWdSZXF1aXJlc1JlbG9hZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvamVjdENvbmZpZ1Rlc3RzLkFkZGluZ1N1YnNlcXVlbnRDb25maWdEb2VzTm90UmVxdWlyZVJlbG9hZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvamVjdENvbmZpZ1Rlc3RzLkFkZFRvQWN0aXZlQ29uZmlnTWFya3NQcm9qZWN0RGlydHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5BZGRUb0FjdGl2ZUNvbmZpZ1JlcXVpcmVzUmVsb2FkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9qZWN0Q29uZmlnVGVzdHMuQWRkVG9JbmFjdGl2ZUNvbmZpZ0RvZXNOb3RSZXF1aXJlUmVsb2FkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9qZWN0Q29uZmlnVGVzdHMuQWRkVG9JbmFjdGl2ZUNvbmZpZ01hcmtzUHJvamVjdERpcnR5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9qZWN0Q29uZmlnVGVzdHMuQ2FuQWRkQXNzZW1ibGllcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvamVjdENvbmZpZ1Rlc3RzLkRlZmF1bHRDb25maWd1cmF0aW9uRmlsZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvamVjdENvbmZpZ1Rlc3RzLkVtcHR5Q29uZmlnIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9qZWN0Q29uZmlnVGVzdHMuTWFudWFsUHJpdmF0ZUJpblBhdGgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5Ob0Jhc2VQYXRoU2V0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9qZWN0Q29uZmlnVGVzdHMuTm9Qcml2YXRlQmluUGF0aCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvamVjdENvbmZpZ1Rlc3RzLlJlbGF0aXZlQmFzZVBhdGgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5SZWxhdGl2ZUNvbmZpZ3VyYXRpb25GaWxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9qZWN0Q29uZmlnVGVzdHMuUmVtb3ZlQWN0aXZlQ29uZmlnTWFya3NQcm9qZWN0RGlydHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5SZW1vdmVBY3RpdmVDb25maWdSZXF1aXJlc1JlbG9hZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvamVjdENvbmZpZ1Rlc3RzLlJlbW92ZUluYWN0aXZlQ29uZmlnRG9lc05vdFJlcXVpcmVSZWxvYWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5SZW1vdmVJbmFjdGl2ZUNvbmZpZ01hcmtzUHJvamVjdERpcnR5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9qZWN0Q29uZmlnVGVzdHMuUmVuYW1lQWN0aXZlQ29uZmlnTWFya3NQcm9qZWN0RGlydHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5SZW5hbWVBY3RpdmVDb25maWdSZXF1aXJlc1JlbG9hZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvamVjdENvbmZpZ1Rlc3RzLlJlbmFtZUluYWN0aXZlQ29uZmlnRG9lc05vdFJlcXVpcmVSZWxvYWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5SZW5hbWVJbmN0aXZlQ29uZmlnTWFya3NQcm9qZWN0RGlydHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5TZXR0aW5nQWN0aXZlQ29uZmlnQXBwbGljYXRpb25CYXNlTWFya3NQcm9qZWN0RGlydHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5TZXR0aW5nQWN0aXZlQ29uZmlnQXBwbGljYXRpb25CYXNlUmVxdWlyZXNSZWxvYWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5TZXR0aW5nQWN0aXZlQ29uZmlnQmluUGF0aFR5cGVNYXJrc1Byb2plY3REaXJ0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvamVjdENvbmZpZ1Rlc3RzLlNldHRpbmdBY3RpdmVDb25maWdCaW5QYXRoVHlwZVJlcXVpcmVzUmVsb2FkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9qZWN0Q29uZmlnVGVzdHMuU2V0dGluZ0FjdGl2ZUNvbmZpZ0NvbmZpZ3VyYXRpb25GaWxlTWFya3NQcm9qZWN0RGlydHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5TZXR0aW5nQWN0aXZlQ29uZmlnQ29uZmlndXJhdGlvbkZpbGVSZXF1aXJlc1JlbG9hZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvamVjdENvbmZpZ1Rlc3RzLlNldHRpbmdBY3RpdmVDb25maWdQcml2YXRlQmluUGF0aE1hcmtzUHJvamVjdERpcnR5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9qZWN0Q29uZmlnVGVzdHMuU2V0dGluZ0FjdGl2ZUNvbmZpZ1ByaXZhdGVCaW5QYXRoUmVxdWlyZXNSZWxvYWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5TZXR0aW5nSW5hY3RpdmVDb25maWdBcHBsaWNhdGlvbkJhc2VEb2VzTm90UmVxdWlyZVJlbG9hZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvamVjdENvbmZpZ1Rlc3RzLlNldHRpbmdJbmFjdGl2ZUNvbmZpZ0FwcGxpY2F0aW9uQmFzZU1hcmtzUHJvamVjdERpcnR5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9qZWN0Q29uZmlnVGVzdHMuU2V0dGluZ0luYWN0aXZlQ29uZmlnQmluUGF0aFR5cGVEb2VzTm90UmVxdWlyZVJlbG9hZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvamVjdENvbmZpZ1Rlc3RzLlNldHRpbmdJbmFjdGl2ZUNvbmZpZ0JpblBhdGhUeXBlTWFya3NQcm9qZWN0RGlydHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5TZXR0aW5nSW5hY3RpdmVDb25maWdDb25maWd1cmF0aW9uRmlsZURvZXNOb3RSZXF1aXJlUmVsb2FkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9qZWN0Q29uZmlnVGVzdHMuU2V0dGluZ0luYWN0aXZlQ29uZmlnQ29uZmlndXJhdGlvbkZpbGVNYXJrc1Byb2plY3REaXJ0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUHJvamVjdENvbmZpZ1Rlc3RzLlNldHRpbmdJbmFjdGl2ZUNvbmZpZ1ByaXZhdGVCaW5QYXRoRG9lc05vdFJlcXVpcmVSZWxvYWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlByb2plY3RDb25maWdUZXN0cy5TZXR0aW5nSW5hY3RpdmVDb25maWdQcml2YXRlQmluUGF0aE1hcmtzUHJvamVjdERpcnR5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5Qcm9qZWN0Q29uZmlnVGVzdHMuVG9BcnJheSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJSZWNlbnRGaWxlRW50cnlUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJlY2VudEZpbGVFbnRyeVRlc3RzLkNhbkNyZWF0ZUZyb21GaWxlTmFtZUFuZFZlcnNpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJlY2VudEZpbGVFbnRyeVRlc3RzLkNhbkNyZWF0ZUZyb21TaW1wbGVGaWxlTmFtZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVjZW50RmlsZUVudHJ5VGVzdHMuQ2FuUGFyc2VGaWxlTmFtZVBsdXNWZXJzaW9uU3RyaW5nIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZWNlbnRGaWxlRW50cnlUZXN0cy5DYW5QYXJzZUZpbGVOYW1lV2l0aENvbW1hUGx1c1ZlcnNpb25TdHJpbmciIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJlY2VudEZpbGVFbnRyeVRlc3RzLkNhblBhcnNlU2ltcGxlRmlsZU5hbWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJlY2VudEZpbGVFbnRyeVRlc3RzLkNhblBhcnNlU2ltcGxlRmlsZU5hbWVXaXRoQ29tbWEiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJlY2VudEZpbGVFbnRyeVRlc3RzLkVudHJ5Q2FuRGlzcGxheUl0c2VsZiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJSZWNlbnRGaWxlc1Rlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA3NSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVjZW50RmlsZXNUZXN0cy5BZGRNYXhJdGVtcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVjZW50RmlsZXNUZXN0cy5BZGRTaW5nbGVJdGVtIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZWNlbnRGaWxlc1Rlc3RzLkFkZFRvb01hbnlJdGVtcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVjZW50RmlsZXNUZXN0cy5Db3VudEF0TWF4IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZWNlbnRGaWxlc1Rlc3RzLkNvdW50QXRNaW4iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJlY2VudEZpbGVzVGVzdHMuQ291bnREZWZhdWx0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZWNlbnRGaWxlc1Rlc3RzLkNvdW50T3Zlck1heCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVjZW50RmlsZXNUZXN0cy5Db3VudFVuZGVyTWluIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZWNlbnRGaWxlc1Rlc3RzLkVtcHR5TGlzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVjZW50RmlsZXNUZXN0cy5JbmNyZWFzZVNpemUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZWNlbnRGaWxlc1Rlc3RzLkluY3JlYXNlU2l6ZUFmdGVyQWRkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iOCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZWNlbnRGaWxlc1Rlc3RzLlJlZHVjZVNpemUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJlY2VudEZpbGVzVGVzdHMuUmVkdWNlU2l6ZUFmdGVyQWRkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZWNlbnRGaWxlc1Rlc3RzLlJlbW92ZUZpcnN0UHJvamVjdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVjZW50RmlsZXNUZXN0cy5SZW1vdmVMYXN0UHJvamVjdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVjZW50RmlsZXNUZXN0cy5SZW1vdmVNdWx0aXBsZVByb2plY3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZWNlbnRGaWxlc1Rlc3RzLlJlbW92ZU9uZVByb2plY3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJlY2VudEZpbGVzVGVzdHMuUmVvcmRlckxhc3RQcm9qZWN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZWNlbnRGaWxlc1Rlc3RzLlJlb3JkZXJNdWx0aXBsZVByb2plY3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZWNlbnRGaWxlc1Rlc3RzLlJlb3JkZXJTYW1lUHJvamVjdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjYiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVjZW50RmlsZXNUZXN0cy5SZW9yZGVyU2luZ2xlUHJvamVjdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjYiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVjZW50RmlsZXNUZXN0cy5SZW9yZGVyV2l0aExpc3ROb3RGdWxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlJlZ2lzdHJ5U2V0dGluZ3NTdG9yYWdlVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDIyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZWdpc3RyeVNldHRpbmdzU3RvcmFnZVRlc3RzLk1ha2VTdWJTdG9yYWdlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVnaXN0cnlTZXR0aW5nc1N0b3JhZ2VUZXN0cy5SZW1vdmVTZXR0aW5ncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVnaXN0cnlTZXR0aW5nc1N0b3JhZ2VUZXN0cy5TYXZlQW5kTG9hZFNldHRpbmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZWdpc3RyeVNldHRpbmdzU3RvcmFnZVRlc3RzLlN0b3JhZ2VIYXNDb3JyZWN0S2V5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZWdpc3RyeVNldHRpbmdzU3RvcmFnZVRlc3RzLlN1YnN0b3JhZ2VTZXR0aW5ncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVnaXN0cnlTZXR0aW5nc1N0b3JhZ2VUZXN0cy5UeXBlU2FmZVNldHRpbmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlJlbW90ZVRlc3RBZ2VudFRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxNCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVtb3RlVGVzdEFnZW50VGVzdHMuQWdlbnRSZXR1cm5zUHJvY2Vzc0lkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SZW1vdGVUZXN0QWdlbnRUZXN0cy5DYW5Mb2NhdGVBZ2VudEV4ZWN1dGFibGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJlbW90ZVRlc3RBZ2VudFRlc3RzLkNhbkxvY2F0ZUFnZW50RXhlRm9yQWxsSW5zdGFsbGVkVmVyc2lvbnMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJlbW90ZVRlc3RBZ2VudFRlc3RzLkNhbkxvY2F0ZUJpbkRpckZvckFsbEluc3RhbGxlZFZlcnNpb25zIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlJlbW90ZVRlc3RSZXN1bHRUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjg2NSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUmVtb3RlVGVzdFJlc3VsdFRlc3QuUmVzdWx0U3RpbGxWYWxpZEFmdGVyRG9tYWluVW5sb2FkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjg2NCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlJ1bnRpbWVGcmFtZXdvcmtTZWxlY3RvclRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA2MSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUaGVvcnkiIG5hbWU9IlJlcXVlc3RGb3JTcGVjaWZpY0ZyYW1ld29ya0lzSG9ub3JlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUnVudGltZUZyYW1ld29ya1NlbGVjdG9yVGVzdHMuUmVxdWVzdEZvclNwZWNpZmljRnJhbWV3b3JrSXNIb25vcmVkKG5ldC0xLjApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUnVudGltZUZyYW1ld29ya1NlbGVjdG9yVGVzdHMuUmVxdWVzdEZvclNwZWNpZmljRnJhbWV3b3JrSXNIb25vcmVkKG5ldC0xLjEpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUnVudGltZUZyYW1ld29ya1NlbGVjdG9yVGVzdHMuUmVxdWVzdEZvclNwZWNpZmljRnJhbWV3b3JrSXNIb25vcmVkKG5ldC0yLjApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUnVudGltZUZyYW1ld29ya1NlbGVjdG9yVGVzdHMuUmVxdWVzdEZvclNwZWNpZmljRnJhbWV3b3JrSXNIb25vcmVkKG5ldC00LjApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUnVudGltZUZyYW1ld29ya1NlbGVjdG9yVGVzdHMuUmVxdWVzdEZvclNwZWNpZmljRnJhbWV3b3JrSXNIb25vcmVkKG1vbm8tMS4wKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtTZWxlY3RvclRlc3RzLlJlcXVlc3RGb3JTcGVjaWZpY0ZyYW1ld29ya0lzSG9ub3JlZChtb25vLTIuMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SdW50aW1lRnJhbWV3b3JrU2VsZWN0b3JUZXN0cy5SZXF1ZXN0Rm9yU3BlY2lmaWNGcmFtZXdvcmtJc0hvbm9yZWQodjEuMSkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IkluY29uY2x1c2l2ZSIgc3VjY2Vzcz0iRmFsc2UiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWFzb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXNzYWdlPjwhW0NEQVRBWyAgRXhwZWN0ZWQ6IG5vdCBBbnkNCisgIEJ1dCB3YXM6ICBBbnkNCitdXT48L21lc3NhZ2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlYXNvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUnVudGltZUZyYW1ld29ya1NlbGVjdG9yVGVzdHMuUmVxdWVzdEZvclNwZWNpZmljRnJhbWV3b3JrSXNIb25vcmVkKHYyLjApIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJJbmNvbmNsdXNpdmUiIHN1Y2Nlc3M9IkZhbHNlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVhc29uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVzc2FnZT48IVtDREFUQVsgIEV4cGVjdGVkOiBub3QgQW55DQorICBCdXQgd2FzOiAgQW55DQorXV0+PC9tZXNzYWdlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWFzb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LWNhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtTZWxlY3RvclRlc3RzLlJlcXVlc3RGb3JTcGVjaWZpY0ZyYW1ld29ya0lzSG9ub3JlZCh2NC4wKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iSW5jb25jbHVzaXZlIiBzdWNjZXNzPSJGYWxzZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlYXNvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lc3NhZ2U+PCFbQ0RBVEFbICBFeHBlY3RlZDogbm90IEFueQ0KKyAgQnV0IHdhczogIEFueQ0KK11dPjwvbWVzc2FnZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVhc29uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUaGVvcnkiIG5hbWU9IlJlcXVlc3RGb3JTcGVjaWZpY1ZlcnNpb25Jc0hvbm9yZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDI2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtTZWxlY3RvclRlc3RzLlJlcXVlc3RGb3JTcGVjaWZpY1ZlcnNpb25Jc0hvbm9yZWQobmV0LTEuMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IkluY29uY2x1c2l2ZSIgc3VjY2Vzcz0iRmFsc2UiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWFzb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXNzYWdlPjwhW0NEQVRBWyAgRXhwZWN0ZWQ6IEFueQ0KKyAgQnV0IHdhczogIE5ldA0KK11dPjwvbWVzc2FnZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVhc29uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SdW50aW1lRnJhbWV3b3JrU2VsZWN0b3JUZXN0cy5SZXF1ZXN0Rm9yU3BlY2lmaWNWZXJzaW9uSXNIb25vcmVkKG5ldC0xLjEpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJJbmNvbmNsdXNpdmUiIHN1Y2Nlc3M9IkZhbHNlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVhc29uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVzc2FnZT48IVtDREFUQVsgIEV4cGVjdGVkOiBBbnkNCisgIEJ1dCB3YXM6ICBOZXQNCitdXT48L21lc3NhZ2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlYXNvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3QtY2FzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUnVudGltZUZyYW1ld29ya1NlbGVjdG9yVGVzdHMuUmVxdWVzdEZvclNwZWNpZmljVmVyc2lvbklzSG9ub3JlZChuZXQtMi4wKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iSW5jb25jbHVzaXZlIiBzdWNjZXNzPSJGYWxzZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlYXNvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lc3NhZ2U+PCFbQ0RBVEFbICBFeHBlY3RlZDogQW55DQorICBCdXQgd2FzOiAgTmV0DQorXV0+PC9tZXNzYWdlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWFzb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LWNhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtTZWxlY3RvclRlc3RzLlJlcXVlc3RGb3JTcGVjaWZpY1ZlcnNpb25Jc0hvbm9yZWQobmV0LTQuMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IkluY29uY2x1c2l2ZSIgc3VjY2Vzcz0iRmFsc2UiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWFzb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXNzYWdlPjwhW0NEQVRBWyAgRXhwZWN0ZWQ6IEFueQ0KKyAgQnV0IHdhczogIE5ldA0KK11dPjwvbWVzc2FnZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVhc29uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SdW50aW1lRnJhbWV3b3JrU2VsZWN0b3JUZXN0cy5SZXF1ZXN0Rm9yU3BlY2lmaWNWZXJzaW9uSXNIb25vcmVkKG1vbm8tMS4wKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iSW5jb25jbHVzaXZlIiBzdWNjZXNzPSJGYWxzZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlYXNvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lc3NhZ2U+PCFbQ0RBVEFbICBFeHBlY3RlZDogQW55DQorICBCdXQgd2FzOiAgTW9ubw0KK11dPjwvbWVzc2FnZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVhc29uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SdW50aW1lRnJhbWV3b3JrU2VsZWN0b3JUZXN0cy5SZXF1ZXN0Rm9yU3BlY2lmaWNWZXJzaW9uSXNIb25vcmVkKG1vbm8tMi4wKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iSW5jb25jbHVzaXZlIiBzdWNjZXNzPSJGYWxzZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlYXNvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lc3NhZ2U+PCFbQ0RBVEFbICBFeHBlY3RlZDogQW55DQorICBCdXQgd2FzOiAgTW9ubw0KK11dPjwvbWVzc2FnZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVhc29uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5SdW50aW1lRnJhbWV3b3JrU2VsZWN0b3JUZXN0cy5SZXF1ZXN0Rm9yU3BlY2lmaWNWZXJzaW9uSXNIb25vcmVkKHYxLjEpIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuUnVudGltZUZyYW1ld29ya1NlbGVjdG9yVGVzdHMuUmVxdWVzdEZvclNwZWNpZmljVmVyc2lvbklzSG9ub3JlZCh2Mi4wKSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlJ1bnRpbWVGcmFtZXdvcmtTZWxlY3RvclRlc3RzLlJlcXVlc3RGb3JTcGVjaWZpY1ZlcnNpb25Jc0hvbm9yZWQodjQuMCkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJTZXJ2ZXJVdGlsaXR5VGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5TZXJ2ZXJVdGlsaXR5VGVzdHMuQ2FuR2V0VGNwQ2hhbm5lbE9uU3BlY2lmaWVkUG9ydCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuU2VydmVyVXRpbGl0eVRlc3RzLkNhbkdldFRjcENoYW5uZWxPblVucGVjaWZpZWRQb3J0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlNldHRpbmdzR3JvdXBUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlNldHRpbmdzR3JvdXBUZXN0cy5CYWRTZXR0aW5nIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5TZXR0aW5nc0dyb3VwVGVzdHMuRGVmYXVsdFNldHRpbmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5TZXR0aW5nc0dyb3VwVGVzdHMuU3ViR3JvdXBTZXR0aW5ncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuU2V0dGluZ3NHcm91cFRlc3RzLlRvcExldmVsU2V0dGluZ3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlNldHRpbmdzR3JvdXBUZXN0cy5UeXBlU2FmZVNldHRpbmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlN1bW1hcnlSZXN1bHRGaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuU3VtbWFyeVJlc3VsdEZpeHR1cmUuU3VtbWFyeU1hdGNoZXNSZXN1bHQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEwIiBhc3NlcnRzPSI5IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdEFnZW5jeVRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjMyNSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdEFnZW5jeVRlc3RzLkNhbkNvbm5lY3RUb0FnZW5jeSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdEFnZW5jeVRlc3RzLkNhbkxhdW5jaEFuZENvbm5lY3RUb0FnZW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjMxOCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3REb21haW5GaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjg4OSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpbkZpeHR1cmUuQXBwRG9tYWluSXNTZXRVcENvcnJlY3RseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjgiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpbkZpeHR1cmUuQXNzZW1ibHlJc0xvYWRlZENvcnJlY3RseSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpbkZpeHR1cmUuQ2FuUnVuTW9ja0Fzc2VtYmx5VGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMjA5IiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdERvbWFpblJ1bm5lclRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSI5Ljc2MyIgYXNzZXJ0cz0iMSI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpblJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuQ2hlY2tSdW5uZXJJRCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpblJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuQ291bnRUZXN0Q2FzZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNjA3IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlRlc3REb21haW5SdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkNvdW50VGVzdENhc2VzQWNyb3NzTXVsdGlwbGVBc3NlbWJsaWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjY3MSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5UZXN0RG9tYWluUnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5Mb2FkQW5kUmVsb2FkQXNzZW1ibHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjEuMjQ2IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlRlc3REb21haW5SdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRBc3NlbWJseVdpdGhGaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjU3NCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5UZXN0RG9tYWluUnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5Mb2FkQXNzZW1ibHlXaXRob3V0TmFtZXNwYWNlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC42MzkiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpblJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuTG9hZEFzc2VtYmx5V2l0aFN1aXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjUzMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5UZXN0RG9tYWluUnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5Mb2FkTXVsdGlwbGVBc3NlbWJsaWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjY4NCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5UZXN0RG9tYWluUnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5Mb2FkTXVsdGlwbGVBc3NlbWJsaWVzV2l0aEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNjI2IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlRlc3REb21haW5SdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLkxvYWRNdWx0aXBsZUFzc2VtYmxpZXNXaXRoU3VpdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNjE4IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlRlc3REb21haW5SdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLlJ1bkFzc2VtYmx5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjg0NSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5UZXN0RG9tYWluUnVubmVyVGVzdHMuQmFzaWNSdW5uZXJUZXN0cy5SdW5Bc3NlbWJseVVzaW5nQmVnaW5BbmRFbmRSdW4iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuODc2IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlRlc3REb21haW5SdW5uZXJUZXN0cy5CYXNpY1J1bm5lclRlc3RzLlJ1bk11bHRpcGxlQXNzZW1ibGllcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC44NzkiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpblJ1bm5lclRlc3RzLkJhc2ljUnVubmVyVGVzdHMuUnVuTXVsdGlwbGVBc3NlbWJsaWVzVXNpbmdCZWdpbkFuZEVuZFJ1biIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC44ODAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0RG9tYWluVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjUuMDE0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5UZXN0RG9tYWluVGVzdHMuQmFzZVBhdGhPdmVycmlkZUlzSG9ub3JlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMS4wODMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpblRlc3RzLkJpblBhdGhPdmVycmlkZUlzSG9ub3JlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC42MzUiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpblRlc3RzLkNvbmZpZ0ZpbGVPdmVycmlkZUlzSG9ub3JlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC42NjIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpblRlc3RzLkZpbGVOb3RGb3VuZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC43MzgiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpblRlc3RzLkludmFsaWRUZXN0Rml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC41MzgiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpblRlc3RzLlNwZWNpZmljVGVzdEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNzk4IiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlRlc3REb21haW5UZXN0cy5UdXJuT2ZmU2hhZG93Q29weSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC41MzkiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0RG9tYWluVGVzdHNfTXVsdGlwbGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuOTM4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5UZXN0RG9tYWluVGVzdHNfTXVsdGlwbGUuQXNzZW1ibHlOb2RlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpblRlc3RzX011bHRpcGxlLkJ1aWxkU3VpdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlRlc3REb21haW5UZXN0c19NdWx0aXBsZS5Sb290Tm9kZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpblRlc3RzX011bHRpcGxlLlJ1bk11bHRpcGxlQXNzZW1ibGllcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4yMDUiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdERvbWFpblRlc3RzX011bHRpcGxlLlRlc3RDYXNlQ291bnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdERvbWFpblRlc3RzX011bHRpcGxlRml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC42MzUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlRlc3REb21haW5UZXN0c19NdWx0aXBsZUZpeHR1cmUuTG9hZEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNjM0IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdExvYWRlckFzc2VtYmx5VGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjMuMzMyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5UZXN0TG9hZGVyQXNzZW1ibHlUZXN0cy5Bc3NlbWJseVdpdGhOb1Rlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjczNCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5UZXN0TG9hZGVyQXNzZW1ibHlUZXN0cy5GaWxlTm90Rm91bmQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlRlc3RMb2FkZXJBc3NlbWJseVRlc3RzLkxvYWRQcm9qZWN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5UZXN0TG9hZGVyQXNzZW1ibHlUZXN0cy5Mb2FkVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC42NjgiIGFzc2VydHM9IjYiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdExvYWRlckFzc2VtYmx5VGVzdHMuUnVuVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMS4yNzIiIGFzc2VydHM9IjkiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdExvYWRlckFzc2VtYmx5VGVzdHMuVW5sb2FkUHJvamVjdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdExvYWRlckFzc2VtYmx5VGVzdHMuVW5sb2FkVGVzdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC42MzMiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0TG9hZGVyV2F0Y2hlclRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSI0LjUxMCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdExvYWRlcldhdGNoZXJUZXN0cy5Mb2FkU2hvdWxkU3RhcnRXYXRjaGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjY1NSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5UZXN0TG9hZGVyV2F0Y2hlclRlc3RzLkxvYWRTaG91bGRTdGFydFdhdGNoZXJEZXBlbmRpbmdPblNldHRpbmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjYxOSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5UZXN0TG9hZGVyV2F0Y2hlclRlc3RzLlJlbG9hZFNob3VsZFN0YXJ0V2F0Y2hlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMS4zMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdExvYWRlcldhdGNoZXJUZXN0cy5SZWxvYWRTaG91bGRTdGFydFdhdGNoZXJEZXBlbmRpbmdPblNldHRpbmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIxLjI2NSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5UZXN0TG9hZGVyV2F0Y2hlclRlc3RzLlVubG9hZFNob3VsZFN0b3BXYXRjaGVyQW5kRnJlZVJlc291cmNlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC42NTciIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0UnVubmVyRmFjdG9yeVRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVGVzdFJ1bm5lckZhY3RvcnlUZXN0cy5EaWZmZXJlbnRSdW50aW1lVXNlc1Byb2Nlc3NSdW5uZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlRlc3RSdW5uZXJGYWN0b3J5VGVzdHMuRGlmZmVyZW50VmVyc2lvblVzZXNQcm9jZXNzUnVubmVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5UZXN0UnVubmVyRmFjdG9yeVRlc3RzLlNhbWVGcmFtZXdvcmtVc2VzVGVzdERvbWFpbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJWaXN1YWxTdHVkaW9Db252ZXJ0ZXJUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4xNjQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlZpc3VhbFN0dWRpb0NvbnZlcnRlclRlc3RzLkZyb21DcHBQcm9qZWN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA4NSIgYXNzZXJ0cz0iNSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5WaXN1YWxTdHVkaW9Db252ZXJ0ZXJUZXN0cy5Gcm9tQ1NoYXJwUHJvamVjdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVmlzdWFsU3R1ZGlvQ29udmVydGVyVGVzdHMuRnJvbUpzaGFycFByb2plY3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlZpc3VhbFN0dWRpb0NvbnZlcnRlclRlc3RzLkZyb21NYWtlZmlsZVByb2plY3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlZpc3VhbFN0dWRpb0NvbnZlcnRlclRlc3RzLkZyb21Qcm9qZWN0V2l0aEhlYnJld0ZpbGVJbmNsdWRlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVmlzdWFsU3R1ZGlvQ29udmVydGVyVGVzdHMuRnJvbVZCUHJvamVjdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVmlzdWFsU3R1ZGlvQ29udmVydGVyVGVzdHMuRnJvbVZTU29sdXRpb24yMDAzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMiIgYXNzZXJ0cz0iNyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5WaXN1YWxTdHVkaW9Db252ZXJ0ZXJUZXN0cy5Gcm9tVlNTb2x1dGlvbjIwMDUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE2IiBhc3NlcnRzPSI3IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlZpc3VhbFN0dWRpb0NvbnZlcnRlclRlc3RzLkZyb21XZWJBcHBsaWNhdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVmlzdWFsU3R1ZGlvQ29udmVydGVyVGVzdHMuV2l0aFVubWFuYWdlZENwcCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJWU1Byb2plY3RUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wODYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlZTUHJvamVjdFRlc3RzLkZpbGVOb3RGb3VuZEVycm9yIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5WU1Byb2plY3RUZXN0cy5HZW5lcmF0ZUNvcnJlY3RFeHRlbnNpb25zRnJvbVZDUHJvamVjdFZTMjAwNSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVlNQcm9qZWN0VGVzdHMuSW52YWxpZFByb2plY3RGb3JtYXQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlZTUHJvamVjdFRlc3RzLkludmFsaWRYbWxGb3JtYXQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlZTUHJvamVjdFRlc3RzLkxvYWRDcHBQcm9qZWN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5WU1Byb2plY3RUZXN0cy5Mb2FkQ3BwUHJvamVjdFZTMjAwNSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVlNQcm9qZWN0VGVzdHMuTG9hZENwcFByb2plY3RXaXRoTWFjcm9zIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5WU1Byb2plY3RUZXN0cy5Mb2FkQ3NoYXJwUHJvamVjdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVlNQcm9qZWN0VGVzdHMuTG9hZENzaGFycFByb2plY3RWUzIwMDUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlZTUHJvamVjdFRlc3RzLkxvYWRJbnZhbGlkRmlsZVR5cGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlZTUHJvamVjdFRlc3RzLkxvYWRKc2hhcnBQcm9qZWN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5WU1Byb2plY3RUZXN0cy5Mb2FkSnNoYXJwUHJvamVjdFZTMjAwNSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVlNQcm9qZWN0VGVzdHMuTG9hZFByb2plY3RXaXRoSGVicmV3RmlsZUluY2x1ZGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5WU1Byb2plY3RUZXN0cy5Mb2FkVmJQcm9qZWN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5WU1Byb2plY3RUZXN0cy5Mb2FkVmJQcm9qZWN0VlMyMDA1IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5WU1Byb2plY3RUZXN0cy5NaXNzaW5nQXR0cmlidXRlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVlNQcm9qZWN0VGVzdHMuTm9Db25maWd1cmF0aW9ucyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVlNQcm9qZWN0VGVzdHMuTm90V2ViUHJvamVjdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuVlNQcm9qZWN0VGVzdHMuUHJvamVjdEV4dGVuc2lvbnMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlZTUHJvamVjdFRlc3RzLlNvbHV0aW9uRXh0ZW5zaW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlhtbFJlc3VsdFdyaXRlclRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTA4IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5YbWxSZXN1bHRXcml0ZXJUZXN0LkZhaWxpbmdUZXN0SGFzQ29ycmVjdEluZm9ybWF0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iNyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5YbWxSZXN1bHRXcml0ZXJUZXN0Lkhhc011bHRpcGxlQ2F0ZWdvcmllcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuWG1sUmVzdWx0V3JpdGVyVGVzdC5IYXNNdWx0aXBsZVByb3BlcnRpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlhtbFJlc3VsdFdyaXRlclRlc3QuSGFzU2luZ2xlQ2F0ZWdvcnkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlhtbFJlc3VsdFdyaXRlclRlc3QuSGFzU2luZ2xlUHJvcGVydHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlhtbFJlc3VsdFdyaXRlclRlc3QuSWdub3JlZFRlc3RIYXNDb3JyZWN0SW5mb3JtYXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlhtbFJlc3VsdFdyaXRlclRlc3QuSW5jb25jbHVzaXZlVGVzdEhhc0NvcnJlY3RJbmZvcm1hdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjYiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuWG1sUmVzdWx0V3JpdGVyVGVzdC5QYXNzaW5nVGVzdEhhc0NvcnJlY3RJbmZvcm1hdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjYiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlV0aWwuVGVzdHMuWG1sUmVzdWx0V3JpdGVyVGVzdC5TdWl0ZVJlc3VsdEhhc0NhdGVnb3JpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VdGlsLlRlc3RzLlhtbFJlc3VsdFdyaXRlclRlc3QuVGVzdEhhc0N1bHR1cmVJbmZvIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVXRpbC5UZXN0cy5YbWxSZXN1bHRXcml0ZXJUZXN0LlRlc3RIYXNFbnZpcm9ubWVudEluZm8iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI5IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJBc3NlbWJseSIgbmFtZT0iRDpcRGV2XE5Vbml0XG51bml0LTIuNVx3b3JrXGJ1aWxkXG5ldFwyLjBccmVsZWFzZVx0ZXN0cy9udW5pdC5tb2Nrcy50ZXN0cy5kbGwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTY2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJOYW1lc3BhY2UiIG5hbWU9Ik5Vbml0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjE2NSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJOYW1lc3BhY2UiIG5hbWU9Ik1vY2tzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjE2NSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9Ik5hbWVzcGFjZSIgbmFtZT0iVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTY1IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRHluYW1pY01vY2tUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5EeW5hbWljTW9ja1Rlc3RzLkNhbGxNZXRob2QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5EeW5hbWljTW9ja1Rlc3RzLkNhbGxNZXRob2RXaXRoQXJncyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLkR5bmFtaWNNb2NrVGVzdHMuQ3JlYXRlTW9ja0Zvck1CUkNsYXNzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMTMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLkR5bmFtaWNNb2NrVGVzdHMuQ3JlYXRlTW9ja0Zvck5vbk1CUkNsYXNzRmFpbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5EeW5hbWljTW9ja1Rlc3RzLkRlZmF1bHRSZXR1cm5WYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5EeW5hbWljTW9ja1Rlc3RzLkV4cGVjdGVkTWV0aG9kIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuTW9ja3MuVGVzdHMuRHluYW1pY01vY2tUZXN0cy5FeHBlY3RlZE1ldGhvZE5vdENhbGxlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLkR5bmFtaWNNb2NrVGVzdHMuTWV0aG9kV2l0aFJldHVyblZhbHVlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuTW9ja3MuVGVzdHMuRHluYW1pY01vY2tUZXN0cy5Nb2NrSGFzRGVmYXVsdE5hbWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5EeW5hbWljTW9ja1Rlc3RzLk1vY2tIYXNOb25EZWZhdWx0TmFtZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLkR5bmFtaWNNb2NrVGVzdHMuT3ZlcnJpZGVNZXRob2RPbkR5bmFtaWNNb2NrIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuTW9ja3MuVGVzdHMuRHluYW1pY01vY2tUZXN0cy5SZWZQYXJhbWV0ZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5EeW5hbWljTW9ja1Rlc3RzLldyb25nUmV0dXJuVHlwZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJNb2NrVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTE1IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuTW9ja3MuVGVzdHMuTW9ja1Rlc3RzLkNhbGxNdWx0aXBsZU1ldGhvZHNJbkRpZmZlcmVudE9yZGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuTW9ja3MuVGVzdHMuTW9ja1Rlc3RzLkNhbGxNdWx0aXBsZU1ldGhvZHNTb21lV2l0aG91dEV4cGVjdGF0aW9ucyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5DaGFuZ2VFeHBlY3RBbmRSZXR1cm5Ub0ZpeGVkUmV0dXJuIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iOCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuTW9ja3MuVGVzdHMuTW9ja1Rlc3RzLkNoYW5nZUZpeGVkUmV0dXJuVG9FeHBlY3RBbmRSZXR1cm4iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI5IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5Nb2NrVGVzdHMuQ29uc3RyYWludEFyZ3VtZW50U3VjY2VlZHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5Nb2NrVGVzdHMuQ29uc3RyYWludEFyZ3VtZW50VGhhdEZhaWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuTW9ja3MuVGVzdHMuTW9ja1Rlc3RzLkV4cGVjdEFuZFJldHVybiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5FeHBlY3RBbmRSZXR1cm5OdWxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuTW9ja3MuVGVzdHMuTW9ja1Rlc3RzLkV4cGVjdEFuZFJldHVybldpdGhBcmd1bWVudCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5FeHBlY3RBbmRSZXR1cm5XaXRoV3JvbmdBcmd1bWVudCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5FeHBlY3RBbmRUaHJvd0V4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5FeHBlY3ROb0NhbGxGYWlscyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5FeHBlY3ROb0NhbGxTdWNjZWVkcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5GYWlsV2l0aFBhcmFtZXRlcnNTcGVjaWZpZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5Nb2NrVGVzdHMuSWdub3JlQXJndW1lbnRzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuTW9ja3MuVGVzdHMuTW9ja1Rlc3RzLk1ldGhvZE5vdENhbGxlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5Nb2NrSGFzTmFtZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5NdWx0aXBsZUNhbGxzVG9TYW1lTWV0aG9kIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuTW9ja3MuVGVzdHMuTW9ja1Rlc3RzLk11bHRpcGxlRXhwZWN0QW5kUmV0dXJuIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMTAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5NdWx0aXBsZUV4cGVjdGF0aW9ucyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5Nb2NrVGVzdHMuTm90RW5vdWdoQ2FsbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5Nb2NrVGVzdHMuT25lRXhwZWN0YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5Nb2NrVGVzdHMuUmVxdWlyZUFyZ3VtZW50cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5TZXRSZXR1cm5WYWx1ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5TZXRSZXR1cm5WYWx1ZU11bHRpcGxlVGltZXNPbk11bHRpcGxlTWV0aG9kcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5TZXRSZXR1cm5WYWx1ZVJlcGVhdGVkQ2FsbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5Nb2NrVGVzdHMuU2V0UmV0dXJuVmFsdWVXaXRob3V0Q2FsbGluZyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5TdHJpY3REZWZhdWx0c1RvRmFsc2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5Nb2NrVGVzdHMuU3RyaWN0TW9kZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lk1vY2tzLlRlc3RzLk1vY2tUZXN0cy5TdHJpY3RNb2RlX0V4Y2VwdGlvbnNDYXVnaHQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5Nb2NrVGVzdHMuVG9vTWFueUNhbGxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuTW9ja3MuVGVzdHMuTW9ja1Rlc3RzLlVuZXhwZWN0ZWRDYWxsc0lnbm9yZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Nb2Nrcy5UZXN0cy5Nb2NrVGVzdHMuVmVyaWZ5TmV3TW9jayIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IkFzc2VtYmx5IiBuYW1lPSJEOlxEZXZcTlVuaXRcbnVuaXQtMi41XHdvcmtcYnVpbGRcbmV0XDIuMFxyZWxlYXNlXHRlc3RzL251bml0LWNvbnNvbGUudGVzdHMuZGxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIxMS45ODQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9Ik5hbWVzcGFjZSIgbmFtZT0iTlVuaXQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjExLjk4NCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJOYW1lc3BhY2UiIG5hbWU9IkNvbnNvbGVSdW5uZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjExLjk4MyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9Ik5hbWVzcGFjZSIgbmFtZT0iVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjExLjk4MyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkNvbW1hbmRMaW5lVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDkyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5Db21tYW5kTGluZVRlc3RzLkFsbG93Rm9yd2FyZFNsYXNoRGVmYXVsdHNDb3JyZWN0bHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE4IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLkNvbW1hbmRMaW5lVGVzdHMuQXNzZW1ibHlBbG9uZUlzVmFsaWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLkNvbW1hbmRMaW5lVGVzdHMuQXNzZW1ibHlOYW1lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5Db21tYW5kTGluZVRlc3RzLkZpbGVOYW1lV2l0aG91dFhtbFBhcmFtZXRlckxvb2tzTGlrZVBhcmFtZXRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuQ29tbWFuZExpbmVUZXN0cy5GaXh0dXJlTmFtZVBsdXNBc3NlbWJseUlzVmFsaWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLkNvbW1hbmRMaW5lVGVzdHMuSGVscFRleHRVc2VzQ29ycmVjdERlbGltaXRlckZvclBsYXRmb3JtIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5Db21tYW5kTGluZVRlc3RzLkludmFsaWRDb21tYW5kTGluZVBhcm1zIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5Db21tYW5kTGluZVRlc3RzLkludmFsaWRPcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLkNvbW1hbmRMaW5lVGVzdHMuTm9GaXh0dXJlTmFtZVByb3ZpZGVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5Db21tYW5kTGluZVRlc3RzLk5vUGFyYW1ldGVyc0NvdW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5Db21tYW5kTGluZVRlc3RzLk9wdGlvbnNBcmVSZWNvZ25pemVkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxNyIgYXNzZXJ0cz0iMTAwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLkNvbW1hbmRMaW5lVGVzdHMuWG1sUGFyYW1ldGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5Db21tYW5kTGluZVRlc3RzLlhtbFBhcmFtZXRlcldpdGhGdWxsUGF0aCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuQ29tbWFuZExpbmVUZXN0cy5YbWxQYXJhbWV0ZXJXaXRoRnVsbFBhdGhVc2luZ0VxdWFsU2lnbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuQ29tbWFuZExpbmVUZXN0cy5YbWxQYXJhbWV0ZXJXaXRob3V0RmlsZU5hbWVJc0ludmFsaWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQ29tbWFuZExpbmVUZXN0c19NdWx0aXBsZUFzc2VtYmxpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5Db21tYW5kTGluZVRlc3RzX011bHRpcGxlQXNzZW1ibGllcy5DaGVja1BhcmFtZXRlcnMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLkNvbW1hbmRMaW5lVGVzdHNfTXVsdGlwbGVBc3NlbWJsaWVzLkZpeHR1cmVQYXJhbWV0ZXJzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5Db21tYW5kTGluZVRlc3RzX011bHRpcGxlQXNzZW1ibGllcy5GaXh0dXJlVmFsaWRhdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLkNvbW1hbmRMaW5lVGVzdHNfTXVsdGlwbGVBc3NlbWJsaWVzLk11bHRpcGxlQXNzZW1ibHlWYWxpZGF0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuQ29tbWFuZExpbmVUZXN0c19NdWx0aXBsZUFzc2VtYmxpZXMuUGFyYW1ldGVyQ291bnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iQ29uc29sZVJ1bm5lclRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjExLjgyMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuQ29uc29sZVJ1bm5lclRlc3QuQXNzZW1ibHlOb3RGb3VuZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjUiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuQ29uc29sZVJ1bm5lclRlc3QuQnVnMTA3MzUzOVRlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuODQ1IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLkNvbnNvbGVSdW5uZXJUZXN0LkJ1ZzEzMTE2NDRUZXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjgwNSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5Db25zb2xlUnVubmVyVGVzdC5DYW5SdW5XaXRoTXVsdGlwbGVUZXN0RG9tYWlucyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMS43NjYiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuQ29uc29sZVJ1bm5lclRlc3QuQ2FuUnVuV2l0aE11bHRpcGxlVGVzdERvbWFpbnNfTm9UaHJlYWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjEuNzQ5IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLkNvbnNvbGVSdW5uZXJUZXN0LkNhblJ1bldpdGhvdXRUZXN0RG9tYWluIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA2MiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5Db25zb2xlUnVubmVyVGVzdC5DYW5SdW5XaXRob3V0VGVzdERvbWFpbl9Ob1RocmVhZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNjEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuQ29uc29sZVJ1bm5lclRlc3QuQ2FuUnVuV2l0aFNpbmdsZVRlc3REb21haW4iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjEuMDI1IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLkNvbnNvbGVSdW5uZXJUZXN0LkNhblJ1bldpdGhTaW5nbGVUZXN0RG9tYWluX05vVGhyZWFkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjk3NSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5Db25zb2xlUnVubmVyVGVzdC5GYWlsdXJlRml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC43NzciIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuQ29uc29sZVJ1bm5lclRlc3QuSW52YWxpZEZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNTE2IiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLkNvbnNvbGVSdW5uZXJUZXN0Lk11bHRpRmFpbHVyZUZpeHR1cmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuODIwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLkNvbnNvbGVSdW5uZXJUZXN0Lk9uZU9mVHdvQXNzZW1ibGllc05vdEZvdW5kIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5Db25zb2xlUnVubmVyVGVzdC5TdWNjZXNzRml4dHVyZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC43NzMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuQ29uc29sZVJ1bm5lclRlc3QuWG1sUmVzdWx0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjc4MiIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5Db25zb2xlUnVubmVyVGVzdC5YbWxUb0NvbnNvbGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuNzg0IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdE5hbWVQYXJzZXJUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iUGFyYW1ldGVyaXplZFRlc3QiIG5hbWU9IlNpbmdsZU5hbWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDI2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLlRlc3ROYW1lUGFyc2VyVGVzdHMuU2luZ2xlTmFtZSgmcXVvdDtUZXN0Lk5hbWVzcGFjZS5GaXh0dXJlLk1ldGhvZCZsdDtpbnQsaW50Jmd0OygpJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLlRlc3ROYW1lUGFyc2VyVGVzdHMuU2luZ2xlTmFtZSgmcXVvdDtUZXN0Lk5hbWVzcGFjZS5GaXh0dXJlLk1ldGhvZCwmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuVGVzdE5hbWVQYXJzZXJUZXN0cy5TaW5nbGVOYW1lKCZxdW90OyAgVGVzdC5OYW1lc3BhY2UuRml4dHVyZS5NZXRob2QgICZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5UZXN0TmFtZVBhcnNlclRlc3RzLlNpbmdsZU5hbWUoJnF1b3Q7ICBUZXN0Lk5hbWVzcGFjZS5GaXh0dXJlLk1ldGhvZCAgLCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5UZXN0TmFtZVBhcnNlclRlc3RzLlNpbmdsZU5hbWUoJnF1b3Q7VGVzdC5OYW1lc3BhY2UuRml4dHVyZS5NZXRob2QoKSZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5UZXN0TmFtZVBhcnNlclRlc3RzLlNpbmdsZU5hbWUoJnF1b3Q7VGVzdC5OYW1lc3BhY2UuRml4dHVyZS5NZXRob2QoXCZxdW90O3N0cmluZyxhcmd1bWVudFwmcXVvdDspJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLlRlc3ROYW1lUGFyc2VyVGVzdHMuU2luZ2xlTmFtZSgmcXVvdDtUZXN0Lk5hbWVzcGFjZS5GaXh0dXJlLk1ldGhvZCgxLDIsMykmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuVGVzdE5hbWVQYXJzZXJUZXN0cy5TaW5nbGVOYW1lKCZxdW90O1Rlc3QuTmFtZXNwYWNlLkZpeHR1cmUuTWV0aG9kJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLlRlc3ROYW1lUGFyc2VyVGVzdHMuU2luZ2xlTmFtZSgmcXVvdDtUZXN0Lk5hbWVzcGFjZS5GaXh0dXJlLk1ldGhvZChcJnF1b3Q7KVwmcXVvdDspJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlBhcmFtZXRlcml6ZWRUZXN0IiBuYW1lPSJUd29OYW1lcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuVGVzdE5hbWVQYXJzZXJUZXN0cy5Ud29OYW1lcygmcXVvdDtUZXN0Lk5hbWVzcGFjZS5GaXh0dXJlLk1ldGhvZDEmcXVvdDssJnF1b3Q7VGVzdC5OYW1lc3BhY2UuRml4dHVyZS5NZXRob2QyJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5Db25zb2xlUnVubmVyLlRlc3RzLlRlc3ROYW1lUGFyc2VyVGVzdHMuVHdvTmFtZXMoJnF1b3Q7VGVzdC5OYW1lc3BhY2UuRml4dHVyZS5NZXRob2QxKFwmcXVvdDsoXCZxdW90OykmcXVvdDssJnF1b3Q7VGVzdC5OYW1lc3BhY2UuRml4dHVyZS5NZXRob2QyKFwmcXVvdDsmbHQ7XCZxdW90OykmcXVvdDspIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkNvbnNvbGVSdW5uZXIuVGVzdHMuVGVzdE5hbWVQYXJzZXJUZXN0cy5Ud29OYW1lcygmcXVvdDtUZXN0Lk5hbWVzcGFjZS5GaXh0dXJlLk1ldGhvZDEmcXVvdDssJnF1b3Q7VGVzdC5OYW1lc3BhY2UuRml4dHVyZS5NZXRob2QyLCZxdW90OykiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuQ29uc29sZVJ1bm5lci5UZXN0cy5UZXN0TmFtZVBhcnNlclRlc3RzLlR3b05hbWVzKCZxdW90O1Rlc3QuTmFtZXNwYWNlLkZpeHR1cmUuTWV0aG9kMSgxLDIpJnF1b3Q7LCZxdW90O1Rlc3QuTmFtZXNwYWNlLkZpeHR1cmUuTWV0aG9kMigzLDQpJnF1b3Q7KSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iQXNzZW1ibHkiIG5hbWU9IkQ6XERldlxOVW5pdFxudW5pdC0yLjVcd29ya1xidWlsZFxuZXRcMi4wXHJlbGVhc2VcdGVzdHMvbnVuaXQudWlleGNlcHRpb24udGVzdHMuZGxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIxLjg5MiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iTmFtZXNwYWNlIiBuYW1lPSJOVW5pdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMS44OTIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iTmFtZXNwYWNlIiBuYW1lPSJVaUV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMS44OTEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJOYW1lc3BhY2UiIG5hbWU9IlRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIxLjg5MSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iTmFtZXNwYWNlIiBuYW1lPSJDb2RlRm9ybWF0dGVycyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC40ODgiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RDb2RlRm9ybWF0dGVyQ29sbGVjdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RDb2RlRm9ybWF0dGVyQ29sbGVjdGlvbi5DbGVhciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0Q29kZUZvcm1hdHRlckNvbGxlY3Rpb24uQ29udGFpbnNGb3JtYXR0ZXJGcm9tRXh0ZW5zaW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RDb2RlRm9ybWF0dGVyQ29sbGVjdGlvbi5JbmRleGVyX0Nhbl9UaHJvd19Vbmtub3duRXh0ZW5zaW9uRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RDb2RlRm9ybWF0dGVyQ29sbGVjdGlvbi5JdGVtSW5kZXhlcl9DYW5fVGhyb3dfTnVsbEV4dGVuc2lvbkV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0Q29kZUZvcm1hdHRlckNvbGxlY3Rpb24uUmVnaXN0ZXJfQ2FuX1Rocm93X051bGxFeHRlbnNpb25FeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdENvZGVGb3JtYXR0ZXJDb2xsZWN0aW9uLlJlZ2lzdGVyX0Nhbl9UaHJvd19OdWxsRm9ybWF0dGVyRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RDb2RlRm9ybWF0dGVyQ29sbGVjdGlvbi5SZWdpc3Rlcl9DaGVja19FeHRlbnNpb25fQ2FzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0Q29kZUZvcm1hdHRlckNvbGxlY3Rpb24uUmVnaXN0ZXJfQ2hlY2tfRXh0ZW5zaW9uX0lzX05vdF9FbXB0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0Q29kZUZvcm1hdHRlckNvbGxlY3Rpb24uUmVnaXN0ZXJfQ2hlY2tfRXh0ZW5zaW9uX05vdF9Db250YWluX0RvdF9DaGFyYWN0ZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdENvZGVGb3JtYXR0ZXJDb2xsZWN0aW9uLlJlZ2lzdGVyX0NoZWNrX011bHRpcGxlX0V4dGVuc2lvbl9EZWZpbml0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RDb2RlRm9ybWF0dGVyQ29sbGVjdGlvbi5SZW1vdmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdENvZGVGb3JtYXR0ZXJDb2xsZWN0aW9uLlJlbW92ZV9Jc19Ob3RfQ2FzZV9TZW5zaXRpdmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdENvZGVGb3JtYXR0ZXJDb2xsZWN0aW9uLlN0cmluZ0luZGV4ZXJfQ2FuX1Rocm93X051bGxFeHRlbnNpb25FeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdENvZGVGb3JtYXR0ZXJDb2xsZWN0aW9uLlRlc3RfRGVmYXVsdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdENTaGFycENvZGVGb3JtYXR0ZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDY3IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0Q1NoYXJwQ29kZUZvcm1hdHRlci5Gb3JtYXRfQ2FuX1Rocm93X0NTaGFycE51bGxFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdENTaGFycENvZGVGb3JtYXR0ZXIuVGVzdF9Db25zZXJ2ZV9JbnRlcm1lZGlhcnlfU3BhY2VzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzNCIgYXNzZXJ0cz0iOSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RDU2hhcnBDb2RlRm9ybWF0dGVyLlRlc3RfRGVmYXVsdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0Q1NoYXJwQ29kZUZvcm1hdHRlci5UZXN0X0Zvcm1hdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0Q1NoYXJwQ29kZUZvcm1hdHRlci5UZXN0X0Zvcm1hdF8yIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RDU2hhcnBDb2RlRm9ybWF0dGVyLlRlc3RfRm9ybWF0XzMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdENTaGFycENvZGVGb3JtYXR0ZXIuVGVzdF9QcmVQcm9jZXNzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RGb3JtYXR0ZWRDb2RlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA0MyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdEZvcm1hdHRlZENvZGUuQ2hlY2tEYXRhX0Nhbl9UaHJvd19OdWxsRGF0YUV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0Rm9ybWF0dGVkQ29kZS5DaGVja0RhdGFfSW5kZXhBcnJheV9BbmRfVGFnQXJyYXlfQ291bnRfTXVzdF9NYXRjaCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0Rm9ybWF0dGVkQ29kZS5DaGVja0RhdGFfTGluZUFycmF5X1ZhbHVlc19NdXN0X0Fsd2F5c19Hcm93X1VwIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RGb3JtYXR0ZWRDb2RlLkNoZWNrRGF0YV9MaW5lQXJyYXlfVmFsdWVzX011c3RfQmVfSW5fSW5kZXhBcnJheV9Db3VudCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0Rm9ybWF0dGVkQ29kZS5FbXB0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0Rm9ybWF0dGVkQ29kZS5UZXN0X0NvbXBsZXhDb2xsZWN0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0Rm9ybWF0dGVkQ29kZS5UZXN0X0VxdWFscyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdEZvcm1hdHRlZENvZGUuVGVzdF9NYXhMZW5ndGgiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdEZvcm1hdHRlZENvZGUuVGVzdF9TaW1wbGVDb2xsZWN0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMTciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0R2VuZXJhbENvZGVGb3JtYXR0ZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTAzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0R2VuZXJhbENvZGVGb3JtYXR0ZXIuQWxsX0Zvcm1hdHRlcnNfSGF2ZV9VbmlxdWVfTGFuZ3VhZ2VfVmFsdWUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdEdlbmVyYWxDb2RlRm9ybWF0dGVyLkFsbF9Gb3JtYXR0ZXJzX1Nob3VsZF9IYXZlX092ZXJ3cml0ZV9CZWhhdmlvciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0R2VuZXJhbENvZGVGb3JtYXR0ZXIuQWxsX0Zvcm1hdHRlcnNfU2hvdWxkX1ByZVByb2Nlc3NfVGFiX0NoYXJhY3RlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0R2VuZXJhbENvZGVGb3JtYXR0ZXIuQW55X0Zvcm1hdHRlcl9TaG91bGRfRm9ybWF0X0FueV9UZXh0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyMyIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RHZW5lcmFsQ29kZUZvcm1hdHRlci5EZWZhdWx0Rm9ybWF0dGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RHZW5lcmFsQ29kZUZvcm1hdHRlci5EZWZhdWx0Rm9ybWF0dGVyX0Nhbl9UaHJvd19Gb3JtYXR0ZXJOdWxsRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RHZW5lcmFsQ29kZUZvcm1hdHRlci5Gb3JtYXQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdEdlbmVyYWxDb2RlRm9ybWF0dGVyLkZvcm1hdF9DYW5fVGhyb3dfQ29kZU51bGxFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdEdlbmVyYWxDb2RlRm9ybWF0dGVyLkZvcm1hdF9DYW5fVGhyb3dfTGFuZ3VhZ2VOYW1lTnVsbEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0R2VuZXJhbENvZGVGb3JtYXR0ZXIuRm9ybWF0X1BpY2tfQmVzdF9Gb3JtYXR0ZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdEdlbmVyYWxDb2RlRm9ybWF0dGVyLkZvcm1hdEZyb21FeHRlbnNpb25fQ2FuX1Rocm93X0NvZGVOdWxsRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RHZW5lcmFsQ29kZUZvcm1hdHRlci5Gb3JtYXRGcm9tRXh0ZW5zaW9uX0Nhbl9UaHJvd19FeHRlbnNpb25OdWxsRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RHZW5lcmFsQ29kZUZvcm1hdHRlci5HZXRGb3JtYXR0ZXJGcm9tRXh0ZW5zaW9uX0Nhbl9UaHJvd19FeHRlbnNpb25OdWxsRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RHZW5lcmFsQ29kZUZvcm1hdHRlci5HZXRGb3JtYXR0ZXJGcm9tTGFuZ3VhZ2VfQ2FuX1Rocm93X0xhbmd1YWdlTnVsbEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0R2VuZXJhbENvZGVGb3JtYXR0ZXIuR2V0Rm9ybWF0dGVyRnJvbXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdEdlbmVyYWxDb2RlRm9ybWF0dGVyLkxhbmd1YWdlRnJvbUV4dGVuc2lvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0R2VuZXJhbENvZGVGb3JtYXR0ZXIuVGVzdF9EZWZhdWx0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RMZXhlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RMZXhlci5UZXN0X0RlZmF1bHQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdExleGVyLlRlc3RfRG90X0NoYXJhY3RlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0TGV4ZXIuVGVzdF9TZXRUZXh0X1Rocm93c19OdWxsQXJndW1lbnRFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdExleGVyLlRlc3RfU3BsaXRfQ29sb25DaGFyYWN0ZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RMZXhlci5UZXN0X1NwbGl0X0NvbW1lbnRDIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMTAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0TGV4ZXIuVGVzdF9TcGxpdF9Db21tZW50Q3BwIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RMZXhlci5UZXN0X1NwbGl0X0RvdWJsZVF1b3RlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMTkiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0TGV4ZXIuVGVzdF9TcGxpdF9FcXVhbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdExleGVyLlRlc3RfU3BsaXRfTmV3X0xpbmUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdExleGVyLlRlc3RfU3BsaXRfTnVtYmVyU2lnbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0TGV4ZXIuVGVzdF9TcGxpdF9TaW5nbGVRdW90ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0TGV4ZXIuVGVzdF9TcGxpdF9XaGl0ZVNwYWNlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjM1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdExleGVyLlRlc3RfU3BsaXRfV29yZHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RQbGFpblRleHRDb2RlRm9ybWF0dGVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxNSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdFBsYWluVGV4dENvZGVGb3JtYXR0ZXIuRm9ybWF0X0Nhbl9UaHJvd19Db2RlTnVsbEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0UGxhaW5UZXh0Q29kZUZvcm1hdHRlci5Gb3JtYXRfSGVsbG9Xb3JsZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0UGxhaW5UZXh0Q29kZUZvcm1hdHRlci5Gb3JtYXRfTGluZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdFBsYWluVGV4dENvZGVGb3JtYXR0ZXIuVGVzdF9MYW5ndWFnZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0UGxhaW5UZXh0Q29kZUZvcm1hdHRlci5UZXN0X1ByZVByb2Nlc3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdFRva2VuIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdFRva2VuLlRlc3RfRXF1YWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RUb2tlbkNsYXNzaWZpZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDYzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0VG9rZW5DbGFzc2lmaWVyLnRlc3RfQWNjZXB0VG9rZW4iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSI2MCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RUb2tlbkNsYXNzaWZpZXIuVGVzdF9DbGFzc2lmaWNhdGlvbl9DYXNlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjMyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdFRva2VuQ2xhc3NpZmllci5UZXN0X0NsYXNzaWZ5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iNjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0VG9rZW5DbGFzc2lmaWVyLlRlc3RfQ2xhc3NpZnlfQXNfS2V5d29yZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjgxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdFRva2VuQ2xhc3NpZmllci5UZXN0X0NsYXNzaWZ5X0Nhbl9UaHJvd19Bcmd1bWVudE51bGxFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdFRva2VuQ2xhc3NpZmllci5UZXN0X0NsYXNzaWZ5X1Rocm93X051bGxBcmdFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdFRva2VuQ2xhc3NpZmllci5UZXN0X0VzY2FwaW5nX3NlcXVlbmNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwOSIgYXNzZXJ0cz0iNjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0VG9rZW5DbGFzc2lmaWVyLlRlc3RfTmV3U3RhdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSI0MCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RUb2tlbkNsYXNzaWZpZXIuVGVzdF9SZXNldCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0VG9rZW5EaWN0aW9uYXJ5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1MyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdFRva2VuRGljdGlvbmFyeS5BZGRfY2FuX3Rocm93X0FscmVhZHlEZWZpbmVkRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RUb2tlbkRpY3Rpb25hcnkuQWRkX2Nhbl90aHJvd19FbXB0eVNlcXVlbmNlRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RUb2tlbkRpY3Rpb25hcnkuQWRkX2Nhbl90aHJvd19JbnZhbGlkU29ydEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db2RlRm9ybWF0dGVycy5UZXN0VG9rZW5EaWN0aW9uYXJ5LkFkZF9jYW5fdGhyb3dfTnVsbFZhbHVlRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RUb2tlbkRpY3Rpb25hcnkuYWRkX3Rva2VuIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RUb2tlbkRpY3Rpb25hcnkuUG9wdWxhdGVUb2tlblN0YXJ0aW5nV2l0aCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjE0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdFRva2VuRGljdGlvbmFyeS5Qb3B1bGF0ZVRva2VuU3RhcnRpbmdXaXRoX2Nhbl90aHJvd19OdWxsT3V0cHV0RXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvZGVGb3JtYXR0ZXJzLlRlc3RUb2tlbkRpY3Rpb25hcnkuUG9wdWxhdGVUb2tlblN0YXJ0aW5nV2l0aF9jYW5fdGhyb3dfTnVsbFN0YXJ0ZXJFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdFRva2VuRGljdGlvbmFyeS50ZXN0X2RlZmF1bHQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdFRva2VuRGljdGlvbmFyeS5UcnlNYXRjaF9jYW5fdGhyb3dfTnVsbFByZWRpY3Rpb25FeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdFRva2VuRGljdGlvbmFyeS5UcnlNYXRjaF9jYW5fdGhyb3dfTnVsbFRleHRFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdFRva2VuRGljdGlvbmFyeS5UcnlNYXRjaF9ub19wcmVkaWN0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMTQ2IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29kZUZvcm1hdHRlcnMuVGVzdFRva2VuRGljdGlvbmFyeS5UcnlNYXRjaF9wcmVkaWN0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMTkiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iTmFtZXNwYWNlIiBuYW1lPSJDb250cm9scyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMS4xMzMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RDb2RlQm94IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjI1NCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdENvZGVCb3guQ2FuX0Rpc2FibGVfU2hvd0N1cnJlbnRMaW5lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjE5NSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RDb2RlQm94LkNhbl9TZXRfQmFja19BbmRfRm9yZV9Db2xvcnMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdENvZGVCb3guQ2hhbmdpbmdfRm9udF9DYXVzZXNfUmVmb3JtYXR0aW5nIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iMjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0Q29kZUJveC5DaGFuZ2luZ19MYW5ndWFnZV9DYXVzZXNfUmVmb3JtYXR0aW5nIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMzQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0Q29kZUJveC5DdXJyZW50TGluZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDkiIGFzc2VydHM9IjMwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdENvZGVCb3guRGVmYXVsdFN0YXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMTEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0Q29kZUJveC5Gb3JtYXRfVGV4dF9XaXRoX0xhbmd1YWdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0Q29kZUJveC5PblBhaW50IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMTkiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0Q29kZVJlbmRlcmluZ0NvbnRleHQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0Q29kZVJlbmRlcmluZ0NvbnRleHQuQ2FuX0NoYW5nZV9Db2xvcnMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSI0MyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RDb2RlUmVuZGVyaW5nQ29udGV4dC5EZWZhdWx0U3RhdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIzOCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3REZWZhdWx0Q29kZVJlbmRlcmVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdERlZmF1bHRDb2RlUmVuZGVyZXIuRHJhd1RvR3JhcGhpY3NfQ2FuX1JhaXNlX0FyZ3VtZW50TnVsbEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0RGVmYXVsdENvZGVSZW5kZXJlci5HZXREb2N1bWVudFNpemUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdERlZmF1bHRDb2RlUmVuZGVyZXIuR2V0RG9jdW1lbnRTaXplX0Nhbl9SYWlzZV9Bcmd1bWVudE51bGxFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdERlZmF1bHRDb2RlUmVuZGVyZXIuTGluZUluZGV4VG9ZQ29vcmRpbmF0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0RGVmYXVsdENvZGVSZW5kZXJlci5MaW5lSW5kZXhUb1lDb29yZGluYXRlX0Nhbl9SYWlzZV9Bcmd1bWVudE51bGxFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdERlZmF1bHRDb2RlUmVuZGVyZXIuVmlld3BvcnRMaW5lcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDkiIGFzc2VydHM9IjMyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdERlZmF1bHRFcnJvckxpc3RSZW5kZXJlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4yMTEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3REZWZhdWx0RXJyb3JMaXN0UmVuZGVyZXIuRGVmYXVsdFN0YXRlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3REZWZhdWx0RXJyb3JMaXN0UmVuZGVyZXIuRHJhd1RvR3JhcGhpY3NfQ2FuX1Rocm93X0FyZ3VtZW50TnVsbEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0RGVmYXVsdEVycm9yTGlzdFJlbmRlcmVyLkdldERvY3VtZW50U2l6ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0RGVmYXVsdEVycm9yTGlzdFJlbmRlcmVyLklzRGlydHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTU0IiBhc3NlcnRzPSI3IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdERlZmF1bHRFcnJvckxpc3RSZW5kZXJlci5JdGVtQXQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSI3IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdERlZmF1bHRFcnJvckxpc3RSZW5kZXJlci5NZWFzdXJlSXRlbSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjYiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0RXJyb3JCcm93c2VyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjIwNiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdEVycm9yQnJvd3Nlci5DYW5fUmFpc2VfRXJyb3JTb3VyY2VDaGFuZ2VkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjE0NCIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RFcnJvckJyb3dzZXIuQ2Fubm90X1JlZ2lzdGVyX051bGxfRGlzcGxheSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0RXJyb3JCcm93c2VyLkRlZmF1bHRTdGF0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjEwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdEVycm9yQnJvd3Nlci5FcnJvckRpc3BsYXlfUGx1Z2luc19saWZlX2N5Y2xlX2V2ZW50cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMzciIGFzc2VydHM9IjU1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdEVycm9yQnJvd3Nlci5MYXlvdXRQYW5lbF9BdXRvX1Jlc2l6ZXNfV2hlbl9QYXJlbnRfU2l6ZXNfQ2hhbmdlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RFcnJvckxpc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDcwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0RXJyb3JMaXN0LkF1dG9TZWxlY3RGaXJzdEl0ZW0iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA1IiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdEVycm9yTGlzdC5DYW5SZXBvcnRJbnZhbGlkSXRlbXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdEVycm9yTGlzdC5DbGlja19DYW5fU2VsZWN0X0l0ZW0iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIyMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RFcnJvckxpc3QuQ3VycmVudFNlbGVjdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdEVycm9yTGlzdC5EZWZhdWx0U3RhdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI3IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdEVycm9yTGlzdC5EcmF3SXRlbSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTgiIGFzc2VydHM9IjM5IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdEVycm9yTGlzdC5JbnZva2luZ19EcmF3VG9HcmFwaGljcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdEVycm9yTGlzdC5MaXN0T3JkZXJQb2xpY3kiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSIyMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RFcnJvckxpc3QuUG9wdWxhdGVfU3RhY2tUcmFjZVNvdXJjZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjExIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdEVycm9yUGFuZWxMYXlvdXQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDE0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0RXJyb3JQYW5lbExheW91dC5DYW5fTGF5b3V0X0NoaWxkX0NvbnRyb2xzX1doZW5fU2l6ZV9DaGFuZ2VkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMTYiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0RXJyb3JQYW5lbExheW91dC5EZWZhdWx0U3RhdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RFcnJvclBhbmVsTGF5b3V0LlNldHRpbmdfQ29udGVudCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdEVycm9yUGFuZWxMYXlvdXQuU2V0dGluZ19Ub29sYmFyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMTQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0RXJyb3JUb29sYmFyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjEyOCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdEVycm9yVG9vbGJhci5DYW5ub3RfUmVnaXN0ZXJfTnVsbF9EaXNwbGF5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RFcnJvclRvb2xiYXIuQ2Fubm90X1NlbGVjdF9VblJlZ2lzdGVyZWRfRGlzcGxheSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0RXJyb3JUb29sYmFyLkRlZmF1bHRTdGF0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjgiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0RXJyb3JUb29sYmFyLk5ld1N0cmlwQnV0dG9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RFcnJvclRvb2xiYXIuUGx1Z2luSXRlbV9DbGlja19SYWlzZXNfU2VsZWN0ZWRSZW5kZXJlZENoYW5nZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDMwIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdEVycm9yVG9vbGJhci5SZWdpc3RlcmluZ19kaXNwbGF5c19hZGRzX1Rvb2xTdHJpcEl0ZW0iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDUyIiBhc3NlcnRzPSIzMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RFcnJvclRvb2xiYXIuU2VsZWN0ZWREaXNwbGF5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iOSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RFcnJvclRvb2xiYXIuU2V0X09yX1Vuc2V0X0NoZWNrX0ZsYWdfT25fU2VsZWN0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RTb3VyY2VDb2RlRGlzcGxheSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RTb3VyY2VDb2RlRGlzcGxheS5DYW5SZXBvcnRGaWxlRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RTb3VyY2VDb2RlRGlzcGxheS5EZWZhdWx0U3RhdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIxNSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RTb3VyY2VDb2RlRGlzcGxheS5MaXN0T3JkZXJQb2xpY3kiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAzIiBhc3NlcnRzPSIxNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RTb3VyY2VDb2RlRGlzcGxheS5TZWxlY3RlZEl0ZW1DaGFuZ2VkIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNSIgYXNzZXJ0cz0iMjYiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0U291cmNlQ29kZURpc3BsYXkuU3BsaXRPcmllbnRhdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0U291cmNlQ29kZURpc3BsYXkuU3BsaXR0ZXJEaXN0YW5jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0U3BsaXR0ZXJCb3giIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDUzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0U3BsaXR0ZXJCb3guQ2FuQ2hhbmdlRGVmYXVsdENvbnRyb2wxIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNCIgYXNzZXJ0cz0iNDgiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0U3BsaXR0ZXJCb3guQ2FuQ2hhbmdlRGVmYXVsdENvbnRyb2wyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNDgiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5Db250cm9scy5UZXN0U3BsaXR0ZXJCb3guQ2hhbmdpbmdTaXplSW52b2tlRG9MYXlvdXQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIyOCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RTcGxpdHRlckJveC5Db2xsYXBzZUNvbnRyb2wiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA4IiBhc3NlcnRzPSI4MiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RTcGxpdHRlckJveC5EZWZhdWx0U3RhdGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSI1MSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RTcGxpdHRlckJveC5Nb3VzZUFjdGlvbnMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA3IiBhc3NlcnRzPSI2IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdFNwbGl0dGVyQm94Lk9yaWVudGF0aW9uQWZmZWN0c0xheW91dCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdFNwbGl0dGVyQm94LlBvaW50VG9TcGxpdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9Ijc1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdFNwbGl0dGVyQm94LlNwbGl0dGVyRGlzdGFuY2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI4MSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RTdGFja1RyYWNlRGlzcGxheSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTciIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLkNvbnRyb2xzLlRlc3RTdGFja1RyYWNlRGlzcGxheS5Db3B5VG9DbGlwQm9hcmQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDQ0IiBhc3NlcnRzPSI0Ij4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iQVBBUlRNRU5UX1NUQVRFIiB2YWx1ZT0iU1RBIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1jYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdFN0YWNrVHJhY2VEaXNwbGF5LkRlZmF1bHRTdGF0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdFN0YWNrVHJhY2VEaXNwbGF5LkZlZWRpbmdEaXNwbGF5V2l0aEdhcmJhZ2VEb2VzTm90TWFrZUl0Q3Jhc2giIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuQ29udHJvbHMuVGVzdFN0YWNrVHJhY2VEaXNwbGF5Lk9uU3RhY2tUcmFjZUNoYW5nZWQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9Ik5hbWVzcGFjZSIgbmFtZT0iU3RhY2tUcmFjZUFuYWx5emVycyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wOTUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RGdW5jdGlvblBhcnNlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLlN0YWNrVHJhY2VBbmFseXplcnMuVGVzdEZ1bmN0aW9uUGFyc2VyLlRlc3RfQWJpbGl0eV9Ub19QYXJzZV9Nb25vX1N0YWNrX1RyYWNlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLlN0YWNrVHJhY2VBbmFseXplcnMuVGVzdEZ1bmN0aW9uUGFyc2VyLlRlc3RfQWJpbGl0eV9Ub19QYXJzZV9SZWd1bGFyX0Z1bmN0aW9uX1ZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5TdGFja1RyYWNlQW5hbHl6ZXJzLlRlc3RGdW5jdGlvblBhcnNlci5UZXN0X0ZhaWxfVG9fUGFyc2VfT2RkX0Z1bmN0aW9uX1ZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5TdGFja1RyYWNlQW5hbHl6ZXJzLlRlc3RGdW5jdGlvblBhcnNlci5UZXN0SUVycm9yUGFyc2VyLlRlc3RfSUVycm9yUGFyc2VyX0Nhbl9UaHJvd19BcmdzTnVsbEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuU3RhY2tUcmFjZUFuYWx5emVycy5UZXN0RnVuY3Rpb25QYXJzZXIuVGVzdElFcnJvclBhcnNlci5UZXN0X0lFcnJvclBhcnNlcl9DYW5fVGhyb3dfUGFyc2VyTnVsbEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDQiIGFzc2VydHM9IjEwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdElFcnJvclBhcnNlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDUiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLlN0YWNrVHJhY2VBbmFseXplcnMuVGVzdElFcnJvclBhcnNlci5UZXN0X0lFcnJvclBhcnNlcl9DYW5fVGhyb3dfQXJnc051bGxFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLlN0YWNrVHJhY2VBbmFseXplcnMuVGVzdElFcnJvclBhcnNlci5UZXN0X0lFcnJvclBhcnNlcl9DYW5fVGhyb3dfUGFyc2VyTnVsbEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdExpbmVOdW1iZXJQYXJzZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5TdGFja1RyYWNlQW5hbHl6ZXJzLlRlc3RMaW5lTnVtYmVyUGFyc2VyLlRlc3RfQWJpbGl0eV9Ub19QYXJzZV9SZWd1bGFyX0xpbmVfTnVtYmVyX1ZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuU3RhY2tUcmFjZUFuYWx5emVycy5UZXN0TGluZU51bWJlclBhcnNlci5UZXN0X0FiaWxpdHlfVG9fUmVqZWN0X09kZF9MaW5lX051bWJlcl9WYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuU3RhY2tUcmFjZUFuYWx5emVycy5UZXN0TGluZU51bWJlclBhcnNlci5UZXN0SUVycm9yUGFyc2VyLlRlc3RfSUVycm9yUGFyc2VyX0Nhbl9UaHJvd19BcmdzTnVsbEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuU3RhY2tUcmFjZUFuYWx5emVycy5UZXN0TGluZU51bWJlclBhcnNlci5UZXN0SUVycm9yUGFyc2VyLlRlc3RfSUVycm9yUGFyc2VyX0Nhbl9UaHJvd19QYXJzZXJOdWxsRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMTAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0UGF0aFBhcnNlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLlN0YWNrVHJhY2VBbmFseXplcnMuVGVzdFBhdGhQYXJzZXIuVGVzdF9BYmlsaXR5X1RvX0hhbmRsZV9Vbml4X1BhdGhfTGlrZV9WYWx1ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI0IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuU3RhY2tUcmFjZUFuYWx5emVycy5UZXN0UGF0aFBhcnNlci5UZXN0X0FiaWxpdHlfVG9fSGFuZGxlX1dpbmRvd3NfUGF0aF9MaWtlX1ZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5TdGFja1RyYWNlQW5hbHl6ZXJzLlRlc3RQYXRoUGFyc2VyLlRlc3RJRXJyb3JQYXJzZXIuVGVzdF9JRXJyb3JQYXJzZXJfQ2FuX1Rocm93X0FyZ3NOdWxsRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMTIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5TdGFja1RyYWNlQW5hbHl6ZXJzLlRlc3RQYXRoUGFyc2VyLlRlc3RJRXJyb3JQYXJzZXIuVGVzdF9JRXJyb3JQYXJzZXJfQ2FuX1Rocm93X1BhcnNlck51bGxFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RVbml4UGF0aFBhcnNlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLlN0YWNrVHJhY2VBbmFseXplcnMuVGVzdFVuaXhQYXRoUGFyc2VyLlRlc3RfQWJpbGl0eV9Ub19QYXJzZV9SZWd1bGFyX1VuaXhfTGlrZV9QYXRoX1ZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuU3RhY2tUcmFjZUFuYWx5emVycy5UZXN0VW5peFBhdGhQYXJzZXIuVGVzdF9JbmFiaWxpdHlfVG9fUGFyc2VfTm9uX1VuaXhfTGlrZV9QYXRoX1ZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjYiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5TdGFja1RyYWNlQW5hbHl6ZXJzLlRlc3RVbml4UGF0aFBhcnNlci5UZXN0SUVycm9yUGFyc2VyLlRlc3RfSUVycm9yUGFyc2VyX0Nhbl9UaHJvd19BcmdzTnVsbEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjExIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuU3RhY2tUcmFjZUFuYWx5emVycy5UZXN0VW5peFBhdGhQYXJzZXIuVGVzdElFcnJvclBhcnNlci5UZXN0X0lFcnJvclBhcnNlcl9DYW5fVGhyb3dfUGFyc2VyTnVsbEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjExIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdFdpbmRvd3NQYXRoUGFyc2VyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuU3RhY2tUcmFjZUFuYWx5emVycy5UZXN0V2luZG93c1BhdGhQYXJzZXIuVGVzdF9BYmlsaXR5X1RvX1BhcnNlX1JlZ3VsYXJfV2luZG93c19QYXRoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5TdGFja1RyYWNlQW5hbHl6ZXJzLlRlc3RXaW5kb3dzUGF0aFBhcnNlci5UZXN0X0luYWJpbGl0eV9Ub19QYXJzZV9Ob25fV2luZG93c19MaWtlX1BhdGhfVmFsdWVzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLlN0YWNrVHJhY2VBbmFseXplcnMuVGVzdFdpbmRvd3NQYXRoUGFyc2VyLlRlc3RJRXJyb3JQYXJzZXIuVGVzdF9JRXJyb3JQYXJzZXJfQ2FuX1Rocm93X0FyZ3NOdWxsRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMTEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5TdGFja1RyYWNlQW5hbHl6ZXJzLlRlc3RXaW5kb3dzUGF0aFBhcnNlci5UZXN0SUVycm9yUGFyc2VyLlRlc3RfSUVycm9yUGFyc2VyX0Nhbl9UaHJvd19QYXJzZXJOdWxsRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMTEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3REZWZhdWx0VGV4dE1hbmFnZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEyIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuVGVzdERlZmF1bHRUZXh0TWFuYWdlci5UZXN0X0NvZGVCbG9ja0NvbGxlY3Rpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSIxNSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuVGVzdERlZmF1bHRUZXh0TWFuYWdlci5UZXN0X0RlZmF1bHQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5UZXN0RGVmYXVsdFRleHRNYW5hZ2VyLlRlc3RfTWF4TGVuZ3RoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlRlc3RFcnJvckl0ZW0iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDMzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuVGVzdEVycm9ySXRlbS5DYW5fU2V0X1Byb3BlcnRpZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuVGVzdEVycm9ySXRlbS5DdG9yXzIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuVGVzdEVycm9ySXRlbS5DdG9yX1Rocm93c19OdWxsUGF0aEV4Y2VwdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLlRlc3RFcnJvckl0ZW0uQ3Rvcl9XaXRoX0xpbmVfMCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjAiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLlRlc3RFcnJvckl0ZW0uUmVhZEZpbGUiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5UZXN0RXJyb3JJdGVtLlJlYWRGaWxlX1Rocm93c19GaWxlTm90RXhpc3RFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5UZXN0RXJyb3JJdGVtLlRlc3RfRXF1YWxzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iOCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuVGVzdEVycm9ySXRlbS5UZXN0X0ZpbGVFeHRlbnNpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5UZXN0RXJyb3JJdGVtLlRlc3RfTWV0aG9kTmFtZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjE1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdEVycm9ySXRlbUNvbGxlY3Rpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDIwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuVGVzdEVycm9ySXRlbUNvbGxlY3Rpb24uVGVzdF9BZGRfVGhyb3dzX051bGxJdGVtRXhjZXB0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMyIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuVGVzdEVycm9ySXRlbUNvbGxlY3Rpb24uVGVzdF9DbGVhciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLlRlc3RFcnJvckl0ZW1Db2xsZWN0aW9uLlRlc3RfQ29udGFpbnMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5UZXN0RXJyb3JJdGVtQ29sbGVjdGlvbi5UZXN0X1RyYWNlSXRlbXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA0IiBhc3NlcnRzPSI3IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdFBhaW50TGluZUxvY2F0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxMyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLlRlc3RQYWludExpbmVMb2NhdGlvbi5UZXN0X0VxdWFscyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjgiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLlRlc3RQYWludExpbmVMb2NhdGlvbi5UZXN0X1BhaW50TGluZUxvY2F0aW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuVGVzdFBhaW50TGluZUxvY2F0aW9uLlRlc3RfU2V0VGV4dF9UaHJvd3NfTnVsbFRleHRFeGNlcHRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdFN0YWNrVHJhY2VQYXJzZXIiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDM0IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuVGVzdFN0YWNrVHJhY2VQYXJzZXIuVGVzdF9BYmlsaXR5X1RvX0hhbmRsZV9EaWZmZXJlbnRfUGF0aF9TeXN0ZW1fU3ludGF4ZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5UZXN0U3RhY2tUcmFjZVBhcnNlci5UZXN0X0FiaWxpdHlfVG9fSGFuZGxlX0ZpbGVzX1dpdGhfVW5rbm93bl9FeHRlbnNpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5UZXN0U3RhY2tUcmFjZVBhcnNlci5UZXN0X0FuYWx5c2lzX0RvZXNfTm90X0RlcGVuZF9VcG9uX0ZpbGVfRXh0ZW5zaW9uIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuVGVzdFN0YWNrVHJhY2VQYXJzZXIuVGVzdF9EZWZhdWx0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuVGVzdFN0YWNrVHJhY2VQYXJzZXIuVGVzdF9FbmdsaXNoX1N0YWNrIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuVGVzdFN0YWNrVHJhY2VQYXJzZXIuVGVzdF9NaXNzaW5nX0xpbmVfTnVtYmVyIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlFeGNlcHRpb24uVGVzdHMuVGVzdFN0YWNrVHJhY2VQYXJzZXIuVGVzdF9QYXJzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpRXhjZXB0aW9uLlRlc3RzLlRlc3RTdGFja1RyYWNlUGFyc2VyLlRlc3RfUGFyc2VfTXVsdGlwbGVFeHRlbnNpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAyIiBhc3NlcnRzPSI2IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5UZXN0U3RhY2tUcmFjZVBhcnNlci5UZXN0X1BhcnNlX051bGwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5UZXN0U3RhY2tUcmFjZVBhcnNlci5UZXN0X1BhcnNlX1dpdGhfUmVhbF9MaWZlX1NhbXBsZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUV4Y2VwdGlvbi5UZXN0cy5UZXN0U3RhY2tUcmFjZVBhcnNlci5UZXN0X1RyYWNlX1doZW5fTWlzc2luZ19GaWxlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iNSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iQXNzZW1ibHkiIG5hbWU9IkQ6XERldlxOVW5pdFxudW5pdC0yLjVcd29ya1xidWlsZFxuZXRcMi4wXHJlbGVhc2VcdGVzdHMvbnVuaXQudWlraXQudGVzdHMuZGxsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIyLjYzMCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iTmFtZXNwYWNlIiBuYW1lPSJOVW5pdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMi42MzAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iTmFtZXNwYWNlIiBuYW1lPSJVaUtpdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMi42MzAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJOYW1lc3BhY2UiIG5hbWU9IlRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIyLjYyOSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkFkZENvbmZpZ3VyYXRpb25EaWFsb2dUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4zNDkiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5BZGRDb25maWd1cmF0aW9uRGlhbG9nVGVzdHMuQ2hlY2tDb21ib0JveCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4yNDEiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLkFkZENvbmZpZ3VyYXRpb25EaWFsb2dUZXN0cy5DaGVja0ZvckNvbnRyb2xzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMiIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlLaXQuVGVzdHMuQWRkQ29uZmlndXJhdGlvbkRpYWxvZ1Rlc3RzLkNoZWNrVGV4dEJveCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDIiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLkFkZENvbmZpZ3VyYXRpb25EaWFsb2dUZXN0cy5UZXN0Q29tcGxleEVudHJ5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA3NSIgYXNzZXJ0cz0iMiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlLaXQuVGVzdHMuQWRkQ29uZmlndXJhdGlvbkRpYWxvZ1Rlc3RzLlRlc3RTaW1wbGVFbnRyeSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMTgiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJFcnJvckRpc3BsYXlUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNDIiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5FcnJvckRpc3BsYXlUZXN0cy5Db250cm9sc0FyZVBvc2l0aW9uZWRDb3JyZWN0bHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5FcnJvckRpc3BsYXlUZXN0cy5Db250cm9sc0V4aXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkxvbmdSdW5uaW5nT3BlcmF0aW9uRGlzcGxheVRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyMSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLkxvbmdSdW5uaW5nT3BlcmF0aW9uRGlzcGxheVRlc3RzLkNyZWF0ZURpc3BsYXkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDIwIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUHJvZ3Jlc3NCYXJUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNjEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5Qcm9ncmVzc0JhclRlc3RzLlRlc3RQcm9ncmVzc0Rpc3BsYXkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDYwIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iUmVjZW50RmlsZU1lbnVIYW5kbGVyVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDEzIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlLaXQuVGVzdHMuUmVjZW50RmlsZU1lbnVIYW5kbGVyVGVzdHMuRGlzYWJsZU9uTG9hZFdoZW5FbXB0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLlJlY2VudEZpbGVNZW51SGFuZGxlclRlc3RzLkVuYWJsZU9uTG9hZFdoZW5Ob3RFbXB0eSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDMiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLlJlY2VudEZpbGVNZW51SGFuZGxlclRlc3RzLkxvYWRNZW51SXRlbXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iU3RhdHVzQmFyVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMjUwIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlLaXQuVGVzdHMuU3RhdHVzQmFyVGVzdHMuVGVzdENvbnN0cnVjdGlvbiIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNjUiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLlN0YXR1c0JhclRlc3RzLlRlc3RGaW5hbERpc3BsYXkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDczIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5TdGF0dXNCYXJUZXN0cy5UZXN0SW5pdGlhbGl6YXRpb24iIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDQ0IiBhc3NlcnRzPSIxMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlLaXQuVGVzdHMuU3RhdHVzQmFyVGVzdHMuVGVzdFByb2dyZXNzRGlzcGxheSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTciIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0U3VpdGVUcmVlTm9kZVRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA5NiIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLlRlc3RTdWl0ZVRyZWVOb2RlVGVzdHMuQ2xlYXJOZXN0ZWRSZXN1bHRzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyMSIgYXNzZXJ0cz0iOCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlLaXQuVGVzdHMuVGVzdFN1aXRlVHJlZU5vZGVUZXN0cy5DbGVhclJlc3VsdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLlRlc3RTdWl0ZVRyZWVOb2RlVGVzdHMuQ29uc3RydWN0RnJvbVRlc3RJbmZvIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iNiIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlLaXQuVGVzdHMuVGVzdFN1aXRlVHJlZU5vZGVUZXN0cy5SZXN1bHROb3RTZXQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5UZXN0U3VpdGVUcmVlTm9kZVRlc3RzLlNldFJlc3VsdF9GYWlsdXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNyIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlLaXQuVGVzdHMuVGVzdFN1aXRlVHJlZU5vZGVUZXN0cy5TZXRSZXN1bHRfSWdub3JlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlLaXQuVGVzdHMuVGVzdFN1aXRlVHJlZU5vZGVUZXN0cy5TZXRSZXN1bHRfSW5jb25jbHVzaXZlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwNiIgYXNzZXJ0cz0iNCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlLaXQuVGVzdHMuVGVzdFN1aXRlVHJlZU5vZGVUZXN0cy5TZXRSZXN1bHRfU2tpcHBlZCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDYiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLlRlc3RTdWl0ZVRyZWVOb2RlVGVzdHMuU2V0UmVzdWx0X1N1Y2Nlc3MiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDA2IiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdFN1aXRlVHJlZVZpZXdSZWxvYWRUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC45MDYiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5UZXN0U3VpdGVUcmVlVmlld1JlbG9hZFRlc3RzLkNhblJlbG9hZEFmdGVyQ2hhbmdpbmdPcmRlciIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4yMzkiIGFzc2VydHM9IjE3OCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlLaXQuVGVzdHMuVGVzdFN1aXRlVHJlZVZpZXdSZWxvYWRUZXN0cy5DYW5SZWxvYWRBZnRlckRlbGV0aW5nQnJhbmNoIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1NiIgYXNzZXJ0cz0iMTM3IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5UZXN0U3VpdGVUcmVlVmlld1JlbG9hZFRlc3RzLkNhblJlbG9hZEFmdGVyRGVsZXRpbmdPbmVUZXN0Q2FzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTYiIGFzc2VydHM9IjE3NSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlLaXQuVGVzdHMuVGVzdFN1aXRlVHJlZVZpZXdSZWxvYWRUZXN0cy5DYW5SZWxvYWRBZnRlckRlbGV0aW5nVGhyZWVUZXN0Q2FzZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDY1IiBhc3NlcnRzPSIxNjkiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLlRlc3RTdWl0ZVRyZWVWaWV3UmVsb2FkVGVzdHMuQ2FuUmVsb2FkQWZ0ZXJJbnNlcnRpbmdUZXN0Q2FzZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTkiIGFzc2VydHM9IjE4MSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuVWlLaXQuVGVzdHMuVGVzdFN1aXRlVHJlZVZpZXdSZWxvYWRUZXN0cy5DYW5SZWxvYWRBZnRlckluc2VydGluZ1Rlc3RGaXh0dXJlIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1NiIgYXNzZXJ0cz0iMTgyIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5UZXN0U3VpdGVUcmVlVmlld1JlbG9hZFRlc3RzLkNhblJlbG9hZEFmdGVyTXVsdGlwbGVDaGFuZ2VzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1OCIgYXNzZXJ0cz0iMTc5IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5UZXN0U3VpdGVUcmVlVmlld1JlbG9hZFRlc3RzLkNhblJlbG9hZEFmdGVyVHVybmluZ09mZkF1dG9OYW1lc3BhY2VzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjEwNyIgYXNzZXJ0cz0iMTU5IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5UZXN0U3VpdGVUcmVlVmlld1JlbG9hZFRlc3RzLkNhblJlbG9hZFdpdGhvdXRDaGFuZ2UiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDYxIiBhc3NlcnRzPSIxNzciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLlRlc3RTdWl0ZVRyZWVWaWV3UmVsb2FkVGVzdHMuUmVsb2FkVHJlZVdpdGhXcm9uZ1Rlc3QiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDU3IiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5UZXN0U3VpdGVUcmVlVmlld1JlbG9hZFRlc3RzLlZlcmlmeUNoZWNrVHJlZVdvcmtzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1OSIgYXNzZXJ0cz0iMTc3IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iVGVzdFN1aXRlVHJlZVZpZXdUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4zMjQiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5UZXN0U3VpdGVUcmVlVmlld1Rlc3RzLkJ1aWxkRnJvbVJlc3VsdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNjgiIGFzc2VydHM9IjE1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5UZXN0U3VpdGVUcmVlVmlld1Rlc3RzLkJ1aWxkVHJlZVZpZXciIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDYxIiBhc3NlcnRzPSI1IiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5VaUtpdC5UZXN0cy5UZXN0U3VpdGVUcmVlVmlld1Rlc3RzLkNsZWFyVHJlZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTgiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLlRlc3RTdWl0ZVRyZWVWaWV3VGVzdHMuUHJvY2Vzc0NoZWNrcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNjIiIGFzc2VydHM9IjciIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLlRlc3RTdWl0ZVRyZWVWaWV3VGVzdHMuU2V0VGVzdFJlc3VsdCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNjMiIGFzc2VydHM9IjMiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0VHJlZVRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjA1NCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLlRlc3RUcmVlVGVzdHMuU2FtZUNhdGVnb3J5U2hvdWxkTm90QmVTZWxlY3RlZE1vcmVUaGFuT25jZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNTMiIGFzc2VydHM9IjQiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJWaXN1YWxTdGF0ZVRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjQ4MCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LlVpS2l0LlRlc3RzLlZpc3VhbFN0YXRlVGVzdHMuU2F2ZUFuZFJlc3RvcmVWaXN1YWxTdGF0ZSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC40ODAiIGFzc2VydHM9IjUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IkFzc2VtYmx5IiBuYW1lPSJEOlxEZXZcTlVuaXRcbnVuaXQtMi41XHdvcmtcYnVpbGRcbmV0XDIuMFxyZWxlYXNlXHRlc3RzL251bml0LWd1aS50ZXN0cy5kbGwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMzU2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJOYW1lc3BhY2UiIG5hbWU9Ik5Vbml0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjM1NSIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJOYW1lc3BhY2UiIG5hbWU9Ikd1aSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4zNTMiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJOYW1lc3BhY2UiIG5hbWU9IlRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjM1MyIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IkNvbW1hbmRMaW5lVGVzdHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDQ2IiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuR3VpLlRlc3RzLkNvbW1hbmRMaW5lVGVzdHMuQXNzZW1ibHlOYW1lIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAxNiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuR3VpLlRlc3RzLkNvbW1hbmRMaW5lVGVzdHMuSGVscCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDAiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lkd1aS5UZXN0cy5Db21tYW5kTGluZVRlc3RzLkhlbHBUZXh0VXNlc0NvcnJlY3REZWxpbWl0ZXJGb3JQbGF0Zm9ybSIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMDEiIGFzc2VydHM9IjEiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0Lkd1aS5UZXN0cy5Db21tYW5kTGluZVRlc3RzLkludmFsaWRBcmdzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuR3VpLlRlc3RzLkNvbW1hbmRMaW5lVGVzdHMuSW52YWxpZENvbW1hbmRMaW5lUGFybXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5HdWkuVGVzdHMuQ29tbWFuZExpbmVUZXN0cy5Ob05hbWVWYWx1ZVBhaXJzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMCIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuR3VpLlRlc3RzLkNvbW1hbmRMaW5lVGVzdHMuTm9QYXJhbWV0ZXJzQ291bnQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5HdWkuVGVzdHMuQ29tbWFuZExpbmVUZXN0cy5TaG9ydEhlbHAiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5HdWkuVGVzdHMuQ29tbWFuZExpbmVUZXN0cy5WYWxpZGF0ZVN1Y2Nlc3NmdWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIxIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1zdWl0ZSB0eXBlPSJUZXN0Rml4dHVyZSIgbmFtZT0iRXhjZXB0aW9uRGV0YWlsc0Zvcm1UZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wNjEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5HdWkuVGVzdHMuRXhjZXB0aW9uRGV0YWlsc0Zvcm1UZXN0cy5Db250cm9sc0FyZVBvc2l0aW9uZWRDb3JyZWN0bHkiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5HdWkuVGVzdHMuRXhjZXB0aW9uRGV0YWlsc0Zvcm1UZXN0cy5Db250cm9sc0V4aXN0IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMCIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuR3VpLlRlc3RzLkV4Y2VwdGlvbkRldGFpbHNGb3JtVGVzdHMuTWVzc2FnZURpc3BsYXlzQ29ycmVjdGx5IiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAzMiIgYXNzZXJ0cz0iMSIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iVGVzdEZpeHR1cmUiIG5hbWU9IlByb2plY3RFZGl0b3JUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4yNDAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5HdWkuVGVzdHMuUHJvamVjdEVkaXRvclRlc3RzLkNoZWNrQ29udHJvbHMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMTUxIiBhc3NlcnRzPSIwIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QtY2FzZSBuYW1lPSJOVW5pdC5HdWkuVGVzdHMuUHJvamVjdEVkaXRvclRlc3RzLkluaXRpYWxGaWVsZFZhbHVlcyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wODUiIGFzc2VydHM9IjIiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICA8L3Rlc3Qtc3VpdGU+DQorICAgICAgICA8L3Jlc3VsdHM+DQorICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IkFzc2VtYmx5IiBuYW1lPSJEOlxEZXZcTlVuaXRcbnVuaXQtMi41XHdvcmtcYnVpbGRcbmV0XDIuMFxyZWxlYXNlXHRlc3RzL251bml0LmZpeHR1cmVzLnRlc3RzLmRsbCIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjEiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9Ik5hbWVzcGFjZSIgbmFtZT0iTlVuaXQiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDIxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICA8cmVzdWx0cz4NCisgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9Ik5hbWVzcGFjZSIgbmFtZT0iRml4dHVyZXMiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDIxIiBhc3NlcnRzPSIwIj4NCisgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgPHRlc3Qtc3VpdGUgdHlwZT0iTmFtZXNwYWNlIiBuYW1lPSJUZXN0cyIgZXhlY3V0ZWQ9IlRydWUiIHJlc3VsdD0iU3VjY2VzcyIgc3VjY2Vzcz0iVHJ1ZSIgdGltZT0iMC4wMjAiIGFzc2VydHM9IjAiPg0KKyAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LXN1aXRlIHR5cGU9IlRlc3RGaXh0dXJlIiBuYW1lPSJUZXN0VHJlZVRlc3RzIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAyMCIgYXNzZXJ0cz0iMCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc3VsdHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdC1jYXNlIG5hbWU9Ik5Vbml0LkZpeHR1cmVzLlRlc3RzLlRlc3RUcmVlVGVzdHMuTWF0Y2hpbmdUcmVlc0FyZUVxdWFsIiBleGVjdXRlZD0iVHJ1ZSIgcmVzdWx0PSJTdWNjZXNzIiBzdWNjZXNzPSJUcnVlIiB0aW1lPSIwLjAwMSIgYXNzZXJ0cz0iMyIgLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0LWNhc2UgbmFtZT0iTlVuaXQuRml4dHVyZXMuVGVzdHMuVGVzdFRyZWVUZXN0cy5Ob25NYXRjaGluZ1RyZWVzQXJlTm90RXF1YWwiIGV4ZWN1dGVkPSJUcnVlIiByZXN1bHQ9IlN1Y2Nlc3MiIHN1Y2Nlc3M9IlRydWUiIHRpbWU9IjAuMDAwIiBhc3NlcnRzPSIzIiAvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgICAgICAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgICAgIDwvcmVzdWx0cz4NCisgICAgICAgICAgPC90ZXN0LXN1aXRlPg0KKyAgICAgICAgPC9yZXN1bHRzPg0KKyAgICAgIDwvdGVzdC1zdWl0ZT4NCisgICAgPC9yZXN1bHRzPg0KKyAgPC90ZXN0LXN1aXRlPg0KKzwvdGVzdC1yZXN1bHRzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvYWdlbnQuY29uZiBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvYWdlbnQuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGNmNTUwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9hZ2VudC5jb25mCkBAIC0wLDAgKzEsNCBAQAorPEFnZW50Q29uZmlnPg0KKyAgPFBvcnQ+ODA4MDwvUG9ydD4NCisgIDxQYXRoVG9Bc3NlbWJsaWVzPi48L1BhdGhUb0Fzc2VtYmxpZXM+DQorPC9BZ2VudENvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2FnZW50LmxvZy5jb25mIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9hZ2VudC5sb2cuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzQwY2FkCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9hZ2VudC5sb2cuY29uZgpAQCAtMCwwICsxLDE4IEBACis8bG9nNG5ldD4NCisJPCEtLSBBMSBpcyBzZXQgdG8gYmUgYSBDb25zb2xlQXBwZW5kZXIgLS0+DQorCTxhcHBlbmRlciBuYW1lPSJBMSIgdHlwZT0ibG9nNG5ldC5BcHBlbmRlci5Db25zb2xlQXBwZW5kZXIiPg0KKw0KKwkJPCEtLSBBMSB1c2VzIFBhdHRlcm5MYXlvdXQgLS0+DQorCQk8bGF5b3V0IHR5cGU9ImxvZzRuZXQuTGF5b3V0LlBhdHRlcm5MYXlvdXQiPg0KKwkJCTwhLS0gUHJpbnQgdGhlIGRhdGUgaW4gSVNPIDg2MDEgZm9ybWF0IC0tPg0KKwkJCTxjb252ZXJzaW9uUGF0dGVybiB2YWx1ZT0iJS01bGV2ZWwgJWxvZ2dlciAtICVtZXNzYWdlJW5ld2xpbmUiIC8+DQorCQk8L2xheW91dD4NCisJPC9hcHBlbmRlcj4NCisJDQorCTwhLS0gU2V0IHJvb3QgbG9nZ2VyIGxldmVsIHRvIERFQlVHIGFuZCBpdHMgb25seSBhcHBlbmRlciB0byBBMSAtLT4NCisJPHJvb3Q+DQorCQk8bGV2ZWwgdmFsdWU9IkRFQlVHIiAvPg0KKwkJPGFwcGVuZGVyLXJlZiByZWY9IkExIiAvPg0KKwk8L3Jvb3Q+DQorDQorPC9sb2c0bmV0Pg0KZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbGF1bmNoZXIubG9nLmNvbmYgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2xhdW5jaGVyLmxvZy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNDBjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2xhdW5jaGVyLmxvZy5jb25mCkBAIC0wLDAgKzEsMTggQEAKKzxsb2c0bmV0Pg0KKwk8IS0tIEExIGlzIHNldCB0byBiZSBhIENvbnNvbGVBcHBlbmRlciAtLT4NCisJPGFwcGVuZGVyIG5hbWU9IkExIiB0eXBlPSJsb2c0bmV0LkFwcGVuZGVyLkNvbnNvbGVBcHBlbmRlciI+DQorDQorCQk8IS0tIEExIHVzZXMgUGF0dGVybkxheW91dCAtLT4NCisJCTxsYXlvdXQgdHlwZT0ibG9nNG5ldC5MYXlvdXQuUGF0dGVybkxheW91dCI+DQorCQkJPCEtLSBQcmludCB0aGUgZGF0ZSBpbiBJU08gODYwMSBmb3JtYXQgLS0+DQorCQkJPGNvbnZlcnNpb25QYXR0ZXJuIHZhbHVlPSIlLTVsZXZlbCAlbG9nZ2VyIC0gJW1lc3NhZ2UlbmV3bGluZSIgLz4NCisJCTwvbGF5b3V0Pg0KKwk8L2FwcGVuZGVyPg0KKwkNCisJPCEtLSBTZXQgcm9vdCBsb2dnZXIgbGV2ZWwgdG8gREVCVUcgYW5kIGl0cyBvbmx5IGFwcGVuZGVyIHRvIEExIC0tPg0KKwk8cm9vdD4NCisJCTxsZXZlbCB2YWx1ZT0iREVCVUciIC8+DQorCQk8YXBwZW5kZXItcmVmIHJlZj0iQTEiIC8+DQorCTwvcm9vdD4NCisNCis8L2xvZzRuZXQ+DQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvRmFpbHVyZS5wbmcgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2xpYi9GYWlsdXJlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTQwMGIyCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvRmFpbHVyZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvSWdub3JlZC5wbmcgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2xpYi9JZ25vcmVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzhlZmJmCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvSWdub3JlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvSW5jb25jbHVzaXZlLnBuZyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbGliL0luY29uY2x1c2l2ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwN2I3YwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbGliL0luY29uY2x1c2l2ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvU2tpcHBlZC5wbmcgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2xpYi9Ta2lwcGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzlmYzY0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvU2tpcHBlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvU3VjY2Vzcy5wbmcgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2xpYi9TdWNjZXNzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTMwMTUwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvU3VjY2Vzcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvZml0LmRsbCBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbGliL2ZpdC5kbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiYmVmMAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbGliL2ZpdC5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbG9nNG5ldC5kbGwgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2xpYi9sb2c0bmV0LmRsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGEyZTFjCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbG9nNG5ldC5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQtY29uc29sZS1ydW5uZXIuZGxsIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQtY29uc29sZS1ydW5uZXIuZGxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MDljZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2xpYi9udW5pdC1jb25zb2xlLXJ1bm5lci5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQtZ3VpLXJ1bm5lci5kbGwgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2xpYi9udW5pdC1ndWktcnVubmVyLmRsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWVmYTczCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQtZ3VpLXJ1bm5lci5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQuY29yZS5kbGwgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2xpYi9udW5pdC5jb3JlLmRsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWRkNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQuY29yZS5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQuY29yZS5pbnRlcmZhY2VzLmRsbCBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbGliL251bml0LmNvcmUuaW50ZXJmYWNlcy5kbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjODc4OAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbGliL251bml0LmNvcmUuaW50ZXJmYWNlcy5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQuZml4dHVyZXMuZGxsIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQuZml4dHVyZXMuZGxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZDE5MzIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2xpYi9udW5pdC5maXh0dXJlcy5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQudWlleGNlcHRpb24uZGxsIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQudWlleGNlcHRpb24uZGxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMGMxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2xpYi9udW5pdC51aWV4Y2VwdGlvbi5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQudWlraXQuZGxsIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQudWlraXQuZGxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwODdkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2xpYi9udW5pdC51aWtpdC5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQudXRpbC5kbGwgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL2xpYi9udW5pdC51dGlsLmRsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjMxNWMyCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9saWIvbnVuaXQudXRpbC5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9udW5pdC1hZ2VudC14ODYuZXhlIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9udW5pdC1hZ2VudC14ODYuZXhlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViY2VlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL251bml0LWFnZW50LXg4Ni5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9udW5pdC1hZ2VudC14ODYuZXhlLmNvbmZpZyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQtYWdlbnQteDg2LmV4ZS5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjMjkwNgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQtYWdlbnQteDg2LmV4ZS5jb25maWcKQEAgLTAsMCArMSw2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8Y29uZmlndXJhdGlvbj4NCisgIA0KKyAgPHJ1bnRpbWU+DQorICAgIDwhLS0gV2UgbmVlZCB0aGlzIHNvIHRlc3QgZXhjZXB0aW9ucyBkb24ndCBjcmFzaCBOVW5pdCAtLT4NCisgICAgPGxlZ2FjeVVuaGFuZGxlZEV4Y2VwdGlvblBvbGljeSBlbmFibGVkPSIxIiAvPg0KKw0KKyAgICA8IS0tIExvb2sgZm9yIGFkZGlucyBpbiB0aGUgYWRkaW5zIGRpcmVjdG9yeSBmb3Igbm93IC0tPg0KKyAgICA8YXNzZW1ibHlCaW5kaW5nIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSI+DQorICAgICAgPHByb2JpbmcgcHJpdmF0ZVBhdGg9ImxpYjthZGRpbnMiLz4NCisgICA8L2Fzc2VtYmx5QmluZGluZz4NCisNCisgICAgPCEtLQ0KKyAgICBUaGUgZm9sbG93aW5nIDxhc3NlbWJseUJpbmRpbmc+IHNlY3Rpb24gYWxsb3dzIHJ1bm5pbmcgbnVuaXQgdW5kZXIgDQorICAgIC5ORVQgMS4wIGJ5IHJlZGlyZWN0aW5nIGFzc2VtYmxpZXMuIFRoZSBhcHBsaWVzVG8gYXR0cmlidXRlDQorICAgIGNhdXNlcyB0aGUgc2VjdGlvbiB0byBiZSBpZ25vcmVkIGV4Y2VwdCB1bmRlciAuTkVUIDEuMA0KKyAgICBvbiBhIG1hY2hpbmUgd2l0aCBvbmx5IHRoZSAuTkVUIHZlcnNpb24gMS4wIHJ1bnRpbWUgaW5zdGFsbGVkLg0KKyAgICBJZiBhcHBsaWNhdGlvbiBhbmQgaXRzIHRlc3RzIHdlcmUgYnVpbHQgZm9yIC5ORVQgMS4xIHlvdSB3aWxsDQorICAgIGFsc28gbmVlZCB0byByZWRpcmVjdCBzeXN0ZW0gYXNzZW1ibGllcyBpbiB0aGUgdGVzdCBjb25maWcgZmlsZSwNCisgICAgd2hpY2ggY29udHJvbHMgbG9hZGluZyBvZiB0aGUgdGVzdHMuDQorICAgLS0+DQorICAgIDxhc3NlbWJseUJpbmRpbmcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIg0KKwkJCWFwcGxpZXNUbz0idjEuMC4zNzA1Ij4NCisNCisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+IA0KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5IiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PiANCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5EYXRhIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5IiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PiANCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5EcmF3aW5nIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiMDNmNWY3ZjExZDUwYTNhIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PiANCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XaW5kb3dzLkZvcm1zIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5IiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PiANCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5YbWwiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljS2V5VG9rZW49ImI3N2E1YzU2MTkzNGUwODkiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VsdHVyZT0ibmV1dHJhbCIvPg0KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCAgb2xkVmVyc2lvbj0iMS4wLjUwMDAuMCIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIi8+DQorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4NCisNCisgICAgPC9hc3NlbWJseUJpbmRpbmc+DQorICANCisgIDwvcnVudGltZT4NCisgIA0KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL251bml0LWFnZW50LmV4ZSBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQtYWdlbnQuZXhlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNDFmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL251bml0LWFnZW50LmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL251bml0LWFnZW50LmV4ZS5jb25maWcgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL251bml0LWFnZW50LmV4ZS5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjMjkwNgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQtYWdlbnQuZXhlLmNvbmZpZwpAQCAtMCwwICsxLDY5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxjb25maWd1cmF0aW9uPg0KKyAgDQorICA8cnVudGltZT4NCisgICAgPCEtLSBXZSBuZWVkIHRoaXMgc28gdGVzdCBleGNlcHRpb25zIGRvbid0IGNyYXNoIE5Vbml0IC0tPg0KKyAgICA8bGVnYWN5VW5oYW5kbGVkRXhjZXB0aW9uUG9saWN5IGVuYWJsZWQ9IjEiIC8+DQorDQorICAgIDwhLS0gTG9vayBmb3IgYWRkaW5zIGluIHRoZSBhZGRpbnMgZGlyZWN0b3J5IGZvciBub3cgLS0+DQorICAgIDxhc3NlbWJseUJpbmRpbmcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIj4NCisgICAgICA8cHJvYmluZyBwcml2YXRlUGF0aD0ibGliO2FkZGlucyIvPg0KKyAgIDwvYXNzZW1ibHlCaW5kaW5nPg0KKw0KKyAgICA8IS0tDQorICAgIFRoZSBmb2xsb3dpbmcgPGFzc2VtYmx5QmluZGluZz4gc2VjdGlvbiBhbGxvd3MgcnVubmluZyBudW5pdCB1bmRlciANCisgICAgLk5FVCAxLjAgYnkgcmVkaXJlY3RpbmcgYXNzZW1ibGllcy4gVGhlIGFwcGxpZXNUbyBhdHRyaWJ1dGUNCisgICAgY2F1c2VzIHRoZSBzZWN0aW9uIHRvIGJlIGlnbm9yZWQgZXhjZXB0IHVuZGVyIC5ORVQgMS4wDQorICAgIG9uIGEgbWFjaGluZSB3aXRoIG9ubHkgdGhlIC5ORVQgdmVyc2lvbiAxLjAgcnVudGltZSBpbnN0YWxsZWQuDQorICAgIElmIGFwcGxpY2F0aW9uIGFuZCBpdHMgdGVzdHMgd2VyZSBidWlsdCBmb3IgLk5FVCAxLjEgeW91IHdpbGwNCisgICAgYWxzbyBuZWVkIHRvIHJlZGlyZWN0IHN5c3RlbSBhc3NlbWJsaWVzIGluIHRoZSB0ZXN0IGNvbmZpZyBmaWxlLA0KKyAgICB3aGljaCBjb250cm9scyBsb2FkaW5nIG9mIHRoZSB0ZXN0cy4NCisgICAtLT4NCisgICAgPGFzc2VtYmx5QmluZGluZyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiDQorCQkJYXBwbGllc1RvPSJ2MS4wLjM3MDUiPg0KKw0KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4gDQorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0iIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljS2V5VG9rZW49ImI3N2E1YzU2MTkzNGUwODkiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VsdHVyZT0ibmV1dHJhbCIvPg0KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCAgb2xkVmVyc2lvbj0iMS4wLjUwMDAuMCIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIi8+DQorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4NCisNCisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+IA0KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLkRhdGEiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljS2V5VG9rZW49ImI3N2E1YzU2MTkzNGUwODkiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VsdHVyZT0ibmV1dHJhbCIvPg0KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCAgb2xkVmVyc2lvbj0iMS4wLjUwMDAuMCIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIi8+DQorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4NCisNCisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+IA0KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLkRyYXdpbmciIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljS2V5VG9rZW49ImIwM2Y1ZjdmMTFkNTBhM2EiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VsdHVyZT0ibmV1dHJhbCIvPg0KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCAgb2xkVmVyc2lvbj0iMS4wLjUwMDAuMCIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIi8+DQorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4NCisNCisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+IA0KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldpbmRvd3MuRm9ybXMiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljS2V5VG9rZW49ImI3N2E1YzU2MTkzNGUwODkiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VsdHVyZT0ibmV1dHJhbCIvPg0KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCAgb2xkVmVyc2lvbj0iMS4wLjUwMDAuMCIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIi8+DQorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4NCisNCisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+IA0KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLlhtbCIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNLZXlUb2tlbj0iYjc3YTVjNTYxOTM0ZTA4OSIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjdWx0dXJlPSJuZXV0cmFsIi8+DQorICAgICAgICA8YmluZGluZ1JlZGlyZWN0ICBvbGRWZXJzaW9uPSIxLjAuNTAwMC4wIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZlcnNpb249IjEuMC4zMzAwLjAiLz4NCisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5Pg0KKw0KKyAgICA8L2Fzc2VtYmx5QmluZGluZz4NCisgIA0KKyAgPC9ydW50aW1lPg0KKyAgDQorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQtY29uc29sZS14ODYuZXhlIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9udW5pdC1jb25zb2xlLXg4Ni5leGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4YWM5YwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQtY29uc29sZS14ODYuZXhlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQtY29uc29sZS14ODYuZXhlLmNvbmZpZyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQtY29uc29sZS14ODYuZXhlLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTkyYjViCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9udW5pdC1jb25zb2xlLXg4Ni5leGUuY29uZmlnCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPGNvbmZpZ3VyYXRpb24+DQorDQorICA8cnVudGltZT4NCisgICAgPCEtLSBXZSBuZWVkIHRoaXMgc28gdGVzdCBleGNlcHRpb25zIGRvbid0IGNyYXNoIE5Vbml0IC0tPg0KKyAgICA8bGVnYWN5VW5oYW5kbGVkRXhjZXB0aW9uUG9saWN5IGVuYWJsZWQ9IjEiIC8+DQorDQorICAgIDwhLS0gTG9vayBmb3IgYWRkaW5zIGluIHRoZSBhZGRpbnMgZGlyZWN0b3J5IGZvciBub3cgLS0+DQorICAgIDxhc3NlbWJseUJpbmRpbmcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIj4NCisgICAgICA8cHJvYmluZyBwcml2YXRlUGF0aD0ibGliO2FkZGlucyIvPg0KKyAgIDwvYXNzZW1ibHlCaW5kaW5nPg0KKw0KKyAgIDwhLS0NCisgICAgVGhlIGZvbGxvd2luZyA8YXNzZW1ibHlCaW5kaW5nPiBzZWN0aW9uIGFsbG93cyBydW5uaW5nIG51bml0IHVuZGVyIA0KKyAgICAuTkVUIDEuMCBieSByZWRpcmVjdGluZyBhc3NlbWJsaWVzLiBUaGUgYXBwbGllc1RvIGF0dHJpYnV0ZQ0KKyAgICBjYXVzZXMgdGhlIHNlY3Rpb24gdG8gYmUgaWdub3JlZCBleGNlcHQgdW5kZXIgLk5FVCAxLjANCisgICAgb24gYSBtYWNoaW5lIHdpdGggb25seSB0aGUgLk5FVCB2ZXJzaW9uIDEuMCBydW50aW1lIGluc3RhbGxlZC4NCisgICAgSWYgYXBwbGljYXRpb24gYW5kIGl0cyB0ZXN0cyB3ZXJlIGJ1aWx0IGZvciAuTkVUIDEuMSB5b3Ugd2lsbA0KKyAgICBhbHNvIG5lZWQgdG8gcmVkaXJlY3Qgc3lzdGVtIGFzc2VtYmxpZXMgaW4gdGhlIHRlc3QgY29uZmlnIGZpbGUsDQorICAgIHdoaWNoIGNvbnRyb2xzIGxvYWRpbmcgb2YgdGhlIHRlc3RzLg0KKyAgIC0tPg0KKyAgIDxhc3NlbWJseUJpbmRpbmcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIg0KKwkJCWFwcGxpZXNUbz0idjEuMC4zNzA1Ij4NCisNCisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+IA0KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5IiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PiANCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5EYXRhIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5IiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PiANCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5EcmF3aW5nIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiMDNmNWY3ZjExZDUwYTNhIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PiANCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XaW5kb3dzLkZvcm1zIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5IiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PiANCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5YbWwiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljS2V5VG9rZW49ImI3N2E1YzU2MTkzNGUwODkiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VsdHVyZT0ibmV1dHJhbCIvPg0KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCAgb2xkVmVyc2lvbj0iMS4wLjUwMDAuMCIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIi8+DQorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4NCisNCisgICAgPC9hc3NlbWJseUJpbmRpbmc+DQorDQorICA8L3J1bnRpbWU+DQorICANCis8L2NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9udW5pdC1jb25zb2xlLmV4ZSBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQtY29uc29sZS5leGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0NGE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQtY29uc29sZS5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9udW5pdC14ODYuZXhlIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9udW5pdC14ODYuZXhlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMzQyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL251bml0LXg4Ni5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9udW5pdC14ODYuZXhlLmNvbmZpZyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQteDg2LmV4ZS5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwMzIwZQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQteDg2LmV4ZS5jb25maWcKQEAgLTAsMCArMSw4MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8Y29uZmlndXJhdGlvbj4NCisgIDwhLS0NCisgICAgIEFwcGxpY2F0aW9uIHNldHRpbmdzIGZvciBOVW5pdC1ndWkuZXhlLiBEbyBOT1QgcHV0IHNldHRpbmdzDQorCSBmb3IgdXNlIGJ5IHlvdXIgdGVzdHMgaGVyZS4NCisJLS0+DQorICA8YXBwU2V0dGluZ3M+DQorICAgIDwhLS0NCisgICAgIFVuY29tbWVudCB0byBzcGVjaWZ5IHRoZSB1cmwgdG8gYmUgdXNlZCBmb3IgaGVscC4gSWYgbm90IHVzZWQsIHRoZQ0KKyAgICAgZGVmYXVsdCB2YWx1ZSBpcyBzb21ldGhpbmcgbGlrZQ0KKwkJZmlsZTovL2xvY2FsaG9zdC9DOi9Qcm9ncmFtIEZpbGVzL05Vbml0IDIuMi9kb2MvaW5kZXguaHRtbA0KKwkgVGhpcyBzZXR0aW5nIGlzIHByb3ZpZGVkIGluIGNhc2UgeW91ciBkZWZhdWx0IGJyb3dzZXIgZG9lc24ndA0KKwkgc3VwcG9ydCB0aGlzIGZvcm1hdC4NCisJLS0+DQorICAgIDwhLS0gPGFkZCBrZXk9ImhlbHBVcmwiIHZhbHVlPSJodHRwOi8vd3d3Lm51bml0Lm9yZyIgLz4gLS0+DQorICA8L2FwcFNldHRpbmdzPg0KKw0KKyAgPHJ1bnRpbWU+DQorICAgIDwhLS0gV2UgbmVlZCB0aGlzIHNvIHRlc3QgZXhjZXB0aW9ucyBkb24ndCBjcmFzaCBOVW5pdCAtLT4NCisgICAgPGxlZ2FjeVVuaGFuZGxlZEV4Y2VwdGlvblBvbGljeSBlbmFibGVkPSIxIiAvPg0KKw0KKyAgICA8IS0tIExvb2sgZm9yIGFkZGlucyBpbiB0aGUgYWRkaW5zIGRpcmVjdG9yeSBmb3Igbm93IC0tPg0KKyAgICA8YXNzZW1ibHlCaW5kaW5nIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSI+DQorICAgICAgPHByb2JpbmcgcHJpdmF0ZVBhdGg9ImxpYjthZGRpbnMiIC8+DQorICAgIDwvYXNzZW1ibHlCaW5kaW5nPg0KKw0KKyAgICA8IS0tDQorICAgIFRoZSBmb2xsb3dpbmcgPGFzc2VtYmx5QmluZGluZz4gc2VjdGlvbiBhbGxvd3MgcnVubmluZyBudW5pdCB1bmRlciANCisgICAgLk5FVCAxLjAgYnkgcmVkaXJlY3RpbmcgYXNzZW1ibGllcy4gVGhlIGFwcGxpZXNUbyBhdHRyaWJ1dGUNCisgICAgY2F1c2VzIHRoZSBzZWN0aW9uIHRvIGJlIGlnbm9yZWQgZXhjZXB0IHVuZGVyIC5ORVQgMS4wDQorICAgIG9uIGEgbWFjaGluZSB3aXRoIG9ubHkgdGhlIC5ORVQgdmVyc2lvbiAxLjAgcnVudGltZSBpbnN0YWxsZWQuDQorICAgIElmIGFwcGxpY2F0aW9uIGFuZCBpdHMgdGVzdHMgd2VyZSBidWlsdCBmb3IgLk5FVCAxLjEgeW91IHdpbGwNCisgICAgYWxzbyBuZWVkIHRvIHJlZGlyZWN0IHN5c3RlbSBhc3NlbWJsaWVzIGluIHRoZSB0ZXN0IGNvbmZpZyBmaWxlLA0KKyAgICB3aGljaCBjb250cm9scyBsb2FkaW5nIG9mIHRoZSB0ZXN0cy4NCisgICAtLT4NCisgICAgPGFzc2VtYmx5QmluZGluZyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiDQorICAgICAgIGFwcGxpZXNUbz0idjEuMC4zNzA1Ij4NCisNCisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+DQorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0iDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNLZXlUb2tlbj0iYjc3YTVjNTYxOTM0ZTA4OSINCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiDQorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIi8+DQorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4NCisNCisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+DQorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uRGF0YSINCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VsdHVyZT0ibmV1dHJhbCIvPg0KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCAgb2xkVmVyc2lvbj0iMS4wLjUwMDAuMCINCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZlcnNpb249IjEuMC4zMzAwLjAiLz4NCisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5Pg0KKw0KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4NCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5EcmF3aW5nIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljS2V5VG9rZW49ImIwM2Y1ZjdmMTFkNTBhM2EiDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjdWx0dXJlPSJuZXV0cmFsIi8+DQorICAgICAgICA8YmluZGluZ1JlZGlyZWN0ICBvbGRWZXJzaW9uPSIxLjAuNTAwMC4wIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5Pg0KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldpbmRvd3MuRm9ybXMiDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNLZXlUb2tlbj0iYjc3YTVjNTYxOTM0ZTA4OSINCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiDQorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIi8+DQorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4NCisNCisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+DQorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uWG1sIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljS2V5VG9rZW49ImI3N2E1YzU2MTkzNGUwODkiDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjdWx0dXJlPSJuZXV0cmFsIi8+DQorICAgICAgICA8YmluZGluZ1JlZGlyZWN0ICBvbGRWZXJzaW9uPSIxLjAuNTAwMC4wIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgIDwvYXNzZW1ibHlCaW5kaW5nPg0KKw0KKyAgPC9ydW50aW1lPg0KKw0KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL251bml0LmV4ZSBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQuZXhlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOGIwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL251bml0LmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL251bml0LmV4ZS5jb25maWcgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL251bml0LmV4ZS5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwMzIwZQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQuZXhlLmNvbmZpZwpAQCAtMCwwICsxLDgzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxjb25maWd1cmF0aW9uPg0KKyAgPCEtLQ0KKyAgICAgQXBwbGljYXRpb24gc2V0dGluZ3MgZm9yIE5Vbml0LWd1aS5leGUuIERvIE5PVCBwdXQgc2V0dGluZ3MNCisJIGZvciB1c2UgYnkgeW91ciB0ZXN0cyBoZXJlLg0KKwktLT4NCisgIDxhcHBTZXR0aW5ncz4NCisgICAgPCEtLQ0KKyAgICAgVW5jb21tZW50IHRvIHNwZWNpZnkgdGhlIHVybCB0byBiZSB1c2VkIGZvciBoZWxwLiBJZiBub3QgdXNlZCwgdGhlDQorICAgICBkZWZhdWx0IHZhbHVlIGlzIHNvbWV0aGluZyBsaWtlDQorCQlmaWxlOi8vbG9jYWxob3N0L0M6L1Byb2dyYW0gRmlsZXMvTlVuaXQgMi4yL2RvYy9pbmRleC5odG1sDQorCSBUaGlzIHNldHRpbmcgaXMgcHJvdmlkZWQgaW4gY2FzZSB5b3VyIGRlZmF1bHQgYnJvd3NlciBkb2Vzbid0DQorCSBzdXBwb3J0IHRoaXMgZm9ybWF0Lg0KKwktLT4NCisgICAgPCEtLSA8YWRkIGtleT0iaGVscFVybCIgdmFsdWU9Imh0dHA6Ly93d3cubnVuaXQub3JnIiAvPiAtLT4NCisgIDwvYXBwU2V0dGluZ3M+DQorDQorICA8cnVudGltZT4NCisgICAgPCEtLSBXZSBuZWVkIHRoaXMgc28gdGVzdCBleGNlcHRpb25zIGRvbid0IGNyYXNoIE5Vbml0IC0tPg0KKyAgICA8bGVnYWN5VW5oYW5kbGVkRXhjZXB0aW9uUG9saWN5IGVuYWJsZWQ9IjEiIC8+DQorDQorICAgIDwhLS0gTG9vayBmb3IgYWRkaW5zIGluIHRoZSBhZGRpbnMgZGlyZWN0b3J5IGZvciBub3cgLS0+DQorICAgIDxhc3NlbWJseUJpbmRpbmcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIj4NCisgICAgICA8cHJvYmluZyBwcml2YXRlUGF0aD0ibGliO2FkZGlucyIgLz4NCisgICAgPC9hc3NlbWJseUJpbmRpbmc+DQorDQorICAgIDwhLS0NCisgICAgVGhlIGZvbGxvd2luZyA8YXNzZW1ibHlCaW5kaW5nPiBzZWN0aW9uIGFsbG93cyBydW5uaW5nIG51bml0IHVuZGVyIA0KKyAgICAuTkVUIDEuMCBieSByZWRpcmVjdGluZyBhc3NlbWJsaWVzLiBUaGUgYXBwbGllc1RvIGF0dHJpYnV0ZQ0KKyAgICBjYXVzZXMgdGhlIHNlY3Rpb24gdG8gYmUgaWdub3JlZCBleGNlcHQgdW5kZXIgLk5FVCAxLjANCisgICAgb24gYSBtYWNoaW5lIHdpdGggb25seSB0aGUgLk5FVCB2ZXJzaW9uIDEuMCBydW50aW1lIGluc3RhbGxlZC4NCisgICAgSWYgYXBwbGljYXRpb24gYW5kIGl0cyB0ZXN0cyB3ZXJlIGJ1aWx0IGZvciAuTkVUIDEuMSB5b3Ugd2lsbA0KKyAgICBhbHNvIG5lZWQgdG8gcmVkaXJlY3Qgc3lzdGVtIGFzc2VtYmxpZXMgaW4gdGhlIHRlc3QgY29uZmlnIGZpbGUsDQorICAgIHdoaWNoIGNvbnRyb2xzIGxvYWRpbmcgb2YgdGhlIHRlc3RzLg0KKyAgIC0tPg0KKyAgICA8YXNzZW1ibHlCaW5kaW5nIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSINCisgICAgICAgYXBwbGllc1RvPSJ2MS4wLjM3MDUiPg0KKw0KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4NCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbSINCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VsdHVyZT0ibmV1dHJhbCIvPg0KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCAgb2xkVmVyc2lvbj0iMS4wLjUwMDAuMCINCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZlcnNpb249IjEuMC4zMzAwLjAiLz4NCisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5Pg0KKw0KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4NCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5EYXRhIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljS2V5VG9rZW49ImI3N2E1YzU2MTkzNGUwODkiDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjdWx0dXJlPSJuZXV0cmFsIi8+DQorICAgICAgICA8YmluZGluZ1JlZGlyZWN0ICBvbGRWZXJzaW9uPSIxLjAuNTAwMC4wIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5Pg0KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLkRyYXdpbmciDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNLZXlUb2tlbj0iYjAzZjVmN2YxMWQ1MGEzYSINCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiDQorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIi8+DQorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4NCisNCisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+DQorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uV2luZG93cy5Gb3JtcyINCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VsdHVyZT0ibmV1dHJhbCIvPg0KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCAgb2xkVmVyc2lvbj0iMS4wLjUwMDAuMCINCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZlcnNpb249IjEuMC4zMzAwLjAiLz4NCisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5Pg0KKw0KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4NCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5YbWwiDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNLZXlUb2tlbj0iYjc3YTVjNTYxOTM0ZTA4OSINCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiDQorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIi8+DQorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4NCisNCisgICAgPC9hc3NlbWJseUJpbmRpbmc+DQorDQorICA8L3J1bnRpbWU+DQorDQorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQuZnJhbWV3b3JrLmRsbCBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvbnVuaXQuZnJhbWV3b3JrLmRsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODU2ZTUxCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9udW5pdC5mcmFtZXdvcmsuZGxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvcG51bml0LWFnZW50LmV4ZSBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvcG51bml0LWFnZW50LmV4ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTU1NWUxCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9wbnVuaXQtYWdlbnQuZXhlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvcG51bml0LWFnZW50LmV4ZS5jb25maWcgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL3BudW5pdC1hZ2VudC5leGUuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZDVmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL3BudW5pdC1hZ2VudC5leGUuY29uZmlnCkBAIC0wLDAgKzEsNzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxjb25maWd1cmF0aW9uPg0KKw0KKyAgPCEtLSBTZXQgdGhlIGxldmVsIGZvciB0cmFjaW5nIE5Vbml0IGl0c2VsZiAtLT4NCisgIDwhLS0gMD1PZmYgMT1FcnJvciAyPVdhcm5pbmcgMz1JbmZvIDQ9RGVidWcgLS0+DQorICA8c3lzdGVtLmRpYWdub3N0aWNzPg0KKwkgIDxzd2l0Y2hlcz4NCisgICAgICA8YWRkIG5hbWU9Ik5UcmFjZSIgdmFsdWU9IjAiIC8+DQorCSAgPC9zd2l0Y2hlcz4NCisgIDwvc3lzdGVtLmRpYWdub3N0aWNzPg0KKyAgDQorICA8cnVudGltZT4NCisgICAgPCEtLSBXZSBuZWVkIHRoaXMgc28gdGVzdCBleGNlcHRpb25zIGRvbid0IGNyYXNoIE5Vbml0IC0tPg0KKyAgICA8bGVnYWN5VW5oYW5kbGVkRXhjZXB0aW9uUG9saWN5IGVuYWJsZWQ9IjEiIC8+DQorDQorICAgIDwhLS0gTG9vayBmb3IgYWRkaW5zIGluIHRoZSBhZGRpbnMgZGlyZWN0b3J5IGZvciBub3cgLS0+DQorICAgIDxhc3NlbWJseUJpbmRpbmcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIj4NCisgICAgICA8cHJvYmluZyBwcml2YXRlUGF0aD0iZnJhbWV3b3JrO2xpYjthZGRpbnMiLz4NCisgICA8L2Fzc2VtYmx5QmluZGluZz4NCisNCisgICAgPCEtLQ0KKyAgICBUaGUgZm9sbG93aW5nIDxhc3NlbWJseUJpbmRpbmc+IHNlY3Rpb24gYWxsb3dzIHJ1bm5pbmcgbnVuaXQgdW5kZXIgDQorICAgIC5ORVQgMS4wIGJ5IHJlZGlyZWN0aW5nIGFzc2VtYmxpZXMuIFRoZSBhcHBsaWVzVG8gYXR0cmlidXRlDQorICAgIGNhdXNlcyB0aGUgc2VjdGlvbiB0byBiZSBpZ25vcmVkIGV4Y2VwdCB1bmRlciAuTkVUIDEuMA0KKyAgICBvbiBhIG1hY2hpbmUgd2l0aCBvbmx5IHRoZSAuTkVUIHZlcnNpb24gMS4wIHJ1bnRpbWUgaW5zdGFsbGVkLg0KKyAgICBJZiBhcHBsaWNhdGlvbiBhbmQgaXRzIHRlc3RzIHdlcmUgYnVpbHQgZm9yIC5ORVQgMS4xIHlvdSB3aWxsDQorICAgIGFsc28gbmVlZCB0byByZWRpcmVjdCBzeXN0ZW0gYXNzZW1ibGllcyBpbiB0aGUgdGVzdCBjb25maWcgZmlsZSwNCisgICAgd2hpY2ggY29udHJvbHMgbG9hZGluZyBvZiB0aGUgdGVzdHMuDQorICAgLS0+DQorICAgIDxhc3NlbWJseUJpbmRpbmcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIg0KKwkJCWFwcGxpZXNUbz0idjEuMC4zNzA1Ij4NCisNCisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+IA0KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5IiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PiANCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5EYXRhIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5IiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PiANCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5EcmF3aW5nIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiMDNmNWY3ZjExZDUwYTNhIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PiANCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XaW5kb3dzLkZvcm1zIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5IiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PiANCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5YbWwiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljS2V5VG9rZW49ImI3N2E1YzU2MTkzNGUwODkiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VsdHVyZT0ibmV1dHJhbCIvPg0KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCAgb2xkVmVyc2lvbj0iMS4wLjUwMDAuMCIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIi8+DQorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4NCisNCisgICAgPC9hc3NlbWJseUJpbmRpbmc+DQorICANCisgIDwvcnVudGltZT4NCisgIA0KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL3BudW5pdC1sYXVuY2hlci5leGUgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL3BudW5pdC1sYXVuY2hlci5leGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwZTU4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvcG51bml0LWxhdW5jaGVyLmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL3BudW5pdC1sYXVuY2hlci5leGUuY29uZmlnIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9wbnVuaXQtbGF1bmNoZXIuZXhlLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWQ1ZjdiCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9wbnVuaXQtbGF1bmNoZXIuZXhlLmNvbmZpZwpAQCAtMCwwICsxLDc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8Y29uZmlndXJhdGlvbj4NCisNCisgIDwhLS0gU2V0IHRoZSBsZXZlbCBmb3IgdHJhY2luZyBOVW5pdCBpdHNlbGYgLS0+DQorICA8IS0tIDA9T2ZmIDE9RXJyb3IgMj1XYXJuaW5nIDM9SW5mbyA0PURlYnVnIC0tPg0KKyAgPHN5c3RlbS5kaWFnbm9zdGljcz4NCisJICA8c3dpdGNoZXM+DQorICAgICAgPGFkZCBuYW1lPSJOVHJhY2UiIHZhbHVlPSIwIiAvPg0KKwkgIDwvc3dpdGNoZXM+DQorICA8L3N5c3RlbS5kaWFnbm9zdGljcz4NCisgIA0KKyAgPHJ1bnRpbWU+DQorICAgIDwhLS0gV2UgbmVlZCB0aGlzIHNvIHRlc3QgZXhjZXB0aW9ucyBkb24ndCBjcmFzaCBOVW5pdCAtLT4NCisgICAgPGxlZ2FjeVVuaGFuZGxlZEV4Y2VwdGlvblBvbGljeSBlbmFibGVkPSIxIiAvPg0KKw0KKyAgICA8IS0tIExvb2sgZm9yIGFkZGlucyBpbiB0aGUgYWRkaW5zIGRpcmVjdG9yeSBmb3Igbm93IC0tPg0KKyAgICA8YXNzZW1ibHlCaW5kaW5nIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSI+DQorICAgICAgPHByb2JpbmcgcHJpdmF0ZVBhdGg9ImZyYW1ld29yaztsaWI7YWRkaW5zIi8+DQorICAgPC9hc3NlbWJseUJpbmRpbmc+DQorDQorICAgIDwhLS0NCisgICAgVGhlIGZvbGxvd2luZyA8YXNzZW1ibHlCaW5kaW5nPiBzZWN0aW9uIGFsbG93cyBydW5uaW5nIG51bml0IHVuZGVyIA0KKyAgICAuTkVUIDEuMCBieSByZWRpcmVjdGluZyBhc3NlbWJsaWVzLiBUaGUgYXBwbGllc1RvIGF0dHJpYnV0ZQ0KKyAgICBjYXVzZXMgdGhlIHNlY3Rpb24gdG8gYmUgaWdub3JlZCBleGNlcHQgdW5kZXIgLk5FVCAxLjANCisgICAgb24gYSBtYWNoaW5lIHdpdGggb25seSB0aGUgLk5FVCB2ZXJzaW9uIDEuMCBydW50aW1lIGluc3RhbGxlZC4NCisgICAgSWYgYXBwbGljYXRpb24gYW5kIGl0cyB0ZXN0cyB3ZXJlIGJ1aWx0IGZvciAuTkVUIDEuMSB5b3Ugd2lsbA0KKyAgICBhbHNvIG5lZWQgdG8gcmVkaXJlY3Qgc3lzdGVtIGFzc2VtYmxpZXMgaW4gdGhlIHRlc3QgY29uZmlnIGZpbGUsDQorICAgIHdoaWNoIGNvbnRyb2xzIGxvYWRpbmcgb2YgdGhlIHRlc3RzLg0KKyAgIC0tPg0KKyAgICA8YXNzZW1ibHlCaW5kaW5nIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSINCisJCQlhcHBsaWVzVG89InYxLjAuMzcwNSI+DQorDQorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PiANCisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbSIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNLZXlUb2tlbj0iYjc3YTVjNTYxOTM0ZTA4OSIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjdWx0dXJlPSJuZXV0cmFsIi8+DQorICAgICAgICA8YmluZGluZ1JlZGlyZWN0ICBvbGRWZXJzaW9uPSIxLjAuNTAwMC4wIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZlcnNpb249IjEuMC4zMzAwLjAiLz4NCisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5Pg0KKw0KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4gDQorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uRGF0YSIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNLZXlUb2tlbj0iYjc3YTVjNTYxOTM0ZTA4OSIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjdWx0dXJlPSJuZXV0cmFsIi8+DQorICAgICAgICA8YmluZGluZ1JlZGlyZWN0ICBvbGRWZXJzaW9uPSIxLjAuNTAwMC4wIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZlcnNpb249IjEuMC4zMzAwLjAiLz4NCisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5Pg0KKw0KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4gDQorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uRHJhd2luZyIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNLZXlUb2tlbj0iYjAzZjVmN2YxMWQ1MGEzYSIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjdWx0dXJlPSJuZXV0cmFsIi8+DQorICAgICAgICA8YmluZGluZ1JlZGlyZWN0ICBvbGRWZXJzaW9uPSIxLjAuNTAwMC4wIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZlcnNpb249IjEuMC4zMzAwLjAiLz4NCisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5Pg0KKw0KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4gDQorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uV2luZG93cy5Gb3JtcyIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNLZXlUb2tlbj0iYjc3YTVjNTYxOTM0ZTA4OSIgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjdWx0dXJlPSJuZXV0cmFsIi8+DQorICAgICAgICA8YmluZGluZ1JlZGlyZWN0ICBvbGRWZXJzaW9uPSIxLjAuNTAwMC4wIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZlcnNpb249IjEuMC4zMzAwLjAiLz4NCisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5Pg0KKw0KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4gDQorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uWG1sIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleVRva2VuPSJiNzdhNWM1NjE5MzRlMDg5IiANCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bHR1cmU9Im5ldXRyYWwiLz4NCisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3QgIG9sZFZlcnNpb249IjEuMC41MDAwLjAiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmVyc2lvbj0iMS4wLjMzMDAuMCIvPg0KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+DQorDQorICAgIDwvYXNzZW1ibHlCaW5kaW5nPg0KKyAgDQorICA8L3J1bnRpbWU+DQorICANCis8L2NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9wbnVuaXQuZnJhbWV3b3JrLmRsbCBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvcG51bml0LmZyYW1ld29yay5kbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMxMDVkNwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvcG51bml0LmZyYW1ld29yay5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9wbnVuaXQudGVzdHMuZGxsIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9wbnVuaXQudGVzdHMuZGxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZTAxOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL3BudW5pdC50ZXN0cy5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9ydW5GaWxlLmV4ZSBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvcnVuRmlsZS5leGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5NDQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvcnVuRmlsZS5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy9ydW5GaWxlLmV4ZS5jb25maWcgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL3J1bkZpbGUuZXhlLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTkwOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9ydW5GaWxlLmV4ZS5jb25maWcKQEAgLTAsMCArMSw0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+DQorPGNvbmZpZ3VyYXRpb24+DQorICA8c3RhcnR1cD4NCisJICA8c3VwcG9ydGVkUnVudGltZSB2ZXJzaW9uPSJ2Mi4wLjUwNzI3IiAvPg0KKwkgIDxzdXBwb3J0ZWRSdW50aW1lIHZlcnNpb249InYyLjAuNTAyMTUiIC8+DQorCSAgPHN1cHBvcnRlZFJ1bnRpbWUgdmVyc2lvbj0idjIuMC40MDYwNyIgLz4NCisJICA8c3VwcG9ydGVkUnVudGltZSB2ZXJzaW9uPSJ2MS4xLjQzMjIiIC8+DQorCSAgPHN1cHBvcnRlZFJ1bnRpbWUgdmVyc2lvbj0idjEuMC4zNzA1IiAvPg0KKwkNCisJICA8cmVxdWlyZWRSdW50aW1lIHZlcnNpb249InYxLjAuMzcwNSIgLz4NCisgIDwvc3RhcnR1cD4NCisNCis8IS0tDQorICAgICBUaGUgZm9sbG93aW5nIDxydW50aW1lPiBzZWN0aW9uIGFsbG93cyBydW5uaW5nIG51bml0IHRlc3RzIHVuZGVyIA0KKyAgICAgLk5FVCAxLjAgYnkgcmVkaXJlY3RpbmcgYXNzZW1ibGllcy4gVGhlIGFwcGxpZXNUbyBhdHRyaWJ1dGUNCisgICAgIGNhdXNlcyB0aGUgc2VjdGlvbiB0byBiZSBpZ25vcmVkIGV4Y2VwdCB1bmRlciAuTkVUIDEuMC4NCisJLS0+DQorCTxydW50aW1lPg0KKwkJPGFzc2VtYmx5QmluZGluZyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiDQorCQkJCWFwcGxpZXNUbz0idjEuMC4zNzA1Ij4NCisJCQk8ZGVwZW5kZW50QXNzZW1ibHk+DQorCQkJCTxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbSIgcHVibGljS2V5VG9rZW49ImI3N2E1YzU2MTkzNGUwODkiIGN1bHR1cmU9IiIgLz4NCisJCQkJPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuNTAwMC4wIiBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIiAvPg0KKwkJCTwvZGVwZW5kZW50QXNzZW1ibHk+DQorCQkJPGRlcGVuZGVudEFzc2VtYmx5Pg0KKwkJCQk8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uRGF0YSIgcHVibGljS2V5VG9rZW49ImI3N2E1YzU2MTkzNGUwODkiIGN1bHR1cmU9IiIgLz4NCisJCQkJPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuNTAwMC4wIiBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIiAvPg0KKwkJCTwvZGVwZW5kZW50QXNzZW1ibHk+DQorCQkJPGRlcGVuZGVudEFzc2VtYmx5Pg0KKwkJCQk8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uRHJhd2luZyIgcHVibGljS2V5VG9rZW49ImIwM2Y1ZjdmMTFkNTBhM2EiIGN1bHR1cmU9IiIgLz4NCisJCQkJPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuNTAwMC4wIiBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIiAvPg0KKwkJCTwvZGVwZW5kZW50QXNzZW1ibHk+DQorCQkJPGRlcGVuZGVudEFzc2VtYmx5Pg0KKwkJCQk8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uV2luZG93cy5Gb3JtcyIgcHVibGljS2V5VG9rZW49ImI3N2E1YzU2MTkzNGUwODkiIGN1bHR1cmU9IiIgLz4NCisJCQkJPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuNTAwMC4wIiBuZXdWZXJzaW9uPSIxLjAuMzMwMC4wIiAvPg0KKwkJCTwvZGVwZW5kZW50QXNzZW1ibHk+DQorCQkJPGRlcGVuZGVudEFzc2VtYmx5Pg0KKwkJCQk8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uWG1sIiBwdWJsaWNLZXlUb2tlbj0iYjc3YTVjNTYxOTM0ZTA4OSIgY3VsdHVyZT0iIiAvPg0KKwkJCQk8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjEuMC41MDAwLjAiIG5ld1ZlcnNpb249IjEuMC4zMzAwLjAiIC8+DQorCQkJPC9kZXBlbmRlbnRBc3NlbWJseT4NCisJCTwvYXNzZW1ibHlCaW5kaW5nPg0KKwk8L3J1bnRpbWU+DQorPC9jb25maWd1cmF0aW9uPg0KZGlmZiAtLWdpdCBhL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvcnVucG51bml0LmJhdCBiL2NzaGFycC9saWIvTlVuaXQvdG9vbHMvcnVucG51bml0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWZjOGI0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy9ydW5wbnVuaXQuYmF0CkBAIC0wLDAgKzEsMiBAQAorc3RhcnQgcG51bml0LWFnZW50IGFnZW50LmNvbmYNCitwbnVuaXQtbGF1bmNoZXIgdGVzdC5jb25mClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9OVW5pdC90b29scy90ZXN0LmNvbmYgYi9jc2hhcnAvbGliL05Vbml0L3Rvb2xzL3Rlc3QuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzVlNzE4Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9OVW5pdC90b29scy90ZXN0LmNvbmYKQEAgLTAsMCArMSwyNCBAQAorPFRlc3RHcm91cD4NCisgICAgPFBhcmFsbGVsVGVzdHM+DQorDQorICAgICAgICA8UGFyYWxsZWxUZXN0Pg0KKyAgICAgICAgICAgIDxOYW1lPlRlc3Rpbmc8L05hbWU+DQorICAgICAgICAgICAgPFRlc3RzPg0KKyAgICAgICAgICAgICAgICA8VGVzdENvbmY+DQorICAgICAgICAgICAgICAgICAgICA8TmFtZT5UZXN0aW5nPC9OYW1lPg0KKyAgICAgICAgICAgICAgICAgICAgPEFzc2VtYmx5PnBudW5pdC50ZXN0cy5kbGw8L0Fzc2VtYmx5Pg0KKyAgICAgICAgICAgICAgICAgICAgPFRlc3RUb1J1bj5UZXN0TGlicmFyaWVzLlRlc3RpbmcuRXF1YWxUbzE5PC9UZXN0VG9SdW4+DQorICAgICAgICAgICAgICAgICAgICA8TWFjaGluZT5sb2NhbGhvc3Q6ODA4MDwvTWFjaGluZT4NCisgICAgICAgICAgICAgICAgICAgIDxUZXN0UGFyYW1zPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmc+Li5cc2VydmVyPC9zdHJpbmc+IDwhLS0gc2VydmVyIGRpciAtLT4NCisJCQk8c3RyaW5nPjwvc3RyaW5nPiA8IS0tIGRhdGFiYXNlIHNlcnZlciAtLT4NCisJCQk8c3RyaW5nPjwvc3RyaW5nPjwhLS0gY29ubiBzdHJpbmcgLS0+DQorICAgICAgICAgICAgICAgICAgICA8L1Rlc3RQYXJhbXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgPC9UZXN0Q29uZj4NCisNCisgICAgICAgICAgICA8L1Rlc3RzPg0KKyAgICAgICAgPC9QYXJhbGxlbFRlc3Q+DQorDQorDQorICAgIDwvUGFyYWxsZWxUZXN0cz4NCis8L1Rlc3RHcm91cD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL051R2V0LmV4ZSBiL2NzaGFycC9saWIvTnVHZXQuZXhlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDdlNDUKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL051R2V0LmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YW1wVmVyc2lvbi5MaWNlbnNlLnR4dCBiL2NzaGFycC9saWIvU3RhbXBWZXJzaW9uLkxpY2Vuc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YjUyNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL1N0YW1wVmVyc2lvbi5MaWNlbnNlLnR4dApAQCAtMCwwICsxLDIwMiBAQAorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KKw0KKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KKw0KKyAgIDEuIERlZmluaXRpb25zLg0KKw0KKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQorDQorICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQorDQorICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCisNCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCisNCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCisNCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KKw0KKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQorDQorICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQorICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCisNCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQorICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQorDQorICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCisNCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KKw0KKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQorDQorICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KKw0KKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQorDQorICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCisNCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCisNCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KKw0KKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCisNCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQorICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQorDQorICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCisNCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KKw0KKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQorDQorICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KKw0KKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUw0KKw0KKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4NCisNCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZw0KKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSINCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQ0KKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlDQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhDQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQ0KKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcg0KKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4NCisNCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0NCisNCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YW1wVmVyc2lvbi5leGUgYi9jc2hhcnAvbGliL1N0YW1wVmVyc2lvbi5leGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxN2M5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvU3RhbXBWZXJzaW9uLmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC9TdGF0TGlnaHQubnVwa2cgYi9jc2hhcnAvbGliL1N0YXRMaWdodC9TdGF0TGlnaHQubnVwa2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2YjQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvU3RhdExpZ2h0L1N0YXRMaWdodC5udXBrZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9Jb25pYy5aaXAuUmVkdWNlZC5kbGwgYi9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9Jb25pYy5aaXAuUmVkdWNlZC5kbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwNzQzNgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvU3RhdExpZ2h0L3Rvb2xzL0lvbmljLlppcC5SZWR1Y2VkLmRsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5MaWNlbnNlLnR4dCBiL2NzaGFycC9saWIvU3RhdExpZ2h0L3Rvb2xzL01pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLkxpY2Vuc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZjlmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9NaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5MaWNlbnNlLnR4dApAQCAtMCwwICsxLDExIEBACivvu79NU0ROIENPREUgR0FMTEVSWSBCSU5BUlkgTElDRU5TRSANCisNCitZb3UgYXJlIGZyZWUgdG8gaW5zdGFsbCwgdXNlLCBjb3B5IGFuZCBkaXN0cmlidXRlIGFueSBudW1iZXIgb2YgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgaW4gb2JqZWN0IGNvZGUgZm9ybSwgcHJvdmlkZWQgdGhhdCB5b3UgcmV0YWluOg0KKw0KK+KAoiBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kIGF0dHJpYnV0aW9uIG5vdGljZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgc29mdHdhcmUsIA0KK+KAoiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIA0KK+KAoiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBzb2Z0d2FyZS4gDQorDQorVGhlIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIOKAnGFzLWlzLuKAnSBZb3UgYmVhciB0aGUgcmlzayBvZiB1c2luZyBpdC4gTm8gZXhwcmVzcyB3YXJyYW50aWVzLCBndWFyYW50ZWVzIG9yIGNvbmRpdGlvbnMgYXJlIHByb3ZpZGVkLiBUbyB0aGUgZXh0ZW50IHBlcm1pdHRlZCB1bmRlciB5b3VyIGxvY2FsIGxhd3MsIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5LCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhbmQgbm9uLWluZnJpbmdlbWVudCBhcmUgZXhjbHVkZWQuIA0KKw0KK1RoaXMgbGljZW5zZSBkb2VzIG5vdCBncmFudCB5b3UgYW55IHJpZ2h0cyB0byB1c2UgYW55IG90aGVyIHBhcnR54oCZcyBuYW1lLCBsb2dvLCBvciB0cmFkZW1hcmtzLiBBbGwgcmlnaHRzIG5vdCBzcGVjaWZpY2FsbHkgZ3JhbnRlZCBoZXJlaW4gYXJlIHJlc2VydmVkLiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5BcHJpbDIwMTAueGFwIGIvY3NoYXJwL2xpYi9TdGF0TGlnaHQvdG9vbHMvU3RhdExpZ2h0LkNsaWVudC5Gb3IuQXByaWwyMDEwLnhhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTM0ZDQxCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9TdGF0TGlnaHQvdG9vbHMvU3RhdExpZ2h0LkNsaWVudC5Gb3IuQXByaWwyMDEwLnhhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5GZWIyMDExLnhhcCBiL2NzaGFycC9saWIvU3RhdExpZ2h0L3Rvb2xzL1N0YXRMaWdodC5DbGllbnQuRm9yLkZlYjIwMTEueGFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YjcxYjIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5GZWIyMDExLnhhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5KdWx5MjAwOS54YXAgYi9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5KdWx5MjAwOS54YXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNhMzdiNQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvU3RhdExpZ2h0L3Rvb2xzL1N0YXRMaWdodC5DbGllbnQuRm9yLkp1bHkyMDA5LnhhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5KdW5lMjAxMS54YXAgYi9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5KdW5lMjAxMS54YXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzMGEwOQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvU3RhdExpZ2h0L3Rvb2xzL1N0YXRMaWdodC5DbGllbnQuRm9yLkp1bmUyMDExLnhhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5NYXJjaDIwMTAueGFwIGIvY3NoYXJwL2xpYi9TdGF0TGlnaHQvdG9vbHMvU3RhdExpZ2h0LkNsaWVudC5Gb3IuTWFyY2gyMDEwLnhhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzE0Y2I1Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9TdGF0TGlnaHQvdG9vbHMvU3RhdExpZ2h0LkNsaWVudC5Gb3IuTWFyY2gyMDEwLnhhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5NYXkyMDEwLnhhcCBiL2NzaGFycC9saWIvU3RhdExpZ2h0L3Rvb2xzL1N0YXRMaWdodC5DbGllbnQuRm9yLk1heTIwMTAueGFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYmEwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5NYXkyMDEwLnhhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5Ob3ZlbWJlcjIwMDkueGFwIGIvY3NoYXJwL2xpYi9TdGF0TGlnaHQvdG9vbHMvU3RhdExpZ2h0LkNsaWVudC5Gb3IuTm92ZW1iZXIyMDA5LnhhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWY0YTcyCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9TdGF0TGlnaHQvdG9vbHMvU3RhdExpZ2h0LkNsaWVudC5Gb3IuTm92ZW1iZXIyMDA5LnhhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5PY3RvYmVyMjAwOS54YXAgYi9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5PY3RvYmVyMjAwOS54YXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwODljNQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvU3RhdExpZ2h0L3Rvb2xzL1N0YXRMaWdodC5DbGllbnQuRm9yLk9jdG9iZXIyMDA5LnhhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5Vbml0RHJpdmVuRGVjZW1iZXIyMDA5LnhhcCBiL2NzaGFycC9saWIvU3RhdExpZ2h0L3Rvb2xzL1N0YXRMaWdodC5DbGllbnQuRm9yLlVuaXREcml2ZW5EZWNlbWJlcjIwMDkueGFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YTEyZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5Vbml0RHJpdmVuRGVjZW1iZXIyMDA5LnhhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ2xpZW50LkZvci5YVW5pdENvbnRyaWJBcHJpbDIwMTEueGFwIGIvY3NoYXJwL2xpYi9TdGF0TGlnaHQvdG9vbHMvU3RhdExpZ2h0LkNsaWVudC5Gb3IuWFVuaXRDb250cmliQXByaWwyMDExLnhhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWZkNjRmCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9TdGF0TGlnaHQvdG9vbHMvU3RhdExpZ2h0LkNsaWVudC5Gb3IuWFVuaXRDb250cmliQXByaWwyMDExLnhhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ29yZS5kbGwgYi9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuQ29yZS5kbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwMTliOAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvU3RhdExpZ2h0L3Rvb2xzL1N0YXRMaWdodC5Db3JlLmRsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuRVVMQS50eHQgYi9jc2hhcnAvbGliL1N0YXRMaWdodC90b29scy9TdGF0TGlnaHQuRVVMQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwODEyOAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvU3RhdExpZ2h0L3Rvb2xzL1N0YXRMaWdodC5FVUxBLnR4dApAQCAtMCwwICsxLDMgQEAKK1NlZToNCisNCitodHRwOi8vc3RhdGxpZ2h0LmNvZGVwbGV4LmNvbS9saWNlbnNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9TdGF0TGlnaHQvdG9vbHMvU3RhdExpZ2h0LmV4ZSBiL2NzaGFycC9saWIvU3RhdExpZ2h0L3Rvb2xzL1N0YXRMaWdodC5leGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzODNhMwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvU3RhdExpZ2h0L3Rvb2xzL1N0YXRMaWdodC5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL2xpYi9wcm90b2MtbGljZW5zZS50eHQgYi9jc2hhcnAvbGliL3Byb3RvYy1saWNlbnNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzc5Y2IwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL2xpYi9wcm90b2MtbGljZW5zZS50eHQKQEAgLTAsMCArMSwzNiBAQAorcHJvdG9jLmV4ZSB3YXMgYnVpbHQgZnJvbSB0aGUgb3JpZ2luYWwgc291cmNlIGF0IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KK1RoZSBsaWNlbmNlIGZvciB0aGlzIGNvZGUgaXMgYXMgZm9sbG93czoKKworQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKK21ldDoKKworICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKK2NvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKK2luIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKK2Rpc3RyaWJ1dGlvbi4KKyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKK2NvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCit0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCitBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCitPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitDb2RlIGdlbmVyYXRlZCBieSB0aGUgUHJvdG9jb2wgQnVmZmVyIGNvbXBpbGVyIGlzIG93bmVkIGJ5IHRoZSBvd25lcgorb2YgdGhlIGlucHV0IGZpbGUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgaXQuICBUaGlzIGNvZGUgaXMgbm90CitzdGFuZGFsb25lIGFuZCByZXF1aXJlcyBhIHN1cHBvcnQgbGlicmFyeSB0byBiZSBsaW5rZWQgd2l0aCBpdC4gIFRoaXMKK3N1cHBvcnQgbGlicmFyeSBpcyBpdHNlbGYgY292ZXJlZCBieSB0aGUgYWJvdmUgbGljZW5zZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvbGliL3Byb3RvYy5leGUgYi9jc2hhcnAvbGliL3Byb3RvYy5leGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4ZDRhNQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWIvcHJvdG9jLmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvbGljZW5zZS50eHQgYi9jc2hhcnAvbGljZW5zZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxNWY3YgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9saWNlbnNlLnR4dApAQCAtMCwwICsxLDMxIEBACitQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCitDb3B5cmlnaHQgMjAwOC0yMDEwIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KK2h0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KK09yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KK2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisNCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorbWV0Og0KKw0KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCitjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQoraW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KK2Rpc3RyaWJ1dGlvbi4NCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCit0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKw0KK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCitPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KZGlmZiAtLWdpdCBhL2NzaGFycC9tb25vL2J1aWxkYWxsLnNoIGIvY3NoYXJwL21vbm8vYnVpbGRhbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmRkMDQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9tb25vL2J1aWxkYWxsLnNoCkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9iYXNoCisKKyMgQWRqdXN0IHRoZXNlIHRvIHJlZmxlY3QgdGhlIGxvY2F0aW9uIG9mIE5Vbml0IGluIHlvdXIgc3lzdGVtLAorIyBhbmQgaG93IHlvdSB3YW50IE5Vbml0IHRvIHJ1bgorTlVOSVQ9fi9wcm90b2J1Zi9OVW5pdC0yLjUuMC45MTIyL2Jpbi9uZXQtMi4wL251bml0LWNvbnNvbGUuZXhlCitOVU5JVF9PUFRJT05TPS1ub3NoYWRvdworCisjIFRoZSByZXN0IHNob3VsZCBiZSBva2F5LgorCitTUkM9Li4vc3JjCitMSUI9Li4vbGliCitLRVlGSUxFPS4uL2tleXMvR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbmsKKworcm0gLXJmIGJpbgorbWtkaXIgYmluCisKKyMgUnVubmluZyB0aGUgdW5pdCB0ZXN0cyByZXF1aXJlcyB0aGUgZGVwZW5kZW5jaWVzIGFyZQorIyBpbiB0aGUgYmluIGRpcmVjdG9yeSB0b28KK2NwIC1mICRMSUIve1JoaW5vLk1vY2tzLmRsbCxudW5pdC5mcmFtZXdvcmsuZGxsfSBiaW4KKworZWNobyBCdWlsZGluZyBtYWluIGxpYnJhcnkKK2dtY3MgLXRhcmdldDpsaWJyYXJ5IC1vdXQ6YmluL0dvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuZGxsIGBmaW5kICRTUkMvUHJvdG9jb2xCdWZmZXJzIC1uYW1lICcqLmNzJ2AgLWtleWZpbGU6JEtFWUZJTEUKKworZWNobyBCdWlsZGluZyBtYWluIGxpYnJhcnkgdGVzdHMKK2dtY3MgLXRhcmdldDpsaWJyYXJ5IC1vdXQ6YmluL0dvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdC5kbGwgYGZpbmQgJFNSQy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdCAtbmFtZSAnKi5jcydgIC1rZXlmaWxlOiRLRVlGSUxFIC1yOmJpbi9Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLmRsbCAtcjokTElCL251bml0LmZyYW1ld29yay5kbGwgLXI6JExJQi9SaGluby5Nb2Nrcy5kbGwKKworZWNobyBSdW5uaW5nIG1haW4gbGlicmFyeSB0ZXN0cworbW9ubyAkTlVOSVQgYmluL0dvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdC5kbGwgJE5VTklUX09QVElPTlMKKworZWNobyBCdWlsZGluZyBQcm90b0dlbgorZ21jcyAtdGFyZ2V0OmV4ZSAtb3V0OmJpbi9Qcm90b0dlbi5leGUgYGZpbmQgJFNSQy9Qcm90b0dlbiAtbmFtZSAnKi5jcydgIC1rZXlmaWxlOiRLRVlGSUxFIC1yOmJpbi9Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLmRsbAorCitlY2hvIEJ1aWxkaW5nIFByb3RvR2VuIHRlc3RzCitnbWNzIC10YXJnZXQ6bGlicmFyeSAtb3V0OmJpbi9Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvR2VuLlRlc3QuZGxsIGBmaW5kICRTUkMvUHJvdG9HZW4uVGVzdCAtbmFtZSAnKi5jcydgIC1rZXlmaWxlOiRLRVlGSUxFIC1yOmJpbi9Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLmRsbCAtcjokTElCL251bml0LmZyYW1ld29yay5kbGwgLXI6YmluL1Byb3RvR2VuLmV4ZQorCitlY2hvIFJ1bm5pbmcgUHJvdG9HZW4gdGVzdHMKK21vbm8gJE5VTklUIGJpbi9Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvR2VuLlRlc3QuZGxsICROVU5JVF9PUFRJT05TCmRpZmYgLS1naXQgYS9jc2hhcnAvbW9uby9nZW5lcmF0ZXNvdXJjZS5zaCBiL2NzaGFycC9tb25vL2dlbmVyYXRlc291cmNlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIxODQ0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbW9uby9nZW5lcmF0ZXNvdXJjZS5zaApAQCAtMCwwICsxLDI5IEBACisjIS9iaW4vYmFzaAorCitlY2hvIENvbXBpbGluZyBwcm90b2J1ZnMKK3JtIC1yZiB0bXAKK21rZGlyIHRtcAorUFJPVE9TX0RJUj0uLi9wcm90b3MKKworLi9wcm90b2MgLS1wcm90b19wYXRoPSRQUk9UT1NfRElSIC0tZGVzY3JpcHRvcl9zZXRfb3V0PXRtcC9jb21waWxlZC5wYiBcCisgICRQUk9UT1NfRElSL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIFwKKyAgJFBST1RPU19ESVIvZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIFwKKyAgJFBST1RPU19ESVIvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIFwKKyAgJFBST1RPU19ESVIvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2NzaGFycF9vcHRpb25zLnByb3RvIFwKKyAgJFBST1RPU19ESVIvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIFwKKyAgJFBST1RPU19ESVIvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90byBcCisgICRQUk9UT1NfRElSL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8gXAorICAkUFJPVE9TX0RJUi9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wcm90byBcCisgICRQUk9UT1NfRElSL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucHJvdG8gXAorICAkUFJPVE9TX0RJUi90dXRvcmlhbC9hZGRyZXNzYm9vay5wcm90bworCitjZCB0bXAKK2VjaG8gR2VuZXJhdGluZyBuZXcgc291cmNlCittb25vIC4uL2Jpbi9Qcm90b0dlbi5leGUgY29tcGlsZWQucGIKKworZWNobyBDb3B5aW5nIHNvdXJjZSBpbnRvIHBsYWNlCitjcCBEZXNjcmlwdG9yUHJvdG9GaWxlLmNzIENTaGFycE9wdGlvbnMuY3MgLi4vLi4vc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9yUHJvdG9zCitjcCBVbml0VGVzdCouY3MgLi4vLi4vc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MKK2NwIEFkZHJlc3NCb29rUHJvdG9zLmNzIC4uLy4uL3NyYy9BZGRyZXNzQm9vaworY2QgLi4KK3JtIC1yZiB0bXAKZGlmZiAtLWdpdCBhL2NzaGFycC9tb25vL3JlYWRtZS50eHQgYi9jc2hhcnAvbW9uby9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODczYTUKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvbW9uby9yZWFkbWUudHh0CkBAIC0wLDAgKzEsOTEgQEAKK0dldHRpbmcgc3RhcnRlZCB3aXRoIFByb3RvY29sIEJ1ZmZlcnMgb24gTW9ubworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ByZXJlcXVpc2l0ZXM6CisKK28gTW9ubyAyLjQgb3IgaGlnaGVyLiBFYXJsaWVyIHZlcnNpb25zIG9mIE1vbm8gaGFkIHRvbworICBtYW55IGlzc3VlcyB3aXRoIHRoZSB3ZWlyZCBhbmQgd29uZGVyZnVsIGdlbmVyaWMgdHlwZQorICByZWxhdGlvbnNoaXBzIGluIFByb3RvY29sIEJ1ZmZlcnMuIChFdmVuIE1vbm8gMi40ICpkaWQqCisgIGhhdmUgYSBmZXcgY29tcGlsZS10aW1lIHByb2JsZW1zLCBidXQgSSd2ZSB3b3JrZWQgcm91bmQgdGhlbS4pCisKK28gU29tZSBzb3J0IG9mIExpbnV4L1VuaXggc3lzdGVtCisgIFlvdSBjYW4gdHJ5IHJ1bm5pbmcgd2l0aCBCYXNoIG9uIFdpbmRvd3MgdmlhIE1JTkdXMzIgb3IKKyAgc29tZXRoaW5nIHNpbWlsYXIsIGJ1dCB5b3UncmUgb24geW91ciBvd24gOikgSXQncyBlYXNpZXIKKyAgdG8gYnVpbGQgYW5kIHRlc3QgZXZlcnl0aGluZyB3aXRoIC5ORVQgaWYgeW91J3JlIG9uCisgIFdpbmRvd3MuCisKK28gVGhlIG5hdGl2ZSBQcm90b2NvbCBCdWZmZXJzIGJ1aWxkIGZvciB5b3VyIHN5c3RlbS4KKyAgR2V0IGl0IGZyb20gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworICBBZnRlciBidWlsZGluZyBpdCwgY29weSB0aGUgZXhlY3V0YWJsZSBwcm90b2MKKyAgZmlsZSBpbnRvIHRoaXMgZGlyZWN0b3J5LgorICAKK28gVGhlIE5Vbml0IGJpbmFyaWVzIGZyb20gaHR0cDovL251bml0Lm9yZworICBJIGdlbmVyYWxseSBqdXN0IGRvd25sb2FkIHRoZSBsYXRlc3QgdmVyc2lvbiwgd2hpY2gKKyAgbWF5IG5vdCBiZSB0aGUgb25lIHdoaWNoIGdvZXMgd2l0aCBudW5pdC5mcmFtZXdvcmsuZGxsCisgIGluIC4uL2xpYiwgYnV0IEkndmUgbmV2ZXIgZm91bmQgdGhpcyB0byBiZSBhIHByb2JsZW0uCisgIAorQnVpbGRpbmcgdGhlIGNvZGUgd2l0aCBjdXJyZW50IHNvdXJjZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEpIEVkaXQgYnVpbGRhbGwuc2ggdG8gdGVsbCBpdCB3aGVyZSB0byBmaW5kIG51bml0LWNvbnNvbGUuZXhlCisgICAoYW5kIHBvc3NpYmx5IGNoYW5nZSBvdGhlciBvcHRpb25zKQorICAgCisyKSBSdW4gYnVpbGRhbGwuc2ggZnJvbSB0aGlzIGRpcmVjdG9yeS4gSXQgc2hvdWxkIGJ1aWxkIHRoZQorICAgbWFpbiBsaWJyYXJ5IGNvZGUgKyB0ZXN0cyBhbmQgUHJvdG9HZW4gY29kZSArIHRlc3RzLCBydW5uaW5nCisgICBlYWNoIHNldCBvZiB0ZXN0cyBhZnRlciBidWlsZGluZyBpdC4KKyAgIAorTm90ZSB0aGF0IGN1cnJlbnRseSBvbmUgdGVzdCBpcyBpZ25vcmVkIGluIFNlcnZpY2VUZXN0LmNzLiBUaGlzCittYWRlIHRoZSBNb25vIFZNIGJsb3cgdXAgLSBJIHN1c3BlY3QgaXQncyBzb21lIGludGVyYWN0aW9uIHdpdGgKK1JoaW5vIHdoaWNoIGRvZXNuJ3QgcXVpdGUgd29yayBvbiBNb25vIDIuNC4gSWYgeW91IHdhbnQgdG8gc2VlIGEKK3RydWx5IG5hc3R5IHN0YWNrIHRyYWNlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBJZ25vcmUgYXR0cmlidXRlIGluCitTZXJ2aWNlVGVzdC5jcyBhbmQgcmVydW4uCisKK1RoZSBiaW5hcmllcyB3aWxsIGJlIHByb2R1Y2VkIGluIGEgYmluIGRpcmVjdG9yeSB1bmRlciB0aGlzIG9uZS4gVGhlCitidWlsZCBjdXJyZW50bHkgc3RhcnRzIGZyb20gc2NyYXRjaCBlYWNoIHRpbWUsIGNsZWFuaW5nIG91dCB0aGUgYmluCitkaXJlY3RvcnkgZmlyc3QuIE9uY2UgSSd2ZSBkZWNpZGVkIG9uIGEgZnVsbCBOQW50IG9yIHhidWlsZAorc3RyYXRlZ3ksIEknbGwgZG8gc29tZXRoaW5nIGEgbGl0dGxlIGNsZWFuZXIuCisKK1JlYnVpbGRpbmcgc291cmNlcyBmb3IgZ2VuZXJhdGVkIGNvZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMSkgQnVpbGQgdGhlIGN1cnJlbnQgY29kZSBmaXJzdC4gVGhlIGJvb3RzdHJhcHBpbmcgaXNzdWUgaXMgd2h5CisgICB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIGlzIGluIHRoZSBzb3VyY2UgcmVwb3NpdG9yeSA6KSBTZWUKKyAgIHRoZSBzdGVwcyBhYm92ZS4KKyAgIAorMikgUnVuIGdlbmVyYXRlc291cmNlLnNoIGZyb20gdGhpcyBkaXJlY3RvcnkuIFRoaXMgd2lsbCBjcmVhdGUgYQorICAgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgY29tcGlsZSB0aGUgLnByb3RvIGZpbGVzIGludG8gYSBiaW5hcnkKKyAgIGZvcm1hdCwgdGhlbiBydW4gUHJvdG9HZW4gdG8gZ2VuZXJhdGUgLmNzIGZpbGVzIGZyb20gdGhlIGJpbmFyeQorICAgZm9ybWF0LiBJdCB3aWxsIGNvcHkgdGhlc2UgZmlsZXMgdG8gdGhlIHJpZ2h0IHBsYWNlcyBpbiB0aGUgdHJlZSwKKyAgIGFuZCBmaW5hbGx5IGRlbGV0ZSB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKyAgIAorMykgUmVidWlsZCB0byB0ZXN0IHRoYXQgeW91ciBuZXdseSBnZW5lcmF0ZWQgc291cmNlcyB3b3JrLiAoT3B0aW9uYWxseQorICAgcmVnZW5lcmF0ZSBhcyB3ZWxsLCBhbmQgaGFzaCB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvIGNoZWNrIHRoYXQKKyAgIHRoZSBuZXcgYnVpbGQgZ2VuZXJhdGVzIHRoZSBzYW1lIGNvZGUgYXMgdGhlIG9sZCBidWlsZCA6KQorICAgCitSdW5uaW5nIHRoZSBjb2RlCistLS0tLS0tLS0tLS0tLS0tCisKK09uY2UgeW91J3ZlIGJ1aWx0IHRoZSBiaW5hcmllcywgeW91IHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGVtIGp1c3QKK2FzIGlmIHlvdSdkIGJ1aWx0IHRoZW0gd2l0aCAuTkVULiAoQW5kIGluZGVlZCwgeW91IHNob3VsZCBiZSBhYmxlIHRvCit1c2UgYmluYXJpZXMgYnVpbHQgd2l0aCAuTkVUIGFzIGlmIHlvdSdkIGJ1aWx0IHRoZW0gd2l0aCBNb25vIDopCisKK1NlZSB0aGUgZ2V0dGluZyBzdGFydGVkIGd1aWRlIGZvciBtb3JlIGluZm9ybWF0aW9uOgoraHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLWNzaGFycC1wb3J0L3dpa2kvR2V0dGluZ1N0YXJ0ZWQKKworRkFRIChGcmVxdWVudGx5IEFudGljaXBhdGVkIFF1ZXN0aW9ucykKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1EpIFRoaXMgYnVpbGQgcHJvY2VzcyBzdWNrcyEgV2h5IGFyZW4ndCB5b3UgZG9pbmcgWCwgWSwgWj8KK0EpIE15IE1vbm8gc2tpbGxzIGFyZSBsaW1pdGVkLiBNeSBOQW50IHNraWxscyBhcmUgbGltaXRlZC4gTXkKKyAgIE1TQnVpbGQveGJ1aWxkIHNraWxzIGFyZSBsaW1pdGVkLiBNeSBzaGVsbCBzY3JpcHQgc2tpbGxzIGFyZQorICAgbGltaXRlZC4gQW55IGhlbHAgaXMgKnZlcnkqIHdlbGNvbWUhCisgICAKK1EpIFdoeSBkb2Vzbid0IGl0IGJ1aWxkIFByb3RvQmVuY2ggZXRjPworQSkgVGhpcyBpcyBhIGZpcnN0IGluaXRpYWwgInJlbGVhc2UiIEknbGwgYWRkIG1vcmUgYml0cyB0bworICAgdGhlIGJ1aWxkIHNjcmlwdC4gSSdsbCBiZSBpbnRlcmVzdGVkIHRvIHNlZSB0aGUgcmVzdWx0cworICAgb2YgYmVuY2htYXJraW5nIGl0IG9uIE1vbm8gOikKKworQW55IGZ1cnRoZXIgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zPyBQbGVhc2UgZW1haWwgc2tlZXRAcG9ib3guY29tCitvciBsZWF2ZSBhIHJlcXVlc3QgYXQKK2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi1jc2hhcnAtcG9ydC9pc3N1ZXMvbGlzdAorCmRpZmYgLS1naXQgYS9jc2hhcnAvcHJvdG9zL2JlbmNobWFya3MvZ29vZ2xlX3NpemUucHJvdG8gYi9jc2hhcnAvcHJvdG9zL2JlbmNobWFya3MvZ29vZ2xlX3NpemUucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0MmNhMgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9wcm90b3MvYmVuY2htYXJrcy9nb29nbGVfc2l6ZS5wcm90bwpAQCAtMCwwICsxLDE0MCBAQAoraW1wb3J0ICJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iOworb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykubmFtZXNwYWNlID0gIkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaCI7CitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS51bWJyZWxsYV9jbGFzc25hbWUgPSAiR29vZ2xlU2l6ZVByb3RvRmlsZSI7CisKK3BhY2thZ2UgYmVuY2htYXJrczsKKworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkdvb2dsZVNpemUiOworb3B0aW9uIG9wdGltaXplX2ZvciA9IENPREVfU0laRTsKKworbWVzc2FnZSBTaXplTWVzc2FnZTEgeworICByZXF1aXJlZCBzdHJpbmcgZmllbGQxID0gMTsKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkOSA9IDk7CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDE4ID0gMTg7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ4MCA9IDgwIFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDgxID0gODEgW2RlZmF1bHQ9dHJ1ZV07CisgIHJlcXVpcmVkIGludDMyIGZpZWxkMiA9IDI7CisgIHJlcXVpcmVkIGludDMyIGZpZWxkMyA9IDM7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjgwID0gMjgwOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDYgPSA2IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDIyID0gMjI7CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDQgPSA0OworICByZXBlYXRlZCBmaXhlZDY0IGZpZWxkNSA9IDU7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ1OSA9IDU5IFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkNyA9IDc7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTYgPSAxNjsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxMzAgPSAxMzAgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQxMiA9IDEyIFtkZWZhdWx0PXRydWVdOworICBvcHRpb25hbCBib29sIGZpZWxkMTcgPSAxNyBbZGVmYXVsdD10cnVlXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDEzID0gMTMgW2RlZmF1bHQ9dHJ1ZV07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQxNCA9IDE0IFtkZWZhdWx0PXRydWVdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDEwNCA9IDEwNCBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxMDAgPSAxMDAgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTAxID0gMTAxIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBzdHJpbmcgZmllbGQxMDIgPSAxMDI7CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDEwMyA9IDEwMzsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyOSA9IDI5IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBib29sIGZpZWxkMzAgPSAzMCBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkNjAgPSA2MCBbZGVmYXVsdD0tMV07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjcxID0gMjcxIFtkZWZhdWx0PS0xXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyNzIgPSAyNzIgW2RlZmF1bHQ9LTFdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDE1MCA9IDE1MDsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMyA9IDIzIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBib29sIGZpZWxkMjQgPSAyNCBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjUgPSAyNSBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBmaWVsZDE1ID0gMTU7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ3OCA9IDc4OworICBvcHRpb25hbCBpbnQzMiBmaWVsZDY3ID0gNjcgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkNjggPSA2ODsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxMjggPSAxMjggW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDEyOSA9IDEyOSBbZGVmYXVsdD0ieHh4eHh4eHh4eHh4eHh4eHh4eHh4Il07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTMxID0gMTMxIFtkZWZhdWx0PTBdOworfQorCittZXNzYWdlIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiBmaWVsZDEgPSAxIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIgPSAyIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDMgPSAzIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBzdHJpbmcgZmllbGQxNSA9IDE1OworICBvcHRpb25hbCBib29sIGZpZWxkMTIgPSAxMiBbZGVmYXVsdD10cnVlXTsKKyAgb3B0aW9uYWwgaW50NjQgZmllbGQxMyA9IDEzOworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDE0ID0gMTQ7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTYgPSAxNjsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxOSA9IDE5IFtkZWZhdWx0PTJdOworICBvcHRpb25hbCBib29sIGZpZWxkMjAgID0gMjAgW2RlZmF1bHQ9dHJ1ZV07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQyOCA9IDI4IFtkZWZhdWx0PXRydWVdOworICBvcHRpb25hbCBmaXhlZDY0IGZpZWxkMjEgPSAyMTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMiA9IDIyOworICBvcHRpb25hbCBib29sIGZpZWxkMjMgPSAyMyBbIGRlZmF1bHQ9ZmFsc2UgXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDIwNiA9IDIwNiBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIGZpeGVkMzIgZmllbGQyMDMgPSAyMDM7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjA0ID0gMjA0OworICBvcHRpb25hbCBzdHJpbmcgZmllbGQyMDUgPSAyMDU7CisgIG9wdGlvbmFsIHVpbnQ2NCBmaWVsZDIwNyA9IDIwNzsKKyAgb3B0aW9uYWwgdWludDY0IGZpZWxkMzAwID0gMzAwOworfQorCittZXNzYWdlIFNpemVNZXNzYWdlMiB7CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDEgPSAxOworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDMgPSAzOworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDQgPSA0OworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDMwID0gMzA7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ3NSAgPSA3NSBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDYgPSA2OworICBvcHRpb25hbCBieXRlcyBmaWVsZDIgPSAyOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIxID0gMjEgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkNzEgPSA3MTsKKyAgb3B0aW9uYWwgZmxvYXQgZmllbGQyNSA9IDI1OworICBvcHRpb25hbCBpbnQzMiBmaWVsZDEwOSA9IDEwOSBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMTAgPSAyMTAgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjExID0gMjExIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIxMiA9IDIxMiBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMTMgPSAyMTMgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjE2ID0gMjE2IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIxNyA9IDIxNyBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMTggPSAyMTggW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjIwID0gMjIwIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIyMSA9IDIyMSBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgZmxvYXQgZmllbGQyMjIgPSAyMjIgW2RlZmF1bHQ9MC4wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQ2MyA9IDYzOworCisgIHJlcGVhdGVkIGdyb3VwIEdyb3VwMSA9IDEwIHsKKyAgICByZXF1aXJlZCBmbG9hdCBmaWVsZDExID0gMTE7CisgICAgb3B0aW9uYWwgZmxvYXQgZmllbGQyNiA9IDI2OworICAgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDEyID0gMTI7CisgICAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkMTMgPSAxMzsKKyAgICByZXBlYXRlZCBzdHJpbmcgZmllbGQxNCA9IDE0OworICAgIHJlcXVpcmVkIHVpbnQ2NCBmaWVsZDE1ID0gMTU7CisgICAgb3B0aW9uYWwgaW50MzIgZmllbGQ1ID0gNTsKKyAgICBvcHRpb25hbCBzdHJpbmcgZmllbGQyNyA9IDI3OworICAgIG9wdGlvbmFsIGludDMyIGZpZWxkMjggPSAyODsKKyAgICBvcHRpb25hbCBzdHJpbmcgZmllbGQyOSA9IDI5OworICAgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDE2ID0gMTY7CisgICAgcmVwZWF0ZWQgc3RyaW5nIGZpZWxkMjIgPSAyMjsKKyAgICByZXBlYXRlZCBpbnQzMiBmaWVsZDczID0gNzM7CisgICAgb3B0aW9uYWwgaW50MzIgZmllbGQyMCA9IDIwIFtkZWZhdWx0PTBdOworICAgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDI0ID0gMjQ7CisgICAgb3B0aW9uYWwgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgZmllbGQzMSA9IDMxOworICB9CisgIHJlcGVhdGVkIHN0cmluZyBmaWVsZDEyOCA9IDEyODsKKyAgb3B0aW9uYWwgaW50NjQgZmllbGQxMzEgPSAxMzE7CisgIHJlcGVhdGVkIHN0cmluZyBmaWVsZDEyNyA9IDEyNzsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxMjkgPSAxMjk7CisgIHJlcGVhdGVkIGludDY0IGZpZWxkMTMwID0gMTMwOworICBvcHRpb25hbCBib29sIGZpZWxkMjA1ID0gMjA1IFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDIwNiA9IDIwNiBbZGVmYXVsdD1mYWxzZV07Cit9CisKK21lc3NhZ2UgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgeworICBvcHRpb25hbCBmbG9hdCBmaWVsZDEgPSAxOworICBvcHRpb25hbCBmbG9hdCBmaWVsZDIgPSAyOworICBvcHRpb25hbCBmbG9hdCBmaWVsZDMgPSAzIFtkZWZhdWx0PTAuMF07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ0ID0gNDsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDUgPSA1OworICBvcHRpb25hbCBib29sIGZpZWxkNiA9IDYgW2RlZmF1bHQ9dHJ1ZV07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ3ID0gNyBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIGZsb2F0IGZpZWxkOCA9IDg7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ5ID0gOTsKKyAgb3B0aW9uYWwgZmxvYXQgZmllbGQxMCA9IDEwOworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDExID0gMTE7Cit9CmRpZmYgLS1naXQgYS9jc2hhcnAvcHJvdG9zL2JlbmNobWFya3MvZ29vZ2xlX3NwZWVkLnByb3RvIGIvY3NoYXJwL3Byb3Rvcy9iZW5jaG1hcmtzL2dvb2dsZV9zcGVlZC5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjllYmE4Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3Byb3Rvcy9iZW5jaG1hcmtzL2dvb2dsZV9zcGVlZC5wcm90bwpAQCAtMCwwICsxLDE0MCBAQAoraW1wb3J0ICJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iOworb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykubmFtZXNwYWNlID0gIkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaCI7CitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS51bWJyZWxsYV9jbGFzc25hbWUgPSAiR29vZ2xlU3BlZWRQcm90b0ZpbGUiOworCitwYWNrYWdlIGJlbmNobWFya3M7CisKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJHb29nbGVTcGVlZCI7CitvcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7CisKK21lc3NhZ2UgU3BlZWRNZXNzYWdlMSB7CisgIHJlcXVpcmVkIHN0cmluZyBmaWVsZDEgPSAxOworICBvcHRpb25hbCBzdHJpbmcgZmllbGQ5ID0gOTsKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkMTggPSAxODsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDgwID0gODAgW2RlZmF1bHQ9ZmFsc2VdOworICBvcHRpb25hbCBib29sIGZpZWxkODEgPSA4MSBbZGVmYXVsdD10cnVlXTsKKyAgcmVxdWlyZWQgaW50MzIgZmllbGQyID0gMjsKKyAgcmVxdWlyZWQgaW50MzIgZmllbGQzID0gMzsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyODAgPSAyODA7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkNiA9IDYgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDY0IGZpZWxkMjIgPSAyMjsKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkNCA9IDQ7CisgIHJlcGVhdGVkIGZpeGVkNjQgZmllbGQ1ID0gNTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDU5ID0gNTkgW2RlZmF1bHQ9ZmFsc2VdOworICBvcHRpb25hbCBzdHJpbmcgZmllbGQ3ID0gNzsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxNiA9IDE2OworICBvcHRpb25hbCBpbnQzMiBmaWVsZDEzMCA9IDEzMCBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDEyID0gMTIgW2RlZmF1bHQ9dHJ1ZV07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQxNyA9IDE3IFtkZWZhdWx0PXRydWVdOworICBvcHRpb25hbCBib29sIGZpZWxkMTMgPSAxMyBbZGVmYXVsdD10cnVlXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDE0ID0gMTQgW2RlZmF1bHQ9dHJ1ZV07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTA0ID0gMTA0IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDEwMCA9IDEwMCBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxMDEgPSAxMDEgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDEwMiA9IDEwMjsKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkMTAzID0gMTAzOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDI5ID0gMjkgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQzMCA9IDMwIFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQ2MCA9IDYwIFtkZWZhdWx0PS0xXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyNzEgPSAyNzEgW2RlZmF1bHQ9LTFdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDI3MiA9IDI3MiBbZGVmYXVsdD0tMV07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTUwID0gMTUwOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIzID0gMjMgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQyNCA9IDI0IFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyNSA9IDI1IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSBmaWVsZDE1ID0gMTU7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ3OCA9IDc4OworICBvcHRpb25hbCBpbnQzMiBmaWVsZDY3ID0gNjcgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkNjggPSA2ODsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxMjggPSAxMjggW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDEyOSA9IDEyOSBbZGVmYXVsdD0ieHh4eHh4eHh4eHh4eHh4eHh4eHh4Il07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTMxID0gMTMxIFtkZWZhdWx0PTBdOworfQorCittZXNzYWdlIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIHsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxID0gMSBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyID0gMiBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQzID0gMyBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkMTUgPSAxNTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDEyID0gMTIgW2RlZmF1bHQ9dHJ1ZV07CisgIG9wdGlvbmFsIGludDY0IGZpZWxkMTMgPSAxMzsKKyAgb3B0aW9uYWwgaW50NjQgZmllbGQxNCA9IDE0OworICBvcHRpb25hbCBpbnQzMiBmaWVsZDE2ID0gMTY7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTkgPSAxOSBbZGVmYXVsdD0yXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDIwICA9IDIwIFtkZWZhdWx0PXRydWVdOworICBvcHRpb25hbCBib29sIGZpZWxkMjggPSAyOCBbZGVmYXVsdD10cnVlXTsKKyAgb3B0aW9uYWwgZml4ZWQ2NCBmaWVsZDIxID0gMjE7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjIgPSAyMjsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDIzID0gMjMgWyBkZWZhdWx0PWZhbHNlIF07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQyMDYgPSAyMDYgW2RlZmF1bHQ9ZmFsc2VdOworICBvcHRpb25hbCBmaXhlZDMyIGZpZWxkMjAzID0gMjAzOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIwNCA9IDIwNDsKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkMjA1ID0gMjA1OworICBvcHRpb25hbCB1aW50NjQgZmllbGQyMDcgPSAyMDc7CisgIG9wdGlvbmFsIHVpbnQ2NCBmaWVsZDMwMCA9IDMwMDsKK30KKworbWVzc2FnZSBTcGVlZE1lc3NhZ2UyIHsKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkMSA9IDE7CisgIG9wdGlvbmFsIGludDY0IGZpZWxkMyA9IDM7CisgIG9wdGlvbmFsIGludDY0IGZpZWxkNCA9IDQ7CisgIG9wdGlvbmFsIGludDY0IGZpZWxkMzAgPSAzMDsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDc1ICA9IDc1IFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkNiA9IDY7CisgIG9wdGlvbmFsIGJ5dGVzIGZpZWxkMiA9IDI7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjEgPSAyMSBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQ3MSA9IDcxOworICBvcHRpb25hbCBmbG9hdCBmaWVsZDI1ID0gMjU7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTA5ID0gMTA5IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIxMCA9IDIxMCBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMTEgPSAyMTEgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjEyID0gMjEyIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIxMyA9IDIxMyBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMTYgPSAyMTYgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjE3ID0gMjE3IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIxOCA9IDIxOCBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMjAgPSAyMjAgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjIxID0gMjIxIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBmbG9hdCBmaWVsZDIyMiA9IDIyMiBbZGVmYXVsdD0wLjBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDYzID0gNjM7CisKKyAgcmVwZWF0ZWQgZ3JvdXAgR3JvdXAxID0gMTAgeworICAgIHJlcXVpcmVkIGZsb2F0IGZpZWxkMTEgPSAxMTsKKyAgICBvcHRpb25hbCBmbG9hdCBmaWVsZDI2ID0gMjY7CisgICAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkMTIgPSAxMjsKKyAgICBvcHRpb25hbCBzdHJpbmcgZmllbGQxMyA9IDEzOworICAgIHJlcGVhdGVkIHN0cmluZyBmaWVsZDE0ID0gMTQ7CisgICAgcmVxdWlyZWQgdWludDY0IGZpZWxkMTUgPSAxNTsKKyAgICBvcHRpb25hbCBpbnQzMiBmaWVsZDUgPSA1OworICAgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDI3ID0gMjc7CisgICAgb3B0aW9uYWwgaW50MzIgZmllbGQyOCA9IDI4OworICAgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDI5ID0gMjk7CisgICAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkMTYgPSAxNjsKKyAgICByZXBlYXRlZCBzdHJpbmcgZmllbGQyMiA9IDIyOworICAgIHJlcGVhdGVkIGludDMyIGZpZWxkNzMgPSA3MzsKKyAgICBvcHRpb25hbCBpbnQzMiBmaWVsZDIwID0gMjAgW2RlZmF1bHQ9MF07CisgICAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkMjQgPSAyNDsKKyAgICBvcHRpb25hbCBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgZmllbGQzMSA9IDMxOworICB9CisgIHJlcGVhdGVkIHN0cmluZyBmaWVsZDEyOCA9IDEyODsKKyAgb3B0aW9uYWwgaW50NjQgZmllbGQxMzEgPSAxMzE7CisgIHJlcGVhdGVkIHN0cmluZyBmaWVsZDEyNyA9IDEyNzsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxMjkgPSAxMjk7CisgIHJlcGVhdGVkIGludDY0IGZpZWxkMTMwID0gMTMwOworICBvcHRpb25hbCBib29sIGZpZWxkMjA1ID0gMjA1IFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDIwNiA9IDIwNiBbZGVmYXVsdD1mYWxzZV07Cit9CisKK21lc3NhZ2UgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIHsKKyAgb3B0aW9uYWwgZmxvYXQgZmllbGQxID0gMTsKKyAgb3B0aW9uYWwgZmxvYXQgZmllbGQyID0gMjsKKyAgb3B0aW9uYWwgZmxvYXQgZmllbGQzID0gMyBbZGVmYXVsdD0wLjBdOworICBvcHRpb25hbCBib29sIGZpZWxkNCA9IDQ7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ1ID0gNTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDYgPSA2IFtkZWZhdWx0PXRydWVdOworICBvcHRpb25hbCBib29sIGZpZWxkNyA9IDcgW2RlZmF1bHQ9ZmFsc2VdOworICBvcHRpb25hbCBmbG9hdCBmaWVsZDggPSA4OworICBvcHRpb25hbCBib29sIGZpZWxkOSA9IDk7CisgIG9wdGlvbmFsIGZsb2F0IGZpZWxkMTAgPSAxMDsKKyAgb3B0aW9uYWwgaW50NjQgZmllbGQxMSA9IDExOworfQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3Byb3Rvcy9leHRlc3QvdW5pdHRlc3RfZXh0cmFzLnByb3RvIGIvY3NoYXJwL3Byb3Rvcy9leHRlc3QvdW5pdHRlc3RfZXh0cmFzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjEwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvcHJvdG9zL2V4dGVzdC91bml0dGVzdF9leHRyYXMucHJvdG8KQEAgLTAsMCArMSwzNyBAQAorLy8gQWRkaXRpb25hbCBvcHRpb25zIHJlcXVpcmVkIGZvciBDIyBnZW5lcmF0aW9uLiBGaWxlIGZyb20gY29weXJpZ2h0DQorLy8gbGluZSBvbndhcmRzIGlzIGFzIHBlciBvcmlnaW5hbCBkaXN0cmlidXRpb24uDQoraW1wb3J0ICJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iOw0KK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLm5hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MiOw0KK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLnVtYnJlbGxhX2NsYXNzbmFtZSA9ICJVbml0VGVzdEV4dHJhc1Byb3RvRmlsZSI7DQorb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykuYWRkX3NlcmlhbGl6YWJsZSA9IHRydWU7DQorDQorcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdF9leHRyYTsNCisNCitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOw0KKw0KK21lc3NhZ2UgVGVzdFVucGFja2VkRXh0ZW5zaW9ucyB7DQorICBleHRlbnNpb25zIDEgdG8gbWF4Ow0KK30NCisNCitleHRlbmQgVGVzdFVucGFja2VkRXh0ZW5zaW9ucyB7DQorICByZXBlYXRlZCAgICBpbnQzMiB1bnBhY2tlZF9pbnQzMl9leHRlbnNpb24gICAgPSAgOTA7DQorICByZXBlYXRlZCAgICBpbnQ2NCB1bnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICAgPSAgOTE7DQorICByZXBlYXRlZCAgIHVpbnQzMiB1bnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICAgPSAgOTI7DQorICByZXBlYXRlZCAgIHVpbnQ2NCB1bnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uICAgPSAgOTM7DQorICByZXBlYXRlZCAgIHNpbnQzMiB1bnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICAgPSAgOTQ7DQorICByZXBlYXRlZCAgIHNpbnQ2NCB1bnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICAgPSAgOTU7DQorICByZXBlYXRlZCAgZml4ZWQzMiB1bnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiAgPSAgOTY7DQorICByZXBlYXRlZCAgZml4ZWQ2NCB1bnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiAgPSAgOTc7DQorICByZXBlYXRlZCBzZml4ZWQzMiB1bnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24gPSAgOTg7DQorICByZXBlYXRlZCBzZml4ZWQ2NCB1bnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24gPSAgOTk7DQorICByZXBlYXRlZCAgICBmbG9hdCB1bnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICAgPSAxMDA7DQorICByZXBlYXRlZCAgIGRvdWJsZSB1bnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICAgPSAxMDE7DQorICByZXBlYXRlZCAgICAgYm9vbCB1bnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICAgPSAxMDI7DQorICByZXBlYXRlZCBVbnBhY2tlZEV4dGVuc2lvbnNGb3JlaWduRW51bSB1bnBhY2tlZF9lbnVtX2V4dGVuc2lvbiAgPSAxMDM7DQorfQ0KKw0KK2VudW0gVW5wYWNrZWRFeHRlbnNpb25zRm9yZWlnbkVudW0gew0KKyAgRk9SRUlHTl9GT08gPSA0Ow0KKyAgRk9SRUlHTl9CQVIgPSA1Ow0KKyAgRk9SRUlHTl9CQVogPSA2Ow0KK30NCmRpZmYgLS1naXQgYS9jc2hhcnAvcHJvdG9zL2V4dGVzdC91bml0dGVzdF9leHRyYXNfZnVsbC5wcm90byBiL2NzaGFycC9wcm90b3MvZXh0ZXN0L3VuaXR0ZXN0X2V4dHJhc19mdWxsLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMzRiYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvcHJvdG9zL2V4dGVzdC91bml0dGVzdF9leHRyYXNfZnVsbC5wcm90bwpAQCAtMCwwICsxLDcyIEBACisvLyBBZGRpdGlvbmFsIG9wdGlvbnMgcmVxdWlyZWQgZm9yIEMjIGdlbmVyYXRpb24uIEZpbGUgZnJvbSBjb3B5cmlnaHQKKy8vIGxpbmUgb253YXJkcyBpcyBhcyBwZXIgb3JpZ2luYWwgZGlzdHJpYnV0aW9uLgoraW1wb3J0ICJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iOworb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykubmFtZXNwYWNlID0gIkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcyI7CitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS51bWJyZWxsYV9jbGFzc25hbWUgPSAiVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlIjsKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdF9leHRyYTsKKworb3B0aW9uIG9wdGltaXplX2ZvciA9IENPREVfU0laRTsKKworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKKworbWVzc2FnZSBUZXN0SW50ZXJvcFBlcnNvbiB7CisgIHJlcXVpcmVkIHN0cmluZyBuYW1lID0gMTsKKyAgcmVxdWlyZWQgaW50MzIgaWQgPSAyOworICBvcHRpb25hbCBzdHJpbmcgZW1haWwgPSAzOworICByZXBlYXRlZCBpbnQzMiBjb2RlcyA9IDEwIFtwYWNrZWQ9dHJ1ZV07CisKKyAgZW51bSBQaG9uZVR5cGUgeworICAgIE1PQklMRSA9IDA7CisgICAgSE9NRSA9IDE7CisgICAgV09SSyA9IDI7CisgIH0KKworICBtZXNzYWdlIFBob25lTnVtYmVyIHsKKyAgICByZXF1aXJlZCBzdHJpbmcgbnVtYmVyID0gMTsKKyAgICBvcHRpb25hbCBQaG9uZVR5cGUgdHlwZSA9IDIgW2RlZmF1bHQgPSBIT01FXTsKKyAgfQorCisgIHJlcGVhdGVkIFBob25lTnVtYmVyIHBob25lID0gNDsKKyAgCisgIHJlcGVhdGVkIGdyb3VwIEFkZHJlc3NlcyA9IDUgeworICAgIHJlcXVpcmVkIHN0cmluZyBhZGRyZXNzID0gMTsKKyAgICBvcHRpb25hbCBzdHJpbmcgYWRkcmVzczIgPSAyOworICAgIHJlcXVpcmVkIHN0cmluZyBjaXR5ID0gMzsKKyAgICByZXF1aXJlZCBzdHJpbmcgc3RhdGUgPSA0OworICAgIHJlcXVpcmVkIGZpeGVkMzIgemlwID0gNTsKKyAgfQorCisgIGV4dGVuc2lvbnMgMTAwIHRvIDE5OTsKK30KKworbWVzc2FnZSAgVGVzdEludGVyb3BFbXBsb3llZUlkIHsKKyAgcmVxdWlyZWQgc3RyaW5nIG51bWJlciA9IDE7Cit9CisgIAorZXh0ZW5kIFRlc3RJbnRlcm9wUGVyc29uIHsKKyAgcmVxdWlyZWQgVGVzdEludGVyb3BFbXBsb3llZUlkIGVtcGxveWVlX2lkID0gMTI2OworfQorCittZXNzYWdlIFRlc3RNaXNzaW5nRmllbGRzQSB7CisgIHJlcXVpcmVkIHN0cmluZyBuYW1lID0gMTsKKyAgcmVxdWlyZWQgaW50MzIgaWQgPSAyOworICBvcHRpb25hbCBzdHJpbmcgZW1haWwgPSAzOworICAKKyAgbWVzc2FnZSBTdWJBIHsKKyAgICByZXF1aXJlZCBpbnQzMiBjb3VudCA9IDU7CisgICAgcmVwZWF0ZWQgc3RyaW5nIHZhbHVlcyA9IDY7CisgIH0KKyAgb3B0aW9uYWwgU3ViQSB0ZXN0QSA9IDExOworfQorCittZXNzYWdlIFRlc3RNaXNzaW5nRmllbGRzQiB7CisgIHJlcXVpcmVkIHN0cmluZyBuYW1lID0gMTsKKyAgcmVxdWlyZWQgaW50MzIgaWQgPSAyOworICBvcHRpb25hbCBzdHJpbmcgd2Vic2l0ZSA9IDQ7CisgIAorICBtZXNzYWdlIFN1YkIgeworICAgIHJlcGVhdGVkIHN0cmluZyB2YWx1ZXMgPSA3OworICB9CisgIG9wdGlvbmFsIFN1YkIgdGVzdEIgPSAxMjsKK30KZGlmZiAtLWdpdCBhL2NzaGFycC9wcm90b3MvZXh0ZXN0L3VuaXR0ZXN0X2V4dHJhc19saXRlLnByb3RvIGIvY3NoYXJwL3Byb3Rvcy9leHRlc3QvdW5pdHRlc3RfZXh0cmFzX2xpdGUucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWExYmNkMgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9wcm90b3MvZXh0ZXN0L3VuaXR0ZXN0X2V4dHJhc19saXRlLnByb3RvCkBAIC0wLDAgKzEsMTE3IEBACisvLyBBZGRpdGlvbmFsIG9wdGlvbnMgcmVxdWlyZWQgZm9yIEMjIGdlbmVyYXRpb24uIEZpbGUgZnJvbSBjb3B5cmlnaHQNCisvLyBsaW5lIG9ud2FyZHMgaXMgYXMgcGVyIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbi4NCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byI7DQorb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykubmFtZXNwYWNlID0gIkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcyI7DQorb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykudW1icmVsbGFfY2xhc3NuYW1lID0gIlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZSI7DQorb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykuYWRkX3NlcmlhbGl6YWJsZSA9IHRydWU7DQorDQorcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdF9leHRyYTsNCisNCitvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOw0KKw0KK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7DQorDQorbWVzc2FnZSBUZXN0UmVxdWlyZWRMaXRlIHsNCisgIHJlcXVpcmVkIGludDMyIGQgPSAxOw0KKyAgcmVxdWlyZWQgRXh0cmFFbnVtIGVuID0gMiBbZGVmYXVsdCA9IERFRkFVTFRdOw0KK30NCisNCitlbnVtIEV4dHJhRW51bSB7DQorICBERUZBVUxUID0gMTA7DQorICBFWExJVEVfRk9PID0gNzsNCisgIEVYTElURV9CQVIgPSA4Ow0KKyAgRVhMSVRFX0JBWiA9IDk7DQorfQ0KKw0KK21lc3NhZ2UgVGVzdEludGVyb3BQZXJzb25MaXRlIHsNCisgIHJlcXVpcmVkIHN0cmluZyBuYW1lID0gMTsNCisgIHJlcXVpcmVkIGludDMyIGlkID0gMjsNCisgIG9wdGlvbmFsIHN0cmluZyBlbWFpbCA9IDM7DQorICByZXBlYXRlZCBpbnQzMiBjb2RlcyA9IDEwIFtwYWNrZWQ9dHJ1ZV07DQorDQorICBlbnVtIFBob25lVHlwZSB7DQorICAgIE1PQklMRSA9IDA7DQorICAgIEhPTUUgPSAxOw0KKyAgICBXT1JLID0gMjsNCisgIH0NCisNCisgIG1lc3NhZ2UgUGhvbmVOdW1iZXIgew0KKyAgICByZXF1aXJlZCBzdHJpbmcgbnVtYmVyID0gMTsNCisgICAgb3B0aW9uYWwgUGhvbmVUeXBlIHR5cGUgPSAyIFtkZWZhdWx0ID0gSE9NRV07DQorICB9DQorDQorICByZXBlYXRlZCBQaG9uZU51bWJlciBwaG9uZSA9IDQ7DQorICANCisgIHJlcGVhdGVkIGdyb3VwIEFkZHJlc3NlcyA9IDUgew0KKyAgICByZXF1aXJlZCBzdHJpbmcgYWRkcmVzcyA9IDE7DQorICAgIG9wdGlvbmFsIHN0cmluZyBhZGRyZXNzMiA9IDI7DQorICAgIHJlcXVpcmVkIHN0cmluZyBjaXR5ID0gMzsNCisgICAgcmVxdWlyZWQgc3RyaW5nIHN0YXRlID0gNDsNCisgICAgcmVxdWlyZWQgZml4ZWQzMiB6aXAgPSA1Ow0KKyAgfQ0KKw0KKyAgZXh0ZW5zaW9ucyAxMDAgdG8gMTk5Ow0KK30NCisNCittZXNzYWdlICBUZXN0SW50ZXJvcEVtcGxveWVlSWRMaXRlIHsNCisgIHJlcXVpcmVkIHN0cmluZyBudW1iZXIgPSAxOw0KK30NCisgIA0KK2V4dGVuZCBUZXN0SW50ZXJvcFBlcnNvbkxpdGUgew0KKyAgcmVxdWlyZWQgVGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZSBlbXBsb3llZV9pZF9saXRlID0gMTI2Ow0KK30NCisNCisvKiBSZW1vdmVkIGZyb20gdW5pdHRlc3RfbGl0ZS5wcm90byBhbmQgYWRkZWQgYmFjayBoZXJlICovDQorDQorbWVzc2FnZSBUZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSB7DQorICBleHRlbnNpb25zIDEgdG8gbWF4Ow0KK30NCisNCittZXNzYWdlIFRlc3RVbnBhY2tlZFR5cGVzTGl0ZSB7DQorICByZXBlYXRlZCAgICBpbnQzMiB1bnBhY2tlZF9pbnQzMiAgICA9ICA5MDsNCisgIHJlcGVhdGVkICAgIGludDY0IHVucGFja2VkX2ludDY0ICAgID0gIDkxOw0KKyAgcmVwZWF0ZWQgICB1aW50MzIgdW5wYWNrZWRfdWludDMyICAgPSAgOTI7DQorICByZXBlYXRlZCAgIHVpbnQ2NCB1bnBhY2tlZF91aW50NjQgICA9ICA5MzsNCisgIHJlcGVhdGVkICAgc2ludDMyIHVucGFja2VkX3NpbnQzMiAgID0gIDk0Ow0KKyAgcmVwZWF0ZWQgICBzaW50NjQgdW5wYWNrZWRfc2ludDY0ICAgPSAgOTU7DQorICByZXBlYXRlZCAgZml4ZWQzMiB1bnBhY2tlZF9maXhlZDMyICA9ICA5NjsNCisgIHJlcGVhdGVkICBmaXhlZDY0IHVucGFja2VkX2ZpeGVkNjQgID0gIDk3Ow0KKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgdW5wYWNrZWRfc2ZpeGVkMzIgPSAgOTg7DQorICByZXBlYXRlZCBzZml4ZWQ2NCB1bnBhY2tlZF9zZml4ZWQ2NCA9ICA5OTsNCisgIHJlcGVhdGVkICAgIGZsb2F0IHVucGFja2VkX2Zsb2F0ICAgID0gMTAwOw0KKyAgcmVwZWF0ZWQgICBkb3VibGUgdW5wYWNrZWRfZG91YmxlICAgPSAxMDE7DQorICByZXBlYXRlZCAgICAgYm9vbCB1bnBhY2tlZF9ib29sICAgICA9IDEwMjsNCisgIHJlcGVhdGVkIFVucGFja2VkVHlwZXNGb3JlaWduRW51bUxpdGUgdW5wYWNrZWRfZW51bSAgPSAxMDM7DQorfQ0KKw0KK2V4dGVuZCBUZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSB7DQorICByZXBlYXRlZCAgICBpbnQzMiB1bnBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICA9ICA5MDsNCisgIHJlcGVhdGVkICAgIGludDY0IHVucGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgID0gIDkxOw0KKyAgcmVwZWF0ZWQgICB1aW50MzIgdW5wYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAgPSAgOTI7DQorICByZXBlYXRlZCAgIHVpbnQ2NCB1bnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICA9ICA5MzsNCisgIHJlcGVhdGVkICAgc2ludDMyIHVucGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgID0gIDk0Ow0KKyAgcmVwZWF0ZWQgICBzaW50NjQgdW5wYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAgPSAgOTU7DQorICByZXBlYXRlZCAgZml4ZWQzMiB1bnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICA9ICA5NjsNCisgIHJlcGVhdGVkICBmaXhlZDY0IHVucGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgID0gIDk3Ow0KKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgdW5wYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgPSAgOTg7DQorICByZXBlYXRlZCBzZml4ZWQ2NCB1bnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSA9ICA5OTsNCisgIHJlcGVhdGVkICAgIGZsb2F0IHVucGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgID0gMTAwOw0KKyAgcmVwZWF0ZWQgICBkb3VibGUgdW5wYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAgPSAxMDE7DQorICByZXBlYXRlZCAgICAgYm9vbCB1bnBhY2tlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICA9IDEwMjsNCisgIHJlcGVhdGVkIFVucGFja2VkVHlwZXNGb3JlaWduRW51bUxpdGUgdW5wYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSA9IDEwMzsNCit9DQorDQorZW51bSBVbnBhY2tlZFR5cGVzRm9yZWlnbkVudW1MaXRlIHsNCisgIEZPUkVJR05fTElURV9GT08gPSA0Ow0KKyAgRk9SRUlHTl9MSVRFX0JBUiA9IDU7DQorICBGT1JFSUdOX0xJVEVfQkFaID0gNjsNCit9DQorDQorbWVzc2FnZSBCdWNrZXRPZkJ5dGVzIHsNCisgICAgb3B0aW9uYWwgYnl0ZXMgdmFsdWUgPSAxOw0KKyAgICANCit9DQorbWVzc2FnZSBCdWNrZXRPZkJ5dGVzRXggew0KKyAgICBvcHRpb25hbCBieXRlcyB2YWx1ZSA9IDE7DQorICAgIG9wdGlvbmFsIGJ5dGVzIHZhbHVlMiA9IDI1NTsNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3Byb3Rvcy9leHRlc3QvdW5pdHRlc3RfZXh0cmFzX3htbHRlc3QucHJvdG8gYi9jc2hhcnAvcHJvdG9zL2V4dGVzdC91bml0dGVzdF9leHRyYXNfeG1sdGVzdC5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjgwODhhCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3Byb3Rvcy9leHRlc3QvdW5pdHRlc3RfZXh0cmFzX3htbHRlc3QucHJvdG8KQEAgLTAsMCArMSw1NCBAQAoraW1wb3J0ICJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iOw0KK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLm5hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MiOw0KK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLnVtYnJlbGxhX2NsYXNzbmFtZSA9ICJVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlIjsNCitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS5hZGRfc2VyaWFsaXphYmxlID0gdHJ1ZTsNCisNCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0X2V4dHJhOw0KKw0KK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsNCisNCitlbnVtIEVudW1PcHRpb25zIHsNCisgIE9ORSA9IDA7DQorICBUV08gPSAxOw0KKyAgVEhSRUUgPSAyOw0KK30NCisNCittZXNzYWdlIFRlc3RYbWxDaGlsZCB7DQorICByZXBlYXRlZCBFbnVtT3B0aW9ucyBvcHRpb25zID0gMzsNCisgIG9wdGlvbmFsIGJ5dGVzIGJpbmFyeSA9IDQ7DQorfQ0KKw0KK21lc3NhZ2UgVGVzdFhtbE5vRmllbGRzIHsNCit9DQorDQorbWVzc2FnZSBUZXN0WG1sUmVzY3Vyc2l2ZSB7DQorICBvcHRpb25hbCBUZXN0WG1sUmVzY3Vyc2l2ZSBjaGlsZCA9IDE7DQorfQ0KKw0KK21lc3NhZ2UgVGVzdFhtbE1lc3NhZ2Ugew0KKw0KKyAgb3B0aW9uYWwgaW50NjQgbnVtYmVyID0gNjsNCisgIHJlcGVhdGVkIGludDMyIG51bWJlcnMgPSAyOw0KKyAgb3B0aW9uYWwgc3RyaW5nIHRleHQgPSAzOw0KKyAgcmVwZWF0ZWQgc3RyaW5nIHRleHRsaW5lcyA9IDcwMDsNCisgIG9wdGlvbmFsIGJvb2wgdmFsaWQgPSA1Ow0KKw0KKyAgb3B0aW9uYWwgVGVzdFhtbENoaWxkIGNoaWxkID0gMTsNCisgIHJlcGVhdGVkIGdyb3VwIENoaWxkcmVuID0gNDAxIHsNCisgICAgcmVwZWF0ZWQgRW51bU9wdGlvbnMgb3B0aW9ucyA9IDM7DQorICAgIG9wdGlvbmFsIGJ5dGVzIGJpbmFyeSA9IDQ7DQorICB9DQorDQorZXh0ZW5zaW9ucyAxMDAgdG8gMTk5Ow0KK30NCisNCittZXNzYWdlICBUZXN0WG1sRXh0ZW5zaW9uIHsNCisgIHJlcXVpcmVkIGludDMyIG51bWJlciA9IDE7DQorfQ0KKw0KK2V4dGVuZCBUZXN0WG1sTWVzc2FnZSB7DQorICBvcHRpb25hbCBFbnVtT3B0aW9ucyBleHRlbnNpb25fZW51bSA9IDEwMTsNCisgIG9wdGlvbmFsIHN0cmluZyBleHRlbnNpb25fdGV4dCA9IDEwMjsNCisgIHJlcGVhdGVkIGludDMyIGV4dGVuc2lvbl9udW1iZXIgPSAxMDMgW3BhY2tlZCA9IHRydWVdOw0KKyAgb3B0aW9uYWwgVGVzdFhtbEV4dGVuc2lvbiBleHRlbnNpb25fbWVzc2FnZSA9IDE5OTsNCit9DQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3Byb3Rvcy9leHRlc3QvdW5pdHRlc3RfZ2VuZXJpY19zZXJ2aWNlcy5wcm90byBiL2NzaGFycC9wcm90b3MvZXh0ZXN0L3VuaXR0ZXN0X2dlbmVyaWNfc2VydmljZXMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZlMmU4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9wcm90b3MvZXh0ZXN0L3VuaXR0ZXN0X2dlbmVyaWNfc2VydmljZXMucHJvdG8KQEAgLTAsMCArMSwyOSBAQAorLy8gQWRkaXRpb25hbCBvcHRpb25zIHJlcXVpcmVkIGZvciBDIyBnZW5lcmF0aW9uLiBGaWxlIGZyb20gY29weXJpZ2h0DQorLy8gbGluZSBvbndhcmRzIGlzIGFzIHBlciBvcmlnaW5hbCBkaXN0cmlidXRpb24uDQoraW1wb3J0ICJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iOw0KK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIjsNCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byI7DQorb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykubmFtZXNwYWNlID0gIkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcyI7DQorb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykudW1icmVsbGFfY2xhc3NuYW1lID0gIlVuaXRUZXN0R2VuZXJpY1NlcnZpY2VzIjsNCisNCitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS5zZXJ2aWNlX2dlbmVyYXRvcl90eXBlID0gR0VORVJJQzsNCisNCisvLyBXZSBkb24ndCBwdXQgdGhpcyBpbiBhIHBhY2thZ2Ugd2l0aGluIHByb3RvMiBiZWNhdXNlIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisvLyB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBkb2Vzbid0IGRlcGVuZCBvbiBiZWluZyBpbiB0aGUgcHJvdG8yIG5hbWVzcGFjZS4KK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsNCisNCitzZXJ2aWNlIFRlc3RHZW5lcmljU2VydmljZSB7DQorICBycGMgRm9vKEZvb1JlcXVlc3QpIHJldHVybnMgKEZvb1Jlc3BvbnNlKTsNCisgIHJwYyBCYXIoQmFyUmVxdWVzdCkgcmV0dXJucyAoQmFyUmVzcG9uc2UpOw0KK30NCisKK3NlcnZpY2UgVGVzdEdlbmVyaWNTZXJ2aWNlV2l0aEN1c3RvbU9wdGlvbnMgeworICBvcHRpb24gKHNlcnZpY2Vfb3B0MSkgPSAtOTg3NjU0MzIxMDsKKworICBycGMgRm9vKEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QpIHJldHVybnMgKEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlKSB7CisgICAgb3B0aW9uIChtZXRob2Rfb3B0MSkgPSBNRVRIT0RPUFQxX1ZBTDI7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY3NoYXJwL3Byb3Rvcy9leHRlc3QvdW5pdHRlc3RfaXNzdWVzLnByb3RvIGIvY3NoYXJwL3Byb3Rvcy9leHRlc3QvdW5pdHRlc3RfaXNzdWVzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiODAzNzkKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvcHJvdG9zL2V4dGVzdC91bml0dGVzdF9pc3N1ZXMucHJvdG8KQEAgLTAsMCArMSwxMzcgQEAKKy8vIFRoZXNlIHByb3RvIGRlc2NyaXB0b3JzIGhhdmUgYXQgb25lIHRpbWUgYmVlbiByZXBvcnRlZCBhcyBhbiBpc3N1ZSBvciBkZWZlY3QuDQorLy8gVGhleSBhcmUga2VwdCBoZXJlIHRvIHJlcGxpY2F0ZSB0aGUgaXNzdWUsIGFuZCBjb250aW51ZSB0byB2ZXJpZnkgdGhlIGZpeC4NCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byI7DQorDQorLy8gSXNzdWU6IE5vbi0iR29vZ2xlLlByb3RvYnVmZmVycyIgbmFtZXNwYWNlIHdpbGwgZW5zdXJlIHRoYXQgcHJvdG9idWZmZXIgbGlicmFyeSB0eXBlcyBhcmUgcXVhbGlmaWVkDQorb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykubmFtZXNwYWNlID0gIlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zIjsNCitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS51bWJyZWxsYV9jbGFzc25hbWUgPSAiVW5pdFRlc3RFeHRyYXNJc3N1ZXNQcm90b0ZpbGUiOw0KKw0KK3BhY2thZ2UgdW5pdHRlc3RfaXNzdWVzOw0KK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsNCisNCisvLyBUaGUgZm9sbG93aW5nIGlzIGEgcmVwcmVzZW50YXRpdmUgc2V0IG9mIGZlYXR1cmVzDQorLyoNCitlbnVtIEVudW1PcHRpb25zIHsNCisgICAgT05FID0gMDsNCisgICAgVFdPID0gMTsNCisgICAgVEhSRUUgPSAyOw0KK30NCisNCittZXNzYWdlIFRlc3RCYXNpY0NoaWxkDQorew0KKyAgICByZXBlYXRlZCBFbnVtT3B0aW9ucyBvcHRpb25zID0gMzsNCisgICAgb3B0aW9uYWwgYnl0ZXMgYmluYXJ5ID0gNDsNCit9DQorDQorbWVzc2FnZSBUZXN0QmFzaWNOb0ZpZWxkcyB7DQorfQ0KKw0KK21lc3NhZ2UgVGVzdEJhc2ljUmVzY3Vyc2l2ZSB7DQorICAgIG9wdGlvbmFsIFRlc3RCYXNpY1Jlc2N1cnNpdmUgY2hpbGQgPSAxOw0KK30NCisNCittZXNzYWdlIFRlc3RCYXNpY01lc3NhZ2Ugew0KKw0KKyAgICBvcHRpb25hbCBpbnQ2NCBudW1iZXIgPSA2Ow0KKyAgICByZXBlYXRlZCBpbnQzMiBudW1iZXJzID0gMjsNCisgICAgb3B0aW9uYWwgc3RyaW5nIHRleHQgPSAzOw0KKyAgICByZXBlYXRlZCBzdHJpbmcgdGV4dGxpbmVzID0gNzAwOw0KKyAgICBvcHRpb25hbCBib29sIHZhbGlkID0gNTsNCisgICAgDQorICAgIG9wdGlvbmFsIFRlc3RCYXNpY0NoaWxkIGNoaWxkID0gMTsNCisgICAgcmVwZWF0ZWQgZ3JvdXAgQ2hpbGRyZW4gPSA0MDEgDQorICAgIHsNCisgICAgICAgIHJlcGVhdGVkIEVudW1PcHRpb25zIG9wdGlvbnMgPSAzOw0KKyAgICAgICAgb3B0aW9uYWwgYnl0ZXMgYmluYXJ5ID0gNDsNCisgICAgfQ0KKw0KKyAgICBleHRlbnNpb25zIDEwMCB0byAxOTk7DQorfQ0KKw0KK21lc3NhZ2UgIFRlc3RCYXNpY0V4dGVuc2lvbiB7DQorICByZXF1aXJlZCBpbnQzMiBudW1iZXIgPSAxOw0KK30NCisgIA0KK2V4dGVuZCBUZXN0QmFzaWNNZXNzYWdlIHsNCisgIG9wdGlvbmFsIEVudW1PcHRpb25zIGV4dGVuc2lvbl9lbnVtID0gMTAxOw0KKyAgb3B0aW9uYWwgc3RyaW5nIGV4dGVuc2lvbl90ZXh0ID0gMTAyOw0KKyAgcmVwZWF0ZWQgaW50MzIgZXh0ZW5zaW9uX251bWJlciA9IDEwMyBbcGFja2VkID0gdHJ1ZV07DQorICBvcHRpb25hbCBUZXN0QmFzaWNFeHRlbnNpb24gZXh0ZW5zaW9uX21lc3NhZ2UgPSAxOTk7DQorfQ0KKw0KKy8vIElzc3VlIGZvciBub24tcXVhbGlmaWVkIHR5cGUgcmVmZXJlbmNlIGluIG5ldyBzZXJ2aWNlcyBnZW5lcmF0aW9uDQorb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykuc2VydmljZV9nZW5lcmF0b3JfdHlwZSA9IElSUENESVNQQVRDSDsNCisNCitzZXJ2aWNlIFRlc3RHZW5lcmljU2VydmljZSB7DQorICBycGMgRm9vKFRlc3RCYXNpY05vRmllbGRzKSByZXR1cm5zIChUZXN0QmFzaWNNZXNzYWdlKTsNCisgIHJwYyBCYXIoVGVzdEJhc2ljTm9GaWVsZHMpIHJldHVybnMgKFRlc3RCYXNpY01lc3NhZ2UpOw0KK30NCisqLw0KKy8vIElzc3VlIDEzOiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYtY3NoYXJwLXBvcnQvaXNzdWVzL2RldGFpbD9pZD0xMw0KKyANCittZXNzYWdlIEEgew0KKyAgICBvcHRpb25hbCBpbnQzMiBfQSA9IDE7DQorfQ0KKw0KK21lc3NhZ2UgQiB7DQorICAgIG9wdGlvbmFsIGludDMyIEJfID0gMTsNCit9DQorDQorbWVzc2FnZSBBQiB7DQorICAgIG9wdGlvbmFsIGludDMyIGFfYiA9IDE7DQorfQ0KKw0KKy8vIFNpbWlsYXIgaXNzdWUgd2l0aCBudW1lcmljIG5hbWVzDQorbWVzc2FnZSBOdW1iZXJGaWVsZCB7DQorICAgIG9wdGlvbmFsIGludDMyIF8wMSA9IDE7DQorfQ0KKw0KKy8vIElzc3VlIDI4OiBDaXJjdWxhciBtZXNzYWdlIGRlcGVuZGVuY2llcyByZXN1bHQgaW4gbnVsbCBkZWZhdWx0cyBmb3IgRGVmYXVsdEluc3RhbmNlDQorDQorbWVzc2FnZSBNeU1lc3NhZ2VBUmVmZXJlbmNlQiB7DQorICAgIHJlcXVpcmVkIE15TWVzc2FnZUJSZWZlcmVuY2VBIHZhbHVlID0gMTsNCit9DQorDQorbWVzc2FnZSBNeU1lc3NhZ2VCUmVmZXJlbmNlQSB7DQorICAgIHJlcXVpcmVkIE15TWVzc2FnZUFSZWZlcmVuY2VCIHZhbHVlID0gMTsNCit9DQorDQorLy8gaXNzdWUgMTkgLSBuZWdhdGl2ZSBlbnVtIHZhbHVlcw0KKw0KK2VudW0gTmVnYXRpdmVFbnVtIHsNCisgICAgRml2ZUJlbG93ID0gLTU7DQorICAgIE1pbnVzT25lID0gLTE7DQorICAgIFplcm8gPSAwOw0KK30NCisNCittZXNzYWdlIE5lZ2F0aXZlRW51bU1lc3NhZ2UgeyANCisgICAgb3B0aW9uYWwgTmVnYXRpdmVFbnVtIHZhbHVlID0gMTsNCisgICAgcmVwZWF0ZWQgTmVnYXRpdmVFbnVtIHZhbHVlcyA9IDI7DQorICAgIHJlcGVhdGVkIE5lZ2F0aXZlRW51bSBwYWNrZWRfdmFsdWVzID0gMyBbcGFja2VkPXRydWVdOw0KK30NCisNCisvLyBJc3N1ZSAyMTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLWNzaGFycC1wb3J0L2lzc3Vlcy9kZXRhaWw/aWQ9MjENCisvLyBEZWNvcmF0ZSBmaWVsZHMgd2l0aCBbZGVwcmVjYXRlZD10cnVlXSBhcyBbU3lzdGVtLk9ic29sZXRlXQ0KKw0KK21lc3NhZ2UgRGVwcmVjYXRlZENoaWxkIHsNCit9DQorDQorZW51bSBEZXByZWNhdGVkRW51bSB7DQorICAgIG9uZSA9IDE7DQorfQ0KKw0KK21lc3NhZ2UgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2Ugew0KKyAgICBvcHRpb25hbCBpbnQzMiBQcmltaXRpdmVWYWx1ZSA9IDEgW2RlcHJlY2F0ZWQgPSB0cnVlXTsNCisgICAgcmVwZWF0ZWQgaW50MzIgUHJpbWl0aXZlQXJyYXkgPSAyIFtkZXByZWNhdGVkID0gdHJ1ZV07DQorDQorICAgIG9wdGlvbmFsIERlcHJlY2F0ZWRDaGlsZCBNZXNzYWdlVmFsdWUgPSAzIFtkZXByZWNhdGVkID0gdHJ1ZV07DQorICAgIHJlcGVhdGVkIERlcHJlY2F0ZWRDaGlsZCBNZXNzYWdlQXJyYXkgPSA0IFtkZXByZWNhdGVkID0gdHJ1ZV07DQorDQorICAgIG9wdGlvbmFsIERlcHJlY2F0ZWRFbnVtIEVudW1WYWx1ZSA9IDUgW2RlcHJlY2F0ZWQgPSB0cnVlXTsNCisgICAgcmVwZWF0ZWQgRGVwcmVjYXRlZEVudW0gRW51bUFycmF5ID0gNiBbZGVwcmVjYXRlZCA9IHRydWVdOw0KK30NCisNCisvLyBJc3N1ZSA0NTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLWNzaGFycC1wb3J0L2lzc3Vlcy9kZXRhaWw/aWQ9NDUNCittZXNzYWdlIEl0ZW1GaWVsZCB7DQorICBvcHRpb25hbCBpbnQzMiBpdGVtID0gMTsNCit9DQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3Byb3Rvcy9leHRlc3QvdW5pdHRlc3RfcnBjX2ludGVyb3AucHJvdG8gYi9jc2hhcnAvcHJvdG9zL2V4dGVzdC91bml0dGVzdF9ycGNfaW50ZXJvcC5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWM1Yjg3Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3Byb3Rvcy9leHRlc3QvdW5pdHRlc3RfcnBjX2ludGVyb3AucHJvdG8KQEAgLTAsMCArMSw0MSBAQAorLy8gQWRkaXRpb25hbCBvcHRpb25zIHJlcXVpcmVkIGZvciBDIyBnZW5lcmF0aW9uLiBGaWxlIGZyb20gY29weXJpZ2h0DQorLy8gbGluZSBvbndhcmRzIGlzIGFzIHBlciBvcmlnaW5hbCBkaXN0cmlidXRpb24uDQoraW1wb3J0ICJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iOw0KK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLm5hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MiOw0KK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLnVtYnJlbGxhX2NsYXNzbmFtZSA9ICJVbml0VGVzdFJwY0ludGVyb3AiOw0KKw0KK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLnNlcnZpY2VfZ2VuZXJhdG9yX3R5cGUgPSBJUlBDRElTUEFUQ0g7DQorDQorb3B0aW9uIG9wdGltaXplX2ZvciA9IFNQRUVEOw0KKw0KK21lc3NhZ2UgU2VhcmNoUmVxdWVzdCB7DQorICByZXBlYXRlZCBzdHJpbmcgQ3JpdGVyaWEgPSAxOw0KK30NCisNCittZXNzYWdlIFNlYXJjaFJlc3BvbnNlIHsNCisgIG1lc3NhZ2UgUmVzdWx0SXRlbSB7DQorICAgIHJlcXVpcmVkIHN0cmluZyB1cmwgPSAxOw0KKyAgICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDI7DQorICB9DQorICANCisgIHJlcGVhdGVkIFJlc3VsdEl0ZW0gcmVzdWx0cyA9IDE7DQorfQ0KKw0KK21lc3NhZ2UgUmVmaW5lU2VhcmNoUmVxdWVzdCB7DQorICByZXBlYXRlZCBzdHJpbmcgQ3JpdGVyaWEgPSAxOw0KKyAgcmVxdWlyZWQgU2VhcmNoUmVzcG9uc2UgcHJldmlvdXNfcmVzdWx0cyA9IDI7DQorfQ0KKw0KK3NlcnZpY2UgU2VhcmNoU2VydmljZSB7DQorICAvKg0KKyAgQWRkIHRoaXMgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIEd1aWRBdHRyaWJ1dGUgb24gdGhlIHNlcnZpY2UgaW50ZXJmYWNlDQorICBvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfc2VydmljZV9vcHRpb25zKS5pbnRlcmZhY2VfaWQgPSAie0E2NUYwOTI1LUZEMTEtNGY5NC1CMTY2LTg5QUM0RjAyNzIwNX0iOw0KKyAgKi8NCisgIHJwYyBTZWFyY2ggKFNlYXJjaFJlcXVlc3QpIHJldHVybnMgKFNlYXJjaFJlc3BvbnNlKSANCisgIC8qDQorICBBZGQgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgRGlzcElkQXR0cmlidXRlIG9uIHRoZSBzZXJ2aWNlIGludGVyZmFjZQ0KKyAgeyBvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfbWV0aG9kX29wdGlvbnMpLmRpc3BhdGNoX2lkID0gNTsgfSANCisgICovIDsNCisgIA0KKyAgcnBjIFJlZmluZVNlYXJjaCAoUmVmaW5lU2VhcmNoUmVxdWVzdCkgcmV0dXJucyAoU2VhcmNoUmVzcG9uc2UpOw0KK30NCmRpZmYgLS1naXQgYS9jc2hhcnAvcHJvdG9zL2V4dGVzdC91bml0dGVzdF9ycGNfaW50ZXJvcF9saXRlLnByb3RvIGIvY3NoYXJwL3Byb3Rvcy9leHRlc3QvdW5pdHRlc3RfcnBjX2ludGVyb3BfbGl0ZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmQxYzZhCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3Byb3Rvcy9leHRlc3QvdW5pdHRlc3RfcnBjX2ludGVyb3BfbGl0ZS5wcm90bwpAQCAtMCwwICsxLDQyIEBACisvLyBBZGRpdGlvbmFsIG9wdGlvbnMgcmVxdWlyZWQgZm9yIEMjIGdlbmVyYXRpb24uIEZpbGUgZnJvbSBjb3B5cmlnaHQNCisvLyBsaW5lIG9ud2FyZHMgaXMgYXMgcGVyIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbi4NCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byI7DQorb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykubmFtZXNwYWNlID0gIkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcyI7DQorb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykudW1icmVsbGFfY2xhc3NuYW1lID0gIlVuaXRUZXN0UnBjSW50ZXJvcExpdGUiOw0KKw0KK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLnNlcnZpY2VfZ2VuZXJhdG9yX3R5cGUgPSBJUlBDRElTUEFUQ0g7DQorDQorb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsNCitwYWNrYWdlIHVuaXR0ZXN0X3JwY19pbnRlcm9wX2xpdGU7DQorDQorbWVzc2FnZSBTZWFyY2hSZXF1ZXN0IHsNCisgIHJlcGVhdGVkIHN0cmluZyBDcml0ZXJpYSA9IDE7DQorfQ0KKw0KK21lc3NhZ2UgU2VhcmNoUmVzcG9uc2Ugew0KKyAgbWVzc2FnZSBSZXN1bHRJdGVtIHsNCisgICAgcmVxdWlyZWQgc3RyaW5nIHVybCA9IDE7DQorICAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMjsNCisgIH0NCisgIA0KKyAgcmVwZWF0ZWQgUmVzdWx0SXRlbSByZXN1bHRzID0gMTsNCit9DQorDQorbWVzc2FnZSBSZWZpbmVTZWFyY2hSZXF1ZXN0IHsNCisgIHJlcGVhdGVkIHN0cmluZyBDcml0ZXJpYSA9IDE7DQorICByZXF1aXJlZCBTZWFyY2hSZXNwb25zZSBwcmV2aW91c19yZXN1bHRzID0gMjsNCit9DQorDQorc2VydmljZSBTZWFyY2hTZXJ2aWNlIHsNCisgIC8qDQorICBBZGQgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgR3VpZEF0dHJpYnV0ZSBvbiB0aGUgc2VydmljZSBpbnRlcmZhY2UNCisgIG9wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9zZXJ2aWNlX29wdGlvbnMpLmludGVyZmFjZV9pZCA9ICJ7QTY1RjA5MjUtRkQxMS00Zjk0LUIxNjYtODlBQzRGMDI3MjA1fSI7DQorICAqLw0KKyAgcnBjIFNlYXJjaCAoU2VhcmNoUmVxdWVzdCkgcmV0dXJucyAoU2VhcmNoUmVzcG9uc2UpIA0KKyAgLyoNCisgIEFkZCB0aGlzIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBEaXNwSWRBdHRyaWJ1dGUgb24gdGhlIHNlcnZpY2UgaW50ZXJmYWNlDQorICB7IG9wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9tZXRob2Rfb3B0aW9ucykuZGlzcGF0Y2hfaWQgPSA1OyB9IA0KKyAgKi8gOw0KKyAgDQorICBycGMgUmVmaW5lU2VhcmNoIChSZWZpbmVTZWFyY2hSZXF1ZXN0KSByZXR1cm5zIChTZWFyY2hSZXNwb25zZSk7DQorfQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90byBiL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjZmYmExCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvCkBAIC0wLDAgKzEsMTQ3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpDQorLy8NCisvLyBXQVJOSU5HOiAgVGhlIHBsdWdpbiBpbnRlcmZhY2UgaXMgY3VycmVudGx5IEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0bw0KKy8vICAgY2hhbmdlLg0KKy8vDQorLy8gcHJvdG9jIChha2EgdGhlIFByb3RvY29sIENvbXBpbGVyKSBjYW4gYmUgZXh0ZW5kZWQgdmlhIHBsdWdpbnMuICBBIHBsdWdpbiBpcw0KKy8vIGp1c3QgYSBwcm9ncmFtIHRoYXQgcmVhZHMgYSBDb2RlR2VuZXJhdG9yUmVxdWVzdCBmcm9tIHN0ZGluIGFuZCB3cml0ZXMgYQ0KKy8vIENvZGVHZW5lcmF0b3JSZXNwb25zZSB0byBzdGRvdXQuDQorLy8NCisvLyBQbHVnaW5zIHdyaXR0ZW4gdXNpbmcgQysrIGNhbiB1c2UgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oIGluc3RlYWQNCisvLyBvZiBkZWFsaW5nIHdpdGggdGhlIHJhdyBwcm90b2NvbCBkZWZpbmVkIGhlcmUuDQorLy8NCisvLyBBIHBsdWdpbiBleGVjdXRhYmxlIG5lZWRzIG9ubHkgdG8gYmUgcGxhY2VkIHNvbWV3aGVyZSBpbiB0aGUgcGF0aC4gIFRoZQ0KKy8vIHBsdWdpbiBzaG91bGQgYmUgbmFtZWQgInByb3RvYy1nZW4tJE5BTUUiLCBhbmQgd2lsbCB0aGVuIGJlIHVzZWQgd2hlbiB0aGUNCisvLyBmbGFnICItLSR7TkFNRX1fb3V0IiBpcyBwYXNzZWQgdG8gcHJvdG9jLg0KKw0KK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyOw0KK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlciI7DQorb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIlBsdWdpblByb3RvcyI7DQorDQoraW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byI7DQorDQorLy8gQW4gZW5jb2RlZCBDb2RlR2VuZXJhdG9yUmVxdWVzdCBpcyB3cml0dGVuIHRvIHRoZSBwbHVnaW4ncyBzdGRpbi4NCittZXNzYWdlIENvZGVHZW5lcmF0b3JSZXF1ZXN0IHsNCisgIC8vIFRoZSAucHJvdG8gZmlsZXMgdGhhdCB3ZXJlIGV4cGxpY2l0bHkgbGlzdGVkIG9uIHRoZSBjb21tYW5kLWxpbmUuICBUaGUNCisgIC8vIGNvZGUgZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSBjb2RlIG9ubHkgZm9yIHRoZXNlIGZpbGVzLiAgRWFjaCBmaWxlJ3MNCisgIC8vIGRlc2NyaXB0b3Igd2lsbCBiZSBpbmNsdWRlZCBpbiBwcm90b19maWxlLCBiZWxvdy4NCisgIHJlcGVhdGVkIHN0cmluZyBmaWxlX3RvX2dlbmVyYXRlID0gMTsNCisNCisgIC8vIFRoZSBnZW5lcmF0b3IgcGFyYW1ldGVyIHBhc3NlZCBvbiB0aGUgY29tbWFuZC1saW5lLg0KKyAgb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7DQorDQorICAvLyBGaWxlRGVzY3JpcHRvclByb3RvcyBmb3IgYWxsIGZpbGVzIGluIGZpbGVzX3RvX2dlbmVyYXRlIGFuZCBldmVyeXRoaW5nDQorICAvLyB0aGV5IGltcG9ydC4gIFRoZSBmaWxlcyB3aWxsIGFwcGVhciBpbiB0b3BvbG9naWNhbCBvcmRlciwgc28gZWFjaCBmaWxlDQorICAvLyBhcHBlYXJzIGJlZm9yZSBhbnkgZmlsZSB0aGF0IGltcG9ydHMgaXQuDQorICAvLw0KKyAgLy8gcHJvdG9jIGd1YXJhbnRlZXMgdGhhdCBhbGwgcHJvdG9fZmlsZXMgd2lsbCBiZSB3cml0dGVuIGFmdGVyDQorICAvLyB0aGUgZmllbGRzIGFib3ZlLCBldmVuIHRob3VnaCB0aGlzIGlzIG5vdCB0ZWNobmljYWxseSBndWFyYW50ZWVkIGJ5IHRoZQ0KKyAgLy8gcHJvdG9idWYgd2lyZSBmb3JtYXQuICBUaGlzIHRoZW9yZXRpY2FsbHkgY291bGQgYWxsb3cgYSBwbHVnaW4gdG8gc3RyZWFtDQorICAvLyBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90b3MgYW5kIGhhbmRsZSB0aGVtIG9uZSBieSBvbmUgcmF0aGVyIHRoYW4gcmVhZA0KKyAgLy8gdGhlIGVudGlyZSBzZXQgaW50byBtZW1vcnkgYXQgb25jZS4gIEhvd2V2ZXIsIGFzIG9mIHRoaXMgd3JpdGluZywgdGhpcw0KKyAgLy8gaXMgbm90IHNpbWlsYXJseSBvcHRpbWl6ZWQgb24gcHJvdG9jJ3MgZW5kIC0tIGl0IHdpbGwgc3RvcmUgYWxsIGZpZWxkcyBpbg0KKyAgLy8gbWVtb3J5IGF0IG9uY2UgYmVmb3JlIHNlbmRpbmcgdGhlbSB0byB0aGUgcGx1Z2luLg0KKyAgcmVwZWF0ZWQgRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7DQorfQ0KKw0KKy8vIFRoZSBwbHVnaW4gd3JpdGVzIGFuIGVuY29kZWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlIHRvIHN0ZG91dC4NCittZXNzYWdlIENvZGVHZW5lcmF0b3JSZXNwb25zZSB7DQorICAvLyBFcnJvciBtZXNzYWdlLiAgSWYgbm9uLWVtcHR5LCBjb2RlIGdlbmVyYXRpb24gZmFpbGVkLiAgVGhlIHBsdWdpbiBwcm9jZXNzDQorICAvLyBzaG91bGQgZXhpdCB3aXRoIHN0YXR1cyBjb2RlIHplcm8gZXZlbiBpZiBpdCByZXBvcnRzIGFuIGVycm9yIGluIHRoaXMgd2F5Lg0KKyAgLy8NCisgIC8vIFRoaXMgc2hvdWxkIGJlIHVzZWQgdG8gaW5kaWNhdGUgZXJyb3JzIGluIC5wcm90byBmaWxlcyB3aGljaCBwcmV2ZW50IHRoZQ0KKyAgLy8gY29kZSBnZW5lcmF0b3IgZnJvbSBnZW5lcmF0aW5nIGNvcnJlY3QgY29kZS4gIEVycm9ycyB3aGljaCBpbmRpY2F0ZSBhDQorICAvLyBwcm9ibGVtIGluIHByb3RvYyBpdHNlbGYgLS0gc3VjaCBhcyB0aGUgaW5wdXQgQ29kZUdlbmVyYXRvclJlcXVlc3QgYmVpbmcNCisgIC8vIHVucGFyc2VhYmxlIC0tIHNob3VsZCBiZSByZXBvcnRlZCBieSB3cml0aW5nIGEgbWVzc2FnZSB0byBzdGRlcnIgYW5kDQorICAvLyBleGl0aW5nIHdpdGggYSBub24temVybyBzdGF0dXMgY29kZS4NCisgIG9wdGlvbmFsIHN0cmluZyBlcnJvciA9IDE7DQorDQorICAvLyBSZXByZXNlbnRzIGEgc2luZ2xlIGdlbmVyYXRlZCBmaWxlLg0KKyAgbWVzc2FnZSBGaWxlIHsNCisgICAgLy8gVGhlIGZpbGUgbmFtZSwgcmVsYXRpdmUgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuICBUaGUgbmFtZSBtdXN0IG5vdA0KKyAgICAvLyBjb250YWluICIuIiBvciAiLi4iIGNvbXBvbmVudHMgYW5kIG11c3QgYmUgcmVsYXRpdmUsIG5vdCBiZSBhYnNvbHV0ZSAoc28sDQorICAgIC8vIHRoZSBmaWxlIGNhbm5vdCBsaWUgb3V0c2lkZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSkuICAiLyIgbXVzdCBiZSB1c2VkIGFzDQorICAgIC8vIHRoZSBwYXRoIHNlcGFyYXRvciwgbm90ICJcIi4NCisgICAgLy8NCisgICAgLy8gSWYgdGhlIG5hbWUgaXMgb21pdHRlZCwgdGhlIGNvbnRlbnQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcHJldmlvdXMNCisgICAgLy8gZmlsZS4gIFRoaXMgYWxsb3dzIHRoZSBnZW5lcmF0b3IgdG8gYnJlYWsgbGFyZ2UgZmlsZXMgaW50byBzbWFsbCBjaHVua3MsDQorICAgIC8vIGFuZCBhbGxvd3MgdGhlIGdlbmVyYXRlZCB0ZXh0IHRvIGJlIHN0cmVhbWVkIGJhY2sgdG8gcHJvdG9jIHNvIHRoYXQgbGFyZ2UNCisgICAgLy8gZmlsZXMgbmVlZCBub3QgcmVzaWRlIGNvbXBsZXRlbHkgaW4gbWVtb3J5IGF0IG9uZSB0aW1lLiAgTm90ZSB0aGF0IGFzIG9mDQorICAgIC8vIHRoaXMgd3JpdGluZyBwcm90b2MgZG9lcyBub3Qgb3B0aW1pemUgZm9yIHRoaXMgLS0gaXQgd2lsbCByZWFkIHRoZSBlbnRpcmUNCisgICAgLy8gQ29kZUdlbmVyYXRvclJlc3BvbnNlIGJlZm9yZSB3cml0aW5nIGZpbGVzIHRvIGRpc2suDQorICAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsNCisNCisgICAgLy8gSWYgbm9uLWVtcHR5LCBpbmRpY2F0ZXMgdGhhdCB0aGUgbmFtZWQgZmlsZSBzaG91bGQgYWxyZWFkeSBleGlzdCwgYW5kIHRoZQ0KKyAgICAvLyBjb250ZW50IGhlcmUgaXMgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGF0IGZpbGUgYXQgYSBkZWZpbmVkIGluc2VydGlvbg0KKyAgICAvLyBwb2ludC4gIFRoaXMgZmVhdHVyZSBhbGxvd3MgYSBjb2RlIGdlbmVyYXRvciB0byBleHRlbmQgdGhlIG91dHB1dA0KKyAgICAvLyBwcm9kdWNlZCBieSBhbm90aGVyIGNvZGUgZ2VuZXJhdG9yLiAgVGhlIG9yaWdpbmFsIGdlbmVyYXRvciBtYXkgcHJvdmlkZQ0KKyAgICAvLyBpbnNlcnRpb24gcG9pbnRzIGJ5IHBsYWNpbmcgc3BlY2lhbCBhbm5vdGF0aW9ucyBpbiB0aGUgZmlsZSB0aGF0IGxvb2sNCisgICAgLy8gbGlrZToNCisgICAgLy8gICBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoTkFNRSkNCisgICAgLy8gVGhlIGFubm90YXRpb24gY2FuIGhhdmUgYXJiaXRyYXJ5IHRleHQgYmVmb3JlIGFuZCBhZnRlciBpdCBvbiB0aGUgbGluZSwNCisgICAgLy8gd2hpY2ggYWxsb3dzIGl0IHRvIGJlIHBsYWNlZCBpbiBhIGNvbW1lbnQuICBOQU1FIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoDQorICAgIC8vIGFuIGlkZW50aWZpZXIgbmFtaW5nIHRoZSBwb2ludCAtLSB0aGlzIGlzIHdoYXQgb3RoZXIgZ2VuZXJhdG9ycyB3aWxsIHVzZQ0KKyAgICAvLyBhcyB0aGUgaW5zZXJ0aW9uX3BvaW50LiAgQ29kZSBpbnNlcnRlZCBhdCB0aGlzIHBvaW50IHdpbGwgYmUgcGxhY2VkDQorICAgIC8vIGltbWVkaWF0ZWx5IGFib3ZlIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGluc2VydGlvbiBwb2ludCAodGh1cyBtdWx0aXBsZQ0KKyAgICAvLyBpbnNlcnRpb25zIHRvIHRoZSBzYW1lIHBvaW50IHdpbGwgY29tZSBvdXQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhZGRlZCkuDQorICAgIC8vIFRoZSBkb3VibGUtQCBpcyBpbnRlbmRlZCB0byBtYWtlIGl0IHVubGlrZWx5IHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlDQorICAgIC8vIGNvdWxkIGNvbnRhaW4gdGhpbmdzIHRoYXQgbG9vayBsaWtlIGluc2VydGlvbiBwb2ludHMgYnkgYWNjaWRlbnQuDQorICAgIC8vDQorICAgIC8vIEZvciBleGFtcGxlLCB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yIHBsYWNlcyB0aGUgZm9sbG93aW5nIGxpbmUgaW4gdGhlDQorICAgIC8vIC5wYi5oIGZpbGVzIHRoYXQgaXQgZ2VuZXJhdGVzOg0KKyAgICAvLyAgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpDQorICAgIC8vIFRoaXMgbGluZSBhcHBlYXJzIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGZpbGUncyBwYWNrYWdlIG5hbWVzcGFjZSwgYnV0DQorICAgIC8vIG91dHNpZGUgb2YgYW55IHBhcnRpY3VsYXIgY2xhc3MuICBBbm90aGVyIHBsdWdpbiBjYW4gdGhlbiBzcGVjaWZ5IHRoZQ0KKyAgICAvLyBpbnNlcnRpb25fcG9pbnQgIm5hbWVzcGFjZV9zY29wZSIgdG8gZ2VuZXJhdGUgYWRkaXRpb25hbCBjbGFzc2VzIG9yDQorICAgIC8vIG90aGVyIGRlY2xhcmF0aW9ucyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW4gdGhpcyBzY29wZS4NCisgICAgLy8NCisgICAgLy8gTm90ZSB0aGF0IGlmIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGluc2VydGlvbiBwb2ludCBiZWdpbnMgd2l0aA0KKyAgICAvLyB3aGl0ZXNwYWNlLCB0aGUgc2FtZSB3aGl0ZXNwYWNlIHdpbGwgYmUgYWRkZWQgdG8gZXZlcnkgbGluZSBvZiB0aGUNCisgICAgLy8gaW5zZXJ0ZWQgdGV4dC4gIFRoaXMgaXMgdXNlZnVsIGZvciBsYW5ndWFnZXMgbGlrZSBQeXRob24sIHdoZXJlDQorICAgIC8vIGluZGVudGF0aW9uIG1hdHRlcnMuICBJbiB0aGVzZSBsYW5ndWFnZXMsIHRoZSBpbnNlcnRpb24gcG9pbnQgY29tbWVudA0KKyAgICAvLyBzaG91bGQgYmUgaW5kZW50ZWQgdGhlIHNhbWUgYW1vdW50IGFzIGFueSBpbnNlcnRlZCBjb2RlIHdpbGwgbmVlZCB0byBiZQ0KKyAgICAvLyBpbiBvcmRlciB0byB3b3JrIGNvcnJlY3RseSBpbiB0aGF0IGNvbnRleHQuDQorICAgIC8vDQorICAgIC8vIFRoZSBjb2RlIGdlbmVyYXRvciB0aGF0IGdlbmVyYXRlcyB0aGUgaW5pdGlhbCBmaWxlIGFuZCB0aGUgb25lIHdoaWNoDQorICAgIC8vIGluc2VydHMgaW50byBpdCBtdXN0IGJvdGggcnVuIGFzIHBhcnQgb2YgYSBzaW5nbGUgaW52b2NhdGlvbiBvZiBwcm90b2MuDQorICAgIC8vIENvZGUgZ2VuZXJhdG9ycyBhcmUgZXhlY3V0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIG9uIHRoZQ0KKyAgICAvLyBjb21tYW5kIGxpbmUuDQorICAgIC8vDQorICAgIC8vIElmIHxpbnNlcnRpb25fcG9pbnR8IGlzIHByZXNlbnQsIHxuYW1lfCBtdXN0IGFsc28gYmUgcHJlc2VudC4NCisgICAgb3B0aW9uYWwgc3RyaW5nIGluc2VydGlvbl9wb2ludCA9IDI7DQorDQorICAgIC8vIFRoZSBmaWxlIGNvbnRlbnRzLg0KKyAgICBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1Ow0KKyAgfQ0KKyAgcmVwZWF0ZWQgRmlsZSBmaWxlID0gMTU7DQorfQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIGIvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5Yjk2YQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvCkBAIC0wLDAgKzEsMTE1IEBACisvLyBFeHRyYSBvcHRpb25zIGZvciBDIyBnZW5lcmF0b3INCisNCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsNCisNCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1ZjsNCisNCittZXNzYWdlIENTaGFycEZpbGVPcHRpb25zIHsNCisNCisgIC8vIE5hbWVzcGFjZSBmb3IgZ2VuZXJhdGVkIGNsYXNzZXM7IGRlZmF1bHRzIHRvIHRoZSBwYWNrYWdlLg0KKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWVzcGFjZSA9IDE7DQorICANCisgIC8vIE5hbWUgb2YgdGhlICJ1bWJyZWxsYSIgY2xhc3MgdXNlZCBmb3IgbWV0YWRhdGEgYWJvdXQgYWxsDQorICAvLyB0aGUgbWVzc2FnZXMgd2l0aGluIHRoaXMgZmlsZS4gRGVmYXVsdCBpcyBiYXNlZCBvbiB0aGUgbmFtZQ0KKyAgLy8gb2YgdGhlIGZpbGUuDQorICBvcHRpb25hbCBzdHJpbmcgdW1icmVsbGFfY2xhc3NuYW1lID0gMjsNCisgIA0KKyAgLy8gV2hldGhlciBjbGFzc2VzIHNob3VsZCBiZSBwdWJsaWMgKHRydWUpIG9yIGludGVybmFsIChmYWxzZSkNCisgIG9wdGlvbmFsIGJvb2wgcHVibGljX2NsYXNzZXMgPSAzIFtkZWZhdWx0ID0gdHJ1ZV07DQorDQorICAvLyBXaGV0aGVyIHRvIGdlbmVyYXRlIGEgc2luZ2xlIGZpbGUgZm9yIGV2ZXJ5dGhpbmcgd2l0aGluIHRoZQ0KKyAgLy8gLnByb3RvIGZpbGUgKGZhbHNlKSwgb3Igb25lIGZpbGUgcGVyIG1lc3NhZ2UgKHRydWUpLg0KKyAgLy8gVGhpcyBvcHRpb24gaXMgbm90IGN1cnJlbnRseSBob25vcmVkOyBwbGVhc2UgbG9nIGEgZmVhdHVyZQ0KKyAgLy8gcmVxdWVzdCBpZiB5b3UgcmVhbGx5IHdhbnQgaXQuDQorICBvcHRpb25hbCBib29sIG11bHRpcGxlX2ZpbGVzID0gNDsNCisNCisgIC8vIFdoZXRoZXIgdG8gbmVzdCBtZXNzYWdlcyB3aXRoaW4gYSBzaW5nbGUgdW1icmVsbGEgY2xhc3MgKHRydWUpDQorICAvLyBvciBjcmVhdGUgdGhlIHVtYnJlbGxhIGNsYXNzIGFzIGEgcGVlciwgd2l0aCBtZXNzYWdlcyBhcw0KKyAgLy8gdG9wLWxldmVsIGNsYXNzZXMgaW4gdGhlIG5hbWVzcGFjZSAoZmFsc2UpDQorICBvcHRpb25hbCBib29sIG5lc3RfY2xhc3NlcyA9IDU7DQorICANCisgIC8vIEdlbmVyYXRlIGFwcHJvcHJpYXRlIHN1cHBvcnQgZm9yIENvZGUgQ29udHJhY3RzDQorICAvLyAoT25nb2luZzsgc3VwcG9ydCBzaG91bGQgaW1wcm92ZSBvdmVyIHRpbWUpDQorICBvcHRpb25hbCBib29sIGNvZGVfY29udHJhY3RzID0gNjsNCisgIA0KKyAgLy8gQ3JlYXRlIHN1YmRpcmVjdG9yaWVzIGZvciBuYW1lc3BhY2VzLCBlLmcuIG5hbWVzcGFjZSAiRm9vLkJhciINCisgIC8vIHdvdWxkIGdlbmVyYXRlIGZpbGVzIHdpdGhpbiBbb3V0cHV0IGRpcmVjdG9yeV0vRm9vL0Jhcg0KKyAgb3B0aW9uYWwgYm9vbCBleHBhbmRfbmFtZXNwYWNlX2RpcmVjdG9yaWVzID0gNzsNCisNCisgIC8vIEdlbmVyYXRlIGF0dHJpYnV0ZXMgaW5kaWNhdGluZyBub24tQ0xTLWNvbXBsaWFuY2UNCisgIG9wdGlvbmFsIGJvb2wgY2xzX2NvbXBsaWFuY2UgPSA4IFtkZWZhdWx0ID0gdHJ1ZV07DQorICANCisgIC8vIEdlbmVyYXRlIG1lc3NhZ2VzL2J1aWxkZXJzIHdpdGggdGhlIFtTZXJpYWxpemFibGVdIGF0dHJpYnV0ZQ0KKyAgb3B0aW9uYWwgYm9vbCBhZGRfc2VyaWFsaXphYmxlID0gOSBbZGVmYXVsdCA9IGZhbHNlXTsNCisgIA0KKyAgLy8gR2VuZXJhdGVzIGEgcHJpdmF0ZSBjdG9yIGZvciBNZXNzYWdlIHR5cGVzDQorICBvcHRpb25hbCBib29sIGdlbmVyYXRlX3ByaXZhdGVfY3RvciA9IDEwIFtkZWZhdWx0ID0gdHJ1ZV07DQorDQorICAvLyBUaGUgZXh0ZW5zaW9uIHRoYXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSB1bWJyZWxsYV9jbGFzc25hbWUgd2hlbiBjcmVhdGluZyBmaWxlcy4NCisgIG9wdGlvbmFsIHN0cmluZyBmaWxlX2V4dGVuc2lvbiA9IDIyMSBbZGVmYXVsdCA9ICIuY3MiXTsNCisgIA0KKyAgLy8gQSBuZXN0ZWQgbmFtZXNwYWNlIGZvciB0aGUgdW1icmVsbGEgY2xhc3MuICBIZWxwZnVsIGZvciBuYW1lIGNvbGxpc2lvbnMgY2F1c2VkIGJ5IA0KKyAgLy8gdW1icmVsbGFfY2xhc3NuYW1lIGNvbmZsaWN0aW5nIHdpdGggYW4gZXhpc3RpbmcgdHlwZS4gIFRoaXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5DQorICAvLyBzZXQgdG8gJ1Byb3RvJyBpZiBhIGNvbGxpc2lvbiBpcyBkZXRlY3RlZCB3aXRoIHR5cGVzIGJlaW5nIGdlbmVyYXRlZC4gIFRoaXMgdmFsdWUNCisgIC8vIGlzIGlnbm9yZWQgd2hlbiBuZXN0X2NsYXNzZXMgPT0gdHJ1ZQ0KKyAgb3B0aW9uYWwgc3RyaW5nIHVtYnJlbGxhX25hbWVzcGFjZSA9IDIyMjsNCisgIA0KKyAgLy8gVGhlIG91dHB1dCBwYXRoIGZvciB0aGUgc291cmNlIGZpbGUocykgZ2VuZXJhdGVkDQorICBvcHRpb25hbCBzdHJpbmcgb3V0cHV0X2RpcmVjdG9yeSA9IDIyMyBbZGVmYXVsdCA9ICIuIl07DQorDQorICAvLyBXaWxsIGlnbm9yZSB0aGUgdHlwZSBnZW5lcmF0aW9ucyBhbmQgcmVtb3ZlIGRlcGVuZGVuY2llcyBmb3IgdGhlIGRlc2NyaXB0b3IgcHJvdG8NCisgIC8vIGZpbGVzIHRoYXQgZGVjbGFyZSB0aGVpciBwYWNrYWdlIHRvIGJlICJnb29nbGUucHJvdG9idWYiDQorICBvcHRpb25hbCBib29sIGlnbm9yZV9nb29nbGVfcHJvdG9idWYgPSAyMjQgW2RlZmF1bHQgPSBmYWxzZV07DQorDQorICAvLyBDb250cm9scyBob3cgc2VydmljZXMgYXJlIGdlbmVyYXRlZCwgR0VORVJJQyBpcyB0aGUgZGVwcmVjYXRlZCBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbg0KKyAgLy8gSU5URVJGQUNFIGdlbmVyYXRlcyBzZXJ2aWNlIGludGVyZmFjZXMgb25seSwgUlBDSU5URVJPUCBnZW5lcmF0ZXMgaW50ZXJmYWNlcyBhbmQgDQorICAvLyBpbXBsZW1lbnRhdGlvbnMgdXNpbmcgdGhlIGluY2x1ZGVkIFdpbmRvd3MgUlBDIGludGVyb3AgbGliYXJhcnkuDQorICBvcHRpb25hbCBDU2hhcnBTZXJ2aWNlVHlwZSBzZXJ2aWNlX2dlbmVyYXRvcl90eXBlID0gMjI1IFtkZWZhdWx0ID0gTk9ORV07DQorICANCisgIC8vIFVzZWQgdG8gYWRkIHRoZSBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzLkNvbXBpbGVyR2VuZXJhdGVkQXR0cmlidXRlIGFuZCANCisgIC8vIFN5c3RlbS5Db2RlRG9tLkNvbXBpbGVyLkdlbmVyYXRlZENvZGVBdHRyaWJ1dGUgYXR0cmlidXRlcyB0byBnZW5lcmF0ZWQgY29kZS4NCisgIG9wdGlvbmFsIGJvb2wgZ2VuZXJhdGVkX2NvZGVfYXR0cmlidXRlcyA9IDIyNiBbZGVmYXVsdCA9IGZhbHNlXTsNCit9DQorDQorZW51bSBDU2hhcnBTZXJ2aWNlVHlwZSB7DQorICAvLyBTZXJ2aWNlcyBhcmUgaWdub3JlZCBieSB0aGUgZ2VuZXJhdG9yDQorICBOT05FID0gMDsNCisgIC8vIEdlbmVyYXRlcyB0aGUgb3JpZ2luYWwgSmF2YSBnZW5lcmljIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zDQorICBHRU5FUklDID0gMTsNCisgIC8vIEdlbmVyYXRlcyBhbiBpbnRlcmZhY2UgZm9yIHRoZSBzZXJ2aWNlIGFuZCBub3RoaW5nIGVsc2UNCisgIElOVEVSRkFDRSA9IDI7DQorICAvLyBHZW5lcmF0ZXMgYW4gaW50ZXJmYWNlIGZvciB0aGUgc2VydmljZSBhbmQgY2xpZW50L3NlcnZlciB3cmFwcGVycyBmb3IgdGhlIGludGVyZmFjZQ0KKyAgSVJQQ0RJU1BBVENIID0gMzsNCit9DQorDQorZXh0ZW5kIEZpbGVPcHRpb25zIHsNCisgIG9wdGlvbmFsIENTaGFycEZpbGVPcHRpb25zIGNzaGFycF9maWxlX29wdGlvbnMgPSAxMDAwOw0KK30NCisNCitleHRlbmQgRmllbGRPcHRpb25zIHsNCisgIG9wdGlvbmFsIENTaGFycEZpZWxkT3B0aW9ucyBjc2hhcnBfZmllbGRfb3B0aW9ucyA9IDEwMDA7DQorfQ0KKw0KK21lc3NhZ2UgQ1NoYXJwRmllbGRPcHRpb25zIHsNCisgIC8vIFByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIG92ZXJyaWRlIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQ0KKyAgLy8gZ2VuZXJhdGVkIGZvciB0aGlzIGZpZWxkLiBUaGlzIGlzIGFwcGxpZWQgdG8gYWxsIHByb3BlcnRpZXMNCisgIC8vIGFuZCBtZXRob2RzIHRvIGRvIHdpdGggdGhpcyBmaWVsZCwgaW5jbHVkaW5nIEhhc0ZvbywgRm9vQ291bnQsDQorICAvLyBGb29MaXN0IGV0Yy4NCisgIG9wdGlvbmFsIHN0cmluZyBwcm9wZXJ0eV9uYW1lID0gMTsNCit9DQorDQorbWVzc2FnZSBDU2hhcnBTZXJ2aWNlT3B0aW9ucyB7DQorICBvcHRpb25hbCBzdHJpbmcgaW50ZXJmYWNlX2lkID0gMTsNCit9DQorDQorZXh0ZW5kIFNlcnZpY2VPcHRpb25zIHsNCisgIG9wdGlvbmFsIENTaGFycFNlcnZpY2VPcHRpb25zIGNzaGFycF9zZXJ2aWNlX29wdGlvbnMgPSAxMDAwOw0KK30NCisNCittZXNzYWdlIENTaGFycE1ldGhvZE9wdGlvbnMgew0KKyAgb3B0aW9uYWwgaW50MzIgZGlzcGF0Y2hfaWQgPSAxOw0KK30NCisNCitleHRlbmQgTWV0aG9kT3B0aW9ucyB7DQorICBvcHRpb25hbCBDU2hhcnBNZXRob2RPcHRpb25zIGNzaGFycF9tZXRob2Rfb3B0aW9ucyA9IDEwMDA7DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8gYi9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzM2Y4NzkKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvCkBAIC0wLDAgKzEsNTMzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGUgbWVzc2FnZXMgaW4gdGhpcyBmaWxlIGRlc2NyaWJlIHRoZSBkZWZpbml0aW9ucyBmb3VuZCBpbiAucHJvdG8gZmlsZXMuCisvLyBBIHZhbGlkIC5wcm90byBmaWxlIGNhbiBiZSB0cmFuc2xhdGVkIGRpcmVjdGx5IHRvIGEgRmlsZURlc2NyaXB0b3JQcm90bworLy8gd2l0aG91dCBhbnkgb3RoZXIgaW5mb3JtYXRpb24gKGUuZy4gd2l0aG91dCByZWFkaW5nIGl0cyBpbXBvcnRzKS4KKworCisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJEZXNjcmlwdG9yUHJvdG9zIjsKKworLy8gZGVzY3JpcHRvci5wcm90byBtdXN0IGJlIG9wdGltaXplZCBmb3Igc3BlZWQgYmVjYXVzZSByZWZsZWN0aW9uLWJhc2VkCisvLyBhbGdvcml0aG1zIGRvbid0IHdvcmsgZHVyaW5nIGJvb3RzdHJhcHBpbmcuCitvcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7CisKKy8vIFRoZSBwcm90b2NvbCBjb21waWxlciBjYW4gb3V0cHV0IGEgRmlsZURlc2NyaXB0b3JTZXQgY29udGFpbmluZyB0aGUgLnByb3RvCisvLyBmaWxlcyBpdCBwYXJzZXMuCittZXNzYWdlIEZpbGVEZXNjcmlwdG9yU2V0IHsKKyAgcmVwZWF0ZWQgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlID0gMTsKK30KKworLy8gRGVzY3JpYmVzIGEgY29tcGxldGUgLnByb3RvIGZpbGUuCittZXNzYWdlIEZpbGVEZXNjcmlwdG9yUHJvdG8geworICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7ICAgICAgIC8vIGZpbGUgbmFtZSwgcmVsYXRpdmUgdG8gcm9vdCBvZiBzb3VyY2UgdHJlZQorICBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7ICAgIC8vIGUuZy4gImZvbyIsICJmb28uYmFyIiwgZXRjLgorCisgIC8vIE5hbWVzIG9mIGZpbGVzIGltcG9ydGVkIGJ5IHRoaXMgZmlsZS4KKyAgcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOworCisgIC8vIEFsbCB0b3AtbGV2ZWwgZGVmaW5pdGlvbnMgaW4gdGhpcyBmaWxlLgorICByZXBlYXRlZCBEZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKKyAgcmVwZWF0ZWQgRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OworICByZXBlYXRlZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIHNlcnZpY2UgPSA2OworICByZXBlYXRlZCBGaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA3OworCisgIG9wdGlvbmFsIEZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OworCisgIC8vIFRoaXMgZmllbGQgY29udGFpbnMgb3B0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLgorICAvLyBZb3UgbWF5IHNhZmVseSByZW1vdmUgdGhpcyBlbnRpcmUgZmllbGQgd2hpdGhvdXQgaGFybWluZyBydW50aW1lCisgIC8vIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGRlc2NyaXB0b3JzIC0tIHRoZSBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgb25seSBieQorICAvLyBkZXZlbG9wbWVudCB0b29scy4KKyAgb3B0aW9uYWwgU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7Cit9CisKKy8vIERlc2NyaWJlcyBhIG1lc3NhZ2UgdHlwZS4KK21lc3NhZ2UgRGVzY3JpcHRvclByb3RvIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworCisgIHJlcGVhdGVkIEZpZWxkRGVzY3JpcHRvclByb3RvIGZpZWxkID0gMjsKKyAgcmVwZWF0ZWQgRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNjsKKworICByZXBlYXRlZCBEZXNjcmlwdG9yUHJvdG8gbmVzdGVkX3R5cGUgPSAzOworICByZXBlYXRlZCBFbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDQ7CisKKyAgbWVzc2FnZSBFeHRlbnNpb25SYW5nZSB7CisgICAgb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOworICAgIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7CisgIH0KKyAgcmVwZWF0ZWQgRXh0ZW5zaW9uUmFuZ2UgZXh0ZW5zaW9uX3JhbmdlID0gNTsKKworICBvcHRpb25hbCBNZXNzYWdlT3B0aW9ucyBvcHRpb25zID0gNzsKK30KKworLy8gRGVzY3JpYmVzIGEgZmllbGQgd2l0aGluIGEgbWVzc2FnZS4KK21lc3NhZ2UgRmllbGREZXNjcmlwdG9yUHJvdG8geworICBlbnVtIFR5cGUgeworICAgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycy4KKyAgICAvLyBPcmRlciBpcyB3ZWlyZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLgorICAgIFRZUEVfRE9VQkxFICAgICAgICAgPSAxOworICAgIFRZUEVfRkxPQVQgICAgICAgICAgPSAyOworICAgIFRZUEVfSU5UNjQgICAgICAgICAgPSAzOyAgIC8vIE5vdCBaaWdaYWcgZW5jb2RlZC4gIE5lZ2F0aXZlIG51bWJlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIDEwIGJ5dGVzLiAgVXNlIFRZUEVfU0lOVDY0IGlmIG5lZ2F0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIGFyZSBsaWtlbHkuCisgICAgVFlQRV9VSU5UNjQgICAgICAgICA9IDQ7CisgICAgVFlQRV9JTlQzMiAgICAgICAgICA9IDU7ICAgLy8gTm90IFppZ1phZyBlbmNvZGVkLiAgTmVnYXRpdmUgbnVtYmVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgMTAgYnl0ZXMuICBVc2UgVFlQRV9TSU5UMzIgaWYgbmVnYXRpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgYXJlIGxpa2VseS4KKyAgICBUWVBFX0ZJWEVENjQgICAgICAgID0gNjsKKyAgICBUWVBFX0ZJWEVEMzIgICAgICAgID0gNzsKKyAgICBUWVBFX0JPT0wgICAgICAgICAgID0gODsKKyAgICBUWVBFX1NUUklORyAgICAgICAgID0gOTsKKyAgICBUWVBFX0dST1VQICAgICAgICAgID0gMTA7ICAvLyBUYWctZGVsaW1pdGVkIGFnZ3JlZ2F0ZS4KKyAgICBUWVBFX01FU1NBR0UgICAgICAgID0gMTE7ICAvLyBMZW5ndGgtZGVsaW1pdGVkIGFnZ3JlZ2F0ZS4KKworICAgIC8vIE5ldyBpbiB2ZXJzaW9uIDIuCisgICAgVFlQRV9CWVRFUyAgICAgICAgICA9IDEyOworICAgIFRZUEVfVUlOVDMyICAgICAgICAgPSAxMzsKKyAgICBUWVBFX0VOVU0gICAgICAgICAgID0gMTQ7CisgICAgVFlQRV9TRklYRUQzMiAgICAgICA9IDE1OworICAgIFRZUEVfU0ZJWEVENjQgICAgICAgPSAxNjsKKyAgICBUWVBFX1NJTlQzMiAgICAgICAgID0gMTc7ICAvLyBVc2VzIFppZ1phZyBlbmNvZGluZy4KKyAgICBUWVBFX1NJTlQ2NCAgICAgICAgID0gMTg7ICAvLyBVc2VzIFppZ1phZyBlbmNvZGluZy4KKyAgfTsKKworICBlbnVtIExhYmVsIHsKKyAgICAvLyAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMKKyAgICBMQUJFTF9PUFRJT05BTCAgICAgID0gMTsKKyAgICBMQUJFTF9SRVFVSVJFRCAgICAgID0gMjsKKyAgICBMQUJFTF9SRVBFQVRFRCAgICAgID0gMzsKKyAgICAvLyBUT0RPKHNhbmpheSk6IFNob3VsZCB3ZSBhZGQgTEFCRUxfTUFQPworICB9OworCisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMzsKKyAgb3B0aW9uYWwgTGFiZWwgbGFiZWwgPSA0OworCisgIC8vIElmIHR5cGVfbmFtZSBpcyBzZXQsIHRoaXMgbmVlZCBub3QgYmUgc2V0LiAgSWYgYm90aCB0aGlzIGFuZCB0eXBlX25hbWUKKyAgLy8gYXJlIHNldCwgdGhpcyBtdXN0IGJlIGVpdGhlciBUWVBFX0VOVU0gb3IgVFlQRV9NRVNTQUdFLgorICBvcHRpb25hbCBUeXBlIHR5cGUgPSA1OworCisgIC8vIEZvciBtZXNzYWdlIGFuZCBlbnVtIHR5cGVzLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlLiAgSWYgdGhlIG5hbWUKKyAgLy8gc3RhcnRzIHdpdGggYSAnLicsIGl0IGlzIGZ1bGx5LXF1YWxpZmllZC4gIE90aGVyd2lzZSwgQysrLWxpa2Ugc2NvcGluZworICAvLyBydWxlcyBhcmUgdXNlZCB0byBmaW5kIHRoZSB0eXBlIChpLmUuIGZpcnN0IHRoZSBuZXN0ZWQgdHlwZXMgd2l0aGluIHRoaXMKKyAgLy8gbWVzc2FnZSBhcmUgc2VhcmNoZWQsIHRoZW4gd2l0aGluIHRoZSBwYXJlbnQsIG9uIHVwIHRvIHRoZSByb290CisgIC8vIG5hbWVzcGFjZSkuCisgIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OworCisgIC8vIEZvciBleHRlbnNpb25zLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIGJlaW5nIGV4dGVuZGVkLiAgSXQgaXMKKyAgLy8gcmVzb2x2ZWQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHR5cGVfbmFtZS4KKyAgb3B0aW9uYWwgc3RyaW5nIGV4dGVuZGVlID0gMjsKKworICAvLyBGb3IgbnVtZXJpYyB0eXBlcywgY29udGFpbnMgdGhlIG9yaWdpbmFsIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLgorICAvLyBGb3IgYm9vbGVhbnMsICJ0cnVlIiBvciAiZmFsc2UiLgorICAvLyBGb3Igc3RyaW5ncywgY29udGFpbnMgdGhlIGRlZmF1bHQgdGV4dCBjb250ZW50cyAobm90IGVzY2FwZWQgaW4gYW55IHdheSkuCisgIC8vIEZvciBieXRlcywgY29udGFpbnMgdGhlIEMgZXNjYXBlZCB2YWx1ZS4gIEFsbCBieXRlcyA+PSAxMjggYXJlIGVzY2FwZWQuCisgIC8vIFRPRE8oa2VudG9uKTogIEJhc2UtNjQgZW5jb2RlPworICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWx1ZSA9IDc7CisKKyAgb3B0aW9uYWwgRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OworfQorCisvLyBEZXNjcmliZXMgYW4gZW51bSB0eXBlLgorbWVzc2FnZSBFbnVtRGVzY3JpcHRvclByb3RvIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworCisgIHJlcGVhdGVkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byB2YWx1ZSA9IDI7CisKKyAgb3B0aW9uYWwgRW51bU9wdGlvbnMgb3B0aW9ucyA9IDM7Cit9CisKKy8vIERlc2NyaWJlcyBhIHZhbHVlIHdpdGhpbiBhbiBlbnVtLgorbWVzc2FnZSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8geworICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7CisKKyAgb3B0aW9uYWwgRW51bVZhbHVlT3B0aW9ucyBvcHRpb25zID0gMzsKK30KKworLy8gRGVzY3JpYmVzIGEgc2VydmljZS4KK21lc3NhZ2UgU2VydmljZURlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgcmVwZWF0ZWQgTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7CisKKyAgb3B0aW9uYWwgU2VydmljZU9wdGlvbnMgb3B0aW9ucyA9IDM7Cit9CisKKy8vIERlc2NyaWJlcyBhIG1ldGhvZCBvZiBhIHNlcnZpY2UuCittZXNzYWdlIE1ldGhvZERlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKworICAvLyBJbnB1dCBhbmQgb3V0cHV0IHR5cGUgbmFtZXMuICBUaGVzZSBhcmUgcmVzb2x2ZWQgaW4gdGhlIHNhbWUgd2F5IGFzCisgIC8vIEZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSwgYnV0IG11c3QgcmVmZXIgdG8gYSBtZXNzYWdlIHR5cGUuCisgIG9wdGlvbmFsIHN0cmluZyBpbnB1dF90eXBlID0gMjsKKyAgb3B0aW9uYWwgc3RyaW5nIG91dHB1dF90eXBlID0gMzsKKworICBvcHRpb25hbCBNZXRob2RPcHRpb25zIG9wdGlvbnMgPSA0OworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBPcHRpb25zCisKKy8vIEVhY2ggb2YgdGhlIGRlZmluaXRpb25zIGFib3ZlIG1heSBoYXZlICJvcHRpb25zIiBhdHRhY2hlZC4gIFRoZXNlIGFyZQorLy8ganVzdCBhbm5vdGF0aW9ucyB3aGljaCBtYXkgY2F1c2UgY29kZSB0byBiZSBnZW5lcmF0ZWQgc2xpZ2h0bHkgZGlmZmVyZW50bHkKKy8vIG9yIG1heSBjb250YWluIGhpbnRzIGZvciBjb2RlIHRoYXQgbWFuaXB1bGF0ZXMgcHJvdG9jb2wgbWVzc2FnZXMuCisvLworLy8gQ2xpZW50cyBtYXkgZGVmaW5lIGN1c3RvbSBvcHRpb25zIGFzIGV4dGVuc2lvbnMgb2YgdGhlICpPcHRpb25zIG1lc3NhZ2VzLgorLy8gVGhlc2UgZXh0ZW5zaW9ucyBtYXkgbm90IHlldCBiZSBrbm93biBhdCBwYXJzaW5nIHRpbWUsIHNvIHRoZSBwYXJzZXIgY2Fubm90CisvLyBzdG9yZSB0aGUgdmFsdWVzIGluIHRoZW0uICBJbnN0ZWFkIGl0IHN0b3JlcyB0aGVtIGluIGEgZmllbGQgaW4gdGhlICpPcHRpb25zCisvLyBtZXNzYWdlIGNhbGxlZCB1bmludGVycHJldGVkX29wdGlvbi4gVGhpcyBmaWVsZCBtdXN0IGhhdmUgdGhlIHNhbWUgbmFtZQorLy8gYWNyb3NzIGFsbCAqT3B0aW9ucyBtZXNzYWdlcy4gV2UgdGhlbiB1c2UgdGhpcyBmaWVsZCB0byBwb3B1bGF0ZSB0aGUKKy8vIGV4dGVuc2lvbnMgd2hlbiB3ZSBidWlsZCBhIGRlc2NyaXB0b3IsIGF0IHdoaWNoIHBvaW50IGFsbCBwcm90b3MgaGF2ZSBiZWVuCisvLyBwYXJzZWQgYW5kIHNvIGFsbCBleHRlbnNpb25zIGFyZSBrbm93bi4KKy8vCisvLyBFeHRlbnNpb24gbnVtYmVycyBmb3IgY3VzdG9tIG9wdGlvbnMgbWF5IGJlIGNob3NlbiBhcyBmb2xsb3dzOgorLy8gKiBGb3Igb3B0aW9ucyB3aGljaCB3aWxsIG9ubHkgYmUgdXNlZCB3aXRoaW4gYSBzaW5nbGUgYXBwbGljYXRpb24gb3IKKy8vICAgb3JnYW5pemF0aW9uLCBvciBmb3IgZXhwZXJpbWVudGFsIG9wdGlvbnMsIHVzZSBmaWVsZCBudW1iZXJzIDUwMDAwCisvLyAgIHRocm91Z2ggOTk5OTkuICBJdCBpcyB1cCB0byB5b3UgdG8gZW5zdXJlIHRoYXQgeW91IGRvIG5vdCB1c2UgdGhlCisvLyAgIHNhbWUgbnVtYmVyIGZvciBtdWx0aXBsZSBvcHRpb25zLgorLy8gKiBGb3Igb3B0aW9ucyB3aGljaCB3aWxsIGJlIHB1Ymxpc2hlZCBhbmQgdXNlZCBwdWJsaWNseSBieSBtdWx0aXBsZQorLy8gICBpbmRlcGVuZGVudCBlbnRpdGllcywgZS1tYWlsIGtlbnRvbkBnb29nbGUuY29tIHRvIHJlc2VydmUgZXh0ZW5zaW9uCisvLyAgIG51bWJlcnMuICBTaW1wbHkgdGVsbCBtZSBob3cgbWFueSB5b3UgbmVlZCBhbmQgSSdsbCBzZW5kIHlvdSBiYWNrIGEKKy8vICAgc2V0IG9mIG51bWJlcnMgdG8gdXNlIC0tIHRoZXJlJ3Mgbm8gbmVlZCB0byBleHBsYWluIGhvdyB5b3UgaW50ZW5kIHRvCisvLyAgIHVzZSB0aGVtLiAgSWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgcG9wdWxhciwgYSB3ZWIgc2VydmljZSB3aWxsIGJlIHNldCB1cAorLy8gICB0byBhdXRvbWF0aWNhbGx5IGFzc2lnbiBvcHRpb24gbnVtYmVycy4KKworCittZXNzYWdlIEZpbGVPcHRpb25zIHsKKworICAvLyBTZXRzIHRoZSBKYXZhIHBhY2thZ2Ugd2hlcmUgY2xhc3NlcyBnZW5lcmF0ZWQgZnJvbSB0aGlzIC5wcm90byB3aWxsIGJlCisgIC8vIHBsYWNlZC4gIEJ5IGRlZmF1bHQsIHRoZSBwcm90byBwYWNrYWdlIGlzIHVzZWQsIGJ1dCB0aGlzIGlzIG9mdGVuCisgIC8vIGluYXBwcm9wcmlhdGUgYmVjYXVzZSBwcm90byBwYWNrYWdlcyBkbyBub3Qgbm9ybWFsbHkgc3RhcnQgd2l0aCBiYWNrd2FyZHMKKyAgLy8gZG9tYWluIG5hbWVzLgorICBvcHRpb25hbCBzdHJpbmcgamF2YV9wYWNrYWdlID0gMTsKKworCisgIC8vIElmIHNldCwgYWxsIHRoZSBjbGFzc2VzIGZyb20gdGhlIC5wcm90byBmaWxlIGFyZSB3cmFwcGVkIGluIGEgc2luZ2xlCisgIC8vIG91dGVyIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUuICBUaGlzIGFwcGxpZXMgdG8gYm90aCBQcm90bzEKKyAgLy8gKGVxdWl2YWxlbnQgdG8gdGhlIG9sZCAiLS1vbmVfamF2YV9maWxlIiBvcHRpb24pIGFuZCBQcm90bzIgKHdoZXJlCisgIC8vIGEgLnByb3RvIGFsd2F5cyB0cmFuc2xhdGVzIHRvIGEgc2luZ2xlIGNsYXNzLCBidXQgeW91IG1heSB3YW50IHRvCisgIC8vIGV4cGxpY2l0bHkgY2hvb3NlIHRoZSBjbGFzcyBuYW1lKS4KKyAgb3B0aW9uYWwgc3RyaW5nIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gODsKKworICAvLyBJZiBzZXQgdHJ1ZSwgdGhlbiB0aGUgSmF2YSBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGEgc2VwYXJhdGUgLmphdmEKKyAgLy8gZmlsZSBmb3IgZWFjaCB0b3AtbGV2ZWwgbWVzc2FnZSwgZW51bSwgYW5kIHNlcnZpY2UgZGVmaW5lZCBpbiB0aGUgLnByb3RvCisgIC8vIGZpbGUuICBUaHVzLCB0aGVzZSB0eXBlcyB3aWxsICpub3QqIGJlIG5lc3RlZCBpbnNpZGUgdGhlIG91dGVyIGNsYXNzCisgIC8vIG5hbWVkIGJ5IGphdmFfb3V0ZXJfY2xhc3NuYW1lLiAgSG93ZXZlciwgdGhlIG91dGVyIGNsYXNzIHdpbGwgc3RpbGwgYmUKKyAgLy8gZ2VuZXJhdGVkIHRvIGNvbnRhaW4gdGhlIGZpbGUncyBnZXREZXNjcmlwdG9yKCkgbWV0aG9kIGFzIHdlbGwgYXMgYW55CisgIC8vIHRvcC1sZXZlbCBleHRlbnNpb25zIGRlZmluZWQgaW4gdGhlIGZpbGUuCisgIG9wdGlvbmFsIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlcyA9IDEwIFtkZWZhdWx0PWZhbHNlXTsKKworICAvLyBJZiBzZXQgdHJ1ZSwgdGhlbiB0aGUgSmF2YSBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGVxdWFscygpIGFuZAorICAvLyBoYXNoQ29kZSgpIG1ldGhvZHMgZm9yIGFsbCBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4gVGhpcyBpcworICAvLyBwdXJlbHkgYSBzcGVlZCBvcHRpbWl6YXRpb24sIGFzIHRoZSBBYnN0cmFjdE1lc3NhZ2UgYmFzZSBjbGFzcyBpbmNsdWRlcworICAvLyByZWZsZWN0aW9uLWJhc2VkIGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBtZXRob2RzLgorICBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gMjAgW2RlZmF1bHQ9ZmFsc2VdOworCisgIC8vIEdlbmVyYXRlZCBjbGFzc2VzIGNhbiBiZSBvcHRpbWl6ZWQgZm9yIHNwZWVkIG9yIGNvZGUgc2l6ZS4KKyAgZW51bSBPcHRpbWl6ZU1vZGUgeworICAgIFNQRUVEID0gMTsgICAgICAgIC8vIEdlbmVyYXRlIGNvbXBsZXRlIGNvZGUgZm9yIHBhcnNpbmcsIHNlcmlhbGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgLy8gZXRjLgorICAgIENPREVfU0laRSA9IDI7ICAgIC8vIFVzZSBSZWZsZWN0aW9uT3BzIHRvIGltcGxlbWVudCB0aGVzZSBtZXRob2RzLgorICAgIExJVEVfUlVOVElNRSA9IDM7IC8vIEdlbmVyYXRlIGNvZGUgdXNpbmcgTWVzc2FnZUxpdGUgYW5kIHRoZSBsaXRlIHJ1bnRpbWUuCisgIH0KKyAgb3B0aW9uYWwgT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQ9U1BFRURdOworCisKKworCisgIC8vIFNob3VsZCBnZW5lcmljIHNlcnZpY2VzIGJlIGdlbmVyYXRlZCBpbiBlYWNoIGxhbmd1YWdlPyAgIkdlbmVyaWMiIHNlcnZpY2VzCisgIC8vIGFyZSBub3Qgc3BlY2lmaWMgdG8gYW55IHBhcnRpY3VsYXIgUlBDIHN5c3RlbS4gIFRoZXkgYXJlIGdlbmVyYXRlZCBieSB0aGUKKyAgLy8gbWFpbiBjb2RlIGdlbmVyYXRvcnMgaW4gZWFjaCBsYW5ndWFnZSAod2l0aG91dCBhZGRpdGlvbmFsIHBsdWdpbnMpLgorICAvLyBHZW5lcmljIHNlcnZpY2VzIHdlcmUgdGhlIG9ubHkga2luZCBvZiBzZXJ2aWNlIGdlbmVyYXRpb24gc3VwcG9ydGVkIGJ5CisgIC8vIGVhcmx5IHZlcnNpb25zIG9mIHByb3RvMi4KKyAgLy8KKyAgLy8gR2VuZXJpYyBzZXJ2aWNlcyBhcmUgbm93IGNvbnNpZGVyZWQgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB1c2luZyBwbHVnaW5zCisgIC8vIHRoYXQgZ2VuZXJhdGUgY29kZSBzcGVjaWZpYyB0byB5b3VyIHBhcnRpY3VsYXIgUlBDIHN5c3RlbS4gIFRoZXJlZm9yZSwKKyAgLy8gdGhlc2UgZGVmYXVsdCB0byBmYWxzZS4gIE9sZCBjb2RlIHdoaWNoIGRlcGVuZHMgb24gZ2VuZXJpYyBzZXJ2aWNlcyBzaG91bGQKKyAgLy8gZXhwbGljaXRseSBzZXQgdGhlbSB0byB0cnVlLgorICBvcHRpb25hbCBib29sIGNjX2dlbmVyaWNfc2VydmljZXMgPSAxNiBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzID0gMTcgW2RlZmF1bHQ9ZmFsc2VdOworICBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdD1mYWxzZV07CisKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgTWVzc2FnZU9wdGlvbnMgeworICAvLyBTZXQgdHJ1ZSB0byB1c2UgdGhlIG9sZCBwcm90bzEgTWVzc2FnZVNldCB3aXJlIGZvcm1hdCBmb3IgZXh0ZW5zaW9ucy4KKyAgLy8gVGhpcyBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTWVzc2FnZVNldCB3aXJlCisgIC8vIGZvcm1hdC4gIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGZvciBhbnkgb3RoZXIgcmVhc29uOiAgSXQncyBsZXNzCisgIC8vIGVmZmljaWVudCwgaGFzIGZld2VyIGZlYXR1cmVzLCBhbmQgaXMgbW9yZSBjb21wbGljYXRlZC4KKyAgLy8KKyAgLy8gVGhlIG1lc3NhZ2UgbXVzdCBiZSBkZWZpbmVkIGV4YWN0bHkgYXMgZm9sbG93czoKKyAgLy8gICBtZXNzYWdlIEZvbyB7CisgIC8vICAgICBvcHRpb24gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlOworICAvLyAgICAgZXh0ZW5zaW9ucyA0IHRvIG1heDsKKyAgLy8gICB9CisgIC8vIE5vdGUgdGhhdCB0aGUgbWVzc2FnZSBjYW5ub3QgaGF2ZSBhbnkgZGVmaW5lZCBmaWVsZHM7IE1lc3NhZ2VTZXRzIG9ubHkKKyAgLy8gaGF2ZSBleHRlbnNpb25zLgorICAvLworICAvLyBBbGwgZXh0ZW5zaW9ucyBvZiB5b3VyIHR5cGUgbXVzdCBiZSBzaW5ndWxhciBtZXNzYWdlczsgZS5nLiB0aGV5IGNhbm5vdAorICAvLyBiZSBpbnQzMnMsIGVudW1zLCBvciByZXBlYXRlZCBtZXNzYWdlcy4KKyAgLy8KKyAgLy8gQmVjYXVzZSB0aGlzIGlzIGFuIG9wdGlvbiwgdGhlIGFib3ZlIHR3byByZXN0cmljdGlvbnMgYXJlIG5vdCBlbmZvcmNlZCBieQorICAvLyB0aGUgcHJvdG9jb2wgY29tcGlsZXIuCisgIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0PWZhbHNlXTsKKworICAvLyBEaXNhYmxlcyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgc3RhbmRhcmQgImRlc2NyaXB0b3IoKSIgYWNjZXNzb3IsIHdoaWNoIGNhbgorICAvLyBjb25mbGljdCB3aXRoIGEgZmllbGQgb2YgdGhlIHNhbWUgbmFtZS4gIFRoaXMgaXMgbWVhbnQgdG8gbWFrZSBtaWdyYXRpb24KKyAgLy8gZnJvbSBwcm90bzEgZWFzaWVyOyBuZXcgY29kZSBzaG91bGQgYXZvaWQgZmllbGRzIG5hbWVkICJkZXNjcmlwdG9yIi4KKyAgb3B0aW9uYWwgYm9vbCBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yID0gMiBbZGVmYXVsdD1mYWxzZV07CisKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgRmllbGRPcHRpb25zIHsKKyAgLy8gVGhlIGN0eXBlIG9wdGlvbiBpbnN0cnVjdHMgdGhlIEMrKyBjb2RlIGdlbmVyYXRvciB0byB1c2UgYSBkaWZmZXJlbnQKKyAgLy8gcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpZWxkIHRoYW4gaXQgbm9ybWFsbHkgd291bGQuICBTZWUgdGhlIHNwZWNpZmljCisgIC8vIG9wdGlvbnMgYmVsb3cuICBUaGlzIG9wdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIHRoZSBvcGVuIHNvdXJjZQorICAvLyByZWxlYXNlIC0tIHNvcnJ5LCB3ZSdsbCB0cnkgdG8gaW5jbHVkZSBpdCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIQorICBvcHRpb25hbCBDVHlwZSBjdHlwZSA9IDEgW2RlZmF1bHQgPSBTVFJJTkddOworICBlbnVtIENUeXBlIHsKKyAgICAvLyBEZWZhdWx0IG1vZGUuCisgICAgU1RSSU5HID0gMDsKKworICAgIENPUkQgPSAxOworCisgICAgU1RSSU5HX1BJRUNFID0gMjsKKyAgfQorICAvLyBUaGUgcGFja2VkIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCBmb3IgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkcyB0byBlbmFibGUKKyAgLy8gYSBtb3JlIGVmZmljaWVudCByZXByZXNlbnRhdGlvbiBvbiB0aGUgd2lyZS4gUmF0aGVyIHRoYW4gcmVwZWF0ZWRseQorICAvLyB3cml0aW5nIHRoZSB0YWcgYW5kIHR5cGUgZm9yIGVhY2ggZWxlbWVudCwgdGhlIGVudGlyZSBhcnJheSBpcyBlbmNvZGVkIGFzCisgIC8vIGEgc2luZ2xlIGxlbmd0aC1kZWxpbWl0ZWQgYmxvYi4KKyAgb3B0aW9uYWwgYm9vbCBwYWNrZWQgPSAyOworCisKKyAgLy8gSXMgdGhpcyBmaWVsZCBkZXByZWNhdGVkPworICAvLyBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCisgIC8vIGZvciBhY2Nlc3NvcnMsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwgdGhpcworICAvLyBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIGZpZWxkcy4KKyAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdD1mYWxzZV07CisKKyAgLy8gRVhQRVJJTUVOVEFMLiAgRE8gTk9UIFVTRS4KKyAgLy8gRm9yICJtYXAiIGZpZWxkcywgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBlbmNsb3NlZCB0eXBlIHRoYXQKKyAgLy8gaXMgdGhlIGtleSBmb3IgdGhpcyBtYXAuICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB3ZSBoYXZlOgorICAvLyAgIG1lc3NhZ2UgSXRlbSB7CisgIC8vICAgICByZXF1aXJlZCBzdHJpbmcgbmFtZSA9IDE7CisgIC8vICAgICByZXF1aXJlZCBzdHJpbmcgdmFsdWUgPSAyOworICAvLyAgIH0KKyAgLy8gICBtZXNzYWdlIENvbmZpZyB7CisgIC8vICAgICByZXBlYXRlZCBJdGVtIGl0ZW1zID0gMSBbZXhwZXJpbWVudGFsX21hcF9rZXk9Im5hbWUiXTsKKyAgLy8gICB9CisgIC8vIEluIHRoaXMgc2l0dWF0aW9uLCB0aGUgbWFwIGtleSBmb3IgSXRlbSB3aWxsIGJlIHNldCB0byAibmFtZSIuCisgIC8vIFRPRE86IEZ1bGx5LWltcGxlbWVudCB0aGlzLCB0aGVuIHJlbW92ZSB0aGUgImV4cGVyaW1lbnRhbF8iIHByZWZpeC4KKyAgb3B0aW9uYWwgc3RyaW5nIGV4cGVyaW1lbnRhbF9tYXBfa2V5ID0gOTsKKworICAvLyBUaGUgcGFyc2VyIHN0b3JlcyBvcHRpb25zIGl0IGRvZXNuJ3QgcmVjb2duaXplIGhlcmUuIFNlZSBhYm92ZS4KKyAgcmVwZWF0ZWQgVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKworICAvLyBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKK30KKworbWVzc2FnZSBFbnVtT3B0aW9ucyB7CisKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgRW51bVZhbHVlT3B0aW9ucyB7CisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCittZXNzYWdlIFNlcnZpY2VPcHRpb25zIHsKKworICAvLyBOb3RlOiAgRmllbGQgbnVtYmVycyAxIHRocm91Z2ggMzIgYXJlIHJlc2VydmVkIGZvciBHb29nbGUncyBpbnRlcm5hbCBSUEMKKyAgLy8gICBmcmFtZXdvcmsuICBXZSBhcG9sb2dpemUgZm9yIGhvYXJkaW5nIHRoZXNlIG51bWJlcnMgdG8gb3Vyc2VsdmVzLCBidXQKKyAgLy8gICB3ZSB3ZXJlIGFscmVhZHkgdXNpbmcgdGhlbSBsb25nIGJlZm9yZSB3ZSBkZWNpZGVkIHRvIHJlbGVhc2UgUHJvdG9jb2wKKyAgLy8gICBCdWZmZXJzLgorCisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCittZXNzYWdlIE1ldGhvZE9wdGlvbnMgeworCisgIC8vIE5vdGU6ICBGaWVsZCBudW1iZXJzIDEgdGhyb3VnaCAzMiBhcmUgcmVzZXJ2ZWQgZm9yIEdvb2dsZSdzIGludGVybmFsIFJQQworICAvLyAgIGZyYW1ld29yay4gIFdlIGFwb2xvZ2l6ZSBmb3IgaG9hcmRpbmcgdGhlc2UgbnVtYmVycyB0byBvdXJzZWx2ZXMsIGJ1dAorICAvLyAgIHdlIHdlcmUgYWxyZWFkeSB1c2luZyB0aGVtIGxvbmcgYmVmb3JlIHdlIGRlY2lkZWQgdG8gcmVsZWFzZSBQcm90b2NvbAorICAvLyAgIEJ1ZmZlcnMuCisKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKKy8vIEEgbWVzc2FnZSByZXByZXNlbnRpbmcgYSBvcHRpb24gdGhlIHBhcnNlciBkb2VzIG5vdCByZWNvZ25pemUuIFRoaXMgb25seQorLy8gYXBwZWFycyBpbiBvcHRpb25zIHByb3RvcyBjcmVhdGVkIGJ5IHRoZSBjb21waWxlcjo6UGFyc2VyIGNsYXNzLgorLy8gRGVzY3JpcHRvclBvb2wgcmVzb2x2ZXMgdGhlc2Ugd2hlbiBidWlsZGluZyBEZXNjcmlwdG9yIG9iamVjdHMuIFRoZXJlZm9yZSwKKy8vIG9wdGlvbnMgcHJvdG9zIGluIGRlc2NyaXB0b3Igb2JqZWN0cyAoZS5nLiByZXR1cm5lZCBieSBEZXNjcmlwdG9yOjpvcHRpb25zKCksCisvLyBvciBwcm9kdWNlZCBieSBEZXNjcmlwdG9yOjpDb3B5VG8oKSkgd2lsbCBuZXZlciBoYXZlIFVuaW50ZXJwcmV0ZWRPcHRpb25zCisvLyBpbiB0aGVtLgorbWVzc2FnZSBVbmludGVycHJldGVkT3B0aW9uIHsKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIHVuaW50ZXJwcmV0ZWQgb3B0aW9uLiAgRWFjaCBzdHJpbmcgcmVwcmVzZW50cyBhIHNlZ21lbnQgaW4KKyAgLy8gYSBkb3Qtc2VwYXJhdGVkIG5hbWUuICBpc19leHRlbnNpb24gaXMgdHJ1ZSBpZmYgYSBzZWdtZW50IHJlcHJlc2VudHMgYW4KKyAgLy8gZXh0ZW5zaW9uIChkZW5vdGVkIHdpdGggcGFyZW50aGVzZXMgaW4gb3B0aW9ucyBzcGVjcyBpbiAucHJvdG8gZmlsZXMpLgorICAvLyBFLmcuLHsgWyJmb28iLCBmYWxzZV0sIFsiYmFyLmJheiIsIHRydWVdLCBbInF1eCIsIGZhbHNlXSB9IHJlcHJlc2VudHMKKyAgLy8gImZvby4oYmFyLmJheikucXV4Ii4KKyAgbWVzc2FnZSBOYW1lUGFydCB7CisgICAgcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7CisgICAgcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOworICB9CisgIHJlcGVhdGVkIE5hbWVQYXJ0IG5hbWUgPSAyOworCisgIC8vIFRoZSB2YWx1ZSBvZiB0aGUgdW5pbnRlcnByZXRlZCBvcHRpb24sIGluIHdoYXRldmVyIHR5cGUgdGhlIHRva2VuaXplcgorICAvLyBpZGVudGlmaWVkIGl0IGFzIGR1cmluZyBwYXJzaW5nLiBFeGFjdGx5IG9uZSBvZiB0aGVzZSBzaG91bGQgYmUgc2V0LgorICBvcHRpb25hbCBzdHJpbmcgaWRlbnRpZmllcl92YWx1ZSA9IDM7CisgIG9wdGlvbmFsIHVpbnQ2NCBwb3NpdGl2ZV9pbnRfdmFsdWUgPSA0OworICBvcHRpb25hbCBpbnQ2NCBuZWdhdGl2ZV9pbnRfdmFsdWUgPSA1OworICBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKKyAgb3B0aW9uYWwgYnl0ZXMgc3RyaW5nX3ZhbHVlID0gNzsKKyAgb3B0aW9uYWwgc3RyaW5nIGFnZ3JlZ2F0ZV92YWx1ZSA9IDg7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIE9wdGlvbmFsIHNvdXJjZSBjb2RlIGluZm8KKworLy8gRW5jYXBzdWxhdGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSBmcm9tIHdoaWNoIGEKKy8vIEZpbGVEZXNjcmlwdG9yUHJvdG8gd2FzIGdlbmVyYXRlZC4KK21lc3NhZ2UgU291cmNlQ29kZUluZm8geworICAvLyBBIExvY2F0aW9uIGlkZW50aWZpZXMgYSBwaWVjZSBvZiBzb3VyY2UgY29kZSBpbiBhIC5wcm90byBmaWxlIHdoaWNoCisgIC8vIGNvcnJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBkZWZpbml0aW9uLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbnRlbmRlZAorICAvLyB0byBiZSB1c2VmdWwgdG8gSURFcywgY29kZSBpbmRleGVycywgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3JzLCBhbmQgc2ltaWxhcgorICAvLyB0b29scy4KKyAgLy8KKyAgLy8gRm9yIGV4YW1wbGUsIHNheSB3ZSBoYXZlIGEgZmlsZSBsaWtlOgorICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICAgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxOworICAvLyAgIH0KKyAgLy8gTGV0J3MgbG9vayBhdCBqdXN0IHRoZSBmaWVsZCBkZWZpbml0aW9uOgorICAvLyAgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxOworICAvLyAgIF4gICAgICAgXl4gICAgIF5eICBeICBeXl4KKyAgLy8gICBhICAgICAgIGJjICAgICBkZSAgZiAgZ2hpCisgIC8vIFdlIGhhdmUgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgIC8vICAgc3BhbiAgIHBhdGggICAgICAgICAgICAgICByZXByZXNlbnRzCisgIC8vICAgW2EsaSkgIFsgNCwgMCwgMiwgMCBdICAgICBUaGUgd2hvbGUgZmllbGQgZGVmaW5pdGlvbi4KKyAgLy8gICBbYSxiKSAgWyA0LCAwLCAyLCAwLCA0IF0gIFRoZSBsYWJlbCAob3B0aW9uYWwpLgorICAvLyAgIFtjLGQpICBbIDQsIDAsIDIsIDAsIDUgXSAgVGhlIHR5cGUgKHN0cmluZykuCisgIC8vICAgW2UsZikgIFsgNCwgMCwgMiwgMCwgMSBdICBUaGUgbmFtZSAoZm9vKS4KKyAgLy8gICBbZyxoKSAgWyA0LCAwLCAyLCAwLCAzIF0gIFRoZSBudW1iZXIgKDEpLgorICAvLworICAvLyBOb3RlczoKKyAgLy8gLSBBIGxvY2F0aW9uIG1heSByZWZlciB0byBhIHJlcGVhdGVkIGZpZWxkIGl0c2VsZiAoaS5lLiBub3QgdG8gYW55CisgIC8vICAgcGFydGljdWxhciBpbmRleCB3aXRoaW4gaXQpLiAgVGhpcyBpcyB1c2VkIHdoZW5ldmVyIGEgc2V0IG9mIGVsZW1lbnRzIGFyZQorICAvLyAgIGxvZ2ljYWxseSBlbmNsb3NlZCBpbiBhIHNpbmdsZSBjb2RlIHNlZ21lbnQuICBGb3IgZXhhbXBsZSwgYW4gZW50aXJlCisgIC8vICAgZXh0ZW5kIGJsb2NrIChwb3NzaWJseSBjb250YWluaW5nIG11bHRpcGxlIGV4dGVuc2lvbiBkZWZpbml0aW9ucykgd2lsbAorICAvLyAgIGhhdmUgYW4gb3V0ZXIgbG9jYXRpb24gd2hvc2UgcGF0aCByZWZlcnMgdG8gdGhlICJleHRlbnNpb25zIiByZXBlYXRlZAorICAvLyAgIGZpZWxkIHdpdGhvdXQgYW4gaW5kZXguCisgIC8vIC0gTXVsdGlwbGUgbG9jYXRpb25zIG1heSBoYXZlIHRoZSBzYW1lIHBhdGguICBUaGlzIGhhcHBlbnMgd2hlbiBhIHNpbmdsZQorICAvLyAgIGxvZ2ljYWwgZGVjbGFyYXRpb24gaXMgc3ByZWFkIG91dCBhY3Jvc3MgbXVsdGlwbGUgcGxhY2VzLiAgVGhlIG1vc3QKKyAgLy8gICBvYnZpb3VzIGV4YW1wbGUgaXMgdGhlICJleHRlbmQiIGJsb2NrIGFnYWluIC0tIHRoZXJlIG1heSBiZSBtdWx0aXBsZQorICAvLyAgIGV4dGVuZCBibG9ja3MgaW4gdGhlIHNhbWUgc2NvcGUsIGVhY2ggb2Ygd2hpY2ggd2lsbCBoYXZlIHRoZSBzYW1lIHBhdGguCisgIC8vIC0gQSBsb2NhdGlvbidzIHNwYW4gaXMgbm90IGFsd2F5cyBhIHN1YnNldCBvZiBpdHMgcGFyZW50J3Mgc3Bhbi4gIEZvcgorICAvLyAgIGV4YW1wbGUsIHRoZSAiZXh0ZW5kZWUiIG9mIGFuIGV4dGVuc2lvbiBkZWNsYXJhdGlvbiBhcHBlYXJzIGF0IHRoZQorICAvLyAgIGJlZ2lubmluZyBvZiB0aGUgImV4dGVuZCIgYmxvY2sgYW5kIGlzIHNoYXJlZCBieSBhbGwgZXh0ZW5zaW9ucyB3aXRoaW4KKyAgLy8gICB0aGUgYmxvY2suCisgIC8vIC0gSnVzdCBiZWNhdXNlIGEgbG9jYXRpb24ncyBzcGFuIGlzIGEgc3Vic2V0IG9mIHNvbWUgb3RoZXIgbG9jYXRpb24ncyBzcGFuCisgIC8vICAgZG9lcyBub3QgbWVhbiB0aGF0IGl0IGlzIGEgZGVzY2VuZGVudC4gIEZvciBleGFtcGxlLCBhICJncm91cCIgZGVmaW5lcworICAvLyAgIGJvdGggYSB0eXBlIGFuZCBhIGZpZWxkIGluIGEgc2luZ2xlIGRlY2xhcmF0aW9uLiAgVGh1cywgdGhlIGxvY2F0aW9ucworICAvLyAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgYW5kIGZpZWxkIGFuZCB0aGVpciBjb21wb25lbnRzIHdpbGwgb3ZlcmxhcC4KKyAgLy8gLSBDb2RlIHdoaWNoIHRyaWVzIHRvIGludGVycHJldCBsb2NhdGlvbnMgc2hvdWxkIHByb2JhYmx5IGJlIGRlc2lnbmVkIHRvCisgIC8vICAgaWdub3JlIHRob3NlIHRoYXQgaXQgZG9lc24ndCB1bmRlcnN0YW5kLCBhcyBtb3JlIHR5cGVzIG9mIGxvY2F0aW9ucyBjb3VsZAorICAvLyAgIGJlIHJlY29yZGVkIGluIHRoZSBmdXR1cmUuCisgIHJlcGVhdGVkIExvY2F0aW9uIGxvY2F0aW9uID0gMTsKKyAgbWVzc2FnZSBMb2NhdGlvbiB7CisgICAgLy8gSWRlbnRpZmllcyB3aGljaCBwYXJ0IG9mIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHdhcyBkZWZpbmVkIGF0IHRoaXMKKyAgICAvLyBsb2NhdGlvbi4KKyAgICAvLworICAgIC8vIEVhY2ggZWxlbWVudCBpcyBhIGZpZWxkIG51bWJlciBvciBhbiBpbmRleC4gIFRoZXkgZm9ybSBhIHBhdGggZnJvbQorICAgIC8vIHRoZSByb290IEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gdGhlIHBsYWNlIHdoZXJlIHRoZSBkZWZpbml0aW9uLiAgRm9yCisgICAgLy8gZXhhbXBsZSwgdGhpcyBwYXRoOgorICAgIC8vICAgWyA0LCAzLCAyLCA3LCAxIF0KKyAgICAvLyByZWZlcnMgdG86CisgICAgLy8gICBmaWxlLm1lc3NhZ2VfdHlwZSgzKSAgLy8gNCwgMworICAgIC8vICAgICAgIC5maWVsZCg3KSAgICAgICAgIC8vIDIsIDcKKyAgICAvLyAgICAgICAubmFtZSgpICAgICAgICAgICAvLyAxCisgICAgLy8gVGhpcyBpcyBiZWNhdXNlIEZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlIGhhcyBmaWVsZCBudW1iZXIgNDoKKyAgICAvLyAgIHJlcGVhdGVkIERlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OworICAgIC8vIGFuZCBEZXNjcmlwdG9yUHJvdG8uZmllbGQgaGFzIGZpZWxkIG51bWJlciAyOgorICAgIC8vICAgcmVwZWF0ZWQgRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOworICAgIC8vIGFuZCBGaWVsZERlc2NyaXB0b3JQcm90by5uYW1lIGhhcyBmaWVsZCBudW1iZXIgMToKKyAgICAvLyAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICAvLworICAgIC8vIFRodXMsIHRoZSBhYm92ZSBwYXRoIGdpdmVzIHRoZSBsb2NhdGlvbiBvZiBhIGZpZWxkIG5hbWUuICBJZiB3ZSByZW1vdmVkCisgICAgLy8gdGhlIGxhc3QgZWxlbWVudDoKKyAgICAvLyAgIFsgNCwgMywgMiwgNyBdCisgICAgLy8gdGhpcyBwYXRoIHJlZmVycyB0byB0aGUgd2hvbGUgZmllbGQgZGVjbGFyYXRpb24gKGZyb20gdGhlIGJlZ2lubmluZworICAgIC8vIG9mIHRoZSBsYWJlbCB0byB0aGUgdGVybWluYXRpbmcgc2VtaWNvbG9uKS4KKyAgICByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkPXRydWVdOworCisgICAgLy8gQWx3YXlzIGhhcyBleGFjdGx5IHRocmVlIG9yIGZvdXIgZWxlbWVudHM6IHN0YXJ0IGxpbmUsIHN0YXJ0IGNvbHVtbiwKKyAgICAvLyBlbmQgbGluZSAob3B0aW9uYWwsIG90aGVyd2lzZSBhc3N1bWVkIHNhbWUgYXMgc3RhcnQgbGluZSksIGVuZCBjb2x1bW4uCisgICAgLy8gVGhlc2UgYXJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlIGZpZWxkIGZvciBlZmZpY2llbmN5LiAgTm90ZSB0aGF0IGxpbmUKKyAgICAvLyBhbmQgY29sdW1uIG51bWJlcnMgYXJlIHplcm8tYmFzZWQgLS0gdHlwaWNhbGx5IHlvdSB3aWxsIHdhbnQgdG8gYWRkCisgICAgLy8gMSB0byBlYWNoIGJlZm9yZSBkaXNwbGF5aW5nIHRvIGEgdXNlci4KKyAgICByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkPXRydWVdOworCisgICAgLy8gVE9ETyhrZW50b24pOiAgUmVjb3JkIGNvbW1lbnRzIGFwcGVhcmluZyBiZWZvcmUgYW5kIGFmdGVyIHRoZQorICAgIC8vIGRlY2xhcmF0aW9uLgorICB9Cit9CmRpZmYgLS1naXQgYS9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byBiL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMDVjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bwpAQCAtMCwwICsxLDYzNiBAQAorLy8gQWRkaXRpb25hbCBvcHRpb25zIHJlcXVpcmVkIGZvciBDIyBnZW5lcmF0aW9uLiBGaWxlIGZyb20gY29weXJpZ2h0CisvLyBsaW5lIG9ud2FyZHMgaXMgYXMgcGVyIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbi4KK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIjsKK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLm5hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MiOworb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykudW1icmVsbGFfY2xhc3NuYW1lID0gIlVuaXRUZXN0UHJvdG9GaWxlIjsKKworLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gQSBwcm90byBmaWxlIHdlIHdpbGwgdXNlIGZvciB1bml0IHRlc3RpbmcuCisKKworLy8gU29tZSBnZW5lcmljX3NlcnZpY2VzIG9wdGlvbihzKSBhZGRlZCBhdXRvbWF0aWNhbGx5LgorLy8gU2VlOiAgaHR0cDovL2dvL3Byb3RvMi1nZW5lcmljLXNlcnZpY2VzLWRlZmF1bHQKK29wdGlvbiBjY19nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAgIC8vIGF1dG8tYWRkZWQKK29wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgIC8vIGF1dG8tYWRkZWQKK29wdGlvbiBweV9nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAgIC8vIGF1dG8tYWRkZWQKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvIjsKKworLy8gV2UgZG9uJ3QgcHV0IHRoaXMgaW4gYSBwYWNrYWdlIHdpdGhpbiBwcm90bzIgYmVjYXVzZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorLy8gdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgZG9lc24ndCBkZXBlbmQgb24gYmVpbmcgaW4gdGhlIHByb3RvMiBuYW1lc3BhY2UuCisvLyBJbiB0ZXN0X3V0aWwuaCB3ZSBkbyAidXNpbmcgbmFtZXNwYWNlIHVuaXR0ZXN0ID0gcHJvdG9idWZfdW5pdHRlc3QiLgorcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworLy8gUHJvdG9zIG9wdGltaXplZCBmb3IgU1BFRUQgdXNlIGEgc3RyaWN0IHN1cGVyc2V0IG9mIHRoZSBnZW5lcmF0ZWQgY29kZQorLy8gb2YgZXF1aXZhbGVudCBvbmVzIG9wdGltaXplZCBmb3IgQ09ERV9TSVpFLCBzbyB3ZSBzaG91bGQgb3B0aW1pemUgYWxsIG91cgorLy8gdGVzdHMgZm9yIHNwZWVkIHVubGVzcyBleHBsaWNpdGx5IHRlc3RpbmcgY29kZSBzaXplIG9wdGltaXphdGlvbi4KK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKKworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIlVuaXR0ZXN0UHJvdG8iOworCisvLyBUaGlzIHByb3RvIGluY2x1ZGVzIGV2ZXJ5IHR5cGUgb2YgZmllbGQgaW4gYm90aCBzaW5ndWxhciBhbmQgcmVwZWF0ZWQKKy8vIGZvcm1zLgorbWVzc2FnZSBUZXN0QWxsVHlwZXMgeworICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICAgIC8vIFRoZSBmaWVsZCBuYW1lICJiIiBmYWlscyB0byBjb21waWxlIGluIHByb3RvMSBiZWNhdXNlIGl0IGNvbmZsaWN0cyB3aXRoCisgICAgLy8gYSBsb2NhbCB2YXJpYWJsZSBuYW1lZCAiYiIgaW4gb25lIG9mIHRoZSBnZW5lcmF0ZWQgbWV0aG9kcy4gIERvaC4KKyAgICAvLyBUaGlzIGZpbGUgbmVlZHMgdG8gY29tcGlsZSBpbiBwcm90bzEgdG8gdGVzdCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4KKyAgICBvcHRpb25hbCBpbnQzMiBiYiA9IDE7CisgIH0KKworICBlbnVtIE5lc3RlZEVudW0geworICAgIEZPTyA9IDE7CisgICAgQkFSID0gMjsKKyAgICBCQVogPSAzOworICB9CisKKyAgLy8gU2luZ3VsYXIKKyAgb3B0aW9uYWwgICAgaW50MzIgb3B0aW9uYWxfaW50MzIgICAgPSAgMTsKKyAgb3B0aW9uYWwgICAgaW50NjQgb3B0aW9uYWxfaW50NjQgICAgPSAgMjsKKyAgb3B0aW9uYWwgICB1aW50MzIgb3B0aW9uYWxfdWludDMyICAgPSAgMzsKKyAgb3B0aW9uYWwgICB1aW50NjQgb3B0aW9uYWxfdWludDY0ICAgPSAgNDsKKyAgb3B0aW9uYWwgICBzaW50MzIgb3B0aW9uYWxfc2ludDMyICAgPSAgNTsKKyAgb3B0aW9uYWwgICBzaW50NjQgb3B0aW9uYWxfc2ludDY0ICAgPSAgNjsKKyAgb3B0aW9uYWwgIGZpeGVkMzIgb3B0aW9uYWxfZml4ZWQzMiAgPSAgNzsKKyAgb3B0aW9uYWwgIGZpeGVkNjQgb3B0aW9uYWxfZml4ZWQ2NCAgPSAgODsKKyAgb3B0aW9uYWwgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzIgPSAgOTsKKyAgb3B0aW9uYWwgc2ZpeGVkNjQgb3B0aW9uYWxfc2ZpeGVkNjQgPSAxMDsKKyAgb3B0aW9uYWwgICAgZmxvYXQgb3B0aW9uYWxfZmxvYXQgICAgPSAxMTsKKyAgb3B0aW9uYWwgICBkb3VibGUgb3B0aW9uYWxfZG91YmxlICAgPSAxMjsKKyAgb3B0aW9uYWwgICAgIGJvb2wgb3B0aW9uYWxfYm9vbCAgICAgPSAxMzsKKyAgb3B0aW9uYWwgICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nICAgPSAxNDsKKyAgb3B0aW9uYWwgICAgYnl0ZXMgb3B0aW9uYWxfYnl0ZXMgICAgPSAxNTsKKworICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwID0gMTYgeworICAgIG9wdGlvbmFsIGludDMyIGEgPSAxNzsKKyAgfQorCisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgPSAxODsKKyAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSA9IDE5OworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZSBvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgPSAyMDsKKworICBvcHRpb25hbCBOZXN0ZWRFbnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfbmVzdGVkX2VudW0gICAgID0gMjE7CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9mb3JlaWduX2VudW0gICAgPSAyMjsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW0gICAgb3B0aW9uYWxfaW1wb3J0X2VudW0gICAgID0gMjM7CisKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZSA9IDI0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfY29yZCA9IDI1IFtjdHlwZT1DT1JEXTsKKworICAvLyBSZXBlYXRlZAorICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMiAgICA9IDMxOworICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NCAgICA9IDMyOworICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzIgICA9IDMzOworICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgICA9IDM0OworICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzIgICA9IDM1OworICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgICA9IDM2OworICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyICA9IDM3OworICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ICA9IDM4OworICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9IDM5OworICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDQwOworICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdCAgICA9IDQxOworICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgICA9IDQyOworICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sICAgICA9IDQzOworICByZXBlYXRlZCAgIHN0cmluZyByZXBlYXRlZF9zdHJpbmcgICA9IDQ0OworICByZXBlYXRlZCAgICBieXRlcyByZXBlYXRlZF9ieXRlcyAgICA9IDQ1OworCisgIHJlcGVhdGVkIGdyb3VwIFJlcGVhdGVkR3JvdXAgPSA0NiB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDQ3OworICB9CisKKyAgcmVwZWF0ZWQgTmVzdGVkTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICA9IDQ4OworICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlID0gNDk7CisgIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlIHJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICA9IDUwOworCisgIHJlcGVhdGVkIE5lc3RlZEVudW0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZF9uZXN0ZWRfZW51bSAgICAgPSA1MTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkX2ZvcmVpZ25fZW51bSAgICA9IDUyOworICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bSAgICByZXBlYXRlZF9pbXBvcnRfZW51bSAgICAgPSA1MzsKKworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3BpZWNlID0gNTQgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9jb3JkID0gNTUgW2N0eXBlPUNPUkRdOworCisgIC8vIFNpbmd1bGFyIHdpdGggZGVmYXVsdHMKKyAgb3B0aW9uYWwgICAgaW50MzIgZGVmYXVsdF9pbnQzMiAgICA9IDYxIFtkZWZhdWx0ID0gIDQxICAgIF07CisgIG9wdGlvbmFsICAgIGludDY0IGRlZmF1bHRfaW50NjQgICAgPSA2MiBbZGVmYXVsdCA9ICA0MiAgICBdOworICBvcHRpb25hbCAgIHVpbnQzMiBkZWZhdWx0X3VpbnQzMiAgID0gNjMgW2RlZmF1bHQgPSAgNDMgICAgXTsKKyAgb3B0aW9uYWwgICB1aW50NjQgZGVmYXVsdF91aW50NjQgICA9IDY0IFtkZWZhdWx0ID0gIDQ0ICAgIF07CisgIG9wdGlvbmFsICAgc2ludDMyIGRlZmF1bHRfc2ludDMyICAgPSA2NSBbZGVmYXVsdCA9IC00NSAgICBdOworICBvcHRpb25hbCAgIHNpbnQ2NCBkZWZhdWx0X3NpbnQ2NCAgID0gNjYgW2RlZmF1bHQgPSAgNDYgICAgXTsKKyAgb3B0aW9uYWwgIGZpeGVkMzIgZGVmYXVsdF9maXhlZDMyICA9IDY3IFtkZWZhdWx0ID0gIDQ3ICAgIF07CisgIG9wdGlvbmFsICBmaXhlZDY0IGRlZmF1bHRfZml4ZWQ2NCAgPSA2OCBbZGVmYXVsdCA9ICA0OCAgICBdOworICBvcHRpb25hbCBzZml4ZWQzMiBkZWZhdWx0X3NmaXhlZDMyID0gNjkgW2RlZmF1bHQgPSAgNDkgICAgXTsKKyAgb3B0aW9uYWwgc2ZpeGVkNjQgZGVmYXVsdF9zZml4ZWQ2NCA9IDcwIFtkZWZhdWx0ID0gLTUwICAgIF07CisgIG9wdGlvbmFsICAgIGZsb2F0IGRlZmF1bHRfZmxvYXQgICAgPSA3MSBbZGVmYXVsdCA9ICA1MS41ICBdOworICBvcHRpb25hbCAgIGRvdWJsZSBkZWZhdWx0X2RvdWJsZSAgID0gNzIgW2RlZmF1bHQgPSAgNTJlMyAgXTsKKyAgb3B0aW9uYWwgICAgIGJvb2wgZGVmYXVsdF9ib29sICAgICA9IDczIFtkZWZhdWx0ID0gdHJ1ZSAgIF07CisgIG9wdGlvbmFsICAgc3RyaW5nIGRlZmF1bHRfc3RyaW5nICAgPSA3NCBbZGVmYXVsdCA9ICJoZWxsbyJdOworICBvcHRpb25hbCAgICBieXRlcyBkZWZhdWx0X2J5dGVzICAgID0gNzUgW2RlZmF1bHQgPSAid29ybGQiXTsKKworICBvcHRpb25hbCBOZXN0ZWRFbnVtICBkZWZhdWx0X25lc3RlZF9lbnVtICA9IDgxIFtkZWZhdWx0ID0gQkFSICAgICAgICBdOworICBvcHRpb25hbCBGb3JlaWduRW51bSBkZWZhdWx0X2ZvcmVpZ25fZW51bSA9IDgyIFtkZWZhdWx0ID0gRk9SRUlHTl9CQVJdOworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bQorICAgICAgZGVmYXVsdF9pbXBvcnRfZW51bSA9IDgzIFtkZWZhdWx0ID0gSU1QT1JUX0JBUl07CisKKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nX3BpZWNlID0gODQgW2N0eXBlPVNUUklOR19QSUVDRSxkZWZhdWx0PSJhYmMiXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfY29yZCA9IDg1IFtjdHlwZT1DT1JELGRlZmF1bHQ9IjEyMyJdOworfQorCittZXNzYWdlIFRlc3REZXByZWNhdGVkRmllbGRzIHsKKyAgb3B0aW9uYWwgaW50MzIgZGVwcmVjYXRlZF9pbnQzMiA9IDEgW2RlcHJlY2F0ZWQ9dHJ1ZV07Cit9CisKKy8vIERlZmluZSB0aGVzZSBhZnRlciBUZXN0QWxsVHlwZXMgdG8gbWFrZSBzdXJlIHRoZSBjb21waWxlciBjYW4gaGFuZGxlCisvLyB0aGF0LgorbWVzc2FnZSBGb3JlaWduTWVzc2FnZSB7CisgIG9wdGlvbmFsIGludDMyIGMgPSAxOworfQorCitlbnVtIEZvcmVpZ25FbnVtIHsKKyAgRk9SRUlHTl9GT08gPSA0OworICBGT1JFSUdOX0JBUiA9IDU7CisgIEZPUkVJR05fQkFaID0gNjsKK30KKworbWVzc2FnZSBUZXN0QWxsRXh0ZW5zaW9ucyB7CisgIGV4dGVuc2lvbnMgMSB0byBtYXg7Cit9CisKK2V4dGVuZCBUZXN0QWxsRXh0ZW5zaW9ucyB7CisgIC8vIFNpbmd1bGFyCisgIG9wdGlvbmFsICAgIGludDMyIG9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgICA9ICAxOworICBvcHRpb25hbCAgICBpbnQ2NCBvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24gICAgPSAgMjsKKyAgb3B0aW9uYWwgICB1aW50MzIgb3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbiAgID0gIDM7CisgIG9wdGlvbmFsICAgdWludDY0IG9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb24gICA9ICA0OworICBvcHRpb25hbCAgIHNpbnQzMiBvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uICAgPSAgNTsKKyAgb3B0aW9uYWwgICBzaW50NjQgb3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbiAgID0gIDY7CisgIG9wdGlvbmFsICBmaXhlZDMyIG9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uICA9ICA3OworICBvcHRpb25hbCAgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbiAgPSAgODsKKyAgb3B0aW9uYWwgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uID0gIDk7CisgIG9wdGlvbmFsIHNmaXhlZDY0IG9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbiA9IDEwOworICBvcHRpb25hbCAgICBmbG9hdCBvcHRpb25hbF9mbG9hdF9leHRlbnNpb24gICAgPSAxMTsKKyAgb3B0aW9uYWwgICBkb3VibGUgb3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbiAgID0gMTI7CisgIG9wdGlvbmFsICAgICBib29sIG9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uICAgICA9IDEzOworICBvcHRpb25hbCAgIHN0cmluZyBvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uICAgPSAxNDsKKyAgb3B0aW9uYWwgICAgYnl0ZXMgb3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uICAgID0gMTU7CisKKyAgb3B0aW9uYWwgZ3JvdXAgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gPSAxNiB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDE3OworICB9CisKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uID0gMTg7CisgIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlIG9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24gPSAxOTsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2UKKyAgICBvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gPSAyMDsKKworICBvcHRpb25hbCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bSBvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24gPSAyMTsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW0gb3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiA9IDIyOworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bQorICAgIG9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiA9IDIzOworCisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uID0gMjQgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9jb3JkX2V4dGVuc2lvbiA9IDI1IFtjdHlwZT1DT1JEXTsKKworICAvLyBSZXBlYXRlZAorICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICAgPSAzMTsKKyAgcmVwZWF0ZWQgICAgaW50NjQgcmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uICAgID0gMzI7CisgIHJlcGVhdGVkICAgdWludDMyIHJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24gICA9IDMzOworICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uICAgPSAzNDsKKyAgcmVwZWF0ZWQgICBzaW50MzIgcmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiAgID0gMzU7CisgIHJlcGVhdGVkICAgc2ludDY0IHJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24gICA9IDM2OworICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiAgPSAzNzsKKyAgcmVwZWF0ZWQgIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24gID0gMzg7CisgIHJlcGVhdGVkIHNmaXhlZDMyIHJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbiA9IDM5OworICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24gPSA0MDsKKyAgcmVwZWF0ZWQgICAgZmxvYXQgcmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgID0gNDE7CisgIHJlcGVhdGVkICAgZG91YmxlIHJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICA9IDQyOworICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICAgPSA0MzsKKyAgcmVwZWF0ZWQgICBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgID0gNDQ7CisgIHJlcGVhdGVkICAgIGJ5dGVzIHJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICA9IDQ1OworCisgIHJlcGVhdGVkIGdyb3VwIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uID0gNDYgeworICAgIG9wdGlvbmFsIGludDMyIGEgPSA0NzsKKyAgfQorCisgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiA9IDQ4OworICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSByZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uID0gNDk7CisgIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlCisgICAgcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uID0gNTA7CisKKyAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0gcmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uID0gNTE7CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtIHJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24gPSA1MjsKKyAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW0KKyAgICByZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gPSA1MzsKKworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiA9IDU0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfY29yZF9leHRlbnNpb24gPSA1NSBbY3R5cGU9Q09SRF07CisKKyAgLy8gU2luZ3VsYXIgd2l0aCBkZWZhdWx0cworICBvcHRpb25hbCAgICBpbnQzMiBkZWZhdWx0X2ludDMyX2V4dGVuc2lvbiAgICA9IDYxIFtkZWZhdWx0ID0gIDQxICAgIF07CisgIG9wdGlvbmFsICAgIGludDY0IGRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uICAgID0gNjIgW2RlZmF1bHQgPSAgNDIgICAgXTsKKyAgb3B0aW9uYWwgICB1aW50MzIgZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uICAgPSA2MyBbZGVmYXVsdCA9ICA0MyAgICBdOworICBvcHRpb25hbCAgIHVpbnQ2NCBkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb24gICA9IDY0IFtkZWZhdWx0ID0gIDQ0ICAgIF07CisgIG9wdGlvbmFsICAgc2ludDMyIGRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbiAgID0gNjUgW2RlZmF1bHQgPSAtNDUgICAgXTsKKyAgb3B0aW9uYWwgICBzaW50NjQgZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uICAgPSA2NiBbZGVmYXVsdCA9ICA0NiAgICBdOworICBvcHRpb25hbCAgZml4ZWQzMiBkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uICA9IDY3IFtkZWZhdWx0ID0gIDQ3ICAgIF07CisgIG9wdGlvbmFsICBmaXhlZDY0IGRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb24gID0gNjggW2RlZmF1bHQgPSAgNDggICAgXTsKKyAgb3B0aW9uYWwgc2ZpeGVkMzIgZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb24gPSA2OSBbZGVmYXVsdCA9ICA0OSAgICBdOworICBvcHRpb25hbCBzZml4ZWQ2NCBkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbiA9IDcwIFtkZWZhdWx0ID0gLTUwICAgIF07CisgIG9wdGlvbmFsICAgIGZsb2F0IGRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uICAgID0gNzEgW2RlZmF1bHQgPSAgNTEuNSAgXTsKKyAgb3B0aW9uYWwgICBkb3VibGUgZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uICAgPSA3MiBbZGVmYXVsdCA9ICA1MmUzICBdOworICBvcHRpb25hbCAgICAgYm9vbCBkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uICAgICA9IDczIFtkZWZhdWx0ID0gdHJ1ZSAgIF07CisgIG9wdGlvbmFsICAgc3RyaW5nIGRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbiAgID0gNzQgW2RlZmF1bHQgPSAiaGVsbG8iXTsKKyAgb3B0aW9uYWwgICAgYnl0ZXMgZGVmYXVsdF9ieXRlc19leHRlbnNpb24gICAgPSA3NSBbZGVmYXVsdCA9ICJ3b3JsZCJdOworCisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtCisgICAgZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb24gPSA4MSBbZGVmYXVsdCA9IEJBUl07CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtCisgICAgZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uID0gODIgW2RlZmF1bHQgPSBGT1JFSUdOX0JBUl07CisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtCisgICAgZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb24gPSA4MyBbZGVmYXVsdCA9IElNUE9SVF9CQVJdOworCisgIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb24gPSA4NCBbY3R5cGU9U1RSSU5HX1BJRUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImFiYyJdOworICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9jb3JkX2V4dGVuc2lvbiA9IDg1IFtjdHlwZT1DT1JELCBkZWZhdWx0PSIxMjMiXTsKK30KKworbWVzc2FnZSBUZXN0TmVzdGVkRXh0ZW5zaW9uIHsKKyAgZXh0ZW5kIFRlc3RBbGxFeHRlbnNpb25zIHsKKyAgICAvLyBDaGVjayBmb3IgYnVnIHdoZXJlIHN0cmluZyBleHRlbnNpb25zIGRlY2xhcmVkIGluIHRlc3RlZCBzY29wZSBkaWQgbm90CisgICAgLy8gY29tcGlsZS4KKyAgICBvcHRpb25hbCBzdHJpbmcgdGVzdCA9IDEwMDIgW2RlZmF1bHQ9InRlc3QiXTsKKyAgfQorfQorCisvLyBXZSBoYXZlIHNlcGFyYXRlIG1lc3NhZ2VzIGZvciB0ZXN0aW5nIHJlcXVpcmVkIGZpZWxkcyBiZWNhdXNlIGl0J3MKKy8vIGFubm95aW5nIHRvIGhhdmUgdG8gZmlsbCBpbiByZXF1aXJlZCBmaWVsZHMgaW4gVGVzdFByb3RvIGluIG9yZGVyIHRvCisvLyBkbyBhbnl0aGluZyB3aXRoIGl0LiAgTm90ZSB0aGF0IHdlIGRvbid0IG5lZWQgdG8gdGVzdCBldmVyeSB0eXBlIG9mCisvLyByZXF1aXJlZCBmaWxlZCBiZWNhdXNlIHRoZSBjb2RlIG91dHB1dCBpcyBiYXNpY2FsbHkgaWRlbnRpY2FsIHRvCisvLyBvcHRpb25hbCBmaWVsZHMgZm9yIGFsbCB0eXBlcy4KK21lc3NhZ2UgVGVzdFJlcXVpcmVkIHsKKyAgcmVxdWlyZWQgaW50MzIgYSA9IDE7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MiA9IDI7CisgIHJlcXVpcmVkIGludDMyIGIgPSAzOworCisgIGV4dGVuZCBUZXN0QWxsRXh0ZW5zaW9ucyB7CisgICAgb3B0aW9uYWwgVGVzdFJlcXVpcmVkIHNpbmdsZSA9IDEwMDA7CisgICAgcmVwZWF0ZWQgVGVzdFJlcXVpcmVkIG11bHRpICA9IDEwMDE7CisgIH0KKworICAvLyBQYWQgdGhlIGZpZWxkIGNvdW50IHRvIDMyIHNvIHRoYXQgd2UgY2FuIHRlc3QgdGhhdCBJc0luaXRpYWxpemVkKCkKKyAgLy8gcHJvcGVybHkgY2hlY2tzIG11bHRpcGxlIGVsZW1lbnRzIG9mIGhhc19iaXRzXy4KKyAgb3B0aW9uYWwgaW50MzIgZHVtbXk0ICA9ICA0OworICBvcHRpb25hbCBpbnQzMiBkdW1teTUgID0gIDU7CisgIG9wdGlvbmFsIGludDMyIGR1bW15NiAgPSAgNjsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXk3ICA9ICA3OworICBvcHRpb25hbCBpbnQzMiBkdW1teTggID0gIDg7CisgIG9wdGlvbmFsIGludDMyIGR1bW15OSAgPSAgOTsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxMCA9IDEwOworICBvcHRpb25hbCBpbnQzMiBkdW1teTExID0gMTE7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MTIgPSAxMjsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxMyA9IDEzOworICBvcHRpb25hbCBpbnQzMiBkdW1teTE0ID0gMTQ7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MTUgPSAxNTsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxNiA9IDE2OworICBvcHRpb25hbCBpbnQzMiBkdW1teTE3ID0gMTc7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MTggPSAxODsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxOSA9IDE5OworICBvcHRpb25hbCBpbnQzMiBkdW1teTIwID0gMjA7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MjEgPSAyMTsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkyMiA9IDIyOworICBvcHRpb25hbCBpbnQzMiBkdW1teTIzID0gMjM7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MjQgPSAyNDsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkyNSA9IDI1OworICBvcHRpb25hbCBpbnQzMiBkdW1teTI2ID0gMjY7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MjcgPSAyNzsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkyOCA9IDI4OworICBvcHRpb25hbCBpbnQzMiBkdW1teTI5ID0gMjk7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MzAgPSAzMDsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkzMSA9IDMxOworICBvcHRpb25hbCBpbnQzMiBkdW1teTMyID0gMzI7CisKKyAgcmVxdWlyZWQgaW50MzIgYyA9IDMzOworfQorCittZXNzYWdlIFRlc3RSZXF1aXJlZEZvcmVpZ24geworICBvcHRpb25hbCBUZXN0UmVxdWlyZWQgb3B0aW9uYWxfbWVzc2FnZSA9IDE7CisgIHJlcGVhdGVkIFRlc3RSZXF1aXJlZCByZXBlYXRlZF9tZXNzYWdlID0gMjsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkgPSAzOworfQorCisvLyBUZXN0IHRoYXQgd2UgY2FuIHVzZSBOZXN0ZWRNZXNzYWdlIGZyb20gb3V0c2lkZSBUZXN0QWxsVHlwZXMuCittZXNzYWdlIFRlc3RGb3JlaWduTmVzdGVkIHsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UgZm9yZWlnbl9uZXN0ZWQgPSAxOworfQorCisvLyBUZXN0RW1wdHlNZXNzYWdlIGlzIHVzZWQgdG8gdGVzdCB1bmtub3duIGZpZWxkIHN1cHBvcnQuCittZXNzYWdlIFRlc3RFbXB0eU1lc3NhZ2UgeworfQorCisvLyBMaWtlIGFib3ZlLCBidXQgZGVjbGFyZSBhbGwgZmllbGQgbnVtYmVycyBhcyBwb3RlbnRpYWwgZXh0ZW5zaW9ucy4gIE5vCisvLyBhY3R1YWwgZXh0ZW5zaW9ucyBzaG91bGQgZXZlciBiZSBkZWZpbmVkIGZvciB0aGlzIHR5cGUuCittZXNzYWdlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyB7CisgIGV4dGVuc2lvbnMgMSB0byBtYXg7Cit9CisKK21lc3NhZ2UgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIHsKKyAgZXh0ZW5zaW9ucyA0MjsKKyAgZXh0ZW5zaW9ucyA0MTQzIHRvIDQyNDM7CisgIGV4dGVuc2lvbnMgNjU1MzYgdG8gbWF4OworfQorCisvLyBUZXN0IHRoYXQgcmVhbGx5IGxhcmdlIHRhZyBudW1iZXJzIGRvbid0IGJyZWFrIGFueXRoaW5nLgorbWVzc2FnZSBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgeworICAvLyBUaGUgbGFyZ2VzdCBwb3NzaWJsZSB0YWcgbnVtYmVyIGlzIDJeMjggLSAxLCBzaW5jZSB0aGUgd2lyZSBmb3JtYXQgdXNlcworICAvLyB0aHJlZSBiaXRzIHRvIGNvbW11bmljYXRlIHdpcmUgdHlwZS4KKyAgb3B0aW9uYWwgaW50MzIgYSA9IDE7CisgIG9wdGlvbmFsIGludDMyIGJiID0gMjY4NDM1NDU1OworfQorCittZXNzYWdlIFRlc3RSZWN1cnNpdmVNZXNzYWdlIHsKKyAgb3B0aW9uYWwgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgYSA9IDE7CisgIG9wdGlvbmFsIGludDMyIGkgPSAyOworfQorCisvLyBUZXN0IHRoYXQgbXV0dWFsIHJlY3Vyc2lvbiB3b3Jrcy4KK21lc3NhZ2UgVGVzdE11dHVhbFJlY3Vyc2lvbkEgeworICBvcHRpb25hbCBUZXN0TXV0dWFsUmVjdXJzaW9uQiBiYiA9IDE7Cit9CisKK21lc3NhZ2UgVGVzdE11dHVhbFJlY3Vyc2lvbkIgeworICBvcHRpb25hbCBUZXN0TXV0dWFsUmVjdXJzaW9uQSBhID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzIgPSAyOworfQorCisvLyBUZXN0IHRoYXQgZ3JvdXBzIGhhdmUgZGlzam9pbnQgZmllbGQgbnVtYmVycyBmcm9tIHRoZWlyIHNpYmxpbmdzIGFuZAorLy8gcGFyZW50cy4gIFRoaXMgaXMgTk9UIHBvc3NpYmxlIGluIHByb3RvMTsgb25seSBwcm90bzIuICBXaGVuIGF0dGVtcHRpbmcKKy8vIHRvIGNvbXBpbGUgd2l0aCBwcm90bzEsIHRoaXMgd2lsbCBlbWl0IGFuIGVycm9yOyBzbyB3ZSBvbmx5IGluY2x1ZGUgaXQKKy8vIGluIHByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvLgorbWVzc2FnZSBUZXN0RHVwRmllbGROdW1iZXIgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMQorICBvcHRpb25hbCBpbnQzMiBhID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMQorICBvcHRpb25hbCBncm91cCBGb28gPSAyIHsgb3B0aW9uYWwgaW50MzIgYSA9IDE7IH0gIC8vIE5PX1BST1RPMQorICBvcHRpb25hbCBncm91cCBCYXIgPSAzIHsgb3B0aW9uYWwgaW50MzIgYSA9IDE7IH0gIC8vIE5PX1BST1RPMQorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMQorCisKKy8vIE5lZWRlZCBmb3IgYSBQeXRob24gdGVzdC4KK21lc3NhZ2UgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIHsKKyAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKKyAgICByZXBlYXRlZCBpbnQzMiBuZXN0ZWRtZXNzYWdlX3JlcGVhdGVkX2ludDMyID0gMTsKKyAgICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSBuZXN0ZWRtZXNzYWdlX3JlcGVhdGVkX2ZvcmVpZ25tZXNzYWdlID0gMjsKKyAgfQorICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlID0gMTsKK30KKworCisvLyBUZXN0IGFuIGVudW0gdGhhdCBoYXMgbXVsdGlwbGUgdmFsdWVzIHdpdGggdGhlIHNhbWUgbnVtYmVyLgorZW51bSBUZXN0RW51bVdpdGhEdXBWYWx1ZSB7CisgIEZPTzEgPSAxOworICBCQVIxID0gMjsKKyAgQkFaID0gMzsKKyAgRk9PMiA9IDE7CisgIEJBUjIgPSAyOworfQorCisvLyBUZXN0IGFuIGVudW0gd2l0aCBsYXJnZSwgdW5vcmRlcmVkIHZhbHVlcy4KK2VudW0gVGVzdFNwYXJzZUVudW0geworICBTUEFSU0VfQSA9IDEyMzsKKyAgU1BBUlNFX0IgPSA2MjM3NDsKKyAgU1BBUlNFX0MgPSAxMjU4OTIzNDsKKyAgU1BBUlNFX0QgPSAtMTU7CisgIFNQQVJTRV9FID0gLTUzNDUyOworICBTUEFSU0VfRiA9IDA7CisgIFNQQVJTRV9HID0gMjsKK30KKworLy8gVGVzdCBtZXNzYWdlIHdpdGggQ2FtZWxDYXNlIGZpZWxkIG5hbWVzLiAgVGhpcyB2aW9sYXRlcyBQcm90b2NvbCBCdWZmZXIKKy8vIHN0YW5kYXJkIHN0eWxlLgorbWVzc2FnZSBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyB7CisgIG9wdGlvbmFsIGludDMyIFByaW1pdGl2ZUZpZWxkID0gMTsKKyAgb3B0aW9uYWwgc3RyaW5nIFN0cmluZ0ZpZWxkID0gMjsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW0gRW51bUZpZWxkID0gMzsKKyAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2UgTWVzc2FnZUZpZWxkID0gNDsKKyAgb3B0aW9uYWwgc3RyaW5nIFN0cmluZ1BpZWNlRmllbGQgPSA1IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICBvcHRpb25hbCBzdHJpbmcgQ29yZEZpZWxkID0gNiBbY3R5cGU9Q09SRF07CisKKyAgcmVwZWF0ZWQgaW50MzIgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZCA9IDc7CisgIHJlcGVhdGVkIHN0cmluZyBSZXBlYXRlZFN0cmluZ0ZpZWxkID0gODsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gUmVwZWF0ZWRFbnVtRmllbGQgPSA5OworICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSBSZXBlYXRlZE1lc3NhZ2VGaWVsZCA9IDEwOworICByZXBlYXRlZCBzdHJpbmcgUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkID0gMTEgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIHJlcGVhdGVkIHN0cmluZyBSZXBlYXRlZENvcmRGaWVsZCA9IDEyIFtjdHlwZT1DT1JEXTsKK30KKworCisvLyBXZSBsaXN0IGZpZWxkcyBvdXQgb2Ygb3JkZXIsIHRvIGVuc3VyZSB0aGF0IHdlJ3JlIHVzaW5nIGZpZWxkIG51bWJlciBhbmQgbm90CisvLyBmaWVsZCBpbmRleCB0byBkZXRlcm1pbmUgc2VyaWFsaXphdGlvbiBvcmRlci4KK21lc3NhZ2UgVGVzdEZpZWxkT3JkZXJpbmdzIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG15X3N0cmluZyA9IDExOworICBleHRlbnNpb25zIDIgdG8gMTA7CisgIG9wdGlvbmFsIGludDY0IG15X2ludCA9IDE7CisgIGV4dGVuc2lvbnMgMTIgdG8gMTAwOworICBvcHRpb25hbCBmbG9hdCBteV9mbG9hdCA9IDEwMTsKK30KKworCitleHRlbmQgVGVzdEZpZWxkT3JkZXJpbmdzIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG15X2V4dGVuc2lvbl9zdHJpbmcgPSA1MDsKKyAgb3B0aW9uYWwgaW50MzIgbXlfZXh0ZW5zaW9uX2ludCA9IDU7Cit9CisKKworbWVzc2FnZSBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgeworICBvcHRpb25hbCBieXRlcyBlc2NhcGVkX2J5dGVzID0gMSBbZGVmYXVsdCA9ICJcMFwwMDFcYVxiXGZcblxyXHRcdlxcXCdcIlx4ZmUiXTsKKyAgb3B0aW9uYWwgdWludDMyIGxhcmdlX3VpbnQzMiA9IDIgW2RlZmF1bHQgPSAweEZGRkZGRkZGXTsKKyAgb3B0aW9uYWwgdWludDY0IGxhcmdlX3VpbnQ2NCA9IDMgW2RlZmF1bHQgPSAweEZGRkZGRkZGRkZGRkZGRkZdOworICBvcHRpb25hbCAgaW50MzIgc21hbGxfaW50MzIgID0gNCBbZGVmYXVsdCA9IC0weDdGRkZGRkZGXTsKKyAgb3B0aW9uYWwgIGludDY0IHNtYWxsX2ludDY0ICA9IDUgW2RlZmF1bHQgPSAtMHg3RkZGRkZGRkZGRkZGRkZGXTsKKworICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBoZXJlIGlzIFVURi04IGZvciAiXHUxMjM0Ii4gIChXZSBjb3VsZCBhbHNvIGp1c3QgdHlwZQorICAvLyB0aGUgVVRGLTggdGV4dCBkaXJlY3RseSBpbnRvIHRoaXMgdGV4dCBmaWxlIHJhdGhlciB0aGFuIGVzY2FwZSBpdCwgYnV0CisgIC8vIGxvdHMgb2YgcGVvcGxlIHVzZSBlZGl0b3JzIHRoYXQgd291bGQgYmUgY29uZnVzZWQgYnkgdGhpcy4pCisgIG9wdGlvbmFsIHN0cmluZyB1dGY4X3N0cmluZyA9IDYgW2RlZmF1bHQgPSAiXDM0MVwyMTBcMjY0Il07CisKKyAgLy8gVGVzdHMgZm9yIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzLgorICBvcHRpb25hbCBmbG9hdCB6ZXJvX2Zsb2F0ID0gNyBbZGVmYXVsdCA9IDBdOworICBvcHRpb25hbCBmbG9hdCBvbmVfZmxvYXQgPSA4IFtkZWZhdWx0ID0gMV07CisgIG9wdGlvbmFsIGZsb2F0IHNtYWxsX2Zsb2F0ID0gOSBbZGVmYXVsdCA9IDEuNV07CisgIG9wdGlvbmFsIGZsb2F0IG5lZ2F0aXZlX29uZV9mbG9hdCA9IDEwIFtkZWZhdWx0ID0gLTFdOworICBvcHRpb25hbCBmbG9hdCBuZWdhdGl2ZV9mbG9hdCA9IDExIFtkZWZhdWx0ID0gLTEuNV07CisgIC8vIFVzaW5nIGV4cG9uZW50cworICBvcHRpb25hbCBmbG9hdCBsYXJnZV9mbG9hdCA9IDEyIFtkZWZhdWx0ID0gMkU4XTsKKyAgb3B0aW9uYWwgZmxvYXQgc21hbGxfbmVnYXRpdmVfZmxvYXQgPSAxMyBbZGVmYXVsdCA9IC04ZS0yOF07CisKKyAgLy8gVGV4dCBmb3Igbm9uZmluaXRlIGZsb2F0aW5nLXBvaW50IHZhbHVlcy4KKyAgb3B0aW9uYWwgZG91YmxlIGluZl9kb3VibGUgPSAxNCBbZGVmYXVsdCA9IGluZl07CisgIG9wdGlvbmFsIGRvdWJsZSBuZWdfaW5mX2RvdWJsZSA9IDE1IFtkZWZhdWx0ID0gLWluZl07CisgIG9wdGlvbmFsIGRvdWJsZSBuYW5fZG91YmxlID0gMTYgW2RlZmF1bHQgPSBuYW5dOworICBvcHRpb25hbCBmbG9hdCBpbmZfZmxvYXQgPSAxNyBbZGVmYXVsdCA9IGluZl07CisgIG9wdGlvbmFsIGZsb2F0IG5lZ19pbmZfZmxvYXQgPSAxOCBbZGVmYXVsdCA9IC1pbmZdOworICBvcHRpb25hbCBmbG9hdCBuYW5fZmxvYXQgPSAxOSBbZGVmYXVsdCA9IG5hbl07CisKKyAgLy8gVGVzdHMgZm9yIEMrKyB0cmlncmFwaHMuCisgIC8vIFRyaWdyYXBocyBzaG91bGQgYmUgZXNjYXBlZCBpbiBDKysgZ2VuZXJhdGVkIGZpbGVzLCBidXQgdGhleSBzaG91bGQgbm90IGJlCisgIC8vIGVzY2FwZWQgZm9yIG90aGVyIGxhbmd1YWdlcy4KKyAgLy8gTm90ZSB0aGF0IGluIC5wcm90byBmaWxlLCAiXD8iIGlzIGEgdmFsaWQgd2F5IHRvIGVzY2FwZSA/IGluIHN0cmluZworICAvLyBsaXRlcmFscy4KKyAgb3B0aW9uYWwgc3RyaW5nIGNwcF90cmlncmFwaCA9IDIwIFtkZWZhdWx0ID0gIj8gXD8gPz8gXD8/IFw/Pz8gPz8vID9cPy0iXTsKK30KKworbWVzc2FnZSBTcGFyc2VFbnVtTWVzc2FnZSB7CisgIG9wdGlvbmFsIFRlc3RTcGFyc2VFbnVtIHNwYXJzZV9lbnVtID0gMTsKK30KKworLy8gVGVzdCBTdHJpbmcgYW5kIEJ5dGVzOiBzdHJpbmcgaXMgZm9yIHZhbGlkIFVURi04IHN0cmluZ3MKK21lc3NhZ2UgT25lU3RyaW5nIHsKKyAgb3B0aW9uYWwgc3RyaW5nIGRhdGEgPSAxOworfQorCittZXNzYWdlIE9uZUJ5dGVzIHsKKyAgb3B0aW9uYWwgYnl0ZXMgZGF0YSA9IDE7Cit9CisKKy8vIFRlc3QgbWVzc2FnZXMgZm9yIHBhY2tlZCBmaWVsZHMKKworbWVzc2FnZSBUZXN0UGFja2VkVHlwZXMgeworICByZXBlYXRlZCAgICBpbnQzMiBwYWNrZWRfaW50MzIgICAgPSAgOTAgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgICBpbnQ2NCBwYWNrZWRfaW50NjQgICAgPSAgOTEgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHVpbnQzMiBwYWNrZWRfdWludDMyICAgPSAgOTIgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHVpbnQ2NCBwYWNrZWRfdWludDY0ICAgPSAgOTMgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHNpbnQzMiBwYWNrZWRfc2ludDMyICAgPSAgOTQgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHNpbnQ2NCBwYWNrZWRfc2ludDY0ICAgPSAgOTUgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgZml4ZWQzMiBwYWNrZWRfZml4ZWQzMiAgPSAgOTYgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgZml4ZWQ2NCBwYWNrZWRfZml4ZWQ2NCAgPSAgOTcgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQzMiBwYWNrZWRfc2ZpeGVkMzIgPSAgOTggW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQ2NCBwYWNrZWRfc2ZpeGVkNjQgPSAgOTkgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgICBmbG9hdCBwYWNrZWRfZmxvYXQgICAgPSAxMDAgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIGRvdWJsZSBwYWNrZWRfZG91YmxlICAgPSAxMDEgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgICAgYm9vbCBwYWNrZWRfYm9vbCAgICAgPSAxMDIgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBGb3JlaWduRW51bSBwYWNrZWRfZW51bSAgPSAxMDMgW3BhY2tlZCA9IHRydWVdOworfQorCisvLyBBIG1lc3NhZ2Ugd2l0aCB0aGUgc2FtZSBmaWVsZHMgYXMgVGVzdFBhY2tlZFR5cGVzLCBidXQgd2l0aG91dCBwYWNraW5nLiBVc2VkCisvLyB0byB0ZXN0IHBhY2tlZCA8LT4gdW5wYWNrZWQgd2lyZSBjb21wYXRpYmlsaXR5LgorbWVzc2FnZSBUZXN0VW5wYWNrZWRUeXBlcyB7CisgIHJlcGVhdGVkICAgIGludDMyIHVucGFja2VkX2ludDMyICAgID0gIDkwIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgIGludDY0IHVucGFja2VkX2ludDY0ICAgID0gIDkxIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgdWludDMyIHVucGFja2VkX3VpbnQzMiAgID0gIDkyIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgdWludDY0IHVucGFja2VkX3VpbnQ2NCAgID0gIDkzIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgc2ludDMyIHVucGFja2VkX3NpbnQzMiAgID0gIDk0IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgc2ludDY0IHVucGFja2VkX3NpbnQ2NCAgID0gIDk1IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICBmaXhlZDMyIHVucGFja2VkX2ZpeGVkMzIgID0gIDk2IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICBmaXhlZDY0IHVucGFja2VkX2ZpeGVkNjQgID0gIDk3IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHNmaXhlZDMyIHVucGFja2VkX3NmaXhlZDMyID0gIDk4IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHVucGFja2VkX3NmaXhlZDY0ID0gIDk5IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgIGZsb2F0IHVucGFja2VkX2Zsb2F0ICAgID0gMTAwIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgZG91YmxlIHVucGFja2VkX2RvdWJsZSAgID0gMTAxIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgICBib29sIHVucGFja2VkX2Jvb2wgICAgID0gMTAyIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtIHVucGFja2VkX2VudW0gID0gMTAzIFtwYWNrZWQgPSBmYWxzZV07Cit9CisKK21lc3NhZ2UgVGVzdFBhY2tlZEV4dGVuc2lvbnMgeworICBleHRlbnNpb25zIDEgdG8gbWF4OworfQorCitleHRlbmQgVGVzdFBhY2tlZEV4dGVuc2lvbnMgeworICByZXBlYXRlZCAgICBpbnQzMiBwYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgID0gIDkwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgaW50NjQgcGFja2VkX2ludDY0X2V4dGVuc2lvbiAgICA9ICA5MSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgdWludDMyIHBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICAgPSAgOTIgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHVpbnQ2NCBwYWNrZWRfdWludDY0X2V4dGVuc2lvbiAgID0gIDkzIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBzaW50MzIgcGFja2VkX3NpbnQzMl9leHRlbnNpb24gICA9ICA5NCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgc2ludDY0IHBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICAgPSAgOTUgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgZml4ZWQzMiBwYWNrZWRfZml4ZWQzMl9leHRlbnNpb24gID0gIDk2IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgIGZpeGVkNjQgcGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uICA9ICA5NyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDMyIHBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24gPSAgOTggW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQ2NCBwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uID0gIDk5IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgZmxvYXQgcGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICA9IDEwMCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgZG91YmxlIHBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICAgPSAxMDEgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgICAgYm9vbCBwYWNrZWRfYm9vbF9leHRlbnNpb24gICAgID0gMTAyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gcGFja2VkX2VudW1fZXh0ZW5zaW9uICA9IDEwMyBbcGFja2VkID0gdHJ1ZV07Cit9CisKKy8vIFVzZWQgYnkgRXh0ZW5zaW9uU2V0VGVzdC9EeW5hbWljRXh0ZW5zaW9ucy4gIFRoZSB0ZXN0IGFjdHVhbGx5IGJ1aWxkcworLy8gYSBzZXQgb2YgZXh0ZW5zaW9ucyB0byBUZXN0QWxsRXh0ZW5zaW9ucyBkeW5hbWljYWxseSwgYmFzZWQgb24gdGhlIGZpZWxkcworLy8gb2YgdGhpcyBtZXNzYWdlIHR5cGUuCittZXNzYWdlIFRlc3REeW5hbWljRXh0ZW5zaW9ucyB7CisgIGVudW0gRHluYW1pY0VudW1UeXBlIHsKKyAgICBEWU5BTUlDX0ZPTyA9IDIyMDA7CisgICAgRFlOQU1JQ19CQVIgPSAyMjAxOworICAgIERZTkFNSUNfQkFaID0gMjIwMjsKKyAgfQorICBtZXNzYWdlIER5bmFtaWNNZXNzYWdlVHlwZSB7CisgICAgb3B0aW9uYWwgaW50MzIgZHluYW1pY19maWVsZCA9IDIxMDA7CisgIH0KKworICBvcHRpb25hbCBmaXhlZDMyIHNjYWxhcl9leHRlbnNpb24gPSAyMDAwOworICBvcHRpb25hbCBGb3JlaWduRW51bSBlbnVtX2V4dGVuc2lvbiA9IDIwMDE7CisgIG9wdGlvbmFsIER5bmFtaWNFbnVtVHlwZSBkeW5hbWljX2VudW1fZXh0ZW5zaW9uID0gMjAwMjsKKworICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSBtZXNzYWdlX2V4dGVuc2lvbiA9IDIwMDM7CisgIG9wdGlvbmFsIER5bmFtaWNNZXNzYWdlVHlwZSBkeW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uID0gMjAwNDsKKworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfZXh0ZW5zaW9uID0gMjAwNTsKKyAgcmVwZWF0ZWQgc2ludDMyIHBhY2tlZF9leHRlbnNpb24gPSAyMDA2IFtwYWNrZWQgPSB0cnVlXTsKK30KKworbWVzc2FnZSBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyB7CisgIC8vIFBhcnNpbmcgcmVwZWF0ZWQgZml4ZWQgc2l6ZSB2YWx1ZXMgdXNlZCB0byBmYWlsLiBUaGlzIG1lc3NhZ2UgbmVlZHMgdG8gYmUKKyAgLy8gdXNlZCBpbiBvcmRlciB0byBnZXQgYSB0YWcgb2YgdGhlIHJpZ2h0IHNpemU7IGFsbCBvZiB0aGUgcmVwZWF0ZWQgZmllbGRzCisgIC8vIGluIFRlc3RBbGxUeXBlcyBkaWRuJ3QgdHJpZ2dlciB0aGUgY2hlY2suCisgIHJlcGVhdGVkIGZpeGVkMzIgcmVwZWF0ZWRfZml4ZWQzMiA9IDEyOworICAvLyBDaGVjayBmb3IgYSB2YXJpbnQgdHlwZSwganVzdCBmb3IgZ29vZCBtZWFzdXJlLgorICByZXBlYXRlZCBpbnQzMiAgIHJlcGVhdGVkX2ludDMyICAgPSAxMzsKKworICAvLyBUaGVzZSBoYXZlIHR3by1ieXRlIHRhZ3MuCisgIHJlcGVhdGVkIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NCA9IDIwNDY7CisgIHJlcGVhdGVkIGludDY0ICAgcmVwZWF0ZWRfaW50NjQgICA9IDIwNDc7CisKKyAgLy8gVGhyZWUgYnl0ZSB0YWdzLgorICByZXBlYXRlZCBmbG9hdCAgIHJlcGVhdGVkX2Zsb2F0ICAgPSAyNjIxNDI7CisgIHJlcGVhdGVkIHVpbnQ2NCAgcmVwZWF0ZWRfdWludDY0ICA9IDI2MjE0MzsKK30KKworCisvLyBUZXN0IHRoYXQgUlBDIHNlcnZpY2VzIHdvcmsuCittZXNzYWdlIEZvb1JlcXVlc3QgIHt9CittZXNzYWdlIEZvb1Jlc3BvbnNlIHt9CisKK3NlcnZpY2UgVGVzdFNlcnZpY2UgeworICBycGMgRm9vKEZvb1JlcXVlc3QpIHJldHVybnMgKEZvb1Jlc3BvbnNlKTsKKyAgcnBjIEJhcihCYXJSZXF1ZXN0KSByZXR1cm5zIChCYXJSZXNwb25zZSk7Cit9CisKKworbWVzc2FnZSBCYXJSZXF1ZXN0ICB7fQorbWVzc2FnZSBCYXJSZXNwb25zZSB7fQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3NoYXJwX29wdGlvbnMucHJvdG8gYi9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jc2hhcnBfb3B0aW9ucy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzY5MzI5Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3NoYXJwX29wdGlvbnMucHJvdG8KQEAgLTAsMCArMSw1MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBqb25za2VldEBnb29nbGUuY29tIChKb24gU2tlZXQpCisvLworLy8gQSBwcm90byBmaWxlIGZvciB1bml0IHRlc3RpbmcgdGhlIGN1c3RvbSBDIyBvcHRpb25zCisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIjsKK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLm5hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MiOworb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykudW1icmVsbGFfY2xhc3NuYW1lID0gIlVuaXRUZXN0Q1NoYXJwT3B0aW9uc1Byb3RvRmlsZSI7CisvL29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLm5lc3RfY2xhc3NlcyA9IHRydWU7CisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK21lc3NhZ2UgT3B0aW9uc01lc3NhZ2UgeworCisgIC8vIFdpbGwgYmUgbGVmdCBhcyBOb3JtYWwKKyAgb3B0aW9uYWwgc3RyaW5nIG5vcm1hbCA9IDE7CisKKyAgLy8gV2lsbCBiZSBjb252ZXJ0ZWQgdG8gT3B0aW9uc01lc3NhZ2VfCisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25zX21lc3NhZ2UgPSAyOworICAKKyAgLy8gV2lsbCBiZSBjb252ZXJ0ZWQgdG8gQ3VzdG9tTmFtZQorICBvcHRpb25hbCBzdHJpbmcgY3VzdG9taXplZCA9IDMgWyhnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpZWxkX29wdGlvbnMpLnByb3BlcnR5X25hbWUgPSAiQ3VzdG9tTmFtZSJdOworfQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8gYi9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDFmYjMyCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8KQEAgLTAsMCArMSwzNzIgQEAKKy8vIEFkZGl0aW9uYWwgb3B0aW9ucyByZXF1aXJlZCBmb3IgQyMgZ2VuZXJhdGlvbi4gRmlsZSBmcm9tIGNvcHlyaWdodAorLy8gbGluZSBvbndhcmRzIGlzIGFzIHBlciBvcmlnaW5hbCBkaXN0cmlidXRpb24uCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byI7CitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS5uYW1lc3BhY2UgPSAiR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zIjsKK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLnVtYnJlbGxhX2NsYXNzbmFtZSA9ICJVbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUiOworCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGJlbmp5QGdvb2dsZS5jb20gKEJlbmp5IFdlaW5iZXJnZXIpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBBIHByb3RvIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSAiY3VzdG9tIG9wdGlvbnMiIGZlYXR1cmUgb2YgcHJvdG8yLgorCisKKy8vIFNvbWUgZ2VuZXJpY19zZXJ2aWNlcyBvcHRpb24ocykgYWRkZWQgYXV0b21hdGljYWxseS4KKy8vIFNlZTogIGh0dHA6Ly9nby9wcm90bzItZ2VuZXJpYy1zZXJ2aWNlcy1kZWZhdWx0CitvcHRpb24gY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IHRydWU7ICAgICAvLyBhdXRvLWFkZGVkCitvcHRpb24gamF2YV9nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAvLyBhdXRvLWFkZGVkCitvcHRpb24gcHlfZ2VuZXJpY19zZXJ2aWNlcyA9IHRydWU7CisKKy8vIEEgY3VzdG9tIGZpbGUgb3B0aW9uIChkZWZpbmVkIGJlbG93KS4KK29wdGlvbiAoZmlsZV9vcHQxKSA9IDk4NzY1NDMyMTA7CisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iOworCisvLyBXZSBkb24ndCBwdXQgdGhpcyBpbiBhIHBhY2thZ2Ugd2l0aGluIHByb3RvMiBiZWNhdXNlIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisvLyB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBkb2Vzbid0IGRlcGVuZCBvbiBiZWluZyBpbiB0aGUgcHJvdG8yIG5hbWVzcGFjZS4KK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKKworLy8gU29tZSBzaW1wbGUgdGVzdCBjdXN0b20gb3B0aW9ucyBvZiB2YXJpb3VzIHR5cGVzLgorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIHsKKyAgb3B0aW9uYWwgdWludDY0IGZpbGVfb3B0MSA9IDc3MzY5NzQ7Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgeworICBvcHRpb25hbCBpbnQzMiBtZXNzYWdlX29wdDEgPSA3NzM5MDM2OworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyB7CisgIG9wdGlvbmFsIGZpeGVkNjQgZmllbGRfb3B0MSA9IDc3NDA5MzY7CisgIC8vIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIHRoYXQgd2UgY29ycmVjdGx5IHJlZ2lzdGVyIGRlZmF1bHQgdmFsdWVzIGZvcgorICAvLyBleHRlbnNpb24gb3B0aW9ucy4KKyAgb3B0aW9uYWwgaW50MzIgZmllbGRfb3B0MiA9IDc3NTM5MTMgW2RlZmF1bHQ9NDJdOworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zIHsKKyAgb3B0aW9uYWwgc2ZpeGVkMzIgZW51bV9vcHQxID0gNzc1MzU3NjsKK30KKworZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIHsKKyAgb3B0aW9uYWwgaW50MzIgZW51bV92YWx1ZV9vcHQxID0gMTU2MDY3ODsKK30KKworZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyB7CisgIG9wdGlvbmFsIHNpbnQ2NCBzZXJ2aWNlX29wdDEgPSA3ODg3NjUwOworfQorCitlbnVtIE1ldGhvZE9wdDEgeworICBNRVRIT0RPUFQxX1ZBTDEgPSAxOworICBNRVRIT0RPUFQxX1ZBTDIgPSAyOworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMgeworICBvcHRpb25hbCBNZXRob2RPcHQxIG1ldGhvZF9vcHQxID0gNzg5MDg2MDsKK30KKworLy8gQSB0ZXN0IG1lc3NhZ2Ugd2l0aCBjdXN0b20gb3B0aW9ucyBhdCBhbGwgcG9zc2libGUgbG9jYXRpb25zIChhbmQgYWxzbyBzb21lCisvLyByZWd1bGFyIG9wdGlvbnMsIHRvIG1ha2Ugc3VyZSB0aGV5IGludGVyYWN0IG5pY2VseSkuCittZXNzYWdlIFRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMgeworICBvcHRpb24gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSBmYWxzZTsKKworICBvcHRpb24gKG1lc3NhZ2Vfb3B0MSkgPSAtNTY7CisKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkMSA9IDEgW2N0eXBlPUNPUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmllbGRfb3B0MSk9ODc2NTQzMjEwOV07CisKKyAgZW51bSBBbkVudW0geworICAgIG9wdGlvbiAoZW51bV9vcHQxKSA9IC03ODk7CisKKyAgICBBTkVOVU1fVkFMMSA9IDE7CisgICAgQU5FTlVNX1ZBTDIgPSAyIFsoZW51bV92YWx1ZV9vcHQxKSA9IDEyM107CisgIH0KK30KKworCisvLyBBIHRlc3QgUlBDIHNlcnZpY2Ugd2l0aCBjdXN0b20gb3B0aW9ucyBhdCBhbGwgcG9zc2libGUgbG9jYXRpb25zIChhbmQgYWxzbworLy8gc29tZSByZWd1bGFyIG9wdGlvbnMsIHRvIG1ha2Ugc3VyZSB0aGV5IGludGVyYWN0IG5pY2VseSkuCittZXNzYWdlIEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QgeworfQorCittZXNzYWdlIEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlIHsKK30KKworc2VydmljZSBUZXN0U2VydmljZVdpdGhDdXN0b21PcHRpb25zIHsKKyAgb3B0aW9uIChzZXJ2aWNlX29wdDEpID0gLTk4NzY1NDMyMTA7CisKKyAgcnBjIEZvbyhDdXN0b21PcHRpb25Gb29SZXF1ZXN0KSByZXR1cm5zIChDdXN0b21PcHRpb25Gb29SZXNwb25zZSkgeworICAgIG9wdGlvbiAobWV0aG9kX29wdDEpID0gTUVUSE9ET1BUMV9WQUwyOworICB9Cit9CisKKworCisvLyBPcHRpb25zIG9mIGV2ZXJ5IHBvc3NpYmxlIGZpZWxkIHR5cGUsIHNvIHdlIGNhbiB0ZXN0IHRoZW0gYWxsIGV4aGF1c3RpdmVseS4KKworbWVzc2FnZSBEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bSB7CisgIGVudW0gVGVzdEVudW1UeXBlIHsKKyAgICBURVNUX09QVElPTl9FTlVNX1RZUEUxID0gMjI7CisgICAgVEVTVF9PUFRJT05fRU5VTV9UWVBFMiA9IC0yMzsKKyAgfQorfQorCittZXNzYWdlIER1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGUgeworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIHsKKyAgb3B0aW9uYWwgICAgICAgICBib29sICAgICBib29sX29wdCA9IDc3MDYwOTA7CisgIG9wdGlvbmFsICAgICAgICBpbnQzMiAgICBpbnQzMl9vcHQgPSA3NzA1NzA5OworICBvcHRpb25hbCAgICAgICAgaW50NjQgICAgaW50NjRfb3B0ID0gNzcwNTU0MjsKKyAgb3B0aW9uYWwgICAgICAgdWludDMyICAgdWludDMyX29wdCA9IDc3MDQ4ODA7CisgIG9wdGlvbmFsICAgICAgIHVpbnQ2NCAgIHVpbnQ2NF9vcHQgPSA3NzAyMzY3OworICBvcHRpb25hbCAgICAgICBzaW50MzIgICBzaW50MzJfb3B0ID0gNzcwMTU2ODsKKyAgb3B0aW9uYWwgICAgICAgc2ludDY0ICAgc2ludDY0X29wdCA9IDc3MDA4NjM7CisgIG9wdGlvbmFsICAgICAgZml4ZWQzMiAgZml4ZWQzMl9vcHQgPSA3NzAwMzA3OworICBvcHRpb25hbCAgICAgIGZpeGVkNjQgIGZpeGVkNjRfb3B0ID0gNzcwMDE5NDsKKyAgb3B0aW9uYWwgICAgIHNmaXhlZDMyIHNmaXhlZDMyX29wdCA9IDc2OTg2NDU7CisgIG9wdGlvbmFsICAgICBzZml4ZWQ2NCBzZml4ZWQ2NF9vcHQgPSA3Njg1NDc1OworICBvcHRpb25hbCAgICAgICAgZmxvYXQgICAgZmxvYXRfb3B0ID0gNzY3NTM5MDsKKyAgb3B0aW9uYWwgICAgICAgZG91YmxlICAgZG91YmxlX29wdCA9IDc2NzMyOTM7CisgIG9wdGlvbmFsICAgICAgIHN0cmluZyAgIHN0cmluZ19vcHQgPSA3NjczMjg1OworICBvcHRpb25hbCAgICAgICAgYnl0ZXMgICAgYnl0ZXNfb3B0ID0gNzY3MzIzODsKKyAgb3B0aW9uYWwgRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW0uVGVzdEVudW1UeXBlIGVudW1fb3B0ID0gNzY3MzIzMzsKKyAgb3B0aW9uYWwgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSBtZXNzYWdlX3R5cGVfb3B0ID0gNzY2NTk2NzsKK30KKworbWVzc2FnZSBDdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzIHsKKyAgb3B0aW9uICAgICAoYm9vbF9vcHQpID0gZmFsc2U7CisgIG9wdGlvbiAgICAoaW50MzJfb3B0KSA9IC0weDgwMDAwMDAwOworICBvcHRpb24gICAgKGludDY0X29wdCkgPSAtMHg4MDAwMDAwMDAwMDAwMDAwOworICBvcHRpb24gICAodWludDMyX29wdCkgPSAwOworICBvcHRpb24gICAodWludDY0X29wdCkgPSAwOworICBvcHRpb24gICAoc2ludDMyX29wdCkgPSAtMHg4MDAwMDAwMDsKKyAgb3B0aW9uICAgKHNpbnQ2NF9vcHQpID0gLTB4ODAwMDAwMDAwMDAwMDAwMDsKKyAgb3B0aW9uICAoZml4ZWQzMl9vcHQpID0gMDsKKyAgb3B0aW9uICAoZml4ZWQ2NF9vcHQpID0gMDsKKyAgb3B0aW9uIChzZml4ZWQzMl9vcHQpID0gLTB4ODAwMDAwMDA7CisgIG9wdGlvbiAoc2ZpeGVkNjRfb3B0KSA9IC0weDgwMDAwMDAwMDAwMDAwMDA7Cit9CisKK21lc3NhZ2UgQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcyB7CisgIG9wdGlvbiAgICAgKGJvb2xfb3B0KSA9IHRydWU7CisgIG9wdGlvbiAgICAoaW50MzJfb3B0KSA9IDB4N0ZGRkZGRkY7CisgIG9wdGlvbiAgICAoaW50NjRfb3B0KSA9IDB4N0ZGRkZGRkZGRkZGRkZGRjsKKyAgb3B0aW9uICAgKHVpbnQzMl9vcHQpID0gMHhGRkZGRkZGRjsKKyAgb3B0aW9uICAgKHVpbnQ2NF9vcHQpID0gMHhGRkZGRkZGRkZGRkZGRkZGOworICBvcHRpb24gICAoc2ludDMyX29wdCkgPSAweDdGRkZGRkZGOworICBvcHRpb24gICAoc2ludDY0X29wdCkgPSAweDdGRkZGRkZGRkZGRkZGRkY7CisgIG9wdGlvbiAgKGZpeGVkMzJfb3B0KSA9IDB4RkZGRkZGRkY7CisgIG9wdGlvbiAgKGZpeGVkNjRfb3B0KSA9IDB4RkZGRkZGRkZGRkZGRkZGRjsKKyAgb3B0aW9uIChzZml4ZWQzMl9vcHQpID0gMHg3RkZGRkZGRjsKKyAgb3B0aW9uIChzZml4ZWQ2NF9vcHQpID0gMHg3RkZGRkZGRkZGRkZGRkZGOworfQorCittZXNzYWdlIEN1c3RvbU9wdGlvbk90aGVyVmFsdWVzIHsKKyAgb3B0aW9uICAoaW50MzJfb3B0KSA9IC0xMDA7ICAvLyBUbyB0ZXN0IHNpZ24tZXh0ZW5zaW9uLgorICBvcHRpb24gIChmbG9hdF9vcHQpID0gMTIuMzQ1Njc4OTsKKyAgb3B0aW9uIChkb3VibGVfb3B0KSA9IDEuMjM0NTY3ODkwMTIzNDU2Nzg5OworICBvcHRpb24gKHN0cmluZ19vcHQpID0gIkhlbGxvLCBcIldvcmxkXCIiOworICBvcHRpb24gIChieXRlc19vcHQpID0gIkhlbGxvXDBXb3JsZCI7CisgIG9wdGlvbiAgIChlbnVtX29wdCkgPSBURVNUX09QVElPTl9FTlVNX1RZUEUyOworfQorCittZXNzYWdlIFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMgeworICBvcHRpb24gIChmbG9hdF9vcHQpID0gMTI7CisgIG9wdGlvbiAoZG91YmxlX29wdCkgPSAxNTQ7Cit9CisKK21lc3NhZ2UgU2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50cyB7CisgIG9wdGlvbiAgKGZsb2F0X29wdCkgPSAtMTI7CisgIG9wdGlvbiAgKGRvdWJsZV9vcHQpID0gLTE1NDsKK30KKworLy8gT3B0aW9ucyBvZiBjb21wbGV4IG1lc3NhZ2UgdHlwZXMsIHRoZW1zZWx2ZXMgY29tYmluZWQgYW5kIGV4dGVuZGVkIGluCisvLyB2YXJpb3VzIHdheXMuCisKK21lc3NhZ2UgQ29tcGxleE9wdGlvblR5cGUxIHsKKyAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgZm9vMiA9IDI7CisgIG9wdGlvbmFsIGludDMyIGZvbzMgPSAzOworCisgIGV4dGVuc2lvbnMgMTAwIHRvIG1heDsKK30KKworbWVzc2FnZSBDb21wbGV4T3B0aW9uVHlwZTIgeworICBvcHRpb25hbCBDb21wbGV4T3B0aW9uVHlwZTEgYmFyID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgYmF6ID0gMjsKKworICBtZXNzYWdlIENvbXBsZXhPcHRpb25UeXBlNCB7CisgICAgb3B0aW9uYWwgaW50MzIgd2FsZG8gPSAxOworCisgICAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyB7CisgICAgICBvcHRpb25hbCBDb21wbGV4T3B0aW9uVHlwZTQgY29tcGxleF9vcHQ0ID0gNzYzMzU0NjsKKyAgICB9CisgIH0KKworICBvcHRpb25hbCBDb21wbGV4T3B0aW9uVHlwZTQgZnJlZCA9IDM7CisKKyAgZXh0ZW5zaW9ucyAxMDAgdG8gbWF4OworfQorCittZXNzYWdlIENvbXBsZXhPcHRpb25UeXBlMyB7CisgIG9wdGlvbmFsIGludDMyIHF1eCA9IDE7CisKKyAgb3B0aW9uYWwgZ3JvdXAgQ29tcGxleE9wdGlvblR5cGU1ID0gMiB7CisgICAgb3B0aW9uYWwgaW50MzIgcGx1Z2ggPSAzOworICB9Cit9CisKK2V4dGVuZCBDb21wbGV4T3B0aW9uVHlwZTEgeworICBvcHRpb25hbCBpbnQzMiBxdXV4ID0gNzY2MzcwNzsKKyAgb3B0aW9uYWwgQ29tcGxleE9wdGlvblR5cGUzIGNvcmdlID0gNzY2MzQ0MjsKK30KKworZXh0ZW5kIENvbXBsZXhPcHRpb25UeXBlMiB7CisgIG9wdGlvbmFsIGludDMyIGdyYXVsdCA9IDc2NTA5Mjc7CisgIG9wdGlvbmFsIENvbXBsZXhPcHRpb25UeXBlMSBnYXJwbHkgPSA3NjQ5OTkyOworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIHsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3QuQ29tcGxleE9wdGlvblR5cGUxIGNvbXBsZXhfb3B0MSA9IDc2NDY3NTY7CisgIG9wdGlvbmFsIENvbXBsZXhPcHRpb25UeXBlMiBjb21wbGV4X29wdDIgPSA3NjM2OTQ5OworICBvcHRpb25hbCBDb21wbGV4T3B0aW9uVHlwZTMgY29tcGxleF9vcHQzID0gNzYzNjQ2MzsKKyAgb3B0aW9uYWwgZ3JvdXAgQ29tcGxleE9wdDYgPSA3NTk1NDY4IHsKKyAgICBvcHRpb25hbCBpbnQzMiB4eXp6eSA9IDc1OTM5NTE7CisgIH0KK30KKworLy8gTm90ZSB0aGF0IHdlIHRyeSB2YXJpb3VzIGRpZmZlcmVudCB3YXlzIG9mIG5hbWluZyB0aGUgc2FtZSBleHRlbnNpb24uCittZXNzYWdlIFZhcmlvdXNDb21wbGV4T3B0aW9ucyB7CisgIG9wdGlvbiAoLnByb3RvYnVmX3VuaXR0ZXN0LmNvbXBsZXhfb3B0MSkuZm9vID0gNDI7CisgIG9wdGlvbiAocHJvdG9idWZfdW5pdHRlc3QuY29tcGxleF9vcHQxKS4oLnByb3RvYnVmX3VuaXR0ZXN0LnF1dXgpID0gMzI0OworICBvcHRpb24gKC5wcm90b2J1Zl91bml0dGVzdC5jb21wbGV4X29wdDEpLihwcm90b2J1Zl91bml0dGVzdC5jb3JnZSkucXV4ID0gODc2OworICBvcHRpb24gKGNvbXBsZXhfb3B0MikuYmF6ID0gOTg3OworICBvcHRpb24gKGNvbXBsZXhfb3B0MikuKGdyYXVsdCkgPSA2NTQ7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS5iYXIuZm9vID0gNzQzOworICBvcHRpb24gKGNvbXBsZXhfb3B0MikuYmFyLihxdXV4KSA9IDE5OTk7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS5iYXIuKHByb3RvYnVmX3VuaXR0ZXN0LmNvcmdlKS5xdXggPSAyMDA4OworICBvcHRpb24gKGNvbXBsZXhfb3B0MikuKGdhcnBseSkuZm9vID0gNzQxOworICBvcHRpb24gKGNvbXBsZXhfb3B0MikuKGdhcnBseSkuKC5wcm90b2J1Zl91bml0dGVzdC5xdXV4KSA9IDE5OTg7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS4ocHJvdG9idWZfdW5pdHRlc3QuZ2FycGx5KS4oY29yZ2UpLnF1eCA9IDIxMjE7CisgIG9wdGlvbiAoQ29tcGxleE9wdGlvblR5cGUyLkNvbXBsZXhPcHRpb25UeXBlNC5jb21wbGV4X29wdDQpLndhbGRvID0gMTk3MTsKKyAgb3B0aW9uIChjb21wbGV4X29wdDIpLmZyZWQud2FsZG8gPSAzMjE7CisgIG9wdGlvbiAocHJvdG9idWZfdW5pdHRlc3QuY29tcGxleF9vcHQzKS5xdXggPSA5OworICBvcHRpb24gKGNvbXBsZXhfb3B0MykuY29tcGxleG9wdGlvbnR5cGU1LnBsdWdoID0gMjI7CisgIG9wdGlvbiAoY29tcGxleG9wdDYpLnh5enp5ID0gMjQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVmaW5pdGlvbnMgZm9yIHRlc3RpbmcgYWdncmVnYXRlIG9wdGlvbiBwYXJzaW5nLgorLy8gU2VlIGRlc2NyaXB0b3JfdW5pdHRlc3QuY2MuCisKK21lc3NhZ2UgQWdncmVnYXRlTWVzc2FnZVNldCB7CisgIG9wdGlvbiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IHRydWU7CisgIGV4dGVuc2lvbnMgNCB0byBtYXg7Cit9CisKK21lc3NhZ2UgQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQgeworICBleHRlbmQgQWdncmVnYXRlTWVzc2FnZVNldCB7CisgICAgb3B0aW9uYWwgQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQgbWVzc2FnZV9zZXRfZXh0ZW5zaW9uID0gMTU0NDc1NDI7CisgIH0KKyAgb3B0aW9uYWwgc3RyaW5nIHMgPSAxOworfQorCisvLyBBIGhlbHBlciB0eXBlIHVzZWQgdG8gdGVzdCBhZ2dyZWdhdGUgb3B0aW9uIHBhcnNpbmcKK21lc3NhZ2UgQWdncmVnYXRlIHsKKyAgb3B0aW9uYWwgaW50MzIgaSA9IDE7CisgIG9wdGlvbmFsIHN0cmluZyBzID0gMjsKKworICAvLyBBIG5lc3RlZCBvYmplY3QKKyAgb3B0aW9uYWwgQWdncmVnYXRlIHN1YiA9IDM7CisKKyAgLy8gVG8gdGVzdCB0aGUgcGFyc2luZyBvZiBleHRlbnNpb25zIGluc2lkZSBhZ2dyZWdhdGUgdmFsdWVzCisgIG9wdGlvbmFsIGdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyBmaWxlID0gNDsKKyAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyB7CisgICAgb3B0aW9uYWwgQWdncmVnYXRlIG5lc3RlZCA9IDE1NDc2OTAzOworICB9CisKKyAgLy8gQW4gZW1iZWRkZWQgbWVzc2FnZSBzZXQKKyAgb3B0aW9uYWwgQWdncmVnYXRlTWVzc2FnZVNldCBtc2V0ID0gNTsKK30KKworLy8gQWxsb3cgQWdncmVnYXRlIHRvIGJlIHVzZWQgYXMgYW4gb3B0aW9uIGF0IGFsbCBwb3NzaWJsZSBsb2NhdGlvbnMKKy8vIGluIHRoZSAucHJvdG8gZ3JhbW1lci4KK2V4dGVuZCBnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgICAgICB7IG9wdGlvbmFsIEFnZ3JlZ2F0ZSBmaWxlb3B0ICAgID0gMTU0Nzg0Nzk7IH0KK2V4dGVuZCBnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgICB7IG9wdGlvbmFsIEFnZ3JlZ2F0ZSBtc2dvcHQgICAgID0gMTU0ODAwODg7IH0KK2V4dGVuZCBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zICAgICB7IG9wdGlvbmFsIEFnZ3JlZ2F0ZSBmaWVsZG9wdCAgID0gMTU0ODEzNzQ7IH0KK2V4dGVuZCBnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgICAgICB7IG9wdGlvbmFsIEFnZ3JlZ2F0ZSBlbnVtb3B0X3JlbmFtZWQgICAgPSAxNTQ4MzIxODsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIHsgb3B0aW9uYWwgQWdncmVnYXRlIGVudW12YWxvcHQgPSAxNTQ4NjkyMTsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIHNlcnZpY2VvcHQgPSAxNTQ5NzE0NTsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zICAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIG1ldGhvZG9wdCAgPSAxNTUxMjcxMzsgfQorCisvLyBUcnkgdXNpbmcgQWdncmVnYXRlT3B0aW9uIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGhlIHByb3RvIGdyYW1tYXIKK29wdGlvbiAoZmlsZW9wdCkgPSB7CisgIHM6ICdGaWxlQW5ub3RhdGlvbicKKyAgLy8gQWxzbyB0ZXN0IHRoZSBoYW5kbGluZyBvZiBjb21tZW50cworICAvKiBvZiBib3RoIHR5cGVzICovIGk6IDEwMAorCisgIHN1YiB7IHM6ICdOZXN0ZWRGaWxlQW5ub3RhdGlvbicgfQorCisgIC8vIEluY2x1ZGUgYSBnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgYW5kIHJlY3Vyc2l2ZWx5IGV4dGVuZCBpdCB3aXRoCisgIC8vIGFub3RoZXIgZmlsZW9wdC4KKyAgZmlsZSB7CisgICAgW3Byb3RvYnVmX3VuaXR0ZXN0LmZpbGVvcHRdIHsKKyAgICAgIHM6J0ZpbGVFeHRlbnNpb25Bbm5vdGF0aW9uJworICAgIH0KKyAgfQorCisgIC8vIEEgbWVzc2FnZSBzZXQgaW5zaWRlIGFuIG9wdGlvbiB2YWx1ZQorICBtc2V0IHsKKyAgICBbcHJvdG9idWZfdW5pdHRlc3QuQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQubWVzc2FnZV9zZXRfZXh0ZW5zaW9uXSB7CisgICAgICBzOiAnRW1iZWRkZWRNZXNzYWdlU2V0RWxlbWVudCcKKyAgICB9CisgIH0KK307CisKK21lc3NhZ2UgQWdncmVnYXRlTWVzc2FnZSB7CisgIG9wdGlvbiAobXNnb3B0KSA9IHsgaToxMDEgczonTWVzc2FnZUFubm90YXRpb24nIH07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkbmFtZSA9IDEgWyhmaWVsZG9wdCkgPSB7IHM6J0ZpZWxkQW5ub3RhdGlvbicgfV07Cit9CisKK3NlcnZpY2UgQWdncmVnYXRlU2VydmljZSB7CisgIG9wdGlvbiAoc2VydmljZW9wdCkgPSB7IHM6J1NlcnZpY2VBbm5vdGF0aW9uJyB9OworICBycGMgTWV0aG9kIChBZ2dyZWdhdGVNZXNzYWdlKSByZXR1cm5zIChBZ2dyZWdhdGVNZXNzYWdlKSB7CisgICAgb3B0aW9uIChtZXRob2RvcHQpID0geyBzOidNZXRob2RBbm5vdGF0aW9uJyB9OworICB9Cit9CisKK2VudW0gQWdncmVnYXRlRW51bSB7CisgIG9wdGlvbiAoZW51bW9wdF9yZW5hbWVkKSA9IHsgczonRW51bUFubm90YXRpb24nIH07CisgIFZBTFVFID0gMSBbKGVudW12YWxvcHQpID0geyBzOidFbnVtVmFsdWVBbm5vdGF0aW9uJyB9XTsKK30KZGlmZiAtLWdpdCBhL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90byBiL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI1NTM4Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnByb3RvCkBAIC0wLDAgKzEsNTYgQEAKKy8vIEFkZGl0aW9uYWwgb3B0aW9ucyByZXF1aXJlZCBmb3IgQyMgZ2VuZXJhdGlvbi4gRmlsZSBmcm9tIGNvcHlyaWdodAorLy8gbGluZSBvbndhcmRzIGlzIGFzIHBlciBvcmlnaW5hbCBkaXN0cmlidXRpb24uCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byI7CitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS5uYW1lc3BhY2UgPSAiR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zIjsKK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLnVtYnJlbGxhX2NsYXNzbmFtZSA9ICJVbml0VGVzdEVtYmVkT3B0aW1pemVGb3JQcm90b0ZpbGUiOworCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBBIHByb3RvIGZpbGUgd2hpY2ggaW1wb3J0cyBhIHByb3RvIGZpbGUgdGhhdCB1c2VzIG9wdGltaXplX2ZvciA9IENPREVfU0laRS4KKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3RvIjsKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworLy8gV2Ugb3B0aW1pemUgZm9yIHNwZWVkIGhlcmUsIGJ1dCB3ZSBhcmUgaW1wb3J0aW5nIGEgcHJvdG8gdGhhdCBpcyBvcHRpbWl6ZWQKKy8vIGZvciBjb2RlIHNpemUuCitvcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7CisKK21lc3NhZ2UgVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSB7CisgIC8vIFRlc3QgdGhhdCBlbWJlZGRpbmcgYSBtZXNzYWdlIHdoaWNoIGhhcyBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkUgaW50bworICAvLyBvbmUgb3B0aW1pemVkIGZvciBzcGVlZCB3b3Jrcy4KKyAgb3B0aW9uYWwgVGVzdE9wdGltaXplZEZvclNpemUgb3B0aW9uYWxfbWVzc2FnZSA9IDE7CisgIHJlcGVhdGVkIFRlc3RPcHRpbWl6ZWRGb3JTaXplIHJlcGVhdGVkX21lc3NhZ2UgPSAyOworfQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucHJvdG8gYi9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmI1MzJhCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucHJvdG8KQEAgLTAsMCArMSw0MyBAQAorLy8gQWRkaXRpb25hbCBvcHRpb25zIHJlcXVpcmVkIGZvciBDIyBnZW5lcmF0aW9uLiBGaWxlIGZyb20gY29weXJpZ2h0CisvLyBsaW5lIG9ud2FyZHMgaXMgYXMgcGVyIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbi4KK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIjsKK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLm5hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MiOworb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykudW1icmVsbGFfY2xhc3NuYW1lID0gIlVuaXRUZXN0RW1wdHlQcm90b0ZpbGUiOworCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLiAgKEF0IG9uZSBwb2ludCB0aGlzIHdvdWxkbid0IGNvbXBpbGUKKy8vIGNvcnJlY3RseS4pCisKZGlmZiAtLWdpdCBhL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucHJvdG8gYi9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOTc3NzgKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnByb3RvCkBAIC0wLDAgKzEsMTA1MiBAQAorLy8gQWRkaXRpb25hbCBvcHRpb25zIHJlcXVpcmVkIGZvciBDIyBnZW5lcmF0aW9uLiBGaWxlIGZyb20gY29weXJpZ2h0CisvLyBsaW5lIG9ud2FyZHMgaXMgYXMgcGVyIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbi4KK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIjsKK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLm5hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MiOworb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykudW1icmVsbGFfY2xhc3NuYW1lID0gIlVuaXRUZXN0RW5vcm1vdXNEZXNjcmlwdG9yUHJvdG9GaWxlIjsKKworLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gQSBwcm90byBmaWxlIHRoYXQgaGFzIGFuIGV4dHJlbWVseSBsYXJnZSBkZXNjcmlwdG9yLiAgVXNlZCB0byB0ZXN0IHRoYXQKKy8vIGRlc2NyaXB0b3JzIG92ZXIgNjRrIGRvbid0IGJyZWFrIHRoZSBzdHJpbmcgbGl0ZXJhbCBsZW5ndGggbGltaXQgaW4gSmF2YS4KKworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1ZjsKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CisKKy8vIEF2b2lkIGdlbmVyYXRpbmcgaW5zYW5lbHkgbG9uZyBtZXRob2RzLgorb3B0aW9uIG9wdGltaXplX2ZvciA9IENPREVfU0laRTsKKworbWVzc2FnZSBUZXN0RW5vcm1vdXNEZXNjcmlwdG9yIHsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEgPSAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yID0gMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMyA9IDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQgPSA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ID0gNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNiA9IDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcgPSA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ID0gOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOSA9IDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwID0gMTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExID0gMTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyID0gMTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzID0gMTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0ID0gMTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1ID0gMTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2ID0gMTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3ID0gMTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4ID0gMTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5ID0gMTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwID0gMjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxID0gMjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyID0gMjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzID0gMjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0ID0gMjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1ID0gMjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2ID0gMjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3ID0gMjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4ID0gMjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5ID0gMjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwID0gMzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxID0gMzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyID0gMzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzID0gMzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0ID0gMzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1ID0gMzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2ID0gMzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3ID0gMzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4ID0gMzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5ID0gMzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwID0gNDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxID0gNDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyID0gNDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzID0gNDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0ID0gNDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1ID0gNDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2ID0gNDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3ID0gNDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4ID0gNDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5ID0gNDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwID0gNTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxID0gNTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyID0gNTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzID0gNTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0ID0gNTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1ID0gNTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2ID0gNTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3ID0gNTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4ID0gNTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5ID0gNTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwID0gNjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxID0gNjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyID0gNjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzID0gNjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0ID0gNjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1ID0gNjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2ID0gNjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3ID0gNjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4ID0gNjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5ID0gNjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwID0gNzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxID0gNzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyID0gNzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczID0gNzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0ID0gNzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1ID0gNzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2ID0gNzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3ID0gNzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4ID0gNzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5ID0gNzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwID0gODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxID0gODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyID0gODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzID0gODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0ID0gODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1ID0gODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2ID0gODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3ID0gODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4ID0gODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5ID0gODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwID0gOTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxID0gOTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyID0gOTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzID0gOTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0ID0gOTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1ID0gOTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2ID0gOTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3ID0gOTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4ID0gOTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5ID0gOTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwMCA9IDEwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTAxID0gMTAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDIgPSAxMDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwMyA9IDEwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTA0ID0gMTA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDUgPSAxMDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwNiA9IDEwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTA3ID0gMTA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDggPSAxMDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwOSA9IDEwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTEwID0gMTEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTEgPSAxMTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExMiA9IDExMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTEzID0gMTEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTQgPSAxMTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExNSA9IDExNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTE2ID0gMTE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTcgPSAxMTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExOCA9IDExOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTE5ID0gMTE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjAgPSAxMjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyMSA9IDEyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTIyID0gMTIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjMgPSAxMjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyNCA9IDEyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTI1ID0gMTI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjYgPSAxMjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyNyA9IDEyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTI4ID0gMTI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjkgPSAxMjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzMCA9IDEzMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTMxID0gMTMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzIgPSAxMzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzMyA9IDEzMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTM0ID0gMTM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzUgPSAxMzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzNiA9IDEzNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTM3ID0gMTM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzggPSAxMzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzOSA9IDEzOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQwID0gMTQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDEgPSAxNDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0MiA9IDE0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQzID0gMTQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDQgPSAxNDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0NSA9IDE0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQ2ID0gMTQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDcgPSAxNDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0OCA9IDE0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQ5ID0gMTQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTAgPSAxNTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1MSA9IDE1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTUyID0gMTUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTMgPSAxNTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1NCA9IDE1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTU1ID0gMTU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTYgPSAxNTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1NyA9IDE1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTU4ID0gMTU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTkgPSAxNTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2MCA9IDE2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTYxID0gMTYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjIgPSAxNjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2MyA9IDE2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTY0ID0gMTY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjUgPSAxNjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2NiA9IDE2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTY3ID0gMTY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjggPSAxNjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2OSA9IDE2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTcwID0gMTcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzEgPSAxNzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3MiA9IDE3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTczID0gMTczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzQgPSAxNzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3NSA9IDE3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTc2ID0gMTc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzcgPSAxNzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3OCA9IDE3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTc5ID0gMTc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODAgPSAxODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4MSA9IDE4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTgyID0gMTgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODMgPSAxODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4NCA9IDE4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTg1ID0gMTg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODYgPSAxODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4NyA9IDE4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTg4ID0gMTg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODkgPSAxODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5MCA9IDE5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTkxID0gMTkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTIgPSAxOTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5MyA9IDE5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTk0ID0gMTk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTUgPSAxOTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5NiA9IDE5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTk3ID0gMTk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTggPSAxOTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5OSA9IDE5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjAwID0gMjAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDEgPSAyMDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwMiA9IDIwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjAzID0gMjAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDQgPSAyMDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwNSA9IDIwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjA2ID0gMjA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDcgPSAyMDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwOCA9IDIwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjA5ID0gMjA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTAgPSAyMTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxMSA9IDIxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjEyID0gMjEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTMgPSAyMTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxNCA9IDIxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjE1ID0gMjE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTYgPSAyMTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxNyA9IDIxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjE4ID0gMjE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTkgPSAyMTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyMCA9IDIyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjIxID0gMjIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjIgPSAyMjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyMyA9IDIyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjI0ID0gMjI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjUgPSAyMjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyNiA9IDIyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjI3ID0gMjI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjggPSAyMjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyOSA9IDIyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjMwID0gMjMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzEgPSAyMzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzMiA9IDIzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjMzID0gMjMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzQgPSAyMzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzNSA9IDIzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjM2ID0gMjM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzcgPSAyMzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzOCA9IDIzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjM5ID0gMjM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDAgPSAyNDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0MSA9IDI0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQyID0gMjQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDMgPSAyNDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0NCA9IDI0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQ1ID0gMjQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDYgPSAyNDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0NyA9IDI0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQ4ID0gMjQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDkgPSAyNDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1MCA9IDI1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjUxID0gMjUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTIgPSAyNTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1MyA9IDI1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjU0ID0gMjU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTUgPSAyNTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1NiA9IDI1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjU3ID0gMjU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTggPSAyNTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1OSA9IDI1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjYwID0gMjYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjEgPSAyNjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2MiA9IDI2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjYzID0gMjYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjQgPSAyNjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2NSA9IDI2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjY2ID0gMjY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjcgPSAyNjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2OCA9IDI2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjY5ID0gMjY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzAgPSAyNzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3MSA9IDI3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjcyID0gMjcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzMgPSAyNzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3NCA9IDI3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjc1ID0gMjc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzYgPSAyNzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3NyA9IDI3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjc4ID0gMjc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzkgPSAyNzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4MCA9IDI4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjgxID0gMjgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODIgPSAyODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4MyA9IDI4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjg0ID0gMjg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODUgPSAyODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4NiA9IDI4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjg3ID0gMjg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODggPSAyODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4OSA9IDI4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjkwID0gMjkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTEgPSAyOTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5MiA9IDI5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjkzID0gMjkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTQgPSAyOTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5NSA9IDI5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjk2ID0gMjk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTcgPSAyOTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5OCA9IDI5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjk5ID0gMjk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDAgPSAzMDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwMSA9IDMwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzAyID0gMzAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDMgPSAzMDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwNCA9IDMwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzA1ID0gMzA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDYgPSAzMDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwNyA9IDMwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzA4ID0gMzA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDkgPSAzMDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxMCA9IDMxMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzExID0gMzExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTIgPSAzMTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxMyA9IDMxMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzE0ID0gMzE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTUgPSAzMTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxNiA9IDMxNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzE3ID0gMzE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTggPSAzMTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxOSA9IDMxOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzIwID0gMzIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjEgPSAzMjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyMiA9IDMyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzIzID0gMzIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjQgPSAzMjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyNSA9IDMyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzI2ID0gMzI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjcgPSAzMjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyOCA9IDMyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzI5ID0gMzI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzAgPSAzMzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzMSA9IDMzMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzMyID0gMzMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzMgPSAzMzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzNCA9IDMzNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzM1ID0gMzM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzYgPSAzMzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzNyA9IDMzNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzM4ID0gMzM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzkgPSAzMzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0MCA9IDM0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQxID0gMzQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDIgPSAzNDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0MyA9IDM0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQ0ID0gMzQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDUgPSAzNDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0NiA9IDM0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQ3ID0gMzQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDggPSAzNDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0OSA9IDM0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzUwID0gMzUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTEgPSAzNTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1MiA9IDM1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzUzID0gMzUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTQgPSAzNTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1NSA9IDM1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzU2ID0gMzU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTcgPSAzNTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1OCA9IDM1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzU5ID0gMzU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjAgPSAzNjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2MSA9IDM2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzYyID0gMzYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjMgPSAzNjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2NCA9IDM2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzY1ID0gMzY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjYgPSAzNjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2NyA9IDM2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzY4ID0gMzY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjkgPSAzNjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3MCA9IDM3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzcxID0gMzcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzIgPSAzNzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3MyA9IDM3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzc0ID0gMzc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzUgPSAzNzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3NiA9IDM3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzc3ID0gMzc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzggPSAzNzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3OSA9IDM3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzgwID0gMzgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODEgPSAzODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4MiA9IDM4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzgzID0gMzgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODQgPSAzODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4NSA9IDM4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzg2ID0gMzg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODcgPSAzODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4OCA9IDM4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzg5ID0gMzg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTAgPSAzOTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5MSA9IDM5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzkyID0gMzkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTMgPSAzOTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5NCA9IDM5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzk1ID0gMzk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTYgPSAzOTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5NyA9IDM5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzk4ID0gMzk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTkgPSAzOTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwMCA9IDQwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDAxID0gNDAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDIgPSA0MDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwMyA9IDQwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDA0ID0gNDA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDUgPSA0MDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwNiA9IDQwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDA3ID0gNDA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDggPSA0MDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwOSA9IDQwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDEwID0gNDEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTEgPSA0MTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxMiA9IDQxMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDEzID0gNDEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTQgPSA0MTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxNSA9IDQxNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDE2ID0gNDE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTcgPSA0MTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxOCA9IDQxOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDE5ID0gNDE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjAgPSA0MjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyMSA9IDQyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDIyID0gNDIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjMgPSA0MjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyNCA9IDQyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDI1ID0gNDI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjYgPSA0MjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyNyA9IDQyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDI4ID0gNDI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjkgPSA0MjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzMCA9IDQzMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDMxID0gNDMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzIgPSA0MzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzMyA9IDQzMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDM0ID0gNDM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzUgPSA0MzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzNiA9IDQzNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDM3ID0gNDM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzggPSA0MzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzOSA9IDQzOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQwID0gNDQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDEgPSA0NDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0MiA9IDQ0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQzID0gNDQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDQgPSA0NDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0NSA9IDQ0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQ2ID0gNDQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDcgPSA0NDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0OCA9IDQ0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQ5ID0gNDQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTAgPSA0NTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1MSA9IDQ1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDUyID0gNDUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTMgPSA0NTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1NCA9IDQ1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDU1ID0gNDU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTYgPSA0NTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1NyA9IDQ1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDU4ID0gNDU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTkgPSA0NTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2MCA9IDQ2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDYxID0gNDYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjIgPSA0NjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2MyA9IDQ2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDY0ID0gNDY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjUgPSA0NjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2NiA9IDQ2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDY3ID0gNDY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjggPSA0NjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2OSA9IDQ2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDcwID0gNDcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzEgPSA0NzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3MiA9IDQ3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDczID0gNDczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzQgPSA0NzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3NSA9IDQ3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDc2ID0gNDc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzcgPSA0NzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3OCA9IDQ3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDc5ID0gNDc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODAgPSA0ODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4MSA9IDQ4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDgyID0gNDgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODMgPSA0ODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4NCA9IDQ4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDg1ID0gNDg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODYgPSA0ODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4NyA9IDQ4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDg4ID0gNDg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODkgPSA0ODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5MCA9IDQ5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDkxID0gNDkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTIgPSA0OTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5MyA9IDQ5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDk0ID0gNDk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTUgPSA0OTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5NiA9IDQ5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDk3ID0gNDk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTggPSA0OTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5OSA9IDQ5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTAwID0gNTAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDEgPSA1MDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwMiA9IDUwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTAzID0gNTAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDQgPSA1MDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwNSA9IDUwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTA2ID0gNTA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDcgPSA1MDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwOCA9IDUwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTA5ID0gNTA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTAgPSA1MTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxMSA9IDUxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTEyID0gNTEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTMgPSA1MTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxNCA9IDUxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTE1ID0gNTE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTYgPSA1MTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxNyA9IDUxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTE4ID0gNTE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTkgPSA1MTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyMCA9IDUyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTIxID0gNTIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjIgPSA1MjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyMyA9IDUyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTI0ID0gNTI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjUgPSA1MjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyNiA9IDUyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTI3ID0gNTI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjggPSA1MjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyOSA9IDUyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTMwID0gNTMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzEgPSA1MzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzMiA9IDUzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTMzID0gNTMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzQgPSA1MzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzNSA9IDUzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTM2ID0gNTM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzcgPSA1MzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzOCA9IDUzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTM5ID0gNTM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDAgPSA1NDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0MSA9IDU0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQyID0gNTQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDMgPSA1NDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0NCA9IDU0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQ1ID0gNTQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDYgPSA1NDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0NyA9IDU0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQ4ID0gNTQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDkgPSA1NDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1MCA9IDU1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTUxID0gNTUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTIgPSA1NTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1MyA9IDU1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTU0ID0gNTU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTUgPSA1NTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1NiA9IDU1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTU3ID0gNTU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTggPSA1NTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1OSA9IDU1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTYwID0gNTYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjEgPSA1NjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2MiA9IDU2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTYzID0gNTYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjQgPSA1NjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2NSA9IDU2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTY2ID0gNTY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjcgPSA1NjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2OCA9IDU2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTY5ID0gNTY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzAgPSA1NzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3MSA9IDU3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTcyID0gNTcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzMgPSA1NzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3NCA9IDU3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTc1ID0gNTc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzYgPSA1NzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3NyA9IDU3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTc4ID0gNTc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzkgPSA1NzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4MCA9IDU4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTgxID0gNTgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODIgPSA1ODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4MyA9IDU4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTg0ID0gNTg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODUgPSA1ODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4NiA9IDU4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTg3ID0gNTg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODggPSA1ODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4OSA9IDU4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTkwID0gNTkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTEgPSA1OTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5MiA9IDU5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTkzID0gNTkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTQgPSA1OTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5NSA9IDU5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTk2ID0gNTk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTcgPSA1OTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5OCA9IDU5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTk5ID0gNTk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDAgPSA2MDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwMSA9IDYwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjAyID0gNjAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDMgPSA2MDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwNCA9IDYwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjA1ID0gNjA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDYgPSA2MDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwNyA9IDYwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjA4ID0gNjA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDkgPSA2MDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxMCA9IDYxMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjExID0gNjExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTIgPSA2MTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxMyA9IDYxMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjE0ID0gNjE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTUgPSA2MTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxNiA9IDYxNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjE3ID0gNjE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTggPSA2MTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxOSA9IDYxOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjIwID0gNjIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjEgPSA2MjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyMiA9IDYyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjIzID0gNjIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjQgPSA2MjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyNSA9IDYyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjI2ID0gNjI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjcgPSA2MjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyOCA9IDYyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjI5ID0gNjI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzAgPSA2MzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzMSA9IDYzMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjMyID0gNjMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzMgPSA2MzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzNCA9IDYzNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjM1ID0gNjM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzYgPSA2MzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzNyA9IDYzNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjM4ID0gNjM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzkgPSA2MzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0MCA9IDY0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQxID0gNjQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDIgPSA2NDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0MyA9IDY0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQ0ID0gNjQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDUgPSA2NDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0NiA9IDY0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQ3ID0gNjQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDggPSA2NDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0OSA9IDY0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjUwID0gNjUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTEgPSA2NTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1MiA9IDY1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjUzID0gNjUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTQgPSA2NTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1NSA9IDY1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjU2ID0gNjU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTcgPSA2NTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1OCA9IDY1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjU5ID0gNjU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjAgPSA2NjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2MSA9IDY2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjYyID0gNjYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjMgPSA2NjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2NCA9IDY2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjY1ID0gNjY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjYgPSA2NjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2NyA9IDY2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjY4ID0gNjY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjkgPSA2NjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3MCA9IDY3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjcxID0gNjcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzIgPSA2NzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3MyA9IDY3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjc0ID0gNjc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzUgPSA2NzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3NiA9IDY3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjc3ID0gNjc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzggPSA2NzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3OSA9IDY3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjgwID0gNjgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODEgPSA2ODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4MiA9IDY4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjgzID0gNjgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODQgPSA2ODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4NSA9IDY4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjg2ID0gNjg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODcgPSA2ODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4OCA9IDY4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjg5ID0gNjg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTAgPSA2OTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5MSA9IDY5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjkyID0gNjkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTMgPSA2OTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5NCA9IDY5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjk1ID0gNjk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTYgPSA2OTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5NyA9IDY5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjk4ID0gNjk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTkgPSA2OTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwMCA9IDcwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzAxID0gNzAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDIgPSA3MDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwMyA9IDcwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzA0ID0gNzA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDUgPSA3MDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwNiA9IDcwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzA3ID0gNzA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDggPSA3MDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwOSA9IDcwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzEwID0gNzEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTEgPSA3MTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxMiA9IDcxMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzEzID0gNzEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTQgPSA3MTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxNSA9IDcxNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzE2ID0gNzE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTcgPSA3MTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxOCA9IDcxOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzE5ID0gNzE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjAgPSA3MjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyMSA9IDcyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzIyID0gNzIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjMgPSA3MjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyNCA9IDcyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzI1ID0gNzI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjYgPSA3MjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyNyA9IDcyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzI4ID0gNzI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjkgPSA3MjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczMCA9IDczMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzMxID0gNzMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzIgPSA3MzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczMyA9IDczMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzM0ID0gNzM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzUgPSA3MzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczNiA9IDczNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzM3ID0gNzM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzggPSA3MzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczOSA9IDczOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQwID0gNzQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDEgPSA3NDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0MiA9IDc0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQzID0gNzQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDQgPSA3NDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0NSA9IDc0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQ2ID0gNzQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDcgPSA3NDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0OCA9IDc0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQ5ID0gNzQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTAgPSA3NTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1MSA9IDc1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzUyID0gNzUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTMgPSA3NTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1NCA9IDc1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzU1ID0gNzU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTYgPSA3NTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1NyA9IDc1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzU4ID0gNzU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTkgPSA3NTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2MCA9IDc2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzYxID0gNzYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjIgPSA3NjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2MyA9IDc2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzY0ID0gNzY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjUgPSA3NjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2NiA9IDc2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzY3ID0gNzY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjggPSA3NjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2OSA9IDc2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzcwID0gNzcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzEgPSA3NzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3MiA9IDc3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzczID0gNzczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzQgPSA3NzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3NSA9IDc3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzc2ID0gNzc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzcgPSA3NzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3OCA9IDc3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzc5ID0gNzc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODAgPSA3ODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4MSA9IDc4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzgyID0gNzgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODMgPSA3ODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4NCA9IDc4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzg1ID0gNzg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODYgPSA3ODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4NyA9IDc4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzg4ID0gNzg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODkgPSA3ODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5MCA9IDc5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzkxID0gNzkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTIgPSA3OTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5MyA9IDc5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzk0ID0gNzk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTUgPSA3OTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5NiA9IDc5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzk3ID0gNzk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTggPSA3OTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5OSA9IDc5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODAwID0gODAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDEgPSA4MDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwMiA9IDgwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODAzID0gODAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDQgPSA4MDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwNSA9IDgwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODA2ID0gODA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDcgPSA4MDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwOCA9IDgwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODA5ID0gODA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTAgPSA4MTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxMSA9IDgxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODEyID0gODEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTMgPSA4MTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxNCA9IDgxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODE1ID0gODE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTYgPSA4MTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxNyA9IDgxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODE4ID0gODE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTkgPSA4MTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyMCA9IDgyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODIxID0gODIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjIgPSA4MjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyMyA9IDgyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODI0ID0gODI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjUgPSA4MjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyNiA9IDgyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODI3ID0gODI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjggPSA4MjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyOSA9IDgyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODMwID0gODMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzEgPSA4MzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzMiA9IDgzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODMzID0gODMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzQgPSA4MzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzNSA9IDgzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODM2ID0gODM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzcgPSA4MzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzOCA9IDgzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODM5ID0gODM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDAgPSA4NDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0MSA9IDg0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQyID0gODQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDMgPSA4NDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0NCA9IDg0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQ1ID0gODQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDYgPSA4NDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0NyA9IDg0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQ4ID0gODQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDkgPSA4NDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1MCA9IDg1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODUxID0gODUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTIgPSA4NTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1MyA9IDg1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODU0ID0gODU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTUgPSA4NTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1NiA9IDg1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODU3ID0gODU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTggPSA4NTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1OSA9IDg1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODYwID0gODYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjEgPSA4NjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2MiA9IDg2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODYzID0gODYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjQgPSA4NjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2NSA9IDg2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODY2ID0gODY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjcgPSA4NjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2OCA9IDg2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODY5ID0gODY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzAgPSA4NzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3MSA9IDg3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODcyID0gODcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzMgPSA4NzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3NCA9IDg3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODc1ID0gODc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzYgPSA4NzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3NyA9IDg3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODc4ID0gODc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzkgPSA4NzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4MCA9IDg4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODgxID0gODgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODIgPSA4ODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4MyA9IDg4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODg0ID0gODg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODUgPSA4ODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4NiA9IDg4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODg3ID0gODg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODggPSA4ODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4OSA9IDg4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODkwID0gODkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTEgPSA4OTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5MiA9IDg5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODkzID0gODkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTQgPSA4OTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5NSA9IDg5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODk2ID0gODk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTcgPSA4OTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5OCA9IDg5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODk5ID0gODk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDAgPSA5MDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwMSA9IDkwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTAyID0gOTAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDMgPSA5MDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwNCA9IDkwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTA1ID0gOTA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDYgPSA5MDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwNyA9IDkwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTA4ID0gOTA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDkgPSA5MDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxMCA9IDkxMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTExID0gOTExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTIgPSA5MTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxMyA9IDkxMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTE0ID0gOTE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTUgPSA5MTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxNiA9IDkxNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTE3ID0gOTE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTggPSA5MTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxOSA9IDkxOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTIwID0gOTIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjEgPSA5MjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyMiA9IDkyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTIzID0gOTIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjQgPSA5MjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyNSA9IDkyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTI2ID0gOTI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjcgPSA5MjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyOCA9IDkyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTI5ID0gOTI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzAgPSA5MzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzMSA9IDkzMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTMyID0gOTMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzMgPSA5MzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzNCA9IDkzNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTM1ID0gOTM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzYgPSA5MzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzNyA9IDkzNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTM4ID0gOTM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzkgPSA5MzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0MCA9IDk0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQxID0gOTQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDIgPSA5NDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0MyA9IDk0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQ0ID0gOTQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDUgPSA5NDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0NiA9IDk0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQ3ID0gOTQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDggPSA5NDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0OSA9IDk0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTUwID0gOTUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTEgPSA5NTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1MiA9IDk1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTUzID0gOTUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTQgPSA5NTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1NSA9IDk1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTU2ID0gOTU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTcgPSA5NTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1OCA9IDk1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTU5ID0gOTU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjAgPSA5NjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2MSA9IDk2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTYyID0gOTYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjMgPSA5NjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2NCA9IDk2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTY1ID0gOTY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjYgPSA5NjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2NyA9IDk2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTY4ID0gOTY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjkgPSA5NjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3MCA9IDk3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTcxID0gOTcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzIgPSA5NzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3MyA9IDk3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTc0ID0gOTc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzUgPSA5NzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3NiA9IDk3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTc3ID0gOTc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzggPSA5NzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3OSA9IDk3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTgwID0gOTgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODEgPSA5ODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4MiA9IDk4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTgzID0gOTgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODQgPSA5ODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4NSA9IDk4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTg2ID0gOTg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODcgPSA5ODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4OCA9IDk4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTg5ID0gOTg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTAgPSA5OTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5MSA9IDk5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTkyID0gOTkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTMgPSA5OTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5NCA9IDk5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTk1ID0gOTk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTYgPSA5OTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5NyA9IDk5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTk4ID0gOTk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTkgPSA5OTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwMDAgPSAxMDAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Cit9CmRpZmYgLS1naXQgYS9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8gYi9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2OGM4NgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90bwpAQCAtMCwwICsxLDY3IEBACisvLyBBZGRpdGlvbmFsIG9wdGlvbnMgcmVxdWlyZWQgZm9yIEMjIGdlbmVyYXRpb24uIEZpbGUgZnJvbSBjb3B5cmlnaHQKKy8vIGxpbmUgb253YXJkcyBpcyBhcyBwZXIgb3JpZ2luYWwgZGlzdHJpYnV0aW9uLgoraW1wb3J0ICJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iOworb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykubmFtZXNwYWNlID0gIkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcyI7CitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS51bWJyZWxsYV9jbGFzc25hbWUgPSAiVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUiOworCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBBIHByb3RvIGZpbGUgd2hpY2ggaXMgaW1wb3J0ZWQgYnkgdW5pdHRlc3QucHJvdG8gdG8gdGVzdCBpbXBvcnRpbmcuCisKKworLy8gV2UgZG9uJ3QgcHV0IHRoaXMgaW4gYSBwYWNrYWdlIHdpdGhpbiBwcm90bzIgYmVjYXVzZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorLy8gdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgZG9lc24ndCBkZXBlbmQgb24gYmVpbmcgaW4gdGhlIHByb3RvMiBuYW1lc3BhY2UuCisvLyBJbiB0ZXN0X3V0aWwuaCB3ZSBkbworLy8gInVzaW5nIG5hbWVzcGFjZSB1bml0dGVzdF9pbXBvcnQgPSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQiLgorcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKKworLy8gRXhjZXJjaXNlIHRoZSBqYXZhX3BhY2thZ2Ugb3B0aW9uLgorb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3QiOworCisvLyBEbyBub3Qgc2V0IGEgamF2YV9vdXRlcl9jbGFzc25hbWUgaGVyZSB0byB2ZXJpZnkgdGhhdCBQcm90bzIgd29ya3Mgd2l0aG91dAorLy8gb25lLgorCittZXNzYWdlIEltcG9ydE1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiBkID0gMTsKK30KKworZW51bSBJbXBvcnRFbnVtIHsKKyAgSU1QT1JUX0ZPTyA9IDc7CisgIElNUE9SVF9CQVIgPSA4OworICBJTVBPUlRfQkFaID0gOTsKK30KKwpkaWZmIC0tZ2l0IGEvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8gYi9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODc1NWQwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8KQEAgLTAsMCArMSw1NSBAQAorLy8gQWRkaXRpb25hbCBvcHRpb25zIHJlcXVpcmVkIGZvciBDIyBnZW5lcmF0aW9uLiBGaWxlIGZyb20gY29weXJpZ2h0CisvLyBsaW5lIG9ud2FyZHMgaXMgYXMgcGVyIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbi4KK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIjsKK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLm5hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MiOworb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykudW1icmVsbGFfY2xhc3NuYW1lID0gIlVuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZSI7CisKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vCisvLyBUaGlzIGlzIGxpa2UgdW5pdHRlc3RfaW1wb3J0LnByb3RvIGJ1dCB3aXRoIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRS4KKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CisKK21lc3NhZ2UgSW1wb3J0TWVzc2FnZUxpdGUgeworICBvcHRpb25hbCBpbnQzMiBkID0gMTsKK30KKworZW51bSBJbXBvcnRFbnVtTGl0ZSB7CisgIElNUE9SVF9MSVRFX0ZPTyA9IDc7CisgIElNUE9SVF9MSVRFX0JBUiA9IDg7CisgIElNUE9SVF9MSVRFX0JBWiA9IDk7Cit9CmRpZmYgLS1naXQgYS9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnByb3RvIGIvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjNmYTFkCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90bwpAQCAtMCwwICsxLDMxOCBAQAorLy8gQWRkaXRpb25hbCBvcHRpb25zIHJlcXVpcmVkIGZvciBDIyBnZW5lcmF0aW9uLiBGaWxlIGZyb20gY29weXJpZ2h0CisvLyBsaW5lIG9ud2FyZHMgaXMgYXMgcGVyIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbi4KK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIjsKK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLm5hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MiOworb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykudW1icmVsbGFfY2xhc3NuYW1lID0gIlVuaXRUZXN0TGl0ZVByb3RvRmlsZSI7CisKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vCisvLyBUaGlzIGlzIGxpa2UgdW5pdHRlc3QucHJvdG8gYnV0IHdpdGggb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FLgorCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wcm90byI7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CisKKy8vIFNhbWUgYXMgVGVzdEFsbFR5cGVzIGJ1dCB3aXRoIHRoZSBsaXRlIHJ1bnRpbWUuCittZXNzYWdlIFRlc3RBbGxUeXBlc0xpdGUgeworICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICAgIG9wdGlvbmFsIGludDMyIGJiID0gMTsKKyAgfQorCisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgRk9PID0gMTsKKyAgICBCQVIgPSAyOworICAgIEJBWiA9IDM7CisgIH0KKworICAvLyBTaW5ndWxhcgorICBvcHRpb25hbCAgICBpbnQzMiBvcHRpb25hbF9pbnQzMiAgICA9ICAxOworICBvcHRpb25hbCAgICBpbnQ2NCBvcHRpb25hbF9pbnQ2NCAgICA9ICAyOworICBvcHRpb25hbCAgIHVpbnQzMiBvcHRpb25hbF91aW50MzIgICA9ICAzOworICBvcHRpb25hbCAgIHVpbnQ2NCBvcHRpb25hbF91aW50NjQgICA9ICA0OworICBvcHRpb25hbCAgIHNpbnQzMiBvcHRpb25hbF9zaW50MzIgICA9ICA1OworICBvcHRpb25hbCAgIHNpbnQ2NCBvcHRpb25hbF9zaW50NjQgICA9ICA2OworICBvcHRpb25hbCAgZml4ZWQzMiBvcHRpb25hbF9maXhlZDMyICA9ICA3OworICBvcHRpb25hbCAgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0ICA9ICA4OworICBvcHRpb25hbCBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMiA9ICA5OworICBvcHRpb25hbCBzZml4ZWQ2NCBvcHRpb25hbF9zZml4ZWQ2NCA9IDEwOworICBvcHRpb25hbCAgICBmbG9hdCBvcHRpb25hbF9mbG9hdCAgICA9IDExOworICBvcHRpb25hbCAgIGRvdWJsZSBvcHRpb25hbF9kb3VibGUgICA9IDEyOworICBvcHRpb25hbCAgICAgYm9vbCBvcHRpb25hbF9ib29sICAgICA9IDEzOworICBvcHRpb25hbCAgIHN0cmluZyBvcHRpb25hbF9zdHJpbmcgICA9IDE0OworICBvcHRpb25hbCAgICBieXRlcyBvcHRpb25hbF9ieXRlcyAgICA9IDE1OworCisgIG9wdGlvbmFsIGdyb3VwIE9wdGlvbmFsR3JvdXAgPSAxNiB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDE3OworICB9CisKKyAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSAgICAgIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlICA9IDE4OworICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZUxpdGUgb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlID0gMTk7CisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlTGl0ZQorICAgIG9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlID0gMjA7CisKKyAgb3B0aW9uYWwgTmVzdGVkRW51bSAgICAgIG9wdGlvbmFsX25lc3RlZF9lbnVtICAgICA9IDIxOworICBvcHRpb25hbCBGb3JlaWduRW51bUxpdGUgb3B0aW9uYWxfZm9yZWlnbl9lbnVtICAgID0gMjI7CisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtTGl0ZSBvcHRpb25hbF9pbXBvcnRfZW51bSA9IDIzOworCisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9zdHJpbmdfcGllY2UgPSAyNCBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX2NvcmQgPSAyNSBbY3R5cGU9Q09SRF07CisKKyAgLy8gUmVwZWF0ZWQKKyAgcmVwZWF0ZWQgICAgaW50MzIgcmVwZWF0ZWRfaW50MzIgICAgPSAzMTsKKyAgcmVwZWF0ZWQgICAgaW50NjQgcmVwZWF0ZWRfaW50NjQgICAgPSAzMjsKKyAgcmVwZWF0ZWQgICB1aW50MzIgcmVwZWF0ZWRfdWludDMyICAgPSAzMzsKKyAgcmVwZWF0ZWQgICB1aW50NjQgcmVwZWF0ZWRfdWludDY0ICAgPSAzNDsKKyAgcmVwZWF0ZWQgICBzaW50MzIgcmVwZWF0ZWRfc2ludDMyICAgPSAzNTsKKyAgcmVwZWF0ZWQgICBzaW50NjQgcmVwZWF0ZWRfc2ludDY0ICAgPSAzNjsKKyAgcmVwZWF0ZWQgIGZpeGVkMzIgcmVwZWF0ZWRfZml4ZWQzMiAgPSAzNzsKKyAgcmVwZWF0ZWQgIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NCAgPSAzODsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcmVwZWF0ZWRfc2ZpeGVkMzIgPSAzOTsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgcmVwZWF0ZWRfc2ZpeGVkNjQgPSA0MDsKKyAgcmVwZWF0ZWQgICAgZmxvYXQgcmVwZWF0ZWRfZmxvYXQgICAgPSA0MTsKKyAgcmVwZWF0ZWQgICBkb3VibGUgcmVwZWF0ZWRfZG91YmxlICAgPSA0MjsKKyAgcmVwZWF0ZWQgICAgIGJvb2wgcmVwZWF0ZWRfYm9vbCAgICAgPSA0MzsKKyAgcmVwZWF0ZWQgICBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nICAgPSA0NDsKKyAgcmVwZWF0ZWQgICAgYnl0ZXMgcmVwZWF0ZWRfYnl0ZXMgICAgPSA0NTsKKworICByZXBlYXRlZCBncm91cCBSZXBlYXRlZEdyb3VwID0gNDYgeworICAgIG9wdGlvbmFsIGludDMyIGEgPSA0NzsKKyAgfQorCisgIHJlcGVhdGVkIE5lc3RlZE1lc3NhZ2UgICAgICByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAgPSA0ODsKKyAgcmVwZWF0ZWQgRm9yZWlnbk1lc3NhZ2VMaXRlIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSA9IDQ5OworICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZUxpdGUKKyAgICByZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSA9IDUwOworCisgIHJlcGVhdGVkIE5lc3RlZEVudW0gICAgICByZXBlYXRlZF9uZXN0ZWRfZW51bSAgPSA1MTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW1MaXRlIHJlcGVhdGVkX2ZvcmVpZ25fZW51bSA9IDUyOworICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bUxpdGUgcmVwZWF0ZWRfaW1wb3J0X2VudW0gPSA1MzsKKworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3BpZWNlID0gNTQgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9jb3JkID0gNTUgW2N0eXBlPUNPUkRdOworCisgIC8vIFNpbmd1bGFyIHdpdGggZGVmYXVsdHMKKyAgb3B0aW9uYWwgICAgaW50MzIgZGVmYXVsdF9pbnQzMiAgICA9IDYxIFtkZWZhdWx0ID0gIDQxICAgIF07CisgIG9wdGlvbmFsICAgIGludDY0IGRlZmF1bHRfaW50NjQgICAgPSA2MiBbZGVmYXVsdCA9ICA0MiAgICBdOworICBvcHRpb25hbCAgIHVpbnQzMiBkZWZhdWx0X3VpbnQzMiAgID0gNjMgW2RlZmF1bHQgPSAgNDMgICAgXTsKKyAgb3B0aW9uYWwgICB1aW50NjQgZGVmYXVsdF91aW50NjQgICA9IDY0IFtkZWZhdWx0ID0gIDQ0ICAgIF07CisgIG9wdGlvbmFsICAgc2ludDMyIGRlZmF1bHRfc2ludDMyICAgPSA2NSBbZGVmYXVsdCA9IC00NSAgICBdOworICBvcHRpb25hbCAgIHNpbnQ2NCBkZWZhdWx0X3NpbnQ2NCAgID0gNjYgW2RlZmF1bHQgPSAgNDYgICAgXTsKKyAgb3B0aW9uYWwgIGZpeGVkMzIgZGVmYXVsdF9maXhlZDMyICA9IDY3IFtkZWZhdWx0ID0gIDQ3ICAgIF07CisgIG9wdGlvbmFsICBmaXhlZDY0IGRlZmF1bHRfZml4ZWQ2NCAgPSA2OCBbZGVmYXVsdCA9ICA0OCAgICBdOworICBvcHRpb25hbCBzZml4ZWQzMiBkZWZhdWx0X3NmaXhlZDMyID0gNjkgW2RlZmF1bHQgPSAgNDkgICAgXTsKKyAgb3B0aW9uYWwgc2ZpeGVkNjQgZGVmYXVsdF9zZml4ZWQ2NCA9IDcwIFtkZWZhdWx0ID0gLTUwICAgIF07CisgIG9wdGlvbmFsICAgIGZsb2F0IGRlZmF1bHRfZmxvYXQgICAgPSA3MSBbZGVmYXVsdCA9ICA1MS41ICBdOworICBvcHRpb25hbCAgIGRvdWJsZSBkZWZhdWx0X2RvdWJsZSAgID0gNzIgW2RlZmF1bHQgPSAgNTJlMyAgXTsKKyAgb3B0aW9uYWwgICAgIGJvb2wgZGVmYXVsdF9ib29sICAgICA9IDczIFtkZWZhdWx0ID0gdHJ1ZSAgIF07CisgIG9wdGlvbmFsICAgc3RyaW5nIGRlZmF1bHRfc3RyaW5nICAgPSA3NCBbZGVmYXVsdCA9ICJoZWxsbyJdOworICBvcHRpb25hbCAgICBieXRlcyBkZWZhdWx0X2J5dGVzICAgID0gNzUgW2RlZmF1bHQgPSAid29ybGQiXTsKKworICBvcHRpb25hbCBOZXN0ZWRFbnVtIGRlZmF1bHRfbmVzdGVkX2VudW0gPSA4MSBbZGVmYXVsdCA9IEJBUl07CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtTGl0ZSBkZWZhdWx0X2ZvcmVpZ25fZW51bSA9IDgyCisgICAgICBbZGVmYXVsdCA9IEZPUkVJR05fTElURV9CQVJdOworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bUxpdGUKKyAgICAgIGRlZmF1bHRfaW1wb3J0X2VudW0gPSA4MyBbZGVmYXVsdCA9IElNUE9SVF9MSVRFX0JBUl07CisKKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nX3BpZWNlID0gODQgW2N0eXBlPVNUUklOR19QSUVDRSxkZWZhdWx0PSJhYmMiXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfY29yZCA9IDg1IFtjdHlwZT1DT1JELGRlZmF1bHQ9IjEyMyJdOworfQorCittZXNzYWdlIEZvcmVpZ25NZXNzYWdlTGl0ZSB7CisgIG9wdGlvbmFsIGludDMyIGMgPSAxOworfQorCitlbnVtIEZvcmVpZ25FbnVtTGl0ZSB7CisgIEZPUkVJR05fTElURV9GT08gPSA0OworICBGT1JFSUdOX0xJVEVfQkFSID0gNTsKKyAgRk9SRUlHTl9MSVRFX0JBWiA9IDY7Cit9CisKK21lc3NhZ2UgVGVzdFBhY2tlZFR5cGVzTGl0ZSB7CisgIHJlcGVhdGVkICAgIGludDMyIHBhY2tlZF9pbnQzMiAgICA9ICA5MCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgIGludDY0IHBhY2tlZF9pbnQ2NCAgICA9ICA5MSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgdWludDMyIHBhY2tlZF91aW50MzIgICA9ICA5MiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgdWludDY0IHBhY2tlZF91aW50NjQgICA9ICA5MyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgc2ludDMyIHBhY2tlZF9zaW50MzIgICA9ICA5NCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgc2ludDY0IHBhY2tlZF9zaW50NjQgICA9ICA5NSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICBmaXhlZDMyIHBhY2tlZF9maXhlZDMyICA9ICA5NiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICBmaXhlZDY0IHBhY2tlZF9maXhlZDY0ICA9ICA5NyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDMyIHBhY2tlZF9zZml4ZWQzMiA9ICA5OCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHBhY2tlZF9zZml4ZWQ2NCA9ICA5OSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgIGZsb2F0IHBhY2tlZF9mbG9hdCAgICA9IDEwMCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgZG91YmxlIHBhY2tlZF9kb3VibGUgICA9IDEwMSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgICBib29sIHBhY2tlZF9ib29sICAgICA9IDEwMiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtTGl0ZSBwYWNrZWRfZW51bSAgPSAxMDMgW3BhY2tlZCA9IHRydWVdOworfQorCittZXNzYWdlIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSB7CisgIGV4dGVuc2lvbnMgMSB0byBtYXg7Cit9CisKK2V4dGVuZCBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgeworICAvLyBTaW5ndWxhcgorICBvcHRpb25hbCAgICBpbnQzMiBvcHRpb25hbF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICA9ICAxOworICBvcHRpb25hbCAgICBpbnQ2NCBvcHRpb25hbF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICA9ICAyOworICBvcHRpb25hbCAgIHVpbnQzMiBvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICA9ICAzOworICBvcHRpb25hbCAgIHVpbnQ2NCBvcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICA9ICA0OworICBvcHRpb25hbCAgIHNpbnQzMiBvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICA9ICA1OworICBvcHRpb25hbCAgIHNpbnQ2NCBvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICA9ICA2OworICBvcHRpb25hbCAgZml4ZWQzMiBvcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICA9ICA3OworICBvcHRpb25hbCAgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICA9ICA4OworICBvcHRpb25hbCBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSA9ICA5OworICBvcHRpb25hbCBzZml4ZWQ2NCBvcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSA9IDEwOworICBvcHRpb25hbCAgICBmbG9hdCBvcHRpb25hbF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICA9IDExOworICBvcHRpb25hbCAgIGRvdWJsZSBvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICA9IDEyOworICBvcHRpb25hbCAgICAgYm9vbCBvcHRpb25hbF9ib29sX2V4dGVuc2lvbl9saXRlICAgICA9IDEzOworICBvcHRpb25hbCAgIHN0cmluZyBvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICA9IDE0OworICBvcHRpb25hbCAgICBieXRlcyBvcHRpb25hbF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICA9IDE1OworCisgIG9wdGlvbmFsIGdyb3VwIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUgPSAxNiB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDE3OworICB9CisKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlCisgICAgICA9IDE4OworICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZUxpdGUgb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gMTk7CisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlTGl0ZQorICAgIG9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gMjA7CisKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtIG9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlID0gMjE7CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtTGl0ZSBvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUgPSAyMjsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW1MaXRlCisgICAgb3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgPSAyMzsKKworICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl9saXRlID0gMjQKKyAgICAgIFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfY29yZF9leHRlbnNpb25fbGl0ZSA9IDI1IFtjdHlwZT1DT1JEXTsKKworICAvLyBSZXBlYXRlZAorICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICA9IDMxOworICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICA9IDMyOworICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICA9IDMzOworICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICA9IDM0OworICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICA9IDM1OworICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICA9IDM2OworICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICA9IDM3OworICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICA9IDM4OworICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSA9IDM5OworICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSA9IDQwOworICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICA9IDQxOworICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICA9IDQyOworICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICA9IDQzOworICByZXBlYXRlZCAgIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICA9IDQ0OworICByZXBlYXRlZCAgICBieXRlcyByZXBlYXRlZF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICA9IDQ1OworCisgIHJlcGVhdGVkIGdyb3VwIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUgPSA0NiB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDQ3OworICB9CisKKyAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlCisgICAgICA9IDQ4OworICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZUxpdGUgcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gNDk7CisgIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlTGl0ZQorICAgIHJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gNTA7CisKKyAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtIHJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlID0gNTE7CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtTGl0ZSByZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUgPSA1MjsKKyAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW1MaXRlCisgICAgcmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgPSA1MzsKKworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl9saXRlID0gNTQKKyAgICAgIFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfY29yZF9leHRlbnNpb25fbGl0ZSA9IDU1IFtjdHlwZT1DT1JEXTsKKworICAvLyBTaW5ndWxhciB3aXRoIGRlZmF1bHRzCisgIG9wdGlvbmFsICAgIGludDMyIGRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAgPSA2MSBbZGVmYXVsdCA9ICA0MSAgICBdOworICBvcHRpb25hbCAgICBpbnQ2NCBkZWZhdWx0X2ludDY0X2V4dGVuc2lvbl9saXRlICAgID0gNjIgW2RlZmF1bHQgPSAgNDIgICAgXTsKKyAgb3B0aW9uYWwgICB1aW50MzIgZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICA9IDYzIFtkZWZhdWx0ID0gIDQzICAgIF07CisgIG9wdGlvbmFsICAgdWludDY0IGRlZmF1bHRfdWludDY0X2V4dGVuc2lvbl9saXRlICAgPSA2NCBbZGVmYXVsdCA9ICA0NCAgICBdOworICBvcHRpb25hbCAgIHNpbnQzMiBkZWZhdWx0X3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgID0gNjUgW2RlZmF1bHQgPSAtNDUgICAgXTsKKyAgb3B0aW9uYWwgICBzaW50NjQgZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICA9IDY2IFtkZWZhdWx0ID0gIDQ2ICAgIF07CisgIG9wdGlvbmFsICBmaXhlZDMyIGRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAgPSA2NyBbZGVmYXVsdCA9ICA0NyAgICBdOworICBvcHRpb25hbCAgZml4ZWQ2NCBkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgID0gNjggW2RlZmF1bHQgPSAgNDggICAgXTsKKyAgb3B0aW9uYWwgc2ZpeGVkMzIgZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSA9IDY5IFtkZWZhdWx0ID0gIDQ5ICAgIF07CisgIG9wdGlvbmFsIHNmaXhlZDY0IGRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgPSA3MCBbZGVmYXVsdCA9IC01MCAgICBdOworICBvcHRpb25hbCAgICBmbG9hdCBkZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgID0gNzEgW2RlZmF1bHQgPSAgNTEuNSAgXTsKKyAgb3B0aW9uYWwgICBkb3VibGUgZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICA9IDcyIFtkZWZhdWx0ID0gIDUyZTMgIF07CisgIG9wdGlvbmFsICAgICBib29sIGRlZmF1bHRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAgPSA3MyBbZGVmYXVsdCA9IHRydWUgICBdOworICBvcHRpb25hbCAgIHN0cmluZyBkZWZhdWx0X3N0cmluZ19leHRlbnNpb25fbGl0ZSAgID0gNzQgW2RlZmF1bHQgPSAiaGVsbG8iXTsKKyAgb3B0aW9uYWwgICAgYnl0ZXMgZGVmYXVsdF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICA9IDc1IFtkZWZhdWx0ID0gIndvcmxkIl07CisKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtCisgICAgZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSA9IDgxIFtkZWZhdWx0ID0gQkFSXTsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW1MaXRlCisgICAgZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUgPSA4MiBbZGVmYXVsdCA9IEZPUkVJR05fTElURV9CQVJdOworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bUxpdGUKKyAgICBkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlID0gODMgW2RlZmF1bHQgPSBJTVBPUlRfTElURV9CQVJdOworCisgIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb25fbGl0ZSA9IDg0IFtjdHlwZT1TVFJJTkdfUElFQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJhYmMiXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfY29yZF9leHRlbnNpb25fbGl0ZSA9IDg1IFtjdHlwZT1DT1JELCBkZWZhdWx0PSIxMjMiXTsKK30KKworbWVzc2FnZSBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgeworICBleHRlbnNpb25zIDEgdG8gbWF4OworfQorCitleHRlbmQgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIHsKKyAgcmVwZWF0ZWQgICAgaW50MzIgcGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgID0gIDkwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgaW50NjQgcGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgID0gIDkxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICB1aW50MzIgcGFja2VkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgID0gIDkyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICB1aW50NjQgcGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgID0gIDkzIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBzaW50MzIgcGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgID0gIDk0IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBzaW50NjQgcGFja2VkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgID0gIDk1IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgIGZpeGVkMzIgcGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgID0gIDk2IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgIGZpeGVkNjQgcGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgID0gIDk3IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlID0gIDk4IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgcGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlID0gIDk5IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgZmxvYXQgcGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgID0gMTAwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBkb3VibGUgcGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgID0gMTAxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgIGJvb2wgcGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgID0gMTAyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW1MaXRlIHBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlID0gMTAzIFtwYWNrZWQgPSB0cnVlXTsKK30KKworbWVzc2FnZSBUZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZSB7CisgIGV4dGVuZCBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgeworICAgIG9wdGlvbmFsIGludDMyIG5lc3RlZF9leHRlbnNpb24gPSAxMjM0NTsKKyAgfQorfQorCisvLyBUZXN0IHRoYXQgZGVwcmVjYXRlZCBmaWVsZHMgd29yay4gIFdlIG9ubHkgdmVyaWZ5IHRoYXQgdGhleSBjb21waWxlIChhdCBvbmUKKy8vIHBvaW50IHRoaXMgZmFpbGVkKS4KK21lc3NhZ2UgVGVzdERlcHJlY2F0ZWRMaXRlIHsKKyAgb3B0aW9uYWwgaW50MzIgZGVwcmVjYXRlZF9maWVsZCA9IDEgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKK30KZGlmZiAtLWdpdCBhL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnByb3RvIGIvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxOGY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnByb3RvCkBAIC0wLDAgKzEsNDkgQEAKKy8vIEFkZGl0aW9uYWwgb3B0aW9ucyByZXF1aXJlZCBmb3IgQyMgZ2VuZXJhdGlvbi4gRmlsZSBmcm9tIGNvcHlyaWdodAorLy8gbGluZSBvbndhcmRzIGlzIGFzIHBlciBvcmlnaW5hbCBkaXN0cmlidXRpb24uCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byI7CitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS5uYW1lc3BhY2UgPSAiR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zIjsKK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLnVtYnJlbGxhX2NsYXNzbmFtZSA9ICJVbml0VGVzdExpdGVJbXBvcnROb25MaXRlUHJvdG9GaWxlIjsKKworLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIFRlc3RzIHRoYXQgYSAibGl0ZSIgbWVzc2FnZSBjYW4gaW1wb3J0IGEgcmVndWxhciBtZXNzYWdlLgorCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byI7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK21lc3NhZ2UgVGVzdExpdGVJbXBvcnRzTm9ubGl0ZSB7CisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gMTsKK30KZGlmZiAtLWdpdCBhL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8gYi9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzRlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvCkBAIC0wLDAgKzEsNzggQEAKKy8vIEFkZGl0aW9uYWwgb3B0aW9ucyByZXF1aXJlZCBmb3IgQyMgZ2VuZXJhdGlvbi4gRmlsZSBmcm9tIGNvcHlyaWdodAorLy8gbGluZSBvbndhcmRzIGlzIGFzIHBlciBvcmlnaW5hbCBkaXN0cmlidXRpb24uCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byI7CitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS5uYW1lc3BhY2UgPSAiR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zIjsKK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLnVtYnJlbGxhX2NsYXNzbmFtZSA9ICJVbml0VGVzdE1lc3NhZ2VTZXRQcm90b0ZpbGUiOworCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgbWVzc2FnZXMgZm9yIHRlc3RpbmcgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQuCisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKKworLy8gQSBtZXNzYWdlIHdpdGggbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQuCittZXNzYWdlIFRlc3RNZXNzYWdlU2V0IHsKKyAgb3B0aW9uIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gdHJ1ZTsKKyAgZXh0ZW5zaW9ucyA0IHRvIG1heDsKK30KKworbWVzc2FnZSBUZXN0TWVzc2FnZVNldENvbnRhaW5lciB7CisgIG9wdGlvbmFsIFRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0ID0gMTsKK30KKworbWVzc2FnZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgeworICBleHRlbmQgVGVzdE1lc3NhZ2VTZXQgeworICAgIG9wdGlvbmFsIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBtZXNzYWdlX3NldF9leHRlbnNpb24gPSAxNTQ1MDA4OworICB9CisgIG9wdGlvbmFsIGludDMyIGkgPSAxNTsKK30KKworbWVzc2FnZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgeworICBleHRlbmQgVGVzdE1lc3NhZ2VTZXQgeworICAgIG9wdGlvbmFsIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBtZXNzYWdlX3NldF9leHRlbnNpb24gPSAxNTQ3NzY5OworICB9CisgIG9wdGlvbmFsIHN0cmluZyBzdHIgPSAyNTsKK30KKworLy8gTWVzc2FnZVNldCB3aXJlIGZvcm1hdCBpcyBlcXVpdmFsZW50IHRvIHRoaXMuCittZXNzYWdlIFJhd01lc3NhZ2VTZXQgeworICByZXBlYXRlZCBncm91cCBJdGVtID0gMSB7CisgICAgcmVxdWlyZWQgaW50MzIgdHlwZV9pZCA9IDI7CisgICAgcmVxdWlyZWQgYnl0ZXMgbWVzc2FnZSA9IDM7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wcm90byBiL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiNTMzYgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8KQEAgLTAsMCArMSw1OCBAQAorLy8gQWRkaXRpb25hbCBvcHRpb25zIHJlcXVpcmVkIGZvciBDIyBnZW5lcmF0aW9uLiBGaWxlIGZyb20gY29weXJpZ2h0CisvLyBsaW5lIG9ud2FyZHMgaXMgYXMgcGVyIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbi4KK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIjsKK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLm5hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuTm9HZW5lcmljU2VydmljZSI7CitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS51bWJyZWxsYV9jbGFzc25hbWUgPSAiVW5pdFRlc3ROb0dlbmVyaWNTZXJ2aWNlc1Byb3RvRmlsZSI7CisKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworcGFja2FnZSBnb29nbGUucHJvdG9idWYubm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0OworCisvLyAqX2dlbmVyaWNfc2VydmljZXMgYXJlIGZhbHNlIGJ5IGRlZmF1bHQuCisKK21lc3NhZ2UgVGVzdE1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiBhID0gMTsKKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKK30KKworZW51bSBUZXN0RW51bSB7CisgIEZPTyA9IDE7Cit9CisKK2V4dGVuZCBUZXN0TWVzc2FnZSB7CisgIG9wdGlvbmFsIGludDMyIHRlc3RfZXh0ZW5zaW9uID0gMTAwMDsKK30KKworc2VydmljZSBUZXN0U2VydmljZSB7CisgIHJwYyBGb28oVGVzdE1lc3NhZ2UpIHJldHVybnMoVGVzdE1lc3NhZ2UpOworfQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3RvIGIvY3NoYXJwL3Byb3Rvcy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZWZhZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvcHJvdG9zL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucHJvdG8KQEAgLTAsMCArMSw2NyBAQAorLy8gQWRkaXRpb25hbCBvcHRpb25zIHJlcXVpcmVkIGZvciBDIyBnZW5lcmF0aW9uLiBGaWxlIGZyb20gY29weXJpZ2h0CisvLyBsaW5lIG9ud2FyZHMgaXMgYXMgcGVyIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbi4KK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIjsKK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLm5hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MiOworb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykudW1icmVsbGFfY2xhc3NuYW1lID0gIlVuaXRUZXN0T3B0aW1pemVGb3JQcm90b0ZpbGUiOworCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBBIHByb3RvIGZpbGUgd2hpY2ggdXNlcyBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkUuCisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIjsKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworb3B0aW9uIG9wdGltaXplX2ZvciA9IENPREVfU0laRTsKKworbWVzc2FnZSBUZXN0T3B0aW1pemVkRm9yU2l6ZSB7CisgIG9wdGlvbmFsIGludDMyIGkgPSAxOworICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSBtc2cgPSAxOTsKKworICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworCisgIGV4dGVuZCBUZXN0T3B0aW1pemVkRm9yU2l6ZSB7CisgICAgb3B0aW9uYWwgaW50MzIgdGVzdF9leHRlbnNpb24gPSAxMjM0OworICAgIG9wdGlvbmFsIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgdGVzdF9leHRlbnNpb24yID0gMTIzNTsKKyAgfQorfQorCittZXNzYWdlIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgeworICByZXF1aXJlZCBpbnQzMiB4ID0gMTsKK30KKyAKK21lc3NhZ2UgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSB7CisgIG9wdGlvbmFsIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgbyA9IDE7Cit9CmRpZmYgLS1naXQgYS9jc2hhcnAvcHJvdG9zL2dvb2dsZS90ZXN0L2dvb2dsZV9zaXplLnByb3RvIGIvY3NoYXJwL3Byb3Rvcy9nb29nbGUvdGVzdC9nb29nbGVfc2l6ZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTc3N2RmCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3Byb3Rvcy9nb29nbGUvdGVzdC9nb29nbGVfc2l6ZS5wcm90bwpAQCAtMCwwICsxLDE0MCBAQAorcGFja2FnZSB1bml0dGVzdF9nb29nbGVfc2l6ZTsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iOworb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykubmFtZXNwYWNlID0gIkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcyI7CitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS51bWJyZWxsYV9jbGFzc25hbWUgPSAiVW5pdFRlc3RHb29nbGVTaXplUHJvdG9GaWxlIjsKKworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkdvb2dsZVNpemUiOworb3B0aW9uIG9wdGltaXplX2ZvciA9IENPREVfU0laRTsKKworbWVzc2FnZSBTaXplTWVzc2FnZTEgeworICByZXF1aXJlZCBzdHJpbmcgZmllbGQxID0gMTsKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkOSA9IDk7CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDE4ID0gMTg7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ4MCA9IDgwIFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDgxID0gODEgW2RlZmF1bHQ9dHJ1ZV07CisgIHJlcXVpcmVkIGludDMyIGZpZWxkMiA9IDI7CisgIHJlcXVpcmVkIGludDMyIGZpZWxkMyA9IDM7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjgwID0gMjgwOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDYgPSA2IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDIyID0gMjI7CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDQgPSA0OworICByZXBlYXRlZCBmaXhlZDY0IGZpZWxkNSA9IDU7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ1OSA9IDU5IFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkNyA9IDc7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTYgPSAxNjsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxMzAgPSAxMzAgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQxMiA9IDEyIFtkZWZhdWx0PXRydWVdOworICBvcHRpb25hbCBib29sIGZpZWxkMTcgPSAxNyBbZGVmYXVsdD10cnVlXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDEzID0gMTMgW2RlZmF1bHQ9dHJ1ZV07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQxNCA9IDE0IFtkZWZhdWx0PXRydWVdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDEwNCA9IDEwNCBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxMDAgPSAxMDAgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTAxID0gMTAxIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBzdHJpbmcgZmllbGQxMDIgPSAxMDI7CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDEwMyA9IDEwMzsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyOSA9IDI5IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBib29sIGZpZWxkMzAgPSAzMCBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkNjAgPSA2MCBbZGVmYXVsdD0tMV07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjcxID0gMjcxIFtkZWZhdWx0PS0xXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyNzIgPSAyNzIgW2RlZmF1bHQ9LTFdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDE1MCA9IDE1MDsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMyA9IDIzIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBib29sIGZpZWxkMjQgPSAyNCBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjUgPSAyNSBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBmaWVsZDE1ID0gMTU7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ3OCA9IDc4OworICBvcHRpb25hbCBpbnQzMiBmaWVsZDY3ID0gNjcgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkNjggPSA2ODsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxMjggPSAxMjggW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDEyOSA9IDEyOSBbZGVmYXVsdD0ieHh4eHh4eHh4eHh4eHh4eHh4eHh4Il07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTMxID0gMTMxIFtkZWZhdWx0PTBdOworfQorCittZXNzYWdlIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiBmaWVsZDEgPSAxIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIgPSAyIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDMgPSAzIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBzdHJpbmcgZmllbGQxNSA9IDE1OworICBvcHRpb25hbCBib29sIGZpZWxkMTIgPSAxMiBbZGVmYXVsdD10cnVlXTsKKyAgb3B0aW9uYWwgaW50NjQgZmllbGQxMyA9IDEzOworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDE0ID0gMTQ7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTYgPSAxNjsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxOSA9IDE5IFtkZWZhdWx0PTJdOworICBvcHRpb25hbCBib29sIGZpZWxkMjAgID0gMjAgW2RlZmF1bHQ9dHJ1ZV07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQyOCA9IDI4IFtkZWZhdWx0PXRydWVdOworICBvcHRpb25hbCBmaXhlZDY0IGZpZWxkMjEgPSAyMTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMiA9IDIyOworICBvcHRpb25hbCBib29sIGZpZWxkMjMgPSAyMyBbIGRlZmF1bHQ9ZmFsc2UgXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDIwNiA9IDIwNiBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIGZpeGVkMzIgZmllbGQyMDMgPSAyMDM7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjA0ID0gMjA0OworICBvcHRpb25hbCBzdHJpbmcgZmllbGQyMDUgPSAyMDU7CisgIG9wdGlvbmFsIHVpbnQ2NCBmaWVsZDIwNyA9IDIwNzsKKyAgb3B0aW9uYWwgdWludDY0IGZpZWxkMzAwID0gMzAwOworfQorCittZXNzYWdlIFNpemVNZXNzYWdlMiB7CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDEgPSAxOworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDMgPSAzOworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDQgPSA0OworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDMwID0gMzA7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ3NSAgPSA3NSBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDYgPSA2OworICBvcHRpb25hbCBieXRlcyBmaWVsZDIgPSAyOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIxID0gMjEgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkNzEgPSA3MTsKKyAgb3B0aW9uYWwgZmxvYXQgZmllbGQyNSA9IDI1OworICBvcHRpb25hbCBpbnQzMiBmaWVsZDEwOSA9IDEwOSBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMTAgPSAyMTAgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjExID0gMjExIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIxMiA9IDIxMiBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMTMgPSAyMTMgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjE2ID0gMjE2IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIxNyA9IDIxNyBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMTggPSAyMTggW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjIwID0gMjIwIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIyMSA9IDIyMSBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgZmxvYXQgZmllbGQyMjIgPSAyMjIgW2RlZmF1bHQ9MC4wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQ2MyA9IDYzOworCisgIHJlcGVhdGVkIGdyb3VwIEdyb3VwMSA9IDEwIHsKKyAgICByZXF1aXJlZCBmbG9hdCBmaWVsZDExID0gMTE7CisgICAgb3B0aW9uYWwgZmxvYXQgZmllbGQyNiA9IDI2OworICAgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDEyID0gMTI7CisgICAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkMTMgPSAxMzsKKyAgICByZXBlYXRlZCBzdHJpbmcgZmllbGQxNCA9IDE0OworICAgIHJlcXVpcmVkIHVpbnQ2NCBmaWVsZDE1ID0gMTU7CisgICAgb3B0aW9uYWwgaW50MzIgZmllbGQ1ID0gNTsKKyAgICBvcHRpb25hbCBzdHJpbmcgZmllbGQyNyA9IDI3OworICAgIG9wdGlvbmFsIGludDMyIGZpZWxkMjggPSAyODsKKyAgICBvcHRpb25hbCBzdHJpbmcgZmllbGQyOSA9IDI5OworICAgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDE2ID0gMTY7CisgICAgcmVwZWF0ZWQgc3RyaW5nIGZpZWxkMjIgPSAyMjsKKyAgICByZXBlYXRlZCBpbnQzMiBmaWVsZDczID0gNzM7CisgICAgb3B0aW9uYWwgaW50MzIgZmllbGQyMCA9IDIwIFtkZWZhdWx0PTBdOworICAgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDI0ID0gMjQ7CisgICAgb3B0aW9uYWwgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgZmllbGQzMSA9IDMxOworICB9CisgIHJlcGVhdGVkIHN0cmluZyBmaWVsZDEyOCA9IDEyODsKKyAgb3B0aW9uYWwgaW50NjQgZmllbGQxMzEgPSAxMzE7CisgIHJlcGVhdGVkIHN0cmluZyBmaWVsZDEyNyA9IDEyNzsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxMjkgPSAxMjk7CisgIHJlcGVhdGVkIGludDY0IGZpZWxkMTMwID0gMTMwOworICBvcHRpb25hbCBib29sIGZpZWxkMjA1ID0gMjA1IFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDIwNiA9IDIwNiBbZGVmYXVsdD1mYWxzZV07Cit9CisKK21lc3NhZ2UgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgeworICBvcHRpb25hbCBmbG9hdCBmaWVsZDEgPSAxOworICBvcHRpb25hbCBmbG9hdCBmaWVsZDIgPSAyOworICBvcHRpb25hbCBmbG9hdCBmaWVsZDMgPSAzIFtkZWZhdWx0PTAuMF07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ0ID0gNDsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDUgPSA1OworICBvcHRpb25hbCBib29sIGZpZWxkNiA9IDYgW2RlZmF1bHQ9dHJ1ZV07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ3ID0gNyBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIGZsb2F0IGZpZWxkOCA9IDg7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ5ID0gOTsKKyAgb3B0aW9uYWwgZmxvYXQgZmllbGQxMCA9IDEwOworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDExID0gMTE7Cit9CmRpZmYgLS1naXQgYS9jc2hhcnAvcHJvdG9zL2dvb2dsZS90ZXN0L2dvb2dsZV9zcGVlZC5wcm90byBiL2NzaGFycC9wcm90b3MvZ29vZ2xlL3Rlc3QvZ29vZ2xlX3NwZWVkLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjJhMDcKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvcHJvdG9zL2dvb2dsZS90ZXN0L2dvb2dsZV9zcGVlZC5wcm90bwpAQCAtMCwwICsxLDE0MCBAQAorcGFja2FnZSB1bml0dGVzdF9nb29nbGVfc3BlZWQ7CisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIjsKK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLm5hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MiOworb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykudW1icmVsbGFfY2xhc3NuYW1lID0gIlVuaXRUZXN0R29vZ2xlU3BlZWRQcm90b0ZpbGUiOworCitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiR29vZ2xlU3BlZWQiOworb3B0aW9uIG9wdGltaXplX2ZvciA9IFNQRUVEOworCittZXNzYWdlIFNwZWVkTWVzc2FnZTEgeworICByZXF1aXJlZCBzdHJpbmcgZmllbGQxID0gMTsKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkOSA9IDk7CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDE4ID0gMTg7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ4MCA9IDgwIFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDgxID0gODEgW2RlZmF1bHQ9dHJ1ZV07CisgIHJlcXVpcmVkIGludDMyIGZpZWxkMiA9IDI7CisgIHJlcXVpcmVkIGludDMyIGZpZWxkMyA9IDM7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjgwID0gMjgwOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDYgPSA2IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDIyID0gMjI7CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDQgPSA0OworICByZXBlYXRlZCBmaXhlZDY0IGZpZWxkNSA9IDU7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ1OSA9IDU5IFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkNyA9IDc7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTYgPSAxNjsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxMzAgPSAxMzAgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQxMiA9IDEyIFtkZWZhdWx0PXRydWVdOworICBvcHRpb25hbCBib29sIGZpZWxkMTcgPSAxNyBbZGVmYXVsdD10cnVlXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDEzID0gMTMgW2RlZmF1bHQ9dHJ1ZV07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQxNCA9IDE0IFtkZWZhdWx0PXRydWVdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDEwNCA9IDEwNCBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxMDAgPSAxMDAgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTAxID0gMTAxIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBzdHJpbmcgZmllbGQxMDIgPSAxMDI7CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDEwMyA9IDEwMzsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyOSA9IDI5IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBib29sIGZpZWxkMzAgPSAzMCBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkNjAgPSA2MCBbZGVmYXVsdD0tMV07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjcxID0gMjcxIFtkZWZhdWx0PS0xXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyNzIgPSAyNzIgW2RlZmF1bHQ9LTFdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDE1MCA9IDE1MDsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMyA9IDIzIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBib29sIGZpZWxkMjQgPSAyNCBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjUgPSAyNSBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgZmllbGQxNSA9IDE1OworICBvcHRpb25hbCBib29sIGZpZWxkNzggPSA3ODsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQ2NyA9IDY3IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDY4ID0gNjg7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTI4ID0gMTI4IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBzdHJpbmcgZmllbGQxMjkgPSAxMjkgW2RlZmF1bHQ9Inh4eHh4eHh4eHh4eHh4eHh4eHh4eCJdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDEzMSA9IDEzMSBbZGVmYXVsdD0wXTsKK30KKworbWVzc2FnZSBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSB7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMSA9IDEgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMiA9IDIgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMyA9IDMgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDE1ID0gMTU7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQxMiA9IDEyIFtkZWZhdWx0PXRydWVdOworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDEzID0gMTM7CisgIG9wdGlvbmFsIGludDY0IGZpZWxkMTQgPSAxNDsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxNiA9IDE2OworICBvcHRpb25hbCBpbnQzMiBmaWVsZDE5ID0gMTkgW2RlZmF1bHQ9Ml07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQyMCAgPSAyMCBbZGVmYXVsdD10cnVlXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDI4ID0gMjggW2RlZmF1bHQ9dHJ1ZV07CisgIG9wdGlvbmFsIGZpeGVkNjQgZmllbGQyMSA9IDIxOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIyID0gMjI7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQyMyA9IDIzIFsgZGVmYXVsdD1mYWxzZSBdOworICBvcHRpb25hbCBib29sIGZpZWxkMjA2ID0gMjA2IFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgZml4ZWQzMiBmaWVsZDIwMyA9IDIwMzsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMDQgPSAyMDQ7CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDIwNSA9IDIwNTsKKyAgb3B0aW9uYWwgdWludDY0IGZpZWxkMjA3ID0gMjA3OworICBvcHRpb25hbCB1aW50NjQgZmllbGQzMDAgPSAzMDA7Cit9CisKK21lc3NhZ2UgU3BlZWRNZXNzYWdlMiB7CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDEgPSAxOworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDMgPSAzOworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDQgPSA0OworICBvcHRpb25hbCBpbnQ2NCBmaWVsZDMwID0gMzA7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ3NSAgPSA3NSBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDYgPSA2OworICBvcHRpb25hbCBieXRlcyBmaWVsZDIgPSAyOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIxID0gMjEgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkNzEgPSA3MTsKKyAgb3B0aW9uYWwgZmxvYXQgZmllbGQyNSA9IDI1OworICBvcHRpb25hbCBpbnQzMiBmaWVsZDEwOSA9IDEwOSBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMTAgPSAyMTAgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjExID0gMjExIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIxMiA9IDIxMiBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMTMgPSAyMTMgW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjE2ID0gMjE2IFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIxNyA9IDIxNyBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQyMTggPSAyMTggW2RlZmF1bHQ9MF07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMjIwID0gMjIwIFtkZWZhdWx0PTBdOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDIyMSA9IDIyMSBbZGVmYXVsdD0wXTsKKyAgb3B0aW9uYWwgZmxvYXQgZmllbGQyMjIgPSAyMjIgW2RlZmF1bHQ9MC4wXTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQ2MyA9IDYzOworCisgIHJlcGVhdGVkIGdyb3VwIEdyb3VwMSA9IDEwIHsKKyAgICByZXF1aXJlZCBmbG9hdCBmaWVsZDExID0gMTE7CisgICAgb3B0aW9uYWwgZmxvYXQgZmllbGQyNiA9IDI2OworICAgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDEyID0gMTI7CisgICAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkMTMgPSAxMzsKKyAgICByZXBlYXRlZCBzdHJpbmcgZmllbGQxNCA9IDE0OworICAgIHJlcXVpcmVkIHVpbnQ2NCBmaWVsZDE1ID0gMTU7CisgICAgb3B0aW9uYWwgaW50MzIgZmllbGQ1ID0gNTsKKyAgICBvcHRpb25hbCBzdHJpbmcgZmllbGQyNyA9IDI3OworICAgIG9wdGlvbmFsIGludDMyIGZpZWxkMjggPSAyODsKKyAgICBvcHRpb25hbCBzdHJpbmcgZmllbGQyOSA9IDI5OworICAgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDE2ID0gMTY7CisgICAgcmVwZWF0ZWQgc3RyaW5nIGZpZWxkMjIgPSAyMjsKKyAgICByZXBlYXRlZCBpbnQzMiBmaWVsZDczID0gNzM7CisgICAgb3B0aW9uYWwgaW50MzIgZmllbGQyMCA9IDIwIFtkZWZhdWx0PTBdOworICAgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDI0ID0gMjQ7CisgICAgb3B0aW9uYWwgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIGZpZWxkMzEgPSAzMTsKKyAgfQorICByZXBlYXRlZCBzdHJpbmcgZmllbGQxMjggPSAxMjg7CisgIG9wdGlvbmFsIGludDY0IGZpZWxkMTMxID0gMTMxOworICByZXBlYXRlZCBzdHJpbmcgZmllbGQxMjcgPSAxMjc7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMTI5ID0gMTI5OworICByZXBlYXRlZCBpbnQ2NCBmaWVsZDEzMCA9IDEzMDsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDIwNSA9IDIwNSBbZGVmYXVsdD1mYWxzZV07CisgIG9wdGlvbmFsIGJvb2wgZmllbGQyMDYgPSAyMDYgW2RlZmF1bHQ9ZmFsc2VdOworfQorCittZXNzYWdlIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSB7CisgIG9wdGlvbmFsIGZsb2F0IGZpZWxkMSA9IDE7CisgIG9wdGlvbmFsIGZsb2F0IGZpZWxkMiA9IDI7CisgIG9wdGlvbmFsIGZsb2F0IGZpZWxkMyA9IDMgW2RlZmF1bHQ9MC4wXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDQgPSA0OworICBvcHRpb25hbCBib29sIGZpZWxkNSA9IDU7CisgIG9wdGlvbmFsIGJvb2wgZmllbGQ2ID0gNiBbZGVmYXVsdD10cnVlXTsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDcgPSA3IFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgZmxvYXQgZmllbGQ4ID0gODsKKyAgb3B0aW9uYWwgYm9vbCBmaWVsZDkgPSA5OworICBvcHRpb25hbCBmbG9hdCBmaWVsZDEwID0gMTA7CisgIG9wdGlvbmFsIGludDY0IGZpZWxkMTEgPSAxMTsKK30KZGlmZiAtLWdpdCBhL2NzaGFycC9wcm90b3MvbnBwLmxhbmd1YWdlLnhtbCBiL2NzaGFycC9wcm90b3MvbnBwLmxhbmd1YWdlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjEyMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3Byb3Rvcy9ucHAubGFuZ3VhZ2UueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzxOb3RlcGFkUGx1cz4NCis8IS0tDQorRGVmaW5lcyBzeW50YXggaGlnaGxpZ2h0aW5nIGZvciBOb3RlcGFkKysuDQorMS4gSW5zdGFsbCBOb3RlcGFkKysgZnJvbSBodHRwOi8vbm90ZXBhZC1wbHVzLXBsdXMub3JnDQorMi4gT3BlbiBOb3RlcGFkKyssIGZyb20gdGhlIFZpZXcgbWVudSwgc2VsZWN0ICJVc2VyLURlZmluZWQgRGlhbG9nLi4uIg0KKzMuIENsaWNrIHRoZSAiSW1wb3J0Li4uIiBidXR0b24gYW5kIHNlbGVjdCB0aGlzIGZpbGUNCis0LiBSZXN0YXJ0IE5vdGVwYWQrKw0KKzUuIE9wZW4gYW5kIGVkaXQgYW55ICoucHJvdG8gZmlsZQ0KKy0tPg0KKyAgICA8VXNlckxhbmcgbmFtZT0iUHJvdG8gQnVmZmVyIiBleHQ9InByb3RvIj4NCisgICAgICAgIDxTZXR0aW5ncz4NCisgICAgICAgICAgICA8R2xvYmFsIGNhc2VJZ25vcmVkPSJubyIgLz4NCisgICAgICAgICAgICA8VHJlYXRBc1N5bWJvbCBjb21tZW50PSJubyIgY29tbWVudExpbmU9InllcyIgLz4NCisgICAgICAgICAgICA8UHJlZml4IHdvcmRzMT0ibm8iIHdvcmRzMj0ibm8iIHdvcmRzMz0ibm8iIHdvcmRzND0ieWVzIiAvPg0KKyAgICAgICAgPC9TZXR0aW5ncz4NCisgICAgICAgIDxLZXl3b3JkTGlzdHM+DQorICAgICAgICAgICAgPEtleXdvcmRzIG5hbWU9IkRlbGltaXRlcnMiPlswMF0wMDwvS2V5d29yZHM+DQorICAgICAgICAgICAgPEtleXdvcmRzIG5hbWU9IkZvbGRlcisiPns8L0tleXdvcmRzPg0KKyAgICAgICAgICAgIDxLZXl3b3JkcyBuYW1lPSJGb2xkZXItIj59PC9LZXl3b3Jkcz4NCisgICAgICAgICAgICA8S2V5d29yZHMgbmFtZT0iT3BlcmF0b3JzIj49PC9LZXl3b3Jkcz4NCisgICAgICAgICAgICA8S2V5d29yZHMgbmFtZT0iQ29tbWVudCI+IDFvcHRpb24gMXBhY2thZ2UgMWltcG9ydCAyOyAwLy88L0tleXdvcmRzPg0KKyAgICAgICAgICAgIDxLZXl3b3JkcyBuYW1lPSJXb3JkczEiPm1lc3NhZ2UgZW51bSBzZXJ2aWNlIGV4dGVuZDwvS2V5d29yZHM+DQorICAgICAgICAgICAgPEtleXdvcmRzIG5hbWU9IldvcmRzMiI+cmVxdWlyZWQgb3B0aW9uYWwgcmVwZWF0ZWQgZXh0ZW5zaW9ucyB0byBycGMgcmV0dXJuczwvS2V5d29yZHM+DQorICAgICAgICAgICAgPEtleXdvcmRzIG5hbWU9IldvcmRzMyI+ZG91YmxlIGZsb2F0IGludDMyIGludDY0IHVpbnQzMiB1aW50NjQgc2ludDMyIHNpbnQ2NCBmaXhlZDMyIGZpeGVkNjQgc2ZpeGVkMzIgc2ZpeGVkNjQgYm9vbCBzdHJpbmcgYnl0ZXM8L0tleXdvcmRzPg0KKyAgICAgICAgICAgIDxLZXl3b3JkcyBuYW1lPSJXb3JkczQiPjwvS2V5d29yZHM+DQorICAgICAgICA8L0tleXdvcmRMaXN0cz4NCisgICAgICAgIDxTdHlsZXM+DQorICAgICAgICAgICAgPFdvcmRzU3R5bGUgbmFtZT0iREVGQVVMVCIgc3R5bGVJRD0iMTEiIGZnQ29sb3I9IjAwMDAwMCIgYmdDb2xvcj0iRkZGRkZGIiBmb250U3R5bGU9IjAiIC8+DQorICAgICAgICAgICAgPFdvcmRzU3R5bGUgbmFtZT0iRk9MREVST1BFTiIgc3R5bGVJRD0iMTIiIGZnQ29sb3I9IjAwMDAwMCIgYmdDb2xvcj0iRkZGRkZGIiBmb250U3R5bGU9IjEiIC8+DQorICAgICAgICAgICAgPFdvcmRzU3R5bGUgbmFtZT0iRk9MREVSQ0xPU0UiIHN0eWxlSUQ9IjEzIiBmZ0NvbG9yPSIwMDAwMDAiIGJnQ29sb3I9IkZGRkZGRiIgZm9udFN0eWxlPSIxIiAvPg0KKyAgICAgICAgICAgIDxXb3Jkc1N0eWxlIG5hbWU9IktFWVdPUkQxIiBzdHlsZUlEPSI1IiBmZ0NvbG9yPSIwMDAwRkYiIGJnQ29sb3I9IkZGRkZGRiIgZm9udFN0eWxlPSIwIiAvPg0KKyAgICAgICAgICAgIDxXb3Jkc1N0eWxlIG5hbWU9IktFWVdPUkQyIiBzdHlsZUlEPSI2IiBmZ0NvbG9yPSIwMDgwQzAiIGJnQ29sb3I9IkZGRkZGRiIgZm9udFN0eWxlPSIwIiAvPg0KKyAgICAgICAgICAgIDxXb3Jkc1N0eWxlIG5hbWU9IktFWVdPUkQzIiBzdHlsZUlEPSI3IiBmZ0NvbG9yPSIwMDAwRkYiIGJnQ29sb3I9IkZGRkZGRiIgZm9udFN0eWxlPSIwIiAvPg0KKyAgICAgICAgICAgIDxXb3Jkc1N0eWxlIG5hbWU9IktFWVdPUkQ0IiBzdHlsZUlEPSI4IiBmZ0NvbG9yPSIwMDgwNDAiIGJnQ29sb3I9IkZGRkZGRiIgZm9udFN0eWxlPSIwIiAvPg0KKyAgICAgICAgICAgIDxXb3Jkc1N0eWxlIG5hbWU9IkNPTU1FTlQiIHN0eWxlSUQ9IjEiIGZnQ29sb3I9IjAwODAwMCIgYmdDb2xvcj0iRkZGRkZGIiBmb250U3R5bGU9IjAiIC8+DQorICAgICAgICAgICAgPFdvcmRzU3R5bGUgbmFtZT0iQ09NTUVOVCBMSU5FIiBzdHlsZUlEPSIyIiBmZ0NvbG9yPSI5NDk0OTQiIGJnQ29sb3I9IkZGRkZGRiIgZm9udFN0eWxlPSIwIiAvPg0KKyAgICAgICAgICAgIDxXb3Jkc1N0eWxlIG5hbWU9Ik5VTUJFUiIgc3R5bGVJRD0iNCIgZmdDb2xvcj0iRkYwMDAwIiBiZ0NvbG9yPSJGRkZGRkYiIGZvbnRTdHlsZT0iMCIgLz4NCisgICAgICAgICAgICA8V29yZHNTdHlsZSBuYW1lPSJPUEVSQVRPUiIgc3R5bGVJRD0iMTAiIGZnQ29sb3I9IjAwMDAwMCIgYmdDb2xvcj0iRkZGRkZGIiBmb250U3R5bGU9IjAiIC8+DQorICAgICAgICAgICAgPFdvcmRzU3R5bGUgbmFtZT0iREVMSU1JTkVSMSIgc3R5bGVJRD0iMTQiIGZnQ29sb3I9IjgwMDA4MCIgYmdDb2xvcj0iRkZGRkZGIiBmb250U3R5bGU9IjAiIC8+DQorICAgICAgICAgICAgPFdvcmRzU3R5bGUgbmFtZT0iREVMSU1JTkVSMiIgc3R5bGVJRD0iMTUiIGZnQ29sb3I9IjgwODA4MCIgYmdDb2xvcj0iRkZGRkZGIiBmb250U3R5bGU9IjAiIC8+DQorICAgICAgICAgICAgPFdvcmRzU3R5bGUgbmFtZT0iREVMSU1JTkVSMyIgc3R5bGVJRD0iMTYiIGZnQ29sb3I9IjAwMDAwMCIgYmdDb2xvcj0iRkZGRkZGIiBmb250U3R5bGU9IjAiIC8+DQorICAgICAgICA8L1N0eWxlcz4NCisgICAgPC9Vc2VyTGFuZz4NCis8L05vdGVwYWRQbHVzPg0KZGlmZiAtLWdpdCBhL2NzaGFycC9wcm90b3MvdHV0b3JpYWwvYWRkcmVzc2Jvb2sucHJvdG8gYi9jc2hhcnAvcHJvdG9zL3R1dG9yaWFsL2FkZHJlc3Nib29rLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYmUzNWMKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvcHJvdG9zL3R1dG9yaWFsL2FkZHJlc3Nib29rLnByb3RvCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2UgdHV0b3JpYWw7CisgCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byI7CitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS5uYW1lc3BhY2UgPSAiR29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vayI7CitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS51bWJyZWxsYV9jbGFzc25hbWUgPSAiQWRkcmVzc0Jvb2tQcm90b3MiOworCitvcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7CisKK21lc3NhZ2UgUGVyc29uIHsKKyAgcmVxdWlyZWQgc3RyaW5nIG5hbWUgPSAxOworICByZXF1aXJlZCBpbnQzMiBpZCA9IDI7ICAgICAgICAvLyBVbmlxdWUgSUQgbnVtYmVyIGZvciB0aGlzIHBlcnNvbi4KKyAgb3B0aW9uYWwgc3RyaW5nIGVtYWlsID0gMzsKKyAKKyAgZW51bSBQaG9uZVR5cGUgeworICAgIE1PQklMRSA9IDA7CisgICAgSE9NRSA9IDE7CisgICAgV09SSyA9IDI7CisgIH0KKyAKKyAgbWVzc2FnZSBQaG9uZU51bWJlciB7CisgICAgcmVxdWlyZWQgc3RyaW5nIG51bWJlciA9IDE7CisgICAgb3B0aW9uYWwgUGhvbmVUeXBlIHR5cGUgPSAyIFtkZWZhdWx0ID0gSE9NRV07CisgIH0KKyAKKyAgcmVwZWF0ZWQgUGhvbmVOdW1iZXIgcGhvbmUgPSA0OworfQorIAorLy8gT3VyIGFkZHJlc3MgYm9vayBmaWxlIGlzIGp1c3Qgb25lIG9mIHRoZXNlLgorbWVzc2FnZSBBZGRyZXNzQm9vayB7CisgIHJlcGVhdGVkIFBlcnNvbiBwZXJzb24gPSAxOworfQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9BZGRyZXNzQm9vay9BZGRQZXJzb24uY3MgYi9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL0FkZFBlcnNvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjJiMGM1Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9BZGRyZXNzQm9vay9BZGRQZXJzb24uY3MKQEAgLTAsMCArMSwxMzYgQEAKK++7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLklPOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rDQorew0KKyAgICBpbnRlcm5hbCBjbGFzcyBBZGRQZXJzb24NCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEJ1aWxkcyBhIHBlcnNvbiBiYXNlZCBvbiB1c2VyIGlucHV0DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgUGVyc29uIFByb21wdEZvckFkZHJlc3MoVGV4dFJlYWRlciBpbnB1dCwgVGV4dFdyaXRlciBvdXRwdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgUGVyc29uLkJ1aWxkZXIgcGVyc29uID0gUGVyc29uLkNyZWF0ZUJ1aWxkZXIoKTsNCisNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGUoIkVudGVyIHBlcnNvbiBJRDogIik7DQorICAgICAgICAgICAgcGVyc29uLklkID0gaW50LlBhcnNlKGlucHV0LlJlYWRMaW5lKCkpOw0KKw0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZSgiRW50ZXIgbmFtZTogIik7DQorICAgICAgICAgICAgcGVyc29uLk5hbWUgPSBpbnB1dC5SZWFkTGluZSgpOw0KKw0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZSgiRW50ZXIgZW1haWwgYWRkcmVzcyAoYmxhbmsgZm9yIG5vbmUpOiAiKTsNCisgICAgICAgICAgICBzdHJpbmcgZW1haWwgPSBpbnB1dC5SZWFkTGluZSgpOw0KKyAgICAgICAgICAgIGlmIChlbWFpbC5MZW5ndGggPiAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcGVyc29uLkVtYWlsID0gZW1haWw7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlKCJFbnRlciBhIHBob25lIG51bWJlciAob3IgbGVhdmUgYmxhbmsgdG8gZmluaXNoKTogIik7DQorICAgICAgICAgICAgICAgIHN0cmluZyBudW1iZXIgPSBpbnB1dC5SZWFkTGluZSgpOw0KKyAgICAgICAgICAgICAgICBpZiAobnVtYmVyLkxlbmd0aCA9PSAwKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBQZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIuQnVpbGRlciBwaG9uZU51bWJlciA9DQorICAgICAgICAgICAgICAgICAgICBQZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIuQ3JlYXRlQnVpbGRlcigpLlNldE51bWJlcihudW1iZXIpOw0KKw0KKyAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGUoIklzIHRoaXMgYSBtb2JpbGUsIGhvbWUsIG9yIHdvcmsgcGhvbmU/ICIpOw0KKyAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IGlucHV0LlJlYWRMaW5lKCk7DQorICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAibW9iaWxlIjoNCisgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZU51bWJlci5UeXBlID0gUGVyc29uLlR5cGVzLlBob25lVHlwZS5NT0JJTEU7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlICJob21lIjoNCisgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZU51bWJlci5UeXBlID0gUGVyc29uLlR5cGVzLlBob25lVHlwZS5IT01FOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAid29yayI6DQorICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVOdW1iZXIuVHlwZSA9IFBlcnNvbi5UeXBlcy5QaG9uZVR5cGUuV09SSzsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlKCJVbmtub3duIHBob25lIHR5cGUuIFVzaW5nIGRlZmF1bHQuIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgcGVyc29uLkFkZFBob25lKHBob25lTnVtYmVyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHBlcnNvbi5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEVudHJ5IHBvaW50IC0gbG9hZHMgYW4gZXhpc3RpbmcgYWRkcmVzc2Jvb2sgb3IgY3JlYXRlcyBhIG5ldyBvbmUsDQorICAgICAgICAvLy8gdGhlbiB3cml0ZXMgaXQgYmFjayB0byB0aGUgZmlsZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBNYWluKHN0cmluZ1tdIGFyZ3MpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoICE9IDEpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgiVXNhZ2U6ICBBZGRQZXJzb24gQUREUkVTU19CT09LX0ZJTEUiKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBBZGRyZXNzQm9vay5CdWlsZGVyIGFkZHJlc3NCb29rID0gQWRkcmVzc0Jvb2suQ3JlYXRlQnVpbGRlcigpOw0KKw0KKyAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhhcmdzWzBdKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gZmlsZSA9IEZpbGUuT3BlblJlYWQoYXJnc1swXSkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NCb29rLk1lcmdlRnJvbShmaWxlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiezB9OiBGaWxlIG5vdCBmb3VuZC4gQ3JlYXRpbmcgYSBuZXcgZmlsZS4iLCBhcmdzWzBdKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8gQWRkIGFuIGFkZHJlc3MuDQorICAgICAgICAgICAgYWRkcmVzc0Jvb2suQWRkUGVyc29uKFByb21wdEZvckFkZHJlc3MoQ29uc29sZS5JbiwgQ29uc29sZS5PdXQpKTsNCisNCisgICAgICAgICAgICAvLyBXcml0ZSB0aGUgbmV3IGFkZHJlc3MgYm9vayBiYWNrIHRvIGRpc2suDQorICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBvdXRwdXQgPSBGaWxlLk9wZW5Xcml0ZShhcmdzWzBdKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGFkZHJlc3NCb29rLkJ1aWxkKCkuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL0FkZHJlc3NCb29rLmNzcHJvaiBiL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svQWRkcmVzc0Jvb2suY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMjdlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL0FkZHJlc3NCb29rLmNzcHJvagpAQCAtMCwwICsxLDc1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DTElFTlRQUk9GSUxFPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+TkVUMzU8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57QTMxRjVGQjItNEZGMy00MzJBLUIzNUItNUNEMjAzNjA2MzExfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkFkZHJlc3NCb29rPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFN0YXJ0dXBPYmplY3Q+R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5Qcm9ncmFtPC9TdGFydHVwT2JqZWN0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFkZFBlcnNvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWRkcmVzc0Jvb2tQcm90b3MuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZVVzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJMaXN0UGVvcGxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9ncmFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJhcHAuY29uZmlnIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9BZGRyZXNzQm9vay9BZGRyZXNzQm9va1Byb3Rvcy5jcyBiL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svQWRkcmVzc0Jvb2tQcm90b3MuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyNzZkZAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svQWRkcmVzc0Jvb2tQcm90b3MuY3MKQEAgLTAsMCArMSwxMTYwIEBACisvLyBHZW5lcmF0ZWQgYnkgUHJvdG9HZW4sIFZlcnNpb249Mi40LjEuNTU1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTU1ZjcxMjUyMzRiZWI1ODkuICBETyBOT1QgRURJVCENCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxDQorI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KKw0KK3VzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vayB7DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgQWRkcmVzc0Jvb2tQcm90b3Mgew0KKyAgDQorICAgICNyZWdpb24gRXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbg0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgew0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBTdGF0aWMgdmFyaWFibGVzDQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfdHV0b3JpYWxfUGVyc29uX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfdHV0b3JpYWxfUGVyc29uX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfdHV0b3JpYWxfUGVyc29uX1Bob25lTnVtYmVyX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uLlR5cGVzLlBob25lTnVtYmVyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uLlR5cGVzLlBob25lTnVtYmVyLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfdHV0b3JpYWxfUGVyc29uX1Bob25lTnVtYmVyX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfdHV0b3JpYWxfQWRkcmVzc0Jvb2tfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5BZGRyZXNzQm9vaywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLkFkZHJlc3NCb29rLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfdHV0b3JpYWxfQWRkcmVzc0Jvb2tfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIERlc2NyaXB0b3INCisgICAgcHVibGljIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOw0KKyAgICANCisgICAgc3RhdGljIEFkZHJlc3NCb29rUHJvdG9zKCkgew0KKyAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygNCisgICAgICAgICAgc3RyaW5nLkNvbmNhdCgNCisgICAgICAgICAgICAiQ2hwMGRYUnZjbWxoYkM5aFpHUnlaWE56WW05dmF5NXdjbTkwYnhJSWRIVjBiM0pwWVd3YUpHZHZiMmRzIiwgDQorICAgICAgICAgICAgIlpTOXdjbTkwYjJKMVppOWpjMmhoY25CZmIzQjBhVzl1Y3k1d2NtOTBieUxhQVFvR1VHVnljMjl1RWd3SyIsIA0KKyAgICAgICAgICAgICJCRzVoYldVWUFTQUNLQWtTQ2dvQ2FXUVlBaUFDS0FVU0RRb0ZaVzFoYVd3WUF5QUJLQWtTS3dvRmNHaHYiLCANCisgICAgICAgICAgICAiYm1VWUJDQURLQXN5SEM1MGRYUnZjbWxoYkM1UVpYSnpiMjR1VUdodmJtVk9kVzFpWlhJYVRRb0xVR2h2IiwgDQorICAgICAgICAgICAgImJtVk9kVzFpWlhJU0Rnb0diblZ0WW1WeUdBRWdBaWdKRWk0S0JIUjVjR1VZQWlBQktBNHlHaTUwZFhSdiIsIA0KKyAgICAgICAgICAgICJjbWxoYkM1UVpYSnpiMjR1VUdodmJtVlVlWEJsT2dSSVQwMUZJaXNLQ1ZCb2IyNWxWSGx3WlJJS0NnWk4iLCANCisgICAgICAgICAgICAiVDBKSlRFVVFBQklJQ2dSSVQwMUZFQUVTQ0FvRVYwOVNTeEFDSWk4S0MwRmtaSEpsYzNOQ2IyOXJFaUFLIiwgDQorICAgICAgICAgICAgIkJuQmxjbk52YmhnQklBTW9DeklRTG5SMWRHOXlhV0ZzTGxCbGNuTnZia0pGU0FIQ1BrQUtLMGR2YjJkcyIsIA0KKyAgICAgICAgICAgICJaUzVRY205MGIyTnZiRUoxWm1abGNuTXVSWGhoYlhCc1pYTXVRV1JrY21WemMwSnZiMnNTRVVGa1pISmwiLCANCisgICAgICAgICAgImMzTkNiMjlyVUhKdmRHOXoiKSk7DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciBhc3NpZ25lciA9IGRlbGVnYXRlKHBiZDo6RmlsZURlc2NyaXB0b3Igcm9vdCkgew0KKyAgICAgICAgZGVzY3JpcHRvciA9IHJvb3Q7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3R1dG9yaWFsX1BlcnNvbl9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY190dXRvcmlhbF9QZXJzb25fX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY190dXRvcmlhbF9QZXJzb25fX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJOYW1lIiwgIklkIiwgIkVtYWlsIiwgIlBob25lIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3R1dG9yaWFsX1BlcnNvbl9QaG9uZU51bWJlcl9fRGVzY3JpcHRvciA9IGludGVybmFsX19zdGF0aWNfdHV0b3JpYWxfUGVyc29uX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY190dXRvcmlhbF9QZXJzb25fUGhvbmVOdW1iZXJfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY190dXRvcmlhbF9QZXJzb25fUGhvbmVOdW1iZXJfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJOdW1iZXIiLCAiVHlwZSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY190dXRvcmlhbF9BZGRyZXNzQm9va19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY190dXRvcmlhbF9BZGRyZXNzQm9va19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLkFkZHJlc3NCb29rLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suQWRkcmVzc0Jvb2suQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY190dXRvcmlhbF9BZGRyZXNzQm9va19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIlBlcnNvbiIsIH0pOw0KKyAgICAgICAgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICBSZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5Ow0KKyAgICAgIH07DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oZGVzY3JpcHRvckRhdGEsDQorICAgICAgICAgIG5ldyBwYmQ6OkZpbGVEZXNjcmlwdG9yW10gew0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLkRlc2NyaXB0b3IsIA0KKyAgICAgICAgICB9LCBhc3NpZ25lcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgIH0NCisgICNyZWdpb24gTWVzc2FnZXMNCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgUGVyc29uIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8UGVyc29uLCBQZXJzb24uQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFBlcnNvbigpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQZXJzb24gZGVmYXVsdEluc3RhbmNlID0gbmV3IFBlcnNvbigpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfcGVyc29uRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJlbWFpbCIsICJpZCIsICJuYW1lIiwgInBob25lIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3BlcnNvbkZpZWxkVGFncyA9IG5ldyB1aW50W10geyAyNiwgMTYsIDEwLCAzNCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFBlcnNvbiBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFBlcnNvbiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBQZXJzb24gVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLkFkZHJlc3NCb29rUHJvdG9zLmludGVybmFsX19zdGF0aWNfdHV0b3JpYWxfUGVyc29uX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFBlcnNvbiwgUGVyc29uLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suQWRkcmVzc0Jvb2tQcm90b3MuaW50ZXJuYWxfX3N0YXRpY190dXRvcmlhbF9QZXJzb25fX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgew0KKyAgICAgIHB1YmxpYyBlbnVtIFBob25lVHlwZSB7DQorICAgICAgICBNT0JJTEUgPSAwLA0KKyAgICAgICAgSE9NRSA9IDEsDQorICAgICAgICBXT1JLID0gMiwNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgUGhvbmVOdW1iZXIgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxQaG9uZU51bWJlciwgUGhvbmVOdW1iZXIuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBQaG9uZU51bWJlcigpIHsgfQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUGhvbmVOdW1iZXIgZGVmYXVsdEluc3RhbmNlID0gbmV3IFBob25lTnVtYmVyKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfcGhvbmVOdW1iZXJGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIm51bWJlciIsICJ0eXBlIiB9Ow0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9waG9uZU51bWJlckZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCwgMTYgfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgUGhvbmVOdW1iZXIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFBob25lTnVtYmVyIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLkFkZHJlc3NCb29rUHJvdG9zLmludGVybmFsX19zdGF0aWNfdHV0b3JpYWxfUGVyc29uX1Bob25lTnVtYmVyX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFBob25lTnVtYmVyLCBQaG9uZU51bWJlci5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5BZGRyZXNzQm9va1Byb3Rvcy5pbnRlcm5hbF9fc3RhdGljX3R1dG9yaWFsX1BlcnNvbl9QaG9uZU51bWJlcl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTnVtYmVyRmllbGROdW1iZXIgPSAxOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc051bWJlcjsNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIG51bWJlcl8gPSAiIjsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc051bWJlciB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNOdW1iZXI7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTnVtYmVyIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIG51bWJlcl87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBUeXBlRmllbGROdW1iZXIgPSAyOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc1R5cGU7DQorICAgICAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uVHlwZXMuUGhvbmVUeXBlIHR5cGVfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZVR5cGUuSE9NRTsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc1R5cGUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzVHlwZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uVHlwZXMuUGhvbmVUeXBlIFR5cGUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdHlwZV87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaWYgKCFoYXNOdW1iZXIpIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9waG9uZU51bWJlckZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNOdW1iZXIpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMSwgZmllbGRfbmFtZXNbMF0sIE51bWJlcik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc1R5cGUpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDIsIGZpZWxkX25hbWVzWzFdLCAoaW50KSBUeXBlLCBUeXBlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgDQorICAgICAgICAgIHNpemUgPSAwOw0KKyAgICAgICAgICBpZiAoaGFzTnVtYmVyKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMSwgTnVtYmVyKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzVHlwZSkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgyLCAoaW50KSBUeXBlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFBob25lTnVtYmVyIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBQaG9uZU51bWJlciBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBQaG9uZU51bWJlciBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBQaG9uZU51bWJlciBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBQaG9uZU51bWJlciBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBQaG9uZU51bWJlciBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBQaG9uZU51bWJlciBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpdmF0ZSBQaG9uZU51bWJlciBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoUGhvbmVOdW1iZXIgcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxQaG9uZU51bWJlciwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihQaG9uZU51bWJlciBjbG9uZUZyb20pIHsNCisgICAgICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgICAgICBwcml2YXRlIFBob25lTnVtYmVyIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgUGhvbmVOdW1iZXIgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIFBob25lTnVtYmVyIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBob25lTnVtYmVyKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFBob25lTnVtYmVyIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIuRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgUGhvbmVOdW1iZXIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBQaG9uZU51bWJlciBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgaXMgUGhvbmVOdW1iZXIpIHsNCisgICAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFBob25lTnVtYmVyKSBvdGhlcik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFBob25lTnVtYmVyIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNOdW1iZXIpIHsNCisgICAgICAgICAgICAgIE51bWJlciA9IG90aGVyLk51bWJlcjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc1R5cGUpIHsNCisgICAgICAgICAgICAgIFR5cGUgPSBvdGhlci5UeXBlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9waG9uZU51bWJlckZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX3Bob25lTnVtYmVyRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzTnVtYmVyID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0Lm51bWJlcl8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgICAgICBpZihpbnB1dC5SZWFkRW51bShyZWYgcmVzdWx0LnR5cGVfLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNUeXBlID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5NZXJnZVZhcmludEZpZWxkKDIsICh1bG9uZykoaW50KXVua25vd24pOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICANCisgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzTnVtYmVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc051bWJlcjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgTnVtYmVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk51bWJlcjsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldE51bWJlcih2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXROdW1iZXIoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNOdW1iZXIgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5udW1iZXJfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOdW1iZXIoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzTnVtYmVyID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0Lm51bWJlcl8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzVHlwZSB7DQorICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1R5cGU7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZVR5cGUgVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5UeXBlOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0VHlwZSh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRUeXBlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uVHlwZXMuUGhvbmVUeXBlIHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzVHlwZSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LnR5cGVfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJUeXBlKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc1R5cGUgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQudHlwZV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uLlR5cGVzLlBob25lVHlwZS5IT01FOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgUGhvbmVOdW1iZXIoKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLkFkZHJlc3NCb29rUHJvdG9zLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE5hbWVGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOYW1lOw0KKyAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmFtZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG5hbWVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgSWRGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNJZDsNCisgICAgcHJpdmF0ZSBpbnQgaWRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNJZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0lkOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBJZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGlkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEVtYWlsRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRW1haWw7DQorICAgIHByaXZhdGUgc3RyaW5nIGVtYWlsXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNFbWFpbCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0VtYWlsOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBFbWFpbCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGVtYWlsXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBob25lRmllbGROdW1iZXIgPSA0Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uVHlwZXMuUGhvbmVOdW1iZXI+IHBob25lXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uLlR5cGVzLlBob25lTnVtYmVyPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uLlR5cGVzLlBob25lTnVtYmVyPiBQaG9uZUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwaG9uZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBob25lQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwaG9uZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZU51bWJlciBHZXRQaG9uZShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGhvbmVfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmICghaGFzTmFtZSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgaWYgKCFoYXNJZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZU51bWJlciBlbGVtZW50IGluIFBob25lTGlzdCkgew0KKyAgICAgICAgICBpZiAoIWVsZW1lbnQuSXNJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfcGVyc29uRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzTmFtZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzJdLCBOYW1lKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0lkKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyLCBmaWVsZF9uYW1lc1sxXSwgSWQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRW1haWwpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygzLCBmaWVsZF9uYW1lc1swXSwgRW1haWwpOw0KKyAgICAgIH0NCisgICAgICBpZiAocGhvbmVfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDQsIGZpZWxkX25hbWVzWzNdLCBwaG9uZV8pOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc05hbWUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDEsIE5hbWUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSWQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMiwgSWQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRW1haWwpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDMsIEVtYWlsKTsNCisgICAgICB9DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZU51bWJlciBlbGVtZW50IGluIFBob25lTGlzdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDQsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBQZXJzb24gUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUGVyc29uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFBlcnNvbiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUGVyc29uIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBQZXJzb24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUGVyc29uIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFBlcnNvbiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBQZXJzb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUGVyc29uIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFBlcnNvbiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBQZXJzb24gTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHBob25lXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFBlcnNvbiBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxQZXJzb24sIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFBlcnNvbiBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFBlcnNvbiByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBQZXJzb24gUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBQZXJzb24gb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBQZXJzb24oKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFBlcnNvbiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgUGVyc29uIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBQZXJzb24gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFBlcnNvbikgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChQZXJzb24pIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShQZXJzb24gb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc05hbWUpIHsNCisgICAgICAgICAgTmFtZSA9IG90aGVyLk5hbWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzSWQpIHsNCisgICAgICAgICAgSWQgPSBvdGhlci5JZDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNFbWFpbCkgew0KKyAgICAgICAgICBFbWFpbCA9IG90aGVyLkVtYWlsOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBob25lXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5waG9uZV8uQWRkKG90aGVyLnBob25lXyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9wZXJzb25GaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfcGVyc29uRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTmFtZSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5uYW1lXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0lkID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuaWRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRW1haWwgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZW1haWxfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBob25lXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZU51bWJlci5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNOYW1lIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTmFtZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OYW1lOyB9DQorICAgICAgICBzZXQgeyBTZXROYW1lKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROYW1lKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmFtZSA9IHRydWU7DQorICAgICAgICByZXN1bHQubmFtZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5hbWUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05hbWUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5uYW1lXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0lkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzSWQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBJZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklkOyB9DQorICAgICAgICBzZXQgeyBTZXRJZCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0SWQoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0lkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5pZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhcklkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJZCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmlkXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRW1haWwgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNFbWFpbDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEVtYWlsIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRW1haWw7IH0NCisgICAgICAgIHNldCB7IFNldEVtYWlsKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRFbWFpbChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0VtYWlsID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5lbWFpbF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckVtYWlsKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNFbWFpbCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmVtYWlsXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZU51bWJlcj4gUGhvbmVMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBob25lXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBob25lQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QaG9uZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uLlR5cGVzLlBob25lTnVtYmVyIEdldFBob25lKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQaG9uZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBob25lKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZU51bWJlciB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGhvbmVfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBob25lKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZU51bWJlci5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5waG9uZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGhvbmUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZU51bWJlciB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGhvbmVfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGhvbmUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZU51bWJlci5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5waG9uZV8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBob25lKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZU51bWJlcj4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBob25lXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBob25lKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5waG9uZV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgUGVyc29uKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLkFkZHJlc3NCb29rUHJvdG9zLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQWRkcmVzc0Jvb2sgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxBZGRyZXNzQm9vaywgQWRkcmVzc0Jvb2suQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEFkZHJlc3NCb29rKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFkZHJlc3NCb29rIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBBZGRyZXNzQm9vaygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfYWRkcmVzc0Jvb2tGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInBlcnNvbiIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9hZGRyZXNzQm9va0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NCb29rIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQWRkcmVzc0Jvb2sgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQWRkcmVzc0Jvb2sgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLkFkZHJlc3NCb29rUHJvdG9zLmludGVybmFsX19zdGF0aWNfdHV0b3JpYWxfQWRkcmVzc0Jvb2tfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8QWRkcmVzc0Jvb2ssIEFkZHJlc3NCb29rLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suQWRkcmVzc0Jvb2tQcm90b3MuaW50ZXJuYWxfX3N0YXRpY190dXRvcmlhbF9BZGRyZXNzQm9va19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGVyc29uRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24+IHBlcnNvbl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbj4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbj4gUGVyc29uTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBlcnNvbl87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBlcnNvbkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGVyc29uXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uIEdldFBlcnNvbihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGVyc29uX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uIGVsZW1lbnQgaW4gUGVyc29uTGlzdCkgew0KKyAgICAgICAgICBpZiAoIWVsZW1lbnQuSXNJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfYWRkcmVzc0Jvb2tGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChwZXJzb25fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDEsIGZpZWxkX25hbWVzWzBdLCBwZXJzb25fKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24gZWxlbWVudCBpbiBQZXJzb25MaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMSwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NCb29rIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NCb29rIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NCb29rIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZGRyZXNzQm9vayBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc0Jvb2sgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc0Jvb2sgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc0Jvb2sgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc0Jvb2sgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc0Jvb2sgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc0Jvb2sgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgQWRkcmVzc0Jvb2sgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHBlcnNvbl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihBZGRyZXNzQm9vayBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxBZGRyZXNzQm9vaywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoQWRkcmVzc0Jvb2sgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBBZGRyZXNzQm9vayByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBBZGRyZXNzQm9vayBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEFkZHJlc3NCb29rIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgQWRkcmVzc0Jvb2soKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEFkZHJlc3NCb29rIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLkFkZHJlc3NCb29rLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEFkZHJlc3NCb29rIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5BZGRyZXNzQm9vay5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEFkZHJlc3NCb29rIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBBZGRyZXNzQm9vaykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChBZGRyZXNzQm9vaykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEFkZHJlc3NCb29rIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLkFkZHJlc3NCb29rLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLnBlcnNvbl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGVyc29uXy5BZGQob3RoZXIucGVyc29uXyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9hZGRyZXNzQm9va0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9hZGRyZXNzQm9va0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wZXJzb25fLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbj4gUGVyc29uTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wZXJzb25fOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGVyc29uQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QZXJzb25Db3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbiBHZXRQZXJzb24oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBlcnNvbihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBlcnNvbihpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBlcnNvbl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGVyc29uKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wZXJzb25fW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBlcnNvbihnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wZXJzb25fLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGVyc29uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGVyc29uXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGVyc29uKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbj4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBlcnNvbl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQZXJzb24oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBlcnNvbl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgQWRkcmVzc0Jvb2soKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2suQWRkcmVzc0Jvb2tQcm90b3MuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorfQ0KKw0KKyNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL0xpc3RQZW9wbGUuY3MgYi9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL0xpc3RQZW9wbGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2ZjUyZAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svTGlzdFBlb3BsZS5jcwpAQCAtMCwwICsxLDEwMyBAQAor77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uSU87DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2sNCit7DQorICAgIGludGVybmFsIGNsYXNzIExpc3RQZW9wbGUNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEl0ZXJhdGVzIHRob3VnaCBhbGwgcGVvcGxlIGluIHRoZSBBZGRyZXNzQm9vayBhbmQgcHJpbnRzIGluZm8gYWJvdXQgdGhlbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFByaW50KEFkZHJlc3NCb29rIGFkZHJlc3NCb29rKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKFBlcnNvbiBwZXJzb24gaW4gYWRkcmVzc0Jvb2suUGVyc29uTGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJQZXJzb24gSUQ6IHswfSIsIHBlcnNvbi5JZCk7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIE5hbWU6IHswfSIsIHBlcnNvbi5OYW1lKTsNCisgICAgICAgICAgICAgICAgaWYgKHBlcnNvbi5IYXNFbWFpbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgRS1tYWlsIGFkZHJlc3M6IHswfSIsIHBlcnNvbi5FbWFpbCk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoUGVyc29uLlR5cGVzLlBob25lTnVtYmVyIHBob25lTnVtYmVyIGluIHBlcnNvbi5QaG9uZUxpc3QpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGhvbmVOdW1iZXIuVHlwZSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBlcnNvbi5UeXBlcy5QaG9uZVR5cGUuTU9CSUxFOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgIE1vYmlsZSBwaG9uZSAjOiAiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQZXJzb24uVHlwZXMuUGhvbmVUeXBlLkhPTUU6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiAgSG9tZSBwaG9uZSAjOiAiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQZXJzb24uVHlwZXMuUGhvbmVUeXBlLldPUks6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiAgV29yayBwaG9uZSAjOiAiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShwaG9uZU51bWJlci5OdW1iZXIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEVudHJ5IHBvaW50IC0gbG9hZHMgdGhlIGFkZHJlc3Nib29rIGFuZCB0aGVuIGRpc3BsYXlzIGl0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IE1haW4oc3RyaW5nW10gYXJncykNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggIT0gMSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJVc2FnZTogIExpc3RQZW9wbGUgQUREUkVTU19CT09LX0ZJTEUiKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmICghRmlsZS5FeGlzdHMoYXJnc1swXSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiezB9IGRvZXNuJ3QgZXhpc3QuIEFkZCBhIHBlcnNvbiB0byBjcmVhdGUgdGhlIGZpbGUgZmlyc3QuIiwgYXJnc1swXSk7DQorICAgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBSZWFkIHRoZSBleGlzdGluZyBhZGRyZXNzIGJvb2suDQorICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBzdHJlYW0gPSBGaWxlLk9wZW5SZWFkKGFyZ3NbMF0pKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQWRkcmVzc0Jvb2sgYWRkcmVzc0Jvb2sgPSBBZGRyZXNzQm9vay5QYXJzZUZyb20oc3RyZWFtKTsNCisgICAgICAgICAgICAgICAgUHJpbnQoYWRkcmVzc0Jvb2spOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL1Byb2dyYW0uY3MgYi9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkNmQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDk5IEBACivvu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4YW1wbGVzLkFkZHJlc3NCb29rDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBFbnRyeSBwb2ludC4gUmVwZWF0ZWRseSBwcm9tcHRzIHVzZXIgZm9yIGFuIGFjdGlvbiB0byB0YWtlLCBkZWxlZ2F0aW5nIGFjdHVhbCBiZWhhdmlvdXINCisgICAgLy8vIHRvIGluZGl2aWR1YWwgYWN0aW9ucy4gRWFjaCBhY3Rpb24gaGFzIGl0cyBvd24gTWFpbiBtZXRob2QsIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYXMgYW4NCisgICAgLy8vIGludmlkdWFsIGNvbXBsZXRlIHByb2dyYW0uDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIGludGVybmFsIGNsYXNzIFByb2dyYW0NCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IE1haW4oc3RyaW5nW10gYXJncykNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggPiAxKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIlVzYWdlOiBBZGRyZXNzQm9vayBbZmlsZV0iKTsNCisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIklmIHRoZSBmaWxlbmFtZSBpc24ndCBzcGVjaWZpZWQsIFwiYWRkcmVzc2Jvb2suZGF0YVwiIGlzIHVzZWQgaW5zdGVhZC4iKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHN0cmluZyBhZGRyZXNzQm9va0ZpbGUgPSBhcmdzLkxlbmd0aCA+IDAgPyBhcmdzWzBdIDogImFkZHJlc3Nib29rLmRhdGEiOw0KKw0KKyAgICAgICAgICAgIGJvb2wgc3RvcHBpbmcgPSBmYWxzZTsNCisgICAgICAgICAgICB3aGlsZSAoIXN0b3BwaW5nKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIk9wdGlvbnM6Iik7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIEw6IExpc3QgY29udGVudHMiKTsNCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgQTogQWRkIG5ldyBwZXJzb24iKTsNCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgUTogUXVpdCIpOw0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJBY3Rpb24/ICIpOw0KKyAgICAgICAgICAgICAgICBDb25zb2xlLk91dC5GbHVzaCgpOw0KKyAgICAgICAgICAgICAgICBjaGFyIGNob2ljZSA9IENvbnNvbGUuUmVhZEtleSgpLktleUNoYXI7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7DQorICAgICAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNob2ljZSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBJzoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUGVyc29uLk1haW4obmV3IHN0cmluZ1tdIHthZGRyZXNzQm9va0ZpbGV9KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTCc6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbCc6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RQZW9wbGUuTWFpbihuZXcgc3RyaW5nW10ge2FkZHJlc3NCb29rRmlsZX0pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdRJzoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdxJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHBpbmcgPSB0cnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVW5rbm93biBvcHRpb246IHswfSIsIGNob2ljZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4Y2VwdGlvbiBleGVjdXRpbmcgYWN0aW9uOiB7MH0iLCBlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvY3NoYXJwL3NyYy9BZGRyZXNzQm9vay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWM0MGRjCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9BZGRyZXNzQm9vay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDI5IEBACit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQorDQorLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyANCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbg0KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4NCisNCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkFkZHJlc3NCb29rIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJBZGRyZXNzQm9vayIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAgMjAwOCIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0NCisNCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOg0KKy8vDQorLy8gICAgICBNYWpvciBWZXJzaW9uDQorLy8gICAgICBNaW5vciBWZXJzaW9uIA0KKy8vICAgICAgQnVpbGQgTnVtYmVyDQorLy8gICAgICBSZXZpc2lvbg0KKy8vDQorLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMgDQorLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoNCisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMi40LjEuNTU1IildDQorDQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjIuNC4xLjU1NSIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMi40LjEuNTU1IildClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9BZGRyZXNzQm9vay9TYW1wbGVVc2FnZS5jcyBiL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svU2FtcGxlVXNhZ2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0YjE2NQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svU2FtcGxlVXNhZ2UuY3MKQEAgLTAsMCArMSw0NCBAQAor77u/dXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5JTzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vaw0KK3sNCisgICAgaW50ZXJuYWwgY2xhc3MgU2FtcGxlVXNhZ2UNCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBNYWluKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBieXRlW10gYnl0ZXM7DQorICAgICAgICAgICAgLy9DcmVhdGUgYSBidWlsZGVyIHRvIHN0YXJ0IGJ1aWxkaW5nIGEgbWVzc2FnZQ0KKyAgICAgICAgICAgIFBlcnNvbi5CdWlsZGVyIG5ld0NvbnRhY3QgPSBQZXJzb24uQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIC8vU2V0IHRoZSBwcmltaXRpdmUgcHJvcGVydGllcw0KKyAgICAgICAgICAgIG5ld0NvbnRhY3QuU2V0SWQoMSkNCisgICAgICAgICAgICAgICAgLlNldE5hbWUoIkZvbyIpDQorICAgICAgICAgICAgICAgIC5TZXRFbWFpbCgiZm9vQGJhciIpOw0KKyAgICAgICAgICAgIC8vTm93IGFkZCBhbiBpdGVtIHRvIGEgbGlzdCAocmVwZWF0aW5nKSBmaWVsZA0KKyAgICAgICAgICAgIG5ld0NvbnRhY3QuQWRkUGhvbmUoDQorICAgICAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBjaGlsZCBtZXNzYWdlIGlubGluZQ0KKyAgICAgICAgICAgICAgICBQZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIuQ3JlYXRlQnVpbGRlcigpLlNldE51bWJlcigiNTU1LTEyMTIiKS5CdWlsZCgpDQorICAgICAgICAgICAgICAgICk7DQorICAgICAgICAgICAgLy9Ob3cgYnVpbGQgdGhlIGZpbmFsIG1lc3NhZ2U6DQorICAgICAgICAgICAgUGVyc29uIHBlcnNvbiA9IG5ld0NvbnRhY3QuQnVpbGQoKTsNCisgICAgICAgICAgICAvL1RoZSBidWlsZGVyIGlzIG5vIGxvbmdlciB2YWxpZCAoYXQgbGVhc3Qgbm90IG5vdywgc2NoZWR1bGVkIGZvciAyLjQpOg0KKyAgICAgICAgICAgIG5ld0NvbnRhY3QgPSBudWxsOw0KKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy9TYXZlIHRoZSBwZXJzb24gdG8gYSBzdHJlYW0NCisgICAgICAgICAgICAgICAgcGVyc29uLldyaXRlVG8oc3RyZWFtKTsNCisgICAgICAgICAgICAgICAgYnl0ZXMgPSBzdHJlYW0uVG9BcnJheSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICAvL0NyZWF0ZSBhbm90aGVyIGJ1aWxkZXIsIG1lcmdlIHRoZSBieXRlW10sIGFuZCBidWlsZCB0aGUgbWVzc2FnZToNCisgICAgICAgICAgICBQZXJzb24gY29weSA9IFBlcnNvbi5DcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGJ5dGVzKS5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIC8vQSBtb3JlIHN0cmVhbWxpbmVkIGFwcHJvYWNoIG1pZ2h0IGxvb2sgbGlrZSB0aGlzOg0KKyAgICAgICAgICAgIGJ5dGVzID0gQWRkcmVzc0Jvb2suQ3JlYXRlQnVpbGRlcigpLkFkZFBlcnNvbihjb3B5KS5CdWlsZCgpLlRvQnl0ZUFycmF5KCk7DQorICAgICAgICAgICAgLy9BbmQgcmVhZCB0aGUgYWRkcmVzcyBib29rIGJhY2sgYWdhaW4NCisgICAgICAgICAgICBBZGRyZXNzQm9vayByZXN0b3JlZCA9IEFkZHJlc3NCb29rLkNyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oYnl0ZXMpLkJ1aWxkKCk7DQorICAgICAgICAgICAgLy9UaGUgbWVzc2FnZSBwZXJmb3JtcyBhIGRlZXAtY29tcGFyaXNvbiBvbiBlcXVhbGl0eToNCisgICAgICAgICAgICBpZiAocmVzdG9yZWQuUGVyc29uQ291bnQgIT0gMSB8fCAhcGVyc29uLkVxdWFscyhyZXN0b3JlZC5QZXJzb25MaXN0WzBdKSkNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKCJUaGVyZSBpcyBhIGJhZCBwZXJzb24gaW4gaGVyZSEiKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL2FwcC5jb25maWcgYi9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL2FwcC5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmNzgzMgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svYXBwLmNvbmZpZwpAQCAtMCwwICsxLDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPGNvbmZpZ3VyYXRpb24+CisJPHN0YXJ0dXAvPjwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9CZW5jaC9Qcm9ncmFtLmNzIGIvY3NoYXJwL3NyYy9Qcm90b0JlbmNoL1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwZmMxMgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9CZW5jaC9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNTM4IEBACivvu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Kc29uOw0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7DQordXNpbmcgU3lzdGVtLlhtbDsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb247DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2gNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFNpbXBsZSBiZW5jaG1hcmtpbmcgb2YgYXJiaXRyYXJ5IG1lc3NhZ2VzLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIFByb2dyYW0NCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVGltZVNwYW4gTWluU2FtcGxlVGltZSA9IFRpbWVTcGFuLkZyb21TZWNvbmRzKDIpOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVGltZVNwYW4gVGFyZ2V0VGltZSA9IFRpbWVTcGFuLkZyb21TZWNvbmRzKDMwKTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgVmVyYm9zZSA9IGZhbHNlLCBGYXN0VGVzdCA9IGZhbHNlLCBPdGhlckZvcm1hdHMgPSBmYWxzZTsNCisgICAgICAgIC8vIEF2b2lkIGEgLk5FVCAzLjUgZGVwZW5kZW5jeQ0KKyAgICAgICAgcHJpdmF0ZSBkZWxlZ2F0ZSB2b2lkIEFjdGlvbigpOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBkZWxlZ2F0ZSB2b2lkIEJlbmNobWFya1Rlc3Qoc3RyaW5nIG5hbWUsIGxvbmcgZGF0YVNpemUsIEFjdGlvbiBhY3Rpb24pOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQmVuY2htYXJrVGVzdCBSdW5CZW5jaG1hcms7DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgX2xvZ0ZpbGU7DQorICAgICAgICBzdGF0aWMgdm9pZCBXcml0ZUxpbmUoc3RyaW5nIGZvcm1hdCwgcGFyYW1zIG9iamVjdFtdIGFyZykNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoYXJnLkxlbmd0aCA+IDApIGZvcm1hdCA9IFN0cmluZy5Gb3JtYXQoZm9ybWF0LCBhcmcpOw0KKyAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZShmb3JtYXQpOw0KKyAgICAgICAgICAgIGlmICghU3RyaW5nLklzTnVsbE9yRW1wdHkoX2xvZ0ZpbGUpKQ0KKyAgICAgICAgICAgICAgICBGaWxlLkFwcGVuZEFsbFRleHQoX2xvZ0ZpbGUsIGZvcm1hdCArIEVudmlyb25tZW50Lk5ld0xpbmUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1NUQVRocmVhZF0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IE1haW4oc3RyaW5nW10gYXJncykNCisgICAgICAgIHsNCisgICAgICAgICAgICBMaXN0PHN0cmluZz4gdGVtcCA9IG5ldyBMaXN0PHN0cmluZz4oYXJncyk7DQorDQorICAgICAgICAgICAgVmVyYm9zZSA9IHRlbXAuUmVtb3ZlKCIvdmVyYm9zZSIpIHx8IHRlbXAuUmVtb3ZlKCItdmVyYm9zZSIpOw0KKyAgICAgICAgICAgIE90aGVyRm9ybWF0cyA9IHRlbXAuUmVtb3ZlKCIvZm9ybWF0cyIpIHx8IHRlbXAuUmVtb3ZlKCItZm9ybWF0cyIpOw0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBhcmcgaW4gdGVtcCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChhcmcuU3RhcnRzV2l0aCgiL2xvZzoiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSB8fCBhcmcuU3RhcnRzV2l0aCgiLWxvZzoiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgX2xvZ0ZpbGUgPSBhcmcuU3Vic3RyaW5nKDUpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFTdHJpbmcuSXNOdWxsT3JFbXB0eShfbG9nRmlsZSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5BcHBlbmRBbGxUZXh0KF9sb2dGaWxlLCBFbnZpcm9ubWVudC5OZXdMaW5lICsgIlN0YXJ0ZWQgYmVuY2htYXJrcyBhdCAiICsgRGF0ZVRpbWUuTm93ICsgRW52aXJvbm1lbnQuTmV3TGluZSk7DQorICAgICAgICAgICAgICAgICAgICB0ZW1wLlJlbW92ZShhcmcpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHRydWUgPT0gKEZhc3RUZXN0ID0gKHRlbXAuUmVtb3ZlKCIvZmFzdCIpIHx8IHRlbXAuUmVtb3ZlKCItZmFzdCIpKSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBUYXJnZXRUaW1lID0gVGltZVNwYW4uRnJvbVNlY29uZHMoMTApOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBSdW5CZW5jaG1hcmsgPSBCZW5jaG1hcmtWMTsNCisgICAgICAgICAgICBpZiAodGVtcC5SZW1vdmUoIi92MiIpIHx8IHRlbXAuUmVtb3ZlKCItdjIiKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFByb2Nlc3MuR2V0Q3VycmVudFByb2Nlc3MoKS5Qcmlvcml0eUNsYXNzID0gUHJvY2Vzc1ByaW9yaXR5Q2xhc3MuUmVhbFRpbWU7DQorICAgICAgICAgICAgICAgIFByb2Nlc3MuR2V0Q3VycmVudFByb2Nlc3MoKS5Qcm9jZXNzb3JBZmZpbml0eSA9IG5ldyBJbnRQdHIoMSk7DQorICAgICAgICAgICAgICAgIFJ1bkJlbmNobWFyayA9IEJlbmNobWFya1YyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAodGVtcC5SZW1vdmUoIi9hbGwiKSB8fCB0ZW1wLlJlbW92ZSgiLWFsbCIpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKEZhc3RUZXN0KQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBUYXJnZXRUaW1lID0gVGltZVNwYW4uRnJvbVNlY29uZHMoNSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPHN0cmluZywgc3RyaW5nPiBpdGVtIGluIE1ha2VUZXN0cygpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0ZW1wLkFkZChpdGVtLktleSk7DQorICAgICAgICAgICAgICAgICAgICB0ZW1wLkFkZChpdGVtLlZhbHVlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBhcmdzID0gdGVtcC5Ub0FycmF5KCk7DQorDQorICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoIDwgMiB8fCAoYXJncy5MZW5ndGglMikgIT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJVc2FnZTogUHJvdG9CZW5jaCBbL2Zhc3RdIDxkZXNjcmlwdG9yIHR5cGUgbmFtZT4gPGlucHV0IGRhdGE+Iik7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJUaGUgZGVzY3JpcHRvciB0eXBlIG5hbWUgaXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBtZXNzYWdlIG5hbWUsIik7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKA0KKyAgICAgICAgICAgICAgICAgICAgImluY2x1ZGluZyBhc3NlbWJseSAtIGUuZy4gR29vZ2xlLlByb3RvY29sQnVmZmVycy5CZW5jaG1hcmtQcm90b3MuTWVzc2FnZTEsUHJvdG9CZW5jaCIpOw0KKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgiKFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSBwYWlycyBvZiBkZXNjcmlwdG9yIHR5cGUgbmFtZSBhbmQgaW5wdXQgZGF0YS4pIik7DQorICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5MZW5ndGg7IGkgKz0gMikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHN1Y2Nlc3MgJj0gUnVuVGVzdChhcmdzW2ldLCBhcmdzW2kgKyAxXSwgbnVsbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBzdWNjZXNzID8gMCA6IDE7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUnVucyBhIHNpbmdsZSB0ZXN0LiBFcnJvciBtZXNzYWdlcyBhcmUgZGlzcGxheWVkIHRvIENvbnNvbGUuRXJyb3IsIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcw0KKyAgICAgICAgLy8vIGdlbmVyYWwgc3VjY2Vzcy9mYWlsdXJlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBSdW5UZXN0KHN0cmluZyB0eXBlTmFtZSwgc3RyaW5nIGZpbGUsIGJ5dGVbXSBpbnB1dERhdGEpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVMaW5lKCJCZW5jaG1hcmtpbmcgezB9IHdpdGggZmlsZSB7MX0iLCB0eXBlTmFtZSwgZmlsZSk7DQorICAgICAgICAgICAgSU1lc3NhZ2UgZGVmYXVsdE1lc3NhZ2U7DQorICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZSA9IE1lc3NhZ2VVdGlsLkdldERlZmF1bHRNZXNzYWdlKHR5cGVOYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKEFyZ3VtZW50RXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZShlLk1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5FbXB0eTsNCisgICAgICAgICAgICAgICAgaW5wdXREYXRhID0gaW5wdXREYXRhID8/IEZpbGUuUmVhZEFsbEJ5dGVzKGZpbGUpOw0KKyAgICAgICAgICAgICAgICBNZW1vcnlTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKGlucHV0RGF0YSk7DQorICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcgaW5wdXRTdHJpbmcgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKGlucHV0RGF0YSk7DQorICAgICAgICAgICAgICAgIElNZXNzYWdlIHNhbXBsZU1lc3NhZ2UgPQ0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2UuV2Vha0NyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkuV2Vha01lcmdlRnJvbShpbnB1dFN0cmluZywgcmVnaXN0cnkpLldlYWtCdWlsZCgpOw0KKw0KKyAgICAgICAgICAgICAgICBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gZGljdGlvbmFyeSA9IG51bGw7DQorICAgICAgICAgICAgICAgIGJ5dGVbXSBqc29uQnl0ZXMgPSBudWxsLCB4bWxCeXRlcyA9IG51bGw7IC8qbm8gcHVuIGludGVuZGVkLCB3ZWxsLi4uIG1heWJlIGZvciB4bWwqLw0KKyAgICAgICAgICAgICAgICBpZiAoT3RoZXJGb3JtYXRzKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIHRlbXAgPSBuZXcgTWVtb3J5U3RyZWFtKCkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgWG1sRm9ybWF0V3JpdGVyLkNyZWF0ZUluc3RhbmNlKHRlbXApLldyaXRlTWVzc2FnZShzYW1wbGVNZXNzYWdlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB4bWxCeXRlcyA9IHRlbXAuVG9BcnJheSgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSB0ZW1wID0gbmV3IE1lbW9yeVN0cmVhbSgpKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEpzb25Gb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2UodGVtcCkuV3JpdGVNZXNzYWdlKHNhbXBsZU1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGpzb25CeXRlcyA9IHRlbXAuVG9BcnJheSgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PihTdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5V3JpdGVyKGRpY3Rpb25hcnkpLldyaXRlTWVzc2FnZShzYW1wbGVNZXNzYWdlKTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAvL1NlcmlhbGl6ZXJzDQorICAgICAgICAgICAgICAgIGlmICghRmFzdFRlc3QpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFJ1bkJlbmNobWFyaygiU2VyaWFsaXplIHRvIGJ5dGUgc3RyaW5nIiwgaW5wdXREYXRhLkxlbmd0aCwgKCkgPT4gc2FtcGxlTWVzc2FnZS5Ub0J5dGVTdHJpbmcoKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgUnVuQmVuY2htYXJrKCJTZXJpYWxpemUgdG8gYnl0ZSBhcnJheSIsIGlucHV0RGF0YS5MZW5ndGgsICgpID0+IHNhbXBsZU1lc3NhZ2UuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICAgICAgICAgIGlmICghRmFzdFRlc3QpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFJ1bkJlbmNobWFyaygiU2VyaWFsaXplIHRvIG1lbW9yeSBzdHJlYW0iLCBpbnB1dERhdGEuTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHNhbXBsZU1lc3NhZ2UuV3JpdGVUbyhuZXcgTWVtb3J5U3RyZWFtKCkpKTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBpZiAoT3RoZXJGb3JtYXRzKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBSdW5CZW5jaG1hcmsoIlNlcmlhbGl6ZSB0byB4bWwiLCB4bWxCeXRlcy5MZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRm9ybWF0V3JpdGVyLkNyZWF0ZUluc3RhbmNlKG5ldyBNZW1vcnlTdHJlYW0oKSwgRW5jb2RpbmcuVVRGOCkuV3JpdGVNZXNzYWdlKHNhbXBsZU1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCisgICAgICAgICAgICAgICAgICAgIFJ1bkJlbmNobWFyaygiU2VyaWFsaXplIHRvIGpzb24iLCBqc29uQnl0ZXMuTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHsgSnNvbkZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZSgpLldyaXRlTWVzc2FnZShzYW1wbGVNZXNzYWdlKTsgfSk7DQorICAgICAgICAgICAgICAgICAgICBSdW5CZW5jaG1hcmsoIlNlcmlhbGl6ZSB0byBqc29uIHZpYSB4bWwiLCBqc29uQnl0ZXMuTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRm9ybWF0V3JpdGVyLkNyZWF0ZUluc3RhbmNlKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc29uUmVhZGVyV3JpdGVyRmFjdG9yeS5DcmVhdGVKc29uV3JpdGVyKG5ldyBNZW1vcnlTdHJlYW0oKSwgRW5jb2RpbmcuVVRGOCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRPcHRpb25zKFhtbFdyaXRlck9wdGlvbnMuT3V0cHV0SnNvblR5cGVzKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV3JpdGVNZXNzYWdlKHNhbXBsZU1lc3NhZ2UpDQorICAgICAgICAgICAgICAgICAgICAgICAgKTsNCisNCisgICAgICAgICAgICAgICAgICAgIFJ1bkJlbmNobWFyaygiU2VyaWFsaXplIHRvIGRpY3Rpb25hcnkiLCBzYW1wbGVNZXNzYWdlLlNlcmlhbGl6ZWRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IG5ldyBEaWN0aW9uYXJ5V3JpdGVyKCkuV3JpdGVNZXNzYWdlKHNhbXBsZU1lc3NhZ2UpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAvL0Rlc2VyaWFsaXplcnMNCisgICAgICAgICAgICAgICAgaWYgKCFGYXN0VGVzdCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgUnVuQmVuY2htYXJrKCJEZXNlcmlhbGl6ZSBmcm9tIGJ5dGUgc3RyaW5nIiwgaW5wdXREYXRhLkxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiBkZWZhdWx0TWVzc2FnZS5XZWFrQ3JlYXRlQnVpbGRlckZvclR5cGUoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2Vha01lcmdlRnJvbShpbnB1dFN0cmluZywgcmVnaXN0cnkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XZWFrQnVpbGQoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgUnVuQmVuY2htYXJrKCJEZXNlcmlhbGl6ZSBmcm9tIGJ5dGUgYXJyYXkiLCBpbnB1dERhdGEuTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gZGVmYXVsdE1lc3NhZ2UuV2Vha0NyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2Vha01lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKGlucHV0RGF0YSksIHJlZ2lzdHJ5KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XZWFrQnVpbGQoKQ0KKyAgICAgICAgICAgICAgICAgICAgKTsNCisgICAgICAgICAgICAgICAgaWYgKCFGYXN0VGVzdCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgUnVuQmVuY2htYXJrKCJEZXNlcmlhbGl6ZSBmcm9tIG1lbW9yeSBzdHJlYW0iLCBpbnB1dERhdGEuTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLlBvc2l0aW9uID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlLldlYWtDcmVhdGVCdWlsZGVyRm9yVHlwZSgpLldlYWtNZXJnZUZyb20oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShpbnB1dFN0cmVhbSksIHJlZ2lzdHJ5KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XZWFrQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgaWYgKE90aGVyRm9ybWF0cykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgUnVuQmVuY2htYXJrKCJEZXNlcmlhbGl6ZSBmcm9tIHhtbCIsIHhtbEJ5dGVzLkxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZSh4bWxCeXRlcykuTWVyZ2UoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlLldlYWtDcmVhdGVCdWlsZGVyRm9yVHlwZSgpKS5XZWFrQnVpbGQoKSk7DQorICAgICAgICAgICAgICAgICAgICBSdW5CZW5jaG1hcmsoIkRlc2VyaWFsaXplIGZyb20ganNvbiIsIGpzb25CeXRlcy5MZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc29uRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKGpzb25CeXRlcykuTWVyZ2UoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlLldlYWtDcmVhdGVCdWlsZGVyRm9yVHlwZSgpKS5XZWFrQnVpbGQoKSk7DQorICAgICAgICAgICAgICAgICAgICBSdW5CZW5jaG1hcmsoIkRlc2VyaWFsaXplIGZyb20ganNvbiB2aWEgeG1sIiwganNvbkJ5dGVzLkxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZShKc29uUmVhZGVyV3JpdGVyRmFjdG9yeS5DcmVhdGVKc29uUmVhZGVyKGpzb25CeXRlcywgWG1sRGljdGlvbmFyeVJlYWRlclF1b3Rhcy5NYXgpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2V0T3B0aW9ucyhYbWxSZWFkZXJPcHRpb25zLlJlYWROZXN0ZWRBcnJheXMpLk1lcmdlKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2UuV2Vha0NyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkpLldlYWtCdWlsZCgpKTsNCisNCisgICAgICAgICAgICAgICAgICAgIFJ1bkJlbmNobWFyaygiRGVzZXJpYWxpemUgZnJvbSBkaWN0aW9uYXJ5Iiwgc2FtcGxlTWVzc2FnZS5TZXJpYWxpemVkU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5UmVhZGVyKGRpY3Rpb25hcnkpLk1lcmdlKGRlZmF1bHRNZXNzYWdlLldlYWtDcmVhdGVCdWlsZGVyRm9yVHlwZSgpKS4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2Vha0J1aWxkKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIFdyaXRlTGluZShTdHJpbmcuRW1wdHkpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIkVycm9yOiB7MH0iLCBlLk1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgiRGV0YWlsZWQgZXhjZXB0aW9uIGluZm9ybWF0aW9uOiB7MH0iLCBlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQmVuY2htYXJrVjIoc3RyaW5nIG5hbWUsIGxvbmcgZGF0YVNpemUsIEFjdGlvbiBhY3Rpb24pDQorICAgICAgICB7DQorICAgICAgICAgICAgVGhyZWFkLkJlZ2luVGhyZWFkQWZmaW5pdHkoKTsNCisgICAgICAgICAgICBUaW1lU3BhbiBlbGFwc2VkID0gVGltZVNwYW4uWmVybzsNCisgICAgICAgICAgICBsb25nIHJ1bnMgPSAwOw0KKyAgICAgICAgICAgIGxvbmcgdG90YWxDb3VudCA9IDA7DQorICAgICAgICAgICAgZG91YmxlIGJlc3QgPSBkb3VibGUuTWluVmFsdWUsIHdvcnN0ID0gZG91YmxlLk1heFZhbHVlOw0KKw0KKyAgICAgICAgICAgIGFjdGlvbigpOw0KKyAgICAgICAgICAgIC8vIFJ1biBpdCBwcm9ncmVzc2l2ZWx5IG1vcmUgdGltZXMgdW50aWwgd2UndmUgZ290IGEgcmVhc29uYWJsZSBzYW1wbGUNCisNCisgICAgICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IDEwMDsNCisgICAgICAgICAgICBlbGFwc2VkID0gVGltZUFjdGlvbihhY3Rpb24sIGl0ZXJhdGlvbnMpOw0KKyAgICAgICAgICAgIHdoaWxlIChlbGFwc2VkLlRvdGFsTWlsbGlzZWNvbmRzIDwgMTAwMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGVsYXBzZWQgKz0gVGltZUFjdGlvbihhY3Rpb24sIGl0ZXJhdGlvbnMpOw0KKyAgICAgICAgICAgICAgICBpdGVyYXRpb25zICo9IDI7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIFRpbWVTcGFuIHRhcmdldCA9IFRpbWVTcGFuLkZyb21TZWNvbmRzKDEpOw0KKw0KKyAgICAgICAgICAgIGVsYXBzZWQgPSBUaW1lQWN0aW9uKGFjdGlvbiwgaXRlcmF0aW9ucyk7DQorICAgICAgICAgICAgaXRlcmF0aW9ucyA9IChpbnQpICgodGFyZ2V0LlRpY2tzKml0ZXJhdGlvbnMpLyhkb3VibGUpIGVsYXBzZWQuVGlja3MpOw0KKyAgICAgICAgICAgIGVsYXBzZWQgPSBUaW1lQWN0aW9uKGFjdGlvbiwgaXRlcmF0aW9ucyk7DQorICAgICAgICAgICAgaXRlcmF0aW9ucyA9IChpbnQpICgodGFyZ2V0LlRpY2tzKml0ZXJhdGlvbnMpLyhkb3VibGUpIGVsYXBzZWQuVGlja3MpOw0KKyAgICAgICAgICAgIGVsYXBzZWQgPSBUaW1lQWN0aW9uKGFjdGlvbiwgaXRlcmF0aW9ucyk7DQorICAgICAgICAgICAgaXRlcmF0aW9ucyA9IChpbnQpICgodGFyZ2V0LlRpY2tzKml0ZXJhdGlvbnMpLyhkb3VibGUpIGVsYXBzZWQuVGlja3MpOw0KKw0KKyAgICAgICAgICAgIGRvdWJsZSBmaXJzdCA9IChpdGVyYXRpb25zKmRhdGFTaXplKS8oZWxhcHNlZC5Ub3RhbFNlY29uZHMqMTAyNCoxMDI0KTsNCisgICAgICAgICAgICBpZiAoVmVyYm9zZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlTGluZSgiUm91bmQgLS0tOiBDb3VudCA9IHsxLDZ9LCBCcHMgPSB7Miw4OmYzfSIsIDAsIGl0ZXJhdGlvbnMsIGZpcnN0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxhcHNlZCA9IFRpbWVTcGFuLlplcm87DQorICAgICAgICAgICAgaW50IG1heCA9IChpbnQpIFRhcmdldFRpbWUuVG90YWxTZWNvbmRzOw0KKw0KKyAgICAgICAgICAgIHdoaWxlIChydW5zIDwgbWF4KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVGltZVNwYW4gY3ljbGUgPSBUaW1lQWN0aW9uKGFjdGlvbiwgaXRlcmF0aW9ucyk7DQorICAgICAgICAgICAgICAgIC8vIEFjY3VtdWxhdGUgYW5kIHNjYWxlIGZvciBuZXh0IGN5Y2xlLg0KKw0KKyAgICAgICAgICAgICAgICBkb3VibGUgYnBzID0gKGl0ZXJhdGlvbnMqZGF0YVNpemUpLyhjeWNsZS5Ub3RhbFNlY29uZHMqMTAyNCoxMDI0KTsNCisgICAgICAgICAgICAgICAgaWYgKFZlcmJvc2UpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlTGluZSgiUm91bmQgezEsM306IENvdW50ID0gezIsNn0sIEJwcyA9IHszLDg6ZjN9IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHJ1bnMsIGl0ZXJhdGlvbnMsIGJwcyk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgYmVzdCA9IE1hdGguTWF4KGJlc3QsIGJwcyk7DQorICAgICAgICAgICAgICAgIHdvcnN0ID0gTWF0aC5NaW4od29yc3QsIGJwcyk7DQorDQorICAgICAgICAgICAgICAgIHJ1bnMrKzsNCisgICAgICAgICAgICAgICAgZWxhcHNlZCArPSBjeWNsZTsNCisgICAgICAgICAgICAgICAgdG90YWxDb3VudCArPSBpdGVyYXRpb25zOw0KKyAgICAgICAgICAgICAgICBpdGVyYXRpb25zID0gKGludCkgKCh0YXJnZXQuVGlja3MqdG90YWxDb3VudCkvKGRvdWJsZSkgZWxhcHNlZC5UaWNrcyk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIFRocmVhZC5FbmRUaHJlYWRBZmZpbml0eSgpOw0KKyAgICAgICAgICAgIFdyaXRlTGluZSgNCisgICAgICAgICAgICAgICAgInsxfTogYXZlcmFnZXMgezJ9IHBlciB7MzpmM31zIGZvciB7NH0gcnVuczsgYXZnOiB7NTpmM31tYnBzOyBiZXN0OiB7NjpmM31tYnBzOyB3b3JzdDogezc6ZjN9bWJwcyIsDQorICAgICAgICAgICAgICAgIDAsIG5hbWUsIHRvdGFsQ291bnQvcnVucywgZWxhcHNlZC5Ub3RhbFNlY29uZHMvcnVucywgcnVucywNCisgICAgICAgICAgICAgICAgKHRvdGFsQ291bnQqZGF0YVNpemUpLyhlbGFwc2VkLlRvdGFsU2Vjb25kcyoxMDI0KjEwMjQpLCBiZXN0LCB3b3JzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEJlbmNobWFya1YxKHN0cmluZyBuYW1lLCBsb25nIGRhdGFTaXplLCBBY3Rpb24gYWN0aW9uKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBpdCdzIEpJVHRlZA0KKyAgICAgICAgICAgIGFjdGlvbigpOw0KKyAgICAgICAgICAgIC8vIFJ1biBpdCBwcm9ncmVzc2l2ZWx5IG1vcmUgdGltZXMgdW50aWwgd2UndmUgZ290IGEgcmVhc29uYWJsZSBzYW1wbGUNCisNCisgICAgICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IDE7DQorICAgICAgICAgICAgVGltZVNwYW4gZWxhcHNlZCA9IFRpbWVBY3Rpb24oYWN0aW9uLCBpdGVyYXRpb25zKTsNCisgICAgICAgICAgICB3aGlsZSAoZWxhcHNlZCA8IE1pblNhbXBsZVRpbWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpdGVyYXRpb25zICo9IDI7DQorICAgICAgICAgICAgICAgIGVsYXBzZWQgPSBUaW1lQWN0aW9uKGFjdGlvbiwgaXRlcmF0aW9ucyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIC8vIFVwc2NhbGUgdGhlIHNhbXBsZSB0byB0aGUgdGFyZ2V0IHRpbWUuIERvIHRoaXMgaW4gZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYw0KKyAgICAgICAgICAgIC8vIHRvIGF2b2lkIG92ZXJmbG93IGlzc3Vlcy4NCisgICAgICAgICAgICBpdGVyYXRpb25zID0gKGludCkgKChUYXJnZXRUaW1lLlRpY2tzLyhkb3VibGUpIGVsYXBzZWQuVGlja3MpKml0ZXJhdGlvbnMpOw0KKyAgICAgICAgICAgIGVsYXBzZWQgPSBUaW1lQWN0aW9uKGFjdGlvbiwgaXRlcmF0aW9ucyk7DQorICAgICAgICAgICAgV3JpdGVMaW5lKCJ7MH06IHsxfSBpdGVyYXRpb25zIGluIHsyOmYzfXM7IHszOmYzfU1CL3MiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGl0ZXJhdGlvbnMsIGVsYXBzZWQuVG90YWxTZWNvbmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVyYXRpb25zKmRhdGFTaXplKS8oZWxhcHNlZC5Ub3RhbFNlY29uZHMqMTAyNCoxMDI0KSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBUaW1lU3BhbiBUaW1lQWN0aW9uKEFjdGlvbiBhY3Rpb24sIGludCBpdGVyYXRpb25zKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEdDLkNvbGxlY3QoKTsNCisgICAgICAgICAgICBHQy5HZXRUb3RhbE1lbW9yeSh0cnVlKTsNCisgICAgICAgICAgICBHQy5XYWl0Rm9yUGVuZGluZ0ZpbmFsaXplcnMoKTsNCisNCisgICAgICAgICAgICBTdG9wd2F0Y2ggc3cgPSBTdG9wd2F0Y2guU3RhcnROZXcoKTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGFjdGlvbigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzdy5TdG9wKCk7DQorICAgICAgICAgICAgcmV0dXJuIHN3LkVsYXBzZWQ7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBJRW51bWVyYWJsZTxLZXlWYWx1ZVBhaXI8c3RyaW5nLCBzdHJpbmc+PiBNYWtlVGVzdHMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vQWdncmVnYXRlIFRlc3RzDQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VXb3JrSXRlbSgiYWxsLXR5cGVzIiwgTWFrZVRlc3RBbGxUeXBlcygpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gTWFrZVdvcmtJdGVtKCJyZXBlYXRlZC0xMDAiLCBNYWtlUmVwZWF0ZWRUZXN0QWxsVHlwZXMoMTAwKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VXb3JrSXRlbSgicGFja2VkLTEwMCIsIE1ha2VUZXN0UGFja2VkVHlwZXMoMTAwKSk7DQorDQorICAgICAgICAgICAgLy9EaXNjcmV0ZSBUZXN0cw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxzdHJpbmcsIEFjdGlvbjxUZXN0QWxsVHlwZXMuQnVpbGRlcj4+IGl0ZW0gaW4gTWFrZVRlc3RBbGxUeXBlcygpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VXb3JrSXRlbShpdGVtLktleSwgbmV3W10ge2l0ZW19KTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPHN0cmluZywgQWN0aW9uPFRlc3RBbGxUeXBlcy5CdWlsZGVyPj4gaXRlbSBpbiBNYWtlUmVwZWF0ZWRUZXN0QWxsVHlwZXMoMTAwKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBNYWtlV29ya0l0ZW0oaXRlbS5LZXksIG5ld1tdIHtpdGVtfSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxzdHJpbmcsIEFjdGlvbjxUZXN0UGFja2VkVHlwZXMuQnVpbGRlcj4+IGl0ZW0gaW4gTWFrZVRlc3RQYWNrZWRUeXBlcygxMDApKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VXb3JrSXRlbShpdGVtLktleSwgbmV3W10ge2l0ZW19KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBJRW51bWVyYWJsZTxLZXlWYWx1ZVBhaXI8c3RyaW5nLCBBY3Rpb248VGVzdEFsbFR5cGVzLkJ1aWxkZXI+Pj4gTWFrZVRlc3RBbGxUeXBlcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gTWFueSBvZiB0aGUgcmF3IHR5cGUgc2VyaWFsaXplcnMgYmVsb3cgcGVyZm9ybSBwb29ybHkgZHVlIHRvIHRoZSBudW1lcm91cyBmaWVsZHMgZGVmaW5lZA0KKyAgICAgICAgICAgIC8vIGluIFRlc3RBbGxUeXBlcy4NCisNCisgICAgICAgICAgICAvL3NpbmdsZSB2YWx1ZXMNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gTWFrZUl0ZW08VGVzdEFsbFR5cGVzLkJ1aWxkZXI+KCJpbnQzMiIsIDEsIHggPT4geC5TZXRPcHRpb25hbEludDMyKDEwMDEpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gTWFrZUl0ZW08VGVzdEFsbFR5cGVzLkJ1aWxkZXI+KCJpbnQ2NCIsIDEsIHggPT4geC5TZXRPcHRpb25hbEludDY0KDEwMDEpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gTWFrZUl0ZW08VGVzdEFsbFR5cGVzLkJ1aWxkZXI+KCJ1aW50MzIiLCAxLCB4ID0+IHguU2V0T3B0aW9uYWxVaW50MzIoMTAwMSkpOw0KKyAgICAgICAgICAgIHlpZWxkIHJldHVybiBNYWtlSXRlbTxUZXN0QWxsVHlwZXMuQnVpbGRlcj4oInVpbnQ2NCIsIDEsIHggPT4geC5TZXRPcHRpb25hbFVpbnQ2NCgxMDAxKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RBbGxUeXBlcy5CdWlsZGVyPigic2ludDMyIiwgMSwgeCA9PiB4LlNldE9wdGlvbmFsU2ludDMyKC0xMDAxKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RBbGxUeXBlcy5CdWlsZGVyPigic2ludDY0IiwgMSwgeCA9PiB4LlNldE9wdGlvbmFsU2ludDY0KC0xMDAxKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RBbGxUeXBlcy5CdWlsZGVyPigiZml4ZWQzMiIsIDEsIHggPT4geC5TZXRPcHRpb25hbEZpeGVkMzIoMTAwMSkpOw0KKyAgICAgICAgICAgIHlpZWxkIHJldHVybiBNYWtlSXRlbTxUZXN0QWxsVHlwZXMuQnVpbGRlcj4oImZpeGVkNjQiLCAxLCB4ID0+IHguU2V0T3B0aW9uYWxGaXhlZDY0KDEwMDEpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gTWFrZUl0ZW08VGVzdEFsbFR5cGVzLkJ1aWxkZXI+KCJzZml4ZWQzMiIsIDEsIHggPT4geC5TZXRPcHRpb25hbFNmaXhlZDMyKC0xMDAxKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RBbGxUeXBlcy5CdWlsZGVyPigic2ZpeGVkNjQiLCAxLCB4ID0+IHguU2V0T3B0aW9uYWxTZml4ZWQ2NCgtMTAwMSkpOw0KKyAgICAgICAgICAgIHlpZWxkIHJldHVybiBNYWtlSXRlbTxUZXN0QWxsVHlwZXMuQnVpbGRlcj4oImZsb2F0IiwgMSwgeCA9PiB4LlNldE9wdGlvbmFsRmxvYXQoMTAwMS4xMDAxZikpOw0KKyAgICAgICAgICAgIHlpZWxkIHJldHVybiBNYWtlSXRlbTxUZXN0QWxsVHlwZXMuQnVpbGRlcj4oImRvdWJsZSIsIDEsIHggPT4geC5TZXRPcHRpb25hbERvdWJsZSgxMDAxLjEwMDEpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gTWFrZUl0ZW08VGVzdEFsbFR5cGVzLkJ1aWxkZXI+KCJib29sIiwgMSwgeCA9PiB4LlNldE9wdGlvbmFsQm9vbCh0cnVlKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RBbGxUeXBlcy5CdWlsZGVyPigic3RyaW5nIiwgMSwgeCA9PiB4LlNldE9wdGlvbmFsU3RyaW5nKCJ0aGlzIGlzIGEgc3RyaW5nIHZhbHVlIikpDQorICAgICAgICAgICAgICAgIDsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4NCisgICAgICAgICAgICAgICAgTWFrZUl0ZW08VGVzdEFsbFR5cGVzLkJ1aWxkZXI+KCJieXRlcyIsIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LlNldE9wdGlvbmFsQnl0ZXMoQnl0ZVN0cmluZy5Db3B5RnJvbVV0ZjgoInRoaXMgaXMgYW4gYXJyYXkgb2YgYnl0ZXMiKSkpDQorICAgICAgICAgICAgICAgIDsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4NCisgICAgICAgICAgICAgICAgTWFrZUl0ZW08VGVzdEFsbFR5cGVzLkJ1aWxkZXI+KCJncm91cCIsIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LlNldE9wdGlvbmFsR3JvdXAoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwLkJ1aWxkZXIoKS5TZXRBKDEwMDEpKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuDQorICAgICAgICAgICAgICAgIE1ha2VJdGVtPFRlc3RBbGxUeXBlcy5CdWlsZGVyPigibWVzc2FnZSIsIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LlNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlcigpLlNldEJiKDEwMDEpKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuDQorICAgICAgICAgICAgICAgIE1ha2VJdGVtPFRlc3RBbGxUeXBlcy5CdWlsZGVyPigiZW51bSIsIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0+IHguU2V0T3B0aW9uYWxOZXN0ZWRFbnVtKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZPTykpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSUVudW1lcmFibGU8S2V5VmFsdWVQYWlyPHN0cmluZywgQWN0aW9uPFRlc3RBbGxUeXBlcy5CdWlsZGVyPj4+IE1ha2VSZXBlYXRlZFRlc3RBbGxUeXBlcyhpbnQgc2l6ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvL3JlcGVhdGVkIHZhbHVlcw0KKyAgICAgICAgICAgIHlpZWxkIHJldHVybiBNYWtlSXRlbTxUZXN0QWxsVHlwZXMuQnVpbGRlcj4oInJlcGVhdGVkLWludDMyIiwgc2l6ZSwgeCA9PiB4LkFkZFJlcGVhdGVkSW50MzIoMTAwMSkpOw0KKyAgICAgICAgICAgIHlpZWxkIHJldHVybiBNYWtlSXRlbTxUZXN0QWxsVHlwZXMuQnVpbGRlcj4oInJlcGVhdGVkLWludDY0Iiwgc2l6ZSwgeCA9PiB4LkFkZFJlcGVhdGVkSW50NjQoMTAwMSkpOw0KKyAgICAgICAgICAgIHlpZWxkIHJldHVybiBNYWtlSXRlbTxUZXN0QWxsVHlwZXMuQnVpbGRlcj4oInJlcGVhdGVkLXVpbnQzMiIsIHNpemUsIHggPT4geC5BZGRSZXBlYXRlZFVpbnQzMigxMDAxKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RBbGxUeXBlcy5CdWlsZGVyPigicmVwZWF0ZWQtdWludDY0Iiwgc2l6ZSwgeCA9PiB4LkFkZFJlcGVhdGVkVWludDY0KDEwMDEpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gTWFrZUl0ZW08VGVzdEFsbFR5cGVzLkJ1aWxkZXI+KCJyZXBlYXRlZC1zaW50MzIiLCBzaXplLCB4ID0+IHguQWRkUmVwZWF0ZWRTaW50MzIoLTEwMDEpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gTWFrZUl0ZW08VGVzdEFsbFR5cGVzLkJ1aWxkZXI+KCJyZXBlYXRlZC1zaW50NjQiLCBzaXplLCB4ID0+IHguQWRkUmVwZWF0ZWRTaW50NjQoLTEwMDEpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gTWFrZUl0ZW08VGVzdEFsbFR5cGVzLkJ1aWxkZXI+KCJyZXBlYXRlZC1maXhlZDMyIiwgc2l6ZSwgeCA9PiB4LkFkZFJlcGVhdGVkRml4ZWQzMigxMDAxKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RBbGxUeXBlcy5CdWlsZGVyPigicmVwZWF0ZWQtZml4ZWQ2NCIsIHNpemUsIHggPT4geC5BZGRSZXBlYXRlZEZpeGVkNjQoMTAwMSkpOw0KKyAgICAgICAgICAgIHlpZWxkIHJldHVybiBNYWtlSXRlbTxUZXN0QWxsVHlwZXMuQnVpbGRlcj4oInJlcGVhdGVkLXNmaXhlZDMyIiwgc2l6ZSwgeCA9PiB4LkFkZFJlcGVhdGVkU2ZpeGVkMzIoLTEwMDEpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gTWFrZUl0ZW08VGVzdEFsbFR5cGVzLkJ1aWxkZXI+KCJyZXBlYXRlZC1zZml4ZWQ2NCIsIHNpemUsIHggPT4geC5BZGRSZXBlYXRlZFNmaXhlZDY0KC0xMDAxKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RBbGxUeXBlcy5CdWlsZGVyPigicmVwZWF0ZWQtZmxvYXQiLCBzaXplLCB4ID0+IHguQWRkUmVwZWF0ZWRGbG9hdCgxMDAxLjEwMDFmKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RBbGxUeXBlcy5CdWlsZGVyPigicmVwZWF0ZWQtZG91YmxlIiwgc2l6ZSwgeCA9PiB4LkFkZFJlcGVhdGVkRG91YmxlKDEwMDEuMTAwMSkpOw0KKyAgICAgICAgICAgIHlpZWxkIHJldHVybiBNYWtlSXRlbTxUZXN0QWxsVHlwZXMuQnVpbGRlcj4oInJlcGVhdGVkLWJvb2wiLCBzaXplLCB4ID0+IHguQWRkUmVwZWF0ZWRCb29sKHRydWUpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4NCisgICAgICAgICAgICAgICAgTWFrZUl0ZW08VGVzdEFsbFR5cGVzLkJ1aWxkZXI+KCJyZXBlYXRlZC1zdHJpbmciLCBzaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9PiB4LkFkZFJlcGVhdGVkU3RyaW5nKCJ0aGlzIGlzIGEgc3RyaW5nIHZhbHVlIikpOw0KKyAgICAgICAgICAgIHlpZWxkIHJldHVybg0KKyAgICAgICAgICAgICAgICBNYWtlSXRlbTxUZXN0QWxsVHlwZXMuQnVpbGRlcj4oInJlcGVhdGVkLWJ5dGVzIiwgc2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguQWRkUmVwZWF0ZWRCeXRlcyhCeXRlU3RyaW5nLkNvcHlGcm9tVXRmOCgidGhpcyBpcyBhbiBhcnJheSBvZiBieXRlcyIpKSkNCisgICAgICAgICAgICAgICAgOw0KKyAgICAgICAgICAgIHlpZWxkIHJldHVybg0KKyAgICAgICAgICAgICAgICBNYWtlSXRlbTxUZXN0QWxsVHlwZXMuQnVpbGRlcj4oInJlcGVhdGVkLWdyb3VwIiwgc2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguQWRkUmVwZWF0ZWRHcm91cCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAuQnVpbGRlcigpLlNldEEoMTAwMSkpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4NCisgICAgICAgICAgICAgICAgTWFrZUl0ZW08VGVzdEFsbFR5cGVzLkJ1aWxkZXI+KCJyZXBlYXRlZC1tZXNzYWdlIiwgc2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguQWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyKCkuU2V0QmIoMTAwMSkpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4NCisgICAgICAgICAgICAgICAgTWFrZUl0ZW08VGVzdEFsbFR5cGVzLkJ1aWxkZXI+KCJyZXBlYXRlZC1lbnVtIiwgc2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPT4geC5BZGRSZXBlYXRlZE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uRk9PKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBJRW51bWVyYWJsZTxLZXlWYWx1ZVBhaXI8c3RyaW5nLCBBY3Rpb248VGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXI+Pj4gTWFrZVRlc3RQYWNrZWRUeXBlcyhpbnQgc2l6ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvL3BhY2tlZCB2YWx1ZXMNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gTWFrZUl0ZW08VGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXI+KCJwYWNrZWQtaW50MzIiLCBzaXplLCB4ID0+IHguQWRkUGFja2VkSW50MzIoMTAwMSkpOw0KKyAgICAgICAgICAgIHlpZWxkIHJldHVybiBNYWtlSXRlbTxUZXN0UGFja2VkVHlwZXMuQnVpbGRlcj4oInBhY2tlZC1pbnQ2NCIsIHNpemUsIHggPT4geC5BZGRQYWNrZWRJbnQ2NCgxMDAxKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyPigicGFja2VkLXVpbnQzMiIsIHNpemUsIHggPT4geC5BZGRQYWNrZWRVaW50MzIoMTAwMSkpOw0KKyAgICAgICAgICAgIHlpZWxkIHJldHVybiBNYWtlSXRlbTxUZXN0UGFja2VkVHlwZXMuQnVpbGRlcj4oInBhY2tlZC11aW50NjQiLCBzaXplLCB4ID0+IHguQWRkUGFja2VkVWludDY0KDEwMDEpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gTWFrZUl0ZW08VGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXI+KCJwYWNrZWQtc2ludDMyIiwgc2l6ZSwgeCA9PiB4LkFkZFBhY2tlZFNpbnQzMigtMTAwMSkpOw0KKyAgICAgICAgICAgIHlpZWxkIHJldHVybiBNYWtlSXRlbTxUZXN0UGFja2VkVHlwZXMuQnVpbGRlcj4oInBhY2tlZC1zaW50NjQiLCBzaXplLCB4ID0+IHguQWRkUGFja2VkU2ludDY0KC0xMDAxKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyPigicGFja2VkLWZpeGVkMzIiLCBzaXplLCB4ID0+IHguQWRkUGFja2VkRml4ZWQzMigxMDAxKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyPigicGFja2VkLWZpeGVkNjQiLCBzaXplLCB4ID0+IHguQWRkUGFja2VkRml4ZWQ2NCgxMDAxKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyPigicGFja2VkLXNmaXhlZDMyIiwgc2l6ZSwgeCA9PiB4LkFkZFBhY2tlZFNmaXhlZDMyKC0xMDAxKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyPigicGFja2VkLXNmaXhlZDY0Iiwgc2l6ZSwgeCA9PiB4LkFkZFBhY2tlZFNmaXhlZDY0KC0xMDAxKSk7DQorICAgICAgICAgICAgeWllbGQgcmV0dXJuIE1ha2VJdGVtPFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyPigicGFja2VkLWZsb2F0Iiwgc2l6ZSwgeCA9PiB4LkFkZFBhY2tlZEZsb2F0KDEwMDEuMTAwMWYpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gTWFrZUl0ZW08VGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXI+KCJwYWNrZWQtZG91YmxlIiwgc2l6ZSwgeCA9PiB4LkFkZFBhY2tlZERvdWJsZSgxMDAxLjEwMDEpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gTWFrZUl0ZW08VGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXI+KCJwYWNrZWQtYm9vbCIsIHNpemUsIHggPT4geC5BZGRQYWNrZWRCb29sKHRydWUpKTsNCisgICAgICAgICAgICB5aWVsZCByZXR1cm4NCisgICAgICAgICAgICAgICAgTWFrZUl0ZW08VGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXI+KCJwYWNrZWQtZW51bSIsIHNpemUsIHggPT4geC5BZGRQYWNrZWRFbnVtKEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBLZXlWYWx1ZVBhaXI8c3RyaW5nLCBBY3Rpb248VD4+IE1ha2VJdGVtPFQ+KHN0cmluZyBuYW1lLCBpbnQgcmVwZWF0ZWQsIEFjdGlvbjxUPiBidWlsZCkNCisgICAgICAgICAgICB3aGVyZSBUIDogSUJ1aWxkZXJMaXRlLCBuZXcoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChyZXBlYXRlZCA9PSAxKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBLZXlWYWx1ZVBhaXI8c3RyaW5nLCBBY3Rpb248VD4+KG5hbWUsIGJ1aWxkKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcmV0dXJuIG5ldyBLZXlWYWx1ZVBhaXI8c3RyaW5nLCBBY3Rpb248VD4+KA0KKyAgICAgICAgICAgICAgICBTdHJpbmcuRm9ybWF0KCJ7MH1bezF9XSIsIG5hbWUsIHJlcGVhdGVkKSwNCisgICAgICAgICAgICAgICAgeCA9Pg0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0ZWQ7IGkrKykNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkKHgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIEtleVZhbHVlUGFpcjxzdHJpbmcsIHN0cmluZz4gTWFrZVdvcmtJdGVtPFQ+KHN0cmluZyBuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8S2V5VmFsdWVQYWlyPHN0cmluZywgQWN0aW9uPFQ+Pj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVycykgd2hlcmUgVCA6IElCdWlsZGVyTGl0ZSwgbmV3KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUIGJ1aWxkZXIgPSBuZXcgVCgpOw0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxzdHJpbmcsIEFjdGlvbjxUPj4gaXRlbSBpbiBidWlsZGVycykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGl0ZW0uVmFsdWUoYnVpbGRlcik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIElNZXNzYWdlTGl0ZSBtc2cgPSBidWlsZGVyLldlYWtCdWlsZCgpOw0KKyAgICAgICAgICAgIHN0cmluZyBmbmFtZSA9IFBhdGguQ29tYmluZShBcHBEb21haW4uQ3VycmVudERvbWFpbi5CYXNlRGlyZWN0b3J5LCAidW5pdHRlc3RfIiArIG5hbWUgKyAiLmRhdCIpOw0KKyAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxCeXRlcyhmbmFtZSwgbXNnLlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgICAgIHJldHVybg0KKyAgICAgICAgICAgICAgICBuZXcgS2V5VmFsdWVQYWlyPHN0cmluZywgc3RyaW5nPigNCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5Gb3JtYXQoInswfSx7MX0iLCBtc2cuR2V0VHlwZSgpLkZ1bGxOYW1lLCBtc2cuR2V0VHlwZSgpLkFzc2VtYmx5LkdldE5hbWUoKS5OYW1lKSwgZm5hbWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9CZW5jaC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2NzaGFycC9zcmMvUHJvdG9CZW5jaC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjAwYzEzCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b0JlbmNoL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsMzIgQEAKK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOw0KK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCisNCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIA0KKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uDQorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5Lg0KKw0KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiUHJvdG9CZW5jaCIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiUHJvdG9CZW5jaCIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAgMjAwOSIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0NCitbYXNzZW1ibHk6IENMU0NvbXBsaWFudCh0cnVlKV0NCisNCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOg0KKy8vDQorLy8gICAgICBNYWpvciBWZXJzaW9uDQorLy8gICAgICBNaW5vciBWZXJzaW9uIA0KKy8vICAgICAgQnVpbGQgTnVtYmVyDQorLy8gICAgICBSZXZpc2lvbg0KKy8vDQorLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMgDQorLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoNCisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMi40LjEuNTU1IildDQorDQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjIuNC4xLjU1NSIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMi40LjEuNTU1IildClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b0JlbmNoL1Byb3RvQmVuY2guY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b0JlbmNoL1Byb3RvQmVuY2guY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZjQ3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvQmVuY2gvUHJvdG9CZW5jaC5jc3Byb2oKQEAgLTAsMCArMSw4OCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q0xJRU5UUFJPRklMRTwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPk5FVDM1PC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0M3QTRBNDM1LTI4MTMtNDFDOC1BQTg3LUJEOTE0QkE1MjIzRH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPlByb3RvQmVuY2g8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2VNb2RlbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLldlYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9ncmFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xHb29nbGVTaXplUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXEdvb2dsZVNwZWVkUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0UHJvdG9GaWxlLmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0PnsyMzEzOTFBRi00NDlDLTRhMzktOTg2Qy1BRDdGMjcwRjQ3NTB9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uPC9OYW1lPg0KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxOb25lIEluY2x1ZGU9Imdvb2dsZV9tZXNzYWdlMS5kYXQiPg0KKyAgICAgIDxDb3B5VG9PdXRwdXREaXJlY3Rvcnk+QWx3YXlzPC9Db3B5VG9PdXRwdXREaXJlY3Rvcnk+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iZ29vZ2xlX21lc3NhZ2UyLmRhdCI+DQorICAgICAgPENvcHlUb091dHB1dERpcmVjdG9yeT5BbHdheXM8L0NvcHlUb091dHB1dERpcmVjdG9yeT4NCisgICAgPC9Ob25lPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b0JlbmNoL1Rlc3RQcm90b3MvR29vZ2xlU2l6ZVByb3RvRmlsZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9CZW5jaC9UZXN0UHJvdG9zL0dvb2dsZVNpemVQcm90b0ZpbGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2YzUwNwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9CZW5jaC9UZXN0UHJvdG9zL0dvb2dsZVNpemVQcm90b0ZpbGUuY3MKQEAgLTAsMCArMSw0NTcyIEBACisvLyBHZW5lcmF0ZWQgYnkgUHJvdG9HZW4sIFZlcnNpb249Mi40LjEuNTU1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTU1ZjcxMjUyMzRiZWI1ODkuICBETyBOT1QgRURJVCENCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxDQorI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KKw0KK3VzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoIHsNCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBHb29nbGVTaXplUHJvdG9GaWxlIHsNCisgIA0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gU3RhdGljIHZhcmlhYmxlcw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU2l6ZU1lc3NhZ2UxX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTEsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU2l6ZU1lc3NhZ2UxX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TaXplTWVzc2FnZTFTdWJNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTFTdWJNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTFTdWJNZXNzYWdlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TaXplTWVzc2FnZTFTdWJNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TaXplTWVzc2FnZTJfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TaXplTWVzc2FnZTJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NpemVNZXNzYWdlMl9Hcm91cDFfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMi5UeXBlcy5Hcm91cDEsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMi5UeXBlcy5Hcm91cDEuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NpemVNZXNzYWdlMl9Hcm91cDFfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBEZXNjcmlwdG9yDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIHByaXZhdGUgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsNCisgICAgDQorICAgIHN0YXRpYyBHb29nbGVTaXplUHJvdG9GaWxlKCkgew0KKyAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygNCisgICAgICAgICAgc3RyaW5nLkNvbmNhdCgNCisgICAgICAgICAgICAiQ2h4aVpXNWphRzFoY210ekwyZHZiMmRzWlY5emFYcGxMbkJ5YjNSdkVncGlaVzVqYUcxaGNtdHpHaVJuIiwgDQorICAgICAgICAgICAgImIyOW5iR1V2Y0hKdmRHOWlkV1l2WTNOb1lYSndYMjl3ZEdsdmJuTXVjSEp2ZEc4aTlnWUtERk5wZW1WTiIsIA0KKyAgICAgICAgICAgICJaWE56WVdkbE1SSU9DZ1ptYVdWc1pERVlBU0FDS0FrU0Rnb0dabWxsYkdRNUdBa2dBU2dKRWc4S0IyWnAiLCANCisgICAgICAgICAgICAiWld4a01UZ1lFaUFCS0FrU0Znb0habWxsYkdRNE1CaFFJQUVvQ0RvRlptRnNjMlVTRlFvSFptbGxiR1E0IiwgDQorICAgICAgICAgICAgIk1SaFJJQUVvQ0RvRWRISjFaUklPQ2dabWFXVnNaRElZQWlBQ0tBVVNEZ29HWm1sbGJHUXpHQU1nQWlnRiIsIA0KKyAgICAgICAgICAgICJFaEVLQ0dacFpXeGtNamd3R0pnQ0lBRW9CUklSQ2dabWFXVnNaRFlZQmlBQktBVTZBVEFTRHdvSFptbGwiLCANCisgICAgICAgICAgICAiYkdReU1oZ1dJQUVvQXhJT0NnWm1hV1ZzWkRRWUJDQUJLQWtTRGdvR1ptbGxiR1ExR0FVZ0F5Z0dFaFlLIiwgDQorICAgICAgICAgICAgIkIyWnBaV3hrTlRrWU95QUJLQWc2QldaaGJITmxFZzRLQm1acFpXeGtOeGdISUFFb0NSSVBDZ2RtYVdWcyIsIA0KKyAgICAgICAgICAgICJaREUyR0JBZ0FTZ0ZFaFFLQ0dacFpXeGtNVE13R0lJQklBRW9CVG9CTUJJVkNnZG1hV1ZzWkRFeUdBd2ciLCANCisgICAgICAgICAgICAiQVNnSU9nUjBjblZsRWhVS0IyWnBaV3hrTVRjWUVTQUJLQWc2QkhSeWRXVVNGUW9IWm1sbGJHUXhNeGdOIiwgDQorICAgICAgICAgICAgIklBRW9DRG9FZEhKMVpSSVZDZ2RtYVdWc1pERTBHQTRnQVNnSU9nUjBjblZsRWhNS0NHWnBaV3hrTVRBMCIsIA0KKyAgICAgICAgICAgICJHR2dnQVNnRk9nRXdFaE1LQ0dacFpXeGtNVEF3R0dRZ0FTZ0ZPZ0V3RWhNS0NHWnBaV3hrTVRBeEdHVWciLCANCisgICAgICAgICAgICAiQVNnRk9nRXdFaEFLQ0dacFpXeGtNVEF5R0dZZ0FTZ0pFaEFLQ0dacFpXeGtNVEF6R0djZ0FTZ0pFaElLIiwgDQorICAgICAgICAgICAgIkIyWnBaV3hrTWprWUhTQUJLQVU2QVRBU0Znb0habWxsYkdRek1CZ2VJQUVvQ0RvRlptRnNjMlVTRXdvSCIsIA0KKyAgICAgICAgICAgICJabWxsYkdRMk1CZzhJQUVvQlRvQ0xURVNGUW9JWm1sbGJHUXlOekVZandJZ0FTZ0ZPZ0l0TVJJVkNnaG0iLCANCisgICAgICAgICAgICAiYVdWc1pESTNNaGlRQWlBQktBVTZBaTB4RWhFS0NHWnBaV3hrTVRVd0dKWUJJQUVvQlJJU0NnZG1hV1ZzIiwgDQorICAgICAgICAgICAgIlpESXpHQmNnQVNnRk9nRXdFaFlLQjJacFpXeGtNalFZR0NBQktBZzZCV1poYkhObEVoSUtCMlpwWld4ayIsIA0KKyAgICAgICAgICAgICJNalVZR1NBQktBVTZBVEFTTXdvSFptbGxiR1F4TlJnUElBRW9DeklpTG1KbGJtTm9iV0Z5YTNNdVUybDYiLCANCisgICAgICAgICAgICAiWlUxbGMzTmhaMlV4VTNWaVRXVnpjMkZuWlJJUENnZG1hV1ZzWkRjNEdFNGdBU2dJRWhJS0IyWnBaV3hrIiwgDQorICAgICAgICAgICAgIk5qY1lReUFCS0FVNkFUQVNEd29IWm1sbGJHUTJPQmhFSUFFb0JSSVVDZ2htYVdWc1pERXlPQmlBQVNBQiIsIA0KKyAgICAgICAgICAgICJLQVU2QVRBU0tBb0labWxsYkdReE1qa1lnUUVnQVNnSk9oVjRlSGg0ZUhoNGVIaDRlSGg0ZUhoNGVIaDQiLCANCisgICAgICAgICAgICAiZUhnU0ZBb0labWxsYkdReE16RVlnd0VnQVNnRk9nRXdJcUVEQ2haVGFYcGxUV1Z6YzJGblpURlRkV0pOIiwgDQorICAgICAgICAgICAgIlpYTnpZV2RsRWhFS0JtWnBaV3hrTVJnQklBRW9CVG9CTUJJUkNnWm1hV1ZzWkRJWUFpQUJLQVU2QVRBUyIsIA0KKyAgICAgICAgICAgICJFUW9HWm1sbGJHUXpHQU1nQVNnRk9nRXdFZzhLQjJacFpXeGtNVFVZRHlBQktBa1NGUW9IWm1sbGJHUXgiLCANCisgICAgICAgICAgICAiTWhnTUlBRW9DRG9FZEhKMVpSSVBDZ2RtYVdWc1pERXpHQTBnQVNnREVnOEtCMlpwWld4a01UUVlEaUFCIiwgDQorICAgICAgICAgICAgIktBTVNEd29IWm1sbGJHUXhOaGdRSUFFb0JSSVNDZ2RtYVdWc1pERTVHQk1nQVNnRk9nRXlFaFVLQjJacCIsIA0KKyAgICAgICAgICAgICJaV3hrTWpBWUZDQUJLQWc2QkhSeWRXVVNGUW9IWm1sbGJHUXlPQmdjSUFFb0NEb0VkSEoxWlJJUENnZG0iLCANCisgICAgICAgICAgICAiYVdWc1pESXhHQlVnQVNnR0VnOEtCMlpwWld4a01qSVlGaUFCS0FVU0Znb0habWxsYkdReU14Z1hJQUVvIiwgDQorICAgICAgICAgICAgIkNEb0ZabUZzYzJVU0dBb0labWxsYkdReU1EWVl6Z0VnQVNnSU9nVm1ZV3h6WlJJUkNnaG1hV1ZzWkRJdyIsIA0KKyAgICAgICAgICAgICJNeGpMQVNBQktBY1NFUW9JWm1sbGJHUXlNRFFZekFFZ0FTZ0ZFaEVLQ0dacFpXeGtNakExR00wQklBRW8iLCANCisgICAgICAgICAgICAiQ1JJUkNnaG1hV1ZzWkRJd054alBBU0FCS0FRU0VRb0labWxsYkdRek1EQVlyQUlnQVNnRUlzY0hDZ3hUIiwgDQorICAgICAgICAgICAgImFYcGxUV1Z6YzJGblpUSVNEZ29HWm1sbGJHUXhHQUVnQVNnSkVnNEtCbVpwWld4a014Z0RJQUVvQXhJTyIsIA0KKyAgICAgICAgICAgICJDZ1ptYVdWc1pEUVlCQ0FCS0FNU0R3b0habWxsYkdRek1CZ2VJQUVvQXhJV0NnZG1hV1ZzWkRjMUdFc2ciLCANCisgICAgICAgICAgICAiQVNnSU9nVm1ZV3h6WlJJT0NnWm1hV1ZzWkRZWUJpQUJLQWtTRGdvR1ptbGxiR1F5R0FJZ0FTZ01FaElLIiwgDQorICAgICAgICAgICAgIkIyWnBaV3hrTWpFWUZTQUJLQVU2QVRBU0R3b0habWxsYkdRM01SaEhJQUVvQlJJUENnZG1hV1ZzWkRJMSIsIA0KKyAgICAgICAgICAgICJHQmtnQVNnQ0VoTUtDR1pwWld4a01UQTVHRzBnQVNnRk9nRXdFaFFLQ0dacFpXeGtNakV3R05JQklBRW8iLCANCisgICAgICAgICAgICAiQlRvQk1CSVVDZ2htYVdWc1pESXhNUmpUQVNBQktBVTZBVEFTRkFvSVptbGxiR1F5TVRJWTFBRWdBU2dGIiwgDQorICAgICAgICAgICAgIk9nRXdFaFFLQ0dacFpXeGtNakV6R05VQklBRW9CVG9CTUJJVUNnaG1hV1ZzWkRJeE5oallBU0FCS0FVNiIsIA0KKyAgICAgICAgICAgICJBVEFTRkFvSVptbGxiR1F5TVRjWTJRRWdBU2dGT2dFd0VoUUtDR1pwWld4a01qRTRHTm9CSUFFb0JUb0IiLCANCisgICAgICAgICAgICAiTUJJVUNnaG1hV1ZzWkRJeU1CamNBU0FCS0FVNkFUQVNGQW9JWm1sbGJHUXlNakVZM1FFZ0FTZ0ZPZ0V3IiwgDQorICAgICAgICAgICAgIkVoUUtDR1pwWld4a01qSXlHTjRCSUFFb0Fqb0JNQklQQ2dkbWFXVnNaRFl6R0Q4Z0FTZ0ZFaThLQm1keSIsIA0KKyAgICAgICAgICAgICJiM1Z3TVJnS0lBTW9DaklmTG1KbGJtTm9iV0Z5YTNNdVUybDZaVTFsYzNOaFoyVXlMa2R5YjNWd01SSVIiLCANCisgICAgICAgICAgICAiQ2dobWFXVnNaREV5T0JpQUFTQURLQWtTRVFvSVptbGxiR1F4TXpFWWd3RWdBU2dERWhBS0NHWnBaV3hrIiwgDQorICAgICAgICAgICAgIk1USTNHSDhnQXlnSkVoRUtDR1pwWld4a01USTVHSUVCSUFFb0JSSVJDZ2htYVdWc1pERXpNQmlDQVNBRCIsIA0KKyAgICAgICAgICAgICJLQU1TR0FvSVptbGxiR1F5TURVWXpRRWdBU2dJT2dWbVlXeHpaUklZQ2dobWFXVnNaREl3TmhqT0FTQUIiLCANCisgICAgICAgICAgICAiS0FnNkJXWmhiSE5sR3NJQ0NnWkhjbTkxY0RFU0R3b0habWxsYkdReE1SZ0xJQUlvQWhJUENnZG1hV1ZzIiwgDQorICAgICAgICAgICAgIlpESTJHQm9nQVNnQ0VnOEtCMlpwWld4a01USVlEQ0FCS0FrU0R3b0habWxsYkdReE14Z05JQUVvQ1JJUCIsIA0KKyAgICAgICAgICAgICJDZ2RtYVdWc1pERTBHQTRnQXlnSkVnOEtCMlpwWld4a01UVVlEeUFDS0FRU0Rnb0dabWxsYkdRMUdBVWciLCANCisgICAgICAgICAgICAiQVNnRkVnOEtCMlpwWld4a01qY1lHeUFCS0FrU0R3b0habWxsYkdReU9CZ2NJQUVvQlJJUENnZG1hV1ZzIiwgDQorICAgICAgICAgICAgIlpESTVHQjBnQVNnSkVnOEtCMlpwWld4a01UWVlFQ0FCS0FrU0R3b0habWxsYkdReU1oZ1dJQU1vQ1JJUCIsIA0KKyAgICAgICAgICAgICJDZ2RtYVdWc1pEY3pHRWtnQXlnRkVoSUtCMlpwWld4a01qQVlGQ0FCS0FVNkFUQVNEd29IWm1sbGJHUXkiLCANCisgICAgICAgICAgICAiTkJnWUlBRW9DUkkzQ2dkbWFXVnNaRE14R0I4Z0FTZ0xNaVl1WW1WdVkyaHRZWEpyY3k1VGFYcGxUV1Z6IiwgDQorICAgICAgICAgICAgImMyRm5aVEpIY205MWNHVmtUV1Z6YzJGblpTTGVBUW9hVTJsNlpVMWxjM05oWjJVeVIzSnZkWEJsWkUxbCIsIA0KKyAgICAgICAgICAgICJjM05oWjJVU0Rnb0dabWxsYkdReEdBRWdBU2dDRWc0S0JtWnBaV3hrTWhnQ0lBRW9BaElSQ2dabWFXVnMiLCANCisgICAgICAgICAgICAiWkRNWUF5QUJLQUk2QVRBU0Rnb0dabWxsYkdRMEdBUWdBU2dJRWc0S0JtWnBaV3hrTlJnRklBRW9DQklVIiwgDQorICAgICAgICAgICAgIkNnWm1hV1ZzWkRZWUJpQUJLQWc2QkhSeWRXVVNGUW9HWm1sbGJHUTNHQWNnQVNnSU9nVm1ZV3h6WlJJTyIsIA0KKyAgICAgICAgICAgICJDZ1ptYVdWc1pEZ1lDQ0FCS0FJU0Rnb0dabWxsYkdRNUdBa2dBU2dJRWc4S0IyWnBaV3hrTVRBWUNpQUIiLCANCisgICAgICAgICAgICAiS0FJU0R3b0habWxsYkdReE1SZ0xJQUVvQTBKSlFncEhiMjluYkdWVGFYcGxTQUxDUGpnS0lVZHZiMmRzIiwgDQorICAgICAgICAgICAgIlpTNVFjbTkwYjJOdmJFSjFabVpsY25NdVVISnZkRzlDWlc1amFCSVRSMjl2WjJ4bFUybDZaVkJ5YjNSdiIsIA0KKyAgICAgICAgICAiUm1sc1pRPT0iKSk7DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciBhc3NpZ25lciA9IGRlbGVnYXRlKHBiZDo6RmlsZURlc2NyaXB0b3Igcm9vdCkgew0KKyAgICAgICAgZGVzY3JpcHRvciA9IHJvb3Q7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU2l6ZU1lc3NhZ2UxX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU2l6ZU1lc3NhZ2UxX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTEsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU2l6ZU1lc3NhZ2UxX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRmllbGQxIiwgIkZpZWxkOSIsICJGaWVsZDE4IiwgIkZpZWxkODAiLCAiRmllbGQ4MSIsICJGaWVsZDIiLCAiRmllbGQzIiwgIkZpZWxkMjgwIiwgIkZpZWxkNiIsICJGaWVsZDIyIiwgIkZpZWxkNCIsICJGaWVsZDUiLCAiRmllbGQ1OSIsICJGaWVsZDciLCAiRmllbGQxNiIsICJGaWVsZDEzMCIsICJGaWVsZDEyIiwgIkZpZWxkMTciLCAiRmllbGQxMyIsICJGaWVsZDE0IiwgIkZpZWxkMTA0IiwgIkZpZWxkMTAwIiwgIkZpZWxkMTAxIiwgIkZpZWxkMTAyIiwgIkZpZWxkMTAzIiwgIkZpZWxkMjkiLCAiRmllbGQzMCIsICJGaWVsZDYwIiwgIkZpZWxkMjcxIiwgIkZpZWxkMjcyIiwgIkZpZWxkMTUwIiwgIkZpZWxkMjMiLCAiRmllbGQyNCIsICJGaWVsZDI1IiwgIkZpZWxkMTUiLCAiRmllbGQ3OCIsICJGaWVsZDY3IiwgIkZpZWxkNjgiLCAiRmllbGQxMjgiLCAiRmllbGQxMjkiLCAiRmllbGQxMzEiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TaXplTWVzc2FnZTFTdWJNZXNzYWdlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkZpZWxkMSIsICJGaWVsZDIiLCAiRmllbGQzIiwgIkZpZWxkMTUiLCAiRmllbGQxMiIsICJGaWVsZDEzIiwgIkZpZWxkMTQiLCAiRmllbGQxNiIsICJGaWVsZDE5IiwgIkZpZWxkMjAiLCAiRmllbGQyOCIsICJGaWVsZDIxIiwgIkZpZWxkMjIiLCAiRmllbGQyMyIsICJGaWVsZDIwNiIsICJGaWVsZDIwMyIsICJGaWVsZDIwNCIsICJGaWVsZDIwNSIsICJGaWVsZDIwNyIsICJGaWVsZDMwMCIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NpemVNZXNzYWdlMl9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzJdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NpemVNZXNzYWdlMl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTIuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NpemVNZXNzYWdlMl9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkZpZWxkMSIsICJGaWVsZDMiLCAiRmllbGQ0IiwgIkZpZWxkMzAiLCAiRmllbGQ3NSIsICJGaWVsZDYiLCAiRmllbGQyIiwgIkZpZWxkMjEiLCAiRmllbGQ3MSIsICJGaWVsZDI1IiwgIkZpZWxkMTA5IiwgIkZpZWxkMjEwIiwgIkZpZWxkMjExIiwgIkZpZWxkMjEyIiwgIkZpZWxkMjEzIiwgIkZpZWxkMjE2IiwgIkZpZWxkMjE3IiwgIkZpZWxkMjE4IiwgIkZpZWxkMjIwIiwgIkZpZWxkMjIxIiwgIkZpZWxkMjIyIiwgIkZpZWxkNjMiLCAiR3JvdXAxIiwgIkZpZWxkMTI4IiwgIkZpZWxkMTMxIiwgIkZpZWxkMTI3IiwgIkZpZWxkMTI5IiwgIkZpZWxkMTMwIiwgIkZpZWxkMjA1IiwgIkZpZWxkMjA2IiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU2l6ZU1lc3NhZ2UyX0dyb3VwMV9fRGVzY3JpcHRvciA9IGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TaXplTWVzc2FnZTJfX0Rlc2NyaXB0b3IuTmVzdGVkVHlwZXNbMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU2l6ZU1lc3NhZ2UyX0dyb3VwMV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyLlR5cGVzLkdyb3VwMSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyLlR5cGVzLkdyb3VwMS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU2l6ZU1lc3NhZ2UyX0dyb3VwMV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkZpZWxkMTEiLCAiRmllbGQyNiIsICJGaWVsZDEyIiwgIkZpZWxkMTMiLCAiRmllbGQxNCIsICJGaWVsZDE1IiwgIkZpZWxkNSIsICJGaWVsZDI3IiwgIkZpZWxkMjgiLCAiRmllbGQyOSIsICJGaWVsZDE2IiwgIkZpZWxkMjIiLCAiRmllbGQ3MyIsICJGaWVsZDIwIiwgIkZpZWxkMjQiLCAiRmllbGQzMSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbM107DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJGaWVsZDEiLCAiRmllbGQyIiwgIkZpZWxkMyIsICJGaWVsZDQiLCAiRmllbGQ1IiwgIkZpZWxkNiIsICJGaWVsZDciLCAiRmllbGQ4IiwgIkZpZWxkOSIsICJGaWVsZDEwIiwgIkZpZWxkMTEiLCB9KTsNCisgICAgICAgIHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IHBiOjpFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIHJldHVybiByZWdpc3RyeTsNCisgICAgICB9Ow0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKGRlc2NyaXB0b3JEYXRhLA0KKyAgICAgICAgICBuZXcgcGJkOjpGaWxlRGVzY3JpcHRvcltdIHsNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5EZXNjcmlwdG9yLCANCisgICAgICAgICAgfSwgYXNzaWduZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICB9DQorICAjcmVnaW9uIE1lc3NhZ2VzDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFNpemVNZXNzYWdlMSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFNpemVNZXNzYWdlMSwgU2l6ZU1lc3NhZ2UxLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTEoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU2l6ZU1lc3NhZ2UxIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTaXplTWVzc2FnZTEoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTEgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBTaXplTWVzc2FnZTEgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU2l6ZU1lc3NhZ2UxIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLkdvb2dsZVNpemVQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NpemVNZXNzYWdlMV9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxTaXplTWVzc2FnZTEsIFNpemVNZXNzYWdlMS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guR29vZ2xlU2l6ZVByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU2l6ZU1lc3NhZ2UxX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ5RmllbGROdW1iZXIgPSA5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ5Ow0KKyAgICBwcml2YXRlIHN0cmluZyBmaWVsZDlfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkOTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRmllbGQ5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMThGaWVsZE51bWJlciA9IDE4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxODsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxOF8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTggew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDE4XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkODBGaWVsZE51bWJlciA9IDgwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ4MDsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkODBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDgwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ4MDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkODAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDgwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkODFGaWVsZE51bWJlciA9IDgxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ4MTsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkODFfID0gdHJ1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ4MSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkODE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDgxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ4MV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDJGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkM0ZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMzsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQzOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDMgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyODBGaWVsZE51bWJlciA9IDI4MDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjgwOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDI4MF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjgwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyODA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjgwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyODBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ2RmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ2Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDZfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDYgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDY7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIyRmllbGROdW1iZXIgPSAyMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjI7DQorICAgIHByaXZhdGUgbG9uZyBmaWVsZDIyXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBGaWVsZDIyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDRGaWVsZE51bWJlciA9IDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDQ7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkNF8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ0OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ1RmllbGROdW1iZXIgPSA1Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiBmaWVsZDVfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IEZpZWxkNUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoZmllbGQ1Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkNUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ1Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgR2V0RmllbGQ1KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBmaWVsZDVfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDU5RmllbGROdW1iZXIgPSA1OTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNTk7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDU5XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ1OSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNTk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDU5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ1OV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDdGaWVsZE51bWJlciA9IDc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDc7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkN18gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ3IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ3OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDcgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxNkZpZWxkTnVtYmVyID0gMTY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE2Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDE2XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTY7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTYgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDE2XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTMwRmllbGROdW1iZXIgPSAxMzA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEzMDsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxMzBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTMwOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDEzMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTMwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTJGaWVsZE51bWJlciA9IDEyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMjsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMTJfID0gdHJ1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDEyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE3RmllbGROdW1iZXIgPSAxNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTc7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDE3XyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE3OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQxNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxM0ZpZWxkTnVtYmVyID0gMTM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEzOw0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQxM18gPSB0cnVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMTMgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTRGaWVsZE51bWJlciA9IDE0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxNDsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMTRfID0gdHJ1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDE0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEwNEZpZWxkTnVtYmVyID0gMTA0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMDQ7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTA0XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEwNDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMDQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEwNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEwMEZpZWxkTnVtYmVyID0gMTAwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMDA7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTAwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEwMDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMDAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEwMF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEwMUZpZWxkTnVtYmVyID0gMTAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMDE7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTAxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEwMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMDEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEwMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEwMkZpZWxkTnVtYmVyID0gMTAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMDI7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMTAyXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTAyOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDEwMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTAyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTAzRmllbGROdW1iZXIgPSAxMDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEwMzsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxMDNfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTAzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMDM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTAzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMDNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyOUZpZWxkTnVtYmVyID0gMjk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI5Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDI5XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjkgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDI5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMzBGaWVsZE51bWJlciA9IDMwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQzMDsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMzBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQzMDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMzAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDMwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNjBGaWVsZE51bWJlciA9IDYwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ2MDsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQ2MF8gPSAtMTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2MCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNjA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkNjAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDYwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjcxRmllbGROdW1iZXIgPSAyNzE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI3MTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyNzFfID0gLTE7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjcxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyNzE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjcxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyNzFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyNzJGaWVsZE51bWJlciA9IDI3MjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjcyOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDI3Ml8gPSAtMTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI3MjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyNzIgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDI3Ml87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE1MEZpZWxkTnVtYmVyID0gMTUwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxNTA7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTUwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNTAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE1MDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxNTAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDE1MF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIzRmllbGROdW1iZXIgPSAyMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjM7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyNEZpZWxkTnVtYmVyID0gMjQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI0Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQyNF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI0OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQyNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyNUZpZWxkTnVtYmVyID0gMjU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI1Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDI1XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjUgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDI1XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTVGaWVsZE51bWJlciA9IDE1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxNTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTFTdWJNZXNzYWdlIGZpZWxkMTVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE1IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxNTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTFTdWJNZXNzYWdlIEZpZWxkMTUgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDE1XyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTFTdWJNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNzhGaWVsZE51bWJlciA9IDc4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ3ODsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkNzhfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDc4IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ3ODsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkNzggew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDc4XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNjdGaWVsZE51bWJlciA9IDY3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ2NzsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQ2N187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNjcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDY3OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDY3IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ2N187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDY4RmllbGROdW1iZXIgPSA2ODsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNjg7DQorICAgIHByaXZhdGUgaW50IGZpZWxkNjhfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDY4IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ2ODsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQ2OCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNjhfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMjhGaWVsZE51bWJlciA9IDEyODsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTI4Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDEyOF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTI4IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMjg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTI4IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMjhfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMjlGaWVsZE51bWJlciA9IDEyOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTI5Ow0KKyAgICBwcml2YXRlIHN0cmluZyBmaWVsZDEyOV8gPSAieHh4eHh4eHh4eHh4eHh4eHh4eHh4IjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMjkgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEyOTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxMjkgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEyOV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEzMUZpZWxkTnVtYmVyID0gMTMxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMzE7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTMxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMzEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEzMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMzEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEzMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTEgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTEgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTEgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTEgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIGZpZWxkNV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihTaXplTWVzc2FnZTEgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8U2l6ZU1lc3NhZ2UxLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihTaXplTWVzc2FnZTEgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTEgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgU2l6ZU1lc3NhZ2UxIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgU2l6ZU1lc3NhZ2UxIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgU2l6ZU1lc3NhZ2UxKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBTaXplTWVzc2FnZTEgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTEuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgU2l6ZU1lc3NhZ2UxIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNpemVNZXNzYWdlMSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDk7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkOSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ5KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDlfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkOSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkOV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxODsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE4OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE4KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxOCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxOF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE4XyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkODAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDgwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkODAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDgwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDgwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDgwKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ4MCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ4MF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkODAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkODAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDgwXyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkODEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDgxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkODEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDgxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDgxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDgxKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ4MSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ4MV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkODEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkODEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDgxXyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDMoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDNfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI4MCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjgwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyODAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI4MDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyODAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjgwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI4MCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyODBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI4MCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyODAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI4MF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDYoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ2KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDYgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDZfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDIyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMihsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMl8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDQ7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ0KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNF8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVsb25nPiBGaWVsZDVMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmZpZWxkNV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDVDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBHZXRGaWVsZDUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldEZpZWxkNShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNShpbnQgaW5kZXgsIHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmllbGQ1KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUZpZWxkNShzY2c6OklFbnVtZXJhYmxlPHVsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQ1Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQ1Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNTkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDU5OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkNTkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDU5OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDU5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDU5KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ1OSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ1OV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNTkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNTkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDU5XyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkNyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ3KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDcoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkN18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ3ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ3XyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE2OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTY7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTYodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTYoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTYgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTZfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE2KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE2ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxNl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMzA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDEzMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTMwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEzMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMzAoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTMwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTMwXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQxMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTIoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTJfID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxNzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDE3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxNzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxNyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxNyhib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE3KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE3ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxN18gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMTMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEzKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzXyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQxNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTQ7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTQoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxNCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTRfID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTA0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEwNDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMDQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTA0KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwNCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMDRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEwNCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwNF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTAwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMDA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDEwMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTAwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEwMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMDAoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTAwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTAwXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEwMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTAxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMDE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTAxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEwMShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTAxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMDEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMDFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTAyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxMDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEwMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMDIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTAyKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTAyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMDIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMDJfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEwMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTAzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMDM7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTAzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEwMyhzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTAzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTAzXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI5OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjk7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjkodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjkoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjlfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI5KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI5ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyOV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMzAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDMwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMzAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDMwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDMwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDMwKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzMCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQzMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMzAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDMwXyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNjAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDYwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQ2MCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNjA7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNjAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNjAoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNjAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNjBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDYwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDYwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ2MF8gPSAtMTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI3MSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjcxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyNzEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI3MTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyNzEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjcxKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI3MSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyNzFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI3MSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyNzEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI3MV8gPSAtMTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI3MiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjcyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyNzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI3MjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyNzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjcyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI3MiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyNzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI3MigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyNzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI3Ml8gPSAtMTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE1MCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTUwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxNTAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE1MDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxNTAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTUwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1MCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxNTBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE1MCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNTAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE1MF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjM7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjMoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyM18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI0OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDI0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI0KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyNCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyNF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI0XyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjUoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI1ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyNV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTUgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgRmllbGQxNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxNV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE1KGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxNV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUZpZWxkMTUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0ZpZWxkMTUgJiYNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTFTdWJNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmZpZWxkMTVfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0LmZpZWxkMTVfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxNV8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNzggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDc4OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkNzggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDc4OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDc4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDc4KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ3OCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ3OF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNzgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNzggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDc4XyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNjcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDY3OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQ2NyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNjc7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNjcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNjcoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNjcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNjdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDY3KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDY3ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ2N18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNjggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDY4OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQ2OCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNjg7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNjgodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNjgoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNjggPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNjhfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDY4KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDY4ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ2OF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTI4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMjg7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDEyOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI4OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEyOCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMjgoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTI4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyOF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTI4KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyOCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI4XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMjkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEyOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTI5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMjk7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTI5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEyOShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTI5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyOV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTI5KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyOSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI5XyA9ICJ4eHh4eHh4eHh4eHh4eHh4eHh4eHgiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMzE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDEzMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTMxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEzMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMzEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTMxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTMxXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFNpemVNZXNzYWdlMSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLkdvb2dsZVNpemVQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8U2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSwgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTaXplTWVzc2FnZTFTdWJNZXNzYWdlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5Hb29nbGVTaXplUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TaXplTWVzc2FnZTFTdWJNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UsIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLkdvb2dsZVNpemVQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NpemVNZXNzYWdlMVN1Yk1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDNGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDM7DQorICAgIHByaXZhdGUgaW50IGZpZWxkM187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTVGaWVsZE51bWJlciA9IDE1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxNTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxNV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTUgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDE1XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTJGaWVsZE51bWJlciA9IDEyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMjsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMTJfID0gdHJ1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDEyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEzRmllbGROdW1iZXIgPSAxMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTM7DQorICAgIHByaXZhdGUgbG9uZyBmaWVsZDEzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBGaWVsZDEzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxM187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE0RmllbGROdW1iZXIgPSAxNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTQ7DQorICAgIHByaXZhdGUgbG9uZyBmaWVsZDE0XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBGaWVsZDE0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE2RmllbGROdW1iZXIgPSAxNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTY7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTZfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxOUZpZWxkTnVtYmVyID0gMTk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE5Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDE5XyA9IDI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTkgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE5OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDE5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxOV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIwRmllbGROdW1iZXIgPSAyMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjA7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDIwXyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIwOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQyMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyOEZpZWxkTnVtYmVyID0gMjg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI4Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQyOF8gPSB0cnVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI4IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyODsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMjggew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDI4XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjFGaWVsZE51bWJlciA9IDIxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMTsNCisgICAgcHJpdmF0ZSB1bG9uZyBmaWVsZDIxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjE7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIEZpZWxkMjEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjJGaWVsZE51bWJlciA9IDIyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMjsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyMl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIzRmllbGROdW1iZXIgPSAyMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjM7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDIzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDIzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyM187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIwNkZpZWxkTnVtYmVyID0gMjA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMDY7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDIwNl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMDY7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDIwNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjA2XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjAzRmllbGROdW1iZXIgPSAyMDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIwMzsNCisgICAgcHJpdmF0ZSB1aW50IGZpZWxkMjAzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIwMzsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBGaWVsZDIwMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjAzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjA0RmllbGROdW1iZXIgPSAyMDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIwNDsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyMDRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjA0OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIwNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjA0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjA1RmllbGROdW1iZXIgPSAyMDU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIwNTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQyMDVfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA1IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMDU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjA1IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMDVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMDdGaWVsZE51bWJlciA9IDIwNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjA3Ow0KKyAgICBwcml2YXRlIHVsb25nIGZpZWxkMjA3XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIwNzsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgRmllbGQyMDcgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIwN187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDMwMEZpZWxkTnVtYmVyID0gMzAwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQzMDA7DQorICAgIHByaXZhdGUgdWxvbmcgZmllbGQzMDBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMwMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMzAwOyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBGaWVsZDMwMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMzAwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8U2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2Ugb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBTaXplTWVzc2FnZTFTdWJNZXNzYWdlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkM18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTUoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTVfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQxMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTIoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTJfID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDEzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMyhsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxM18gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDE0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxNDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxNChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxNF8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE2OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE2KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxNigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTZfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE5OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE5KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxOSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTlfID0gMjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDIwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMF8gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI4OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMjggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI4OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDI4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI4KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyOCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyOF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI4XyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjE7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEZpZWxkMjEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIxKHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMjMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIzKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIzXyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQyMDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIwNjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMDYodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjA2KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDYgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMDYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA2ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMDZfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIwMzsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBGaWVsZDIwMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjAzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIwMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMDModWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMDNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIwMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwM18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIwNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjA0OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIwNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMDQoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwNF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjA0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA0XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIwNTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjA1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMDU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjA1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIwNShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwNV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjA1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA1XyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDc7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEZpZWxkMjA3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMDc7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjA3KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIwNyh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMDdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIwNygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDcgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwN18gPSAwVUw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQzMDAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDMwMDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgRmllbGQzMDAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDMwMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQzMDAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMzAwKHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzAwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDMwMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMzAwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMwMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMzAwXyA9IDBVTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLkdvb2dsZVNpemVQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBTaXplTWVzc2FnZTIgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxTaXplTWVzc2FnZTIsIFNpemVNZXNzYWdlMi5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgU2l6ZU1lc3NhZ2UyKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNpemVNZXNzYWdlMiBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgU2l6ZU1lc3NhZ2UyKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UyIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgU2l6ZU1lc3NhZ2UyIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNpemVNZXNzYWdlMiBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5Hb29nbGVTaXplUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TaXplTWVzc2FnZTJfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8U2l6ZU1lc3NhZ2UyLCBTaXplTWVzc2FnZTIuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLkdvb2dsZVNpemVQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NpemVNZXNzYWdlMl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgICNyZWdpb24gTmVzdGVkIHR5cGVzDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgR3JvdXAxIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8R3JvdXAxLCBHcm91cDEuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBHcm91cDEoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdyb3VwMSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgR3JvdXAxKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBHcm91cDEgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEdyb3VwMSBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLkdvb2dsZVNpemVQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NpemVNZXNzYWdlMl9Hcm91cDFfX0Rlc2NyaXB0b3I7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8R3JvdXAxLCBHcm91cDEuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5Hb29nbGVTaXplUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TaXplTWVzc2FnZTJfR3JvdXAxX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDExRmllbGROdW1iZXIgPSAxMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDExOw0KKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDExXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTEgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGZsb2F0IEZpZWxkMTEgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMV87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDI2RmllbGROdW1iZXIgPSAyNjsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI2Ow0KKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDI2XzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjYgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyNjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGZsb2F0IEZpZWxkMjYgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQyNl87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEyRmllbGROdW1iZXIgPSAxMjsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEyOw0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxMl8gPSAiIjsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTIgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDEyIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTJfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxM0ZpZWxkTnVtYmVyID0gMTM7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMzsNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMTNfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTM7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxMyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDEzXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTRGaWVsZE51bWJlciA9IDE0Ow0KKyAgICAgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+IGZpZWxkMTRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gRmllbGQxNExpc3Qgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KGZpZWxkMTRfKTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBGaWVsZDE0Q291bnQgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQxNF8uQ291bnQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgR2V0RmllbGQxNChpbnQgaW5kZXgpIHsNCisgICAgICAgICAgcmV0dXJuIGZpZWxkMTRfW2luZGV4XTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE1RmllbGROdW1iZXIgPSAxNTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE1Ow0KKyAgICAgICAgcHJpdmF0ZSB1bG9uZyBmaWVsZDE1XzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxNTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdWxvbmcgRmllbGQxNSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDE1XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNUZpZWxkTnVtYmVyID0gNTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDU7DQorICAgICAgICBwcml2YXRlIGludCBmaWVsZDVfOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ1IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBGaWVsZDUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQ1XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjdGaWVsZE51bWJlciA9IDI3Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjc7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBmaWVsZDI3XyA9ICIiOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI3OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjcgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQyN187IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDI4RmllbGROdW1iZXIgPSAyODsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI4Ow0KKyAgICAgICAgcHJpdmF0ZSBpbnQgZmllbGQyOF87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI4IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjg7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgRmllbGQyOCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDI4XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjlGaWVsZE51bWJlciA9IDI5Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjk7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBmaWVsZDI5XyA9ICIiOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyOSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI5OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjkgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQyOV87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE2RmllbGROdW1iZXIgPSAxNjsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE2Ow0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxNl8gPSAiIjsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTYgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxNjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDE2IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTZfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMkZpZWxkTnVtYmVyID0gMjI7DQorICAgICAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gZmllbGQyMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICAgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBGaWVsZDIyTGlzdCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoZmllbGQyMl8pOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IEZpZWxkMjJDb3VudCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDIyXy5Db3VudDsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBHZXRGaWVsZDIyKGludCBpbmRleCkgew0KKyAgICAgICAgICByZXR1cm4gZmllbGQyMl9baW5kZXhdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNzNGaWVsZE51bWJlciA9IDczOw0KKyAgICAgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IGZpZWxkNzNfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gRmllbGQ3M0xpc3Qgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KGZpZWxkNzNfKTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBGaWVsZDczQ291bnQgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQ3M18uQ291bnQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgR2V0RmllbGQ3MyhpbnQgaW5kZXgpIHsNCisgICAgICAgICAgcmV0dXJuIGZpZWxkNzNfW2luZGV4XTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIwRmllbGROdW1iZXIgPSAyMDsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIwOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgZmllbGQyMF87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjA7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgRmllbGQyMCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDIwXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjRGaWVsZE51bWJlciA9IDI0Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjQ7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBmaWVsZDI0XyA9ICIiOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI0OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjQgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQyNF87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDMxRmllbGROdW1iZXIgPSAzMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDMxOw0KKyAgICAgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBmaWVsZDMxXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMzEgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQzMTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIEZpZWxkMzEgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQzMV8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHcm91cDEgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHcm91cDEgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHcm91cDEgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgR3JvdXAxIE1ha2VSZWFkT25seSgpIHsNCisgICAgICAgICAgZmllbGQxNF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIGZpZWxkMjJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICBmaWVsZDczXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihHcm91cDEgcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxHcm91cDEsIEJ1aWxkZXI+IHsNCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludGVybmFsIEJ1aWxkZXIoR3JvdXAxIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgR3JvdXAxIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgR3JvdXAxIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICBHcm91cDEgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgR3JvdXAxKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEdyb3VwMSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTIuVHlwZXMuR3JvdXAxLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEdyb3VwMSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyLlR5cGVzLkdyb3VwMS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEdyb3VwMSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDExIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTE7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgZmxvYXQgRmllbGQxMSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDExOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQxMSh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDExKGZsb2F0IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTFfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDExKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTEgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxMV8gPSAwRjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI2OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGZsb2F0IEZpZWxkMjYgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyNjsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkMjYodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyNihmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjYgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDI2XyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyNigpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI2ID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjZfID0gMEY7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxMiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEyOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQxMih2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEyKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMiA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTJfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEyKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTIgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxMl8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMyB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDEzIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTM7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDEzKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTMoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxM18gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTMoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMyA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDEzXyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gRmllbGQxNExpc3Qgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmZpZWxkMTRfOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBGaWVsZDE0Q291bnQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxNENvdW50OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBHZXRGaWVsZDE0KGludCBpbmRleCkgew0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuR2V0RmllbGQxNChpbmRleCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxNChpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmllbGQxNChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTRfLkFkZCh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VGaWVsZDE0KHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDE0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTQoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNF8uQ2xlYXIoKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE1OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICAgIHB1YmxpYyB1bG9uZyBGaWVsZDE1IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTU7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDE1KHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE1KHVsb25nIHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxNSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTVfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE1KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTUgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNV8gPSAwVUw7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDU7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEZpZWxkNSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDU7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDUodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ1KGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkNV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNSgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDUgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQ1XyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjcgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyNzsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQyNyB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI3OyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQyNyh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI3KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyNyA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjdfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI3KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjcgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyN18gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyOCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI4OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBGaWVsZDI4IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjg7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDI4KHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjgoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyOCA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjhfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI4KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjggPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyOF8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI5IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjkgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyOTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkMjkodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyOShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDI5XyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyOSgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI5ID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjlfID0gIiI7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTYgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxNjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxNiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE2OyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQxNih2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE2KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxNiA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTZfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE2KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTYgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNl8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxzdHJpbmc+IEZpZWxkMjJMaXN0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5maWVsZDIyXzsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgRmllbGQyMkNvdW50IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjJDb3VudDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgR2V0RmllbGQyMihpbnQgaW5kZXgpIHsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0LkdldEZpZWxkMjIoaW5kZXgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjIoaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEZpZWxkMjIoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDIyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRmllbGQyMihzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIyKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjJfLkNsZWFyKCk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBGaWVsZDczTGlzdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZmllbGQ3M187IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEZpZWxkNzNDb3VudCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDczQ291bnQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEdldEZpZWxkNzMoaW50IGluZGV4KSB7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRGaWVsZDczKGluZGV4KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDczKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQ3M19baW5kZXhdID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmllbGQ3MyhpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDczXy5BZGQodmFsdWUpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRmllbGQ3MyhzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQ3M18uQWRkKHZhbHVlcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDczKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkNzNfLkNsZWFyKCk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgRmllbGQyMCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIwOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQyMCh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIwKGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjAgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDIwXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMCgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjBfID0gMDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI0OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDI0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjQ7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDI0KHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjQoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI0ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyNF8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjQoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyNCA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDI0XyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMxIHsNCisgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQzMTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBGaWVsZDMxIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMzE7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDMxKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMzEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzEgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDMxXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMzEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQzMSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMzFfID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VGaWVsZDMxKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzRmllbGQzMSAmJg0KKyAgICAgICAgICAgICAgICByZXN1bHQuZmllbGQzMV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5maWVsZDMxXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmZpZWxkMzFfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXN1bHQuZmllbGQzMV8gPSB2YWx1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzEgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQzMSgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMxID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMzFfID0gbnVsbDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIEdyb3VwMSgpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5Hb29nbGVTaXplUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDNGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDM7DQorICAgIHByaXZhdGUgbG9uZyBmaWVsZDNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBGaWVsZDMgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ0RmllbGROdW1iZXIgPSA0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ0Ow0KKyAgICBwcml2YXRlIGxvbmcgZmllbGQ0XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ0OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRmllbGQ0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMzBGaWVsZE51bWJlciA9IDMwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQzMDsNCisgICAgcHJpdmF0ZSBsb25nIGZpZWxkMzBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQzMDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEZpZWxkMzAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDMwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNzVGaWVsZE51bWJlciA9IDc1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ3NTsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkNzVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDc1IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ3NTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkNzUgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDc1XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNkZpZWxkTnVtYmVyID0gNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNjsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQ2XyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDYgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDY7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDJGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI7DQorICAgIHByaXZhdGUgcGI6OkJ5dGVTdHJpbmcgZmllbGQyXyA9IHBiOjpCeXRlU3RyaW5nLkVtcHR5Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgRmllbGQyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjFGaWVsZE51bWJlciA9IDIxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyMV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIxOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDcxRmllbGROdW1iZXIgPSA3MTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNzE7DQorICAgIHByaXZhdGUgaW50IGZpZWxkNzFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDcxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ3MTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQ3MSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNzFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyNUZpZWxkTnVtYmVyID0gMjU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI1Ow0KKyAgICBwcml2YXRlIGZsb2F0IGZpZWxkMjVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI1IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyNTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBGaWVsZDI1IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyNV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEwOUZpZWxkTnVtYmVyID0gMTA5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMDk7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTA5XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDkgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEwOTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMDkgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEwOV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIxMEZpZWxkTnVtYmVyID0gMjEwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMTA7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjEwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIxMDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMTAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIxMF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIxMUZpZWxkTnVtYmVyID0gMjExOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMTE7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjExXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIxMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMTEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIxMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIxMkZpZWxkTnVtYmVyID0gMjEyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMTI7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjEyXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIxMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMTIgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIxMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIxM0ZpZWxkTnVtYmVyID0gMjEzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMTM7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjEzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIxMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMTMgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIxM187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIxNkZpZWxkTnVtYmVyID0gMjE2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMTY7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjE2XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTYgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIxNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMTYgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIxNl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIxN0ZpZWxkTnVtYmVyID0gMjE3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMTc7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjE3XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIxNzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMTcgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIxN187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIxOEZpZWxkTnVtYmVyID0gMjE4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMTg7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjE4XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTggew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIxODsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMTggew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIxOF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIyMEZpZWxkTnVtYmVyID0gMjIwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMjA7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjIwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMjAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIyMDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMjAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIyMF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIyMUZpZWxkTnVtYmVyID0gMjIxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMjE7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjIxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMjEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIyMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMjEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIyMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIyMkZpZWxkTnVtYmVyID0gMjIyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMjI7DQorICAgIHByaXZhdGUgZmxvYXQgZmllbGQyMjJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIyMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjIyOyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IEZpZWxkMjIyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMjJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ2M0ZpZWxkTnVtYmVyID0gNjM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDYzOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDYzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2MyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNjM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkNjMgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDYzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEdyb3VwMUZpZWxkTnVtYmVyID0gMTA7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyLlR5cGVzLkdyb3VwMT4gZ3JvdXAxXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTIuVHlwZXMuR3JvdXAxPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTIuVHlwZXMuR3JvdXAxPiBHcm91cDFMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZ3JvdXAxXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgR3JvdXAxQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBncm91cDFfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMi5UeXBlcy5Hcm91cDEgR2V0R3JvdXAxKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBncm91cDFfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEyOEZpZWxkTnVtYmVyID0gMTI4Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gZmllbGQxMjhfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBGaWVsZDEyOExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoZmllbGQxMjhfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMjhDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTI4Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgR2V0RmllbGQxMjgoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGZpZWxkMTI4X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMzFGaWVsZE51bWJlciA9IDEzMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTMxOw0KKyAgICBwcml2YXRlIGxvbmcgZmllbGQxMzFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTMxOyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRmllbGQxMzEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEzMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEyN0ZpZWxkTnVtYmVyID0gMTI3Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gZmllbGQxMjdfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBGaWVsZDEyN0xpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoZmllbGQxMjdfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMjdDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTI3Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgR2V0RmllbGQxMjcoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGZpZWxkMTI3X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMjlGaWVsZE51bWJlciA9IDEyOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTI5Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDEyOV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTI5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMjk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTI5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMjlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMzBGaWVsZE51bWJlciA9IDEzMDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiBmaWVsZDEzMF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gRmllbGQxMzBMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KGZpZWxkMTMwXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTMwQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEzMF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBHZXRGaWVsZDEzMChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gZmllbGQxMzBfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIwNUZpZWxkTnVtYmVyID0gMjA1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMDU7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDIwNV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA1IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMDU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDIwNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjA1XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjA2RmllbGROdW1iZXIgPSAyMDY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIwNjsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMjA2XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDYgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIwNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMjA2IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMDZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UyIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UyIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTIgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UyIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgU2l6ZU1lc3NhZ2UyIE1ha2VSZWFkT25seSgpIHsNCisgICAgICBncm91cDFfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIGZpZWxkMTI4Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBmaWVsZDEyN18uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgZmllbGQxMzBfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoU2l6ZU1lc3NhZ2UyIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFNpemVNZXNzYWdlMiwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoU2l6ZU1lc3NhZ2UyIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgU2l6ZU1lc3NhZ2UyIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFNpemVNZXNzYWdlMiBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFNpemVNZXNzYWdlMiBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFNpemVNZXNzYWdlMigpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU2l6ZU1lc3NhZ2UyIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNpemVNZXNzYWdlMiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTaXplTWVzc2FnZTIgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDFfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEZpZWxkMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDMobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQzXyA9IDBMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDQ7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNF8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQzMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDMwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQzMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQzMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQzMChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMzBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDMwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQzMF8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDc1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ3NTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDc1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ3NTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ3NSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ3NShib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNzUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNzVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDc1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDc1ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ3NV8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDY7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ2KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDZfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNl8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIEZpZWxkMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIocGI6OkJ5dGVTdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDJfID0gcGI6OkJ5dGVTdHJpbmcuRW1wdHk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ3MSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNzE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDcxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ3MTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ3MSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ3MShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ3MSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ3MV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNzEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNzEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDcxXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEZpZWxkMjUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI1OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDI1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI1KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI1ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyNV8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTA5OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMDkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEwOTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMDkodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTA5KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwOSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMDlfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEwOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwOV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjEwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMTA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIxMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjEwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIxMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMTAoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjEwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjEwXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIxMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjExIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMTE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjExKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIxMShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjExXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMTEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjExID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMTFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjEyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMTIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIxMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMTIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjEyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMTJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjEzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMTM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIxMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjEzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIxMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMTMoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjEzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjEzXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIxNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjE2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMTY7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjE2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIxNihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTYgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjE2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMTYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjE2ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMTZfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxNyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjE3OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMTcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIxNzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMTcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjE3KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxNyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMTdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxNygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTcgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxN18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjE4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMTg7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIxOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjE4OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIxOCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMTgoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjE4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxOF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjE4KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxOCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjE4XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMjAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIyMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjIwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMjA7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjIwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIyMChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMjAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjIwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMjAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMjBfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIyMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjIxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMjEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIyMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMjEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjIxKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIyMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMjFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIyMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMjEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIyMV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMjI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEZpZWxkMjIyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMjI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjIyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIyMihmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIyMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMjJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIyMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMjIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIyMl8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDYzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ2MzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkNjMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDYzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDYzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDYzKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDYzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDYzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ2MygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2MyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNjNfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMi5UeXBlcy5Hcm91cDE+IEdyb3VwMUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZ3JvdXAxXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdyb3VwMUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuR3JvdXAxQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMi5UeXBlcy5Hcm91cDEgR2V0R3JvdXAxKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRHcm91cDEoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRHcm91cDEoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTIuVHlwZXMuR3JvdXAxIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5ncm91cDFfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEdyb3VwMShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMi5UeXBlcy5Hcm91cDEuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZ3JvdXAxX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRHcm91cDEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyLlR5cGVzLkdyb3VwMSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZ3JvdXAxXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEdyb3VwMShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TaXplTWVzc2FnZTIuVHlwZXMuR3JvdXAxLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmdyb3VwMV8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUdyb3VwMShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNpemVNZXNzYWdlMi5UeXBlcy5Hcm91cDE+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5ncm91cDFfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyR3JvdXAxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5ncm91cDFfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxzdHJpbmc+IEZpZWxkMTI4TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5maWVsZDEyOF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDEyOENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMjhDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEdldEZpZWxkMTI4KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRGaWVsZDEyOChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTI4KGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyOF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmllbGQxMjgoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyOF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUZpZWxkMTI4KHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMjhfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMjgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI4Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMzE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgRmllbGQxMzEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEzMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMzEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTMxKGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMzEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTMxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMzEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMzFfID0gMEw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxzdHJpbmc+IEZpZWxkMTI3TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5maWVsZDEyN187IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDEyN0NvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMjdDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEdldEZpZWxkMTI3KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRGaWVsZDEyNyhpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTI3KGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyN19baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmllbGQxMjcoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyN18uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUZpZWxkMTI3KHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMjdfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMjcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI3Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTI5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMjk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDEyOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI5OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEyOSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMjkoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTI5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyOV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTI5KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyOSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI5XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBGaWVsZDEzMExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZmllbGQxMzBfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMzBDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTMwQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0RmllbGQxMzAoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldEZpZWxkMTMwKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMzAoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTMwX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRGaWVsZDEzMChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTMwXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRmllbGQxMzAoc2NnOjpJRW51bWVyYWJsZTxsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMzBfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMzAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTMwXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQyMDUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIwNTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMDUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjA1KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMDUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA1ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMDVfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIwNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDIwNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjA2OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIwNih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMDYoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMDZfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIwNigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDYgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwNl8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgU2l6ZU1lc3NhZ2UyKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guR29vZ2xlU2l6ZVByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8U2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UsIFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLkdvb2dsZVNpemVQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLCBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guR29vZ2xlU2l6ZVByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMkZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkM0ZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMzsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNEZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNDsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkNF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDVGaWVsZE51bWJlciA9IDU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDU7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDUgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ2RmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ2Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQ2XyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDdGaWVsZE51bWJlciA9IDc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDc7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDdfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDcgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ4RmllbGROdW1iZXIgPSA4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ4Ow0KKyAgICBwcml2YXRlIGZsb2F0IGZpZWxkOF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkODsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBGaWVsZDggew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDhfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ5RmllbGROdW1iZXIgPSA5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ5Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQ5XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ5OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQ5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTBGaWVsZE51bWJlciA9IDEwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMDsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDEwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQxMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMUZpZWxkTnVtYmVyID0gMTE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDExOw0KKyAgICBwcml2YXRlIGxvbmcgZmllbGQxMV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDExOyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRmllbGQxMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMV8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEZpZWxkMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMl8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEZpZWxkMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDMoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkM18gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQ0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ0OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDRfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDUoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ1ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ1XyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDY7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ2KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDZfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNl8gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDc7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ3KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ3ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkN18gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDg7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEZpZWxkOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkODsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDgoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDhfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkOCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkOF8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQ5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ5OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDkodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkOShib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkOSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ5KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDlfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEZpZWxkMTAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEwKGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMF8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDExIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDExIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMShsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDExKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDExID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMV8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5Hb29nbGVTaXplUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgICNlbmRyZWdpb24NCisgIA0KK30NCisNCisjZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b0JlbmNoL1Rlc3RQcm90b3MvR29vZ2xlU3BlZWRQcm90b0ZpbGUuY3MgYi9jc2hhcnAvc3JjL1Byb3RvQmVuY2gvVGVzdFByb3Rvcy9Hb29nbGVTcGVlZFByb3RvRmlsZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTE4OTUwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b0JlbmNoL1Rlc3RQcm90b3MvR29vZ2xlU3BlZWRQcm90b0ZpbGUuY3MKQEAgLTAsMCArMSw2NjM3IEBACisvLyBHZW5lcmF0ZWQgYnkgUHJvdG9HZW4sIFZlcnNpb249Mi40LjEuNTU1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTU1ZjcxMjUyMzRiZWI1ODkuICBETyBOT1QgRURJVCENCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxDQorI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KKw0KK3VzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoIHsNCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBHb29nbGVTcGVlZFByb3RvRmlsZSB7DQorICANCisgICAgI3JlZ2lvbiBFeHRlbnNpb24gcmVnaXN0cmF0aW9uDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3RlckFsbEV4dGVuc2lvbnMocGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIFN0YXRpYyB2YXJpYWJsZXMNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTFfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTEsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTEuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTFfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTFTdWJNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTFTdWJNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TcGVlZE1lc3NhZ2UyX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TcGVlZE1lc3NhZ2UyX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TcGVlZE1lc3NhZ2UyX0dyb3VwMV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMi5UeXBlcy5Hcm91cDEsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TcGVlZE1lc3NhZ2UyX0dyb3VwMV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBEZXNjcmlwdG9yDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIHByaXZhdGUgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsNCisgICAgDQorICAgIHN0YXRpYyBHb29nbGVTcGVlZFByb3RvRmlsZSgpIHsNCisgICAgICBieXRlW10gZGVzY3JpcHRvckRhdGEgPSBnbG9iYWw6OlN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoDQorICAgICAgICAgIHN0cmluZy5Db25jYXQoDQorICAgICAgICAgICAgIkNoMWlaVzVqYUcxaGNtdHpMMmR2YjJkc1pWOXpjR1ZsWkM1d2NtOTBieElLWW1WdVkyaHRZWEpyY3hvayIsIA0KKyAgICAgICAgICAgICJaMjl2WjJ4bEwzQnliM1J2WW5WbUwyTnphR0Z5Y0Y5dmNIUnBiMjV6TG5CeWIzUnZJdmdHQ2cxVGNHVmwiLCANCisgICAgICAgICAgICAiWkUxbGMzTmhaMlV4RWc0S0JtWnBaV3hrTVJnQklBSW9DUklPQ2dabWFXVnNaRGtZQ1NBQktBa1NEd29IIiwgDQorICAgICAgICAgICAgIlptbGxiR1F4T0JnU0lBRW9DUklXQ2dkbWFXVnNaRGd3R0ZBZ0FTZ0lPZ1ZtWVd4elpSSVZDZ2RtYVdWcyIsIA0KKyAgICAgICAgICAgICJaRGd4R0ZFZ0FTZ0lPZ1IwY25WbEVnNEtCbVpwWld4a01oZ0NJQUlvQlJJT0NnWm1hV1ZzWkRNWUF5QUMiLCANCisgICAgICAgICAgICAiS0FVU0VRb0labWxsYkdReU9EQVltQUlnQVNnRkVoRUtCbVpwWld4a05oZ0dJQUVvQlRvQk1CSVBDZ2RtIiwgDQorICAgICAgICAgICAgImFXVnNaREl5R0JZZ0FTZ0RFZzRLQm1acFpXeGtOQmdFSUFFb0NSSU9DZ1ptYVdWc1pEVVlCU0FES0FZUyIsIA0KKyAgICAgICAgICAgICJGZ29IWm1sbGJHUTFPUmc3SUFFb0NEb0ZabUZzYzJVU0Rnb0dabWxsYkdRM0dBY2dBU2dKRWc4S0IyWnAiLCANCisgICAgICAgICAgICAiWld4a01UWVlFQ0FCS0FVU0ZBb0labWxsYkdReE16QVlnZ0VnQVNnRk9nRXdFaFVLQjJacFpXeGtNVElZIiwgDQorICAgICAgICAgICAgIkRDQUJLQWc2QkhSeWRXVVNGUW9IWm1sbGJHUXhOeGdSSUFFb0NEb0VkSEoxWlJJVkNnZG1hV1ZzWkRFeiIsIA0KKyAgICAgICAgICAgICJHQTBnQVNnSU9nUjBjblZsRWhVS0IyWnBaV3hrTVRRWURpQUJLQWc2QkhSeWRXVVNFd29JWm1sbGJHUXgiLCANCisgICAgICAgICAgICAiTURRWWFDQUJLQVU2QVRBU0V3b0labWxsYkdReE1EQVlaQ0FCS0FVNkFUQVNFd29JWm1sbGJHUXhNREVZIiwgDQorICAgICAgICAgICAgIlpTQUJLQVU2QVRBU0VBb0labWxsYkdReE1ESVlaaUFCS0FrU0VBb0labWxsYkdReE1ETVlaeUFCS0FrUyIsIA0KKyAgICAgICAgICAgICJFZ29IWm1sbGJHUXlPUmdkSUFFb0JUb0JNQklXQ2dkbWFXVnNaRE13R0I0Z0FTZ0lPZ1ZtWVd4elpSSVQiLCANCisgICAgICAgICAgICAiQ2dkbWFXVnNaRFl3R0R3Z0FTZ0ZPZ0l0TVJJVkNnaG1hV1ZzWkRJM01SaVBBaUFCS0FVNkFpMHhFaFVLIiwgDQorICAgICAgICAgICAgIkNHWnBaV3hrTWpjeUdKQUNJQUVvQlRvQ0xURVNFUW9JWm1sbGJHUXhOVEFZbGdFZ0FTZ0ZFaElLQjJacCIsIA0KKyAgICAgICAgICAgICJaV3hrTWpNWUZ5QUJLQVU2QVRBU0Znb0habWxsYkdReU5CZ1lJQUVvQ0RvRlptRnNjMlVTRWdvSFptbGwiLCANCisgICAgICAgICAgICAiYkdReU5SZ1pJQUVvQlRvQk1CSTBDZ2RtYVdWc1pERTFHQThnQVNnTE1pTXVZbVZ1WTJodFlYSnJjeTVUIiwgDQorICAgICAgICAgICAgImNHVmxaRTFsYzNOaFoyVXhVM1ZpVFdWemMyRm5aUklQQ2dkbWFXVnNaRGM0R0U0Z0FTZ0lFaElLQjJacCIsIA0KKyAgICAgICAgICAgICJaV3hrTmpjWVF5QUJLQVU2QVRBU0R3b0habWxsYkdRMk9CaEVJQUVvQlJJVUNnaG1hV1ZzWkRFeU9CaUEiLCANCisgICAgICAgICAgICAiQVNBQktBVTZBVEFTS0FvSVptbGxiR1F4TWprWWdRRWdBU2dKT2hWNGVIaDRlSGg0ZUhoNGVIaDRlSGg0IiwgDQorICAgICAgICAgICAgImVIaDRlSGdTRkFvSVptbGxiR1F4TXpFWWd3RWdBU2dGT2dFd0lxSURDaGRUY0dWbFpFMWxjM05oWjJVeCIsIA0KKyAgICAgICAgICAgICJVM1ZpVFdWemMyRm5aUklSQ2dabWFXVnNaREVZQVNBQktBVTZBVEFTRVFvR1ptbGxiR1F5R0FJZ0FTZ0YiLCANCisgICAgICAgICAgICAiT2dFd0VoRUtCbVpwWld4a014Z0RJQUVvQlRvQk1CSVBDZ2RtYVdWc1pERTFHQThnQVNnSkVoVUtCMlpwIiwgDQorICAgICAgICAgICAgIlpXeGtNVElZRENBQktBZzZCSFJ5ZFdVU0R3b0habWxsYkdReE14Z05JQUVvQXhJUENnZG1hV1ZzWkRFMCIsIA0KKyAgICAgICAgICAgICJHQTRnQVNnREVnOEtCMlpwWld4a01UWVlFQ0FCS0FVU0Vnb0habWxsYkdReE9SZ1RJQUVvQlRvQk1oSVYiLCANCisgICAgICAgICAgICAiQ2dkbWFXVnNaREl3R0JRZ0FTZ0lPZ1IwY25WbEVoVUtCMlpwWld4a01qZ1lIQ0FCS0FnNkJIUnlkV1VTIiwgDQorICAgICAgICAgICAgIkR3b0habWxsYkdReU1SZ1ZJQUVvQmhJUENnZG1hV1ZzWkRJeUdCWWdBU2dGRWhZS0IyWnBaV3hrTWpNWSIsIA0KKyAgICAgICAgICAgICJGeUFCS0FnNkJXWmhiSE5sRWhnS0NHWnBaV3hrTWpBMkdNNEJJQUVvQ0RvRlptRnNjMlVTRVFvSVptbGwiLCANCisgICAgICAgICAgICAiYkdReU1ETVl5d0VnQVNnSEVoRUtDR1pwWld4a01qQTBHTXdCSUFFb0JSSVJDZ2htYVdWc1pESXdOUmpOIiwgDQorICAgICAgICAgICAgIkFTQUJLQWtTRVFvSVptbGxiR1F5TURjWXp3RWdBU2dFRWhFS0NHWnBaV3hrTXpBd0dLd0NJQUVvQkNMSyIsIA0KKyAgICAgICAgICAgICJCd29OVTNCbFpXUk5aWE56WVdkbE1oSU9DZ1ptYVdWc1pERVlBU0FCS0FrU0Rnb0dabWxsYkdRekdBTWciLCANCisgICAgICAgICAgICAiQVNnREVnNEtCbVpwWld4a05CZ0VJQUVvQXhJUENnZG1hV1ZzWkRNd0dCNGdBU2dERWhZS0IyWnBaV3hrIiwgDQorICAgICAgICAgICAgIk56VVlTeUFCS0FnNkJXWmhiSE5sRWc0S0JtWnBaV3hrTmhnR0lBRW9DUklPQ2dabWFXVnNaRElZQWlBQiIsIA0KKyAgICAgICAgICAgICJLQXdTRWdvSFptbGxiR1F5TVJnVklBRW9CVG9CTUJJUENnZG1hV1ZzWkRjeEdFY2dBU2dGRWc4S0IyWnAiLCANCisgICAgICAgICAgICAiWld4a01qVVlHU0FCS0FJU0V3b0labWxsYkdReE1Ea1liU0FCS0FVNkFUQVNGQW9JWm1sbGJHUXlNVEFZIiwgDQorICAgICAgICAgICAgIjBnRWdBU2dGT2dFd0VoUUtDR1pwWld4a01qRXhHTk1CSUFFb0JUb0JNQklVQ2dobWFXVnNaREl4TWhqVSIsIA0KKyAgICAgICAgICAgICJBU0FCS0FVNkFUQVNGQW9JWm1sbGJHUXlNVE1ZMVFFZ0FTZ0ZPZ0V3RWhRS0NHWnBaV3hrTWpFMkdOZ0IiLCANCisgICAgICAgICAgICAiSUFFb0JUb0JNQklVQ2dobWFXVnNaREl4TnhqWkFTQUJLQVU2QVRBU0ZBb0labWxsYkdReU1UZ1kyZ0VnIiwgDQorICAgICAgICAgICAgIkFTZ0ZPZ0V3RWhRS0NHWnBaV3hrTWpJd0dOd0JJQUVvQlRvQk1CSVVDZ2htYVdWc1pESXlNUmpkQVNBQiIsIA0KKyAgICAgICAgICAgICJLQVU2QVRBU0ZBb0labWxsYkdReU1qSVkzZ0VnQVNnQ09nRXdFZzhLQjJacFpXeGtOak1ZUHlBQktBVVMiLCANCisgICAgICAgICAgICAiTUFvR1ozSnZkWEF4R0FvZ0F5Z0tNaUF1WW1WdVkyaHRZWEpyY3k1VGNHVmxaRTFsYzNOaFoyVXlMa2R5IiwgDQorICAgICAgICAgICAgImIzVndNUklSQ2dobWFXVnNaREV5T0JpQUFTQURLQWtTRVFvSVptbGxiR1F4TXpFWWd3RWdBU2dERWhBSyIsIA0KKyAgICAgICAgICAgICJDR1pwWld4a01USTNHSDhnQXlnSkVoRUtDR1pwWld4a01USTVHSUVCSUFFb0JSSVJDZ2htYVdWc1pERXoiLCANCisgICAgICAgICAgICAiTUJpQ0FTQURLQU1TR0FvSVptbGxiR1F5TURVWXpRRWdBU2dJT2dWbVlXeHpaUklZQ2dobWFXVnNaREl3IiwgDQorICAgICAgICAgICAgIk5oak9BU0FCS0FnNkJXWmhiSE5sR3NNQ0NnWkhjbTkxY0RFU0R3b0habWxsYkdReE1SZ0xJQUlvQWhJUCIsIA0KKyAgICAgICAgICAgICJDZ2RtYVdWc1pESTJHQm9nQVNnQ0VnOEtCMlpwWld4a01USVlEQ0FCS0FrU0R3b0habWxsYkdReE14Z04iLCANCisgICAgICAgICAgICAiSUFFb0NSSVBDZ2RtYVdWc1pERTBHQTRnQXlnSkVnOEtCMlpwWld4a01UVVlEeUFDS0FRU0Rnb0dabWxsIiwgDQorICAgICAgICAgICAgImJHUTFHQVVnQVNnRkVnOEtCMlpwWld4a01qY1lHeUFCS0FrU0R3b0habWxsYkdReU9CZ2NJQUVvQlJJUCIsIA0KKyAgICAgICAgICAgICJDZ2RtYVdWc1pESTVHQjBnQVNnSkVnOEtCMlpwWld4a01UWVlFQ0FCS0FrU0R3b0habWxsYkdReU1oZ1ciLCANCisgICAgICAgICAgICAiSUFNb0NSSVBDZ2RtYVdWc1pEY3pHRWtnQXlnRkVoSUtCMlpwWld4a01qQVlGQ0FCS0FVNkFUQVNEd29IIiwgDQorICAgICAgICAgICAgIlptbGxiR1F5TkJnWUlBRW9DUkk0Q2dkbWFXVnNaRE14R0I4Z0FTZ0xNaWN1WW1WdVkyaHRZWEpyY3k1VCIsIA0KKyAgICAgICAgICAgICJjR1ZsWkUxbGMzTmhaMlV5UjNKdmRYQmxaRTFsYzNOaFoyVWkzd0VLRzFOd1pXVmtUV1Z6YzJGblpUSkgiLCANCisgICAgICAgICAgICAiY205MWNHVmtUV1Z6YzJGblpSSU9DZ1ptYVdWc1pERVlBU0FCS0FJU0Rnb0dabWxsYkdReUdBSWdBU2dDIiwgDQorICAgICAgICAgICAgIkVoRUtCbVpwWld4a014Z0RJQUVvQWpvQk1CSU9DZ1ptYVdWc1pEUVlCQ0FCS0FnU0Rnb0dabWxsYkdRMSIsIA0KKyAgICAgICAgICAgICJHQVVnQVNnSUVoUUtCbVpwWld4a05oZ0dJQUVvQ0RvRWRISjFaUklWQ2dabWFXVnNaRGNZQnlBQktBZzYiLCANCisgICAgICAgICAgICAiQldaaGJITmxFZzRLQm1acFpXeGtPQmdJSUFFb0FoSU9DZ1ptYVdWc1pEa1lDU0FCS0FnU0R3b0habWxsIiwgDQorICAgICAgICAgICAgImJHUXhNQmdLSUFFb0FoSVBDZ2RtYVdWc1pERXhHQXNnQVNnRFFrdENDMGR2YjJkc1pWTndaV1ZrU0FIQyIsIA0KKyAgICAgICAgICAgICJQamtLSVVkdmIyZHNaUzVRY205MGIyTnZiRUoxWm1abGNuTXVVSEp2ZEc5Q1pXNWphQklVUjI5dloyeGwiLCANCisgICAgICAgICAgIlUzQmxaV1JRY205MGIwWnBiR1U9IikpOw0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgYXNzaWduZXIgPSBkZWxlZ2F0ZShwYmQ6OkZpbGVEZXNjcmlwdG9yIHJvb3QpIHsNCisgICAgICAgIGRlc2NyaXB0b3IgPSByb290Ow0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTFfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TcGVlZE1lc3NhZ2UxX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UxLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UxLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TcGVlZE1lc3NhZ2UxX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRmllbGQxIiwgIkZpZWxkOSIsICJGaWVsZDE4IiwgIkZpZWxkODAiLCAiRmllbGQ4MSIsICJGaWVsZDIiLCAiRmllbGQzIiwgIkZpZWxkMjgwIiwgIkZpZWxkNiIsICJGaWVsZDIyIiwgIkZpZWxkNCIsICJGaWVsZDUiLCAiRmllbGQ1OSIsICJGaWVsZDciLCAiRmllbGQxNiIsICJGaWVsZDEzMCIsICJGaWVsZDEyIiwgIkZpZWxkMTciLCAiRmllbGQxMyIsICJGaWVsZDE0IiwgIkZpZWxkMTA0IiwgIkZpZWxkMTAwIiwgIkZpZWxkMTAxIiwgIkZpZWxkMTAyIiwgIkZpZWxkMTAzIiwgIkZpZWxkMjkiLCAiRmllbGQzMCIsICJGaWVsZDYwIiwgIkZpZWxkMjcxIiwgIkZpZWxkMjcyIiwgIkZpZWxkMTUwIiwgIkZpZWxkMjMiLCAiRmllbGQyNCIsICJGaWVsZDI1IiwgIkZpZWxkMTUiLCAiRmllbGQ3OCIsICJGaWVsZDY3IiwgIkZpZWxkNjgiLCAiRmllbGQxMjgiLCAiRmllbGQxMjkiLCAiRmllbGQxMzEiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTFTdWJNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTFTdWJNZXNzYWdlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRmllbGQxIiwgIkZpZWxkMiIsICJGaWVsZDMiLCAiRmllbGQxNSIsICJGaWVsZDEyIiwgIkZpZWxkMTMiLCAiRmllbGQxNCIsICJGaWVsZDE2IiwgIkZpZWxkMTkiLCAiRmllbGQyMCIsICJGaWVsZDI4IiwgIkZpZWxkMjEiLCAiRmllbGQyMiIsICJGaWVsZDIzIiwgIkZpZWxkMjA2IiwgIkZpZWxkMjAzIiwgIkZpZWxkMjA0IiwgIkZpZWxkMjA1IiwgIkZpZWxkMjA3IiwgIkZpZWxkMzAwIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU3BlZWRNZXNzYWdlMl9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzJdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTJfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTJfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJGaWVsZDEiLCAiRmllbGQzIiwgIkZpZWxkNCIsICJGaWVsZDMwIiwgIkZpZWxkNzUiLCAiRmllbGQ2IiwgIkZpZWxkMiIsICJGaWVsZDIxIiwgIkZpZWxkNzEiLCAiRmllbGQyNSIsICJGaWVsZDEwOSIsICJGaWVsZDIxMCIsICJGaWVsZDIxMSIsICJGaWVsZDIxMiIsICJGaWVsZDIxMyIsICJGaWVsZDIxNiIsICJGaWVsZDIxNyIsICJGaWVsZDIxOCIsICJGaWVsZDIyMCIsICJGaWVsZDIyMSIsICJGaWVsZDIyMiIsICJGaWVsZDYzIiwgIkdyb3VwMSIsICJGaWVsZDEyOCIsICJGaWVsZDEzMSIsICJGaWVsZDEyNyIsICJGaWVsZDEyOSIsICJGaWVsZDEzMCIsICJGaWVsZDIwNSIsICJGaWVsZDIwNiIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTJfR3JvdXAxX19EZXNjcmlwdG9yID0gaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTJfX0Rlc2NyaXB0b3IuTmVzdGVkVHlwZXNbMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU3BlZWRNZXNzYWdlMl9Hcm91cDFfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU3BlZWRNZXNzYWdlMl9Hcm91cDFfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJGaWVsZDExIiwgIkZpZWxkMjYiLCAiRmllbGQxMiIsICJGaWVsZDEzIiwgIkZpZWxkMTQiLCAiRmllbGQxNSIsICJGaWVsZDUiLCAiRmllbGQyNyIsICJGaWVsZDI4IiwgIkZpZWxkMjkiLCAiRmllbGQxNiIsICJGaWVsZDIyIiwgIkZpZWxkNzMiLCAiRmllbGQyMCIsICJGaWVsZDI0IiwgIkZpZWxkMzEiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1szXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJGaWVsZDEiLCAiRmllbGQyIiwgIkZpZWxkMyIsICJGaWVsZDQiLCAiRmllbGQ1IiwgIkZpZWxkNiIsICJGaWVsZDciLCAiRmllbGQ4IiwgIkZpZWxkOSIsICJGaWVsZDEwIiwgIkZpZWxkMTEiLCB9KTsNCisgICAgICAgIHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IHBiOjpFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIHJldHVybiByZWdpc3RyeTsNCisgICAgICB9Ow0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKGRlc2NyaXB0b3JEYXRhLA0KKyAgICAgICAgICBuZXcgcGJkOjpGaWxlRGVzY3JpcHRvcltdIHsNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5EZXNjcmlwdG9yLCANCisgICAgICAgICAgfSwgYXNzaWduZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICB9DQorICAjcmVnaW9uIE1lc3NhZ2VzDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFNwZWVkTWVzc2FnZTEgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxTcGVlZE1lc3NhZ2UxLCBTcGVlZE1lc3NhZ2UxLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBTcGVlZE1lc3NhZ2UxKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNwZWVkTWVzc2FnZTEgZGVmYXVsdEluc3RhbmNlID0gbmV3IFNwZWVkTWVzc2FnZTEoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3NwZWVkTWVzc2FnZTFGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImZpZWxkMSIsICJmaWVsZDEwMCIsICJmaWVsZDEwMSIsICJmaWVsZDEwMiIsICJmaWVsZDEwMyIsICJmaWVsZDEwNCIsICJmaWVsZDEyIiwgImZpZWxkMTI4IiwgImZpZWxkMTI5IiwgImZpZWxkMTMiLCAiZmllbGQxMzAiLCAiZmllbGQxMzEiLCAiZmllbGQxNCIsICJmaWVsZDE1IiwgImZpZWxkMTUwIiwgImZpZWxkMTYiLCAiZmllbGQxNyIsICJmaWVsZDE4IiwgImZpZWxkMiIsICJmaWVsZDIyIiwgImZpZWxkMjMiLCAiZmllbGQyNCIsICJmaWVsZDI1IiwgImZpZWxkMjcxIiwgImZpZWxkMjcyIiwgImZpZWxkMjgwIiwgImZpZWxkMjkiLCAiZmllbGQzIiwgImZpZWxkMzAiLCAiZmllbGQ0IiwgImZpZWxkNSIsICJmaWVsZDU5IiwgImZpZWxkNiIsICJmaWVsZDYwIiwgImZpZWxkNjciLCAiZmllbGQ2OCIsICJmaWVsZDciLCAiZmllbGQ3OCIsICJmaWVsZDgwIiwgImZpZWxkODEiLCAiZmllbGQ5IiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3NwZWVkTWVzc2FnZTFGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAsIDgwMCwgODA4LCA4MTgsIDgyNiwgODMyLCA5NiwgMTAyNCwgMTAzNCwgMTA0LCAxMDQwLCAxMDQ4LCAxMTIsIDEyMiwgMTIwMCwgMTI4LCAxMzYsIDE0NiwgMTYsIDE3NiwgMTg0LCAxOTIsIDIwMCwgMjE2OCwgMjE3NiwgMjI0MCwgMjMyLCAyNCwgMjQwLCAzNCwgNDEsIDQ3MiwgNDgsIDQ4MCwgNTM2LCA1NDQsIDU4LCA2MjQsIDY0MCwgNjQ4LCA3NCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTEgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBTcGVlZE1lc3NhZ2UxIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTEgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guR29vZ2xlU3BlZWRQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTFfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8U3BlZWRNZXNzYWdlMSwgU3BlZWRNZXNzYWdlMS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guR29vZ2xlU3BlZWRQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTFfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDlGaWVsZE51bWJlciA9IDk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDk7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkOV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ5OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDkgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxOEZpZWxkTnVtYmVyID0gMTg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE4Ow0KKyAgICBwcml2YXRlIHN0cmluZyBmaWVsZDE4XyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE4IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxODsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMThfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ4MEZpZWxkTnVtYmVyID0gODA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDgwOw0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQ4MF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkODAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDgwOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQ4MCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkODBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ4MUZpZWxkTnVtYmVyID0gODE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDgxOw0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQ4MV8gPSB0cnVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDgxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ4MTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkODEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDgxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMkZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQzRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQzOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkM187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDI4MEZpZWxkTnVtYmVyID0gMjgwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyODA7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjgwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyODAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI4MDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyODAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDI4MF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDZGaWVsZE51bWJlciA9IDY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDY7DQorICAgIHByaXZhdGUgaW50IGZpZWxkNl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQ2IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ2XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjJGaWVsZE51bWJlciA9IDIyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMjsNCisgICAgcHJpdmF0ZSBsb25nIGZpZWxkMjJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEZpZWxkMjIgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNEZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNDsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQ0XyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDVGaWVsZE51bWJlciA9IDU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+IGZpZWxkNV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1bG9uZz4gRmllbGQ1TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShmaWVsZDVfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQ1Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDVfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBHZXRGaWVsZDUoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGZpZWxkNV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNTlGaWVsZE51bWJlciA9IDU5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ1OTsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkNTlfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDU5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ1OTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkNTkgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDU5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkN0ZpZWxkTnVtYmVyID0gNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNzsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQ3XyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkN187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE2RmllbGROdW1iZXIgPSAxNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTY7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTZfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMzBGaWVsZE51bWJlciA9IDEzMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTMwOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDEzMF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMzA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTMwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMzBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMkZpZWxkTnVtYmVyID0gMTI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEyOw0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQxMl8gPSB0cnVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMTIgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTdGaWVsZE51bWJlciA9IDE3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxNzsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMTdfID0gdHJ1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDE3IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxN187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEzRmllbGROdW1iZXIgPSAxMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTM7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDEzXyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEzOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQxMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxNEZpZWxkTnVtYmVyID0gMTQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE0Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQxNF8gPSB0cnVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxNDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMTQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDE0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTA0RmllbGROdW1iZXIgPSAxMDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEwNDsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxMDRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTA0OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDEwNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTA0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTAwRmllbGROdW1iZXIgPSAxMDA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEwMDsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxMDBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTAwOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDEwMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTAwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTAxRmllbGROdW1iZXIgPSAxMDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEwMTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxMDFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTAxOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDEwMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTAxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTAyRmllbGROdW1iZXIgPSAxMDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEwMjsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxMDJfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTAyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMDI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTAyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMDJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMDNGaWVsZE51bWJlciA9IDEwMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTAzOw0KKyAgICBwcml2YXRlIHN0cmluZyBmaWVsZDEwM18gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEwMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxMDMgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEwM187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDI5RmllbGROdW1iZXIgPSAyOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjk7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjlfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyOTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQzMEZpZWxkTnVtYmVyID0gMzA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDMwOw0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQzMF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMzAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDMwOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQzMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMzBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ2MEZpZWxkTnVtYmVyID0gNjA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDYwOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDYwXyA9IC0xOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDYwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ2MDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQ2MCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNjBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyNzFGaWVsZE51bWJlciA9IDI3MTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjcxOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDI3MV8gPSAtMTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNzEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI3MTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyNzEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDI3MV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDI3MkZpZWxkTnVtYmVyID0gMjcyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyNzI7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjcyXyA9IC0xOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI3MiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjcyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDI3MiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjcyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTUwRmllbGROdW1iZXIgPSAxNTA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE1MDsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxNTBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE1MCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTUwOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDE1MCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTUwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjNGaWVsZE51bWJlciA9IDIzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMzsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyM187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIzOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyM187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDI0RmllbGROdW1iZXIgPSAyNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjQ7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDI0XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDI0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDI1RmllbGROdW1iZXIgPSAyNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjU7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI1IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyNTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxNUZpZWxkTnVtYmVyID0gMTU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE1Ow0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIGZpZWxkMTVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE1IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxNTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSBGaWVsZDE1IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxNV8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ3OEZpZWxkTnVtYmVyID0gNzg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDc4Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQ3OF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNzggew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDc4OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQ3OCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNzhfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ2N0ZpZWxkTnVtYmVyID0gNjc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDY3Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDY3XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2NyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNjc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkNjcgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDY3XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNjhGaWVsZE51bWJlciA9IDY4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ2ODsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQ2OF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNjggew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDY4OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDY4IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ2OF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEyOEZpZWxkTnVtYmVyID0gMTI4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMjg7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTI4XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMjggew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEyODsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMjggew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEyOF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEyOUZpZWxkTnVtYmVyID0gMTI5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMjk7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMTI5XyA9ICJ4eHh4eHh4eHh4eHh4eHh4eHh4eHgiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEyOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTI5OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDEyOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTI5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTMxRmllbGROdW1iZXIgPSAxMzE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEzMTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxMzFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTMxOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDEzMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTMxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaWYgKCFoYXNGaWVsZDEpIHJldHVybiBmYWxzZTsNCisgICAgICAgIGlmICghaGFzRmllbGQyKSByZXR1cm4gZmFsc2U7DQorICAgICAgICBpZiAoIWhhc0ZpZWxkMykgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfc3BlZWRNZXNzYWdlMUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0ZpZWxkMSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzBdLCBGaWVsZDEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyLCBmaWVsZF9uYW1lc1sxOF0sIEZpZWxkMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDMsIGZpZWxkX25hbWVzWzI3XSwgRmllbGQzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDQsIGZpZWxkX25hbWVzWzI5XSwgRmllbGQ0KTsNCisgICAgICB9DQorICAgICAgaWYgKGZpZWxkNV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDY0QXJyYXkoNSwgZmllbGRfbmFtZXNbMzBdLCBmaWVsZDVfKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNiwgZmllbGRfbmFtZXNbMzJdLCBGaWVsZDYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ3KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoNywgZmllbGRfbmFtZXNbMzZdLCBGaWVsZDcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ5KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoOSwgZmllbGRfbmFtZXNbNDBdLCBGaWVsZDkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCgxMiwgZmllbGRfbmFtZXNbNl0sIEZpZWxkMTIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCgxMywgZmllbGRfbmFtZXNbOV0sIEZpZWxkMTMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxNCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCgxNCwgZmllbGRfbmFtZXNbMTJdLCBGaWVsZDE0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMTUsIGZpZWxkX25hbWVzWzEzXSwgRmllbGQxNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDE2KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxNiwgZmllbGRfbmFtZXNbMTVdLCBGaWVsZDE2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTcpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMTcsIGZpZWxkX25hbWVzWzE2XSwgRmllbGQxNyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDE4KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMTgsIGZpZWxkX25hbWVzWzE3XSwgRmllbGQxOCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NCgyMiwgZmllbGRfbmFtZXNbMTldLCBGaWVsZDIyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIzLCBmaWVsZF9uYW1lc1syMF0sIEZpZWxkMjMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyNCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCgyNCwgZmllbGRfbmFtZXNbMjFdLCBGaWVsZDI0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDI1LCBmaWVsZF9uYW1lc1syMl0sIEZpZWxkMjUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyOSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjksIGZpZWxkX25hbWVzWzI2XSwgRmllbGQyOSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDMwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDMwLCBmaWVsZF9uYW1lc1syOF0sIEZpZWxkMzApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ1OSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCg1OSwgZmllbGRfbmFtZXNbMzFdLCBGaWVsZDU5KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNjApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDYwLCBmaWVsZF9uYW1lc1szM10sIEZpZWxkNjApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ2Nykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNjcsIGZpZWxkX25hbWVzWzM0XSwgRmllbGQ2Nyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDY4KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig2OCwgZmllbGRfbmFtZXNbMzVdLCBGaWVsZDY4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNzgpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woNzgsIGZpZWxkX25hbWVzWzM3XSwgRmllbGQ3OCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDgwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDgwLCBmaWVsZF9uYW1lc1szOF0sIEZpZWxkODApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ4MSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCg4MSwgZmllbGRfbmFtZXNbMzldLCBGaWVsZDgxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxMDAsIGZpZWxkX25hbWVzWzFdLCBGaWVsZDEwMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEwMSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTAxLCBmaWVsZF9uYW1lc1syXSwgRmllbGQxMDEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMDIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxMDIsIGZpZWxkX25hbWVzWzNdLCBGaWVsZDEwMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEwMykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEwMywgZmllbGRfbmFtZXNbNF0sIEZpZWxkMTAzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTA0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxMDQsIGZpZWxkX25hbWVzWzVdLCBGaWVsZDEwNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEyOCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTI4LCBmaWVsZF9uYW1lc1s3XSwgRmllbGQxMjgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMjkpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxMjksIGZpZWxkX25hbWVzWzhdLCBGaWVsZDEyOSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEzMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTMwLCBmaWVsZF9uYW1lc1sxMF0sIEZpZWxkMTMwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTMxKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxMzEsIGZpZWxkX25hbWVzWzExXSwgRmllbGQxMzEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxNTApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDE1MCwgZmllbGRfbmFtZXNbMTRdLCBGaWVsZDE1MCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDI3MSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjcxLCBmaWVsZF9uYW1lc1syM10sIEZpZWxkMjcxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjcyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyNzIsIGZpZWxkX25hbWVzWzI0XSwgRmllbGQyNzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyODApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDI4MCwgZmllbGRfbmFtZXNbMjVdLCBGaWVsZDI4MCk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzRmllbGQxKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxLCBGaWVsZDEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ5KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSg5LCBGaWVsZDkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxOCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMTgsIEZpZWxkMTgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ4MCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDgwLCBGaWVsZDgwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkODEpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSg4MSwgRmllbGQ4MSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMiwgRmllbGQyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgzLCBGaWVsZDMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyODApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjgwLCBGaWVsZDI4MCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDYpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNiwgRmllbGQ2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUoMjIsIEZpZWxkMjIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSg0LCBGaWVsZDQpOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogZmllbGQ1Xy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDEgKiBmaWVsZDVfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ1OSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDU5LCBGaWVsZDU5KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoNywgRmllbGQ3KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTYpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTYsIEZpZWxkMTYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMzApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTMwLCBGaWVsZDEzMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMTIsIEZpZWxkMTIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxNykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDE3LCBGaWVsZDE3KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSgxMywgRmllbGQxMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDE0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMTQsIEZpZWxkMTQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMDQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTA0LCBGaWVsZDEwNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEwMCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxMDAsIEZpZWxkMTAwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTAxKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEwMSwgRmllbGQxMDEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMDIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDEwMiwgRmllbGQxMDIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMDMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDEwMywgRmllbGQxMDMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyOSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyOSwgRmllbGQyOSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDMwKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMzAsIEZpZWxkMzApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ2MCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg2MCwgRmllbGQ2MCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDI3MSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyNzEsIEZpZWxkMjcxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjcyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDI3MiwgRmllbGQyNzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxNTApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTUwLCBGaWVsZDE1MCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIzLCBGaWVsZDIzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSgyNCwgRmllbGQyNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDI1KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDI1LCBGaWVsZDI1KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxNSwgRmllbGQxNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDc4KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoNzgsIEZpZWxkNzgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ2Nykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg2NywgRmllbGQ2Nyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDY4KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDY4LCBGaWVsZDY4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTI4KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEyOCwgRmllbGQxMjgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMjkpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDEyOSwgRmllbGQxMjkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMzEpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTMxLCBGaWVsZDEzMSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTEgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UxIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UxIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UxIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTEgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UxIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTEgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBTcGVlZE1lc3NhZ2UxIE1ha2VSZWFkT25seSgpIHsNCisgICAgICBmaWVsZDVfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoU3BlZWRNZXNzYWdlMSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxTcGVlZE1lc3NhZ2UxLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihTcGVlZE1lc3NhZ2UxIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgU3BlZWRNZXNzYWdlMSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBTcGVlZE1lc3NhZ2UxIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgU3BlZWRNZXNzYWdlMSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFNwZWVkTWVzc2FnZTEoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTEgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UxLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTEgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTEgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFNwZWVkTWVzc2FnZTEpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoU3BlZWRNZXNzYWdlMSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFNwZWVkTWVzc2FnZTEgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UxLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMSkgew0KKyAgICAgICAgICBGaWVsZDEgPSBvdGhlci5GaWVsZDE7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ5KSB7DQorICAgICAgICAgIEZpZWxkOSA9IG90aGVyLkZpZWxkOTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDE4KSB7DQorICAgICAgICAgIEZpZWxkMTggPSBvdGhlci5GaWVsZDE4Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkODApIHsNCisgICAgICAgICAgRmllbGQ4MCA9IG90aGVyLkZpZWxkODA7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ4MSkgew0KKyAgICAgICAgICBGaWVsZDgxID0gb3RoZXIuRmllbGQ4MTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIpIHsNCisgICAgICAgICAgRmllbGQyID0gb3RoZXIuRmllbGQyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMykgew0KKyAgICAgICAgICBGaWVsZDMgPSBvdGhlci5GaWVsZDM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyODApIHsNCisgICAgICAgICAgRmllbGQyODAgPSBvdGhlci5GaWVsZDI4MDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDYpIHsNCisgICAgICAgICAgRmllbGQ2ID0gb3RoZXIuRmllbGQ2Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjIpIHsNCisgICAgICAgICAgRmllbGQyMiA9IG90aGVyLkZpZWxkMjI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ0KSB7DQorICAgICAgICAgIEZpZWxkNCA9IG90aGVyLkZpZWxkNDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5maWVsZDVfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LmZpZWxkNV8uQWRkKG90aGVyLmZpZWxkNV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkNTkpIHsNCisgICAgICAgICAgRmllbGQ1OSA9IG90aGVyLkZpZWxkNTk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ3KSB7DQorICAgICAgICAgIEZpZWxkNyA9IG90aGVyLkZpZWxkNzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDE2KSB7DQorICAgICAgICAgIEZpZWxkMTYgPSBvdGhlci5GaWVsZDE2Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTMwKSB7DQorICAgICAgICAgIEZpZWxkMTMwID0gb3RoZXIuRmllbGQxMzA7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxMikgew0KKyAgICAgICAgICBGaWVsZDEyID0gb3RoZXIuRmllbGQxMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDE3KSB7DQorICAgICAgICAgIEZpZWxkMTcgPSBvdGhlci5GaWVsZDE3Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTMpIHsNCisgICAgICAgICAgRmllbGQxMyA9IG90aGVyLkZpZWxkMTM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxNCkgew0KKyAgICAgICAgICBGaWVsZDE0ID0gb3RoZXIuRmllbGQxNDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEwNCkgew0KKyAgICAgICAgICBGaWVsZDEwNCA9IG90aGVyLkZpZWxkMTA0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTAwKSB7DQorICAgICAgICAgIEZpZWxkMTAwID0gb3RoZXIuRmllbGQxMDA7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxMDEpIHsNCisgICAgICAgICAgRmllbGQxMDEgPSBvdGhlci5GaWVsZDEwMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEwMikgew0KKyAgICAgICAgICBGaWVsZDEwMiA9IG90aGVyLkZpZWxkMTAyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTAzKSB7DQorICAgICAgICAgIEZpZWxkMTAzID0gb3RoZXIuRmllbGQxMDM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyOSkgew0KKyAgICAgICAgICBGaWVsZDI5ID0gb3RoZXIuRmllbGQyOTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDMwKSB7DQorICAgICAgICAgIEZpZWxkMzAgPSBvdGhlci5GaWVsZDMwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkNjApIHsNCisgICAgICAgICAgRmllbGQ2MCA9IG90aGVyLkZpZWxkNjA7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyNzEpIHsNCisgICAgICAgICAgRmllbGQyNzEgPSBvdGhlci5GaWVsZDI3MTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDI3Mikgew0KKyAgICAgICAgICBGaWVsZDI3MiA9IG90aGVyLkZpZWxkMjcyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTUwKSB7DQorICAgICAgICAgIEZpZWxkMTUwID0gb3RoZXIuRmllbGQxNTA7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMykgew0KKyAgICAgICAgICBGaWVsZDIzID0gb3RoZXIuRmllbGQyMzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDI0KSB7DQorICAgICAgICAgIEZpZWxkMjQgPSBvdGhlci5GaWVsZDI0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjUpIHsNCisgICAgICAgICAgRmllbGQyNSA9IG90aGVyLkZpZWxkMjU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxNSkgew0KKyAgICAgICAgICBNZXJnZUZpZWxkMTUob3RoZXIuRmllbGQxNSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ3OCkgew0KKyAgICAgICAgICBGaWVsZDc4ID0gb3RoZXIuRmllbGQ3ODsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDY3KSB7DQorICAgICAgICAgIEZpZWxkNjcgPSBvdGhlci5GaWVsZDY3Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkNjgpIHsNCisgICAgICAgICAgRmllbGQ2OCA9IG90aGVyLkZpZWxkNjg7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxMjgpIHsNCisgICAgICAgICAgRmllbGQxMjggPSBvdGhlci5GaWVsZDEyODsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEyOSkgew0KKyAgICAgICAgICBGaWVsZDEyOSA9IG90aGVyLkZpZWxkMTI5Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTMxKSB7DQorICAgICAgICAgIEZpZWxkMTMxID0gb3RoZXIuRmllbGQxMzE7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9zcGVlZE1lc3NhZ2UxRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3NwZWVkTWVzc2FnZTFGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZmllbGQxXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ0ID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmZpZWxkNF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDI6DQorICAgICAgICAgICAgY2FzZSA0MTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEZpeGVkNjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5maWVsZDVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQ4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ2ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQ2Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNyA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWVsZDdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ5ID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmZpZWxkOV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgOTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDEyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDEzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMTI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE0ID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDE0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMjI6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzRmllbGQxNSkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShGaWVsZDE1KTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIEZpZWxkMTUgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTI4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxNiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMTZfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEzNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTcgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmZpZWxkMTdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE0Njogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTggPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZmllbGQxOF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTc2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMiA9IGlucHV0LlJlYWRJbnQ2NChyZWYgcmVzdWx0LmZpZWxkMjJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE4NDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjMgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDIzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxOTI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI0ID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDI0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI1ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQyNV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjMyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyOSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMjlfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI0MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzAgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmZpZWxkMzBfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQ3Mjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNTkgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmZpZWxkNTlfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQ4MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNjAgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDYwXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1MzY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDY3ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQ2N18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTQ0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ2OCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkNjhfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDYyNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNzggPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmZpZWxkNzhfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY0MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkODAgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmZpZWxkODBfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY0ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkODEgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmZpZWxkODFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgwMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAwID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQxMDBfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgwODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAxID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQxMDFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgxODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAyID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmZpZWxkMTAyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4MjY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwMyA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWVsZDEwM18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODMyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMDQgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDEwNF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTAyNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTI4ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQxMjhfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwMzQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyOSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWVsZDEyOV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA0MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMwID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQxMzBfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwNDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzMSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMTMxXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMjAwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxNTAgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDE1MF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjE2ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjcxID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQyNzFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDIxNzY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI3MiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMjcyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMjQwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyODAgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDI4MF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkOTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDkoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkOV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ5ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ5XyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE4OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTg7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTgodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTgoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE4XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxOCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxOCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMThfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ4MCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkODA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQ4MCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkODA7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkODAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkODAoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDgwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDgwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ4MCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ4MCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkODBfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ4MSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkODE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQ4MSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkODE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkODEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkODEoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDgxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDgxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ4MSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ4MSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkODFfID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkM18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjgwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyODA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDI4MCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjgwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDI4MCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyODAoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjgwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI4MF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjgwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI4MCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjgwXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ2OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQ2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ2OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDYodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDZfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEZpZWxkMjIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIyOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIyKGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIyXyA9IDBMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDQoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ0XyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IEZpZWxkNUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZmllbGQ1XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkNUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ1Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEdldEZpZWxkNShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0RmllbGQ1KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ1KGludCBpbmRleCwgdWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQ1X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRGaWVsZDUodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQ1Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRmllbGQ1KHNjZzo6SUVudW1lcmFibGU8dWxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDVfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDVfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ1OSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNTk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQ1OSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNTk7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNTkodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNTkoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDU5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDU5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ1OSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ1OSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNTlfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ3OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQ3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ3OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNyhzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ3XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ3KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDcgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDdfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDE2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxNjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxNih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxNihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxNl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTYgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE2XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMzAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEzMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTMwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMzA7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTMwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEzMChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMzAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTMwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMzAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMzBfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDEyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMihib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMl8gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE3OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMTcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE3OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE3KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE3KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxN18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTcgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE3XyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQxMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTM7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTMoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTNfID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDE0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxNDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxNChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxNF8gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTA0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMDQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDEwNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTA0OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEwNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMDQoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTA0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwNF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTA0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTA0XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEwMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTAwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMDA7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTAwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEwMChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTAwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMDAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMDBfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTAxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMDEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEwMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMDEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTAxKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMDFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEwMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwMV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTAyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMDI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDEwMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTAyOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEwMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMDIoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMDJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEwMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwMl8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTAzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxMDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEwMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMDModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTAzKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTAzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMDMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMDNfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDI5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyOTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyOSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyOShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyOSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyOV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI5XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQzMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMzA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQzMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMzA7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMzAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMzAoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDMwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQzMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMzBfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2MCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNjA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDYwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ2MDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ2MCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ2MChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2MCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ2MF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNjAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNjAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDYwXyA9IC0xOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjcxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyNzE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDI3MSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjcxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDI3MSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyNzEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjcxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI3MV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjcxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI3MSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjcxXyA9IC0xOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjcyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyNzI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDI3MiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjcyOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDI3Mih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyNzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjcyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI3Ml8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjcyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI3MiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjcyXyA9IC0xOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTUwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxNTA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDE1MCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTUwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE1MCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxNTAoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTUwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE1MF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTUwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1MCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTUwXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIzXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQyNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjQ7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjQoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyNCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjRfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDI1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyNTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyNSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyNShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyNSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyNV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI1XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxNTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgRmllbGQxNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxNShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE1XyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlRmllbGQxNShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0ZpZWxkMTUgJiYNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTVfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQuZmllbGQxNV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuZmllbGQxNV8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE1XyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ3OCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNzg7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQ3OCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNzg7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNzgodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNzgoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDc4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDc4XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ3OCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ3OCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNzhfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2NyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNjc7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDY3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ2NzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ2Nyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ2NyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2NyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ2N18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNjcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNjcgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDY3XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2OCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNjg7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDY4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ2ODsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ2OCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ2OChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2OCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ2OF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNjgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNjggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDY4XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMjggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEyODsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTI4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMjg7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTI4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEyOChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMjggPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI4XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMjgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTI4ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMjhfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEyOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTI5OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxMjkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEyOTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMjkodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTI5KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMjkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMjkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTI5ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMjlfID0gInh4eHh4eHh4eHh4eHh4eHh4eHh4eCI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMzEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEzMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTMxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMzE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTMxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEzMShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMzEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTMxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMzEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMzFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgU3BlZWRNZXNzYWdlMSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLkdvb2dsZVNwZWVkUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSwgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfc3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImZpZWxkMSIsICJmaWVsZDEyIiwgImZpZWxkMTMiLCAiZmllbGQxNCIsICJmaWVsZDE1IiwgImZpZWxkMTYiLCAiZmllbGQxOSIsICJmaWVsZDIiLCAiZmllbGQyMCIsICJmaWVsZDIwMyIsICJmaWVsZDIwNCIsICJmaWVsZDIwNSIsICJmaWVsZDIwNiIsICJmaWVsZDIwNyIsICJmaWVsZDIxIiwgImZpZWxkMjIiLCAiZmllbGQyMyIsICJmaWVsZDI4IiwgImZpZWxkMyIsICJmaWVsZDMwMCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9zcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4LCA5NiwgMTA0LCAxMTIsIDEyMiwgMTI4LCAxNTIsIDE2LCAxNjAsIDE2MjksIDE2MzIsIDE2NDIsIDE2NDgsIDE2NTYsIDE2OSwgMTc2LCAxODQsIDIyNCwgMjQsIDI0MDAgfTsNCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLkdvb2dsZVNwZWVkUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSwgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLkdvb2dsZVNwZWVkUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDJGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkM0ZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMzsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQzOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDMgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxNUZpZWxkTnVtYmVyID0gMTU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE1Ow0KKyAgICBwcml2YXRlIHN0cmluZyBmaWVsZDE1XyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE1IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxNTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMkZpZWxkTnVtYmVyID0gMTI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEyOw0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQxMl8gPSB0cnVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMTIgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTNGaWVsZE51bWJlciA9IDEzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMzsNCisgICAgcHJpdmF0ZSBsb25nIGZpZWxkMTNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEZpZWxkMTMgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTRGaWVsZE51bWJlciA9IDE0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxNDsNCisgICAgcHJpdmF0ZSBsb25nIGZpZWxkMTRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxNDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEZpZWxkMTQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDE0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTZGaWVsZE51bWJlciA9IDE2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxNjsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxNl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTYgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE2OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDE2IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxNl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE5RmllbGROdW1iZXIgPSAxOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTk7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTlfID0gMjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTkgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDE5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjBGaWVsZE51bWJlciA9IDIwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMDsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMjBfID0gdHJ1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDIwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDI4RmllbGROdW1iZXIgPSAyODsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjg7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDI4XyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjggew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI4OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQyOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjhfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMUZpZWxkTnVtYmVyID0gMjE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIxOw0KKyAgICBwcml2YXRlIHVsb25nIGZpZWxkMjFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgRmllbGQyMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMkZpZWxkTnVtYmVyID0gMjI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIyOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIyXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjIgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjNGaWVsZE51bWJlciA9IDIzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMzsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMjNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMjMgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjA2RmllbGROdW1iZXIgPSAyMDY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIwNjsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMjA2XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDYgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIwNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMjA2IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMDZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMDNGaWVsZE51bWJlciA9IDIwMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjAzOw0KKyAgICBwcml2YXRlIHVpbnQgZmllbGQyMDNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjAzOyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IEZpZWxkMjAzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMDNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMDRGaWVsZE51bWJlciA9IDIwNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjA0Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDIwNF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMDQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjA0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMDRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMDVGaWVsZE51bWJlciA9IDIwNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjA1Ow0KKyAgICBwcml2YXRlIHN0cmluZyBmaWVsZDIwNV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIwNTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRmllbGQyMDUgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIwNV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIwN0ZpZWxkTnVtYmVyID0gMjA3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMDc7DQorICAgIHByaXZhdGUgdWxvbmcgZmllbGQyMDdfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjA3OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBGaWVsZDIwNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjA3XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMzAwRmllbGROdW1iZXIgPSAzMDA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDMwMDsNCisgICAgcHJpdmF0ZSB1bG9uZyBmaWVsZDMwMF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMzAwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQzMDA7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIEZpZWxkMzAwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQzMDBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9zcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0ZpZWxkMSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEZpZWxkMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIsIGZpZWxkX25hbWVzWzddLCBGaWVsZDIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigzLCBmaWVsZF9uYW1lc1sxOF0sIEZpZWxkMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDEyLCBmaWVsZF9uYW1lc1sxXSwgRmllbGQxMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NCgxMywgZmllbGRfbmFtZXNbMl0sIEZpZWxkMTMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxNCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50NjQoMTQsIGZpZWxkX25hbWVzWzNdLCBGaWVsZDE0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxNSwgZmllbGRfbmFtZXNbNF0sIEZpZWxkMTUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxNikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTYsIGZpZWxkX25hbWVzWzVdLCBGaWVsZDE2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTkpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDE5LCBmaWVsZF9uYW1lc1s2XSwgRmllbGQxOSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDIwLCBmaWVsZF9uYW1lc1s4XSwgRmllbGQyMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIxKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDY0KDIxLCBmaWVsZF9uYW1lc1sxNF0sIEZpZWxkMjEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjIsIGZpZWxkX25hbWVzWzE1XSwgRmllbGQyMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDIzLCBmaWVsZF9uYW1lc1sxNl0sIEZpZWxkMjMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyOCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCgyOCwgZmllbGRfbmFtZXNbMTddLCBGaWVsZDI4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjAzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDMyKDIwMywgZmllbGRfbmFtZXNbOV0sIEZpZWxkMjAzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjA0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMDQsIGZpZWxkX25hbWVzWzEwXSwgRmllbGQyMDQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMDUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygyMDUsIGZpZWxkX25hbWVzWzExXSwgRmllbGQyMDUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMDYpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMjA2LCBmaWVsZF9uYW1lc1sxMl0sIEZpZWxkMjA2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjA3KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50NjQoMjA3LCBmaWVsZF9uYW1lc1sxM10sIEZpZWxkMjA3KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMzAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50NjQoMzAwLCBmaWVsZF9uYW1lc1sxOV0sIEZpZWxkMzAwKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNGaWVsZDEpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgRmllbGQxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyLCBGaWVsZDIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDMsIEZpZWxkMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDE1KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxNSwgRmllbGQxNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMTIsIEZpZWxkMTIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZSgxMywgRmllbGQxMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDE0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKDE0LCBGaWVsZDE0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTYpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTYsIEZpZWxkMTYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxOSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxOSwgRmllbGQxOSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIwKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMjAsIEZpZWxkMjApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyOCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDI4LCBGaWVsZDI4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjEpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGaXhlZDY0U2l6ZSgyMSwgRmllbGQyMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIyLCBGaWVsZDIyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSgyMywgRmllbGQyMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIwNikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDIwNiwgRmllbGQyMDYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMDMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGaXhlZDMyU2l6ZSgyMDMsIEZpZWxkMjAzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjA0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIwNCwgRmllbGQyMDQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMDUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDIwNSwgRmllbGQyMDUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMDcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50NjRTaXplKDIwNywgRmllbGQyMDcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQzMDApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50NjRTaXplKDMwMCwgRmllbGQzMDApOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2Ugb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxKSB7DQorICAgICAgICAgIEZpZWxkMSA9IG90aGVyLkZpZWxkMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIpIHsNCisgICAgICAgICAgRmllbGQyID0gb3RoZXIuRmllbGQyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMykgew0KKyAgICAgICAgICBGaWVsZDMgPSBvdGhlci5GaWVsZDM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxNSkgew0KKyAgICAgICAgICBGaWVsZDE1ID0gb3RoZXIuRmllbGQxNTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEyKSB7DQorICAgICAgICAgIEZpZWxkMTIgPSBvdGhlci5GaWVsZDEyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTMpIHsNCisgICAgICAgICAgRmllbGQxMyA9IG90aGVyLkZpZWxkMTM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxNCkgew0KKyAgICAgICAgICBGaWVsZDE0ID0gb3RoZXIuRmllbGQxNDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDE2KSB7DQorICAgICAgICAgIEZpZWxkMTYgPSBvdGhlci5GaWVsZDE2Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTkpIHsNCisgICAgICAgICAgRmllbGQxOSA9IG90aGVyLkZpZWxkMTk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMCkgew0KKyAgICAgICAgICBGaWVsZDIwID0gb3RoZXIuRmllbGQyMDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDI4KSB7DQorICAgICAgICAgIEZpZWxkMjggPSBvdGhlci5GaWVsZDI4Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjEpIHsNCisgICAgICAgICAgRmllbGQyMSA9IG90aGVyLkZpZWxkMjE7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMikgew0KKyAgICAgICAgICBGaWVsZDIyID0gb3RoZXIuRmllbGQyMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIzKSB7DQorICAgICAgICAgIEZpZWxkMjMgPSBvdGhlci5GaWVsZDIzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjA2KSB7DQorICAgICAgICAgIEZpZWxkMjA2ID0gb3RoZXIuRmllbGQyMDY7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMDMpIHsNCisgICAgICAgICAgRmllbGQyMDMgPSBvdGhlci5GaWVsZDIwMzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIwNCkgew0KKyAgICAgICAgICBGaWVsZDIwNCA9IG90aGVyLkZpZWxkMjA0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjA1KSB7DQorICAgICAgICAgIEZpZWxkMjA1ID0gb3RoZXIuRmllbGQyMDU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMDcpIHsNCisgICAgICAgICAgRmllbGQyMDcgPSBvdGhlci5GaWVsZDIwNzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDMwMCkgew0KKyAgICAgICAgICBGaWVsZDMwMCA9IG90aGVyLkZpZWxkMzAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfc3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfc3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA5Njogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTIgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmZpZWxkMTJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMgPSBpbnB1dC5SZWFkSW50NjQocmVmIHJlc3VsdC5maWVsZDEzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMTI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE0ID0gaW5wdXQuUmVhZEludDY0KHJlZiByZXN1bHQuZmllbGQxNF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTIyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxNSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWVsZDE1Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMjg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE2ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQxNl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTUyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxOSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMTlfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjAgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmZpZWxkMjBfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2OTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEgPSBpbnB1dC5SZWFkRml4ZWQ2NChyZWYgcmVzdWx0LmZpZWxkMjFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE3Njogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDIyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIzID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDIzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI4ID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDI4Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjI5OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMDMgPSBpbnB1dC5SZWFkRml4ZWQzMihyZWYgcmVzdWx0LmZpZWxkMjAzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjMyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMDQgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDIwNF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY0Mjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA1ID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmZpZWxkMjA1Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjQ4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMDYgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmZpZWxkMjA2Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjU2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMDcgPSBpbnB1dC5SZWFkVUludDY0KHJlZiByZXN1bHQuZmllbGQyMDdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI0MDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMwMCA9IGlucHV0LlJlYWRVSW50NjQocmVmIHJlc3VsdC5maWVsZDMwMF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkM18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTUoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTVfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQxMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTIoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTJfID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDEzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMyhsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxM18gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDE0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxNDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxNChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxNF8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE2OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE2KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxNigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTZfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE5OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE5KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxOSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTlfID0gMjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDIwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMF8gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI4OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMjggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI4OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDI4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI4KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyOCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyOF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI4XyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjE7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEZpZWxkMjEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIxKHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMjMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIzKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIzXyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQyMDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIwNjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMDYodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjA2KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDYgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMDYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA2ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMDZfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIwMzsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBGaWVsZDIwMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjAzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIwMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMDModWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMDNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIwMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwM18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIwNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjA0OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIwNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMDQoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwNF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjA0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA0XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIwNTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjA1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMDU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjA1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIwNShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwNV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjA1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA1XyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDc7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEZpZWxkMjA3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMDc7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjA3KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIwNyh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMDdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIwNygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDcgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwN18gPSAwVUw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQzMDAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDMwMDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgRmllbGQzMDAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDMwMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQzMDAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMzAwKHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzAwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDMwMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMzAwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMwMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMzAwXyA9IDBVTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5Hb29nbGVTcGVlZFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFNwZWVkTWVzc2FnZTIgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxTcGVlZE1lc3NhZ2UyLCBTcGVlZE1lc3NhZ2UyLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBTcGVlZE1lc3NhZ2UyKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNwZWVkTWVzc2FnZTIgZGVmYXVsdEluc3RhbmNlID0gbmV3IFNwZWVkTWVzc2FnZTIoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3NwZWVkTWVzc2FnZTJGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImZpZWxkMSIsICJmaWVsZDEwOSIsICJmaWVsZDEyNyIsICJmaWVsZDEyOCIsICJmaWVsZDEyOSIsICJmaWVsZDEzMCIsICJmaWVsZDEzMSIsICJmaWVsZDIiLCAiZmllbGQyMDUiLCAiZmllbGQyMDYiLCAiZmllbGQyMSIsICJmaWVsZDIxMCIsICJmaWVsZDIxMSIsICJmaWVsZDIxMiIsICJmaWVsZDIxMyIsICJmaWVsZDIxNiIsICJmaWVsZDIxNyIsICJmaWVsZDIxOCIsICJmaWVsZDIyMCIsICJmaWVsZDIyMSIsICJmaWVsZDIyMiIsICJmaWVsZDI1IiwgImZpZWxkMyIsICJmaWVsZDMwIiwgImZpZWxkNCIsICJmaWVsZDYiLCAiZmllbGQ2MyIsICJmaWVsZDcxIiwgImZpZWxkNzUiLCAiZ3JvdXAxIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3NwZWVkTWVzc2FnZTJGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAsIDg3MiwgMTAxOCwgMTAyNiwgMTAzMiwgMTA0MCwgMTA0OCwgMTgsIDE2NDAsIDE2NDgsIDE2OCwgMTY4MCwgMTY4OCwgMTY5NiwgMTcwNCwgMTcyOCwgMTczNiwgMTc0NCwgMTc2MCwgMTc2OCwgMTc4MSwgMjA1LCAyNCwgMjQwLCAzMiwgNTAsIDUwNCwgNTY4LCA2MDAsIDgzIH07DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMiBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU3BlZWRNZXNzYWdlMiBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5Hb29nbGVTcGVlZFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU3BlZWRNZXNzYWdlMl9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxTcGVlZE1lc3NhZ2UyLCBTcGVlZE1lc3NhZ2UyLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5Hb29nbGVTcGVlZFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2JlbmNobWFya3NfU3BlZWRNZXNzYWdlMl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgICNyZWdpb24gTmVzdGVkIHR5cGVzDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgR3JvdXAxIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8R3JvdXAxLCBHcm91cDEuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBHcm91cDEoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdyb3VwMSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgR3JvdXAxKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZ3JvdXAxRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJmaWVsZDExIiwgImZpZWxkMTIiLCAiZmllbGQxMyIsICJmaWVsZDE0IiwgImZpZWxkMTUiLCAiZmllbGQxNiIsICJmaWVsZDIwIiwgImZpZWxkMjIiLCAiZmllbGQyNCIsICJmaWVsZDI2IiwgImZpZWxkMjciLCAiZmllbGQyOCIsICJmaWVsZDI5IiwgImZpZWxkMzEiLCAiZmllbGQ1IiwgImZpZWxkNzMiIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2dyb3VwMUZpZWxkVGFncyA9IG5ldyB1aW50W10geyA5MywgOTgsIDEwNiwgMTE0LCAxMjAsIDEzMCwgMTYwLCAxNzgsIDE5NCwgMjEzLCAyMTgsIDIyNCwgMjM0LCAyNTAsIDQwLCA1ODQgfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEdyb3VwMSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgR3JvdXAxIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guR29vZ2xlU3BlZWRQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTJfR3JvdXAxX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEdyb3VwMSwgR3JvdXAxLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guR29vZ2xlU3BlZWRQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19iZW5jaG1hcmtzX1NwZWVkTWVzc2FnZTJfR3JvdXAxX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDExRmllbGROdW1iZXIgPSAxMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDExOw0KKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDExXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTEgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGZsb2F0IEZpZWxkMTEgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMV87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDI2RmllbGROdW1iZXIgPSAyNjsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI2Ow0KKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDI2XzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjYgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyNjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGZsb2F0IEZpZWxkMjYgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQyNl87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEyRmllbGROdW1iZXIgPSAxMjsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEyOw0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxMl8gPSAiIjsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTIgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDEyIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTJfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxM0ZpZWxkTnVtYmVyID0gMTM7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMzsNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMTNfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTM7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxMyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDEzXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTRGaWVsZE51bWJlciA9IDE0Ow0KKyAgICAgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+IGZpZWxkMTRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gRmllbGQxNExpc3Qgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KGZpZWxkMTRfKTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBGaWVsZDE0Q291bnQgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQxNF8uQ291bnQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgR2V0RmllbGQxNChpbnQgaW5kZXgpIHsNCisgICAgICAgICAgcmV0dXJuIGZpZWxkMTRfW2luZGV4XTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE1RmllbGROdW1iZXIgPSAxNTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE1Ow0KKyAgICAgICAgcHJpdmF0ZSB1bG9uZyBmaWVsZDE1XzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxNTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdWxvbmcgRmllbGQxNSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDE1XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNUZpZWxkTnVtYmVyID0gNTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDU7DQorICAgICAgICBwcml2YXRlIGludCBmaWVsZDVfOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ1IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBGaWVsZDUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQ1XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjdGaWVsZE51bWJlciA9IDI3Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjc7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBmaWVsZDI3XyA9ICIiOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI3OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjcgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQyN187IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDI4RmllbGROdW1iZXIgPSAyODsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI4Ow0KKyAgICAgICAgcHJpdmF0ZSBpbnQgZmllbGQyOF87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI4IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjg7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgRmllbGQyOCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDI4XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjlGaWVsZE51bWJlciA9IDI5Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjk7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBmaWVsZDI5XyA9ICIiOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyOSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI5OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjkgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQyOV87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE2RmllbGROdW1iZXIgPSAxNjsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE2Ow0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxNl8gPSAiIjsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTYgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxNjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDE2IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTZfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMkZpZWxkTnVtYmVyID0gMjI7DQorICAgICAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gZmllbGQyMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICAgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBGaWVsZDIyTGlzdCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoZmllbGQyMl8pOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IEZpZWxkMjJDb3VudCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDIyXy5Db3VudDsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBHZXRGaWVsZDIyKGludCBpbmRleCkgew0KKyAgICAgICAgICByZXR1cm4gZmllbGQyMl9baW5kZXhdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNzNGaWVsZE51bWJlciA9IDczOw0KKyAgICAgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IGZpZWxkNzNfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gRmllbGQ3M0xpc3Qgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KGZpZWxkNzNfKTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBGaWVsZDczQ291bnQgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQ3M18uQ291bnQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgR2V0RmllbGQ3MyhpbnQgaW5kZXgpIHsNCisgICAgICAgICAgcmV0dXJuIGZpZWxkNzNfW2luZGV4XTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIwRmllbGROdW1iZXIgPSAyMDsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIwOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgZmllbGQyMF87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjA7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgRmllbGQyMCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDIwXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjRGaWVsZE51bWJlciA9IDI0Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjQ7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBmaWVsZDI0XyA9ICIiOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI0OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjQgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQyNF87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDMxRmllbGROdW1iZXIgPSAzMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDMxOw0KKyAgICAgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgZmllbGQzMV87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMxIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMzE7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgRmllbGQzMSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDMxXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGlmICghaGFzRmllbGQxMSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIGlmICghaGFzRmllbGQxNSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2dyb3VwMUZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNGaWVsZDUpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig1LCBmaWVsZF9uYW1lc1sxNF0sIEZpZWxkNSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMTEpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgxMSwgZmllbGRfbmFtZXNbMF0sIEZpZWxkMTEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDEyKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEyLCBmaWVsZF9uYW1lc1sxXSwgRmllbGQxMik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMTMpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMTMsIGZpZWxkX25hbWVzWzJdLCBGaWVsZDEzKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoZmllbGQxNF8uQ291bnQgPiAwKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoMTQsIGZpZWxkX25hbWVzWzNdLCBmaWVsZDE0Xyk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMTUpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVVSW50NjQoMTUsIGZpZWxkX25hbWVzWzRdLCBGaWVsZDE1KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQxNikgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxNiwgZmllbGRfbmFtZXNbNV0sIEZpZWxkMTYpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDIwKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjAsIGZpZWxkX25hbWVzWzZdLCBGaWVsZDIwKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoZmllbGQyMl8uQ291bnQgPiAwKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoMjIsIGZpZWxkX25hbWVzWzddLCBmaWVsZDIyXyk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMjQpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMjQsIGZpZWxkX25hbWVzWzhdLCBGaWVsZDI0KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQyNikgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDI2LCBmaWVsZF9uYW1lc1s5XSwgRmllbGQyNik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMjcpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMjcsIGZpZWxkX25hbWVzWzEwXSwgRmllbGQyNyk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMjgpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyOCwgZmllbGRfbmFtZXNbMTFdLCBGaWVsZDI4KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQyOSkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygyOSwgZmllbGRfbmFtZXNbMTJdLCBGaWVsZDI5KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQzMSkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMzEsIGZpZWxkX25hbWVzWzEzXSwgRmllbGQzMSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGZpZWxkNzNfLkNvdW50ID4gMCkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyQXJyYXkoNzMsIGZpZWxkX25hbWVzWzE1XSwgZmllbGQ3M18pOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIGlmIChoYXNGaWVsZDExKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSgxMSwgRmllbGQxMSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMjYpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDI2LCBGaWVsZDI2KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQxMikgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDEyLCBGaWVsZDEyKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQxMykgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDEzLCBGaWVsZDEzKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgZWxlbWVudCBpbiBGaWVsZDE0TGlzdCkgew0KKyAgICAgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICAgICAgc2l6ZSArPSAxICogZmllbGQxNF8uQ291bnQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMTUpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDY0U2l6ZSgxNSwgRmllbGQxNSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkNSkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNSwgRmllbGQ1KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQyNykgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDI3LCBGaWVsZDI3KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQyOCkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjgsIEZpZWxkMjgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDI5KSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMjksIEZpZWxkMjkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDE2KSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMTYsIEZpZWxkMTYpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIEZpZWxkMjJMaXN0KSB7DQorICAgICAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgICAgICBzaXplICs9IDIgKiBmaWVsZDIyXy5Db3VudDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgICAgICBmb3JlYWNoIChpbnQgZWxlbWVudCBpbiBGaWVsZDczTGlzdCkgew0KKyAgICAgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgICAgICBzaXplICs9IDIgKiBmaWVsZDczXy5Db3VudDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQyMCkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjAsIEZpZWxkMjApOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDI0KSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMjQsIEZpZWxkMjQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDMxKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDMxLCBGaWVsZDMxKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHcm91cDEgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHcm91cDEgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHcm91cDEgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgR3JvdXAxIE1ha2VSZWFkT25seSgpIHsNCisgICAgICAgICAgZmllbGQxNF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIGZpZWxkMjJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICBmaWVsZDczXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihHcm91cDEgcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxHcm91cDEsIEJ1aWxkZXI+IHsNCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludGVybmFsIEJ1aWxkZXIoR3JvdXAxIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgR3JvdXAxIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgR3JvdXAxIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICBHcm91cDEgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgR3JvdXAxKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEdyb3VwMSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMS5EZXNjcmlwdG9yOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBHcm91cDEgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgR3JvdXAxIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciBpcyBHcm91cDEpIHsNCisgICAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEdyb3VwMSkgb3RoZXIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShHcm91cDEgb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMi5UeXBlcy5Hcm91cDEuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDExKSB7DQorICAgICAgICAgICAgICBGaWVsZDExID0gb3RoZXIuRmllbGQxMTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjYpIHsNCisgICAgICAgICAgICAgIEZpZWxkMjYgPSBvdGhlci5GaWVsZDI2Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxMikgew0KKyAgICAgICAgICAgICAgRmllbGQxMiA9IG90aGVyLkZpZWxkMTI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEzKSB7DQorICAgICAgICAgICAgICBGaWVsZDEzID0gb3RoZXIuRmllbGQxMzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLmZpZWxkMTRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgICAgIHJlc3VsdC5maWVsZDE0Xy5BZGQob3RoZXIuZmllbGQxNF8pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxNSkgew0KKyAgICAgICAgICAgICAgRmllbGQxNSA9IG90aGVyLkZpZWxkMTU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDUpIHsNCisgICAgICAgICAgICAgIEZpZWxkNSA9IG90aGVyLkZpZWxkNTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjcpIHsNCisgICAgICAgICAgICAgIEZpZWxkMjcgPSBvdGhlci5GaWVsZDI3Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyOCkgew0KKyAgICAgICAgICAgICAgRmllbGQyOCA9IG90aGVyLkZpZWxkMjg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDI5KSB7DQorICAgICAgICAgICAgICBGaWVsZDI5ID0gb3RoZXIuRmllbGQyOTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTYpIHsNCisgICAgICAgICAgICAgIEZpZWxkMTYgPSBvdGhlci5GaWVsZDE2Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIuZmllbGQyMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjJfLkFkZChvdGhlci5maWVsZDIyXyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5maWVsZDczXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgICAgICByZXN1bHQuZmllbGQ3M18uQWRkKG90aGVyLmZpZWxkNzNfKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjApIHsNCisgICAgICAgICAgICAgIEZpZWxkMjAgPSBvdGhlci5GaWVsZDIwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyNCkgew0KKyAgICAgICAgICAgICAgRmllbGQyNCA9IG90aGVyLkZpZWxkMjQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDMxKSB7DQorICAgICAgICAgICAgICBNZXJnZUZpZWxkMzEob3RoZXIuRmllbGQzMSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2dyb3VwMUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX2dyb3VwMUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDQwOiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkNV8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgOTM6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMSA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0LmZpZWxkMTFfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDk4OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTIgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZmllbGQxMl8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTA2OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZmllbGQxM18pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTE0OiB7DQorICAgICAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LmZpZWxkMTRfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDEyMDogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1ID0gaW5wdXQuUmVhZFVJbnQ2NChyZWYgcmVzdWx0LmZpZWxkMTVfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDEzMDogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE2ID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmZpZWxkMTZfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDE2MDogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQyMF8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTc4OiB7DQorICAgICAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LmZpZWxkMjJfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDE5NDogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI0ID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmZpZWxkMjRfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDIxMzogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI2ID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQuZmllbGQyNl8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMjE4OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjcgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZmllbGQyN18pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMjI0OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjggPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDI4Xyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAyMzQ6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyOSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWVsZDI5Xyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAyNTA6IHsNCisgICAgICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc0ZpZWxkMzEpIHsNCisgICAgICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKEZpZWxkMzEpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICAgICAgRmllbGQzMSA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSA1ODY6DQorICAgICAgICAgICAgICAgIGNhc2UgNTg0OiB7DQorICAgICAgICAgICAgICAgICAgaW5wdXQuUmVhZEludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuZmllbGQ3M18pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDExIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTE7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgZmxvYXQgRmllbGQxMSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDExOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQxMSh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDExKGZsb2F0IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTFfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDExKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTEgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxMV8gPSAwRjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI2OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGZsb2F0IEZpZWxkMjYgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyNjsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkMjYodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyNihmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjYgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDI2XyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyNigpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI2ID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjZfID0gMEY7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxMiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEyOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQxMih2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEyKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMiA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTJfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEyKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTIgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxMl8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMyB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDEzIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTM7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDEzKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTMoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxM18gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTMoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMyA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDEzXyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gRmllbGQxNExpc3Qgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmZpZWxkMTRfOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBGaWVsZDE0Q291bnQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxNENvdW50OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBHZXRGaWVsZDE0KGludCBpbmRleCkgew0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuR2V0RmllbGQxNChpbmRleCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxNChpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmllbGQxNChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTRfLkFkZCh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VGaWVsZDE0KHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDE0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTQoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNF8uQ2xlYXIoKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE1OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICAgIHB1YmxpYyB1bG9uZyBGaWVsZDE1IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTU7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDE1KHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE1KHVsb25nIHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxNSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTVfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE1KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTUgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNV8gPSAwVUw7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDU7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEZpZWxkNSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDU7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDUodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ1KGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkNV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNSgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDUgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQ1XyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjcgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyNzsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQyNyB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI3OyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQyNyh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI3KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyNyA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjdfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI3KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjcgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyN18gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyOCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI4OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBGaWVsZDI4IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjg7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDI4KHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjgoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyOCA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjhfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI4KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjggPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyOF8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI5IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjkgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyOTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkMjkodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyOShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDI5XyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyOSgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI5ID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjlfID0gIiI7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTYgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxNjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxNiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE2OyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQxNih2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE2KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxNiA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTZfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE2KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTYgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNl8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxzdHJpbmc+IEZpZWxkMjJMaXN0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5maWVsZDIyXzsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgRmllbGQyMkNvdW50IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjJDb3VudDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgR2V0RmllbGQyMihpbnQgaW5kZXgpIHsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0LkdldEZpZWxkMjIoaW5kZXgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjIoaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEZpZWxkMjIoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDIyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRmllbGQyMihzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIyKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjJfLkNsZWFyKCk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBGaWVsZDczTGlzdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZmllbGQ3M187IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEZpZWxkNzNDb3VudCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDczQ291bnQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEdldEZpZWxkNzMoaW50IGluZGV4KSB7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRGaWVsZDczKGluZGV4KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDczKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQ3M19baW5kZXhdID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmllbGQ3MyhpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDczXy5BZGQodmFsdWUpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRmllbGQ3MyhzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQ3M18uQWRkKHZhbHVlcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDczKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkNzNfLkNsZWFyKCk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgRmllbGQyMCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIwOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQyMCh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIwKGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjAgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDIwXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMCgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjBfID0gMDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI0OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDI0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjQ7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDI0KHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjQoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI0ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyNF8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjQoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyNCA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDI0XyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMxIHsNCisgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQzMTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgRmllbGQzMSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDMxOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQzMSh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDMxKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQzMSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMzFfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQzMShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQzMSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMzFfID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VGaWVsZDMxKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc0ZpZWxkMzEgJiYNCisgICAgICAgICAgICAgICAgcmVzdWx0LmZpZWxkMzFfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0LmZpZWxkMzFfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmZpZWxkMzFfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXN1bHQuZmllbGQzMV8gPSB2YWx1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzEgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQzMSgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMxID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMzFfID0gbnVsbDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIEdyb3VwMSgpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5Hb29nbGVTcGVlZFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQzRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQzOw0KKyAgICBwcml2YXRlIGxvbmcgZmllbGQzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQzOyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRmllbGQzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNEZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNDsNCisgICAgcHJpdmF0ZSBsb25nIGZpZWxkNF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEZpZWxkNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDMwRmllbGROdW1iZXIgPSAzMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMzA7DQorICAgIHByaXZhdGUgbG9uZyBmaWVsZDMwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQzMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMzA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBGaWVsZDMwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQzMF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDc1RmllbGROdW1iZXIgPSA3NTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNzU7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDc1XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ3NSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNzU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDc1IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ3NV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDZGaWVsZE51bWJlciA9IDY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDY7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkNl8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ2OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDYgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyOw0KKyAgICBwcml2YXRlIHBiOjpCeXRlU3RyaW5nIGZpZWxkMl8gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyOyB9DQorICAgIH0NCisgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIEZpZWxkMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIxRmllbGROdW1iZXIgPSAyMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjE7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ3MUZpZWxkTnVtYmVyID0gNzE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDcxOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDcxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ3MSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNzE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkNzEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDcxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjVGaWVsZE51bWJlciA9IDI1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyNTsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDI1XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQyNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMDlGaWVsZE51bWJlciA9IDEwOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTA5Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDEwOV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTA5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMDk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTA5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMDlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMTBGaWVsZE51bWJlciA9IDIxMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjEwOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxMF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjEwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjEwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMTBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMTFGaWVsZE51bWJlciA9IDIxMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjExOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxMV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjExIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjExIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMTFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMTJGaWVsZE51bWJlciA9IDIxMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjEyOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxMl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjEyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjEyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMTJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMTNGaWVsZE51bWJlciA9IDIxMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjEzOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxM187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjEzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjEzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMTNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMTZGaWVsZE51bWJlciA9IDIxNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjE2Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxNl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjE2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTY7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjE2IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMTZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMTdGaWVsZE51bWJlciA9IDIxNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjE3Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxN187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjE3IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjE3IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMTdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMThGaWVsZE51bWJlciA9IDIxODsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjE4Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxOF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjE4IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjE4IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMThfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMjBGaWVsZE51bWJlciA9IDIyMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjIwOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIyMF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMjA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjIwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMjBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMjFGaWVsZE51bWJlciA9IDIyMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjIxOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIyMV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMjE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjIxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMjFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMjJGaWVsZE51bWJlciA9IDIyMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjIyOw0KKyAgICBwcml2YXRlIGZsb2F0IGZpZWxkMjIyXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMjIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIyMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBGaWVsZDIyMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjIyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNjNGaWVsZE51bWJlciA9IDYzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ2MzsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQ2M187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNjMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDYzOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDYzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ2M187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBHcm91cDFGaWVsZE51bWJlciA9IDEwOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxPiBncm91cDFfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMT4gR3JvdXAxTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdyb3VwMV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdyb3VwMUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gZ3JvdXAxXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMSBHZXRHcm91cDEoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGdyb3VwMV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTI4RmllbGROdW1iZXIgPSAxMjg7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiBmaWVsZDEyOF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxzdHJpbmc+IEZpZWxkMTI4TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShmaWVsZDEyOF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDEyOENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMjhfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBHZXRGaWVsZDEyOChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gZmllbGQxMjhfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEzMUZpZWxkTnVtYmVyID0gMTMxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMzE7DQorICAgIHByaXZhdGUgbG9uZyBmaWVsZDEzMV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMzE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBGaWVsZDEzMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTMxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTI3RmllbGROdW1iZXIgPSAxMjc7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiBmaWVsZDEyN18gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxzdHJpbmc+IEZpZWxkMTI3TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShmaWVsZDEyN18pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDEyN0NvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMjdfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBHZXRGaWVsZDEyNyhpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gZmllbGQxMjdfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEyOUZpZWxkTnVtYmVyID0gMTI5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMjk7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTI5XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMjkgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEyOTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMjkgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEyOV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEzMEZpZWxkTnVtYmVyID0gMTMwOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+IGZpZWxkMTMwXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBGaWVsZDEzMExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoZmllbGQxMzBfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMzBDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTMwXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEdldEZpZWxkMTMwKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBmaWVsZDEzMF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjA1RmllbGROdW1iZXIgPSAyMDU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIwNTsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMjA1XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIwNTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMjA1IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMDVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMDZGaWVsZE51bWJlciA9IDIwNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjA2Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQyMDZfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjA2OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQyMDYgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIwNl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3NwZWVkTWVzc2FnZTJGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNGaWVsZDEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxLCBmaWVsZF9uYW1lc1swXSwgRmllbGQxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQnl0ZXMoMiwgZmllbGRfbmFtZXNbN10sIEZpZWxkMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KDMsIGZpZWxkX25hbWVzWzIyXSwgRmllbGQzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50NjQoNCwgZmllbGRfbmFtZXNbMjRdLCBGaWVsZDQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ2KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoNiwgZmllbGRfbmFtZXNbMjVdLCBGaWVsZDYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoZ3JvdXAxXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUdyb3VwQXJyYXkoMTAsIGZpZWxkX25hbWVzWzI5XSwgZ3JvdXAxXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIxKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMSwgZmllbGRfbmFtZXNbMTBdLCBGaWVsZDIxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDI1LCBmaWVsZF9uYW1lc1syMV0sIEZpZWxkMjUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQzMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50NjQoMzAsIGZpZWxkX25hbWVzWzIzXSwgRmllbGQzMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDYzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig2MywgZmllbGRfbmFtZXNbMjZdLCBGaWVsZDYzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNzEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDcxLCBmaWVsZF9uYW1lc1syN10sIEZpZWxkNzEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ3NSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCg3NSwgZmllbGRfbmFtZXNbMjhdLCBGaWVsZDc1KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTA5KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxMDksIGZpZWxkX25hbWVzWzFdLCBGaWVsZDEwOSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChmaWVsZDEyN18uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmdBcnJheSgxMjcsIGZpZWxkX25hbWVzWzJdLCBmaWVsZDEyN18pOw0KKyAgICAgIH0NCisgICAgICBpZiAoZmllbGQxMjhfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoMTI4LCBmaWVsZF9uYW1lc1szXSwgZmllbGQxMjhfKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTI5KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxMjksIGZpZWxkX25hbWVzWzRdLCBGaWVsZDEyOSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChmaWVsZDEzMF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NEFycmF5KDEzMCwgZmllbGRfbmFtZXNbNV0sIGZpZWxkMTMwXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEzMSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50NjQoMTMxLCBmaWVsZF9uYW1lc1s2XSwgRmllbGQxMzEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMDUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMjA1LCBmaWVsZF9uYW1lc1s4XSwgRmllbGQyMDUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMDYpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMjA2LCBmaWVsZF9uYW1lc1s5XSwgRmllbGQyMDYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMTApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIxMCwgZmllbGRfbmFtZXNbMTFdLCBGaWVsZDIxMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIxMSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjExLCBmaWVsZF9uYW1lc1sxMl0sIEZpZWxkMjExKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjEyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMTIsIGZpZWxkX25hbWVzWzEzXSwgRmllbGQyMTIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMTMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIxMywgZmllbGRfbmFtZXNbMTRdLCBGaWVsZDIxMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIxNikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjE2LCBmaWVsZF9uYW1lc1sxNV0sIEZpZWxkMjE2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjE3KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMTcsIGZpZWxkX25hbWVzWzE2XSwgRmllbGQyMTcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMTgpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIxOCwgZmllbGRfbmFtZXNbMTddLCBGaWVsZDIxOCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIyMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjIwLCBmaWVsZF9uYW1lc1sxOF0sIEZpZWxkMjIwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjIxKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMjEsIGZpZWxkX25hbWVzWzE5XSwgRmllbGQyMjEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMjIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDIyMiwgZmllbGRfbmFtZXNbMjBdLCBGaWVsZDIyMik7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzRmllbGQxKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxLCBGaWVsZDEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKDMsIEZpZWxkMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUoNCwgRmllbGQ0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMzApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUoMzAsIEZpZWxkMzApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ3NSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDc1LCBGaWVsZDc1KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoNiwgRmllbGQ2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJ5dGVzU2l6ZSgyLCBGaWVsZDIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyMSwgRmllbGQyMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDcxKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDcxLCBGaWVsZDcxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoMjUsIEZpZWxkMjUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMDkpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTA5LCBGaWVsZDEwOSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIxMCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyMTAsIEZpZWxkMjEwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjExKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIxMSwgRmllbGQyMTEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMTIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjEyLCBGaWVsZDIxMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIxMykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyMTMsIEZpZWxkMjEzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjE2KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIxNiwgRmllbGQyMTYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMTcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjE3LCBGaWVsZDIxNyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIxOCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyMTgsIEZpZWxkMjE4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjIwKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIyMCwgRmllbGQyMjApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMjEpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjIxLCBGaWVsZDIyMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIyMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSgyMjIsIEZpZWxkMjIyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNjMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNjMsIEZpZWxkNjMpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMSBlbGVtZW50IGluIEdyb3VwMUxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVHcm91cFNpemUoMTAsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGVsZW1lbnQgaW4gRmllbGQxMjhMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIGZpZWxkMTI4Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTMxKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKDEzMSwgRmllbGQxMzEpOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGVsZW1lbnQgaW4gRmllbGQxMjdMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIGZpZWxkMTI3Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTI5KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEyOSwgRmllbGQxMjkpOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAobG9uZyBlbGVtZW50IGluIEZpZWxkMTMwTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIGZpZWxkMTMwXy5Db3VudDsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjA1KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMjA1LCBGaWVsZDIwNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIwNikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDIwNiwgRmllbGQyMDYpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTIgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgU3BlZWRNZXNzYWdlMiBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgZ3JvdXAxXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBmaWVsZDEyOF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgZmllbGQxMjdfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIGZpZWxkMTMwXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFNwZWVkTWVzc2FnZTIgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8U3BlZWRNZXNzYWdlMiwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoU3BlZWRNZXNzYWdlMiBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFNwZWVkTWVzc2FnZTIgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgU3BlZWRNZXNzYWdlMiBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFNwZWVkTWVzc2FnZTIgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBTcGVlZE1lc3NhZ2UyKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBTcGVlZE1lc3NhZ2UyIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMi5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTcGVlZE1lc3NhZ2UyIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTcGVlZE1lc3NhZ2UyIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBTcGVlZE1lc3NhZ2UyKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFNwZWVkTWVzc2FnZTIpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShTcGVlZE1lc3NhZ2UyIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMi5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEpIHsNCisgICAgICAgICAgRmllbGQxID0gb3RoZXIuRmllbGQxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMykgew0KKyAgICAgICAgICBGaWVsZDMgPSBvdGhlci5GaWVsZDM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ0KSB7DQorICAgICAgICAgIEZpZWxkNCA9IG90aGVyLkZpZWxkNDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDMwKSB7DQorICAgICAgICAgIEZpZWxkMzAgPSBvdGhlci5GaWVsZDMwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkNzUpIHsNCisgICAgICAgICAgRmllbGQ3NSA9IG90aGVyLkZpZWxkNzU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ2KSB7DQorICAgICAgICAgIEZpZWxkNiA9IG90aGVyLkZpZWxkNjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIpIHsNCisgICAgICAgICAgRmllbGQyID0gb3RoZXIuRmllbGQyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjEpIHsNCisgICAgICAgICAgRmllbGQyMSA9IG90aGVyLkZpZWxkMjE7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ3MSkgew0KKyAgICAgICAgICBGaWVsZDcxID0gb3RoZXIuRmllbGQ3MTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDI1KSB7DQorICAgICAgICAgIEZpZWxkMjUgPSBvdGhlci5GaWVsZDI1Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTA5KSB7DQorICAgICAgICAgIEZpZWxkMTA5ID0gb3RoZXIuRmllbGQxMDk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMTApIHsNCisgICAgICAgICAgRmllbGQyMTAgPSBvdGhlci5GaWVsZDIxMDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIxMSkgew0KKyAgICAgICAgICBGaWVsZDIxMSA9IG90aGVyLkZpZWxkMjExOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjEyKSB7DQorICAgICAgICAgIEZpZWxkMjEyID0gb3RoZXIuRmllbGQyMTI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMTMpIHsNCisgICAgICAgICAgRmllbGQyMTMgPSBvdGhlci5GaWVsZDIxMzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIxNikgew0KKyAgICAgICAgICBGaWVsZDIxNiA9IG90aGVyLkZpZWxkMjE2Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjE3KSB7DQorICAgICAgICAgIEZpZWxkMjE3ID0gb3RoZXIuRmllbGQyMTc7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMTgpIHsNCisgICAgICAgICAgRmllbGQyMTggPSBvdGhlci5GaWVsZDIxODsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIyMCkgew0KKyAgICAgICAgICBGaWVsZDIyMCA9IG90aGVyLkZpZWxkMjIwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjIxKSB7DQorICAgICAgICAgIEZpZWxkMjIxID0gb3RoZXIuRmllbGQyMjE7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMjIpIHsNCisgICAgICAgICAgRmllbGQyMjIgPSBvdGhlci5GaWVsZDIyMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDYzKSB7DQorICAgICAgICAgIEZpZWxkNjMgPSBvdGhlci5GaWVsZDYzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLmdyb3VwMV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQuZ3JvdXAxXy5BZGQob3RoZXIuZ3JvdXAxXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuZmllbGQxMjhfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LmZpZWxkMTI4Xy5BZGQob3RoZXIuZmllbGQxMjhfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEzMSkgew0KKyAgICAgICAgICBGaWVsZDEzMSA9IG90aGVyLkZpZWxkMTMxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLmZpZWxkMTI3Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5maWVsZDEyN18uQWRkKG90aGVyLmZpZWxkMTI3Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxMjkpIHsNCisgICAgICAgICAgRmllbGQxMjkgPSBvdGhlci5GaWVsZDEyOTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5maWVsZDEzMF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQuZmllbGQxMzBfLkFkZChvdGhlci5maWVsZDEzMF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjA1KSB7DQorICAgICAgICAgIEZpZWxkMjA1ID0gb3RoZXIuRmllbGQyMDU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMDYpIHsNCisgICAgICAgICAgRmllbGQyMDYgPSBvdGhlci5GaWVsZDIwNjsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3NwZWVkTWVzc2FnZTJGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfc3BlZWRNZXNzYWdlMkZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWVsZDFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyID0gaW5wdXQuUmVhZEJ5dGVzKHJlZiByZXN1bHQuZmllbGQyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMyA9IGlucHV0LlJlYWRJbnQ2NChyZWYgcmVzdWx0LmZpZWxkM18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDQgPSBpbnB1dC5SZWFkSW50NjQocmVmIHJlc3VsdC5maWVsZDRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDUwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ2ID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmZpZWxkNl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODM6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRHcm91cEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0Lmdyb3VwMV8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMjFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDIwNTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjUgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5maWVsZDI1Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMwID0gaW5wdXQuUmVhZEludDY0KHJlZiByZXN1bHQuZmllbGQzMF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTA0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ2MyA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkNjNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU2ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNzEgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDcxXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2MDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDc1ID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDc1Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4NzI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwOSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMTA5Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDE4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU3RyaW5nQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuZmllbGQxMjdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwMjY6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTdHJpbmdBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5maWVsZDEyOF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTAzMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTI5ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQxMjlfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwNDI6DQorICAgICAgICAgICAgY2FzZSAxMDQwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5maWVsZDEzMF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA0ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMxID0gaW5wdXQuUmVhZEludDY0KHJlZiByZXN1bHQuZmllbGQxMzFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2NDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNSA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQyMDVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2NDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNiA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQyMDZfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2ODA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMjEwXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjg4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMTEgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDIxMV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY5Njogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEyID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQyMTJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE3MDQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMyA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMjEzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNzI4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMTYgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDIxNl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTczNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjE3ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQyMTdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE3NDQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxOCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMjE4Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNzYwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMjAgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDIyMF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTc2ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIxID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQyMjFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE3ODE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIyMiA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0LmZpZWxkMjIyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDFfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEZpZWxkMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDMobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQzXyA9IDBMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDQ7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNF8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQzMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDMwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQzMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQzMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQzMChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMzBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDMwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQzMF8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDc1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ3NTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDc1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ3NTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ3NSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ3NShib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNzUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNzVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDc1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDc1ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ3NV8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDY7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ2KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDZfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNl8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIEZpZWxkMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIocGI6OkJ5dGVTdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDJfID0gcGI6OkJ5dGVTdHJpbmcuRW1wdHk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ3MSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNzE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDcxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ3MTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ3MSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ3MShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ3MSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ3MV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNzEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNzEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDcxXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEZpZWxkMjUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI1OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDI1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI1KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI1ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyNV8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTA5OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMDkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEwOTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMDkodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTA5KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwOSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMDlfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEwOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwOV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjEwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMTA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIxMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjEwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIxMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMTAoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjEwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjEwXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIxMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjExIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMTE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjExKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIxMShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjExXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMTEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjExID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMTFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjEyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMTIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIxMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMTIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjEyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMTJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjEzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMTM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIxMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjEzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIxMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMTMoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjEzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjEzXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIxNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjE2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMTY7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjE2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIxNihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTYgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjE2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMTYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjE2ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMTZfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxNyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjE3OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMTcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIxNzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMTcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjE3KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxNyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMTdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxNygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTcgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxN18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjE4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMTg7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIxOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjE4OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIxOCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMTgoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjE4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxOF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjE4KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxOCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjE4XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMjAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIyMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjIwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMjA7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjIwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIyMChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMjAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjIwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMjAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMjBfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIyMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjIxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMjEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIyMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMjEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjIxKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIyMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMjFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIyMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMjEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIyMV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMjI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEZpZWxkMjIyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMjI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjIyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIyMihmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIyMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMjJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIyMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMjIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIyMl8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDYzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ2MzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkNjMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDYzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDYzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDYzKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDYzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDYzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ2MygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2MyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNjNfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxPiBHcm91cDFMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmdyb3VwMV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHcm91cDFDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lkdyb3VwMUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMSBHZXRHcm91cDEoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldEdyb3VwMShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEdyb3VwMShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5ncm91cDFfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEdyb3VwMShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmdyb3VwMV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkR3JvdXAxKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5ncm91cDFfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkR3JvdXAxKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmdyb3VwMV8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUdyb3VwMShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZ3JvdXAxXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckdyb3VwMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZ3JvdXAxXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBGaWVsZDEyOExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZmllbGQxMjhfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMjhDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI4Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBHZXRGaWVsZDEyOChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0RmllbGQxMjgoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEyOChpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMjhfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEZpZWxkMTI4KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMjhfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VGaWVsZDEyOChzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI4Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTI4KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyOF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTMxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEZpZWxkMTMxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMzE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTMxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEzMShsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTMxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTMxXyA9IDBMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBGaWVsZDEyN0xpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZmllbGQxMjdfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMjdDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI3Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBHZXRGaWVsZDEyNyhpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0RmllbGQxMjcoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEyNyhpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMjdfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEZpZWxkMTI3KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMjdfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VGaWVsZDEyNyhzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI3Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTI3KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyN18uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEyOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTI5OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMjkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEyOTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMjkodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTI5KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyOSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMjlfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEyOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMjkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyOV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gRmllbGQxMzBMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmZpZWxkMTMwXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTMwQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEzMENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEdldEZpZWxkMTMwKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRGaWVsZDEzMChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTMwKGludCBpbmRleCwgbG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmllbGQxMzAobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUZpZWxkMTMwKHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTMwXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTMwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjA1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMjA1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMDU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjA1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIwNShib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwNV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjA1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA1XyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQyMDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIwNjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMDYodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjA2KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDYgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMDYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA2ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMDZfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFNwZWVkTWVzc2FnZTIoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5Hb29nbGVTcGVlZFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSwgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3NwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiZmllbGQxIiwgImZpZWxkMTAiLCAiZmllbGQxMSIsICJmaWVsZDIiLCAiZmllbGQzIiwgImZpZWxkNCIsICJmaWVsZDUiLCAiZmllbGQ2IiwgImZpZWxkNyIsICJmaWVsZDgiLCAiZmllbGQ5IiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3NwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMywgODUsIDg4LCAyMSwgMjksIDMyLCA0MCwgNDgsIDU2LCA2OSwgNzIgfTsNCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLkdvb2dsZVNwZWVkUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8U3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLCBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0JlbmNoLkdvb2dsZVNwZWVkUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfYmVuY2htYXJrc19TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMkZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkM0ZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMzsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNEZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNDsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkNF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDVGaWVsZE51bWJlciA9IDU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDU7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDUgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ2RmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ2Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQ2XyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDdGaWVsZE51bWJlciA9IDc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDc7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDdfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDcgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ4RmllbGROdW1iZXIgPSA4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ4Ow0KKyAgICBwcml2YXRlIGZsb2F0IGZpZWxkOF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkODsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBGaWVsZDggew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDhfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ5RmllbGROdW1iZXIgPSA5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ5Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQ5XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ5OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQ5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTBGaWVsZE51bWJlciA9IDEwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMDsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDEwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQxMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMUZpZWxkTnVtYmVyID0gMTE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDExOw0KKyAgICBwcml2YXRlIGxvbmcgZmllbGQxMV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDExOyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRmllbGQxMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9zcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNGaWVsZDEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDEsIGZpZWxkX25hbWVzWzBdLCBGaWVsZDEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgyLCBmaWVsZF9uYW1lc1szXSwgRmllbGQyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoMywgZmllbGRfbmFtZXNbNF0sIEZpZWxkMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woNCwgZmllbGRfbmFtZXNbNV0sIEZpZWxkNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woNSwgZmllbGRfbmFtZXNbNl0sIEZpZWxkNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDYpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woNiwgZmllbGRfbmFtZXNbN10sIEZpZWxkNik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDcpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woNywgZmllbGRfbmFtZXNbOF0sIEZpZWxkNyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDgpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDgsIGZpZWxkX25hbWVzWzldLCBGaWVsZDgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ5KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDksIGZpZWxkX25hbWVzWzEwXSwgRmllbGQ5KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDEwLCBmaWVsZF9uYW1lc1sxXSwgRmllbGQxMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDExKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NCgxMSwgZmllbGRfbmFtZXNbMl0sIEZpZWxkMTEpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0ZpZWxkMSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSgxLCBGaWVsZDEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDIsIEZpZWxkMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoMywgRmllbGQzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDQsIEZpZWxkNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSg1LCBGaWVsZDUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ2KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoNiwgRmllbGQ2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDcsIEZpZWxkNyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDgpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoOCwgRmllbGQ4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkOSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDksIEZpZWxkOSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEwKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDEwLCBGaWVsZDEwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTEpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUoMTEsIEZpZWxkMTEpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvQmVuY2guU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxKSB7DQorICAgICAgICAgIEZpZWxkMSA9IG90aGVyLkZpZWxkMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIpIHsNCisgICAgICAgICAgRmllbGQyID0gb3RoZXIuRmllbGQyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMykgew0KKyAgICAgICAgICBGaWVsZDMgPSBvdGhlci5GaWVsZDM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ0KSB7DQorICAgICAgICAgIEZpZWxkNCA9IG90aGVyLkZpZWxkNDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDUpIHsNCisgICAgICAgICAgRmllbGQ1ID0gb3RoZXIuRmllbGQ1Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkNikgew0KKyAgICAgICAgICBGaWVsZDYgPSBvdGhlci5GaWVsZDY7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ3KSB7DQorICAgICAgICAgIEZpZWxkNyA9IG90aGVyLkZpZWxkNzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDgpIHsNCisgICAgICAgICAgRmllbGQ4ID0gb3RoZXIuRmllbGQ4Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkOSkgew0KKyAgICAgICAgICBGaWVsZDkgPSBvdGhlci5GaWVsZDk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxMCkgew0KKyAgICAgICAgICBGaWVsZDEwID0gb3RoZXIuRmllbGQxMDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDExKSB7DQorICAgICAgICAgIEZpZWxkMTEgPSBvdGhlci5GaWVsZDExOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfc3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3NwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMzogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0LmZpZWxkMV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5maWVsZDJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI5OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQuZmllbGQzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNCA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQ0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNSA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQ1Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNiA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQ2Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1Njogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNyA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQ3Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2OTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkOCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0LmZpZWxkOF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDkgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmZpZWxkOV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODU6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQuZmllbGQxMF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDExID0gaW5wdXQuUmVhZEludDY0KHJlZiByZXN1bHQuZmllbGQxMV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgRmllbGQxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMShmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxXyA9IDBGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgRmllbGQyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMihmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyXyA9IDBGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgRmllbGQzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMyhmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQzXyA9IDBGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDQ7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ0KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNF8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQ1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ1OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNShib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDVfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ2OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDYoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDYgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ2XyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ3OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkNyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ3KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDcoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkN18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ3ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ3XyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkODsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgRmllbGQ4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ4OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDgodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkOChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDggPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkOF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkOCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ4ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ4XyA9IDBGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDk7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkOSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ5KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDlfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkOSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkOV8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgRmllbGQxMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTA7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTAoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwXyA9IDBGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDExOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEZpZWxkMTEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDExOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDExKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDExKGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDExXyA9IDBMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaC5Hb29nbGVTcGVlZFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCit9DQorDQorI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9CZW5jaC9UZXN0UHJvdG9zL1VuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b0JlbmNoL1Rlc3RQcm90b3MvVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhZTJiOAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9CZW5jaC9UZXN0UHJvdG9zL1VuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmNzCkBAIC0wLDAgKzEsMzQ2IEBACisvLyBHZW5lcmF0ZWQgYnkgUHJvdG9HZW4sIFZlcnNpb249Mi40LjEuNTU1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTU1ZjcxMjUyMzRiZWI1ODkuICBETyBOT1QgRURJVCENCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxDQorI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KKw0KK3VzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zIHsNCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBVbml0VGVzdEltcG9ydFByb3RvRmlsZSB7DQorICANCisgICAgI3JlZ2lvbiBFeHRlbnNpb24gcmVnaXN0cmF0aW9uDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3RlckFsbEV4dGVuc2lvbnMocGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIFN0YXRpYyB2YXJpYWJsZXMNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9pbXBvcnRfSW1wb3J0TWVzc2FnZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydF9JbXBvcnRNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBEZXNjcmlwdG9yDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIHByaXZhdGUgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsNCisgICAgDQorICAgIHN0YXRpYyBVbml0VGVzdEltcG9ydFByb3RvRmlsZSgpIHsNCisgICAgICBieXRlW10gZGVzY3JpcHRvckRhdGEgPSBnbG9iYWw6OlN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoDQorICAgICAgICAgIHN0cmluZy5Db25jYXQoDQorICAgICAgICAgICAgIkNpVm5iMjluYkdVdmNISnZkRzlpZFdZdmRXNXBkSFJsYzNSZmFXMXdiM0owTG5CeWIzUnZFaGh3Y205MCIsIA0KKyAgICAgICAgICAgICJiMkoxWmw5MWJtbDBkR1Z6ZEY5cGJYQnZjblFhSkdkdmIyZHNaUzl3Y205MGIySjFaaTlqYzJoaGNuQmYiLCANCisgICAgICAgICAgICAiYjNCMGFXOXVjeTV3Y205MGJ5SWFDZzFKYlhCdmNuUk5aWE56WVdkbEVna0tBV1FZQVNBQktBVXFQQW9LIiwgDQorICAgICAgICAgICAgIlNXMXdiM0owUlc1MWJSSU9DZ3BKVFZCUFVsUmZSazlQRUFjU0Rnb0tTVTFRVDFKVVgwSkJVaEFJRWc0SyIsIA0KKyAgICAgICAgICAgICJDa2xOVUU5U1ZGOUNRVm9RQ1VKYkNoaGpiMjB1WjI5dloyeGxMbkJ5YjNSdlluVm1MblJsYzNSSUFjSSsiLCANCisgICAgICAgICAgICAiUEFvaFIyOXZaMnhsTGxCeWIzUnZZMjlzUW5WbVptVnljeTVVWlhOMFVISnZkRzl6RWhkVmJtbDBWR1Z6IiwgDQorICAgICAgICAgICJkRWx0Y0c5eWRGQnliM1J2Um1sc1pRPT0iKSk7DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciBhc3NpZ25lciA9IGRlbGVnYXRlKHBiZDo6RmlsZURlc2NyaXB0b3Igcm9vdCkgew0KKyAgICAgICAgZGVzY3JpcHRvciA9IHJvb3Q7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydF9JbXBvcnRNZXNzYWdlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydF9JbXBvcnRNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0X0ltcG9ydE1lc3NhZ2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJEIiwgfSk7DQorICAgICAgICBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICByZXR1cm4gcmVnaXN0cnk7DQorICAgICAgfTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbShkZXNjcmlwdG9yRGF0YSwNCisgICAgICAgICAgbmV3IHBiZDo6RmlsZURlc2NyaXB0b3JbXSB7DQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuRGVzY3JpcHRvciwgDQorICAgICAgICAgIH0sIGFzc2lnbmVyKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgfQ0KKyAgI3JlZ2lvbiBFbnVtcw0KKyAgcHVibGljIGVudW0gSW1wb3J0RW51bSB7DQorICAgIElNUE9SVF9GT08gPSA3LA0KKyAgICBJTVBPUlRfQkFSID0gOCwNCisgICAgSU1QT1JUX0JBWiA9IDksDQorICB9DQorICANCisgICNlbmRyZWdpb24NCisgIA0KKyAgI3JlZ2lvbiBNZXNzYWdlcw0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBJbXBvcnRNZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8SW1wb3J0TWVzc2FnZSwgSW1wb3J0TWVzc2FnZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgSW1wb3J0TWVzc2FnZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJbXBvcnRNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBJbXBvcnRNZXNzYWdlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9pbXBvcnRNZXNzYWdlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJkIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2ltcG9ydE1lc3NhZ2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBJbXBvcnRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEltcG9ydE1lc3NhZ2UgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9pbXBvcnRfSW1wb3J0TWVzc2FnZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxJbXBvcnRNZXNzYWdlLCBJbXBvcnRNZXNzYWdlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEltcG9ydFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydF9JbXBvcnRNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBERmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRDsNCisgICAgcHJpdmF0ZSBpbnQgZF87DQorICAgIHB1YmxpYyBib29sIEhhc0Qgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEIHsNCisgICAgICBnZXQgeyByZXR1cm4gZF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2ltcG9ydE1lc3NhZ2VGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNEKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgRCk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzRCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBEKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydE1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydE1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydE1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydE1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIEltcG9ydE1lc3NhZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoSW1wb3J0TWVzc2FnZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxJbXBvcnRNZXNzYWdlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihJbXBvcnRNZXNzYWdlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgSW1wb3J0TWVzc2FnZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBJbXBvcnRNZXNzYWdlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgSW1wb3J0TWVzc2FnZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEltcG9ydE1lc3NhZ2UoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEltcG9ydE1lc3NhZ2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEltcG9ydE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEltcG9ydE1lc3NhZ2UgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEltcG9ydE1lc3NhZ2UpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoSW1wb3J0TWVzc2FnZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEltcG9ydE1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0QpIHsNCisgICAgICAgICAgRCA9IG90aGVyLkQ7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9pbXBvcnRNZXNzYWdlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2ltcG9ydE1lc3NhZ2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0QgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0Q7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0QgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIEltcG9ydE1lc3NhZ2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEltcG9ydFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCit9DQorDQorI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9CZW5jaC9UZXN0UHJvdG9zL1VuaXRUZXN0UHJvdG9GaWxlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b0JlbmNoL1Rlc3RQcm90b3MvVW5pdFRlc3RQcm90b0ZpbGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzMWM2NwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9CZW5jaC9UZXN0UHJvdG9zL1VuaXRUZXN0UHJvdG9GaWxlLmNzCkBAIC0wLDAgKzEsMjE2MDIgQEAKKy8vIEdlbmVyYXRlZCBieSBQcm90b0dlbiwgVmVyc2lvbj0yLjQuMS41NTUsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49NTVmNzEyNTIzNGJlYjU4OS4gIERPIE5PVCBFRElUIQ0KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjENCisjcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQorDQordXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM7DQordXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KK3VzaW5nIHBiZCA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCit1c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3Mgew0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXRUZXN0UHJvdG9GaWxlIHsNCisgIA0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbnQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50NjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFVpbnQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsVWludDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTaW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFNpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGbG9hdEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxCb29sRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEJ5dGVzRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxHcm91cEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQ29yZEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEludDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRVaW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTaW50NjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRmxvYXRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQm9vbEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRCeXRlc0V4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkR3JvdXBFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZENvcmRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW50NjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0VWludDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFVpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTaW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ludDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGbG9hdEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHREb3VibGVFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Qm9vbEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Qnl0ZXNFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdENvcmRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5NeUV4dGVuc2lvblN0cmluZyk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk15RXh0ZW5zaW9uSW50KTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkSW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRJbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFVpbnQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFVpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFNpbnQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFNpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGaXhlZDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEZsb2F0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRG91YmxlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkQm9vbEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEVudW1FeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uLlRlc3QpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuU2luZ2xlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLk11bHRpKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gRXh0ZW5zaW9ucw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsSW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8aW50PiBPcHRpb25hbEludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsSW50NjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8bG9uZz4gT3B0aW9uYWxJbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFVpbnQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8dWludD4gT3B0aW9uYWxVaW50MzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxVaW50NjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDQ7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHVsb25nPiBPcHRpb25hbFVpbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFNpbnQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxpbnQ+IE9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA2Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGxvbmc+IE9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8dWludD4gT3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gODsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8dWxvbmc+IE9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGludD4gT3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxMDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxsb25nPiBPcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRmxvYXRFeHRlbnNpb25GaWVsZE51bWJlciA9IDExOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGZsb2F0PiBPcHRpb25hbEZsb2F0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxMjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxkb3VibGU+IE9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQm9vbEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTM7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Ym9vbD4gT3B0aW9uYWxCb29sRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxNDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzdHJpbmc+IE9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQnl0ZXNFeHRlbnNpb25GaWVsZE51bWJlciA9IDE1Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHBiOjpCeXRlU3RyaW5nPiBPcHRpb25hbEJ5dGVzRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsR3JvdXBFeHRlbnNpb25GaWVsZE51bWJlciA9IDE2Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uPiBPcHRpb25hbEdyb3VwRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTg7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2U+IE9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxOTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gT3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25GaWVsZE51bWJlciA9IDIwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2U+IE9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25GaWVsZE51bWJlciA9IDIxOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtPiBPcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMjI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IE9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAyMzsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPiBPcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMjQ7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c3RyaW5nPiBPcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQ29yZEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMjU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c3RyaW5nPiBPcHRpb25hbENvcmRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxpbnQ+PiBSZXBlYXRlZEludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW50NjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDMyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8bG9uZz4+IFJlcGVhdGVkSW50NjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRVaW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDMzOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHVpbnQ+PiBSZXBlYXRlZFVpbnQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzQ7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8dWxvbmc+PiBSZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxpbnQ+PiBSZXBlYXRlZFNpbnQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzY7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxsb25nPj4gUmVwZWF0ZWRTaW50NjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAzNzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDx1aW50Pj4gUmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzg7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8dWxvbmc+PiBSZXBlYXRlZEZpeGVkNjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzk7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxpbnQ+PiBSZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDQwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8bG9uZz4+IFJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNDE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxmbG9hdD4+IFJlcGVhdGVkRmxvYXRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWREb3VibGVFeHRlbnNpb25GaWVsZE51bWJlciA9IDQyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8ZG91YmxlPj4gUmVwZWF0ZWREb3VibGVFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRCb29sRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA0MzsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGJvb2w+PiBSZXBlYXRlZEJvb2xFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25GaWVsZE51bWJlciA9IDQ0Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8c3RyaW5nPj4gUmVwZWF0ZWRTdHJpbmdFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkZpZWxkTnVtYmVyID0gNDU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxwYjo6Qnl0ZVN0cmluZz4+IFJlcGVhdGVkQnl0ZXNFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRHcm91cEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNDY7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbj4+IFJlcGVhdGVkR3JvdXBFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA0ODsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPj4gUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25GaWVsZE51bWJlciA9IDQ5Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+PiBSZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNTA7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlPj4gUmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNTE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bT4+IFJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA1MjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPj4gUmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25GaWVsZE51bWJlciA9IDUzOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4+IFJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA1NDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHN0cmluZz4+IFJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRDb3JkRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA1NTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHN0cmluZz4+IFJlcGVhdGVkQ29yZEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0SW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDYxOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGludD4gRGVmYXVsdEludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRJbnQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNjI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8bG9uZz4gRGVmYXVsdEludDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRVaW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDYzOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTx1aW50PiBEZWZhdWx0VWludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRVaW50NjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDY0Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTx1bG9uZz4gRGVmYXVsdFVpbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0U2ludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA2NTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxpbnQ+IERlZmF1bHRTaW50MzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNjY7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8bG9uZz4gRGVmYXVsdFNpbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNjc7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHVpbnQ+IERlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA2ODsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8dWxvbmc+IERlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNjk7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8aW50PiBEZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA3MDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxsb25nPiBEZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEZsb2F0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA3MTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxmbG9hdD4gRGVmYXVsdEZsb2F0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHREb3VibGVFeHRlbnNpb25GaWVsZE51bWJlciA9IDcyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGRvdWJsZT4gRGVmYXVsdERvdWJsZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0Qm9vbEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNzM7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Ym9vbD4gRGVmYXVsdEJvb2xFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFN0cmluZ0V4dGVuc2lvbkZpZWxkTnVtYmVyID0gNzQ7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c3RyaW5nPiBEZWZhdWx0U3RyaW5nRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRCeXRlc0V4dGVuc2lvbkZpZWxkTnVtYmVyID0gNzU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8cGI6OkJ5dGVTdHJpbmc+IERlZmF1bHRCeXRlc0V4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gODE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+IERlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gODI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IERlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gODM7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4gRGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA4NDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzdHJpbmc+IERlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0Q29yZEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gODU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c3RyaW5nPiBEZWZhdWx0Q29yZEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBNeUV4dGVuc2lvblN0cmluZ0ZpZWxkTnVtYmVyID0gNTA7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c3RyaW5nPiBNeUV4dGVuc2lvblN0cmluZzsNCisgICAgcHVibGljIGNvbnN0IGludCBNeUV4dGVuc2lvbkludEZpZWxkTnVtYmVyID0gNTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxpbnQ+IE15RXh0ZW5zaW9uSW50Ow0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5MDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGludD4+IFBhY2tlZEludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEludDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5MTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGxvbmc+PiBQYWNrZWRJbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRVaW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDkyOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHVpbnQ+PiBQYWNrZWRVaW50MzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkVWludDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5MzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDx1bG9uZz4+IFBhY2tlZFVpbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTaW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDk0Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8aW50Pj4gUGFja2VkU2ludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFNpbnQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gOTU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxsb25nPj4gUGFja2VkU2ludDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEZpeGVkMzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDk2Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHVpbnQ+PiBQYWNrZWRGaXhlZDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEZpeGVkNjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDk3Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHVsb25nPj4gUGFja2VkRml4ZWQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gOTg7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxpbnQ+PiBQYWNrZWRTZml4ZWQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gOTk7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxsb25nPj4gUGFja2VkU2ZpeGVkNjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRmxvYXRFeHRlbnNpb25GaWVsZE51bWJlciA9IDEwMDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGZsb2F0Pj4gUGFja2VkRmxvYXRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRG91YmxlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxMDE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxkb3VibGU+PiBQYWNrZWREb3VibGVFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkQm9vbEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTAyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8Ym9vbD4+IFBhY2tlZEJvb2xFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTAzOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+PiBQYWNrZWRFbnVtRXh0ZW5zaW9uOw0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICAjcmVnaW9uIFN0YXRpYyB2YXJpYWJsZXMNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2VfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX09wdGlvbmFsR3JvdXBfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXBfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cC5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19SZXBlYXRlZEdyb3VwX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdERlcHJlY2F0ZWRGaWVsZHNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REZXByZWNhdGVkRmllbGRzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RGVwcmVjYXRlZEZpZWxkcy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REZXByZWNhdGVkRmllbGRzX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9yZWlnbk1lc3NhZ2VfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0ZvcmVpZ25NZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxFeHRlbnNpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT3B0aW9uYWxHcm91cF9leHRlbnNpb25fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PcHRpb25hbEdyb3VwX2V4dGVuc2lvbi5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1JlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZEV4dGVuc2lvbl9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZEV4dGVuc2lvbiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZEV4dGVuc2lvbi5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRFeHRlbnNpb25fX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVxdWlyZWRfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkRm9yZWlnbl9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkRm9yZWlnbiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkRm9yZWlnbi5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZEZvcmVpZ25fX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Rm9yZWlnbk5lc3RlZF9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZvcmVpZ25OZXN0ZWQsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RGb3JlaWduTmVzdGVkLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEZvcmVpZ25OZXN0ZWRfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtcHR5TWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWFsbHlMYXJnZVRhZ051bWJlci5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZWFsbHlMYXJnZVRhZ051bWJlcl9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZWN1cnNpdmVNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVjdXJzaXZlTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVjdXJzaXZlTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25BX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25CX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQl9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfRm9vX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX0Zvb19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9CYXJfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfQmFyX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19OZXN0ZWRNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuVHlwZXMuTmVzdGVkTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfTmVzdGVkTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0Q2FtZWxDYXNlRmllbGROYW1lcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Q2FtZWxDYXNlRmllbGROYW1lc19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGaWVsZE9yZGVyaW5nc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZpZWxkT3JkZXJpbmdzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RmllbGRPcmRlcmluZ3MuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RmllbGRPcmRlcmluZ3NfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfU3BhcnNlRW51bU1lc3NhZ2VfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwYXJzZUVudW1NZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGFyc2VFbnVtTWVzc2FnZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NwYXJzZUVudW1NZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT25lU3RyaW5nX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVTdHJpbmcsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9uZVN0cmluZy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09uZVN0cmluZ19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09uZUJ5dGVzX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVCeXRlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lQnl0ZXMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVCeXRlc19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRUeXBlc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZFR5cGVzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkVHlwZXMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkVHlwZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0VW5wYWNrZWRUeXBlc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkVHlwZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZFR5cGVzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFVucGFja2VkVHlwZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkRXh0ZW5zaW9uc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFBhY2tlZEV4dGVuc2lvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHluYW1pY0V4dGVuc2lvbnNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX0R5bmFtaWNNZXNzYWdlVHlwZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REeW5hbWljRXh0ZW5zaW9uc19EeW5hbWljTWVzc2FnZVR5cGVfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXF1ZXN0X19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0LkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9vUmVxdWVzdF9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0Zvb1Jlc3BvbnNlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXNwb25zZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0JhclJlcXVlc3RfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlcXVlc3QsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlcXVlc3QuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXF1ZXN0X19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQmFyUmVzcG9uc2VfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXNwb25zZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0JhclJlc3BvbnNlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBEZXNjcmlwdG9yDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIHByaXZhdGUgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsNCisgICAgDQorICAgIHN0YXRpYyBVbml0VGVzdFByb3RvRmlsZSgpIHsNCisgICAgICBieXRlW10gZGVzY3JpcHRvckRhdGEgPSBnbG9iYWw6OlN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoDQorICAgICAgICAgIHN0cmluZy5Db25jYXQoDQorICAgICAgICAgICAgIkNoNW5iMjluYkdVdmNISnZkRzlpZFdZdmRXNXBkSFJsYzNRdWNISnZkRzhTRVhCeWIzUnZZblZtWDNWdSIsIA0KKyAgICAgICAgICAgICJhWFIwWlhOMEdpUm5iMjluYkdVdmNISnZkRzlpZFdZdlkzTm9ZWEp3WDI5d2RHbHZibk11Y0hKdmRHOGEiLCANCisgICAgICAgICAgICAiSldkdmIyZHNaUzl3Y205MGIySjFaaTkxYm1sMGRHVnpkRjlwYlhCdmNuUXVjSEp2ZEc4aXV4VUtERlJsIiwgDQorICAgICAgICAgICAgImMzUkJiR3hVZVhCbGN4SVdDZzV2Y0hScGIyNWhiRjlwYm5Rek1oZ0JJQUVvQlJJV0NnNXZjSFJwYjI1aCIsIA0KKyAgICAgICAgICAgICJiRjlwYm5RMk5CZ0NJQUVvQXhJWENnOXZjSFJwYjI1aGJGOTFhVzUwTXpJWUF5QUJLQTBTRndvUGIzQjAiLCANCisgICAgICAgICAgICAiYVc5dVlXeGZkV2x1ZERZMEdBUWdBU2dFRWhjS0QyOXdkR2x2Ym1Gc1gzTnBiblF6TWhnRklBRW9FUklYIiwgDQorICAgICAgICAgICAgIkNnOXZjSFJwYjI1aGJGOXphVzUwTmpRWUJpQUJLQklTR0FvUWIzQjBhVzl1WVd4ZlptbDRaV1F6TWhnSCIsIA0KKyAgICAgICAgICAgICJJQUVvQnhJWUNoQnZjSFJwYjI1aGJGOW1hWGhsWkRZMEdBZ2dBU2dHRWhrS0VXOXdkR2x2Ym1Gc1gzTm0iLCANCisgICAgICAgICAgICAiYVhobFpETXlHQWtnQVNnUEVoa0tFVzl3ZEdsdmJtRnNYM05tYVhobFpEWTBHQW9nQVNnUUVoWUtEbTl3IiwgDQorICAgICAgICAgICAgImRHbHZibUZzWDJac2IyRjBHQXNnQVNnQ0VoY0tEMjl3ZEdsdmJtRnNYMlJ2ZFdKc1pSZ01JQUVvQVJJViIsIA0KKyAgICAgICAgICAgICJDZzF2Y0hScGIyNWhiRjlpYjI5c0dBMGdBU2dJRWhjS0QyOXdkR2x2Ym1Gc1gzTjBjbWx1WnhnT0lBRW8iLCANCisgICAgICAgICAgICAiQ1JJV0NnNXZjSFJwYjI1aGJGOWllWFJsY3hnUElBRW9EQkpFQ2cxdmNIUnBiMjVoYkdkeWIzVndHQkFnIiwgDQorICAgICAgICAgICAgIkFTZ0tNaTB1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRlI1Y0dWekxrOXdkR2x2Ym1GcyIsIA0KKyAgICAgICAgICAgICJSM0p2ZFhBU1Rnb1hiM0IwYVc5dVlXeGZibVZ6ZEdWa1gyMWxjM05oWjJVWUVpQUJLQXN5TFM1d2NtOTAiLCANCisgICAgICAgICAgICAiYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVd4c1ZIbHdaWE11VG1WemRHVmtUV1Z6YzJGblpSSkRDaGh2IiwgDQorICAgICAgICAgICAgImNIUnBiMjVoYkY5bWIzSmxhV2R1WDIxbGMzTmhaMlVZRXlBQktBc3lJUzV3Y205MGIySjFabDkxYm1sMCIsIA0KKyAgICAgICAgICAgICJkR1Z6ZEM1R2IzSmxhV2R1VFdWemMyRm5aUkpJQ2hkdmNIUnBiMjVoYkY5cGJYQnZjblJmYldWemMyRm4iLCANCisgICAgICAgICAgICAiWlJnVUlBRW9DekluTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wWDJsdGNHOXlkQzVKYlhCdmNuUk5aWE56IiwgDQorICAgICAgICAgICAgIllXZGxFa2dLRkc5d2RHbHZibUZzWDI1bGMzUmxaRjlsYm5WdEdCVWdBU2dPTWlvdWNISnZkRzlpZFdaZiIsIA0KKyAgICAgICAgICAgICJkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JGUjVjR1Z6TGs1bGMzUmxaRVZ1ZFcwU1BRb1ZiM0IwYVc5dVlXeGYiLCANCisgICAgICAgICAgICAiWm05eVpXbG5ibDlsYm5WdEdCWWdBU2dPTWg0dWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVJtOXlaV2xuIiwgDQorICAgICAgICAgICAgImJrVnVkVzBTUWdvVWIzQjBhVzl1WVd4ZmFXMXdiM0owWDJWdWRXMFlGeUFCS0E0eUpDNXdjbTkwYjJKMSIsIA0KKyAgICAgICAgICAgICJabDkxYm1sMGRHVnpkRjlwYlhCdmNuUXVTVzF3YjNKMFJXNTFiUkloQ2hWdmNIUnBiMjVoYkY5emRISnAiLCANCisgICAgICAgICAgICAiYm1kZmNHbGxZMlVZR0NBQktBbENBZ2dDRWhrS0RXOXdkR2x2Ym1Gc1gyTnZjbVFZR1NBQktBbENBZ2dCIiwgDQorICAgICAgICAgICAgIkVoWUtEbkpsY0dWaGRHVmtYMmx1ZERNeUdCOGdBeWdGRWhZS0RuSmxjR1ZoZEdWa1gybHVkRFkwR0NBZyIsIA0KKyAgICAgICAgICAgICJBeWdERWhjS0QzSmxjR1ZoZEdWa1gzVnBiblF6TWhnaElBTW9EUklYQ2c5eVpYQmxZWFJsWkY5MWFXNTAiLCANCisgICAgICAgICAgICAiTmpRWUlpQURLQVFTRndvUGNtVndaV0YwWldSZmMybHVkRE15R0NNZ0F5Z1JFaGNLRDNKbGNHVmhkR1ZrIiwgDQorICAgICAgICAgICAgIlgzTnBiblEyTkJna0lBTW9FaElZQ2hCeVpYQmxZWFJsWkY5bWFYaGxaRE15R0NVZ0F5Z0hFaGdLRUhKbCIsIA0KKyAgICAgICAgICAgICJjR1ZoZEdWa1gyWnBlR1ZrTmpRWUppQURLQVlTR1FvUmNtVndaV0YwWldSZmMyWnBlR1ZrTXpJWUp5QUQiLCANCisgICAgICAgICAgICAiS0E4U0dRb1JjbVZ3WldGMFpXUmZjMlpwZUdWa05qUVlLQ0FES0JBU0Znb09jbVZ3WldGMFpXUmZabXh2IiwgDQorICAgICAgICAgICAgIllYUVlLU0FES0FJU0Z3b1BjbVZ3WldGMFpXUmZaRzkxWW14bEdDb2dBeWdCRWhVS0RYSmxjR1ZoZEdWayIsIA0KKyAgICAgICAgICAgICJYMkp2YjJ3WUt5QURLQWdTRndvUGNtVndaV0YwWldSZmMzUnlhVzVuR0N3Z0F5Z0pFaFlLRG5KbGNHVmgiLCANCisgICAgICAgICAgICAiZEdWa1gySjVkR1Z6R0MwZ0F5Z01Fa1FLRFhKbGNHVmhkR1ZrWjNKdmRYQVlMaUFES0FveUxTNXdjbTkwIiwgDQorICAgICAgICAgICAgImIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNWSGx3WlhNdVVtVndaV0YwWldSSGNtOTFjQkpPQ2hkeSIsIA0KKyAgICAgICAgICAgICJaWEJsWVhSbFpGOXVaWE4wWldSZmJXVnpjMkZuWlJnd0lBTW9Dekl0TG5CeWIzUnZZblZtWDNWdWFYUjAiLCANCisgICAgICAgICAgICAiWlhOMExsUmxjM1JCYkd4VWVYQmxjeTVPWlhOMFpXUk5aWE56WVdkbEVrTUtHSEpsY0dWaGRHVmtYMlp2IiwgDQorICAgICAgICAgICAgImNtVnBaMjVmYldWemMyRm5aUmd4SUFNb0N6SWhMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMa1p2Y21WcCIsIA0KKyAgICAgICAgICAgICJaMjVOWlhOellXZGxFa2dLRjNKbGNHVmhkR1ZrWDJsdGNHOXlkRjl0WlhOellXZGxHRElnQXlnTE1pY3UiLCANCisgICAgICAgICAgICAiY0hKdmRHOWlkV1pmZFc1cGRIUmxjM1JmYVcxd2IzSjBMa2x0Y0c5eWRFMWxjM05oWjJVU1NBb1VjbVZ3IiwgDQorICAgICAgICAgICAgIlpXRjBaV1JmYm1WemRHVmtYMlZ1ZFcwWU15QURLQTR5S2k1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VSIsIA0KKyAgICAgICAgICAgICJaWE4wUVd4c1ZIbHdaWE11VG1WemRHVmtSVzUxYlJJOUNoVnlaWEJsWVhSbFpGOW1iM0psYVdkdVgyVnUiLCANCisgICAgICAgICAgICAiZFcwWU5DQURLQTR5SGk1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1R2IzSmxhV2R1Ulc1MWJSSkNDaFJ5IiwgDQorICAgICAgICAgICAgIlpYQmxZWFJsWkY5cGJYQnZjblJmWlc1MWJSZzFJQU1vRGpJa0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMCIsIA0KKyAgICAgICAgICAgICJYMmx0Y0c5eWRDNUpiWEJ2Y25SRmJuVnRFaUVLRlhKbGNHVmhkR1ZrWDNOMGNtbHVaMTl3YVdWalpSZzIiLCANCisgICAgICAgICAgICAiSUFNb0NVSUNDQUlTR1FvTmNtVndaV0YwWldSZlkyOXlaQmczSUFNb0NVSUNDQUVTR1FvTlpHVm1ZWFZzIiwgDQorICAgICAgICAgICAgImRGOXBiblF6TWhnOUlBRW9CVG9DTkRFU0dRb05aR1ZtWVhWc2RGOXBiblEyTkJnK0lBRW9Bem9DTkRJUyIsIA0KKyAgICAgICAgICAgICJHZ29PWkdWbVlYVnNkRjkxYVc1ME16SVlQeUFCS0EwNkFqUXpFaG9LRG1SbFptRjFiSFJmZFdsdWREWTAiLCANCisgICAgICAgICAgICAiR0VBZ0FTZ0VPZ0kwTkJJYkNnNWtaV1poZFd4MFgzTnBiblF6TWhoQklBRW9FVG9ETFRRMUVob0tEbVJsIiwgDQorICAgICAgICAgICAgIlptRjFiSFJmYzJsdWREWTBHRUlnQVNnU09nSTBOaEliQ2c5a1pXWmhkV3gwWDJacGVHVmtNeklZUXlBQiIsIA0KKyAgICAgICAgICAgICJLQWM2QWpRM0Voc0tEMlJsWm1GMWJIUmZabWw0WldRMk5CaEVJQUVvQmpvQ05EZ1NIQW9RWkdWbVlYVnMiLCANCisgICAgICAgICAgICAiZEY5elptbDRaV1F6TWhoRklBRW9Eem9DTkRrU0hRb1FaR1ZtWVhWc2RGOXpabWw0WldRMk5CaEdJQUVvIiwgDQorICAgICAgICAgICAgIkVEb0RMVFV3RWhzS0RXUmxabUYxYkhSZlpteHZZWFFZUnlBQktBSTZCRFV4TGpVU0hRb09aR1ZtWVhWcyIsIA0KKyAgICAgICAgICAgICJkRjlrYjNWaWJHVVlTQ0FCS0FFNkJUVXlNREF3RWhvS0RHUmxabUYxYkhSZlltOXZiQmhKSUFFb0NEb0UiLCANCisgICAgICAgICAgICAiZEhKMVpSSWRDZzVrWldaaGRXeDBYM04wY21sdVp4aEtJQUVvQ1RvRmFHVnNiRzhTSEFvTlpHVm1ZWFZzIiwgDQorICAgICAgICAgICAgImRGOWllWFJsY3hoTElBRW9ERG9GZDI5eWJHUVNUQW9UWkdWbVlYVnNkRjl1WlhOMFpXUmZaVzUxYlJoUiIsIA0KKyAgICAgICAgICAgICJJQUVvRGpJcUxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JCYkd4VWVYQmxjeTVPWlhOMFpXUkYiLCANCisgICAgICAgICAgICAiYm5WdE9nTkNRVklTU1FvVVpHVm1ZWFZzZEY5bWIzSmxhV2R1WDJWdWRXMFlVaUFCS0E0eUhpNXdjbTkwIiwgDQorICAgICAgICAgICAgImIySjFabDkxYm1sMGRHVnpkQzVHYjNKbGFXZHVSVzUxYlRvTFJrOVNSVWxIVGw5Q1FWSVNUUW9UWkdWbSIsIA0KKyAgICAgICAgICAgICJZWFZzZEY5cGJYQnZjblJmWlc1MWJSaFRJQUVvRGpJa0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMFgybHQiLCANCisgICAgICAgICAgICAiY0c5eWRDNUpiWEJ2Y25SRmJuVnRPZ3BKVFZCUFVsUmZRa0ZTRWlVS0ZHUmxabUYxYkhSZmMzUnlhVzVuIiwgDQorICAgICAgICAgICAgIlgzQnBaV05sR0ZRZ0FTZ0pPZ05oWW1OQ0FnZ0NFaDBLREdSbFptRjFiSFJmWTI5eVpCaFZJQUVvQ1RvRCIsIA0KKyAgICAgICAgICAgICJNVEl6UWdJSUFSb2JDZzFPWlhOMFpXUk5aWE56WVdkbEVnb0tBbUppR0FFZ0FTZ0ZHaG9LRFU5d2RHbHYiLCANCisgICAgICAgICAgICAiYm1Gc1IzSnZkWEFTQ1FvQllSZ1JJQUVvQlJvYUNnMVNaWEJsWVhSbFpFZHliM1Z3RWdrS0FXRVlMeUFCIiwgDQorICAgICAgICAgICAgIktBVWlKd29LVG1WemRHVmtSVzUxYlJJSENnTkdUMDhRQVJJSENnTkNRVklRQWhJSENnTkNRVm9RQXlJMCIsIA0KKyAgICAgICAgICAgICJDaFJVWlhOMFJHVndjbVZqWVhSbFpFWnBaV3hrY3hJY0NoQmtaWEJ5WldOaGRHVmtYMmx1ZERNeUdBRWciLCANCisgICAgICAgICAgICAiQVNnRlFnSVlBU0liQ2c1R2IzSmxhV2R1VFdWemMyRm5aUklKQ2dGakdBRWdBU2dGSWgwS0VWUmxjM1JCIiwgDQorICAgICAgICAgICAgImJHeEZlSFJsYm5OcGIyNXpLZ2dJQVJDQWdJQ0FBaUlrQ2hkUGNIUnBiMjVoYkVkeWIzVndYMlY0ZEdWdSIsIA0KKyAgICAgICAgICAgICJjMmx2YmhJSkNnRmhHQkVnQVNnRklpUUtGMUpsY0dWaGRHVmtSM0p2ZFhCZlpYaDBaVzV6YVc5dUVna0siLCANCisgICAgICAgICAgICAiQVdFWUx5QUJLQVVpVUFvVFZHVnpkRTVsYzNSbFpFVjRkR1Z1YzJsdmJqSTVDZ1IwWlhOMEVpUXVjSEp2IiwgDQorICAgICAgICAgICAgImRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZNmdjZ0FTZ0pPZ1IwWlhOMCIsIA0KKyAgICAgICAgICAgICJJdFVGQ2d4VVpYTjBVbVZ4ZFdseVpXUVNDUW9CWVJnQklBSW9CUklPQ2daa2RXMXRlVElZQWlBQktBVVMiLCANCisgICAgICAgICAgICAiQ1FvQlloZ0RJQUlvQlJJT0NnWmtkVzF0ZVRRWUJDQUJLQVVTRGdvR1pIVnRiWGsxR0FVZ0FTZ0ZFZzRLIiwgDQorICAgICAgICAgICAgIkJtUjFiVzE1TmhnR0lBRW9CUklPQ2daa2RXMXRlVGNZQnlBQktBVVNEZ29HWkhWdGJYazRHQWdnQVNnRiIsIA0KKyAgICAgICAgICAgICJFZzRLQm1SMWJXMTVPUmdKSUFFb0JSSVBDZ2RrZFcxdGVURXdHQW9nQVNnRkVnOEtCMlIxYlcxNU1URVkiLCANCisgICAgICAgICAgICAiQ3lBQktBVVNEd29IWkhWdGJYa3hNaGdNSUFFb0JSSVBDZ2RrZFcxdGVURXpHQTBnQVNnRkVnOEtCMlIxIiwgDQorICAgICAgICAgICAgImJXMTVNVFFZRGlBQktBVVNEd29IWkhWdGJYa3hOUmdQSUFFb0JSSVBDZ2RrZFcxdGVURTJHQkFnQVNnRiIsIA0KKyAgICAgICAgICAgICJFZzhLQjJSMWJXMTVNVGNZRVNBQktBVVNEd29IWkhWdGJYa3hPQmdTSUFFb0JSSVBDZ2RrZFcxdGVURTUiLCANCisgICAgICAgICAgICAiR0JNZ0FTZ0ZFZzhLQjJSMWJXMTVNakFZRkNBQktBVVNEd29IWkhWdGJYa3lNUmdWSUFFb0JSSVBDZ2RrIiwgDQorICAgICAgICAgICAgImRXMXRlVEl5R0JZZ0FTZ0ZFZzhLQjJSMWJXMTVNak1ZRnlBQktBVVNEd29IWkhWdGJYa3lOQmdZSUFFbyIsIA0KKyAgICAgICAgICAgICJCUklQQ2dka2RXMXRlVEkxR0JrZ0FTZ0ZFZzhLQjJSMWJXMTVNallZR2lBQktBVVNEd29IWkhWdGJYa3kiLCANCisgICAgICAgICAgICAiTnhnYklBRW9CUklQQ2dka2RXMXRlVEk0R0J3Z0FTZ0ZFZzhLQjJSMWJXMTVNamtZSFNBQktBVVNEd29IIiwgDQorICAgICAgICAgICAgIlpIVnRiWGt6TUJnZUlBRW9CUklQQ2dka2RXMXRlVE14R0I4Z0FTZ0ZFZzhLQjJSMWJXMTVNeklZSUNBQiIsIA0KKyAgICAgICAgICAgICJLQVVTQ1FvQll4Z2hJQUlvQlRKV0NnWnphVzVuYkdVU0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVUiLCANCisgICAgICAgICAgICAiWlhOMFFXeHNSWGgwWlc1emFXOXVjeGpvQnlBQktBc3lIeTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVIiwgDQorICAgICAgICAgICAgIlpYTjBVbVZ4ZFdseVpXUXlWUW9GYlhWc2RHa1NKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMCIsIA0KKyAgICAgICAgICAgICJRV3hzUlhoMFpXNXphVzl1Y3hqcEJ5QURLQXN5SHk1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjAiLCANCisgICAgICAgICAgICAiVW1WeGRXbHlaV1FpbWdFS0UxUmxjM1JTWlhGMWFYSmxaRVp2Y21WcFoyNFNPUW9RYjNCMGFXOXVZV3hmIiwgDQorICAgICAgICAgICAgImJXVnpjMkZuWlJnQklBRW9DeklmTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUlNaWEYxYVhKbCIsIA0KKyAgICAgICAgICAgICJaQkk1Q2hCeVpYQmxZWFJsWkY5dFpYTnpZV2RsR0FJZ0F5Z0xNaDh1Y0hKdmRHOWlkV1pmZFc1cGRIUmwiLCANCisgICAgICAgICAgICAiYzNRdVZHVnpkRkpsY1hWcGNtVmtFZzBLQldSMWJXMTVHQU1nQVNnRklsb0tFVlJsYzNSR2IzSmxhV2R1IiwgDQorICAgICAgICAgICAgIlRtVnpkR1ZrRWtVS0RtWnZjbVZwWjI1ZmJtVnpkR1ZrR0FFZ0FTZ0xNaTB1Y0hKdmRHOWlkV1pmZFc1cCIsIA0KKyAgICAgICAgICAgICJkSFJsYzNRdVZHVnpkRUZzYkZSNWNHVnpMazVsYzNSbFpFMWxjM05oWjJVaUVnb1FWR1Z6ZEVWdGNIUjUiLCANCisgICAgICAgICAgICAiVFdWemMyRm5aU0lxQ2g1VVpYTjBSVzF3ZEhsTlpYTnpZV2RsVjJsMGFFVjRkR1Z1YzJsdmJuTXFDQWdCIiwgDQorICAgICAgICAgICAgIkVJQ0FnSUFDSWpjS0cxUmxjM1JOZFd4MGFYQnNaVVY0ZEdWdWMybHZibEpoYm1kbGN5b0VDQ29RS3lvRyIsIA0KKyAgICAgICAgICAgICJDSzhnRUpRaEtnb0lnSUFFRUlDQWdJQUNJalFLR0ZSbGMzUlNaV0ZzYkhsTVlYSm5aVlJoWjA1MWJXSmwiLCANCisgICAgICAgICAgICAiY2hJSkNnRmhHQUVnQVNnRkVnMEtBbUppR1AvLy8zOGdBU2dGSWxVS0ZGUmxjM1JTWldOMWNuTnBkbVZOIiwgDQorICAgICAgICAgICAgIlpYTnpZV2RsRWpJS0FXRVlBU0FCS0FzeUp5NXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wVW1WaiIsIA0KKyAgICAgICAgICAgICJkWEp6YVhabFRXVnpjMkZuWlJJSkNnRnBHQUlnQVNnRklrc0tGRlJsYzNSTmRYUjFZV3hTWldOMWNuTnAiLCANCisgICAgICAgICAgICAiYjI1QkVqTUtBbUppR0FFZ0FTZ0xNaWN1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFMTFkSFZoIiwgDQorICAgICAgICAgICAgImJGSmxZM1Z5YzJsdmJrSWlZZ29VVkdWemRFMTFkSFZoYkZKbFkzVnljMmx2YmtJU01nb0JZUmdCSUFFbyIsIA0KKyAgICAgICAgICAgICJDekluTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUk5kWFIxWVd4U1pXTjFjbk5wYjI1QkVoWUsiLCANCisgICAgICAgICAgICAiRG05d2RHbHZibUZzWDJsdWRETXlHQUlnQVNnRklyTUJDaEpVWlhOMFJIVndSbWxsYkdST2RXMWlaWElTIiwgDQorICAgICAgICAgICAgIkNRb0JZUmdCSUFFb0JSSTJDZ05tYjI4WUFpQUJLQW95S1M1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VSIsIA0KKyAgICAgICAgICAgICJaWE4wUkhWd1JtbGxiR1JPZFcxaVpYSXVSbTl2RWpZS0EySmhjaGdESUFFb0NqSXBMbkJ5YjNSdlluVm0iLCANCisgICAgICAgICAgICAiWDNWdWFYUjBaWE4wTGxSbGMzUkVkWEJHYVdWc1pFNTFiV0psY2k1Q1lYSWFFQW9EUm05dkVna0tBV0VZIiwgDQorICAgICAgICAgICAgIkFTQUJLQVVhRUFvRFFtRnlFZ2tLQVdFWUFTQUJLQVVpZ0FJS0dGUmxjM1JPWlhOMFpXUk5aWE56WVdkbCIsIA0KKyAgICAgICAgICAgICJTR0Z6UW1sMGN4SmFDaGR2Y0hScGIyNWhiRjl1WlhOMFpXUmZiV1Z6YzJGblpSZ0JJQUVvQ3pJNUxuQnkiLCANCisgICAgICAgICAgICAiYjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNST1pYTjBaV1JOWlhOellXZGxTR0Z6UW1sMGN5NU9aWE4wIiwgDQorICAgICAgICAgICAgIlpXUk5aWE56WVdkbEdvY0JDZzFPWlhOMFpXUk5aWE56WVdkbEVpUUtIRzVsYzNSbFpHMWxjM05oWjJWZiIsIA0KKyAgICAgICAgICAgICJjbVZ3WldGMFpXUmZhVzUwTXpJWUFTQURLQVVTVUFvbGJtVnpkR1ZrYldWemMyRm5aVjl5WlhCbFlYUmwiLCANCisgICAgICAgICAgICAiWkY5bWIzSmxhV2R1YldWemMyRm5aUmdDSUFNb0N6SWhMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMa1p2IiwgDQorICAgICAgICAgICAgImNtVnBaMjVOWlhOellXZGxJdVVEQ2hkVVpYTjBRMkZ0Wld4RFlYTmxSbWxsYkdST1lXMWxjeElXQ2c1USIsIA0KKyAgICAgICAgICAgICJjbWx0YVhScGRtVkdhV1ZzWkJnQklBRW9CUklUQ2d0VGRISnBibWRHYVdWc1pCZ0NJQUVvQ1JJeENnbEYiLCANCisgICAgICAgICAgICAiYm5WdFJtbGxiR1FZQXlBQktBNHlIaTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVHYjNKbGFXZHVSVzUxIiwgDQorICAgICAgICAgICAgImJSSTNDZ3hOWlhOellXZGxSbWxsYkdRWUJDQUJLQXN5SVM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1RyIsIA0KKyAgICAgICAgICAgICJiM0psYVdkdVRXVnpjMkZuWlJJY0NoQlRkSEpwYm1kUWFXVmpaVVpwWld4a0dBVWdBU2dKUWdJSUFoSVYiLCANCisgICAgICAgICAgICAiQ2dsRGIzSmtSbWxsYkdRWUJpQUJLQWxDQWdnQkVoNEtGbEpsY0dWaGRHVmtVSEpwYldsMGFYWmxSbWxsIiwgDQorICAgICAgICAgICAgImJHUVlCeUFES0FVU0d3b1RVbVZ3WldGMFpXUlRkSEpwYm1kR2FXVnNaQmdJSUFNb0NSSTVDaEZTWlhCbCIsIA0KKyAgICAgICAgICAgICJZWFJsWkVWdWRXMUdhV1ZzWkJnSklBTW9EakllTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGtadmNtVnAiLCANCisgICAgICAgICAgICAiWjI1RmJuVnRFajhLRkZKbGNHVmhkR1ZrVFdWemMyRm5aVVpwWld4a0dBb2dBeWdMTWlFdWNISnZkRzlpIiwgDQorICAgICAgICAgICAgImRXWmZkVzVwZEhSbGMzUXVSbTl5WldsbmJrMWxjM05oWjJVU0pBb1lVbVZ3WldGMFpXUlRkSEpwYm1kUSIsIA0KKyAgICAgICAgICAgICJhV1ZqWlVacFpXeGtHQXNnQXlnSlFnSUlBaElkQ2hGU1pYQmxZWFJsWkVOdmNtUkdhV1ZzWkJnTUlBTW8iLCANCisgICAgICAgICAgICAiQ1VJQ0NBRWlWUW9TVkdWemRFWnBaV3hrVDNKa1pYSnBibWR6RWhFS0NXMTVYM04wY21sdVp4Z0xJQUVvIiwgDQorICAgICAgICAgICAgIkNSSU9DZ1p0ZVY5cGJuUVlBU0FCS0FNU0VBb0liWGxmWm14dllYUVlaU0FCS0FJcUJBZ0NFQXNxQkFnTSIsIA0KKyAgICAgICAgICAgICJFR1Vpb3dVS0dGUmxjM1JGZUhSeVpXMWxSR1ZtWVhWc2RGWmhiSFZsY3hJL0NnMWxjMk5oY0dWa1gySjUiLCANCisgICAgICAgICAgICAiZEdWekdBRWdBU2dNT2loY01EQXdYREF3TVZ3d01EZGNNREV3WERBeE5GeHVYSEpjZEZ3d01UTmNYRnduIiwgDQorICAgICAgICAgICAgIlhDSmNNemMyRWlBS0RHeGhjbWRsWDNWcGJuUXpNaGdDSUFFb0RUb0tOREk1TkRrMk56STVOUklxQ2d4cyIsIA0KKyAgICAgICAgICAgICJZWEpuWlY5MWFXNTBOalFZQXlBQktBUTZGREU0TkRRMk56UTBNRGN6TnpBNU5UVXhOakUxRWlBS0MzTnQiLCANCisgICAgICAgICAgICAiWVd4c1gybHVkRE15R0FRZ0FTZ0ZPZ3N0TWpFME56UTRNelkwTnhJcENndHpiV0ZzYkY5cGJuUTJOQmdGIiwgDQorICAgICAgICAgICAgIklBRW9Bem9VTFRreU1qTXpOekl3TXpZNE5UUTNOelU0TURjU0dBb0xkWFJtT0Y5emRISnBibWNZQmlBQiIsIA0KKyAgICAgICAgICAgICJLQWs2QStHSXRCSVZDZ3A2WlhKdlgyWnNiMkYwR0FjZ0FTZ0NPZ0V3RWhRS0NXOXVaVjltYkc5aGRCZ0kiLCANCisgICAgICAgICAgICAiSUFFb0Fqb0JNUklZQ2d0emJXRnNiRjltYkc5aGRCZ0pJQUVvQWpvRE1TNDFFaDRLRW01bFoyRjBhWFpsIiwgDQorICAgICAgICAgICAgIlgyOXVaVjltYkc5aGRCZ0tJQUVvQWpvQ0xURVNIQW9PYm1WbllYUnBkbVZmWm14dllYUVlDeUFCS0FJNiIsIA0KKyAgICAgICAgICAgICJCQzB4TGpVU0d3b0xiR0Z5WjJWZlpteHZZWFFZRENBQktBSTZCakpsS3pBd09CSWxDaFJ6YldGc2JGOXUiLCANCisgICAgICAgICAgICAiWldkaGRHbDJaVjltYkc5aGRCZ05JQUVvQWpvSExUaGxMVEF5T0JJWENncHBibVpmWkc5MVlteGxHQTRnIiwgDQorICAgICAgICAgICAgIkFTZ0JPZ05wYm1ZU0hBb09ibVZuWDJsdVpsOWtiM1ZpYkdVWUR5QUJLQUU2QkMxcGJtWVNGd29LYm1GdSIsIA0KKyAgICAgICAgICAgICJYMlJ2ZFdKc1pSZ1FJQUVvQVRvRGJtRnVFaFlLQ1dsdVpsOW1iRzloZEJnUklBRW9Bam9EYVc1bUVoc0siLCANCisgICAgICAgICAgICAiRFc1bFoxOXBibVpmWm14dllYUVlFaUFCS0FJNkJDMXBibVlTRmdvSmJtRnVYMlpzYjJGMEdCTWdBU2dDIiwgDQorICAgICAgICAgICAgIk9nTnVZVzRTS3dvTVkzQndYM1J5YVdkeVlYQm9HQlFnQVNnSk9oVS9JRDhnUHo4Z1B6OGdQejgvSUQ4LyIsIA0KKyAgICAgICAgICAgICJMeUEvUHkwaVN3b1JVM0JoY25ObFJXNTFiVTFsYzNOaFoyVVNOZ29MYzNCaGNuTmxYMlZ1ZFcwWUFTQUIiLCANCisgICAgICAgICAgICAiS0E0eUlTNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wVTNCaGNuTmxSVzUxYlNJWkNnbFBibVZUIiwgDQorICAgICAgICAgICAgImRISnBibWNTREFvRVpHRjBZUmdCSUFFb0NTSVlDZ2hQYm1WQ2VYUmxjeElNQ2dSa1lYUmhHQUVnQVNnTSIsIA0KKyAgICAgICAgICAgICJJcW9EQ2c5VVpYTjBVR0ZqYTJWa1ZIbHdaWE1TR0FvTWNHRmphMlZrWDJsdWRETXlHRm9nQXlnRlFnSVEiLCANCisgICAgICAgICAgICAiQVJJWUNneHdZV05yWldSZmFXNTBOalFZV3lBREtBTkNBaEFCRWhrS0RYQmhZMnRsWkY5MWFXNTBNeklZIiwgDQorICAgICAgICAgICAgIlhDQURLQTFDQWhBQkVoa0tEWEJoWTJ0bFpGOTFhVzUwTmpRWVhTQURLQVJDQWhBQkVoa0tEWEJoWTJ0bCIsIA0KKyAgICAgICAgICAgICJaRjl6YVc1ME16SVlYaUFES0JGQ0FoQUJFaGtLRFhCaFkydGxaRjl6YVc1ME5qUVlYeUFES0JKQ0FoQUIiLCANCisgICAgICAgICAgICAiRWhvS0RuQmhZMnRsWkY5bWFYaGxaRE15R0dBZ0F5Z0hRZ0lRQVJJYUNnNXdZV05yWldSZlptbDRaV1EyIiwgDQorICAgICAgICAgICAgIk5CaGhJQU1vQmtJQ0VBRVNHd29QY0dGamEyVmtYM05tYVhobFpETXlHR0lnQXlnUFFnSVFBUkliQ2c5dyIsIA0KKyAgICAgICAgICAgICJZV05yWldSZmMyWnBlR1ZrTmpRWVl5QURLQkJDQWhBQkVoZ0tESEJoWTJ0bFpGOW1iRzloZEJoa0lBTW8iLCANCisgICAgICAgICAgICAiQWtJQ0VBRVNHUW9OY0dGamEyVmtYMlJ2ZFdKc1pSaGxJQU1vQVVJQ0VBRVNGd29MY0dGamEyVmtYMkp2IiwgDQorICAgICAgICAgICAgImIyd1laaUFES0FoQ0FoQUJFamNLQzNCaFkydGxaRjlsYm5WdEdHY2dBeWdPTWg0dWNISnZkRzlpZFdaZiIsIA0KKyAgICAgICAgICAgICJkVzVwZEhSbGMzUXVSbTl5WldsbmJrVnVkVzFDQWhBQklzZ0RDaEZVWlhOMFZXNXdZV05yWldSVWVYQmwiLCANCisgICAgICAgICAgICAiY3hJYUNnNTFibkJoWTJ0bFpGOXBiblF6TWhoYUlBTW9CVUlDRUFBU0dnb09kVzV3WVdOclpXUmZhVzUwIiwgDQorICAgICAgICAgICAgIk5qUVlXeUFES0FOQ0FoQUFFaHNLRDNWdWNHRmphMlZrWDNWcGJuUXpNaGhjSUFNb0RVSUNFQUFTR3dvUCIsIA0KKyAgICAgICAgICAgICJkVzV3WVdOclpXUmZkV2x1ZERZMEdGMGdBeWdFUWdJUUFCSWJDZzkxYm5CaFkydGxaRjl6YVc1ME16SVkiLCANCisgICAgICAgICAgICAiWGlBREtCRkNBaEFBRWhzS0QzVnVjR0ZqYTJWa1gzTnBiblEyTkJoZklBTW9Fa0lDRUFBU0hBb1FkVzV3IiwgDQorICAgICAgICAgICAgIllXTnJaV1JmWm1sNFpXUXpNaGhnSUFNb0IwSUNFQUFTSEFvUWRXNXdZV05yWldSZlptbDRaV1EyTkJoaCIsIA0KKyAgICAgICAgICAgICJJQU1vQmtJQ0VBQVNIUW9SZFc1d1lXTnJaV1JmYzJacGVHVmtNeklZWWlBREtBOUNBaEFBRWgwS0VYVnUiLCANCisgICAgICAgICAgICAiY0dGamEyVmtYM05tYVhobFpEWTBHR01nQXlnUVFnSVFBQklhQ2c1MWJuQmhZMnRsWkY5bWJHOWhkQmhrIiwgDQorICAgICAgICAgICAgIklBTW9Ba0lDRUFBU0d3b1BkVzV3WVdOclpXUmZaRzkxWW14bEdHVWdBeWdCUWdJUUFCSVpDZzExYm5CaCIsIA0KKyAgICAgICAgICAgICJZMnRsWkY5aWIyOXNHR1lnQXlnSVFnSVFBQkk1Q2cxMWJuQmhZMnRsWkY5bGJuVnRHR2NnQXlnT01oNHUiLCANCisgICAgICAgICAgICAiY0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1Um05eVpXbG5ia1Z1ZFcxQ0FoQUFJaUFLRkZSbGMzUlFZV05yIiwgDQorICAgICAgICAgICAgIlpXUkZlSFJsYm5OcGIyNXpLZ2dJQVJDQWdJQ0FBaUtaQkFvVlZHVnpkRVI1Ym1GdGFXTkZlSFJsYm5OcCIsIA0KKyAgICAgICAgICAgICJiMjV6RWhrS0VITmpZV3hoY2w5bGVIUmxibk5wYjI0WTBBOGdBU2dIRWpjS0RtVnVkVzFmWlhoMFpXNXoiLCANCisgICAgICAgICAgICAiYVc5dUdORVBJQUVvRGpJZUxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExrWnZjbVZwWjI1RmJuVnRFbGtLIiwgDQorICAgICAgICAgICAgIkZtUjVibUZ0YVdOZlpXNTFiVjlsZUhSbGJuTnBiMjRZMGc4Z0FTZ09Namd1Y0hKdmRHOWlkV1pmZFc1cCIsIA0KKyAgICAgICAgICAgICJkSFJsYzNRdVZHVnpkRVI1Ym1GdGFXTkZlSFJsYm5OcGIyNXpMa1I1Ym1GdGFXTkZiblZ0Vkhsd1pSSTkiLCANCisgICAgICAgICAgICAiQ2hGdFpYTnpZV2RsWDJWNGRHVnVjMmx2YmhqVER5QUJLQXN5SVM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6IiwgDQorICAgICAgICAgICAgImRDNUdiM0psYVdkdVRXVnpjMkZuWlJKZkNobGtlVzVoYldsalgyMWxjM05oWjJWZlpYaDBaVzV6YVc5dSIsIA0KKyAgICAgICAgICAgICJHTlFQSUFFb0N6STdMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSRWVXNWhiV2xqUlhoMFpXNXoiLCANCisgICAgICAgICAgICAiYVc5dWN5NUVlVzVoYldsalRXVnpjMkZuWlZSNWNHVVNHd29TY21Wd1pXRjBaV1JmWlhoMFpXNXphVzl1IiwgDQorICAgICAgICAgICAgIkdOVVBJQU1vQ1JJZENoQndZV05yWldSZlpYaDBaVzV6YVc5dUdOWVBJQU1vRVVJQ0VBRWFMQW9TUkhsdSIsIA0KKyAgICAgICAgICAgICJZVzFwWTAxbGMzTmhaMlZVZVhCbEVoWUtEV1I1Ym1GdGFXTmZabWxsYkdRWXRCQWdBU2dGSWtjS0QwUjUiLCANCisgICAgICAgICAgICAiYm1GdGFXTkZiblZ0Vkhsd1pSSVFDZ3RFV1U1QlRVbERYMFpQVHhDWUVSSVFDZ3RFV1U1QlRVbERYMEpCIiwgDQorICAgICAgICAgICAgIlVoQ1pFUklRQ2d0RVdVNUJUVWxEWDBKQldoQ2FFU0xBQVFvalZHVnpkRkpsY0dWaGRHVmtVMk5oYkdGeSIsIA0KKyAgICAgICAgICAgICJSR2xtWm1WeVpXNTBWR0ZuVTJsNlpYTVNHQW9RY21Wd1pXRjBaV1JmWm1sNFpXUXpNaGdNSUFNb0J4SVciLCANCisgICAgICAgICAgICAiQ2c1eVpYQmxZWFJsWkY5cGJuUXpNaGdOSUFNb0JSSVpDaEJ5WlhCbFlYUmxaRjltYVhobFpEWTBHUDRQIiwgDQorICAgICAgICAgICAgIklBTW9CaElYQ2c1eVpYQmxZWFJsWkY5cGJuUTJOQmovRHlBREtBTVNHQW9PY21Wd1pXRjBaV1JmWm14diIsIA0KKyAgICAgICAgICAgICJZWFFZL3Y4UElBTW9BaElaQ2c5eVpYQmxZWFJsWkY5MWFXNTBOalFZLy84UElBTW9CQ0lNQ2dwR2IyOVMiLCANCisgICAgICAgICAgICAiWlhGMVpYTjBJZzBLQzBadmIxSmxjM0J2Ym5ObElnd0tDa0poY2xKbGNYVmxjM1FpRFFvTFFtRnlVbVZ6IiwgDQorICAgICAgICAgICAgImNHOXVjMlVxUUFvTFJtOXlaV2xuYmtWdWRXMFNEd29MUms5U1JVbEhUbDlHVDA4UUJCSVBDZ3RHVDFKRiIsIA0KKyAgICAgICAgICAgICJTVWRPWDBKQlVoQUZFZzhLQzBaUFVrVkpSMDVmUWtGYUVBWXFSd29VVkdWemRFVnVkVzFYYVhSb1JIVnciLCANCisgICAgICAgICAgICAiVm1Gc2RXVVNDQW9FUms5UE1SQUJFZ2dLQkVKQlVqRVFBaElIQ2dOQ1FWb1FBeElJQ2dSR1QwOHlFQUVTIiwgDQorICAgICAgICAgICAgIkNBb0VRa0ZTTWhBQ0tva0JDZzVVWlhOMFUzQmhjbk5sUlc1MWJSSU1DZ2hUVUVGU1UwVmZRUkI3RWc0SyIsIA0KKyAgICAgICAgICAgICJDRk5RUVZKVFJWOUNFS2JuQXhJUENnaFRVRUZTVTBWZlF4Q3lzWUFHRWhVS0NGTlFRVkpUUlY5RUVQSC8iLCANCisgICAgICAgICAgICAiLy8vLy8vLy8vd0VTRlFvSVUxQkJVbE5GWDBVUXRONzgvLy8vLy8vL0FSSU1DZ2hUVUVGU1UwVmZSaEFBIiwgDQorICAgICAgICAgICAgIkVnd0tDRk5RUVZKVFJWOUhFQUl5bVFFS0MxUmxjM1JUWlhKMmFXTmxFa1FLQTBadmJ4SWRMbkJ5YjNSdiIsIA0KKyAgICAgICAgICAgICJZblZtWDNWdWFYUjBaWE4wTGtadmIxSmxjWFZsYzNRYUhpNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNUciLCANCisgICAgICAgICAgICAiYjI5U1pYTndiMjV6WlJKRUNnTkNZWElTSFM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1Q1lYSlNaWEYxIiwgDQorICAgICAgICAgICAgIlpYTjBHaDR1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1UW1GeVVtVnpjRzl1YzJVNlJnb1liM0IwYVc5dSIsIA0KKyAgICAgICAgICAgICJZV3hmYVc1ME16SmZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnMiLCANCisgICAgICAgICAgICAiYkVWNGRHVnVjMmx2Ym5NWUFTQUJLQVU2UmdvWWIzQjBhVzl1WVd4ZmFXNTBOalJmWlhoMFpXNXphVzl1IiwgDQorICAgICAgICAgICAgIkVpUXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlBaUFCS0FNNiIsIA0KKyAgICAgICAgICAgICJSd29aYjNCMGFXOXVZV3hmZFdsdWRETXlYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjAiLCANCisgICAgICAgICAgICAiWlhOMExsUmxjM1JCYkd4RmVIUmxibk5wYjI1ekdBTWdBU2dOT2tjS0dXOXdkR2x2Ym1Gc1gzVnBiblEyIiwgDQorICAgICAgICAgICAgIk5GOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1eiIsIA0KKyAgICAgICAgICAgICJhVzl1Y3hnRUlBRW9CRHBIQ2hsdmNIUnBiMjVoYkY5emFXNTBNekpmWlhoMFpXNXphVzl1RWlRdWNISnYiLCANCisgICAgICAgICAgICAiZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlCU0FCS0JFNlJ3b1piM0IwIiwgDQorICAgICAgICAgICAgImFXOXVZV3hmYzJsdWREWTBYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbCIsIA0KKyAgICAgICAgICAgICJjM1JCYkd4RmVIUmxibk5wYjI1ekdBWWdBU2dTT2tnS0dtOXdkR2x2Ym1Gc1gyWnBlR1ZrTXpKZlpYaDAiLCANCisgICAgICAgICAgICAiWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZIiwgDQorICAgICAgICAgICAgIkJ5QUJLQWM2U0FvYWIzQjBhVzl1WVd4ZlptbDRaV1EyTkY5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMSIsIA0KKyAgICAgICAgICAgICJabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1emFXOXVjeGdJSUFFb0JqcEpDaHR2Y0hScGIyNWgiLCANCisgICAgICAgICAgICAiYkY5elptbDRaV1F6TWw5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wIiwgDQorICAgICAgICAgICAgIlFXeHNSWGgwWlc1emFXOXVjeGdKSUFFb0R6cEpDaHR2Y0hScGIyNWhiRjl6Wm1sNFpXUTJORjlsZUhSbCIsIA0KKyAgICAgICAgICAgICJibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVd4c1JYaDBaVzV6YVc5dWN4Z0siLCANCisgICAgICAgICAgICAiSUFFb0VEcEdDaGh2Y0hScGIyNWhiRjltYkc5aGRGOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxIiwgDQorICAgICAgICAgICAgImJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMFpXNXphVzl1Y3hnTElBRW9BanBIQ2hsdmNIUnBiMjVoYkY5ayIsIA0KKyAgICAgICAgICAgICJiM1ZpYkdWZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjQiLCANCisgICAgICAgICAgICAiZEdWdWMybHZibk1ZRENBQktBRTZSUW9YYjNCMGFXOXVZV3hmWW05dmJGOWxlSFJsYm5OcGIyNFNKQzV3IiwgDQorICAgICAgICAgICAgImNtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMFpXNXphVzl1Y3hnTklBRW9DRHBIQ2hsdiIsIA0KKyAgICAgICAgICAgICJjSFJwYjI1aGJGOXpkSEpwYm1kZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXUiLCANCisgICAgICAgICAgICAiVkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZRGlBQktBazZSZ29ZYjNCMGFXOXVZV3hmWW5sMFpYTmZaWGgwIiwgDQorICAgICAgICAgICAgIlpXNXphVzl1RWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWSIsIA0KKyAgICAgICAgICAgICJEeUFCS0F3NmNRb1hiM0IwYVc5dVlXeG5jbTkxY0Y5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTEiLCANCisgICAgICAgICAgICAiYm1sMGRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1emFXOXVjeGdRSUFFb0NqSXFMbkJ5YjNSdlluVm1YM1Z1IiwgDQorICAgICAgICAgICAgImFYUjBaWE4wTGs5d2RHbHZibUZzUjNKdmRYQmZaWGgwWlc1emFXOXVPbjRLSVc5d2RHbHZibUZzWDI1bCIsIA0KKyAgICAgICAgICAgICJjM1JsWkY5dFpYTnpZV2RsWDJWNGRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmwiLCANCisgICAgICAgICAgICAiYzNSQmJHeEZlSFJsYm5OcGIyNXpHQklnQVNnTE1pMHVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6IiwgDQorICAgICAgICAgICAgImRFRnNiRlI1Y0dWekxrNWxjM1JsWkUxbGMzTmhaMlU2Y3dvaWIzQjBhVzl1WVd4ZlptOXlaV2xuYmw5dCIsIA0KKyAgICAgICAgICAgICJaWE56WVdkbFgyVjRkR1Z1YzJsdmJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEYiLCANCisgICAgICAgICAgICAiZUhSbGJuTnBiMjV6R0JNZ0FTZ0xNaUV1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1Um05eVpXbG5iazFsIiwgDQorICAgICAgICAgICAgImMzTmhaMlU2ZUFvaGIzQjBhVzl1WVd4ZmFXMXdiM0owWDIxbGMzTmhaMlZmWlhoMFpXNXphVzl1RWlRdSIsIA0KKyAgICAgICAgICAgICJjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlGQ0FCS0FzeUp5NXciLCANCisgICAgICAgICAgICAiY205MGIySjFabDkxYm1sMGRHVnpkRjlwYlhCdmNuUXVTVzF3YjNKMFRXVnpjMkZuWlRwNENoNXZjSFJwIiwgDQorICAgICAgICAgICAgImIyNWhiRjl1WlhOMFpXUmZaVzUxYlY5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWeiIsIA0KKyAgICAgICAgICAgICJkQzVVWlhOMFFXeHNSWGgwWlc1emFXOXVjeGdWSUFFb0RqSXFMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjAiLCANCisgICAgICAgICAgICAiTGxSbGMzUkJiR3hVZVhCbGN5NU9aWE4wWldSRmJuVnRPbTBLSDI5d2RHbHZibUZzWDJadmNtVnBaMjVmIiwgDQorICAgICAgICAgICAgIlpXNTFiVjlsZUhSbGJuTnBiMjRTSkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMCIsIA0KKyAgICAgICAgICAgICJaVzV6YVc5dWN4Z1dJQUVvRGpJZUxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExrWnZjbVZwWjI1RmJuVnQiLCANCisgICAgICAgICAgICAiT25JS0htOXdkR2x2Ym1Gc1gybHRjRzl5ZEY5bGJuVnRYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtIiwgDQorICAgICAgICAgICAgIlgzVnVhWFIwWlhOMExsUmxjM1JCYkd4RmVIUmxibk5wYjI1ekdCY2dBU2dPTWlRdWNISnZkRzlpZFdaZiIsIA0KKyAgICAgICAgICAgICJkVzVwZEhSbGMzUmZhVzF3YjNKMExrbHRjRzl5ZEVWdWRXMDZVUW9mYjNCMGFXOXVZV3hmYzNSeWFXNW4iLCANCisgICAgICAgICAgICAiWDNCcFpXTmxYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGIiwgDQorICAgICAgICAgICAgImVIUmxibk5wYjI1ekdCZ2dBU2dKUWdJSUFqcEpDaGR2Y0hScGIyNWhiRjlqYjNKa1gyVjRkR1Z1YzJsdiIsIA0KKyAgICAgICAgICAgICJiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6R0JrZ0FTZ0oiLCANCisgICAgICAgICAgICAiUWdJSUFUcEdDaGh5WlhCbFlYUmxaRjlwYm5Rek1sOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxIiwgDQorICAgICAgICAgICAgImJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMFpXNXphVzl1Y3hnZklBTW9CVHBHQ2hoeVpYQmxZWFJsWkY5cCIsIA0KKyAgICAgICAgICAgICJiblEyTkY5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVd4c1JYaDAiLCANCisgICAgICAgICAgICAiWlc1emFXOXVjeGdnSUFNb0F6cEhDaGx5WlhCbFlYUmxaRjkxYVc1ME16SmZaWGgwWlc1emFXOXVFaVF1IiwgDQorICAgICAgICAgICAgImNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWUlTQURLQTA2UndvWiIsIA0KKyAgICAgICAgICAgICJjbVZ3WldGMFpXUmZkV2x1ZERZMFgyVjRkR1Z1YzJsdmJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjAiLCANCisgICAgICAgICAgICAiTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6R0NJZ0F5Z0VPa2NLR1hKbGNHVmhkR1ZrWDNOcGJuUXpNbDlsIiwgDQorICAgICAgICAgICAgImVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVd4c1JYaDBaVzV6YVc5dSIsIA0KKyAgICAgICAgICAgICJjeGdqSUFNb0VUcEhDaGx5WlhCbFlYUmxaRjl6YVc1ME5qUmZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWkiLCANCisgICAgICAgICAgICAiZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWUpDQURLQkk2U0FvYWNtVndaV0YwIiwgDQorICAgICAgICAgICAgIlpXUmZabWw0WldRek1sOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMCIsIA0KKyAgICAgICAgICAgICJRV3hzUlhoMFpXNXphVzl1Y3hnbElBTW9CenBJQ2hweVpYQmxZWFJsWkY5bWFYaGxaRFkwWDJWNGRHVnUiLCANCisgICAgICAgICAgICAiYzJsdmJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHQ1lnIiwgDQorICAgICAgICAgICAgIkF5Z0dPa2tLRzNKbGNHVmhkR1ZrWDNObWFYaGxaRE15WDJWNGRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbSIsIA0KKyAgICAgICAgICAgICJYM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHQ2NnQXlnUE9ra0tHM0psY0dWaGRHVmsiLCANCisgICAgICAgICAgICAiWDNObWFYaGxaRFkwWDJWNGRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JCIiwgDQorICAgICAgICAgICAgImJHeEZlSFJsYm5OcGIyNXpHQ2dnQXlnUU9rWUtHSEpsY0dWaGRHVmtYMlpzYjJGMFgyVjRkR1Z1YzJsdiIsIA0KKyAgICAgICAgICAgICJiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6R0NrZ0F5Z0MiLCANCisgICAgICAgICAgICAiT2tjS0dYSmxjR1ZoZEdWa1gyUnZkV0pzWlY5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwIiwgDQorICAgICAgICAgICAgImRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1emFXOXVjeGdxSUFNb0FUcEZDaGR5WlhCbFlYUmxaRjlpYjI5cyIsIA0KKyAgICAgICAgICAgICJYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnAiLCANCisgICAgICAgICAgICAiYjI1ekdDc2dBeWdJT2tjS0dYSmxjR1ZoZEdWa1gzTjBjbWx1WjE5bGVIUmxibk5wYjI0U0pDNXdjbTkwIiwgDQorICAgICAgICAgICAgImIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1emFXOXVjeGdzSUFNb0NUcEdDaGh5WlhCbCIsIA0KKyAgICAgICAgICAgICJZWFJsWkY5aWVYUmxjMTlsZUhSbGJuTnBiMjRTSkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjAiLCANCisgICAgICAgICAgICAiUVd4c1JYaDBaVzV6YVc5dWN4Z3RJQU1vRERweENoZHlaWEJsWVhSbFpHZHliM1Z3WDJWNGRHVnVjMmx2IiwgDQorICAgICAgICAgICAgImJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHQzRnQXlnSyIsIA0KKyAgICAgICAgICAgICJNaW91Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VW1Wd1pXRjBaV1JIY205MWNGOWxlSFJsYm5OcGIyNDYiLCANCisgICAgICAgICAgICAiZmdvaGNtVndaV0YwWldSZmJtVnpkR1ZrWDIxbGMzTmhaMlZmWlhoMFpXNXphVzl1RWlRdWNISnZkRzlpIiwgDQorICAgICAgICAgICAgImRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlNQ0FES0FzeUxTNXdjbTkwYjJKMSIsIA0KKyAgICAgICAgICAgICJabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNWSGx3WlhNdVRtVnpkR1ZrVFdWemMyRm5aVHB6Q2lKeVpYQmwiLCANCisgICAgICAgICAgICAiWVhSbFpGOW1iM0psYVdkdVgyMWxjM05oWjJWZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmZkVzVwIiwgDQorICAgICAgICAgICAgImRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZTVNBREtBc3lJUzV3Y205MGIySjFabDkxYm1sMCIsIA0KKyAgICAgICAgICAgICJkR1Z6ZEM1R2IzSmxhV2R1VFdWemMyRm5aVHA0Q2lGeVpYQmxZWFJsWkY5cGJYQnZjblJmYldWemMyRm4iLCANCisgICAgICAgICAgICAiWlY5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVd4c1JYaDBaVzV6IiwgDQorICAgICAgICAgICAgImFXOXVjeGd5SUFNb0N6SW5MbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBYMmx0Y0c5eWRDNUpiWEJ2Y25STiIsIA0KKyAgICAgICAgICAgICJaWE56WVdkbE9uZ0tIbkpsY0dWaGRHVmtYMjVsYzNSbFpGOWxiblZ0WDJWNGRHVnVjMmx2YmhJa0xuQnkiLCANCisgICAgICAgICAgICAiYjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHRE1nQXlnT01pb3VjSEp2IiwgDQorICAgICAgICAgICAgImRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRlI1Y0dWekxrNWxjM1JsWkVWdWRXMDZiUW9mY21WdyIsIA0KKyAgICAgICAgICAgICJaV0YwWldSZlptOXlaV2xuYmw5bGJuVnRYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjAiLCANCisgICAgICAgICAgICAiWlhOMExsUmxjM1JCYkd4RmVIUmxibk5wYjI1ekdEUWdBeWdPTWg0dWNISnZkRzlpZFdaZmRXNXBkSFJsIiwgDQorICAgICAgICAgICAgImMzUXVSbTl5WldsbmJrVnVkVzA2Y2dvZWNtVndaV0YwWldSZmFXMXdiM0owWDJWdWRXMWZaWGgwWlc1eiIsIA0KKyAgICAgICAgICAgICJhVzl1RWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWU5TQUQiLCANCisgICAgICAgICAgICAiS0E0eUpDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRGOXBiWEJ2Y25RdVNXMXdiM0owUlc1MWJUcFJDaDl5IiwgDQorICAgICAgICAgICAgIlpYQmxZWFJsWkY5emRISnBibWRmY0dsbFkyVmZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cCIsIA0KKyAgICAgICAgICAgICJkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWU5pQURLQWxDQWdnQ09ra0tGM0psY0dWaGRHVmsiLCANCisgICAgICAgICAgICAiWDJOdmNtUmZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0IiwgDQorICAgICAgICAgICAgImRHVnVjMmx2Ym5NWU55QURLQWxDQWdnQk9ra0tGMlJsWm1GMWJIUmZhVzUwTXpKZlpYaDBaVzV6YVc5dSIsIA0KKyAgICAgICAgICAgICJFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZUFNBQktBVTYiLCANCisgICAgICAgICAgICAiQWpReE9ra0tGMlJsWm1GMWJIUmZhVzUwTmpSZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmZkVzVwIiwgDQorICAgICAgICAgICAgImRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZUGlBQktBTTZBalF5T2tvS0dHUmxabUYxYkhSZiIsIA0KKyAgICAgICAgICAgICJkV2x1ZERNeVgyVjRkR1Z1YzJsdmJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEYiLCANCisgICAgICAgICAgICAiZUhSbGJuTnBiMjV6R0Q4Z0FTZ05PZ0kwTXpwS0NoaGtaV1poZFd4MFgzVnBiblEyTkY5bGVIUmxibk5wIiwgDQorICAgICAgICAgICAgImIyNFNKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1emFXOXVjeGhBSUFFbyIsIA0KKyAgICAgICAgICAgICJCRG9DTkRRNlN3b1laR1ZtWVhWc2RGOXphVzUwTXpKZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmYiLCANCisgICAgICAgICAgICAiZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZUVNBQktCRTZBeTAwTlRwS0NoaGtaV1poIiwgDQorICAgICAgICAgICAgImRXeDBYM05wYm5RMk5GOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMCIsIA0KKyAgICAgICAgICAgICJRV3hzUlhoMFpXNXphVzl1Y3hoQ0lBRW9Fam9DTkRZNlN3b1paR1ZtWVhWc2RGOW1hWGhsWkRNeVgyVjQiLCANCisgICAgICAgICAgICAiZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6IiwgDQorICAgICAgICAgICAgIkdFTWdBU2dIT2dJME56cExDaGxrWldaaGRXeDBYMlpwZUdWa05qUmZaWGgwWlc1emFXOXVFaVF1Y0hKdiIsIA0KKyAgICAgICAgICAgICJkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWVJDQUJLQVk2QWpRNE9rd0siLCANCisgICAgICAgICAgICAiR21SbFptRjFiSFJmYzJacGVHVmtNekpmWlhoMFpXNXphVzl1RWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsIiwgDQorICAgICAgICAgICAgImMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlSU0FCS0E4NkFqUTVPazBLR21SbFptRjFiSFJmYzJacCIsIA0KKyAgICAgICAgICAgICJlR1ZrTmpSZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjQiLCANCisgICAgICAgICAgICAiZEdWdWMybHZibk1ZUmlBQktCQTZBeTAxTURwTENoZGtaV1poZFd4MFgyWnNiMkYwWDJWNGRHVnVjMmx2IiwgDQorICAgICAgICAgICAgImJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHRWNnQVNnQyIsIA0KKyAgICAgICAgICAgICJPZ1ExTVM0MU9rMEtHR1JsWm1GMWJIUmZaRzkxWW14bFgyVjRkR1Z1YzJsdmJoSWtMbkJ5YjNSdlluVm0iLCANCisgICAgICAgICAgICAiWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6R0VnZ0FTZ0JPZ1UxTWpBd01EcEtDaFprIiwgDQorICAgICAgICAgICAgIlpXWmhkV3gwWDJKdmIyeGZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWeiIsIA0KKyAgICAgICAgICAgICJkRUZzYkVWNGRHVnVjMmx2Ym5NWVNTQUJLQWc2QkhSeWRXVTZUUW9ZWkdWbVlYVnNkRjl6ZEhKcGJtZGYiLCANCisgICAgICAgICAgICAiWlhoMFpXNXphVzl1RWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2IiwgDQorICAgICAgICAgICAgImJuTVlTaUFCS0FrNkJXaGxiR3h2T2t3S0YyUmxabUYxYkhSZllubDBaWE5mWlhoMFpXNXphVzl1RWlRdSIsIA0KKyAgICAgICAgICAgICJjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlTeUFCS0F3NkJYZHYiLCANCisgICAgICAgICAgICAiY214a09ud0tIV1JsWm1GMWJIUmZibVZ6ZEdWa1gyVnVkVzFmWlhoMFpXNXphVzl1RWlRdWNISnZkRzlpIiwgDQorICAgICAgICAgICAgImRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlVU0FCS0E0eUtpNXdjbTkwYjJKMSIsIA0KKyAgICAgICAgICAgICJabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNWSGx3WlhNdVRtVnpkR1ZrUlc1MWJUb0RRa0ZTT25rS0htUmwiLCANCisgICAgICAgICAgICAiWm1GMWJIUmZabTl5WldsbmJsOWxiblZ0WDJWNGRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbVgzVnVhWFIwIiwgDQorICAgICAgICAgICAgIlpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHRklnQVNnT01oNHVjSEp2ZEc5aWRXWmZkVzVwZEhSbCIsIA0KKyAgICAgICAgICAgICJjM1F1Um05eVpXbG5ia1Z1ZFcwNkMwWlBVa1ZKUjA1ZlFrRlNPbjBLSFdSbFptRjFiSFJmYVcxd2IzSjAiLCANCisgICAgICAgICAgICAiWDJWdWRXMWZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0IiwgDQorICAgICAgICAgICAgImRHVnVjMmx2Ym5NWVV5QUJLQTR5SkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEY5cGJYQnZjblF1U1cxdyIsIA0KKyAgICAgICAgICAgICJiM0owUlc1MWJUb0tTVTFRVDFKVVgwSkJVanBWQ2g1a1pXWmhkV3gwWDNOMGNtbHVaMTl3YVdWalpWOWwiLCANCisgICAgICAgICAgICAiZUhSbGJuTnBiMjRTSkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMFpXNXphVzl1IiwgDQorICAgICAgICAgICAgImN4aFVJQUVvQ1RvRFlXSmpRZ0lJQWpwTkNoWmtaV1poZFd4MFgyTnZjbVJmWlhoMFpXNXphVzl1RWlRdSIsIA0KKyAgICAgICAgICAgICJjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlWU0FCS0FrNkF6RXkiLCANCisgICAgICAgICAgICAiTTBJQ0NBRTZRZ29UYlhsZlpYaDBaVzV6YVc5dVgzTjBjbWx1WnhJbExuQnliM1J2WW5WbVgzVnVhWFIwIiwgDQorICAgICAgICAgICAgIlpYTjBMbFJsYzNSR2FXVnNaRTl5WkdWeWFXNW5jeGd5SUFFb0NUby9DaEJ0ZVY5bGVIUmxibk5wYjI1ZiIsIA0KKyAgICAgICAgICAgICJhVzUwRWlVdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRVpwWld4a1QzSmtaWEpwYm1kekdBVWciLCANCisgICAgICAgICAgICAiQVNnRk9rc0tGbkJoWTJ0bFpGOXBiblF6TWw5bGVIUmxibk5wYjI0U0p5NXdjbTkwYjJKMVpsOTFibWwwIiwgDQorICAgICAgICAgICAgImRHVnpkQzVVWlhOMFVHRmphMlZrUlhoMFpXNXphVzl1Y3hoYUlBTW9CVUlDRUFFNlN3b1djR0ZqYTJWayIsIA0KKyAgICAgICAgICAgICJYMmx1ZERZMFgyVjRkR1Z1YzJsdmJoSW5MbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSUVlXTnIiLCANCisgICAgICAgICAgICAiWldSRmVIUmxibk5wYjI1ekdGc2dBeWdEUWdJUUFUcE1DaGR3WVdOclpXUmZkV2x1ZERNeVgyVjRkR1Z1IiwgDQorICAgICAgICAgICAgImMybHZiaEluTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUlFZV05yWldSRmVIUmxibk5wYjI1eiIsIA0KKyAgICAgICAgICAgICJHRndnQXlnTlFnSVFBVHBNQ2hkd1lXTnJaV1JmZFdsdWREWTBYMlY0ZEdWdWMybHZiaEluTG5CeWIzUnYiLCANCisgICAgICAgICAgICAiWW5WbVgzVnVhWFIwWlhOMExsUmxjM1JRWVdOclpXUkZlSFJsYm5OcGIyNXpHRjBnQXlnRVFnSVFBVHBNIiwgDQorICAgICAgICAgICAgIkNoZHdZV05yWldSZmMybHVkRE15WDJWNGRHVnVjMmx2YmhJbkxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMCIsIA0KKyAgICAgICAgICAgICJMbFJsYzNSUVlXTnJaV1JGZUhSbGJuTnBiMjV6R0Y0Z0F5Z1JRZ0lRQVRwTUNoZHdZV05yWldSZmMybHUiLCANCisgICAgICAgICAgICAiZERZMFgyVjRkR1Z1YzJsdmJoSW5MbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSUVlXTnJaV1JGIiwgDQorICAgICAgICAgICAgImVIUmxibk5wYjI1ekdGOGdBeWdTUWdJUUFUcE5DaGh3WVdOclpXUmZabWw0WldRek1sOWxlSFJsYm5OcCIsIA0KKyAgICAgICAgICAgICJiMjRTSnk1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBVR0ZqYTJWa1JYaDBaVzV6YVc5dWN4aGciLCANCisgICAgICAgICAgICAiSUFNb0IwSUNFQUU2VFFvWWNHRmphMlZrWDJacGVHVmtOalJmWlhoMFpXNXphVzl1RWljdWNISnZkRzlpIiwgDQorICAgICAgICAgICAgImRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEZCaFkydGxaRVY0ZEdWdWMybHZibk1ZWVNBREtBWkNBaEFCT2s0SyIsIA0KKyAgICAgICAgICAgICJHWEJoWTJ0bFpGOXpabWw0WldRek1sOWxlSFJsYm5OcGIyNFNKeTV3Y205MGIySjFabDkxYm1sMGRHVnoiLCANCisgICAgICAgICAgICAiZEM1VVpYTjBVR0ZqYTJWa1JYaDBaVzV6YVc5dWN4aGlJQU1vRDBJQ0VBRTZUZ29aY0dGamEyVmtYM05tIiwgDQorICAgICAgICAgICAgImFYaGxaRFkwWDJWNGRHVnVjMmx2YmhJbkxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JRWVdOciIsIA0KKyAgICAgICAgICAgICJaV1JGZUhSbGJuTnBiMjV6R0dNZ0F5Z1FRZ0lRQVRwTENoWndZV05yWldSZlpteHZZWFJmWlhoMFpXNXoiLCANCisgICAgICAgICAgICAiYVc5dUVpY3VjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEZCaFkydGxaRVY0ZEdWdWMybHZibk1ZIiwgDQorICAgICAgICAgICAgIlpDQURLQUpDQWhBQk9rd0tGM0JoWTJ0bFpGOWtiM1ZpYkdWZlpYaDBaVzV6YVc5dUVpY3VjSEp2ZEc5aSIsIA0KKyAgICAgICAgICAgICJkV1pmZFc1cGRIUmxjM1F1VkdWemRGQmhZMnRsWkVWNGRHVnVjMmx2Ym5NWVpTQURLQUZDQWhBQk9rb0siLCANCisgICAgICAgICAgICAiRlhCaFkydGxaRjlpYjI5c1gyVjRkR1Z1YzJsdmJoSW5MbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsIiwgDQorICAgICAgICAgICAgImMzUlFZV05yWldSRmVIUmxibk5wYjI1ekdHWWdBeWdJUWdJUUFUcHFDaFZ3WVdOclpXUmZaVzUxYlY5bCIsIA0KKyAgICAgICAgICAgICJlSFJsYm5OcGIyNFNKeTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFVHRmphMlZrUlhoMFpXNXoiLCANCisgICAgICAgICAgICAiYVc5dWN4aG5JQU1vRGpJZUxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExrWnZjbVZwWjI1RmJuVnRRZ0lRIiwgDQorICAgICAgICAgICAgIkFVSlRRZzFWYm1sMGRHVnpkRkJ5YjNSdlNBR0FBUUdJQVFHUUFRSENQallLSVVkdmIyZHNaUzVRY205MCIsIA0KKyAgICAgICAgICAiYjJOdmJFSjFabVpsY25NdVZHVnpkRkJ5YjNSdmN4SVJWVzVwZEZSbGMzUlFjbTkwYjBacGJHVT0iKSk7DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciBhc3NpZ25lciA9IGRlbGVnYXRlKHBiZDo6RmlsZURlc2NyaXB0b3Igcm9vdCkgew0KKyAgICAgICAgZGVzY3JpcHRvciA9IHJvb3Q7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiT3B0aW9uYWxJbnQzMiIsICJPcHRpb25hbEludDY0IiwgIk9wdGlvbmFsVWludDMyIiwgIk9wdGlvbmFsVWludDY0IiwgIk9wdGlvbmFsU2ludDMyIiwgIk9wdGlvbmFsU2ludDY0IiwgIk9wdGlvbmFsRml4ZWQzMiIsICJPcHRpb25hbEZpeGVkNjQiLCAiT3B0aW9uYWxTZml4ZWQzMiIsICJPcHRpb25hbFNmaXhlZDY0IiwgIk9wdGlvbmFsRmxvYXQiLCAiT3B0aW9uYWxEb3VibGUiLCAiT3B0aW9uYWxCb29sIiwgIk9wdGlvbmFsU3RyaW5nIiwgIk9wdGlvbmFsQnl0ZXMiLCAiT3B0aW9uYWxHcm91cCIsICJPcHRpb25hbE5lc3RlZE1lc3NhZ2UiLCAiT3B0aW9uYWxGb3JlaWduTWVzc2FnZSIsICJPcHRpb25hbEltcG9ydE1lc3NhZ2UiLCAiT3B0aW9uYWxOZXN0ZWRFbnVtIiwgIk9wdGlvbmFsRm9yZWlnbkVudW0iLCAiT3B0aW9uYWxJbXBvcnRFbnVtIiwgIk9wdGlvbmFsU3RyaW5nUGllY2UiLCAiT3B0aW9uYWxDb3JkIiwgIlJlcGVhdGVkSW50MzIiLCAiUmVwZWF0ZWRJbnQ2NCIsICJSZXBlYXRlZFVpbnQzMiIsICJSZXBlYXRlZFVpbnQ2NCIsICJSZXBlYXRlZFNpbnQzMiIsICJSZXBlYXRlZFNpbnQ2NCIsICJSZXBlYXRlZEZpeGVkMzIiLCAiUmVwZWF0ZWRGaXhlZDY0IiwgIlJlcGVhdGVkU2ZpeGVkMzIiLCAiUmVwZWF0ZWRTZml4ZWQ2NCIsICJSZXBlYXRlZEZsb2F0IiwgIlJlcGVhdGVkRG91YmxlIiwgIlJlcGVhdGVkQm9vbCIsICJSZXBlYXRlZFN0cmluZyIsICJSZXBlYXRlZEJ5dGVzIiwgIlJlcGVhdGVkR3JvdXAiLCAiUmVwZWF0ZWROZXN0ZWRNZXNzYWdlIiwgIlJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UiLCAiUmVwZWF0ZWRJbXBvcnRNZXNzYWdlIiwgIlJlcGVhdGVkTmVzdGVkRW51bSIsICJSZXBlYXRlZEZvcmVpZ25FbnVtIiwgIlJlcGVhdGVkSW1wb3J0RW51bSIsICJSZXBlYXRlZFN0cmluZ1BpZWNlIiwgIlJlcGVhdGVkQ29yZCIsICJEZWZhdWx0SW50MzIiLCAiRGVmYXVsdEludDY0IiwgIkRlZmF1bHRVaW50MzIiLCAiRGVmYXVsdFVpbnQ2NCIsICJEZWZhdWx0U2ludDMyIiwgIkRlZmF1bHRTaW50NjQiLCAiRGVmYXVsdEZpeGVkMzIiLCAiRGVmYXVsdEZpeGVkNjQiLCAiRGVmYXVsdFNmaXhlZDMyIiwgIkRlZmF1bHRTZml4ZWQ2NCIsICJEZWZhdWx0RmxvYXQiLCAiRGVmYXVsdERvdWJsZSIsICJEZWZhdWx0Qm9vbCIsICJEZWZhdWx0U3RyaW5nIiwgIkRlZmF1bHRCeXRlcyIsICJEZWZhdWx0TmVzdGVkRW51bSIsICJEZWZhdWx0Rm9yZWlnbkVudW0iLCAiRGVmYXVsdEltcG9ydEVudW0iLCAiRGVmYXVsdFN0cmluZ1BpZWNlIiwgIkRlZmF1bHRDb3JkIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlX19EZXNjcmlwdG9yID0gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfX0Rlc2NyaXB0b3IuTmVzdGVkVHlwZXNbMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkJiIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwX19EZXNjcmlwdG9yID0gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfX0Rlc2NyaXB0b3IuTmVzdGVkVHlwZXNbMV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfT3B0aW9uYWxHcm91cF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkEiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXBfX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19fRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1syXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXBfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cC5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19SZXBlYXRlZEdyb3VwX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RGVwcmVjYXRlZEZpZWxkc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RGVwcmVjYXRlZEZpZWxkc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdERlcHJlY2F0ZWRGaWVsZHMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REZXByZWNhdGVkRmllbGRzLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdERlcHJlY2F0ZWRGaWVsZHNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJEZXByZWNhdGVkSW50MzIiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9yZWlnbk1lc3NhZ2VfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9yZWlnbk1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0ZvcmVpZ25NZXNzYWdlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQyIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsRXh0ZW5zaW9uc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzNdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzRdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT3B0aW9uYWxHcm91cF9leHRlbnNpb24sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT3B0aW9uYWxHcm91cF9leHRlbnNpb25fX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1JlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbNV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1JlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVwZWF0ZWRHcm91cF9leHRlbnNpb24uQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkEiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZEV4dGVuc2lvbl9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzZdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkRXh0ZW5zaW9uX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZEV4dGVuc2lvbl9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgfSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uLlRlc3QgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZEV4dGVuc2lvbi5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMF0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVxdWlyZWRfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s3XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkEiLCAiRHVtbXkyIiwgIkIiLCAiRHVtbXk0IiwgIkR1bW15NSIsICJEdW1teTYiLCAiRHVtbXk3IiwgIkR1bW15OCIsICJEdW1teTkiLCAiRHVtbXkxMCIsICJEdW1teTExIiwgIkR1bW15MTIiLCAiRHVtbXkxMyIsICJEdW1teTE0IiwgIkR1bW15MTUiLCAiRHVtbXkxNiIsICJEdW1teTE3IiwgIkR1bW15MTgiLCAiRHVtbXkxOSIsICJEdW1teTIwIiwgIkR1bW15MjEiLCAiRHVtbXkyMiIsICJEdW1teTIzIiwgIkR1bW15MjQiLCAiRHVtbXkyNSIsICJEdW1teTI2IiwgIkR1bW15MjciLCAiRHVtbXkyOCIsICJEdW1teTI5IiwgIkR1bW15MzAiLCAiRHVtbXkzMSIsICJEdW1teTMyIiwgIkMiLCB9KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5TaW5nbGUgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1swXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuTXVsdGkgPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1sxXSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZEZvcmVpZ25fX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s4XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkRm9yZWlnbl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkRm9yZWlnbiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkRm9yZWlnbi5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZEZvcmVpZ25fX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJPcHRpb25hbE1lc3NhZ2UiLCAiUmVwZWF0ZWRNZXNzYWdlIiwgIkR1bW15IiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGb3JlaWduTmVzdGVkX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbOV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGb3JlaWduTmVzdGVkX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0Rm9yZWlnbk5lc3RlZCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZvcmVpZ25OZXN0ZWQuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Rm9yZWlnbk5lc3RlZF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkZvcmVpZ25OZXN0ZWQiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtcHR5TWVzc2FnZV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzEwXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtcHR5TWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbXB0eU1lc3NhZ2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxMV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxMl07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXJfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxM107DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZWFsbHlMYXJnZVRhZ051bWJlcl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXJfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgIkJiIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZWN1cnNpdmVNZXNzYWdlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTRdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVjdXJzaXZlTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgIkkiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11dHVhbFJlY3Vyc2lvbkFfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxNV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25BX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkJiIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25CX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTZdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11dHVhbFJlY3Vyc2lvbkJfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgIk9wdGlvbmFsSW50MzIiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTddOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlciwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQSIsICJGb28iLCAiQmFyIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9Gb29fX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9fRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX0Zvb19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvbywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvby5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9Gb29fX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9CYXJfX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9fRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1sxXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX0Jhcl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhciwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhci5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9CYXJfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzE4XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIk9wdGlvbmFsTmVzdGVkTWVzc2FnZSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfTmVzdGVkTWVzc2FnZV9fRGVzY3JpcHRvciA9IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfTmVzdGVkTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzX05lc3RlZE1lc3NhZ2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMiIsICJOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Q2FtZWxDYXNlRmllbGROYW1lc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzE5XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RDYW1lbENhc2VGaWVsZE5hbWVzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0Q2FtZWxDYXNlRmllbGROYW1lcy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiUHJpbWl0aXZlRmllbGQiLCAiU3RyaW5nRmllbGQiLCAiRW51bUZpZWxkIiwgIk1lc3NhZ2VGaWVsZCIsICJTdHJpbmdQaWVjZUZpZWxkIiwgIkNvcmRGaWVsZCIsICJSZXBlYXRlZFByaW1pdGl2ZUZpZWxkIiwgIlJlcGVhdGVkU3RyaW5nRmllbGQiLCAiUmVwZWF0ZWRFbnVtRmllbGQiLCAiUmVwZWF0ZWRNZXNzYWdlRmllbGQiLCAiUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkIiwgIlJlcGVhdGVkQ29yZEZpZWxkIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGaWVsZE9yZGVyaW5nc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzIwXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEZpZWxkT3JkZXJpbmdzX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RmllbGRPcmRlcmluZ3MsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RGaWVsZE9yZGVyaW5ncy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGaWVsZE9yZGVyaW5nc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIk15U3RyaW5nIiwgIk15SW50IiwgIk15RmxvYXQiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMjFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRXNjYXBlZEJ5dGVzIiwgIkxhcmdlVWludDMyIiwgIkxhcmdlVWludDY0IiwgIlNtYWxsSW50MzIiLCAiU21hbGxJbnQ2NCIsICJVdGY4U3RyaW5nIiwgIlplcm9GbG9hdCIsICJPbmVGbG9hdCIsICJTbWFsbEZsb2F0IiwgIk5lZ2F0aXZlT25lRmxvYXQiLCAiTmVnYXRpdmVGbG9hdCIsICJMYXJnZUZsb2F0IiwgIlNtYWxsTmVnYXRpdmVGbG9hdCIsICJJbmZEb3VibGUiLCAiTmVnSW5mRG91YmxlIiwgIk5hbkRvdWJsZSIsICJJbmZGbG9hdCIsICJOZWdJbmZGbG9hdCIsICJOYW5GbG9hdCIsICJDcHBUcmlncmFwaCIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9TcGFyc2VFbnVtTWVzc2FnZV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzIyXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfU3BhcnNlRW51bU1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwYXJzZUVudW1NZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGFyc2VFbnVtTWVzc2FnZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NwYXJzZUVudW1NZXNzYWdlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiU3BhcnNlRW51bSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVTdHJpbmdfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syM107DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09uZVN0cmluZ19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lU3RyaW5nLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVTdHJpbmcuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVTdHJpbmdfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJEYXRhIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09uZUJ5dGVzX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMjRdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVCeXRlc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lQnl0ZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9uZUJ5dGVzLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT25lQnl0ZXNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJEYXRhIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRUeXBlc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzI1XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFBhY2tlZFR5cGVzX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkVHlwZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRUeXBlc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIlBhY2tlZEludDMyIiwgIlBhY2tlZEludDY0IiwgIlBhY2tlZFVpbnQzMiIsICJQYWNrZWRVaW50NjQiLCAiUGFja2VkU2ludDMyIiwgIlBhY2tlZFNpbnQ2NCIsICJQYWNrZWRGaXhlZDMyIiwgIlBhY2tlZEZpeGVkNjQiLCAiUGFja2VkU2ZpeGVkMzIiLCAiUGFja2VkU2ZpeGVkNjQiLCAiUGFja2VkRmxvYXQiLCAiUGFja2VkRG91YmxlIiwgIlBhY2tlZEJvb2wiLCAiUGFja2VkRW51bSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0VW5wYWNrZWRUeXBlc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzI2XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFVucGFja2VkVHlwZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZFR5cGVzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRUeXBlcy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RVbnBhY2tlZFR5cGVzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiVW5wYWNrZWRJbnQzMiIsICJVbnBhY2tlZEludDY0IiwgIlVucGFja2VkVWludDMyIiwgIlVucGFja2VkVWludDY0IiwgIlVucGFja2VkU2ludDMyIiwgIlVucGFja2VkU2ludDY0IiwgIlVucGFja2VkRml4ZWQzMiIsICJVbnBhY2tlZEZpeGVkNjQiLCAiVW5wYWNrZWRTZml4ZWQzMiIsICJVbnBhY2tlZFNmaXhlZDY0IiwgIlVucGFja2VkRmxvYXQiLCAiVW5wYWNrZWREb3VibGUiLCAiVW5wYWNrZWRCb29sIiwgIlVucGFja2VkRW51bSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkRXh0ZW5zaW9uc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzI3XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFBhY2tlZEV4dGVuc2lvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9ucy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRFeHRlbnNpb25zX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMjhdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHluYW1pY0V4dGVuc2lvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiU2NhbGFyRXh0ZW5zaW9uIiwgIkVudW1FeHRlbnNpb24iLCAiRHluYW1pY0VudW1FeHRlbnNpb24iLCAiTWVzc2FnZUV4dGVuc2lvbiIsICJEeW5hbWljTWVzc2FnZUV4dGVuc2lvbiIsICJSZXBlYXRlZEV4dGVuc2lvbiIsICJQYWNrZWRFeHRlbnNpb24iLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX0R5bmFtaWNNZXNzYWdlVHlwZV9fRGVzY3JpcHRvciA9IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHluYW1pY0V4dGVuc2lvbnNfRHluYW1pY01lc3NhZ2VUeXBlX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX0R5bmFtaWNNZXNzYWdlVHlwZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkR5bmFtaWNGaWVsZCIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzI5XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiUmVwZWF0ZWRGaXhlZDMyIiwgIlJlcGVhdGVkSW50MzIiLCAiUmVwZWF0ZWRGaXhlZDY0IiwgIlJlcGVhdGVkSW50NjQiLCAiUmVwZWF0ZWRGbG9hdCIsICJSZXBlYXRlZFVpbnQ2NCIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXF1ZXN0X19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXF1ZXN0X19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0LkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9vUmVxdWVzdF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0Zvb1Jlc3BvbnNlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMzFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvb1Jlc3BvbnNlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9vUmVzcG9uc2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXF1ZXN0X19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMzJdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXF1ZXN0X19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXF1ZXN0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXF1ZXN0LkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQmFyUmVxdWVzdF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0JhclJlc3BvbnNlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMzNdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQmFyUmVzcG9uc2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQmFyUmVzcG9uc2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbnQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzFdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsVWludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjx1aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxVaW50NjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHVsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbM10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTaW50MzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzRdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjx1aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjx1bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzddKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzhdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s5XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZsb2F0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxmbG9hdD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzEwXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbERvdWJsZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248ZG91YmxlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTFdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQm9vbEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Ym9vbD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzEyXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFN0cmluZ0V4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248c3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTNdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQnl0ZXNFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHBiOjpCeXRlU3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTRdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsR3JvdXBFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTVdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2U+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1sxNl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1sxN10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMThdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1sxOV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syMF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMjFdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzIyXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbENvcmRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzIzXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syNF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzI1XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248dWludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzI2XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248dWxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syN10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzI4XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzI5XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHVpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szMF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjx1bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzMxXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szMl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzMzXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZsb2F0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxmbG9hdD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzM0XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248ZG91YmxlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMzVdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQm9vbEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Ym9vbD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzM2XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248c3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMzddKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQnl0ZXNFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHBiOjpCeXRlU3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMzhdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkR3JvdXBFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMzldKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2U+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0MF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0MV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNDJdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0M10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0NF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNDVdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzQ2XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZENvcmRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzQ3XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW50MzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzQ4XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW50NjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0OV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFVpbnQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248dWludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzUwXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0VWludDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjx1bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzUxXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s1Ml0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNpbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzUzXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248dWludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzU0XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248dWxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s1NV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s1Nl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNTddKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGbG9hdEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248ZmxvYXQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s1OF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdERvdWJsZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248ZG91YmxlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNTldKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRCb29sRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxib29sPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNjBdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzYxXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Qnl0ZXNFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHBiOjpCeXRlU3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNjJdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzYzXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNjRdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNjVdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248c3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNjZdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRDb3JkRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxzdHJpbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s2N10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuTXlFeHRlbnNpb25TdHJpbmcgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzY4XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5NeUV4dGVuc2lvbkludCA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNjldKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3MF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkSW50NjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3MV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkVWludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjx1aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNzJdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFVpbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248dWxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3M10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3NF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ludDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNzVdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEZpeGVkMzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHVpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3Nl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRml4ZWQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248dWxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3N10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ZpeGVkMzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzc4XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzc5XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGbG9hdEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248ZmxvYXQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s4MF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRG91YmxlRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxkb3VibGU+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s4MV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkQm9vbEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Ym9vbD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzgyXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRFbnVtRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzgzXSk7DQorICAgICAgICBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEltcG9ydFByb3RvRmlsZS5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5Ow0KKyAgICAgIH07DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oZGVzY3JpcHRvckRhdGEsDQorICAgICAgICAgIG5ldyBwYmQ6OkZpbGVEZXNjcmlwdG9yW10gew0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLkRlc2NyaXB0b3IsIA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEltcG9ydFByb3RvRmlsZS5EZXNjcmlwdG9yLCANCisgICAgICAgICAgfSwgYXNzaWduZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICB9DQorICAjcmVnaW9uIEVudW1zDQorICBwdWJsaWMgZW51bSBGb3JlaWduRW51bSB7DQorICAgIEZPUkVJR05fRk9PID0gNCwNCisgICAgRk9SRUlHTl9CQVIgPSA1LA0KKyAgICBGT1JFSUdOX0JBWiA9IDYsDQorICB9DQorICANCisgIHB1YmxpYyBlbnVtIFRlc3RFbnVtV2l0aER1cFZhbHVlIHsNCisgICAgRk9PMSA9IDEsDQorICAgIEJBUjEgPSAyLA0KKyAgICBCQVogPSAzLA0KKyAgICBGT08yID0gMSwNCisgICAgQkFSMiA9IDIsDQorICB9DQorICANCisgIHB1YmxpYyBlbnVtIFRlc3RTcGFyc2VFbnVtIHsNCisgICAgU1BBUlNFX0EgPSAxMjMsDQorICAgIFNQQVJTRV9CID0gNjIzNzQsDQorICAgIFNQQVJTRV9DID0gMTI1ODkyMzQsDQorICAgIFNQQVJTRV9EID0gLTE1LA0KKyAgICBTUEFSU0VfRSA9IC01MzQ1MiwNCisgICAgU1BBUlNFX0YgPSAwLA0KKyAgICBTUEFSU0VfRyA9IDIsDQorICB9DQorICANCisgICNlbmRyZWdpb24NCisgIA0KKyAgI3JlZ2lvbiBNZXNzYWdlcw0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0QWxsVHlwZXMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdEFsbFR5cGVzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RBbGxUeXBlcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdEFsbFR5cGVzKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0QWxsVHlwZXNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImRlZmF1bHRfYm9vbCIsICJkZWZhdWx0X2J5dGVzIiwgImRlZmF1bHRfY29yZCIsICJkZWZhdWx0X2RvdWJsZSIsICJkZWZhdWx0X2ZpeGVkMzIiLCAiZGVmYXVsdF9maXhlZDY0IiwgImRlZmF1bHRfZmxvYXQiLCAiZGVmYXVsdF9mb3JlaWduX2VudW0iLCAiZGVmYXVsdF9pbXBvcnRfZW51bSIsICJkZWZhdWx0X2ludDMyIiwgImRlZmF1bHRfaW50NjQiLCAiZGVmYXVsdF9uZXN0ZWRfZW51bSIsICJkZWZhdWx0X3NmaXhlZDMyIiwgImRlZmF1bHRfc2ZpeGVkNjQiLCAiZGVmYXVsdF9zaW50MzIiLCAiZGVmYXVsdF9zaW50NjQiLCAiZGVmYXVsdF9zdHJpbmciLCAiZGVmYXVsdF9zdHJpbmdfcGllY2UiLCAiZGVmYXVsdF91aW50MzIiLCAiZGVmYXVsdF91aW50NjQiLCAib3B0aW9uYWxfYm9vbCIsICJvcHRpb25hbF9ieXRlcyIsICJvcHRpb25hbF9jb3JkIiwgIm9wdGlvbmFsX2RvdWJsZSIsICJvcHRpb25hbF9maXhlZDMyIiwgIm9wdGlvbmFsX2ZpeGVkNjQiLCAib3B0aW9uYWxfZmxvYXQiLCAib3B0aW9uYWxfZm9yZWlnbl9lbnVtIiwgIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIsICJvcHRpb25hbF9pbXBvcnRfZW51bSIsICJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIsICJvcHRpb25hbF9pbnQzMiIsICJvcHRpb25hbF9pbnQ2NCIsICJvcHRpb25hbF9uZXN0ZWRfZW51bSIsICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIsICJvcHRpb25hbF9zZml4ZWQzMiIsICJvcHRpb25hbF9zZml4ZWQ2NCIsICJvcHRpb25hbF9zaW50MzIiLCAib3B0aW9uYWxfc2ludDY0IiwgIm9wdGlvbmFsX3N0cmluZyIsICJvcHRpb25hbF9zdHJpbmdfcGllY2UiLCAib3B0aW9uYWxfdWludDMyIiwgIm9wdGlvbmFsX3VpbnQ2NCIsICJvcHRpb25hbGdyb3VwIiwgInJlcGVhdGVkX2Jvb2wiLCAicmVwZWF0ZWRfYnl0ZXMiLCAicmVwZWF0ZWRfY29yZCIsICJyZXBlYXRlZF9kb3VibGUiLCAicmVwZWF0ZWRfZml4ZWQzMiIsICJyZXBlYXRlZF9maXhlZDY0IiwgInJlcGVhdGVkX2Zsb2F0IiwgInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIsICJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiLCAicmVwZWF0ZWRfaW1wb3J0X2VudW0iLCAicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiLCAicmVwZWF0ZWRfaW50MzIiLCAicmVwZWF0ZWRfaW50NjQiLCAicmVwZWF0ZWRfbmVzdGVkX2VudW0iLCAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiLCAicmVwZWF0ZWRfc2ZpeGVkMzIiLCAicmVwZWF0ZWRfc2ZpeGVkNjQiLCAicmVwZWF0ZWRfc2ludDMyIiwgInJlcGVhdGVkX3NpbnQ2NCIsICJyZXBlYXRlZF9zdHJpbmciLCAicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiwgInJlcGVhdGVkX3VpbnQzMiIsICJyZXBlYXRlZF91aW50NjQiLCAicmVwZWF0ZWRncm91cCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0QWxsVHlwZXNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgNTg0LCA2MDIsIDY4MiwgNTc3LCA1NDEsIDU0NSwgNTczLCA2NTYsIDY2NCwgNDg4LCA0OTYsIDY0OCwgNTU3LCA1NjEsIDUyMCwgNTI4LCA1OTQsIDY3NCwgNTA0LCA1MTIsIDEwNCwgMTIyLCAyMDIsIDk3LCA2MSwgNjUsIDkzLCAxNzYsIDE1NCwgMTg0LCAxNjIsIDgsIDE2LCAxNjgsIDE0NiwgNzcsIDgxLCA0MCwgNDgsIDExNCwgMTk0LCAyNCwgMzIsIDEzMSwgMzQ0LCAzNjIsIDQ0MiwgMzM3LCAzMDEsIDMwNSwgMzMzLCA0MTYsIDM5NCwgNDI0LCA0MDIsIDI0OCwgMjU2LCA0MDgsIDM4NiwgMzE3LCAzMjEsIDI4MCwgMjg4LCAzNTQsIDQzNCwgMjY0LCAyNzIsIDM3MSB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RBbGxUeXBlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0QWxsVHlwZXMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMNCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsNCisgICAgICBwdWJsaWMgZW51bSBOZXN0ZWRFbnVtIHsNCisgICAgICAgIEZPTyA9IDEsDQorICAgICAgICBCQVIgPSAyLA0KKyAgICAgICAgQkFaID0gMywNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgTmVzdGVkTWVzc2FnZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPE5lc3RlZE1lc3NhZ2UsIE5lc3RlZE1lc3NhZ2UuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBOZXN0ZWRNZXNzYWdlKCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBOZXN0ZWRNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBOZXN0ZWRNZXNzYWdlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfbmVzdGVkTWVzc2FnZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYmIiIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX25lc3RlZE1lc3NhZ2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCB9Ow0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgVGhpc01lc3NhZ2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPE5lc3RlZE1lc3NhZ2UsIE5lc3RlZE1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBCYkZpZWxkTnVtYmVyID0gMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNCYjsNCisgICAgICAgIHByaXZhdGUgaW50IGJiXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0JiIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0JiOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IEJiIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGJiXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9uZXN0ZWRNZXNzYWdlRmllbGROYW1lczsNCisgICAgICAgICAgaWYgKGhhc0JiKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEJiKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgDQorICAgICAgICAgIHNpemUgPSAwOw0KKyAgICAgICAgICBpZiAoaGFzQmIpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIEJiKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIE5lc3RlZE1lc3NhZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKE5lc3RlZE1lc3NhZ2UgcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxOZXN0ZWRNZXNzYWdlLCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKE5lc3RlZE1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICAgICAgcHJpdmF0ZSBOZXN0ZWRNZXNzYWdlIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgTmVzdGVkTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgTmVzdGVkTWVzc2FnZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBOZXN0ZWRNZXNzYWdlKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgTmVzdGVkTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBOZXN0ZWRNZXNzYWdlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciBpcyBOZXN0ZWRNZXNzYWdlKSB7DQorICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChOZXN0ZWRNZXNzYWdlKSBvdGhlcik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKE5lc3RlZE1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNCYikgew0KKyAgICAgICAgICAgICAgQmIgPSBvdGhlci5CYjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfbmVzdGVkTWVzc2FnZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX25lc3RlZE1lc3NhZ2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0JiID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYmJfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICANCisgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzQmIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQmI7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEJiIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkJiOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0QmIodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QmIoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQmIgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5iYl8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckJiKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0JiID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmJiXyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0YXRpYyBOZXN0ZWRNZXNzYWdlKCkgew0KKyAgICAgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBPcHRpb25hbEdyb3VwIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8T3B0aW9uYWxHcm91cCwgT3B0aW9uYWxHcm91cC5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIE9wdGlvbmFsR3JvdXAoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE9wdGlvbmFsR3JvdXAgZGVmYXVsdEluc3RhbmNlID0gbmV3IE9wdGlvbmFsR3JvdXAoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9vcHRpb25hbEdyb3VwRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiB9Ow0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9vcHRpb25hbEdyb3VwRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEzNiB9Ow0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIE9wdGlvbmFsR3JvdXAgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE9wdGlvbmFsR3JvdXAgVGhpc01lc3NhZ2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPE9wdGlvbmFsR3JvdXAsIE9wdGlvbmFsR3JvdXAuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBBRmllbGROdW1iZXIgPSAxNzsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgYV87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0E7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9vcHRpb25hbEdyb3VwRmllbGROYW1lczsNCisgICAgICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxNywgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxNywgQSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXAgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXAgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXAgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpdmF0ZSBPcHRpb25hbEdyb3VwIE1ha2VSZWFkT25seSgpIHsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihPcHRpb25hbEdyb3VwIHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8T3B0aW9uYWxHcm91cCwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihPcHRpb25hbEdyb3VwIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgT3B0aW9uYWxHcm91cCByZXN1bHQ7DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIE9wdGlvbmFsR3JvdXAgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIE9wdGlvbmFsR3JvdXAgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgT3B0aW9uYWxHcm91cCgpOw0KKyAgICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBPcHRpb25hbEdyb3VwIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIE9wdGlvbmFsR3JvdXAgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgT3B0aW9uYWxHcm91cCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgaXMgT3B0aW9uYWxHcm91cCkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoT3B0aW9uYWxHcm91cCkgb3RoZXIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShPcHRpb25hbEdyb3VwIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzQSkgew0KKyAgICAgICAgICAgICAgQSA9IG90aGVyLkE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX29wdGlvbmFsR3JvdXBGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgICAgIHRhZyA9IF9vcHRpb25hbEdyb3VwRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTM2OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5hXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0QSh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRBKGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5hXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQSgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmFfID0gMDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIE9wdGlvbmFsR3JvdXAoKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFJlcGVhdGVkR3JvdXAgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxSZXBlYXRlZEdyb3VwLCBSZXBlYXRlZEdyb3VwLkJ1aWxkZXI+IHsNCisgICAgICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cCgpIHsgfQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUmVwZWF0ZWRHcm91cCBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgUmVwZWF0ZWRHcm91cCgpLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3JlcGVhdGVkR3JvdXBGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImEiIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3JlcGVhdGVkR3JvdXBGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMzc2IH07DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cCBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXBfX0Rlc2NyaXB0b3I7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8UmVwZWF0ZWRHcm91cCwgUmVwZWF0ZWRHcm91cC5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXBfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEFGaWVsZE51bWJlciA9IDQ3Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0E7DQorICAgICAgICBwcml2YXRlIGludCBhXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzQTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGFfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3JlcGVhdGVkR3JvdXBGaWVsZE5hbWVzOw0KKyAgICAgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDQ3LCBmaWVsZF9uYW1lc1swXSwgQSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgIA0KKyAgICAgICAgICBzaXplID0gMDsNCisgICAgICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDQ3LCBBKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIFJlcGVhdGVkR3JvdXAgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFJlcGVhdGVkR3JvdXAgcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxSZXBlYXRlZEdyb3VwLCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKFJlcGVhdGVkR3JvdXAgY2xvbmVGcm9tKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICAgICAgcHJpdmF0ZSBSZXBlYXRlZEdyb3VwIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgUmVwZWF0ZWRHcm91cCBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZXBlYXRlZEdyb3VwKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFJlcGVhdGVkR3JvdXAgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAuRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBSZXBlYXRlZEdyb3VwIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciBpcyBSZXBlYXRlZEdyb3VwKSB7DQorICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChSZXBlYXRlZEdyb3VwKSBvdGhlcik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFJlcGVhdGVkR3JvdXAgb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfcmVwZWF0ZWRHcm91cEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX3JlcGVhdGVkR3JvdXBGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAzNzY6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzQSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmFfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICANCisgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRBKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuYV8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgUmVwZWF0ZWRHcm91cCgpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEludDMyRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxJbnQzMjsNCisgICAgcHJpdmF0ZSBpbnQgb3B0aW9uYWxJbnQzMl87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbEludDMyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBPcHRpb25hbEludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxJbnQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEludDY0RmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxJbnQ2NDsNCisgICAgcHJpdmF0ZSBsb25nIG9wdGlvbmFsSW50NjRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxJbnQ2NDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIE9wdGlvbmFsSW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEludDY0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsVWludDMyRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxVaW50MzI7DQorICAgIHByaXZhdGUgdWludCBvcHRpb25hbFVpbnQzMl87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsVWludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxVaW50MzI7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgT3B0aW9uYWxVaW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFVpbnQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFVpbnQ2NEZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsVWludDY0Ow0KKyAgICBwcml2YXRlIHVsb25nIG9wdGlvbmFsVWludDY0XzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxVaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbFVpbnQ2NDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgT3B0aW9uYWxVaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFVpbnQ2NF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFNpbnQzMkZpZWxkTnVtYmVyID0gNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsU2ludDMyOw0KKyAgICBwcml2YXRlIGludCBvcHRpb25hbFNpbnQzMl87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU2ludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxTaW50MzI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IE9wdGlvbmFsU2ludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxTaW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTaW50NjRGaWVsZE51bWJlciA9IDY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbFNpbnQ2NDsNCisgICAgcHJpdmF0ZSBsb25nIG9wdGlvbmFsU2ludDY0XzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbFNpbnQ2NDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIE9wdGlvbmFsU2ludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxTaW50NjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxGaXhlZDMyRmllbGROdW1iZXIgPSA3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxGaXhlZDMyOw0KKyAgICBwcml2YXRlIHVpbnQgb3B0aW9uYWxGaXhlZDMyXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGaXhlZDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxGaXhlZDMyOyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IE9wdGlvbmFsRml4ZWQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsRml4ZWQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEZpeGVkNjRGaWVsZE51bWJlciA9IDg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbEZpeGVkNjQ7DQorICAgIHByaXZhdGUgdWxvbmcgb3B0aW9uYWxGaXhlZDY0XzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGaXhlZDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxGaXhlZDY0OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBPcHRpb25hbEZpeGVkNjQgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEZpeGVkNjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTZml4ZWQzMkZpZWxkTnVtYmVyID0gOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsU2ZpeGVkMzI7DQorICAgIHByaXZhdGUgaW50IG9wdGlvbmFsU2ZpeGVkMzJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFNmaXhlZDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxTZml4ZWQzMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgT3B0aW9uYWxTZml4ZWQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU2ZpeGVkMzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTZml4ZWQ2NEZpZWxkTnVtYmVyID0gMTA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbFNmaXhlZDY0Ow0KKyAgICBwcml2YXRlIGxvbmcgb3B0aW9uYWxTZml4ZWQ2NF87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU2ZpeGVkNjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbFNmaXhlZDY0OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgT3B0aW9uYWxTZml4ZWQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU2ZpeGVkNjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxGbG9hdEZpZWxkTnVtYmVyID0gMTE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbEZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IG9wdGlvbmFsRmxvYXRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxGbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBPcHRpb25hbEZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbERvdWJsZUZpZWxkTnVtYmVyID0gMTI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbERvdWJsZTsNCisgICAgcHJpdmF0ZSBkb3VibGUgb3B0aW9uYWxEb3VibGVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbERvdWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsRG91YmxlOyB9DQorICAgIH0NCisgICAgcHVibGljIGRvdWJsZSBPcHRpb25hbERvdWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsRG91YmxlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQm9vbEZpZWxkTnVtYmVyID0gMTM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbEJvb2w7DQorICAgIHByaXZhdGUgYm9vbCBvcHRpb25hbEJvb2xfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEJvb2wgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbEJvb2w7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBPcHRpb25hbEJvb2wgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEJvb2xfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTdHJpbmdGaWVsZE51bWJlciA9IDE0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxTdHJpbmc7DQorICAgIHByaXZhdGUgc3RyaW5nIG9wdGlvbmFsU3RyaW5nXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFN0cmluZyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsU3RyaW5nOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBPcHRpb25hbFN0cmluZyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU3RyaW5nXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQnl0ZXNGaWVsZE51bWJlciA9IDE1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxCeXRlczsNCisgICAgcHJpdmF0ZSBwYjo6Qnl0ZVN0cmluZyBvcHRpb25hbEJ5dGVzXyA9IHBiOjpCeXRlU3RyaW5nLkVtcHR5Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEJ5dGVzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxCeXRlczsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBPcHRpb25hbEJ5dGVzIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxCeXRlc187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEdyb3VwRmllbGROdW1iZXIgPSAxNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsR3JvdXA7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAgb3B0aW9uYWxHcm91cF87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsR3JvdXAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbEdyb3VwOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwIE9wdGlvbmFsR3JvdXAgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEdyb3VwXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbE5lc3RlZE1lc3NhZ2VGaWVsZE51bWJlciA9IDE4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIG9wdGlvbmFsTmVzdGVkTWVzc2FnZV87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSBPcHRpb25hbE5lc3RlZE1lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbE5lc3RlZE1lc3NhZ2VfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VGaWVsZE51bWJlciA9IDE5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBvcHRpb25hbEZvcmVpZ25NZXNzYWdlXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2U7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgT3B0aW9uYWxGb3JlaWduTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsSW1wb3J0TWVzc2FnZUZpZWxkTnVtYmVyID0gMjA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbEltcG9ydE1lc3NhZ2U7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZSBvcHRpb25hbEltcG9ydE1lc3NhZ2VfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEltcG9ydE1lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbEltcG9ydE1lc3NhZ2U7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZSBPcHRpb25hbEltcG9ydE1lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEltcG9ydE1lc3NhZ2VfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxOZXN0ZWRFbnVtRmllbGROdW1iZXIgPSAyMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsTmVzdGVkRW51bTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSBvcHRpb25hbE5lc3RlZEVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uRk9POw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbE5lc3RlZEVudW0gew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbE5lc3RlZEVudW07IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gT3B0aW9uYWxOZXN0ZWRFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxOZXN0ZWRFbnVtXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRm9yZWlnbkVudW1GaWVsZE51bWJlciA9IDIyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxGb3JlaWduRW51bTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBvcHRpb25hbEZvcmVpZ25FbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtLkZPUkVJR05fRk9POw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEZvcmVpZ25FbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxGb3JlaWduRW51bTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBPcHRpb25hbEZvcmVpZ25FbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxGb3JlaWduRW51bV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEltcG9ydEVudW1GaWVsZE51bWJlciA9IDIzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxJbXBvcnRFbnVtOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0gb3B0aW9uYWxJbXBvcnRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0uSU1QT1JUX0ZPTzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxJbXBvcnRFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxJbXBvcnRFbnVtOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0gT3B0aW9uYWxJbXBvcnRFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxJbXBvcnRFbnVtXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU3RyaW5nUGllY2VGaWVsZE51bWJlciA9IDI0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxTdHJpbmdQaWVjZTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgb3B0aW9uYWxTdHJpbmdQaWVjZV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTdHJpbmdQaWVjZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsU3RyaW5nUGllY2U7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIE9wdGlvbmFsU3RyaW5nUGllY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFN0cmluZ1BpZWNlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQ29yZEZpZWxkTnVtYmVyID0gMjU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbENvcmQ7DQorICAgIHByaXZhdGUgc3RyaW5nIG9wdGlvbmFsQ29yZF8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxDb3JkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxDb3JkOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBPcHRpb25hbENvcmQgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbENvcmRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbnQzMkZpZWxkTnVtYmVyID0gMzE7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiByZXBlYXRlZEludDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gUmVwZWF0ZWRJbnQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRJbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEludDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEludDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgR2V0UmVwZWF0ZWRJbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRJbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW50NjRGaWVsZE51bWJlciA9IDMyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+IHJlcGVhdGVkSW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGxvbmc+IFJlcGVhdGVkSW50NjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkSW50NjRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRJbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRJbnQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBHZXRSZXBlYXRlZEludDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEludDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRVaW50MzJGaWVsZE51bWJlciA9IDMzOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+IHJlcGVhdGVkVWludDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWludD4gUmVwZWF0ZWRVaW50MzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkVWludDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkVWludDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFVpbnQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgR2V0UmVwZWF0ZWRVaW50MzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkVWludDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRVaW50NjRGaWVsZE51bWJlciA9IDM0Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiByZXBlYXRlZFVpbnQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1bG9uZz4gUmVwZWF0ZWRVaW50NjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkVWludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkVWludDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFVpbnQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIEdldFJlcGVhdGVkVWludDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFVpbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU2ludDMyRmllbGROdW1iZXIgPSAzNTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IHJlcGVhdGVkU2ludDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gUmVwZWF0ZWRTaW50MzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkU2ludDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ludDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFNpbnQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkU2ludDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFNpbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU2ludDY0RmllbGROdW1iZXIgPSAzNjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiByZXBlYXRlZFNpbnQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gUmVwZWF0ZWRTaW50NjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkU2ludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ludDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFNpbnQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBHZXRSZXBlYXRlZFNpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRTaW50NjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZpeGVkMzJGaWVsZE51bWJlciA9IDM3Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+IHJlcGVhdGVkRml4ZWQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVpbnQ+IFJlcGVhdGVkRml4ZWQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRGaXhlZDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRml4ZWQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGaXhlZDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBHZXRSZXBlYXRlZEZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRml4ZWQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRml4ZWQ2NEZpZWxkTnVtYmVyID0gMzg7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+IHJlcGVhdGVkRml4ZWQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1bG9uZz4gUmVwZWF0ZWRGaXhlZDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEZpeGVkNjRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGaXhlZDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEZpeGVkNjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBHZXRSZXBlYXRlZEZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRml4ZWQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU2ZpeGVkMzJGaWVsZE51bWJlciA9IDM5Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gcmVwZWF0ZWRTZml4ZWQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFJlcGVhdGVkU2ZpeGVkMzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkU2ZpeGVkMzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRTZml4ZWQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRTZml4ZWQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkU2ZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkU2ZpeGVkMzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNmaXhlZDY0RmllbGROdW1iZXIgPSA0MDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiByZXBlYXRlZFNmaXhlZDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBSZXBlYXRlZFNmaXhlZDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFNmaXhlZDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ZpeGVkNjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU2ZpeGVkNjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRTZml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRTZml4ZWQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRmxvYXRGaWVsZE51bWJlciA9IDQxOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGZsb2F0PiByZXBlYXRlZEZsb2F0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxmbG9hdD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8ZmxvYXQ+IFJlcGVhdGVkRmxvYXRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkRmxvYXRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGbG9hdENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGbG9hdF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgR2V0UmVwZWF0ZWRGbG9hdChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRGbG9hdF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRG91YmxlRmllbGROdW1iZXIgPSA0MjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxkb3VibGU+IHJlcGVhdGVkRG91YmxlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxkb3VibGU+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGRvdWJsZT4gUmVwZWF0ZWREb3VibGVMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkRG91YmxlXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRG91YmxlQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZERvdWJsZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZG91YmxlIEdldFJlcGVhdGVkRG91YmxlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZERvdWJsZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkQm9vbEZpZWxkTnVtYmVyID0gNDM7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Ym9vbD4gcmVwZWF0ZWRCb29sXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxib29sPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxib29sPiBSZXBlYXRlZEJvb2xMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkQm9vbF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEJvb2xDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkQm9vbF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBHZXRSZXBlYXRlZEJvb2woaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkQm9vbF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU3RyaW5nRmllbGROdW1iZXIgPSA0NDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+IHJlcGVhdGVkU3RyaW5nXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gUmVwZWF0ZWRTdHJpbmdMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkU3RyaW5nXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkU3RyaW5nQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFN0cmluZ18uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFN0cmluZ19baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkQnl0ZXNGaWVsZE51bWJlciA9IDQ1Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHBiOjpCeXRlU3RyaW5nPiByZXBlYXRlZEJ5dGVzXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxwYjo6Qnl0ZVN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8cGI6OkJ5dGVTdHJpbmc+IFJlcGVhdGVkQnl0ZXNMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkQnl0ZXNfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRCeXRlc0NvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRCeXRlc18uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgR2V0UmVwZWF0ZWRCeXRlcyhpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRCeXRlc19baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkR3JvdXBGaWVsZE51bWJlciA9IDQ2Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwPiByZXBlYXRlZEdyb3VwXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXA+IFJlcGVhdGVkR3JvdXBMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRHcm91cF87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkR3JvdXBDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkR3JvdXBfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwIEdldFJlcGVhdGVkR3JvdXAoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkR3JvdXBfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZE5lc3RlZE1lc3NhZ2VGaWVsZE51bWJlciA9IDQ4Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPiByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZT4gUmVwZWF0ZWROZXN0ZWRNZXNzYWdlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkTmVzdGVkTWVzc2FnZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkTmVzdGVkTWVzc2FnZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSBHZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkTmVzdGVkTWVzc2FnZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VGaWVsZE51bWJlciA9IDQ5Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPiByZXBlYXRlZEZvcmVpZ25NZXNzYWdlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGb3JlaWduTWVzc2FnZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIEdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEltcG9ydE1lc3NhZ2VGaWVsZE51bWJlciA9IDUwOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2U+IHJlcGVhdGVkSW1wb3J0TWVzc2FnZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZT4gUmVwZWF0ZWRJbXBvcnRNZXNzYWdlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkSW1wb3J0TWVzc2FnZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW1wb3J0TWVzc2FnZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlIEdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRJbXBvcnRNZXNzYWdlX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWROZXN0ZWRFbnVtRmllbGROdW1iZXIgPSA1MTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bT4gcmVwZWF0ZWROZXN0ZWRFbnVtXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+IFJlcGVhdGVkTmVzdGVkRW51bUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWROZXN0ZWRFbnVtXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkTmVzdGVkRW51bUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWROZXN0ZWRFbnVtXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSBHZXRSZXBlYXRlZE5lc3RlZEVudW0oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkTmVzdGVkRW51bV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRm9yZWlnbkVudW1GaWVsZE51bWJlciA9IDUyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiByZXBlYXRlZEZvcmVpZ25FbnVtXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkRm9yZWlnbkVudW1fKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGb3JlaWduRW51bUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGb3JlaWduRW51bV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gR2V0UmVwZWF0ZWRGb3JlaWduRW51bShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRGb3JlaWduRW51bV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW1wb3J0RW51bUZpZWxkTnVtYmVyID0gNTM7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4gcmVwZWF0ZWRJbXBvcnRFbnVtXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPiBSZXBlYXRlZEltcG9ydEVudW1MaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkSW1wb3J0RW51bV8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEltcG9ydEVudW1Db3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkSW1wb3J0RW51bV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSBHZXRSZXBlYXRlZEltcG9ydEVudW0oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkSW1wb3J0RW51bV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZE51bWJlciA9IDU0Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gcmVwZWF0ZWRTdHJpbmdQaWVjZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxzdHJpbmc+IFJlcGVhdGVkU3RyaW5nUGllY2VMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkU3RyaW5nUGllY2VfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRTdHJpbmdQaWVjZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRTdHJpbmdQaWVjZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nUGllY2UoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkU3RyaW5nUGllY2VfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZENvcmRGaWVsZE51bWJlciA9IDU1Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gcmVwZWF0ZWRDb3JkXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gUmVwZWF0ZWRDb3JkTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZENvcmRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRDb3JkQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZENvcmRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZENvcmQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkQ29yZF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRJbnQzMkZpZWxkTnVtYmVyID0gNjE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0SW50MzI7DQorICAgIHByaXZhdGUgaW50IGRlZmF1bHRJbnQzMl8gPSA0MTsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdEludDMyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEZWZhdWx0SW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEludDY0RmllbGROdW1iZXIgPSA2MjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRJbnQ2NDsNCisgICAgcHJpdmF0ZSBsb25nIGRlZmF1bHRJbnQ2NF8gPSA0Mkw7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRJbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRJbnQ2NDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIERlZmF1bHRJbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnQ2NF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0VWludDMyRmllbGROdW1iZXIgPSA2MzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRVaW50MzI7DQorICAgIHByaXZhdGUgdWludCBkZWZhdWx0VWludDMyXyA9IDQzOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0VWludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdFVpbnQzMjsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBEZWZhdWx0VWludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdFVpbnQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0VWludDY0RmllbGROdW1iZXIgPSA2NDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRVaW50NjQ7DQorICAgIHByaXZhdGUgdWxvbmcgZGVmYXVsdFVpbnQ2NF8gPSA0NFVMOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0VWludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdFVpbnQ2NDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgRGVmYXVsdFVpbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRVaW50NjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFNpbnQzMkZpZWxkTnVtYmVyID0gNjU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0U2ludDMyOw0KKyAgICBwcml2YXRlIGludCBkZWZhdWx0U2ludDMyXyA9IC00NTsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFNpbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRTaW50MzI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IERlZmF1bHRTaW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0U2ludDMyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTaW50NjRGaWVsZE51bWJlciA9IDY2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdFNpbnQ2NDsNCisgICAgcHJpdmF0ZSBsb25nIGRlZmF1bHRTaW50NjRfID0gNDY7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0U2ludDY0OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRGVmYXVsdFNpbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRTaW50NjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEZpeGVkMzJGaWVsZE51bWJlciA9IDY3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdEZpeGVkMzI7DQorICAgIHByaXZhdGUgdWludCBkZWZhdWx0Rml4ZWQzMl8gPSA0NzsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEZpeGVkMzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0Rml4ZWQzMjsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBEZWZhdWx0Rml4ZWQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRGaXhlZDMyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRGaXhlZDY0RmllbGROdW1iZXIgPSA2ODsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRGaXhlZDY0Ow0KKyAgICBwcml2YXRlIHVsb25nIGRlZmF1bHRGaXhlZDY0XyA9IDQ4Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Rml4ZWQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRGaXhlZDY0OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBEZWZhdWx0Rml4ZWQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRGaXhlZDY0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTZml4ZWQzMkZpZWxkTnVtYmVyID0gNjk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0U2ZpeGVkMzI7DQorICAgIHByaXZhdGUgaW50IGRlZmF1bHRTZml4ZWQzMl8gPSA0OTsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFNmaXhlZDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdFNmaXhlZDMyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEZWZhdWx0U2ZpeGVkMzIgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0U2ZpeGVkMzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFNmaXhlZDY0RmllbGROdW1iZXIgPSA3MDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRTZml4ZWQ2NDsNCisgICAgcHJpdmF0ZSBsb25nIGRlZmF1bHRTZml4ZWQ2NF8gPSAtNTA7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTZml4ZWQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRTZml4ZWQ2NDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIERlZmF1bHRTZml4ZWQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRTZml4ZWQ2NF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0RmxvYXRGaWVsZE51bWJlciA9IDcxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdEZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IGRlZmF1bHRGbG9hdF8gPSA1MS41RjsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdEZsb2F0OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IERlZmF1bHRGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0RG91YmxlRmllbGROdW1iZXIgPSA3MjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHREb3VibGU7DQorICAgIHByaXZhdGUgZG91YmxlIGRlZmF1bHREb3VibGVfID0gNTIwMDBEOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0RG91YmxlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdERvdWJsZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBkb3VibGUgRGVmYXVsdERvdWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHREb3VibGVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEJvb2xGaWVsZE51bWJlciA9IDczOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdEJvb2w7DQorICAgIHByaXZhdGUgYm9vbCBkZWZhdWx0Qm9vbF8gPSB0cnVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Qm9vbCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRCb29sOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRGVmYXVsdEJvb2wgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0Qm9vbF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0U3RyaW5nRmllbGROdW1iZXIgPSA3NDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRTdHJpbmc7DQorICAgIHByaXZhdGUgc3RyaW5nIGRlZmF1bHRTdHJpbmdfID0gImhlbGxvIjsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFN0cmluZyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRTdHJpbmc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIERlZmF1bHRTdHJpbmcgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0U3RyaW5nXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRCeXRlc0ZpZWxkTnVtYmVyID0gNzU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0Qnl0ZXM7DQorICAgIHByaXZhdGUgcGI6OkJ5dGVTdHJpbmcgZGVmYXVsdEJ5dGVzXyA9IChwYjo6Qnl0ZVN0cmluZykgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IuRmllbGRzWzYyXS5EZWZhdWx0VmFsdWU7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRCeXRlcyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRCeXRlczsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBEZWZhdWx0Qnl0ZXMgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0Qnl0ZXNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdE5lc3RlZEVudW1GaWVsZE51bWJlciA9IDgxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdE5lc3RlZEVudW07DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gZGVmYXVsdE5lc3RlZEVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uQkFSOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0TmVzdGVkRW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHROZXN0ZWRFbnVtOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIERlZmF1bHROZXN0ZWRFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdE5lc3RlZEVudW1fOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEZvcmVpZ25FbnVtRmllbGROdW1iZXIgPSA4MjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRGb3JlaWduRW51bTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBkZWZhdWx0Rm9yZWlnbkVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0uRk9SRUlHTl9CQVI7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRGb3JlaWduRW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRGb3JlaWduRW51bTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBEZWZhdWx0Rm9yZWlnbkVudW0gew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0Rm9yZWlnbkVudW1fOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEltcG9ydEVudW1GaWVsZE51bWJlciA9IDgzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdEltcG9ydEVudW07DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSBkZWZhdWx0SW1wb3J0RW51bV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtLklNUE9SVF9CQVI7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRJbXBvcnRFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdEltcG9ydEVudW07IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSBEZWZhdWx0SW1wb3J0RW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbXBvcnRFbnVtXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTdHJpbmdQaWVjZUZpZWxkTnVtYmVyID0gODQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0U3RyaW5nUGllY2U7DQorICAgIHByaXZhdGUgc3RyaW5nIGRlZmF1bHRTdHJpbmdQaWVjZV8gPSAiYWJjIjsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFN0cmluZ1BpZWNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdFN0cmluZ1BpZWNlOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBEZWZhdWx0U3RyaW5nUGllY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0U3RyaW5nUGllY2VfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdENvcmRGaWVsZE51bWJlciA9IDg1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdENvcmQ7DQorICAgIHByaXZhdGUgc3RyaW5nIGRlZmF1bHRDb3JkXyA9ICIxMjMiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Q29yZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRDb3JkOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBEZWZhdWx0Q29yZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRDb3JkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdEFsbFR5cGVzRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMzFdLCBPcHRpb25hbEludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW50NjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KDIsIGZpZWxkX25hbWVzWzMyXSwgT3B0aW9uYWxJbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFVpbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlVUludDMyKDMsIGZpZWxkX25hbWVzWzQxXSwgT3B0aW9uYWxVaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxVaW50NjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQ2NCg0LCBmaWVsZF9uYW1lc1s0Ml0sIE9wdGlvbmFsVWludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsU2ludDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTSW50MzIoNSwgZmllbGRfbmFtZXNbMzddLCBPcHRpb25hbFNpbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFNpbnQ2NCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ludDY0KDYsIGZpZWxkX25hbWVzWzM4XSwgT3B0aW9uYWxTaW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxGaXhlZDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDMyKDcsIGZpZWxkX25hbWVzWzI0XSwgT3B0aW9uYWxGaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRml4ZWQ2NCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQ2NCg4LCBmaWVsZF9uYW1lc1syNV0sIE9wdGlvbmFsRml4ZWQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFNmaXhlZDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQzMig5LCBmaWVsZF9uYW1lc1szNV0sIE9wdGlvbmFsU2ZpeGVkMzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTZml4ZWQ2NCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ZpeGVkNjQoMTAsIGZpZWxkX25hbWVzWzM2XSwgT3B0aW9uYWxTZml4ZWQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZsb2F0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgxMSwgZmllbGRfbmFtZXNbMjZdLCBPcHRpb25hbEZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRG91YmxlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGUoMTIsIGZpZWxkX25hbWVzWzIzXSwgT3B0aW9uYWxEb3VibGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxCb29sKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDEzLCBmaWVsZF9uYW1lc1syMF0sIE9wdGlvbmFsQm9vbCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFN0cmluZykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDE0LCBmaWVsZF9uYW1lc1szOV0sIE9wdGlvbmFsU3RyaW5nKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsQnl0ZXMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKDE1LCBmaWVsZF9uYW1lc1syMV0sIE9wdGlvbmFsQnl0ZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxHcm91cCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlR3JvdXAoMTYsIGZpZWxkX25hbWVzWzQzXSwgT3B0aW9uYWxHcm91cCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMTgsIGZpZWxkX25hbWVzWzM0XSwgT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMTksIGZpZWxkX25hbWVzWzI4XSwgT3B0aW9uYWxGb3JlaWduTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMjAsIGZpZWxkX25hbWVzWzMwXSwgT3B0aW9uYWxJbXBvcnRNZXNzYWdlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsTmVzdGVkRW51bSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSgyMSwgZmllbGRfbmFtZXNbMzNdLCAoaW50KSBPcHRpb25hbE5lc3RlZEVudW0sIE9wdGlvbmFsTmVzdGVkRW51bSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZvcmVpZ25FbnVtKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDIyLCBmaWVsZF9uYW1lc1syN10sIChpbnQpIE9wdGlvbmFsRm9yZWlnbkVudW0sIE9wdGlvbmFsRm9yZWlnbkVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbXBvcnRFbnVtKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDIzLCBmaWVsZF9uYW1lc1syOV0sIChpbnQpIE9wdGlvbmFsSW1wb3J0RW51bSwgT3B0aW9uYWxJbXBvcnRFbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsU3RyaW5nUGllY2UpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygyNCwgZmllbGRfbmFtZXNbNDBdLCBPcHRpb25hbFN0cmluZ1BpZWNlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsQ29yZCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDI1LCBmaWVsZF9uYW1lc1syMl0sIE9wdGlvbmFsQ29yZCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyQXJyYXkoMzEsIGZpZWxkX25hbWVzWzU1XSwgcmVwZWF0ZWRJbnQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRJbnQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NEFycmF5KDMyLCBmaWVsZF9uYW1lc1s1Nl0sIHJlcGVhdGVkSW50NjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkVWludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQzMkFycmF5KDMzLCBmaWVsZF9uYW1lc1s2NV0sIHJlcGVhdGVkVWludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFVpbnQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50NjRBcnJheSgzNCwgZmllbGRfbmFtZXNbNjZdLCByZXBlYXRlZFVpbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRTaW50MzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ludDMyQXJyYXkoMzUsIGZpZWxkX25hbWVzWzYxXSwgcmVwZWF0ZWRTaW50MzJfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkU2ludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNJbnQ2NEFycmF5KDM2LCBmaWVsZF9uYW1lc1s2Ml0sIHJlcGVhdGVkU2ludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEZpeGVkMzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQzMkFycmF5KDM3LCBmaWVsZF9uYW1lc1s0OF0sIHJlcGVhdGVkRml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRGaXhlZDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkNjRBcnJheSgzOCwgZmllbGRfbmFtZXNbNDldLCByZXBlYXRlZEZpeGVkNjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkU2ZpeGVkMzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ZpeGVkMzJBcnJheSgzOSwgZmllbGRfbmFtZXNbNTldLCByZXBlYXRlZFNmaXhlZDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFNmaXhlZDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNGaXhlZDY0QXJyYXkoNDAsIGZpZWxkX25hbWVzWzYwXSwgcmVwZWF0ZWRTZml4ZWQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRGbG9hdF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdEFycmF5KDQxLCBmaWVsZF9uYW1lc1s1MF0sIHJlcGVhdGVkRmxvYXRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkRG91YmxlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZURvdWJsZUFycmF5KDQyLCBmaWVsZF9uYW1lc1s0N10sIHJlcGVhdGVkRG91YmxlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEJvb2xfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbEFycmF5KDQzLCBmaWVsZF9uYW1lc1s0NF0sIHJlcGVhdGVkQm9vbF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRTdHJpbmdfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoNDQsIGZpZWxkX25hbWVzWzYzXSwgcmVwZWF0ZWRTdHJpbmdfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkQnl0ZXNfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQnl0ZXNBcnJheSg0NSwgZmllbGRfbmFtZXNbNDVdLCByZXBlYXRlZEJ5dGVzXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEdyb3VwXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUdyb3VwQXJyYXkoNDYsIGZpZWxkX25hbWVzWzY3XSwgcmVwZWF0ZWRHcm91cF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSg0OCwgZmllbGRfbmFtZXNbNThdLCByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDQ5LCBmaWVsZF9uYW1lc1s1Ml0sIHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlQXJyYXkoNTAsIGZpZWxkX25hbWVzWzU0XSwgcmVwZWF0ZWRJbXBvcnRNZXNzYWdlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZE5lc3RlZEVudW1fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bUFycmF5KDUxLCBmaWVsZF9uYW1lc1s1N10sIHJlcGVhdGVkTmVzdGVkRW51bV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRGb3JlaWduRW51bV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtQXJyYXkoNTIsIGZpZWxkX25hbWVzWzUxXSwgcmVwZWF0ZWRGb3JlaWduRW51bV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRJbXBvcnRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW1BcnJheSg1MywgZmllbGRfbmFtZXNbNTNdLCByZXBlYXRlZEltcG9ydEVudW1fKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkU3RyaW5nUGllY2VfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoNTQsIGZpZWxkX25hbWVzWzY0XSwgcmVwZWF0ZWRTdHJpbmdQaWVjZV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRDb3JkXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZ0FycmF5KDU1LCBmaWVsZF9uYW1lc1s0Nl0sIHJlcGVhdGVkQ29yZF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEludDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig2MSwgZmllbGRfbmFtZXNbOV0sIERlZmF1bHRJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0SW50NjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KDYyLCBmaWVsZF9uYW1lc1sxMF0sIERlZmF1bHRJbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0VWludDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50MzIoNjMsIGZpZWxkX25hbWVzWzE4XSwgRGVmYXVsdFVpbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0VWludDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50NjQoNjQsIGZpZWxkX25hbWVzWzE5XSwgRGVmYXVsdFVpbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0U2ludDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTSW50MzIoNjUsIGZpZWxkX25hbWVzWzE0XSwgRGVmYXVsdFNpbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0U2ludDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTSW50NjQoNjYsIGZpZWxkX25hbWVzWzE1XSwgRGVmYXVsdFNpbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0Rml4ZWQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQzMig2NywgZmllbGRfbmFtZXNbNF0sIERlZmF1bHRGaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRGaXhlZDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDY0KDY4LCBmaWVsZF9uYW1lc1s1XSwgRGVmYXVsdEZpeGVkNjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFNmaXhlZDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQzMig2OSwgZmllbGRfbmFtZXNbMTJdLCBEZWZhdWx0U2ZpeGVkMzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFNmaXhlZDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQ2NCg3MCwgZmllbGRfbmFtZXNbMTNdLCBEZWZhdWx0U2ZpeGVkNjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEZsb2F0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCg3MSwgZmllbGRfbmFtZXNbNl0sIERlZmF1bHRGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0RG91YmxlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGUoNzIsIGZpZWxkX25hbWVzWzNdLCBEZWZhdWx0RG91YmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRCb29sKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDczLCBmaWVsZF9uYW1lc1swXSwgRGVmYXVsdEJvb2wpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFN0cmluZykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDc0LCBmaWVsZF9uYW1lc1sxNl0sIERlZmF1bHRTdHJpbmcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEJ5dGVzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCeXRlcyg3NSwgZmllbGRfbmFtZXNbMV0sIERlZmF1bHRCeXRlcyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0TmVzdGVkRW51bSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSg4MSwgZmllbGRfbmFtZXNbMTFdLCAoaW50KSBEZWZhdWx0TmVzdGVkRW51bSwgRGVmYXVsdE5lc3RlZEVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEZvcmVpZ25FbnVtKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDgyLCBmaWVsZF9uYW1lc1s3XSwgKGludCkgRGVmYXVsdEZvcmVpZ25FbnVtLCBEZWZhdWx0Rm9yZWlnbkVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEltcG9ydEVudW0pIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW0oODMsIGZpZWxkX25hbWVzWzhdLCAoaW50KSBEZWZhdWx0SW1wb3J0RW51bSwgRGVmYXVsdEltcG9ydEVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFN0cmluZ1BpZWNlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoODQsIGZpZWxkX25hbWVzWzE3XSwgRGVmYXVsdFN0cmluZ1BpZWNlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRDb3JkKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoODUsIGZpZWxkX25hbWVzWzJdLCBEZWZhdWx0Q29yZCk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbnQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBPcHRpb25hbEludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW50NjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUoMiwgT3B0aW9uYWxJbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFVpbnQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQzMlNpemUoMywgT3B0aW9uYWxVaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxVaW50NjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50NjRTaXplKDQsIE9wdGlvbmFsVWludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsU2ludDMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDMyU2l6ZSg1LCBPcHRpb25hbFNpbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFNpbnQ2NCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQ2NFNpemUoNiwgT3B0aW9uYWxTaW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxGaXhlZDMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRml4ZWQzMlNpemUoNywgT3B0aW9uYWxGaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRml4ZWQ2NCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZpeGVkNjRTaXplKDgsIE9wdGlvbmFsRml4ZWQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFNmaXhlZDMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ZpeGVkMzJTaXplKDksIE9wdGlvbmFsU2ZpeGVkMzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTZml4ZWQ2NCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNGaXhlZDY0U2l6ZSgxMCwgT3B0aW9uYWxTZml4ZWQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDExLCBPcHRpb25hbEZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRG91YmxlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRG91YmxlU2l6ZSgxMiwgT3B0aW9uYWxEb3VibGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxCb29sKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMTMsIE9wdGlvbmFsQm9vbCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFN0cmluZykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMTQsIE9wdGlvbmFsU3RyaW5nKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsQnl0ZXMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCeXRlc1NpemUoMTUsIE9wdGlvbmFsQnl0ZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxHcm91cCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUdyb3VwU2l6ZSgxNiwgT3B0aW9uYWxHcm91cCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxOCwgT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxOSwgT3B0aW9uYWxGb3JlaWduTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgyMCwgT3B0aW9uYWxJbXBvcnRNZXNzYWdlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsTmVzdGVkRW51bSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDIxLCAoaW50KSBPcHRpb25hbE5lc3RlZEVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxGb3JlaWduRW51bSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDIyLCAoaW50KSBPcHRpb25hbEZvcmVpZ25FbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW1wb3J0RW51bSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDIzLCAoaW50KSBPcHRpb25hbEltcG9ydEVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTdHJpbmdQaWVjZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMjQsIE9wdGlvbmFsU3RyaW5nUGllY2UpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxDb3JkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgyNSwgT3B0aW9uYWxDb3JkKTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIFJlcGVhdGVkSW50MzJMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRJbnQzMl8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChsb25nIGVsZW1lbnQgaW4gUmVwZWF0ZWRJbnQ2NExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZEludDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHVpbnQgZWxlbWVudCBpbiBSZXBlYXRlZFVpbnQzMkxpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50MzJTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRVaW50MzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAodWxvbmcgZWxlbWVudCBpbiBSZXBlYXRlZFVpbnQ2NExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50NjRTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRVaW50NjRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoaW50IGVsZW1lbnQgaW4gUmVwZWF0ZWRTaW50MzJMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkU2ludDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGxvbmcgZWxlbWVudCBpbiBSZXBlYXRlZFNpbnQ2NExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50NjRTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRTaW50NjRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogcmVwZWF0ZWRGaXhlZDMyXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZEZpeGVkMzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogcmVwZWF0ZWRGaXhlZDY0Xy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZEZpeGVkNjRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogcmVwZWF0ZWRTZml4ZWQzMl8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRTZml4ZWQzMl8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDggKiByZXBlYXRlZFNmaXhlZDY0Xy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZFNmaXhlZDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHJlcGVhdGVkRmxvYXRfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkRmxvYXRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogcmVwZWF0ZWREb3VibGVfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkRG91YmxlXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gMSAqIHJlcGVhdGVkQm9vbF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRCb29sXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIFJlcGVhdGVkU3RyaW5nTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZFN0cmluZ18uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChwYjo6Qnl0ZVN0cmluZyBlbGVtZW50IGluIFJlcGVhdGVkQnl0ZXNMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRCeXRlc18uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwIGVsZW1lbnQgaW4gUmVwZWF0ZWRHcm91cExpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVHcm91cFNpemUoNDYsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSBlbGVtZW50IGluIFJlcGVhdGVkTmVzdGVkTWVzc2FnZUxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSg0OCwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIGVsZW1lbnQgaW4gUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSg0OSwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UgZWxlbWVudCBpbiBSZXBlYXRlZEltcG9ydE1lc3NhZ2VMaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoNTAsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKHJlcGVhdGVkTmVzdGVkRW51bV8uQ291bnQgPiAwKSB7DQorICAgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIGVsZW1lbnQgaW4gcmVwZWF0ZWROZXN0ZWRFbnVtXykgew0KKyAgICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemVOb1RhZygoaW50KSBlbGVtZW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZE5lc3RlZEVudW1fLkNvdW50Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKHJlcGVhdGVkRm9yZWlnbkVudW1fLkNvdW50ID4gMCkgew0KKyAgICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBlbGVtZW50IGluIHJlcGVhdGVkRm9yZWlnbkVudW1fKSB7DQorICAgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZU5vVGFnKChpbnQpIGVsZW1lbnQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkRm9yZWlnbkVudW1fLkNvdW50Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKHJlcGVhdGVkSW1wb3J0RW51bV8uQ291bnQgPiAwKSB7DQorICAgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0gZWxlbWVudCBpbiByZXBlYXRlZEltcG9ydEVudW1fKSB7DQorICAgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZU5vVGFnKChpbnQpIGVsZW1lbnQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkSW1wb3J0RW51bV8uQ291bnQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChzdHJpbmcgZWxlbWVudCBpbiBSZXBlYXRlZFN0cmluZ1BpZWNlTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZFN0cmluZ1BpZWNlXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIFJlcGVhdGVkQ29yZExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRDb3JkXy5Db3VudDsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRJbnQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg2MSwgRGVmYXVsdEludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRJbnQ2NCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZSg2MiwgRGVmYXVsdEludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRVaW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50MzJTaXplKDYzLCBEZWZhdWx0VWludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRVaW50NjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50NjRTaXplKDY0LCBEZWZhdWx0VWludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTaW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50MzJTaXplKDY1LCBEZWZhdWx0U2ludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTaW50NjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50NjRTaXplKDY2LCBEZWZhdWx0U2ludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRGaXhlZDMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRml4ZWQzMlNpemUoNjcsIERlZmF1bHRGaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRGaXhlZDY0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRml4ZWQ2NFNpemUoNjgsIERlZmF1bHRGaXhlZDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTZml4ZWQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNGaXhlZDMyU2l6ZSg2OSwgRGVmYXVsdFNmaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTZml4ZWQ2NCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNGaXhlZDY0U2l6ZSg3MCwgRGVmYXVsdFNmaXhlZDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRGbG9hdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSg3MSwgRGVmYXVsdEZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHREb3VibGUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVEb3VibGVTaXplKDcyLCBEZWZhdWx0RG91YmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRCb29sKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoNzMsIERlZmF1bHRCb29sKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTdHJpbmcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDc0LCBEZWZhdWx0U3RyaW5nKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRCeXRlcykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJ5dGVzU2l6ZSg3NSwgRGVmYXVsdEJ5dGVzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHROZXN0ZWRFbnVtKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoODEsIChpbnQpIERlZmF1bHROZXN0ZWRFbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRGb3JlaWduRW51bSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDgyLCAoaW50KSBEZWZhdWx0Rm9yZWlnbkVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEltcG9ydEVudW0pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSg4MywgKGludCkgRGVmYXVsdEltcG9ydEVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFN0cmluZ1BpZWNlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSg4NCwgRGVmYXVsdFN0cmluZ1BpZWNlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRDb3JkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSg4NSwgRGVmYXVsdENvcmQpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0QWxsVHlwZXMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJlcGVhdGVkSW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkSW50NjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkVWludDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZFVpbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRTaW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU2ludDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEZpeGVkMzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkRml4ZWQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRTZml4ZWQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRTZml4ZWQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRGbG9hdF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWREb3VibGVfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkQm9vbF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRTdHJpbmdfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkQnl0ZXNfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkR3JvdXBfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZE5lc3RlZEVudW1fLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkRm9yZWlnbkVudW1fLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkSW1wb3J0RW51bV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRTdHJpbmdQaWVjZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRDb3JkXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RBbGxUeXBlcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RBbGxUeXBlcyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RBbGxUeXBlcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0QWxsVHlwZXMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0QWxsVHlwZXMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0QWxsVHlwZXMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RBbGxUeXBlcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0QWxsVHlwZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEFsbFR5cGVzIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0QWxsVHlwZXMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdEFsbFR5cGVzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdEFsbFR5cGVzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsSW50MzIpIHsNCisgICAgICAgICAgT3B0aW9uYWxJbnQzMiA9IG90aGVyLk9wdGlvbmFsSW50MzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxJbnQ2NCkgew0KKyAgICAgICAgICBPcHRpb25hbEludDY0ID0gb3RoZXIuT3B0aW9uYWxJbnQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbFVpbnQzMikgew0KKyAgICAgICAgICBPcHRpb25hbFVpbnQzMiA9IG90aGVyLk9wdGlvbmFsVWludDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsVWludDY0KSB7DQorICAgICAgICAgIE9wdGlvbmFsVWludDY0ID0gb3RoZXIuT3B0aW9uYWxVaW50NjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxTaW50MzIpIHsNCisgICAgICAgICAgT3B0aW9uYWxTaW50MzIgPSBvdGhlci5PcHRpb25hbFNpbnQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbFNpbnQ2NCkgew0KKyAgICAgICAgICBPcHRpb25hbFNpbnQ2NCA9IG90aGVyLk9wdGlvbmFsU2ludDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsRml4ZWQzMikgew0KKyAgICAgICAgICBPcHRpb25hbEZpeGVkMzIgPSBvdGhlci5PcHRpb25hbEZpeGVkMzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxGaXhlZDY0KSB7DQorICAgICAgICAgIE9wdGlvbmFsRml4ZWQ2NCA9IG90aGVyLk9wdGlvbmFsRml4ZWQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbFNmaXhlZDMyKSB7DQorICAgICAgICAgIE9wdGlvbmFsU2ZpeGVkMzIgPSBvdGhlci5PcHRpb25hbFNmaXhlZDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsU2ZpeGVkNjQpIHsNCisgICAgICAgICAgT3B0aW9uYWxTZml4ZWQ2NCA9IG90aGVyLk9wdGlvbmFsU2ZpeGVkNjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxGbG9hdCkgew0KKyAgICAgICAgICBPcHRpb25hbEZsb2F0ID0gb3RoZXIuT3B0aW9uYWxGbG9hdDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbERvdWJsZSkgew0KKyAgICAgICAgICBPcHRpb25hbERvdWJsZSA9IG90aGVyLk9wdGlvbmFsRG91YmxlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsQm9vbCkgew0KKyAgICAgICAgICBPcHRpb25hbEJvb2wgPSBvdGhlci5PcHRpb25hbEJvb2w7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxTdHJpbmcpIHsNCisgICAgICAgICAgT3B0aW9uYWxTdHJpbmcgPSBvdGhlci5PcHRpb25hbFN0cmluZzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEJ5dGVzKSB7DQorICAgICAgICAgIE9wdGlvbmFsQnl0ZXMgPSBvdGhlci5PcHRpb25hbEJ5dGVzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsR3JvdXApIHsNCisgICAgICAgICAgTWVyZ2VPcHRpb25hbEdyb3VwKG90aGVyLk9wdGlvbmFsR3JvdXApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSkgew0KKyAgICAgICAgICBNZXJnZU9wdGlvbmFsTmVzdGVkTWVzc2FnZShvdGhlci5PcHRpb25hbE5lc3RlZE1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpIHsNCisgICAgICAgICAgTWVyZ2VPcHRpb25hbEZvcmVpZ25NZXNzYWdlKG90aGVyLk9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSkgew0KKyAgICAgICAgICBNZXJnZU9wdGlvbmFsSW1wb3J0TWVzc2FnZShvdGhlci5PcHRpb25hbEltcG9ydE1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsTmVzdGVkRW51bSkgew0KKyAgICAgICAgICBPcHRpb25hbE5lc3RlZEVudW0gPSBvdGhlci5PcHRpb25hbE5lc3RlZEVudW07DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxGb3JlaWduRW51bSkgew0KKyAgICAgICAgICBPcHRpb25hbEZvcmVpZ25FbnVtID0gb3RoZXIuT3B0aW9uYWxGb3JlaWduRW51bTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEltcG9ydEVudW0pIHsNCisgICAgICAgICAgT3B0aW9uYWxJbXBvcnRFbnVtID0gb3RoZXIuT3B0aW9uYWxJbXBvcnRFbnVtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsU3RyaW5nUGllY2UpIHsNCisgICAgICAgICAgT3B0aW9uYWxTdHJpbmdQaWVjZSA9IG90aGVyLk9wdGlvbmFsU3RyaW5nUGllY2U7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxDb3JkKSB7DQorICAgICAgICAgIE9wdGlvbmFsQ29yZCA9IG90aGVyLk9wdGlvbmFsQ29yZDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDMyXy5BZGQob3RoZXIucmVwZWF0ZWRJbnQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkSW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50NjRfLkFkZChvdGhlci5yZXBlYXRlZEludDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRVaW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDMyXy5BZGQob3RoZXIucmVwZWF0ZWRVaW50MzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFVpbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50NjRfLkFkZChvdGhlci5yZXBlYXRlZFVpbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkU2ludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQzMl8uQWRkKG90aGVyLnJlcGVhdGVkU2ludDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRTaW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDY0Xy5BZGQob3RoZXIucmVwZWF0ZWRTaW50NjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEZpeGVkMzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQzMl8uQWRkKG90aGVyLnJlcGVhdGVkRml4ZWQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkRml4ZWQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xy5BZGQob3RoZXIucmVwZWF0ZWRGaXhlZDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRTZml4ZWQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRTZml4ZWQzMl8uQWRkKG90aGVyLnJlcGVhdGVkU2ZpeGVkMzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFNmaXhlZDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNmaXhlZDY0Xy5BZGQob3RoZXIucmVwZWF0ZWRTZml4ZWQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkRmxvYXRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRmxvYXRfLkFkZChvdGhlci5yZXBlYXRlZEZsb2F0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWREb3VibGVfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRG91YmxlXy5BZGQob3RoZXIucmVwZWF0ZWREb3VibGVfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEJvb2xfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkQm9vbF8uQWRkKG90aGVyLnJlcGVhdGVkQm9vbF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkU3RyaW5nXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ18uQWRkKG90aGVyLnJlcGVhdGVkU3RyaW5nXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRCeXRlc18uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRCeXRlc18uQWRkKG90aGVyLnJlcGVhdGVkQnl0ZXNfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEdyb3VwXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEdyb3VwXy5BZGQob3RoZXIucmVwZWF0ZWRHcm91cF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5BZGQob3RoZXIucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8uQWRkKG90aGVyLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEltcG9ydE1lc3NhZ2VfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQWRkKG90aGVyLnJlcGVhdGVkSW1wb3J0TWVzc2FnZV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkTmVzdGVkRW51bV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRFbnVtXy5BZGQob3RoZXIucmVwZWF0ZWROZXN0ZWRFbnVtXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRGb3JlaWduRW51bV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduRW51bV8uQWRkKG90aGVyLnJlcGVhdGVkRm9yZWlnbkVudW1fKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEltcG9ydEVudW1fLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0RW51bV8uQWRkKG90aGVyLnJlcGVhdGVkSW1wb3J0RW51bV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkU3RyaW5nUGllY2VfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VfLkFkZChvdGhlci5yZXBlYXRlZFN0cmluZ1BpZWNlXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRDb3JkXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZENvcmRfLkFkZChvdGhlci5yZXBlYXRlZENvcmRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0SW50MzIpIHsNCisgICAgICAgICAgRGVmYXVsdEludDMyID0gb3RoZXIuRGVmYXVsdEludDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRJbnQ2NCkgew0KKyAgICAgICAgICBEZWZhdWx0SW50NjQgPSBvdGhlci5EZWZhdWx0SW50NjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdFVpbnQzMikgew0KKyAgICAgICAgICBEZWZhdWx0VWludDMyID0gb3RoZXIuRGVmYXVsdFVpbnQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0VWludDY0KSB7DQorICAgICAgICAgIERlZmF1bHRVaW50NjQgPSBvdGhlci5EZWZhdWx0VWludDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRTaW50MzIpIHsNCisgICAgICAgICAgRGVmYXVsdFNpbnQzMiA9IG90aGVyLkRlZmF1bHRTaW50MzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdFNpbnQ2NCkgew0KKyAgICAgICAgICBEZWZhdWx0U2ludDY0ID0gb3RoZXIuRGVmYXVsdFNpbnQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0Rml4ZWQzMikgew0KKyAgICAgICAgICBEZWZhdWx0Rml4ZWQzMiA9IG90aGVyLkRlZmF1bHRGaXhlZDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRGaXhlZDY0KSB7DQorICAgICAgICAgIERlZmF1bHRGaXhlZDY0ID0gb3RoZXIuRGVmYXVsdEZpeGVkNjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdFNmaXhlZDMyKSB7DQorICAgICAgICAgIERlZmF1bHRTZml4ZWQzMiA9IG90aGVyLkRlZmF1bHRTZml4ZWQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0U2ZpeGVkNjQpIHsNCisgICAgICAgICAgRGVmYXVsdFNmaXhlZDY0ID0gb3RoZXIuRGVmYXVsdFNmaXhlZDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRGbG9hdCkgew0KKyAgICAgICAgICBEZWZhdWx0RmxvYXQgPSBvdGhlci5EZWZhdWx0RmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdERvdWJsZSkgew0KKyAgICAgICAgICBEZWZhdWx0RG91YmxlID0gb3RoZXIuRGVmYXVsdERvdWJsZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0Qm9vbCkgew0KKyAgICAgICAgICBEZWZhdWx0Qm9vbCA9IG90aGVyLkRlZmF1bHRCb29sOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRTdHJpbmcpIHsNCisgICAgICAgICAgRGVmYXVsdFN0cmluZyA9IG90aGVyLkRlZmF1bHRTdHJpbmc7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdEJ5dGVzKSB7DQorICAgICAgICAgIERlZmF1bHRCeXRlcyA9IG90aGVyLkRlZmF1bHRCeXRlczsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0TmVzdGVkRW51bSkgew0KKyAgICAgICAgICBEZWZhdWx0TmVzdGVkRW51bSA9IG90aGVyLkRlZmF1bHROZXN0ZWRFbnVtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRGb3JlaWduRW51bSkgew0KKyAgICAgICAgICBEZWZhdWx0Rm9yZWlnbkVudW0gPSBvdGhlci5EZWZhdWx0Rm9yZWlnbkVudW07DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdEltcG9ydEVudW0pIHsNCisgICAgICAgICAgRGVmYXVsdEltcG9ydEVudW0gPSBvdGhlci5EZWZhdWx0SW1wb3J0RW51bTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0U3RyaW5nUGllY2UpIHsNCisgICAgICAgICAgRGVmYXVsdFN0cmluZ1BpZWNlID0gb3RoZXIuRGVmYXVsdFN0cmluZ1BpZWNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRDb3JkKSB7DQorICAgICAgICAgIERlZmF1bHRDb3JkID0gb3RoZXIuRGVmYXVsdENvcmQ7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0QWxsVHlwZXNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdEFsbFR5cGVzRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEludDMyID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQub3B0aW9uYWxJbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEludDY0ID0gaW5wdXQuUmVhZEludDY0KHJlZiByZXN1bHQub3B0aW9uYWxJbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFVpbnQzMiA9IGlucHV0LlJlYWRVSW50MzIocmVmIHJlc3VsdC5vcHRpb25hbFVpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFVpbnQ2NCA9IGlucHV0LlJlYWRVSW50NjQocmVmIHJlc3VsdC5vcHRpb25hbFVpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNpbnQzMiA9IGlucHV0LlJlYWRTSW50MzIocmVmIHJlc3VsdC5vcHRpb25hbFNpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNpbnQ2NCA9IGlucHV0LlJlYWRTSW50NjQocmVmIHJlc3VsdC5vcHRpb25hbFNpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZpeGVkMzIgPSBpbnB1dC5SZWFkRml4ZWQzMihyZWYgcmVzdWx0Lm9wdGlvbmFsRml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjU6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZpeGVkNjQgPSBpbnB1dC5SZWFkRml4ZWQ2NChyZWYgcmVzdWx0Lm9wdGlvbmFsRml4ZWQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzc6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNmaXhlZDMyID0gaW5wdXQuUmVhZFNGaXhlZDMyKHJlZiByZXN1bHQub3B0aW9uYWxTZml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNmaXhlZDY0ID0gaW5wdXQuUmVhZFNGaXhlZDY0KHJlZiByZXN1bHQub3B0aW9uYWxTZml4ZWQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgOTM6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZsb2F0ID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQub3B0aW9uYWxGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgOTc6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbERvdWJsZSA9IGlucHV0LlJlYWREb3VibGUocmVmIHJlc3VsdC5vcHRpb25hbERvdWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxCb29sID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5vcHRpb25hbEJvb2xfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDExNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0Lm9wdGlvbmFsU3RyaW5nXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMjI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEJ5dGVzID0gaW5wdXQuUmVhZEJ5dGVzKHJlZiByZXN1bHQub3B0aW9uYWxCeXRlc18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTMxOiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsR3JvdXApIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oT3B0aW9uYWxHcm91cCk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkR3JvdXAoMTYsIHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIE9wdGlvbmFsR3JvdXAgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTQ2OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShPcHRpb25hbE5lc3RlZE1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE1NDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgT3B0aW9uYWxGb3JlaWduTWVzc2FnZSA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjI6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShPcHRpb25hbEltcG9ydE1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgT3B0aW9uYWxJbXBvcnRNZXNzYWdlID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2ODogew0KKyAgICAgICAgICAgICAgb2JqZWN0IHVua25vd247DQorICAgICAgICAgICAgICBpZihpbnB1dC5SZWFkRW51bShyZWYgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkRW51bV8sIG91dCB1bmtub3duKSkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRFbnVtID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgyMSwgKHVsb25nKShpbnQpdW5rbm93bik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNzY6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5vcHRpb25hbEZvcmVpZ25FbnVtXywgb3V0IHVua25vd24pKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25FbnVtID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgyMiwgKHVsb25nKShpbnQpdW5rbm93bik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODQ6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5vcHRpb25hbEltcG9ydEVudW1fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW1wb3J0RW51bSA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoMjMsICh1bG9uZykoaW50KXVua25vd24pOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTk0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTdHJpbmdQaWVjZSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5vcHRpb25hbFN0cmluZ1BpZWNlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMDI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbENvcmQgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQub3B0aW9uYWxDb3JkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNTA6DQorICAgICAgICAgICAgY2FzZSAyNDg6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkSW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI1ODoNCisgICAgICAgICAgICBjYXNlIDI1Njogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEludDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRJbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjY2Og0KKyAgICAgICAgICAgIGNhc2UgMjY0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkVUludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRVaW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI3NDoNCisgICAgICAgICAgICBjYXNlIDI3Mjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFVJbnQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkVWludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyODI6DQorICAgICAgICAgICAgY2FzZSAyODA6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZFNpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjkwOg0KKyAgICAgICAgICAgIGNhc2UgMjg4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ludDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTaW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI5ODoNCisgICAgICAgICAgICBjYXNlIDMwMTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEZpeGVkMzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEZpeGVkMzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMwNjoNCisgICAgICAgICAgICBjYXNlIDMwNTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEZpeGVkNjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMxNDoNCisgICAgICAgICAgICBjYXNlIDMxNzogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNGaXhlZDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTZml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzIyOg0KKyAgICAgICAgICAgIGNhc2UgMzIxOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ZpeGVkNjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZFNmaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzMzA6DQorICAgICAgICAgICAgY2FzZSAzMzM6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGbG9hdEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkRmxvYXRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMzODoNCisgICAgICAgICAgICBjYXNlIDMzNzogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZERvdWJsZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkRG91YmxlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzNDY6DQorICAgICAgICAgICAgY2FzZSAzNDQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRCb29sQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRCb29sXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzNTQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTdHJpbmdBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZFN0cmluZ18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzYyOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkQnl0ZXNBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEJ5dGVzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzNzE6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRHcm91cEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkR3JvdXBfLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cC5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM4Njogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM5NDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0MDI6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRJbXBvcnRNZXNzYWdlXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQxMDoNCisgICAgICAgICAgICBjYXNlIDQwODogew0KKyAgICAgICAgICAgICAgc2NnOjpJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd25JdGVtczsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXk8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkTmVzdGVkRW51bV8sIG91dCB1bmtub3duSXRlbXMpOw0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25JdGVtcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IHJhd1ZhbHVlIGluIHVua25vd25JdGVtcykNCisgICAgICAgICAgICAgICAgICBpZiAocmF3VmFsdWUgaXMgaW50KQ0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5NZXJnZVZhcmludEZpZWxkKDUxLCAodWxvbmcpKGludClyYXdWYWx1ZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0MTg6DQorICAgICAgICAgICAgY2FzZSA0MTY6IHsNCisgICAgICAgICAgICAgIHNjZzo6SUNvbGxlY3Rpb248b2JqZWN0PiB1bmtub3duSXRlbXM7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRW51bUFycmF5PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPih0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25FbnVtXywgb3V0IHVua25vd25JdGVtcyk7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkl0ZW1zICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgcmF3VmFsdWUgaW4gdW5rbm93bkl0ZW1zKQ0KKyAgICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZSBpcyBpbnQpDQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoNTIsICh1bG9uZykoaW50KXJhd1ZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQyNjoNCisgICAgICAgICAgICBjYXNlIDQyNDogew0KKyAgICAgICAgICAgICAgc2NnOjpJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd25JdGVtczsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXk8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4odGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRJbXBvcnRFbnVtXywgb3V0IHVua25vd25JdGVtcyk7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkl0ZW1zICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgcmF3VmFsdWUgaW4gdW5rbm93bkl0ZW1zKQ0KKyAgICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZSBpcyBpbnQpDQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoNTMsICh1bG9uZykoaW50KXJhd1ZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQzNDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQ0Mjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkQ29yZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDg4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEludDMyID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZGVmYXVsdEludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0OTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0SW50NjQgPSBpbnB1dC5SZWFkSW50NjQocmVmIHJlc3VsdC5kZWZhdWx0SW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDUwNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRVaW50MzIgPSBpbnB1dC5SZWFkVUludDMyKHJlZiByZXN1bHQuZGVmYXVsdFVpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTEyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFVpbnQ2NCA9IGlucHV0LlJlYWRVSW50NjQocmVmIHJlc3VsdC5kZWZhdWx0VWludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1MjA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ludDMyID0gaW5wdXQuUmVhZFNJbnQzMihyZWYgcmVzdWx0LmRlZmF1bHRTaW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDUyODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTaW50NjQgPSBpbnB1dC5SZWFkU0ludDY0KHJlZiByZXN1bHQuZGVmYXVsdFNpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTQxOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEZpeGVkMzIgPSBpbnB1dC5SZWFkRml4ZWQzMihyZWYgcmVzdWx0LmRlZmF1bHRGaXhlZDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1NDU6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Rml4ZWQ2NCA9IGlucHV0LlJlYWRGaXhlZDY0KHJlZiByZXN1bHQuZGVmYXVsdEZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU1Nzogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTZml4ZWQzMiA9IGlucHV0LlJlYWRTRml4ZWQzMihyZWYgcmVzdWx0LmRlZmF1bHRTZml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTYxOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNmaXhlZDY0ID0gaW5wdXQuUmVhZFNGaXhlZDY0KHJlZiByZXN1bHQuZGVmYXVsdFNmaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1NzM6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0RmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5kZWZhdWx0RmxvYXRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU3Nzogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHREb3VibGUgPSBpbnB1dC5SZWFkRG91YmxlKHJlZiByZXN1bHQuZGVmYXVsdERvdWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTg0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEJvb2wgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmRlZmF1bHRCb29sXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1OTQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U3RyaW5nID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmRlZmF1bHRTdHJpbmdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDYwMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRCeXRlcyA9IGlucHV0LlJlYWRCeXRlcyhyZWYgcmVzdWx0LmRlZmF1bHRCeXRlc18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjQ4OiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQuZGVmYXVsdE5lc3RlZEVudW1fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHROZXN0ZWRFbnVtID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCg4MSwgKHVsb25nKShpbnQpdW5rbm93bik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2NTY6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5kZWZhdWx0Rm9yZWlnbkVudW1fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGb3JlaWduRW51bSA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoODIsICh1bG9uZykoaW50KXVua25vd24pOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjY0OiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQuZGVmYXVsdEltcG9ydEVudW1fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRJbXBvcnRFbnVtID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCg4MywgKHVsb25nKShpbnQpdW5rbm93bik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2NzQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U3RyaW5nUGllY2UgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZGVmYXVsdFN0cmluZ1BpZWNlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2ODI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Q29yZCA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5kZWZhdWx0Q29yZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgT3B0aW9uYWxJbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsSW50MzI7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsSW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW50MzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEludDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbnQzMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEludDY0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIE9wdGlvbmFsSW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEludDY0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEludDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbnQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbnQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsSW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW50NjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEludDY0XyA9IDBMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsVWludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxVaW50MzI7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgT3B0aW9uYWxVaW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbFVpbnQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxVaW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsVWludDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxVaW50MzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsVWludDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxVaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsVWludDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxVaW50MzJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFVpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsVWludDY0OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBPcHRpb25hbFVpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsVWludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbFVpbnQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxVaW50NjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxVaW50NjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsVWludDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxVaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsVWludDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxVaW50NjRfID0gMFVMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU2ludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxTaW50MzI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBPcHRpb25hbFNpbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsU2ludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbFNpbnQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxTaW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU2ludDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFNpbnQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsU2ludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNpbnQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsU2ludDMyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTaW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbFNpbnQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBPcHRpb25hbFNpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsU2ludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbFNpbnQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxTaW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNpbnQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTaW50NjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbFNpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTaW50NjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFNpbnQ2NF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRml4ZWQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsRml4ZWQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBPcHRpb25hbEZpeGVkMzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEZpeGVkMzI7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsRml4ZWQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxGaXhlZDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGaXhlZDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZpeGVkMzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRml4ZWQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRml4ZWQzMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsRml4ZWQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgT3B0aW9uYWxGaXhlZDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxGaXhlZDY0OyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEZpeGVkNjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsRml4ZWQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZpeGVkNjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRml4ZWQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsRml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGaXhlZDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxGaXhlZDY0XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTZml4ZWQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsU2ZpeGVkMzI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBPcHRpb25hbFNmaXhlZDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxTZml4ZWQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxTZml4ZWQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxTZml4ZWQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTZml4ZWQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTZml4ZWQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsU2ZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU2ZpeGVkMzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFNmaXhlZDMyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTZml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsU2ZpeGVkNjQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgT3B0aW9uYWxTZml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsU2ZpeGVkNjQ7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsU2ZpeGVkNjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsU2ZpeGVkNjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNmaXhlZDY0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFNmaXhlZDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxTZml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTZml4ZWQ2NCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsU2ZpeGVkNjRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxGbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgT3B0aW9uYWxGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsRmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsRmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxGbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZsb2F0XyA9IDBGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRG91YmxlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxEb3VibGU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGRvdWJsZSBPcHRpb25hbERvdWJsZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsRG91YmxlOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbERvdWJsZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxEb3VibGUoZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRG91YmxlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbERvdWJsZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsRG91YmxlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbERvdWJsZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRG91YmxlXyA9IDBEOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsQm9vbCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsQm9vbDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBPcHRpb25hbEJvb2wgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEJvb2w7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsQm9vbCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxCb29sKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxCb29sID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEJvb2xfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEJvb2woKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsQm9vbCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsQm9vbF8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFN0cmluZyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgT3B0aW9uYWxTdHJpbmcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbFN0cmluZzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxTdHJpbmcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsU3RyaW5nKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTdHJpbmcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsU3RyaW5nXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxTdHJpbmcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTdHJpbmdfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxCeXRlcyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsQnl0ZXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIE9wdGlvbmFsQnl0ZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEJ5dGVzOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEJ5dGVzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEJ5dGVzKHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEJ5dGVzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEJ5dGVzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxCeXRlcygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxCeXRlcyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsQnl0ZXNfID0gcGI6OkJ5dGVTdHJpbmcuRW1wdHk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxHcm91cCB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxHcm91cDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAgT3B0aW9uYWxHcm91cCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsR3JvdXA7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsR3JvdXAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsR3JvdXAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsR3JvdXAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsR3JvdXBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxHcm91cChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEdyb3VwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEdyb3VwXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlT3B0aW9uYWxHcm91cChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsR3JvdXAgJiYNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxHcm91cF8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsR3JvdXBfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxHcm91cF8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQub3B0aW9uYWxHcm91cF8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEdyb3VwID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsR3JvdXAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsR3JvdXAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEdyb3VwXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsTmVzdGVkTWVzc2FnZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbmFsTmVzdGVkTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsTmVzdGVkTWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgT3B0aW9uYWxGb3JlaWduTWVzc2FnZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsRm9yZWlnbk1lc3NhZ2U7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZvcmVpZ25NZXNzYWdlXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlT3B0aW9uYWxGb3JlaWduTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgJiYNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxGb3JlaWduTWVzc2FnZV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQub3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZvcmVpZ25NZXNzYWdlXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UgT3B0aW9uYWxJbXBvcnRNZXNzYWdlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxJbXBvcnRNZXNzYWdlOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEltcG9ydE1lc3NhZ2UodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsSW1wb3J0TWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW1wb3J0TWVzc2FnZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEltcG9ydE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW1wb3J0TWVzc2FnZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbmFsSW1wb3J0TWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlICYmDQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW1wb3J0TWVzc2FnZV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxJbXBvcnRNZXNzYWdlXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxJbXBvcnRNZXNzYWdlXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5vcHRpb25hbEltcG9ydE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsSW1wb3J0TWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbXBvcnRNZXNzYWdlXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxOZXN0ZWRFbnVtIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZEVudW07IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIE9wdGlvbmFsTmVzdGVkRW51bSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsTmVzdGVkRW51bTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxOZXN0ZWRFbnVtKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbE5lc3RlZEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRFbnVtID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZEVudW1fID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbE5lc3RlZEVudW0oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkRW51bSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkRW51bV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5GT087DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGb3JlaWduRW51bSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxGb3JlaWduRW51bTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gT3B0aW9uYWxGb3JlaWduRW51bSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsRm9yZWlnbkVudW07IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsRm9yZWlnbkVudW0odmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsRm9yZWlnbkVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGb3JlaWduRW51bSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxGb3JlaWduRW51bV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsRm9yZWlnbkVudW0oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRm9yZWlnbkVudW0gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZvcmVpZ25FbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtLkZPUkVJR05fRk9POw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW1wb3J0RW51bSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRFbnVtOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtIE9wdGlvbmFsSW1wb3J0RW51bSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsSW1wb3J0RW51bTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxJbXBvcnRFbnVtKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEltcG9ydEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEltcG9ydEVudW0gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW1wb3J0RW51bV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsSW1wb3J0RW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRFbnVtID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbXBvcnRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0uSU1QT1JUX0ZPTzsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFN0cmluZ1BpZWNlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxTdHJpbmdQaWVjZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIE9wdGlvbmFsU3RyaW5nUGllY2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbFN0cmluZ1BpZWNlOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbFN0cmluZ1BpZWNlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbFN0cmluZ1BpZWNlKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTdHJpbmdQaWVjZSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTdHJpbmdQaWVjZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsU3RyaW5nUGllY2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nUGllY2UgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFN0cmluZ1BpZWNlXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsQ29yZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsQ29yZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIE9wdGlvbmFsQ29yZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsQ29yZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxDb3JkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbENvcmQoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbENvcmQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsQ29yZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsQ29yZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxDb3JkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxDb3JkXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBSZXBlYXRlZEludDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkSW50MzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkSW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEludDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gUmVwZWF0ZWRJbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRJbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRJbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRJbnQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkSW50NjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50NjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkSW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRJbnQ2NChzY2c6OklFbnVtZXJhYmxlPGxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkSW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50NjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1aW50PiBSZXBlYXRlZFVpbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRVaW50MzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRVaW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkVWludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgR2V0UmVwZWF0ZWRVaW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkVWludDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRVaW50MzIoaW50IGluZGV4LCB1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZFVpbnQzMih1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRVaW50MzIoc2NnOjpJRW51bWVyYWJsZTx1aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRVaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IFJlcGVhdGVkVWludDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFVpbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZFVpbnQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRVaW50NjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgR2V0UmVwZWF0ZWRVaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkVWludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRVaW50NjQoaW50IGluZGV4LCB1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRVaW50NjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50NjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZFVpbnQ2NChzY2c6OklFbnVtZXJhYmxlPHVsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRVaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBSZXBlYXRlZFNpbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRTaW50MzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRTaW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkU2ludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXRSZXBlYXRlZFNpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRTaW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZFNpbnQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRTaW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRTaW50MzIoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZFNpbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTaW50MzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBSZXBlYXRlZFNpbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRTaW50NjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRTaW50NjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkU2ludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRTaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkU2ludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRTaW50NjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZFNpbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRTaW50NjQoc2NnOjpJRW51bWVyYWJsZTxsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTaW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRTaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWludD4gUmVwZWF0ZWRGaXhlZDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEZpeGVkMzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGaXhlZDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEZpeGVkMzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBHZXRSZXBlYXRlZEZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRml4ZWQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkRml4ZWQzMihpbnQgaW5kZXgsIHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEZpeGVkMzIodWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkMzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEZpeGVkMzIoc2NnOjpJRW51bWVyYWJsZTx1aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRml4ZWQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IFJlcGVhdGVkRml4ZWQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRGaXhlZDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRml4ZWQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRGaXhlZDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEdldFJlcGVhdGVkRml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRGaXhlZDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRGaXhlZDY0KGludCBpbmRleCwgdWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEZpeGVkNjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRGaXhlZDY0KHNjZzo6SUVudW1lcmFibGU8dWxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkNjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRGaXhlZDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkNjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IFJlcGVhdGVkU2ZpeGVkMzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkU2ZpeGVkMzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRTZml4ZWQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRTZml4ZWQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0UmVwZWF0ZWRTZml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRTZml4ZWQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkU2ZpeGVkMzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTZml4ZWQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRTZml4ZWQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTZml4ZWQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkU2ZpeGVkMzIoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNmaXhlZDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkU2ZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkMzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBSZXBlYXRlZFNmaXhlZDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFNmaXhlZDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ZpeGVkNjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkU2ZpeGVkNjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBHZXRSZXBlYXRlZFNmaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZFNmaXhlZDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRTZml4ZWQ2NChpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTZml4ZWQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRTZml4ZWQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkNjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZFNmaXhlZDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkNjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRTZml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTZml4ZWQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGZsb2F0PiBSZXBlYXRlZEZsb2F0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEZsb2F0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRmxvYXRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkRmxvYXRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgR2V0UmVwZWF0ZWRGbG9hdChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRGbG9hdChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkRmxvYXQoaW50IGluZGV4LCBmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRmxvYXRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEZsb2F0KHNjZzo6SUVudW1lcmFibGU8ZmxvYXQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRmxvYXRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxkb3VibGU+IFJlcGVhdGVkRG91YmxlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZERvdWJsZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZERvdWJsZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWREb3VibGVDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZG91YmxlIEdldFJlcGVhdGVkRG91YmxlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZERvdWJsZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkRG91YmxlKGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRG91YmxlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZERvdWJsZShkb3VibGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWREb3VibGVfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZERvdWJsZShzY2c6OklFbnVtZXJhYmxlPGRvdWJsZT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRG91YmxlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRG91YmxlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZERvdWJsZV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGJvb2w+IFJlcGVhdGVkQm9vbExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRCb29sXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkQm9vbENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRCb29sQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgR2V0UmVwZWF0ZWRCb29sKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEJvb2woaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEJvb2woaW50IGluZGV4LCBib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQm9vbF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRCb29sKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRCb29sXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRCb29sKHNjZzo6SUVudW1lcmFibGU8Ym9vbD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQm9vbF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEJvb2woKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQm9vbF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gUmVwZWF0ZWRTdHJpbmdMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkU3RyaW5nXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU3RyaW5nQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFN0cmluZ0NvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgR2V0UmVwZWF0ZWRTdHJpbmcoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkU3RyaW5nKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRTdHJpbmcoaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZFN0cmluZyhzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRTdHJpbmcoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ18uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZFN0cmluZygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxwYjo6Qnl0ZVN0cmluZz4gUmVwZWF0ZWRCeXRlc0xpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRCeXRlc187IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEJ5dGVzQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEJ5dGVzQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIEdldFJlcGVhdGVkQnl0ZXMoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkQnl0ZXMoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEJ5dGVzKGludCBpbmRleCwgcGI6OkJ5dGVTdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQnl0ZXNfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkQnl0ZXMocGI6OkJ5dGVTdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQnl0ZXNfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEJ5dGVzKHNjZzo6SUVudW1lcmFibGU8cGI6OkJ5dGVTdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJ5dGVzXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkQnl0ZXMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQnl0ZXNfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cD4gUmVwZWF0ZWRHcm91cExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRHcm91cF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEdyb3VwQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEdyb3VwQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwIEdldFJlcGVhdGVkR3JvdXAoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkR3JvdXAoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEdyb3VwKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkR3JvdXBfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkR3JvdXAoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEdyb3VwX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEdyb3VwKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEdyb3VwXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkR3JvdXAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRHcm91cF8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkR3JvdXAoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkR3JvdXBfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRHcm91cCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRHcm91cF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPiBSZXBlYXRlZE5lc3RlZE1lc3NhZ2VMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkTmVzdGVkTWVzc2FnZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZE5lc3RlZE1lc3NhZ2VDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkTmVzdGVkTWVzc2FnZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSBHZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkTmVzdGVkTWVzc2FnZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkTmVzdGVkTWVzc2FnZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTmVzdGVkTWVzc2FnZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkTmVzdGVkTWVzc2FnZShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkTmVzdGVkTWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBHZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlPiBSZXBlYXRlZEltcG9ydE1lc3NhZ2VMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkSW1wb3J0TWVzc2FnZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEltcG9ydE1lc3NhZ2VDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkSW1wb3J0TWVzc2FnZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlIEdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRNZXNzYWdlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2UoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0TWVzc2FnZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRJbXBvcnRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEltcG9ydE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEltcG9ydE1lc3NhZ2VfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEltcG9ydE1lc3NhZ2Uoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkSW1wb3J0TWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+IFJlcGVhdGVkTmVzdGVkRW51bUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWROZXN0ZWRFbnVtXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkTmVzdGVkRW51bUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWROZXN0ZWRFbnVtQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIEdldFJlcGVhdGVkTmVzdGVkRW51bShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWROZXN0ZWRFbnVtKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWROZXN0ZWRFbnVtKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRFbnVtX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZE5lc3RlZEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRFbnVtXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWROZXN0ZWRFbnVtKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE5lc3RlZEVudW1fLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWROZXN0ZWRFbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE5lc3RlZEVudW1fLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gUmVwZWF0ZWRGb3JlaWduRW51bUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRGb3JlaWduRW51bV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEZvcmVpZ25FbnVtQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEZvcmVpZ25FbnVtQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEdldFJlcGVhdGVkRm9yZWlnbkVudW0oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRm9yZWlnbkVudW0oaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEZvcmVpZ25FbnVtKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduRW51bV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRGb3JlaWduRW51bShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25FbnVtXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRGb3JlaWduRW51bShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduRW51bV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEZvcmVpZ25FbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25FbnVtXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4gUmVwZWF0ZWRJbXBvcnRFbnVtTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEltcG9ydEVudW1fOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRJbXBvcnRFbnVtQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEltcG9ydEVudW1Db3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSBHZXRSZXBlYXRlZEltcG9ydEVudW0oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkSW1wb3J0RW51bShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkSW1wb3J0RW51bShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRFbnVtX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEltcG9ydEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEltcG9ydEVudW1fLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEltcG9ydEVudW0oc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRFbnVtXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkSW1wb3J0RW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRFbnVtXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBSZXBlYXRlZFN0cmluZ1BpZWNlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFN0cmluZ1BpZWNlXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU3RyaW5nUGllY2VDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkU3RyaW5nUGllY2VDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nUGllY2UoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkU3RyaW5nUGllY2UoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZFN0cmluZ1BpZWNlKGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ1BpZWNlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZFN0cmluZ1BpZWNlKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdQaWVjZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkU3RyaW5nUGllY2Uoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ1BpZWNlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkU3RyaW5nUGllY2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxzdHJpbmc+IFJlcGVhdGVkQ29yZExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRDb3JkXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkQ29yZENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRDb3JkQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZENvcmQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkQ29yZChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkQ29yZChpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRDb3JkX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZENvcmQoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZENvcmRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZENvcmQoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZENvcmRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRDb3JkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZENvcmRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdEludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRGVmYXVsdEludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdEludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0SW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRJbnQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEludDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0SW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0SW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRJbnQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRJbnQzMl8gPSA0MTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0SW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0SW50NjQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgRGVmYXVsdEludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdEludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0SW50NjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRJbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRJbnQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEludDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdEludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0SW50NjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0SW50NjRfID0gNDJMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRVaW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0VWludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1aW50IERlZmF1bHRVaW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0VWludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0VWludDMyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0VWludDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFVpbnQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFVpbnQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRVaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRVaW50MzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0VWludDMyXyA9IDQzOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRVaW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0VWludDY0OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBEZWZhdWx0VWludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdFVpbnQ2NDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdFVpbnQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdFVpbnQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0VWludDY0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0VWludDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdFVpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFVpbnQ2NCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRVaW50NjRfID0gNDRVTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U2ludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdFNpbnQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IERlZmF1bHRTaW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0U2ludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0U2ludDMyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0U2ludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ludDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U2ludDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdFNpbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNpbnQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTaW50MzJfID0gLTQ1Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTaW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0U2ludDY0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIERlZmF1bHRTaW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0U2ludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0U2ludDY0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0U2ludDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNpbnQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFNpbnQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRTaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTaW50NjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U2ludDY0XyA9IDQ2Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRGaXhlZDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdEZpeGVkMzI7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgRGVmYXVsdEZpeGVkMzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0Rml4ZWQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdEZpeGVkMzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRGaXhlZDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEZpeGVkMzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRGaXhlZDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdEZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGaXhlZDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEZpeGVkMzJfID0gNDc7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEZpeGVkNjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0Rml4ZWQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgRGVmYXVsdEZpeGVkNjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0Rml4ZWQ2NDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdEZpeGVkNjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRGaXhlZDY0KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGaXhlZDY0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0Rml4ZWQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRGaXhlZDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Rml4ZWQ2NCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRGaXhlZDY0XyA9IDQ4Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTZml4ZWQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRTZml4ZWQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IERlZmF1bHRTZml4ZWQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRTZml4ZWQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdFNmaXhlZDMyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0U2ZpeGVkMzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTZml4ZWQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFNmaXhlZDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdFNmaXhlZDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ZpeGVkMzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U2ZpeGVkMzJfID0gNDk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFNmaXhlZDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdFNmaXhlZDY0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIERlZmF1bHRTZml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRTZml4ZWQ2NDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdFNmaXhlZDY0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0U2ZpeGVkNjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ZpeGVkNjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTZml4ZWQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRTZml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNmaXhlZDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFNmaXhlZDY0XyA9IC01MDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0RmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0RmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IERlZmF1bHRGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRGbG9hdDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdEZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0RmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEZsb2F0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0RmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0RmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGbG9hdCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRGbG9hdF8gPSA1MS41RjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0RG91YmxlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdERvdWJsZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZG91YmxlIERlZmF1bHREb3VibGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0RG91YmxlOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0RG91YmxlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0RG91YmxlKGRvdWJsZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0RG91YmxlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0RG91YmxlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdERvdWJsZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdERvdWJsZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHREb3VibGVfID0gNTIwMDBEOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRCb29sIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdEJvb2w7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRGVmYXVsdEJvb2wgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0Qm9vbDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdEJvb2wodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRCb29sKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEJvb2wgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRCb29sXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdEJvb2woKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRCb29sID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEJvb2xfID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U3RyaW5nIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdFN0cmluZzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIERlZmF1bHRTdHJpbmcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0U3RyaW5nOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0U3RyaW5nKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0U3RyaW5nKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFN0cmluZyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFN0cmluZ18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRTdHJpbmcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTdHJpbmcgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U3RyaW5nXyA9ICJoZWxsbyI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEJ5dGVzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdEJ5dGVzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBEZWZhdWx0Qnl0ZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0Qnl0ZXM7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRCeXRlcyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdEJ5dGVzKHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Qnl0ZXMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRCeXRlc18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRCeXRlcygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEJ5dGVzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEJ5dGVzXyA9IChwYjo6Qnl0ZVN0cmluZykgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IuRmllbGRzWzYyXS5EZWZhdWx0VmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdE5lc3RlZEVudW0gew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHROZXN0ZWRFbnVtOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSBEZWZhdWx0TmVzdGVkRW51bSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHROZXN0ZWRFbnVtOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0TmVzdGVkRW51bSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdE5lc3RlZEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdE5lc3RlZEVudW0gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHROZXN0ZWRFbnVtXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdE5lc3RlZEVudW0oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHROZXN0ZWRFbnVtID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdE5lc3RlZEVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uQkFSOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRGb3JlaWduRW51bSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdEZvcmVpZ25FbnVtOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBEZWZhdWx0Rm9yZWlnbkVudW0gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0Rm9yZWlnbkVudW07IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRGb3JlaWduRW51bSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdEZvcmVpZ25FbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGb3JlaWduRW51bSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEZvcmVpZ25FbnVtXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdEZvcmVpZ25FbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Rm9yZWlnbkVudW0gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0Rm9yZWlnbkVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0uRk9SRUlHTl9CQVI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEltcG9ydEVudW0gew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRJbXBvcnRFbnVtOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtIERlZmF1bHRJbXBvcnRFbnVtIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdEltcG9ydEVudW07IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRJbXBvcnRFbnVtKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0SW1wb3J0RW51bShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRJbXBvcnRFbnVtID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0SW1wb3J0RW51bV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRJbXBvcnRFbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0SW1wb3J0RW51bSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRJbXBvcnRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0uSU1QT1JUX0JBUjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U3RyaW5nUGllY2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0U3RyaW5nUGllY2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBEZWZhdWx0U3RyaW5nUGllY2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0U3RyaW5nUGllY2U7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRTdHJpbmdQaWVjZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdFN0cmluZ1BpZWNlKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFN0cmluZ1BpZWNlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U3RyaW5nUGllY2VfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0U3RyaW5nUGllY2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTdHJpbmdQaWVjZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTdHJpbmdQaWVjZV8gPSAiYWJjIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Q29yZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRDb3JkOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRGVmYXVsdENvcmQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0Q29yZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdENvcmQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRDb3JkKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdENvcmQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRDb3JkXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdENvcmQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRDb3JkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdENvcmRfID0gIjEyMyI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RBbGxUeXBlcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdERlcHJlY2F0ZWRGaWVsZHMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0RGVwcmVjYXRlZEZpZWxkcywgVGVzdERlcHJlY2F0ZWRGaWVsZHMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3REZXByZWNhdGVkRmllbGRzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3REZXByZWNhdGVkRmllbGRzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0RGVwcmVjYXRlZEZpZWxkcygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdERlcHJlY2F0ZWRGaWVsZHNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImRlcHJlY2F0ZWRfaW50MzIiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdERlcHJlY2F0ZWRGaWVsZHNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REZXByZWNhdGVkRmllbGRzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdERlcHJlY2F0ZWRGaWVsZHMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdERlcHJlY2F0ZWRGaWVsZHMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RGVwcmVjYXRlZEZpZWxkc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0RGVwcmVjYXRlZEZpZWxkcywgVGVzdERlcHJlY2F0ZWRGaWVsZHMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdERlcHJlY2F0ZWRGaWVsZHNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlcHJlY2F0ZWRJbnQzMkZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlcHJlY2F0ZWRJbnQzMjsNCisgICAgcHJpdmF0ZSBpbnQgZGVwcmVjYXRlZEludDMyXzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBib29sIEhhc0RlcHJlY2F0ZWRJbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlcHJlY2F0ZWRJbnQzMjsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgaW50IERlcHJlY2F0ZWRJbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlcHJlY2F0ZWRJbnQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3REZXByZWNhdGVkRmllbGRzRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzRGVwcmVjYXRlZEludDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgRGVwcmVjYXRlZEludDMyKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNEZXByZWNhdGVkSW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgRGVwcmVjYXRlZEludDMyKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REZXByZWNhdGVkRmllbGRzIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0RGVwcmVjYXRlZEZpZWxkcyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0RGVwcmVjYXRlZEZpZWxkcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0RGVwcmVjYXRlZEZpZWxkcywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdERlcHJlY2F0ZWRGaWVsZHMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0RGVwcmVjYXRlZEZpZWxkcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3REZXByZWNhdGVkRmllbGRzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdERlcHJlY2F0ZWRGaWVsZHMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3REZXByZWNhdGVkRmllbGRzIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdERlcHJlY2F0ZWRGaWVsZHMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdERlcHJlY2F0ZWRGaWVsZHMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdERlcHJlY2F0ZWRGaWVsZHMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RGVwcmVjYXRlZEZpZWxkcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdERlcHJlY2F0ZWRGaWVsZHMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdERlcHJlY2F0ZWRGaWVsZHMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0RGVwcmVjYXRlZEZpZWxkcyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REZXByZWNhdGVkRmllbGRzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlcHJlY2F0ZWRJbnQzMikgew0KKyAgICAgICAgICBEZXByZWNhdGVkSW50MzIgPSBvdGhlci5EZXByZWNhdGVkSW50MzI7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0RGVwcmVjYXRlZEZpZWxkc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0RGVwcmVjYXRlZEZpZWxkc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVwcmVjYXRlZEludDMyID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZGVwcmVjYXRlZEludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVwcmVjYXRlZEludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVwcmVjYXRlZEludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBpbnQgRGVwcmVjYXRlZEludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVwcmVjYXRlZEludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXREZXByZWNhdGVkSW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlcHJlY2F0ZWRJbnQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVwcmVjYXRlZEludDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZXByZWNhdGVkSW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZXByZWNhdGVkSW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlcHJlY2F0ZWRJbnQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlcHJlY2F0ZWRJbnQzMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRm9yZWlnbk1lc3NhZ2UgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxGb3JlaWduTWVzc2FnZSwgRm9yZWlnbk1lc3NhZ2UuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEZvcmVpZ25NZXNzYWdlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZvcmVpZ25NZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBGb3JlaWduTWVzc2FnZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZm9yZWlnbk1lc3NhZ2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImMiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfZm9yZWlnbk1lc3NhZ2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEZvcmVpZ25NZXNzYWdlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgRm9yZWlnbk1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRm9yZWlnbk1lc3NhZ2UgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb3JlaWduTWVzc2FnZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxGb3JlaWduTWVzc2FnZSwgRm9yZWlnbk1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9yZWlnbk1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IENGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNDOw0KKyAgICBwcml2YXRlIGludCBjXzsNCisgICAgcHVibGljIGJvb2wgSGFzQyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0M7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEMgew0KKyAgICAgIGdldCB7IHJldHVybiBjXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfZm9yZWlnbk1lc3NhZ2VGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNDKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgQyk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzQykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBDKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvcmVpZ25NZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBGb3JlaWduTWVzc2FnZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihGb3JlaWduTWVzc2FnZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxGb3JlaWduTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoRm9yZWlnbk1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBGb3JlaWduTWVzc2FnZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBGb3JlaWduTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEZvcmVpZ25NZXNzYWdlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgRm9yZWlnbk1lc3NhZ2UoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZvcmVpZ25NZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRm9yZWlnbk1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBGb3JlaWduTWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgRm9yZWlnbk1lc3NhZ2UpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRm9yZWlnbk1lc3NhZ2UpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShGb3JlaWduTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0MpIHsNCisgICAgICAgICAgQyA9IG90aGVyLkM7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9mb3JlaWduTWVzc2FnZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9mb3JlaWduTWVzc2FnZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzQyA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNDIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5DOyB9DQorICAgICAgICBzZXQgeyBTZXRDKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRDKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5jXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmNfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgRm9yZWlnbk1lc3NhZ2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RBbGxFeHRlbnNpb25zIDogcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RBbGxFeHRlbnNpb25zLCBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdEFsbEV4dGVuc2lvbnMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdEFsbEV4dGVuc2lvbnMgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RBbGxFeHRlbnNpb25zKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0QWxsRXh0ZW5zaW9uc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0QWxsRXh0ZW5zaW9uc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyAgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RBbGxFeHRlbnNpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RBbGxFeHRlbnNpb25zIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdEFsbEV4dGVuc2lvbnMsIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxFeHRlbnNpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmICghRXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0QWxsRXh0ZW5zaW9uc0ZpZWxkTmFtZXM7DQorICAgICAgcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RBbGxFeHRlbnNpb25zLCBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyPi5FeHRlbnNpb25Xcml0ZXIgZXh0ZW5zaW9uV3JpdGVyID0gQ3JlYXRlRXh0ZW5zaW9uV3JpdGVyKHRoaXMpOw0KKyAgICAgIGV4dGVuc2lvbldyaXRlci5Xcml0ZVVudGlsKDUzNjg3MDkxMiwgb3V0cHV0KTsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBFeHRlbnNpb25zU2VyaWFsaXplZFNpemU7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxFeHRlbnNpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0QWxsRXh0ZW5zaW9ucyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0QWxsRXh0ZW5zaW9ucyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6RXh0ZW5kYWJsZUJ1aWxkZXI8VGVzdEFsbEV4dGVuc2lvbnMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RBbGxFeHRlbnNpb25zIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdEFsbEV4dGVuc2lvbnMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdEFsbEV4dGVuc2lvbnMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RBbGxFeHRlbnNpb25zKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0QWxsRXh0ZW5zaW9ucyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RBbGxFeHRlbnNpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEFsbEV4dGVuc2lvbnMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RBbGxFeHRlbnNpb25zKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RBbGxFeHRlbnNpb25zKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdEFsbEV4dGVuc2lvbnMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9ucy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgdGhpcy5NZXJnZUV4dGVuc2lvbkZpZWxkcyhvdGhlcik7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0QWxsRXh0ZW5zaW9uc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0QWxsRXh0ZW5zaW9uc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgc3RhdGljIFRlc3RBbGxFeHRlbnNpb25zKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLCBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbi5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb24oKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gZGVmYXVsdEluc3RhbmNlID0gbmV3IE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9vcHRpb25hbEdyb3VwRXh0ZW5zaW9uRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX29wdGlvbmFsR3JvdXBFeHRlbnNpb25GaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTM2IH07DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLCBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICBwcml2YXRlIGludCBhXzsNCisgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0E7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfb3B0aW9uYWxHcm91cEV4dGVuc2lvbkZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDE3LCBmaWVsZF9uYW1lc1swXSwgQSk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxNywgQSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoT3B0aW9uYWxHcm91cF9leHRlbnNpb24gcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8T3B0aW9uYWxHcm91cF9leHRlbnNpb24sIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oT3B0aW9uYWxHcm91cF9leHRlbnNpb24gb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PcHRpb25hbEdyb3VwX2V4dGVuc2lvbi5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgIEEgPSBvdGhlci5BOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfb3B0aW9uYWxHcm91cEV4dGVuc2lvbkZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9vcHRpb25hbEdyb3VwRXh0ZW5zaW9uRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEzNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5hXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0E7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0QSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLCBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24oKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gZGVmYXVsdEluc3RhbmNlID0gbmV3IFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9yZXBlYXRlZEdyb3VwRXh0ZW5zaW9uRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3JlcGVhdGVkR3JvdXBFeHRlbnNpb25GaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMzc2IH07DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1JlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLCBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gNDc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICBwcml2YXRlIGludCBhXzsNCisgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0E7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfcmVwZWF0ZWRHcm91cEV4dGVuc2lvbkZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDQ3LCBmaWVsZF9uYW1lc1swXSwgQSk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg0NywgQSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8UmVwZWF0ZWRHcm91cF9leHRlbnNpb24sIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgIEEgPSBvdGhlci5BOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfcmVwZWF0ZWRHcm91cEV4dGVuc2lvbkZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9yZXBlYXRlZEdyb3VwRXh0ZW5zaW9uRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM3Njogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5hXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0E7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0QSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0TmVzdGVkRXh0ZW5zaW9uIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdE5lc3RlZEV4dGVuc2lvbiwgVGVzdE5lc3RlZEV4dGVuc2lvbi5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdE5lc3RlZEV4dGVuc2lvbigpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0TmVzdGVkRXh0ZW5zaW9uIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0TmVzdGVkRXh0ZW5zaW9uKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0TmVzdGVkRXh0ZW5zaW9uRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3ROZXN0ZWRFeHRlbnNpb25GaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbiBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3ROZXN0ZWRFeHRlbnNpb24gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdE5lc3RlZEV4dGVuc2lvbiBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRFeHRlbnNpb25fX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdE5lc3RlZEV4dGVuc2lvbiwgVGVzdE5lc3RlZEV4dGVuc2lvbi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkRXh0ZW5zaW9uX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBUZXN0RmllbGROdW1iZXIgPSAxMDAyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHN0cmluZz4gVGVzdDsNCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3ROZXN0ZWRFeHRlbnNpb25GaWVsZE5hbWVzOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkRXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb24gUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkRXh0ZW5zaW9uIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkRXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb24gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdE5lc3RlZEV4dGVuc2lvbiBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0TmVzdGVkRXh0ZW5zaW9uIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3ROZXN0ZWRFeHRlbnNpb24sIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3ROZXN0ZWRFeHRlbnNpb24gY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0TmVzdGVkRXh0ZW5zaW9uIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3ROZXN0ZWRFeHRlbnNpb24gUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0TmVzdGVkRXh0ZW5zaW9uIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdE5lc3RlZEV4dGVuc2lvbigpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdE5lc3RlZEV4dGVuc2lvbiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRFeHRlbnNpb24uRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE5lc3RlZEV4dGVuc2lvbiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE5lc3RlZEV4dGVuc2lvbiBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdE5lc3RlZEV4dGVuc2lvbikgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0TmVzdGVkRXh0ZW5zaW9uKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdE5lc3RlZEV4dGVuc2lvbiBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRFeHRlbnNpb24uRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0TmVzdGVkRXh0ZW5zaW9uRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3ROZXN0ZWRFeHRlbnNpb25GaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0TmVzdGVkRXh0ZW5zaW9uKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0UmVxdWlyZWQgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0UmVxdWlyZWQsIFRlc3RSZXF1aXJlZC5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdFJlcXVpcmVkKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RSZXF1aXJlZCBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFJlcXVpcmVkKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0UmVxdWlyZWRGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImR1bW15MTAiLCAiZHVtbXkxMSIsICJkdW1teTEyIiwgImR1bW15MTMiLCAiZHVtbXkxNCIsICJkdW1teTE1IiwgImR1bW15MTYiLCAiZHVtbXkxNyIsICJkdW1teTE4IiwgImR1bW15MTkiLCAiZHVtbXkyIiwgImR1bW15MjAiLCAiZHVtbXkyMSIsICJkdW1teTIyIiwgImR1bW15MjMiLCAiZHVtbXkyNCIsICJkdW1teTI1IiwgImR1bW15MjYiLCAiZHVtbXkyNyIsICJkdW1teTI4IiwgImR1bW15MjkiLCAiZHVtbXkzMCIsICJkdW1teTMxIiwgImR1bW15MzIiLCAiZHVtbXk0IiwgImR1bW15NSIsICJkdW1teTYiLCAiZHVtbXk3IiwgImR1bW15OCIsICJkdW1teTkiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFJlcXVpcmVkRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDgsIDI0LCAyNjQsIDgwLCA4OCwgOTYsIDEwNCwgMTEyLCAxMjAsIDEyOCwgMTM2LCAxNDQsIDE1MiwgMTYsIDE2MCwgMTY4LCAxNzYsIDE4NCwgMTkyLCAyMDAsIDIwOCwgMjE2LCAyMjQsIDIzMiwgMjQwLCAyNDgsIDI1NiwgMzIsIDQwLCA0OCwgNTYsIDY0LCA3MiB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZXF1aXJlZCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UmVxdWlyZWQgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVxdWlyZWRfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdFJlcXVpcmVkLCBUZXN0UmVxdWlyZWQuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBTaW5nbGVGaWVsZE51bWJlciA9IDEwMDA7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkPiBTaW5nbGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgTXVsdGlGaWVsZE51bWJlciA9IDEwMDE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQ+PiBNdWx0aTsNCisgICAgcHVibGljIGNvbnN0IGludCBBRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzQTsNCisgICAgcHJpdmF0ZSBpbnQgYV87DQorICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNBOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBBIHsNCisgICAgICBnZXQgeyByZXR1cm4gYV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTJGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTI7DQorICAgIHByaXZhdGUgaW50IGR1bW15Ml87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEJGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNCOw0KKyAgICBwcml2YXRlIGludCBiXzsNCisgICAgcHVibGljIGJvb2wgSGFzQiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0I7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEIgew0KKyAgICAgIGdldCB7IHJldHVybiBiXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15NEZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15NDsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXk0XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXk0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXk0OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTQgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXk1RmllbGROdW1iZXIgPSA1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXk1Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15NSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15NV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTZGaWVsZE51bWJlciA9IDY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTY7DQorICAgIHByaXZhdGUgaW50IGR1bW15Nl87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15NiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15NjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXk2IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXk2XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15N0ZpZWxkTnVtYmVyID0gNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15NzsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXk3XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXk3IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXk3OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTcgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXk4RmllbGROdW1iZXIgPSA4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXk4Ow0KKyAgICBwcml2YXRlIGludCBkdW1teThfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTggew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15OCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15OF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTlGaWVsZE51bWJlciA9IDk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTk7DQorICAgIHByaXZhdGUgaW50IGR1bW15OV87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15OSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15OTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXk5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXk5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MTBGaWVsZE51bWJlciA9IDEwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkxMDsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkxMF87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MTAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTEwOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTEwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkxMF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTExRmllbGROdW1iZXIgPSAxMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MTE7DQorICAgIHByaXZhdGUgaW50IGR1bW15MTFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTExIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkxMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkxMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MTFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkxMkZpZWxkTnVtYmVyID0gMTI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTEyOw0KKyAgICBwcml2YXRlIGludCBkdW1teTEyXzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MTI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MTIgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTEyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MTNGaWVsZE51bWJlciA9IDEzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkxMzsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkxM187DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MTMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTEzOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTEzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkxM187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTE0RmllbGROdW1iZXIgPSAxNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MTQ7DQorICAgIHByaXZhdGUgaW50IGR1bW15MTRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkxNDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkxNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MTRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkxNUZpZWxkTnVtYmVyID0gMTU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTE1Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTE1XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MTU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MTUgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTE1XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MTZGaWVsZE51bWJlciA9IDE2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkxNjsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkxNl87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MTYgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTE2OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTE2IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkxNl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTE3RmllbGROdW1iZXIgPSAxNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MTc7DQorICAgIHByaXZhdGUgaW50IGR1bW15MTdfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE3IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkxNzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkxNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MTdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkxOEZpZWxkTnVtYmVyID0gMTg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTE4Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTE4XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MTg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MTggew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTE4XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MTlGaWVsZE51bWJlciA9IDE5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkxOTsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkxOV87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MTkgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTE5OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTE5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkxOV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTIwRmllbGROdW1iZXIgPSAyMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MjA7DQorICAgIHByaXZhdGUgaW50IGR1bW15MjBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkyMDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkyMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MjBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkyMUZpZWxkTnVtYmVyID0gMjE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTIxOw0KKyAgICBwcml2YXRlIGludCBkdW1teTIxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MjE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MjEgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTIxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MjJGaWVsZE51bWJlciA9IDIyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkyMjsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkyMl87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MjIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTIyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTIyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkyMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTIzRmllbGROdW1iZXIgPSAyMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MjM7DQorICAgIHByaXZhdGUgaW50IGR1bW15MjNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkyMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkyMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MjNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkyNEZpZWxkTnVtYmVyID0gMjQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTI0Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTI0XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MjQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MjQgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTI0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MjVGaWVsZE51bWJlciA9IDI1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkyNTsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkyNV87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MjUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTI1OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTI1IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkyNV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTI2RmllbGROdW1iZXIgPSAyNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MjY7DQorICAgIHByaXZhdGUgaW50IGR1bW15MjZfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkyNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkyNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MjZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkyN0ZpZWxkTnVtYmVyID0gMjc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTI3Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTI3XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15Mjc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15Mjcgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTI3XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MjhGaWVsZE51bWJlciA9IDI4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkyODsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkyOF87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15Mjggew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTI4OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTI4IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkyOF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTI5RmllbGROdW1iZXIgPSAyOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15Mjk7DQorICAgIHByaXZhdGUgaW50IGR1bW15MjlfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkyOTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkyOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MjlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkzMEZpZWxkTnVtYmVyID0gMzA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTMwOw0KKyAgICBwcml2YXRlIGludCBkdW1teTMwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkzMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MzA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MzAgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTMwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MzFGaWVsZE51bWJlciA9IDMxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkzMTsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkzMV87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MzEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTMxOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTMxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkzMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTMyRmllbGROdW1iZXIgPSAzMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MzI7DQorICAgIHByaXZhdGUgaW50IGR1bW15MzJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkzMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQ0ZpZWxkTnVtYmVyID0gMzM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNDOw0KKyAgICBwcml2YXRlIGludCBjXzsNCisgICAgcHVibGljIGJvb2wgSGFzQyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0M7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEMgew0KKyAgICAgIGdldCB7IHJldHVybiBjXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaWYgKCFoYXNBKSByZXR1cm4gZmFsc2U7DQorICAgICAgICBpZiAoIWhhc0IpIHJldHVybiBmYWxzZTsNCisgICAgICAgIGlmICghaGFzQykgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFJlcXVpcmVkRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyLCBmaWVsZF9uYW1lc1sxM10sIER1bW15Mik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNCKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigzLCBmaWVsZF9uYW1lc1sxXSwgQik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDQsIGZpZWxkX25hbWVzWzI3XSwgRHVtbXk0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15NSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNSwgZmllbGRfbmFtZXNbMjhdLCBEdW1teTUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXk2KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig2LCBmaWVsZF9uYW1lc1syOV0sIER1bW15Nik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTcpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDcsIGZpZWxkX25hbWVzWzMwXSwgRHVtbXk3KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15OCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoOCwgZmllbGRfbmFtZXNbMzFdLCBEdW1teTgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXk5KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig5LCBmaWVsZF9uYW1lc1szMl0sIER1bW15OSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTEwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxMCwgZmllbGRfbmFtZXNbM10sIER1bW15MTApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxMSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTEsIGZpZWxkX25hbWVzWzRdLCBEdW1teTExKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEyLCBmaWVsZF9uYW1lc1s1XSwgRHVtbXkxMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTEzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxMywgZmllbGRfbmFtZXNbNl0sIER1bW15MTMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxNCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTQsIGZpZWxkX25hbWVzWzddLCBEdW1teTE0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDE1LCBmaWVsZF9uYW1lc1s4XSwgRHVtbXkxNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTE2KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxNiwgZmllbGRfbmFtZXNbOV0sIER1bW15MTYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxNykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTcsIGZpZWxkX25hbWVzWzEwXSwgRHVtbXkxNyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTE4KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxOCwgZmllbGRfbmFtZXNbMTFdLCBEdW1teTE4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTkpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDE5LCBmaWVsZF9uYW1lc1sxMl0sIER1bW15MTkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjAsIGZpZWxkX25hbWVzWzE0XSwgRHVtbXkyMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTIxKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMSwgZmllbGRfbmFtZXNbMTVdLCBEdW1teTIxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIyLCBmaWVsZF9uYW1lc1sxNl0sIER1bW15MjIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyMykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjMsIGZpZWxkX25hbWVzWzE3XSwgRHVtbXkyMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTI0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyNCwgZmllbGRfbmFtZXNbMThdLCBEdW1teTI0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDI1LCBmaWVsZF9uYW1lc1sxOV0sIER1bW15MjUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyNikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjYsIGZpZWxkX25hbWVzWzIwXSwgRHVtbXkyNik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTI3KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyNywgZmllbGRfbmFtZXNbMjFdLCBEdW1teTI3KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjgpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDI4LCBmaWVsZF9uYW1lc1syMl0sIER1bW15MjgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyOSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjksIGZpZWxkX25hbWVzWzIzXSwgRHVtbXkyOSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTMwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigzMCwgZmllbGRfbmFtZXNbMjRdLCBEdW1teTMwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MzEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDMxLCBmaWVsZF9uYW1lc1syNV0sIER1bW15MzEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMzIsIGZpZWxkX25hbWVzWzI2XSwgRHVtbXkzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNDKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigzMywgZmllbGRfbmFtZXNbMl0sIEMpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgQSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMiwgRHVtbXkyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0IpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMywgQik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNCwgRHVtbXk0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15NSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg1LCBEdW1teTUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXk2KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDYsIER1bW15Nik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNywgRHVtbXk3KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15OCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg4LCBEdW1teTgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXk5KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDksIER1bW15OSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTEwKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEwLCBEdW1teTEwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTEpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTEsIER1bW15MTEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxMiwgRHVtbXkxMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTEzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEzLCBEdW1teTEzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTQsIER1bW15MTQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxNSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxNSwgRHVtbXkxNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTE2KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDE2LCBEdW1teTE2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTcsIER1bW15MTcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxOCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxOCwgRHVtbXkxOCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTE5KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDE5LCBEdW1teTE5KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjAsIER1bW15MjApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyMSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyMSwgRHVtbXkyMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTIyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIyLCBEdW1teTIyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjMsIER1bW15MjMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyNCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyNCwgRHVtbXkyNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTI1KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDI1LCBEdW1teTI1KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjYpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjYsIER1bW15MjYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyNykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyNywgRHVtbXkyNyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTI4KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDI4LCBEdW1teTI4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjkpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjksIER1bW15MjkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkzMCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgzMCwgRHVtbXkzMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTMxKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDMxLCBEdW1teTMxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMzIsIER1bW15MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgzMywgQyk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWQgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWQgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWQgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RSZXF1aXJlZCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0UmVxdWlyZWQgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdFJlcXVpcmVkLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0UmVxdWlyZWQgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0UmVxdWlyZWQgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdFJlcXVpcmVkIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFJlcXVpcmVkIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFJlcXVpcmVkKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UmVxdWlyZWQgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlcXVpcmVkIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZXF1aXJlZCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFJlcXVpcmVkKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RSZXF1aXJlZCkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RSZXF1aXJlZCBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgIEEgPSBvdGhlci5BOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15Mikgew0KKyAgICAgICAgICBEdW1teTIgPSBvdGhlci5EdW1teTI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzQikgew0KKyAgICAgICAgICBCID0gb3RoZXIuQjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTQpIHsNCisgICAgICAgICAgRHVtbXk0ID0gb3RoZXIuRHVtbXk0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15NSkgew0KKyAgICAgICAgICBEdW1teTUgPSBvdGhlci5EdW1teTU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXk2KSB7DQorICAgICAgICAgIER1bW15NiA9IG90aGVyLkR1bW15NjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTcpIHsNCisgICAgICAgICAgRHVtbXk3ID0gb3RoZXIuRHVtbXk3Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15OCkgew0KKyAgICAgICAgICBEdW1teTggPSBvdGhlci5EdW1teTg7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXk5KSB7DQorICAgICAgICAgIER1bW15OSA9IG90aGVyLkR1bW15OTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTEwKSB7DQorICAgICAgICAgIER1bW15MTAgPSBvdGhlci5EdW1teTEwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MTEpIHsNCisgICAgICAgICAgRHVtbXkxMSA9IG90aGVyLkR1bW15MTE7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkxMikgew0KKyAgICAgICAgICBEdW1teTEyID0gb3RoZXIuRHVtbXkxMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTEzKSB7DQorICAgICAgICAgIER1bW15MTMgPSBvdGhlci5EdW1teTEzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MTQpIHsNCisgICAgICAgICAgRHVtbXkxNCA9IG90aGVyLkR1bW15MTQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkxNSkgew0KKyAgICAgICAgICBEdW1teTE1ID0gb3RoZXIuRHVtbXkxNTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTE2KSB7DQorICAgICAgICAgIER1bW15MTYgPSBvdGhlci5EdW1teTE2Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MTcpIHsNCisgICAgICAgICAgRHVtbXkxNyA9IG90aGVyLkR1bW15MTc7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkxOCkgew0KKyAgICAgICAgICBEdW1teTE4ID0gb3RoZXIuRHVtbXkxODsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTE5KSB7DQorICAgICAgICAgIER1bW15MTkgPSBvdGhlci5EdW1teTE5Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MjApIHsNCisgICAgICAgICAgRHVtbXkyMCA9IG90aGVyLkR1bW15MjA7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkyMSkgew0KKyAgICAgICAgICBEdW1teTIxID0gb3RoZXIuRHVtbXkyMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTIyKSB7DQorICAgICAgICAgIER1bW15MjIgPSBvdGhlci5EdW1teTIyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MjMpIHsNCisgICAgICAgICAgRHVtbXkyMyA9IG90aGVyLkR1bW15MjM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkyNCkgew0KKyAgICAgICAgICBEdW1teTI0ID0gb3RoZXIuRHVtbXkyNDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTI1KSB7DQorICAgICAgICAgIER1bW15MjUgPSBvdGhlci5EdW1teTI1Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MjYpIHsNCisgICAgICAgICAgRHVtbXkyNiA9IG90aGVyLkR1bW15MjY7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkyNykgew0KKyAgICAgICAgICBEdW1teTI3ID0gb3RoZXIuRHVtbXkyNzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTI4KSB7DQorICAgICAgICAgIER1bW15MjggPSBvdGhlci5EdW1teTI4Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MjkpIHsNCisgICAgICAgICAgRHVtbXkyOSA9IG90aGVyLkR1bW15Mjk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkzMCkgew0KKyAgICAgICAgICBEdW1teTMwID0gb3RoZXIuRHVtbXkzMDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTMxKSB7DQorICAgICAgICAgIER1bW15MzEgPSBvdGhlci5EdW1teTMxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MzIpIHsNCisgICAgICAgICAgRHVtbXkzMiA9IG90aGVyLkR1bW15MzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzQykgew0KKyAgICAgICAgICBDID0gb3RoZXIuQzsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RSZXF1aXJlZEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0UmVxdWlyZWRGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5hXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15Ml8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNCID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTQgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXk1ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXk1Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15NiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15Nl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTcgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXk4ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXk4Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3Mjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15OSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15OV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTEwID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkxMF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTExID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkxMV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgOTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTEyID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkxMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkxMyA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MTNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDExMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTQgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTE0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMjA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTE1ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkxNV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTI4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkxNiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MTZfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEzNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTcgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTE3Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNDQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTE4ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkxOF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTUyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkxOSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MTlfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjAgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTIwXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTIxID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkyMV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTc2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkyMiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MjJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE4NDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjMgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTIzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxOTI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTI0ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkyNF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjAwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkyNSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MjVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDIwODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjYgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTI2Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTI3ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkyN18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjI0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkyOCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MjhfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDIzMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjkgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTI5Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTMwID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkzMF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQ4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkzMSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MzFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI1Njogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MzIgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNDID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuY18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuYV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0R1bW15MiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkR1bW15MjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNCIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5COyB9DQorICAgICAgICBzZXQgeyBTZXRCKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRCKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNCID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5iXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEdW1teTQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTQ7IH0NCisgICAgICAgIHNldCB7IFNldER1bW15NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXk0KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXk0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZHVtbXk0XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXk1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXk1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRHVtbXk1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXk1OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldER1bW15NShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXk1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEdW1teTUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15NSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15NV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0R1bW15NiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15NjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15NiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkR1bW15NjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXk2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTYoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15NiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXk2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXk2KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTYgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTZfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEdW1teTc7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTc7IH0NCisgICAgICAgIHNldCB7IFNldER1bW15Nyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXk3KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15N18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15NygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXk3ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZHVtbXk3XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXk4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXk4OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRHVtbXk4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXk4OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTgodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldER1bW15OChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXk4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teThfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEdW1teTgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15OCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15OF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0R1bW15OSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15OTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15OSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkR1bW15OTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXk5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTkoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15OSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXk5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXk5KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTEwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTEwOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTEwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTEwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTEwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTEwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTBfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTExIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTExOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTExKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTExKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTExID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTExXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTEyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTEyOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTEyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTEyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTEyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTEyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTEzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTEzOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTEzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTEzKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTEzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTEzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTNfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTE0OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTE0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTE0KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTE0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxNCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxNTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTE1OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTE1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTE1KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTE1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTVfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTE2OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTE2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTE2KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTE2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxNigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTZfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxNzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTE3OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTE3KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTE3KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTE3ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE3XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxNygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxNyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTdfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxODsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTE4OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTE4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTE4KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTE4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE4XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxOCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxOCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MThfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTE5OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTE5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTE5KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTE5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxOSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MjAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTIwOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTIwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTIwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTIwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTIwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjBfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MjEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTIxOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTIxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTIxKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTIxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTIxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MjIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTIyOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTIyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTIyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTIyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTIyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MjMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTIzOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTIzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTIzKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTIzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTIzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjNfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTI0OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTI0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTI0KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTI0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyNCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyNTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MjUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTI1OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTI1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTI1KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTI1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjVfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MjYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTI2OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTI2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTI2KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTI2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyNigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjZfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyNzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15Mjcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTI3OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTI3KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTI3KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTI3ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI3XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyNygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyNyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjdfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyODsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15Mjggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTI4OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTI4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTI4KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTI4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI4XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyOCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyOCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjhfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15Mjkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTI5OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTI5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTI5KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTI5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyOSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTMwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkzMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MzAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTMwOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTMwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTMwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTMwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTMwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkzMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkzMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MzBfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTMxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkzMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MzEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTMxOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTMxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTMxKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTMxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTMxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkzMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkzMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MzFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkzMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTMyOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTMyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MzJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNDIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5DOyB9DQorICAgICAgICBzZXQgeyBTZXRDKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRDKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5jXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmNfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdFJlcXVpcmVkKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0UmVxdWlyZWRGb3JlaWduIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdFJlcXVpcmVkRm9yZWlnbiwgVGVzdFJlcXVpcmVkRm9yZWlnbi5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdFJlcXVpcmVkRm9yZWlnbigpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0UmVxdWlyZWRGb3JlaWduIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0UmVxdWlyZWRGb3JlaWduKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0UmVxdWlyZWRGb3JlaWduRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJkdW1teSIsICJvcHRpb25hbF9tZXNzYWdlIiwgInJlcGVhdGVkX21lc3NhZ2UiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFJlcXVpcmVkRm9yZWlnbkZpZWxkVGFncyA9IG5ldyB1aW50W10geyAyNCwgMTAsIDE4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkRm9yZWlnbiBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZXF1aXJlZEZvcmVpZ24gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFJlcXVpcmVkRm9yZWlnbiBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZEZvcmVpZ25fX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdFJlcXVpcmVkRm9yZWlnbiwgVGVzdFJlcXVpcmVkRm9yZWlnbi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVxdWlyZWRGb3JlaWduX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbE1lc3NhZ2VGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbE1lc3NhZ2U7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkIG9wdGlvbmFsTWVzc2FnZV87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsTWVzc2FnZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQgT3B0aW9uYWxNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxNZXNzYWdlXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRNZXNzYWdlRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZD4gcmVwZWF0ZWRNZXNzYWdlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZD4gUmVwZWF0ZWRNZXNzYWdlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkTWVzc2FnZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkTWVzc2FnZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRNZXNzYWdlXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQgR2V0UmVwZWF0ZWRNZXNzYWdlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZE1lc3NhZ2VfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teUZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15Ow0KKyAgICBwcml2YXRlIGludCBkdW1teV87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoSGFzT3B0aW9uYWxNZXNzYWdlKSB7DQorICAgICAgICAgIGlmICghT3B0aW9uYWxNZXNzYWdlLklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCBlbGVtZW50IGluIFJlcGVhdGVkTWVzc2FnZUxpc3QpIHsNCisgICAgICAgICAgaWYgKCFlbGVtZW50LklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RSZXF1aXJlZEZvcmVpZ25GaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbE1lc3NhZ2UpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMSwgZmllbGRfbmFtZXNbMV0sIE9wdGlvbmFsTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZE1lc3NhZ2VfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDIsIGZpZWxkX25hbWVzWzJdLCByZXBlYXRlZE1lc3NhZ2VfKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigzLCBmaWVsZF9uYW1lc1swXSwgRHVtbXkpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc09wdGlvbmFsTWVzc2FnZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIE9wdGlvbmFsTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCBlbGVtZW50IGluIFJlcGVhdGVkTWVzc2FnZUxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgyLCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDMsIER1bW15KTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkRm9yZWlnbiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRGb3JlaWduIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZEZvcmVpZ24gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZEZvcmVpZ24gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZEZvcmVpZ24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkRm9yZWlnbiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRGb3JlaWduIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZEZvcmVpZ24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkRm9yZWlnbiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRGb3JlaWduIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RSZXF1aXJlZEZvcmVpZ24gTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJlcGVhdGVkTWVzc2FnZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0UmVxdWlyZWRGb3JlaWduIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RSZXF1aXJlZEZvcmVpZ24sIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RSZXF1aXJlZEZvcmVpZ24gY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0UmVxdWlyZWRGb3JlaWduIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RSZXF1aXJlZEZvcmVpZ24gUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0UmVxdWlyZWRGb3JlaWduIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFJlcXVpcmVkRm9yZWlnbigpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFJlcXVpcmVkRm9yZWlnbiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZEZvcmVpZ24uRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlcXVpcmVkRm9yZWlnbiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWRGb3JlaWduLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlcXVpcmVkRm9yZWlnbiBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFJlcXVpcmVkRm9yZWlnbikgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0UmVxdWlyZWRGb3JlaWduKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdFJlcXVpcmVkRm9yZWlnbiBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZEZvcmVpZ24uRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxNZXNzYWdlKSB7DQorICAgICAgICAgIE1lcmdlT3B0aW9uYWxNZXNzYWdlKG90aGVyLk9wdGlvbmFsTWVzc2FnZSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRNZXNzYWdlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VfLkFkZChvdGhlci5yZXBlYXRlZE1lc3NhZ2VfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teSkgew0KKyAgICAgICAgICBEdW1teSA9IG90aGVyLkR1bW15Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdFJlcXVpcmVkRm9yZWlnbkZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0UmVxdWlyZWRGb3JlaWduRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzT3B0aW9uYWxNZXNzYWdlKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKE9wdGlvbmFsTWVzc2FnZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBPcHRpb25hbE1lc3NhZ2UgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTg6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRNZXNzYWdlXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxNZXNzYWdlIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbE1lc3NhZ2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCBPcHRpb25hbE1lc3NhZ2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbE1lc3NhZ2U7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsTWVzc2FnZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTWVzc2FnZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbmFsTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbE1lc3NhZ2UgJiYNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxNZXNzYWdlXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTWVzc2FnZV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxNZXNzYWdlXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsTWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxNZXNzYWdlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxNZXNzYWdlXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQ+IFJlcGVhdGVkTWVzc2FnZUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRNZXNzYWdlXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkTWVzc2FnZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRNZXNzYWdlQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCBHZXRSZXBlYXRlZE1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkTWVzc2FnZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkTWVzc2FnZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZE1lc3NhZ2UoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZE1lc3NhZ2Uoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRNZXNzYWdlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEdW1teTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXk7IH0NCisgICAgICAgIHNldCB7IFNldER1bW15KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZHVtbXlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdFJlcXVpcmVkRm9yZWlnbigpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdEZvcmVpZ25OZXN0ZWQgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0Rm9yZWlnbk5lc3RlZCwgVGVzdEZvcmVpZ25OZXN0ZWQuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RGb3JlaWduTmVzdGVkKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RGb3JlaWduTmVzdGVkIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0Rm9yZWlnbk5lc3RlZCgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdEZvcmVpZ25OZXN0ZWRGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImZvcmVpZ25fbmVzdGVkIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RGb3JlaWduTmVzdGVkRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZvcmVpZ25OZXN0ZWQgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0Rm9yZWlnbk5lc3RlZCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0Rm9yZWlnbk5lc3RlZCBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGb3JlaWduTmVzdGVkX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RGb3JlaWduTmVzdGVkLCBUZXN0Rm9yZWlnbk5lc3RlZC5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Rm9yZWlnbk5lc3RlZF9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRm9yZWlnbk5lc3RlZEZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZvcmVpZ25OZXN0ZWQ7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgZm9yZWlnbk5lc3RlZF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZvcmVpZ25OZXN0ZWQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGb3JlaWduTmVzdGVkOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIEZvcmVpZ25OZXN0ZWQgew0KKyAgICAgIGdldCB7IHJldHVybiBmb3JlaWduTmVzdGVkXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RGb3JlaWduTmVzdGVkRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzRm9yZWlnbk5lc3RlZCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZSgxLCBmaWVsZF9uYW1lc1swXSwgRm9yZWlnbk5lc3RlZCk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzRm9yZWlnbk5lc3RlZCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIEZvcmVpZ25OZXN0ZWQpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Rm9yZWlnbk5lc3RlZCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Rm9yZWlnbk5lc3RlZCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Rm9yZWlnbk5lc3RlZCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZvcmVpZ25OZXN0ZWQgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RGb3JlaWduTmVzdGVkIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RGb3JlaWduTmVzdGVkIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RGb3JlaWduTmVzdGVkLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0Rm9yZWlnbk5lc3RlZCBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RGb3JlaWduTmVzdGVkIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RGb3JlaWduTmVzdGVkIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdEZvcmVpZ25OZXN0ZWQgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0Rm9yZWlnbk5lc3RlZCgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEZvcmVpZ25OZXN0ZWQgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0Rm9yZWlnbk5lc3RlZC5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0Rm9yZWlnbk5lc3RlZCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0Rm9yZWlnbk5lc3RlZC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RGb3JlaWduTmVzdGVkIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0Rm9yZWlnbk5lc3RlZCkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0Rm9yZWlnbk5lc3RlZCkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RGb3JlaWduTmVzdGVkIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZvcmVpZ25OZXN0ZWQuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRm9yZWlnbk5lc3RlZCkgew0KKyAgICAgICAgICBNZXJnZUZvcmVpZ25OZXN0ZWQob3RoZXIuRm9yZWlnbk5lc3RlZCk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0Rm9yZWlnbk5lc3RlZEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0Rm9yZWlnbk5lc3RlZEZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNGb3JlaWduTmVzdGVkKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKEZvcmVpZ25OZXN0ZWQpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgRm9yZWlnbk5lc3RlZCA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRm9yZWlnbk5lc3RlZCB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRm9yZWlnbk5lc3RlZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgRm9yZWlnbk5lc3RlZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZvcmVpZ25OZXN0ZWQ7IH0NCisgICAgICAgIHNldCB7IFNldEZvcmVpZ25OZXN0ZWQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZvcmVpZ25OZXN0ZWQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZvcmVpZ25OZXN0ZWQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZvcmVpZ25OZXN0ZWRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Rm9yZWlnbk5lc3RlZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGb3JlaWduTmVzdGVkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5mb3JlaWduTmVzdGVkXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlRm9yZWlnbk5lc3RlZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0ZvcmVpZ25OZXN0ZWQgJiYNCisgICAgICAgICAgICByZXN1bHQuZm9yZWlnbk5lc3RlZF8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmZvcmVpZ25OZXN0ZWRfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQuZm9yZWlnbk5lc3RlZF8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuZm9yZWlnbk5lc3RlZF8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNGb3JlaWduTmVzdGVkID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZvcmVpZ25OZXN0ZWQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZvcmVpZ25OZXN0ZWQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5mb3JlaWduTmVzdGVkXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0RW1wdHlNZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdEVtcHR5TWVzc2FnZSwgVGVzdEVtcHR5TWVzc2FnZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdEVtcHR5TWVzc2FnZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0RW1wdHlNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0RW1wdHlNZXNzYWdlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0RW1wdHlNZXNzYWdlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RFbXB0eU1lc3NhZ2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RFbXB0eU1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEVtcHR5TWVzc2FnZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbXB0eU1lc3NhZ2VfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdEVtcHR5TWVzc2FnZSwgVGVzdEVtcHR5TWVzc2FnZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RFbXB0eU1lc3NhZ2VGaWVsZE5hbWVzOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdEVtcHR5TWVzc2FnZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0RW1wdHlNZXNzYWdlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RFbXB0eU1lc3NhZ2UsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RFbXB0eU1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0RW1wdHlNZXNzYWdlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RFbXB0eU1lc3NhZ2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0RW1wdHlNZXNzYWdlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdEVtcHR5TWVzc2FnZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEVtcHR5TWVzc2FnZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFbXB0eU1lc3NhZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEVtcHR5TWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEVtcHR5TWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdEVtcHR5TWVzc2FnZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0RW1wdHlNZXNzYWdlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdEVtcHR5TWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFbXB0eU1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0RW1wdHlNZXNzYWdlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RFbXB0eU1lc3NhZ2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgOiBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8VGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLCBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyAgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucywgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIUV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zRmllbGROYW1lczsNCisgICAgICBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8VGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLCBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMuQnVpbGRlcj4uRXh0ZW5zaW9uV3JpdGVyIGV4dGVuc2lvbldyaXRlciA9IENyZWF0ZUV4dGVuc2lvbldyaXRlcih0aGlzKTsNCisgICAgICBleHRlbnNpb25Xcml0ZXIuV3JpdGVVbnRpbCg1MzY4NzA5MTIsIG91dHB1dCk7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHNpemUgKz0gRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkV4dGVuZGFibGVCdWlsZGVyPFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgIHRoaXMuTWVyZ2VFeHRlbnNpb25GaWVsZHMob3RoZXIpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIDogcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcywgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMsIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaWYgKCFFeHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlc0ZpZWxkTmFtZXM7DQorICAgICAgcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcywgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLkJ1aWxkZXI+LkV4dGVuc2lvbldyaXRlciBleHRlbnNpb25Xcml0ZXIgPSBDcmVhdGVFeHRlbnNpb25Xcml0ZXIodGhpcyk7DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoNDMsIG91dHB1dCk7DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoNDI0NCwgb3V0cHV0KTsNCisgICAgICBleHRlbnNpb25Xcml0ZXIuV3JpdGVVbnRpbCg1MzY4NzA5MTIsIG91dHB1dCk7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHNpemUgKz0gRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkV4dGVuZGFibGVCdWlsZGVyPFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgIHRoaXMuTWVyZ2VFeHRlbnNpb25GaWVsZHMob3RoZXIpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgc3RhdGljIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyLCBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlcigpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlcigpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiwgImJiIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RSZWFsbHlMYXJnZVRhZ051bWJlckZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4LCAyMTQ3NDgzNjQwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZWFsbHlMYXJnZVRhZ051bWJlcl9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIsIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlci5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICBwcml2YXRlIGludCBhXzsNCisgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0E7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEJiRmllbGROdW1iZXIgPSAyNjg0MzU0NTU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNCYjsNCisgICAgcHJpdmF0ZSBpbnQgYmJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNCYiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0JiOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBCYiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGJiXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQmIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDI2ODQzNTQ1NSwgZmllbGRfbmFtZXNbMV0sIEJiKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIEEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQmIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjY4NDM1NDU1LCBCYik7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWFsbHlMYXJnZVRhZ051bWJlci5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlcikgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWFsbHlMYXJnZVRhZ051bWJlci5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgIEEgPSBvdGhlci5BOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0JiKSB7DQorICAgICAgICAgIEJiID0gb3RoZXIuQmI7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXJGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjE0NzQ4MzY0MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0JiID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYmJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BOyB9DQorICAgICAgICBzZXQgeyBTZXRBKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRBKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNCYiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0JiOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgQmIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5CYjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0QmIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEJiKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNCYiA9IHRydWU7DQorICAgICAgICByZXN1bHQuYmJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJCYigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5iYl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RSZWN1cnNpdmVNZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdFJlY3Vyc2l2ZU1lc3NhZ2UsIFRlc3RSZWN1cnNpdmVNZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RSZWN1cnNpdmVNZXNzYWdlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiwgImkiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFJlY3Vyc2l2ZU1lc3NhZ2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAsIDE2IH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZWN1cnNpdmVNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RSZWN1cnNpdmVNZXNzYWdlLCBUZXN0UmVjdXJzaXZlTWVzc2FnZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVjdXJzaXZlTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0E7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgYV87DQorICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNBOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlIEEgew0KKyAgICAgIGdldCB7IHJldHVybiBhXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVjdXJzaXZlTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBJRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzSTsNCisgICAgcHJpdmF0ZSBpbnQgaV87DQorICAgIHB1YmxpYyBib29sIEhhc0kgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNJOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBJIHsNCisgICAgICBnZXQgeyByZXR1cm4gaV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RSZWN1cnNpdmVNZXNzYWdlRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZSgxLCBmaWVsZF9uYW1lc1swXSwgQSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNJKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyLCBmaWVsZF9uYW1lc1sxXSwgSSk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIEEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyLCBJKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWN1cnNpdmVNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0UmVjdXJzaXZlTWVzc2FnZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0UmVjdXJzaXZlTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RSZWN1cnNpdmVNZXNzYWdlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RSZWN1cnNpdmVNZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0UmVjdXJzaXZlTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0EpIHsNCisgICAgICAgICAgTWVyZ2VBKG90aGVyLkEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0kpIHsNCisgICAgICAgICAgSSA9IG90aGVyLkk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0UmVjdXJzaXZlTWVzc2FnZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0UmVjdXJzaXZlTWVzc2FnZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNBKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKEEpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgQSA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0kgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5pXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVjdXJzaXZlTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlQShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVjdXJzaXZlTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0EgJiYNCisgICAgICAgICAgICByZXN1bHQuYV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmFfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQuYV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzSSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0k7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBJIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0SSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0SShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSSA9IHRydWU7DQorICAgICAgICByZXN1bHQuaV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0kgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5pXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RSZWN1cnNpdmVNZXNzYWdlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0TXV0dWFsUmVjdXJzaW9uQSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RNdXR1YWxSZWN1cnNpb25BLCBUZXN0TXV0dWFsUmVjdXJzaW9uQS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdE11dHVhbFJlY3Vyc2lvbkEoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdE11dHVhbFJlY3Vyc2lvbkEgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RNdXR1YWxSZWN1cnNpb25BKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0TXV0dWFsUmVjdXJzaW9uQUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYmIiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdE11dHVhbFJlY3Vyc2lvbkFGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RNdXR1YWxSZWN1cnNpb25BIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNdXR1YWxSZWN1cnNpb25BIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11dHVhbFJlY3Vyc2lvbkFfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdE11dHVhbFJlY3Vyc2lvbkEsIFRlc3RNdXR1YWxSZWN1cnNpb25BLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25BX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBCYkZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0JiOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CIGJiXzsNCisgICAgcHVibGljIGJvb2wgSGFzQmIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNCYjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQiBCYiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGJiXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQi5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RNdXR1YWxSZWN1cnNpb25BRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzQmIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMSwgZmllbGRfbmFtZXNbMF0sIEJiKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNCYikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIEJiKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkEgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkEgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkEgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdXR1YWxSZWN1cnNpb25BIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0TXV0dWFsUmVjdXJzaW9uQSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0TXV0dWFsUmVjdXJzaW9uQSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0TXV0dWFsUmVjdXJzaW9uQSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdE11dHVhbFJlY3Vyc2lvbkEgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0TXV0dWFsUmVjdXJzaW9uQSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RNdXR1YWxSZWN1cnNpb25BIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdE11dHVhbFJlY3Vyc2lvbkEoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNdXR1YWxSZWN1cnNpb25BIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE11dHVhbFJlY3Vyc2lvbkEgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TXV0dWFsUmVjdXJzaW9uQSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdE11dHVhbFJlY3Vyc2lvbkEpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdE11dHVhbFJlY3Vyc2lvbkEpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0TXV0dWFsUmVjdXJzaW9uQSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0JiKSB7DQorICAgICAgICAgIE1lcmdlQmIob3RoZXIuQmIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdE11dHVhbFJlY3Vyc2lvbkFGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdE11dHVhbFJlY3Vyc2lvbkFGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzQmIpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oQmIpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgQmIgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0JiIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNCYjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIgQmIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5CYjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0QmIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEJiKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNCYiA9IHRydWU7DQorICAgICAgICByZXN1bHQuYmJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QmIoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmJiXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlQmIoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNCYiAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5iYl8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmJiXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmJiXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5iYl8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNCYiA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJCYigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5iYl8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdE11dHVhbFJlY3Vyc2lvbkIgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0TXV0dWFsUmVjdXJzaW9uQiwgVGVzdE11dHVhbFJlY3Vyc2lvbkIuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RNdXR1YWxSZWN1cnNpb25CKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RNdXR1YWxSZWN1cnNpb25CIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0TXV0dWFsUmVjdXJzaW9uQigpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdE11dHVhbFJlY3Vyc2lvbkJGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImEiLCAib3B0aW9uYWxfaW50MzIiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdE11dHVhbFJlY3Vyc2lvbkJGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAsIDE2IH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TXV0dWFsUmVjdXJzaW9uQiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0TXV0dWFsUmVjdXJzaW9uQiBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25CX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RNdXR1YWxSZWN1cnNpb25CLCBUZXN0TXV0dWFsUmVjdXJzaW9uQi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0E7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEgYV87DQorICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNBOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BIEEgew0KKyAgICAgIGdldCB7IHJldHVybiBhXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEludDMyRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxJbnQzMjsNCisgICAgcHJpdmF0ZSBpbnQgb3B0aW9uYWxJbnQzMl87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbEludDMyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBPcHRpb25hbEludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxJbnQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RNdXR1YWxSZWN1cnNpb25CRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZSgxLCBmaWVsZF9uYW1lc1swXSwgQSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEludDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyLCBmaWVsZF9uYW1lc1sxXSwgT3B0aW9uYWxJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIEEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbnQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyLCBPcHRpb25hbEludDMyKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdXR1YWxSZWN1cnNpb25CIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0TXV0dWFsUmVjdXJzaW9uQiBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0TXV0dWFsUmVjdXJzaW9uQiBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0TXV0dWFsUmVjdXJzaW9uQiwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdE11dHVhbFJlY3Vyc2lvbkIgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0TXV0dWFsUmVjdXJzaW9uQiByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RNdXR1YWxSZWN1cnNpb25CIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdE11dHVhbFJlY3Vyc2lvbkIoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNdXR1YWxSZWN1cnNpb25CIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE11dHVhbFJlY3Vyc2lvbkIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TXV0dWFsUmVjdXJzaW9uQiBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdE11dHVhbFJlY3Vyc2lvbkIpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdE11dHVhbFJlY3Vyc2lvbkIpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0TXV0dWFsUmVjdXJzaW9uQiBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0EpIHsNCisgICAgICAgICAgTWVyZ2VBKG90aGVyLkEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsSW50MzIpIHsNCisgICAgICAgICAgT3B0aW9uYWxJbnQzMiA9IG90aGVyLk9wdGlvbmFsSW50MzI7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0TXV0dWFsUmVjdXJzaW9uQkZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0TXV0dWFsUmVjdXJzaW9uQkZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNBKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKEEpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgQSA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW50MzIgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5vcHRpb25hbEludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEgQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlQShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0EgJiYNCisgICAgICAgICAgICByZXN1bHQuYV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmFfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuQ3JlYXRlQnVpbGRlcihyZXN1bHQuYV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxJbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsSW50MzI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBPcHRpb25hbEludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxJbnQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxJbnQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxJbnQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbnQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbnQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsSW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW50MzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEludDMyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RNdXR1YWxSZWN1cnNpb25CKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0RHVwRmllbGROdW1iZXIgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0RHVwRmllbGROdW1iZXIsIFRlc3REdXBGaWVsZE51bWJlci5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdER1cEZpZWxkTnVtYmVyKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3REdXBGaWVsZE51bWJlciBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdER1cEZpZWxkTnVtYmVyKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0RHVwRmllbGROdW1iZXJGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImEiLCAiYmFyIiwgImZvbyIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0RHVwRmllbGROdW1iZXJGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCwgMjcsIDE5IH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER1cEZpZWxkTnVtYmVyIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdER1cEZpZWxkTnVtYmVyIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3REdXBGaWVsZE51bWJlciBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0RHVwRmllbGROdW1iZXIsIFRlc3REdXBGaWVsZE51bWJlci5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgew0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEZvbyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPEZvbywgRm9vLkJ1aWxkZXI+IHsNCisgICAgICAgIHByaXZhdGUgRm9vKCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGb28gZGVmYXVsdEluc3RhbmNlID0gbmV3IEZvbygpLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2Zvb0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYSIgfTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfZm9vRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDggfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRm9vIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEZvbyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRm9vIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfRm9vX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEZvbywgRm9vLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfRm9vX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBBRmllbGROdW1iZXIgPSAxOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0E7DQorICAgICAgICBwcml2YXRlIGludCBhXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzQTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGFfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2Zvb0ZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBBKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRm9vIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvbyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGb28gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvbyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRm9vIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvbyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGb28gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRm9vIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvbyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGb28gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgRm9vIE1ha2VSZWFkT25seSgpIHsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihGb28gcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxGb28sIEJ1aWxkZXI+IHsNCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludGVybmFsIEJ1aWxkZXIoRm9vIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgRm9vIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgRm9vIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICBGb28gb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgRm9vKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZvbyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEZvbyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvby5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEZvbyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgaXMgRm9vKSB7DQorICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChGb28pIG90aGVyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRm9vIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28uRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfZm9vRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgICAgICB0YWcgPSBfZm9vRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYV8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0E7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5hXyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0YXRpYyBGb28oKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJhciA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPEJhciwgQmFyLkJ1aWxkZXI+IHsNCisgICAgICAgIHByaXZhdGUgQmFyKCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBCYXIgZGVmYXVsdEluc3RhbmNlID0gbmV3IEJhcigpLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2JhckZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYSIgfTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfYmFyRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDggfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFyIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJhciBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQmFyIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfQmFyX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEJhciwgQmFyLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfQmFyX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBBRmllbGROdW1iZXIgPSAxOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0E7DQorICAgICAgICBwcml2YXRlIGludCBhXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzQTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGFfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2JhckZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBBKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFyIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJhciBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCYXIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJhciBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFyIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJhciBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCYXIgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFyIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJhciBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCYXIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgQmFyIE1ha2VSZWFkT25seSgpIHsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihCYXIgcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxCYXIsIEJ1aWxkZXI+IHsNCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludGVybmFsIEJ1aWxkZXIoQmFyIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgQmFyIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgQmFyIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICBCYXIgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQmFyKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJhciBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJhciBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhci5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJhciBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgaXMgQmFyKSB7DQorICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChCYXIpIG90aGVyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oQmFyIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfYmFyRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgICAgICB0YWcgPSBfYmFyRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYV8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0E7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5hXyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0YXRpYyBCYXIoKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0E7DQorICAgIHByaXZhdGUgaW50IGFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRm9vRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRm9vOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28gZm9vXzsNCisgICAgcHVibGljIGJvb2wgSGFzRm9vIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRm9vOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28gRm9vIHsNCisgICAgICBnZXQgeyByZXR1cm4gZm9vXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEJhckZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0JhcjsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyIGJhcl87DQorICAgIHB1YmxpYyBib29sIEhhc0JhciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0JhcjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyIEJhciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGJhcl8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhci5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3REdXBGaWVsZE51bWJlckZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzBdLCBBKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0Zvbykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlR3JvdXAoMiwgZmllbGRfbmFtZXNbMl0sIEZvbyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNCYXIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUdyb3VwKDMsIGZpZWxkX25hbWVzWzFdLCBCYXIpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgQSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGb28pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVHcm91cFNpemUoMiwgRm9vKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0Jhcikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUdyb3VwU2l6ZSgzLCBCYXIpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHVwRmllbGROdW1iZXIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER1cEZpZWxkTnVtYmVyIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REdXBGaWVsZE51bWJlciBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER1cEZpZWxkTnVtYmVyIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHVwRmllbGROdW1iZXIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER1cEZpZWxkTnVtYmVyIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REdXBGaWVsZE51bWJlciBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHVwRmllbGROdW1iZXIgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER1cEZpZWxkTnVtYmVyIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REdXBGaWVsZE51bWJlciBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0RHVwRmllbGROdW1iZXIgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdER1cEZpZWxkTnVtYmVyIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3REdXBGaWVsZE51bWJlciwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdER1cEZpZWxkTnVtYmVyIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdER1cEZpZWxkTnVtYmVyIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3REdXBGaWVsZE51bWJlciBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3REdXBGaWVsZE51bWJlciBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3REdXBGaWVsZE51bWJlcigpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdER1cEZpZWxkTnVtYmVyIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3REdXBGaWVsZE51bWJlciBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RHVwRmllbGROdW1iZXIgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3REdXBGaWVsZE51bWJlcikgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0RHVwRmllbGROdW1iZXIpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0RHVwRmllbGROdW1iZXIgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzQSkgew0KKyAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGb28pIHsNCisgICAgICAgICAgTWVyZ2VGb28ob3RoZXIuRm9vKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNCYXIpIHsNCisgICAgICAgICAgTWVyZ2VCYXIob3RoZXIuQmFyKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3REdXBGaWVsZE51bWJlckZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0RHVwRmllbGROdW1iZXJGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5hXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxOTogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvby5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzRm9vKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKEZvbyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkR3JvdXAoMiwgc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgRm9vID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI3OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNCYXIpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oQmFyKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRHcm91cCgzLCBzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBCYXIgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuYV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZvbyB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRm9vOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vIEZvbyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZvbzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Rm9vKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGb28oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvbyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRm9vID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5mb29fID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Rm9vKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRm9vID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5mb29fID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VGb28oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvbyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0ZvbyAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5mb29fICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28uRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmZvb18gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmZvb18pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuZm9vXyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc0ZvbyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGb28oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZvbyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZvb18gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0JhciB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQmFyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyIEJhciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkJhcjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0QmFyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRCYXIoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhciB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmFyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5iYXJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QmFyKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmFyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5iYXJfID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VCYXIoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhciB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0JhciAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5iYXJfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmJhcl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmJhcl8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuYmFyXyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc0JhciA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJCYXIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0JhciA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmJhcl8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0RHVwRmllbGROdW1iZXIoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cywgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMsIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgew0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE5lc3RlZE1lc3NhZ2UgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxOZXN0ZWRNZXNzYWdlLCBOZXN0ZWRNZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgICAgIHByaXZhdGUgTmVzdGVkTWVzc2FnZSgpIHsgfQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTmVzdGVkTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgTmVzdGVkTWVzc2FnZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX25lc3RlZE1lc3NhZ2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIm5lc3RlZG1lc3NhZ2VfcmVwZWF0ZWRfZm9yZWlnbm1lc3NhZ2UiLCAibmVzdGVkbWVzc2FnZV9yZXBlYXRlZF9pbnQzMiIgfTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfbmVzdGVkTWVzc2FnZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxOCwgOCB9Ow0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgVGhpc01lc3NhZ2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19OZXN0ZWRNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPE5lc3RlZE1lc3NhZ2UsIE5lc3RlZE1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19OZXN0ZWRNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMkZpZWxkTnVtYmVyID0gMTsNCisgICAgICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICAgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMkxpc3Qgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyXyk7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJDb3VudCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl8uQ291bnQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgR2V0TmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICAgIHJldHVybiBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl9baW5kZXhdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlRmllbGROdW1iZXIgPSAyOw0KKyAgICAgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gbmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPigpOw0KKyAgICAgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlTGlzdCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV87IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgTmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VDb3VudCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8uQ291bnQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBHZXROZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZShpbnQgaW5kZXgpIHsNCisgICAgICAgICAgcmV0dXJuIG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlX1tpbmRleF07DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX25lc3RlZE1lc3NhZ2VGaWVsZE5hbWVzOw0KKyAgICAgICAgICBpZiAobmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyQXJyYXkoMSwgZmllbGRfbmFtZXNbMV0sIG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyXyk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlQXJyYXkoMiwgZmllbGRfbmFtZXNbMF0sIG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXyk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgIA0KKyAgICAgICAgICBzaXplID0gMDsNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICAgICAgZm9yZWFjaCAoaW50IGVsZW1lbnQgaW4gTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJMaXN0KSB7DQorICAgICAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICAgIHNpemUgKz0gMSAqIG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyXy5Db3VudDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBlbGVtZW50IGluIE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlTGlzdCkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgyLCBlbGVtZW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIE5lc3RlZE1lc3NhZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihOZXN0ZWRNZXNzYWdlIHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8TmVzdGVkTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihOZXN0ZWRNZXNzYWdlIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgTmVzdGVkTWVzc2FnZSByZXN1bHQ7DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIE5lc3RlZE1lc3NhZ2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIE5lc3RlZE1lc3NhZ2Ugb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgTmVzdGVkTWVzc2FnZSgpOw0KKyAgICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBOZXN0ZWRNZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgTmVzdGVkTWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgaXMgTmVzdGVkTWVzc2FnZSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoTmVzdGVkTWVzc2FnZSkgb3RoZXIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShOZXN0ZWRNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIubmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgICAgIHJlc3VsdC5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl8uQWRkKG90aGVyLm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyXyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICAgICAgcmVzdWx0Lm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXy5BZGQob3RoZXIubmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfbmVzdGVkTWVzc2FnZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX25lc3RlZE1lc3NhZ2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAxMDoNCisgICAgICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICAgICAgaW5wdXQuUmVhZEludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDE4OiB7DQorICAgICAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJMaXN0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl87IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyQ291bnQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJDb3VudDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgR2V0TmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXROZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMihpbmRleCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMihzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzIoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfLkNsZWFyKCk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlTGlzdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkubmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZUNvdW50IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlQ291bnQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgR2V0TmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXROZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZShpbmRleCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2UoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8uQWRkKHZhbHVlKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGROZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZU5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IHZhbHVlcykgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXy5BZGQodmFsdWVzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXy5DbGVhcigpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgTmVzdGVkTWVzc2FnZSgpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbE5lc3RlZE1lc3NhZ2VGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2U7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxOZXN0ZWRNZXNzYWdlXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMSwgZmllbGRfbmFtZXNbMF0sIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMSwgT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSkgew0KKyAgICAgICAgICBNZXJnZU9wdGlvbmFsTmVzdGVkTWVzc2FnZShvdGhlci5PcHRpb25hbE5lc3RlZE1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsTmVzdGVkTWVzc2FnZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbmFsTmVzdGVkTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuVHlwZXMuTmVzdGVkTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsTmVzdGVkTWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0Q2FtZWxDYXNlRmllbGROYW1lcywgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdENhbWVsQ2FzZUZpZWxkTmFtZXNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIkNvcmRGaWVsZCIsICJFbnVtRmllbGQiLCAiTWVzc2FnZUZpZWxkIiwgIlByaW1pdGl2ZUZpZWxkIiwgIlJlcGVhdGVkQ29yZEZpZWxkIiwgIlJlcGVhdGVkRW51bUZpZWxkIiwgIlJlcGVhdGVkTWVzc2FnZUZpZWxkIiwgIlJlcGVhdGVkUHJpbWl0aXZlRmllbGQiLCAiUmVwZWF0ZWRTdHJpbmdGaWVsZCIsICJSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGQiLCAiU3RyaW5nRmllbGQiLCAiU3RyaW5nUGllY2VGaWVsZCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0Q2FtZWxDYXNlRmllbGROYW1lc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyA1MCwgMjQsIDM0LCA4LCA5OCwgNzIsIDgyLCA1NiwgNjYsIDkwLCAxOCwgNDIgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMsIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQcmltaXRpdmVGaWVsZEZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc1ByaW1pdGl2ZUZpZWxkOw0KKyAgICBwcml2YXRlIGludCBwcmltaXRpdmVGaWVsZF87DQorICAgIHB1YmxpYyBib29sIEhhc1ByaW1pdGl2ZUZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzUHJpbWl0aXZlRmllbGQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFByaW1pdGl2ZUZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gcHJpbWl0aXZlRmllbGRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgU3RyaW5nRmllbGRGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNTdHJpbmdGaWVsZDsNCisgICAgcHJpdmF0ZSBzdHJpbmcgc3RyaW5nRmllbGRfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc1N0cmluZ0ZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzU3RyaW5nRmllbGQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIFN0cmluZ0ZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gc3RyaW5nRmllbGRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRW51bUZpZWxkRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRW51bUZpZWxkOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIGVudW1GaWVsZF8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPTzsNCisgICAgcHVibGljIGJvb2wgSGFzRW51bUZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRW51bUZpZWxkOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEVudW1GaWVsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGVudW1GaWVsZF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBNZXNzYWdlRmllbGRGaWVsZE51bWJlciA9IDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNNZXNzYWdlRmllbGQ7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgbWVzc2FnZUZpZWxkXzsNCisgICAgcHVibGljIGJvb2wgSGFzTWVzc2FnZUZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTWVzc2FnZUZpZWxkOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIE1lc3NhZ2VGaWVsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG1lc3NhZ2VGaWVsZF8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgU3RyaW5nUGllY2VGaWVsZEZpZWxkTnVtYmVyID0gNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc1N0cmluZ1BpZWNlRmllbGQ7DQorICAgIHByaXZhdGUgc3RyaW5nIHN0cmluZ1BpZWNlRmllbGRfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc1N0cmluZ1BpZWNlRmllbGQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNTdHJpbmdQaWVjZUZpZWxkOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBTdHJpbmdQaWVjZUZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gc3RyaW5nUGllY2VGaWVsZF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBDb3JkRmllbGRGaWVsZE51bWJlciA9IDY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNDb3JkRmllbGQ7DQorICAgIHByaXZhdGUgc3RyaW5nIGNvcmRGaWVsZF8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzQ29yZEZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQ29yZEZpZWxkOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBDb3JkRmllbGQgew0KKyAgICAgIGdldCB7IHJldHVybiBjb3JkRmllbGRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEZpZWxkTnVtYmVyID0gNzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IHJlcGVhdGVkUHJpbWl0aXZlRmllbGRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFByaW1pdGl2ZUZpZWxkXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkUHJpbWl0aXZlRmllbGRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRSZXBlYXRlZFByaW1pdGl2ZUZpZWxkKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFByaW1pdGl2ZUZpZWxkX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTdHJpbmdGaWVsZEZpZWxkTnVtYmVyID0gODsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+IHJlcGVhdGVkU3RyaW5nRmllbGRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBSZXBlYXRlZFN0cmluZ0ZpZWxkTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFN0cmluZ0ZpZWxkXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkU3RyaW5nRmllbGRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU3RyaW5nRmllbGRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZFN0cmluZ0ZpZWxkKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFN0cmluZ0ZpZWxkX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRFbnVtRmllbGRGaWVsZE51bWJlciA9IDk7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IHJlcGVhdGVkRW51bUZpZWxkXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IFJlcGVhdGVkRW51bUZpZWxkTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEVudW1GaWVsZF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEVudW1GaWVsZENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRFbnVtRmllbGRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEdldFJlcGVhdGVkRW51bUZpZWxkKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEVudW1GaWVsZF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkTWVzc2FnZUZpZWxkRmllbGROdW1iZXIgPSAxMDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gcmVwZWF0ZWRNZXNzYWdlRmllbGRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gUmVwZWF0ZWRNZXNzYWdlRmllbGRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRNZXNzYWdlRmllbGRfOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZE1lc3NhZ2VGaWVsZENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRNZXNzYWdlRmllbGRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIEdldFJlcGVhdGVkTWVzc2FnZUZpZWxkKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZE1lc3NhZ2VGaWVsZF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZEZpZWxkTnVtYmVyID0gMTE7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiByZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRDb3JkRmllbGRGaWVsZE51bWJlciA9IDEyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gcmVwZWF0ZWRDb3JkRmllbGRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBSZXBlYXRlZENvcmRGaWVsZExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRDb3JkRmllbGRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRDb3JkRmllbGRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkQ29yZEZpZWxkXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgR2V0UmVwZWF0ZWRDb3JkRmllbGQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkQ29yZEZpZWxkX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0Q2FtZWxDYXNlRmllbGROYW1lc0ZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc1ByaW1pdGl2ZUZpZWxkKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1szXSwgUHJpbWl0aXZlRmllbGQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU3RyaW5nRmllbGQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygyLCBmaWVsZF9uYW1lc1sxMF0sIFN0cmluZ0ZpZWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0VudW1GaWVsZCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSgzLCBmaWVsZF9uYW1lc1sxXSwgKGludCkgRW51bUZpZWxkLCBFbnVtRmllbGQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTWVzc2FnZUZpZWxkKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDQsIGZpZWxkX25hbWVzWzJdLCBNZXNzYWdlRmllbGQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU3RyaW5nUGllY2VGaWVsZCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDUsIGZpZWxkX25hbWVzWzExXSwgU3RyaW5nUGllY2VGaWVsZCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNDb3JkRmllbGQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyg2LCBmaWVsZF9uYW1lc1swXSwgQ29yZEZpZWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkUHJpbWl0aXZlRmllbGRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzJBcnJheSg3LCBmaWVsZF9uYW1lc1s3XSwgcmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRTdHJpbmdGaWVsZF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmdBcnJheSg4LCBmaWVsZF9uYW1lc1s4XSwgcmVwZWF0ZWRTdHJpbmdGaWVsZF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRFbnVtRmllbGRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bUFycmF5KDksIGZpZWxkX25hbWVzWzVdLCByZXBlYXRlZEVudW1GaWVsZF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRNZXNzYWdlRmllbGRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDEwLCBmaWVsZF9uYW1lc1s2XSwgcmVwZWF0ZWRNZXNzYWdlRmllbGRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmdBcnJheSgxMSwgZmllbGRfbmFtZXNbOV0sIHJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRDb3JkRmllbGRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoMTIsIGZpZWxkX25hbWVzWzRdLCByZXBlYXRlZENvcmRGaWVsZF8pOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc1ByaW1pdGl2ZUZpZWxkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIFByaW1pdGl2ZUZpZWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1N0cmluZ0ZpZWxkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgyLCBTdHJpbmdGaWVsZCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNFbnVtRmllbGQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgzLCAoaW50KSBFbnVtRmllbGQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTWVzc2FnZUZpZWxkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoNCwgTWVzc2FnZUZpZWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1N0cmluZ1BpZWNlRmllbGQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDUsIFN0cmluZ1BpZWNlRmllbGQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQ29yZEZpZWxkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSg2LCBDb3JkRmllbGQpOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoaW50IGVsZW1lbnQgaW4gUmVwZWF0ZWRQcmltaXRpdmVGaWVsZExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDEgKiByZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIFJlcGVhdGVkU3RyaW5nRmllbGRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMSAqIHJlcGVhdGVkU3RyaW5nRmllbGRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKHJlcGVhdGVkRW51bUZpZWxkXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gZWxlbWVudCBpbiByZXBlYXRlZEVudW1GaWVsZF8pIHsNCisgICAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplTm9UYWcoKGludCkgZWxlbWVudCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgICAgc2l6ZSArPSAxICogcmVwZWF0ZWRFbnVtRmllbGRfLkNvdW50Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBlbGVtZW50IGluIFJlcGVhdGVkTWVzc2FnZUZpZWxkTGlzdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEwLCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAxICogcmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIFJlcGVhdGVkQ29yZEZpZWxkTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDEgKiByZXBlYXRlZENvcmRGaWVsZF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJlcGVhdGVkUHJpbWl0aXZlRmllbGRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU3RyaW5nRmllbGRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkRW51bUZpZWxkXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZE1lc3NhZ2VGaWVsZF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZENvcmRGaWVsZF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0Q2FtZWxDYXNlRmllbGROYW1lcywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RDYW1lbENhc2VGaWVsZE5hbWVzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc1ByaW1pdGl2ZUZpZWxkKSB7DQorICAgICAgICAgIFByaW1pdGl2ZUZpZWxkID0gb3RoZXIuUHJpbWl0aXZlRmllbGQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzU3RyaW5nRmllbGQpIHsNCisgICAgICAgICAgU3RyaW5nRmllbGQgPSBvdGhlci5TdHJpbmdGaWVsZDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNFbnVtRmllbGQpIHsNCisgICAgICAgICAgRW51bUZpZWxkID0gb3RoZXIuRW51bUZpZWxkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc01lc3NhZ2VGaWVsZCkgew0KKyAgICAgICAgICBNZXJnZU1lc3NhZ2VGaWVsZChvdGhlci5NZXNzYWdlRmllbGQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1N0cmluZ1BpZWNlRmllbGQpIHsNCisgICAgICAgICAgU3RyaW5nUGllY2VGaWVsZCA9IG90aGVyLlN0cmluZ1BpZWNlRmllbGQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzQ29yZEZpZWxkKSB7DQorICAgICAgICAgIENvcmRGaWVsZCA9IG90aGVyLkNvcmRGaWVsZDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5BZGQob3RoZXIucmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkU3RyaW5nRmllbGRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nRmllbGRfLkFkZChvdGhlci5yZXBlYXRlZFN0cmluZ0ZpZWxkXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRFbnVtRmllbGRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRW51bUZpZWxkXy5BZGQob3RoZXIucmVwZWF0ZWRFbnVtRmllbGRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZE1lc3NhZ2VGaWVsZF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlRmllbGRfLkFkZChvdGhlci5yZXBlYXRlZE1lc3NhZ2VGaWVsZF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkXy5BZGQob3RoZXIucmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRDb3JkRmllbGRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkQ29yZEZpZWxkXy5BZGQob3RoZXIucmVwZWF0ZWRDb3JkRmllbGRfKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNQcmltaXRpdmVGaWVsZCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LnByaW1pdGl2ZUZpZWxkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1N0cmluZ0ZpZWxkID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LnN0cmluZ0ZpZWxkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNDogew0KKyAgICAgICAgICAgICAgb2JqZWN0IHVua25vd247DQorICAgICAgICAgICAgICBpZihpbnB1dC5SZWFkRW51bShyZWYgcmVzdWx0LmVudW1GaWVsZF8sIG91dCB1bmtub3duKSkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQuaGFzRW51bUZpZWxkID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgzLCAodWxvbmcpKGludCl1bmtub3duKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM0OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc01lc3NhZ2VGaWVsZCkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShNZXNzYWdlRmllbGQpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgTWVzc2FnZUZpZWxkID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzU3RyaW5nUGllY2VGaWVsZCA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5zdHJpbmdQaWVjZUZpZWxkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0NvcmRGaWVsZCA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5jb3JkRmllbGRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU4Og0KKyAgICAgICAgICAgIGNhc2UgNTY6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkUHJpbWl0aXZlRmllbGRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU3RyaW5nQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTdHJpbmdGaWVsZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzQ6DQorICAgICAgICAgICAgY2FzZSA3Mjogew0KKyAgICAgICAgICAgICAgc2NnOjpJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd25JdGVtczsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXk8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkRW51bUZpZWxkXywgb3V0IHVua25vd25JdGVtcyk7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkl0ZW1zICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgcmF3VmFsdWUgaW4gdW5rbm93bkl0ZW1zKQ0KKyAgICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZSBpcyBpbnQpDQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoOSwgKHVsb25nKShpbnQpcmF3VmFsdWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODI6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRNZXNzYWdlRmllbGRfLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDkwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU3RyaW5nQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA5ODogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkQ29yZEZpZWxkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzUHJpbWl0aXZlRmllbGQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNQcmltaXRpdmVGaWVsZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFByaW1pdGl2ZUZpZWxkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUHJpbWl0aXZlRmllbGQ7IH0NCisgICAgICAgIHNldCB7IFNldFByaW1pdGl2ZUZpZWxkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQcmltaXRpdmVGaWVsZChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzUHJpbWl0aXZlRmllbGQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnByaW1pdGl2ZUZpZWxkXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUHJpbWl0aXZlRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ByaW1pdGl2ZUZpZWxkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQucHJpbWl0aXZlRmllbGRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNTdHJpbmdGaWVsZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1N0cmluZ0ZpZWxkOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgU3RyaW5nRmllbGQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5TdHJpbmdGaWVsZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0U3RyaW5nRmllbGQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFN0cmluZ0ZpZWxkKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU3RyaW5nRmllbGQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnN0cmluZ0ZpZWxkXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyU3RyaW5nRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1N0cmluZ0ZpZWxkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuc3RyaW5nRmllbGRfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRW51bUZpZWxkIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNFbnVtRmllbGQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEVudW1GaWVsZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkVudW1GaWVsZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RW51bUZpZWxkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRFbnVtRmllbGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRW51bUZpZWxkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5lbnVtRmllbGRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJFbnVtRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0VudW1GaWVsZCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmVudW1GaWVsZF8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPTzsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNNZXNzYWdlRmllbGQgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc01lc3NhZ2VGaWVsZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgTWVzc2FnZUZpZWxkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTWVzc2FnZUZpZWxkOyB9DQorICAgICAgICBzZXQgeyBTZXRNZXNzYWdlRmllbGQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE1lc3NhZ2VGaWVsZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZUZpZWxkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5tZXNzYWdlRmllbGRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TWVzc2FnZUZpZWxkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc01lc3NhZ2VGaWVsZCA9IHRydWU7DQorICAgICAgICByZXN1bHQubWVzc2FnZUZpZWxkXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlTWVzc2FnZUZpZWxkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzTWVzc2FnZUZpZWxkICYmDQorICAgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VGaWVsZF8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VGaWVsZF8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5DcmVhdGVCdWlsZGVyKHJlc3VsdC5tZXNzYWdlRmllbGRfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VGaWVsZF8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNNZXNzYWdlRmllbGQgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTWVzc2FnZUZpZWxkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNZXNzYWdlRmllbGQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5tZXNzYWdlRmllbGRfID0gbnVsbDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNTdHJpbmdQaWVjZUZpZWxkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzU3RyaW5nUGllY2VGaWVsZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIFN0cmluZ1BpZWNlRmllbGQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5TdHJpbmdQaWVjZUZpZWxkOyB9DQorICAgICAgICBzZXQgeyBTZXRTdHJpbmdQaWVjZUZpZWxkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRTdHJpbmdQaWVjZUZpZWxkKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU3RyaW5nUGllY2VGaWVsZCA9IHRydWU7DQorICAgICAgICByZXN1bHQuc3RyaW5nUGllY2VGaWVsZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclN0cmluZ1BpZWNlRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1N0cmluZ1BpZWNlRmllbGQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5zdHJpbmdQaWVjZUZpZWxkXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0NvcmRGaWVsZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0NvcmRGaWVsZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIENvcmRGaWVsZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkNvcmRGaWVsZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Q29yZEZpZWxkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRDb3JkRmllbGQoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDb3JkRmllbGQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmNvcmRGaWVsZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckNvcmRGaWVsZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQ29yZEZpZWxkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuY29yZEZpZWxkXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFByaW1pdGl2ZUZpZWxkXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkUHJpbWl0aXZlRmllbGRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkUHJpbWl0aXZlRmllbGQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkUHJpbWl0aXZlRmllbGQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZFByaW1pdGl2ZUZpZWxkKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkUHJpbWl0aXZlRmllbGRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkUHJpbWl0aXZlRmllbGQoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkUHJpbWl0aXZlRmllbGRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZFByaW1pdGl2ZUZpZWxkKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZFByaW1pdGl2ZUZpZWxkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBSZXBlYXRlZFN0cmluZ0ZpZWxkTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFN0cmluZ0ZpZWxkXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU3RyaW5nRmllbGRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkU3RyaW5nRmllbGRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nRmllbGQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkU3RyaW5nRmllbGQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZFN0cmluZ0ZpZWxkKGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ0ZpZWxkX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZFN0cmluZ0ZpZWxkKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdGaWVsZF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkU3RyaW5nRmllbGQoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ0ZpZWxkXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkU3RyaW5nRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nRmllbGRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gUmVwZWF0ZWRFbnVtRmllbGRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkRW51bUZpZWxkXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRW51bUZpZWxkQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEVudW1GaWVsZENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBHZXRSZXBlYXRlZEVudW1GaWVsZChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRFbnVtRmllbGQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEVudW1GaWVsZChpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRW51bUZpZWxkX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEVudW1GaWVsZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEVudW1GaWVsZF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkRW51bUZpZWxkKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEVudW1GaWVsZF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEVudW1GaWVsZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRFbnVtRmllbGRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gUmVwZWF0ZWRNZXNzYWdlRmllbGRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkTWVzc2FnZUZpZWxkXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkTWVzc2FnZUZpZWxkQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZE1lc3NhZ2VGaWVsZENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBHZXRSZXBlYXRlZE1lc3NhZ2VGaWVsZChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRNZXNzYWdlRmllbGQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZE1lc3NhZ2VGaWVsZChpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VGaWVsZF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRNZXNzYWdlRmllbGQoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VGaWVsZF9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRNZXNzYWdlRmllbGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTWVzc2FnZUZpZWxkXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkTWVzc2FnZUZpZWxkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTWVzc2FnZUZpZWxkXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRNZXNzYWdlRmllbGQoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTWVzc2FnZUZpZWxkXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkTWVzc2FnZUZpZWxkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VGaWVsZF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkKGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZChzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gUmVwZWF0ZWRDb3JkRmllbGRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkQ29yZEZpZWxkXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkQ29yZEZpZWxkQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZENvcmRGaWVsZENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgR2V0UmVwZWF0ZWRDb3JkRmllbGQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkQ29yZEZpZWxkKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRDb3JkRmllbGQoaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQ29yZEZpZWxkX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZENvcmRGaWVsZChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQ29yZEZpZWxkXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRDb3JkRmllbGQoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZENvcmRGaWVsZF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZENvcmRGaWVsZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRDb3JkRmllbGRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0RmllbGRPcmRlcmluZ3MgOiBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8VGVzdEZpZWxkT3JkZXJpbmdzLCBUZXN0RmllbGRPcmRlcmluZ3MuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RGaWVsZE9yZGVyaW5ncygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0RmllbGRPcmRlcmluZ3MgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RGaWVsZE9yZGVyaW5ncygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdEZpZWxkT3JkZXJpbmdzRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJteV9mbG9hdCIsICJteV9pbnQiLCAibXlfc3RyaW5nIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RGaWVsZE9yZGVyaW5nc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4MTMsIDgsIDkwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZpZWxkT3JkZXJpbmdzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEZpZWxkT3JkZXJpbmdzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RGaWVsZE9yZGVyaW5ncyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGaWVsZE9yZGVyaW5nc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0RmllbGRPcmRlcmluZ3MsIFRlc3RGaWVsZE9yZGVyaW5ncy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RmllbGRPcmRlcmluZ3NfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE15U3RyaW5nRmllbGROdW1iZXIgPSAxMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc015U3RyaW5nOw0KKyAgICBwcml2YXRlIHN0cmluZyBteVN0cmluZ18gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzTXlTdHJpbmcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNNeVN0cmluZzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgTXlTdHJpbmcgew0KKyAgICAgIGdldCB7IHJldHVybiBteVN0cmluZ187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBNeUludEZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc015SW50Ow0KKyAgICBwcml2YXRlIGxvbmcgbXlJbnRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNNeUludCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc015SW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgTXlJbnQgew0KKyAgICAgIGdldCB7IHJldHVybiBteUludF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBNeUZsb2F0RmllbGROdW1iZXIgPSAxMDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNNeUZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IG15RmxvYXRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNNeUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTXlGbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBNeUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gbXlGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmICghRXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0RmllbGRPcmRlcmluZ3NGaWVsZE5hbWVzOw0KKyAgICAgIHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxUZXN0RmllbGRPcmRlcmluZ3MsIFRlc3RGaWVsZE9yZGVyaW5ncy5CdWlsZGVyPi5FeHRlbnNpb25Xcml0ZXIgZXh0ZW5zaW9uV3JpdGVyID0gQ3JlYXRlRXh0ZW5zaW9uV3JpdGVyKHRoaXMpOw0KKyAgICAgIGlmIChoYXNNeUludCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50NjQoMSwgZmllbGRfbmFtZXNbMV0sIE15SW50KTsNCisgICAgICB9DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoMTEsIG91dHB1dCk7DQorICAgICAgaWYgKGhhc015U3RyaW5nKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMTEsIGZpZWxkX25hbWVzWzJdLCBNeVN0cmluZyk7DQorICAgICAgfQ0KKyAgICAgIGV4dGVuc2lvbldyaXRlci5Xcml0ZVVudGlsKDEwMSwgb3V0cHV0KTsNCisgICAgICBpZiAoaGFzTXlGbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoMTAxLCBmaWVsZF9uYW1lc1swXSwgTXlGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzTXlTdHJpbmcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDExLCBNeVN0cmluZyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNNeUludCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZSgxLCBNeUludCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNNeUZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDEwMSwgTXlGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGaWVsZE9yZGVyaW5ncyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RmllbGRPcmRlcmluZ3MgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZpZWxkT3JkZXJpbmdzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RmllbGRPcmRlcmluZ3MgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGaWVsZE9yZGVyaW5ncyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RmllbGRPcmRlcmluZ3MgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZpZWxkT3JkZXJpbmdzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGaWVsZE9yZGVyaW5ncyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RmllbGRPcmRlcmluZ3MgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZpZWxkT3JkZXJpbmdzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RGaWVsZE9yZGVyaW5ncyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0RmllbGRPcmRlcmluZ3MgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkV4dGVuZGFibGVCdWlsZGVyPFRlc3RGaWVsZE9yZGVyaW5ncywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdEZpZWxkT3JkZXJpbmdzIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdEZpZWxkT3JkZXJpbmdzIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RGaWVsZE9yZGVyaW5ncyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RGaWVsZE9yZGVyaW5ncyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RGaWVsZE9yZGVyaW5ncygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEZpZWxkT3JkZXJpbmdzIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZpZWxkT3JkZXJpbmdzLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RGaWVsZE9yZGVyaW5ncyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RmllbGRPcmRlcmluZ3MuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RmllbGRPcmRlcmluZ3MgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RGaWVsZE9yZGVyaW5ncykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0RmllbGRPcmRlcmluZ3MpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0RmllbGRPcmRlcmluZ3Mgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RmllbGRPcmRlcmluZ3MuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzTXlTdHJpbmcpIHsNCisgICAgICAgICAgTXlTdHJpbmcgPSBvdGhlci5NeVN0cmluZzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNNeUludCkgew0KKyAgICAgICAgICBNeUludCA9IG90aGVyLk15SW50Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc015RmxvYXQpIHsNCisgICAgICAgICAgTXlGbG9hdCA9IG90aGVyLk15RmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICAgIHRoaXMuTWVyZ2VFeHRlbnNpb25GaWVsZHMob3RoZXIpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdEZpZWxkT3JkZXJpbmdzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RGaWVsZE9yZGVyaW5nc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTXlJbnQgPSBpbnB1dC5SZWFkSW50NjQocmVmIHJlc3VsdC5teUludF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgOTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNNeVN0cmluZyA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5teVN0cmluZ18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODEzOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTXlGbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0Lm15RmxvYXRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNNeVN0cmluZyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc015U3RyaW5nOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgTXlTdHJpbmcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5NeVN0cmluZzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TXlTdHJpbmcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE15U3RyaW5nKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTXlTdHJpbmcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm15U3RyaW5nXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTXlTdHJpbmcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc015U3RyaW5nID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubXlTdHJpbmdfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTXlJbnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNNeUludDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBNeUludCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk15SW50OyB9DQorICAgICAgICBzZXQgeyBTZXRNeUludCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TXlJbnQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNeUludCA9IHRydWU7DQorICAgICAgICByZXN1bHQubXlJbnRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJNeUludCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTXlJbnQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5teUludF8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNNeUZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTXlGbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgTXlGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk15RmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldE15RmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE15RmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTXlGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQubXlGbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck15RmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc015RmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5teUZsb2F0XyA9IDBGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0RmllbGRPcmRlcmluZ3MoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcywgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RFeHRyZW1lRGVmYXVsdFZhbHVlc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiY3BwX3RyaWdyYXBoIiwgImVzY2FwZWRfYnl0ZXMiLCAiaW5mX2RvdWJsZSIsICJpbmZfZmxvYXQiLCAibGFyZ2VfZmxvYXQiLCAibGFyZ2VfdWludDMyIiwgImxhcmdlX3VpbnQ2NCIsICJuYW5fZG91YmxlIiwgIm5hbl9mbG9hdCIsICJuZWdfaW5mX2RvdWJsZSIsICJuZWdfaW5mX2Zsb2F0IiwgIm5lZ2F0aXZlX2Zsb2F0IiwgIm5lZ2F0aXZlX29uZV9mbG9hdCIsICJvbmVfZmxvYXQiLCAic21hbGxfZmxvYXQiLCAic21hbGxfaW50MzIiLCAic21hbGxfaW50NjQiLCAic21hbGxfbmVnYXRpdmVfZmxvYXQiLCAidXRmOF9zdHJpbmciLCAiemVyb19mbG9hdCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTYyLCAxMCwgMTEzLCAxNDEsIDEwMSwgMTYsIDI0LCAxMjksIDE1NywgMTIxLCAxNDksIDkzLCA4NSwgNjksIDc3LCAzMiwgNDAsIDEwOSwgNTAsIDYxIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFeHRyZW1lRGVmYXVsdFZhbHVlc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMsIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEVzY2FwZWRCeXRlc0ZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0VzY2FwZWRCeXRlczsNCisgICAgcHJpdmF0ZSBwYjo6Qnl0ZVN0cmluZyBlc2NhcGVkQnl0ZXNfID0gKHBiOjpCeXRlU3RyaW5nKSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuRGVzY3JpcHRvci5GaWVsZHNbMF0uRGVmYXVsdFZhbHVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNFc2NhcGVkQnl0ZXMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNFc2NhcGVkQnl0ZXM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgRXNjYXBlZEJ5dGVzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZXNjYXBlZEJ5dGVzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IExhcmdlVWludDMyRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzTGFyZ2VVaW50MzI7DQorICAgIHByaXZhdGUgdWludCBsYXJnZVVpbnQzMl8gPSA0Mjk0OTY3Mjk1Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNMYXJnZVVpbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0xhcmdlVWludDMyOyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IExhcmdlVWludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gbGFyZ2VVaW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTGFyZ2VVaW50NjRGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNMYXJnZVVpbnQ2NDsNCisgICAgcHJpdmF0ZSB1bG9uZyBsYXJnZVVpbnQ2NF8gPSAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNMYXJnZVVpbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0xhcmdlVWludDY0OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBMYXJnZVVpbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGxhcmdlVWludDY0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFNtYWxsSW50MzJGaWVsZE51bWJlciA9IDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNTbWFsbEludDMyOw0KKyAgICBwcml2YXRlIGludCBzbWFsbEludDMyXyA9IC0yMTQ3NDgzNjQ3Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNTbWFsbEludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzU21hbGxJbnQzMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgU21hbGxJbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHNtYWxsSW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgU21hbGxJbnQ2NEZpZWxkTnVtYmVyID0gNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc1NtYWxsSW50NjQ7DQorICAgIHByaXZhdGUgbG9uZyBzbWFsbEludDY0XyA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3TDsNCisgICAgcHVibGljIGJvb2wgSGFzU21hbGxJbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1NtYWxsSW50NjQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBTbWFsbEludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gc21hbGxJbnQ2NF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVdGY4U3RyaW5nRmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzVXRmOFN0cmluZzsNCisgICAgcHJpdmF0ZSBzdHJpbmcgdXRmOFN0cmluZ18gPSAoc3RyaW5nKSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuRGVzY3JpcHRvci5GaWVsZHNbNV0uRGVmYXVsdFZhbHVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNVdGY4U3RyaW5nIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzVXRmOFN0cmluZzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgVXRmOFN0cmluZyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHV0ZjhTdHJpbmdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgWmVyb0Zsb2F0RmllbGROdW1iZXIgPSA3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzWmVyb0Zsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IHplcm9GbG9hdF87DQorICAgIHB1YmxpYyBib29sIEhhc1plcm9GbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1plcm9GbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBaZXJvRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiB6ZXJvRmxvYXRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT25lRmxvYXRGaWVsZE51bWJlciA9IDg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPbmVGbG9hdDsNCisgICAgcHJpdmF0ZSBmbG9hdCBvbmVGbG9hdF8gPSAxRjsNCisgICAgcHVibGljIGJvb2wgSGFzT25lRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPbmVGbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBPbmVGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9uZUZsb2F0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFNtYWxsRmxvYXRGaWVsZE51bWJlciA9IDk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNTbWFsbEZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IHNtYWxsRmxvYXRfID0gMS41RjsNCisgICAgcHVibGljIGJvb2wgSGFzU21hbGxGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1NtYWxsRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgU21hbGxGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHNtYWxsRmxvYXRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTmVnYXRpdmVPbmVGbG9hdEZpZWxkTnVtYmVyID0gMTA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOZWdhdGl2ZU9uZUZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IG5lZ2F0aXZlT25lRmxvYXRfID0gLTFGOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOZWdhdGl2ZU9uZUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmVnYXRpdmVPbmVGbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBOZWdhdGl2ZU9uZUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gbmVnYXRpdmVPbmVGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOZWdhdGl2ZUZsb2F0RmllbGROdW1iZXIgPSAxMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc05lZ2F0aXZlRmxvYXQ7DQorICAgIHByaXZhdGUgZmxvYXQgbmVnYXRpdmVGbG9hdF8gPSAtMS41RjsNCisgICAgcHVibGljIGJvb2wgSGFzTmVnYXRpdmVGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc05lZ2F0aXZlRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgTmVnYXRpdmVGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG5lZ2F0aXZlRmxvYXRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTGFyZ2VGbG9hdEZpZWxkTnVtYmVyID0gMTI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNMYXJnZUZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IGxhcmdlRmxvYXRfID0gMkUrMDhGOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNMYXJnZUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTGFyZ2VGbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBMYXJnZUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gbGFyZ2VGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBTbWFsbE5lZ2F0aXZlRmxvYXRGaWVsZE51bWJlciA9IDEzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzU21hbGxOZWdhdGl2ZUZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IHNtYWxsTmVnYXRpdmVGbG9hdF8gPSAtOEUtMjhGOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNTbWFsbE5lZ2F0aXZlRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNTbWFsbE5lZ2F0aXZlRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgU21hbGxOZWdhdGl2ZUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gc21hbGxOZWdhdGl2ZUZsb2F0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEluZkRvdWJsZUZpZWxkTnVtYmVyID0gMTQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNJbmZEb3VibGU7DQorICAgIHByaXZhdGUgZG91YmxlIGluZkRvdWJsZV8gPSBkb3VibGUuUG9zaXRpdmVJbmZpbml0eTsNCisgICAgcHVibGljIGJvb2wgSGFzSW5mRG91YmxlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzSW5mRG91YmxlOyB9DQorICAgIH0NCisgICAgcHVibGljIGRvdWJsZSBJbmZEb3VibGUgew0KKyAgICAgIGdldCB7IHJldHVybiBpbmZEb3VibGVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTmVnSW5mRG91YmxlRmllbGROdW1iZXIgPSAxNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc05lZ0luZkRvdWJsZTsNCisgICAgcHJpdmF0ZSBkb3VibGUgbmVnSW5mRG91YmxlXyA9IGRvdWJsZS5OZWdhdGl2ZUluZmluaXR5Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNOZWdJbmZEb3VibGUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNOZWdJbmZEb3VibGU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZG91YmxlIE5lZ0luZkRvdWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG5lZ0luZkRvdWJsZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOYW5Eb3VibGVGaWVsZE51bWJlciA9IDE2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzTmFuRG91YmxlOw0KKyAgICBwcml2YXRlIGRvdWJsZSBuYW5Eb3VibGVfID0gZG91YmxlLk5hTjsNCisgICAgcHVibGljIGJvb2wgSGFzTmFuRG91YmxlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmFuRG91YmxlOyB9DQorICAgIH0NCisgICAgcHVibGljIGRvdWJsZSBOYW5Eb3VibGUgew0KKyAgICAgIGdldCB7IHJldHVybiBuYW5Eb3VibGVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgSW5mRmxvYXRGaWVsZE51bWJlciA9IDE3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzSW5mRmxvYXQ7DQorICAgIHByaXZhdGUgZmxvYXQgaW5mRmxvYXRfID0gZmxvYXQuUG9zaXRpdmVJbmZpbml0eTsNCisgICAgcHVibGljIGJvb2wgSGFzSW5mRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNJbmZGbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBJbmZGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGluZkZsb2F0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE5lZ0luZkZsb2F0RmllbGROdW1iZXIgPSAxODsNCisgICAgcHJpdmF0ZSBib29sIGhhc05lZ0luZkZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IG5lZ0luZkZsb2F0XyA9IGZsb2F0Lk5lZ2F0aXZlSW5maW5pdHk7DQorICAgIHB1YmxpYyBib29sIEhhc05lZ0luZkZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmVnSW5mRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgTmVnSW5mRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBuZWdJbmZGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOYW5GbG9hdEZpZWxkTnVtYmVyID0gMTk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOYW5GbG9hdDsNCisgICAgcHJpdmF0ZSBmbG9hdCBuYW5GbG9hdF8gPSBmbG9hdC5OYU47DQorICAgIHB1YmxpYyBib29sIEhhc05hbkZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmFuRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgTmFuRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBuYW5GbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBDcHBUcmlncmFwaEZpZWxkTnVtYmVyID0gMjA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNDcHBUcmlncmFwaDsNCisgICAgcHJpdmF0ZSBzdHJpbmcgY3BwVHJpZ3JhcGhfID0gIj8gPyA/PyA/PyA/Pz8gPz8vID8/LSI7DQorICAgIHB1YmxpYyBib29sIEhhc0NwcFRyaWdyYXBoIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQ3BwVHJpZ3JhcGg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIENwcFRyaWdyYXBoIHsNCisgICAgICBnZXQgeyByZXR1cm4gY3BwVHJpZ3JhcGhfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNFc2NhcGVkQnl0ZXMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKDEsIGZpZWxkX25hbWVzWzFdLCBFc2NhcGVkQnl0ZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTGFyZ2VVaW50MzIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQzMigyLCBmaWVsZF9uYW1lc1s1XSwgTGFyZ2VVaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTGFyZ2VVaW50NjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQ2NCgzLCBmaWVsZF9uYW1lc1s2XSwgTGFyZ2VVaW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU21hbGxJbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNCwgZmllbGRfbmFtZXNbMTVdLCBTbWFsbEludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1NtYWxsSW50NjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KDUsIGZpZWxkX25hbWVzWzE2XSwgU21hbGxJbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNVdGY4U3RyaW5nKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoNiwgZmllbGRfbmFtZXNbMThdLCBVdGY4U3RyaW5nKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1plcm9GbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoNywgZmllbGRfbmFtZXNbMTldLCBaZXJvRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT25lRmxvYXQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDgsIGZpZWxkX25hbWVzWzEzXSwgT25lRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU21hbGxGbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoOSwgZmllbGRfbmFtZXNbMTRdLCBTbWFsbEZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05lZ2F0aXZlT25lRmxvYXQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDEwLCBmaWVsZF9uYW1lc1sxMl0sIE5lZ2F0aXZlT25lRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTmVnYXRpdmVGbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoMTEsIGZpZWxkX25hbWVzWzExXSwgTmVnYXRpdmVGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNMYXJnZUZsb2F0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgxMiwgZmllbGRfbmFtZXNbNF0sIExhcmdlRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU21hbGxOZWdhdGl2ZUZsb2F0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgxMywgZmllbGRfbmFtZXNbMTddLCBTbWFsbE5lZ2F0aXZlRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSW5mRG91YmxlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGUoMTQsIGZpZWxkX25hbWVzWzJdLCBJbmZEb3VibGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTmVnSW5mRG91YmxlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGUoMTUsIGZpZWxkX25hbWVzWzldLCBOZWdJbmZEb3VibGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTmFuRG91YmxlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGUoMTYsIGZpZWxkX25hbWVzWzddLCBOYW5Eb3VibGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSW5mRmxvYXQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDE3LCBmaWVsZF9uYW1lc1szXSwgSW5mRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTmVnSW5mRmxvYXQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDE4LCBmaWVsZF9uYW1lc1sxMF0sIE5lZ0luZkZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05hbkZsb2F0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgxOSwgZmllbGRfbmFtZXNbOF0sIE5hbkZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0NwcFRyaWdyYXBoKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMjAsIGZpZWxkX25hbWVzWzBdLCBDcHBUcmlncmFwaCk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzRXNjYXBlZEJ5dGVzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplKDEsIEVzY2FwZWRCeXRlcyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNMYXJnZVVpbnQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQzMlNpemUoMiwgTGFyZ2VVaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTGFyZ2VVaW50NjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50NjRTaXplKDMsIExhcmdlVWludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1NtYWxsSW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNCwgU21hbGxJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNTbWFsbEludDY0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKDUsIFNtYWxsSW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzVXRmOFN0cmluZykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoNiwgVXRmOFN0cmluZyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNaZXJvRmxvYXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoNywgWmVyb0Zsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09uZUZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDgsIE9uZUZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1NtYWxsRmxvYXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoOSwgU21hbGxGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNOZWdhdGl2ZU9uZUZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDEwLCBOZWdhdGl2ZU9uZUZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05lZ2F0aXZlRmxvYXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoMTEsIE5lZ2F0aXZlRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTGFyZ2VGbG9hdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSgxMiwgTGFyZ2VGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNTbWFsbE5lZ2F0aXZlRmxvYXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoMTMsIFNtYWxsTmVnYXRpdmVGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNJbmZEb3VibGUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVEb3VibGVTaXplKDE0LCBJbmZEb3VibGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTmVnSW5mRG91YmxlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRG91YmxlU2l6ZSgxNSwgTmVnSW5mRG91YmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05hbkRvdWJsZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZURvdWJsZVNpemUoMTYsIE5hbkRvdWJsZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNJbmZGbG9hdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSgxNywgSW5mRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTmVnSW5mRmxvYXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoMTgsIE5lZ0luZkZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05hbkZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDE5LCBOYW5GbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNDcHBUcmlncmFwaCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMjAsIENwcFRyaWdyYXBoKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0VzY2FwZWRCeXRlcykgew0KKyAgICAgICAgICBFc2NhcGVkQnl0ZXMgPSBvdGhlci5Fc2NhcGVkQnl0ZXM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzTGFyZ2VVaW50MzIpIHsNCisgICAgICAgICAgTGFyZ2VVaW50MzIgPSBvdGhlci5MYXJnZVVpbnQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNMYXJnZVVpbnQ2NCkgew0KKyAgICAgICAgICBMYXJnZVVpbnQ2NCA9IG90aGVyLkxhcmdlVWludDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1NtYWxsSW50MzIpIHsNCisgICAgICAgICAgU21hbGxJbnQzMiA9IG90aGVyLlNtYWxsSW50MzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzU21hbGxJbnQ2NCkgew0KKyAgICAgICAgICBTbWFsbEludDY0ID0gb3RoZXIuU21hbGxJbnQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNVdGY4U3RyaW5nKSB7DQorICAgICAgICAgIFV0ZjhTdHJpbmcgPSBvdGhlci5VdGY4U3RyaW5nOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1plcm9GbG9hdCkgew0KKyAgICAgICAgICBaZXJvRmxvYXQgPSBvdGhlci5aZXJvRmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT25lRmxvYXQpIHsNCisgICAgICAgICAgT25lRmxvYXQgPSBvdGhlci5PbmVGbG9hdDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNTbWFsbEZsb2F0KSB7DQorICAgICAgICAgIFNtYWxsRmxvYXQgPSBvdGhlci5TbWFsbEZsb2F0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc05lZ2F0aXZlT25lRmxvYXQpIHsNCisgICAgICAgICAgTmVnYXRpdmVPbmVGbG9hdCA9IG90aGVyLk5lZ2F0aXZlT25lRmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzTmVnYXRpdmVGbG9hdCkgew0KKyAgICAgICAgICBOZWdhdGl2ZUZsb2F0ID0gb3RoZXIuTmVnYXRpdmVGbG9hdDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNMYXJnZUZsb2F0KSB7DQorICAgICAgICAgIExhcmdlRmxvYXQgPSBvdGhlci5MYXJnZUZsb2F0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1NtYWxsTmVnYXRpdmVGbG9hdCkgew0KKyAgICAgICAgICBTbWFsbE5lZ2F0aXZlRmxvYXQgPSBvdGhlci5TbWFsbE5lZ2F0aXZlRmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzSW5mRG91YmxlKSB7DQorICAgICAgICAgIEluZkRvdWJsZSA9IG90aGVyLkluZkRvdWJsZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNOZWdJbmZEb3VibGUpIHsNCisgICAgICAgICAgTmVnSW5mRG91YmxlID0gb3RoZXIuTmVnSW5mRG91YmxlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc05hbkRvdWJsZSkgew0KKyAgICAgICAgICBOYW5Eb3VibGUgPSBvdGhlci5OYW5Eb3VibGU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzSW5mRmxvYXQpIHsNCisgICAgICAgICAgSW5mRmxvYXQgPSBvdGhlci5JbmZGbG9hdDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNOZWdJbmZGbG9hdCkgew0KKyAgICAgICAgICBOZWdJbmZGbG9hdCA9IG90aGVyLk5lZ0luZkZsb2F0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc05hbkZsb2F0KSB7DQorICAgICAgICAgIE5hbkZsb2F0ID0gb3RoZXIuTmFuRmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzQ3BwVHJpZ3JhcGgpIHsNCisgICAgICAgICAgQ3BwVHJpZ3JhcGggPSBvdGhlci5DcHBUcmlncmFwaDsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RFeHRyZW1lRGVmYXVsdFZhbHVlc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNFc2NhcGVkQnl0ZXMgPSBpbnB1dC5SZWFkQnl0ZXMocmVmIHJlc3VsdC5lc2NhcGVkQnl0ZXNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTGFyZ2VVaW50MzIgPSBpbnB1dC5SZWFkVUludDMyKHJlZiByZXN1bHQubGFyZ2VVaW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTGFyZ2VVaW50NjQgPSBpbnB1dC5SZWFkVUludDY0KHJlZiByZXN1bHQubGFyZ2VVaW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzU21hbGxJbnQzMiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LnNtYWxsSW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzU21hbGxJbnQ2NCA9IGlucHV0LlJlYWRJbnQ2NChyZWYgcmVzdWx0LnNtYWxsSW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDUwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzVXRmOFN0cmluZyA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC51dGY4U3RyaW5nXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2MTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1plcm9GbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0Lnplcm9GbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjk6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPbmVGbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0Lm9uZUZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3Nzogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1NtYWxsRmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5zbWFsbEZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4NTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc05lZ2F0aXZlT25lRmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5uZWdhdGl2ZU9uZUZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA5Mzogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc05lZ2F0aXZlRmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5uZWdhdGl2ZUZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNMYXJnZUZsb2F0ID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQubGFyZ2VGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA5OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzU21hbGxOZWdhdGl2ZUZsb2F0ID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQuc21hbGxOZWdhdGl2ZUZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMTM6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNJbmZEb3VibGUgPSBpbnB1dC5SZWFkRG91YmxlKHJlZiByZXN1bHQuaW5mRG91YmxlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMjE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOZWdJbmZEb3VibGUgPSBpbnB1dC5SZWFkRG91YmxlKHJlZiByZXN1bHQubmVnSW5mRG91YmxlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMjk6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOYW5Eb3VibGUgPSBpbnB1dC5SZWFkRG91YmxlKHJlZiByZXN1bHQubmFuRG91YmxlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNDE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNJbmZGbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0LmluZkZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNDk6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOZWdJbmZGbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0Lm5lZ0luZkZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNTc6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOYW5GbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0Lm5hbkZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNDcHBUcmlncmFwaCA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5jcHBUcmlncmFwaF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0VzY2FwZWRCeXRlcyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0VzY2FwZWRCeXRlczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgRXNjYXBlZEJ5dGVzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRXNjYXBlZEJ5dGVzOyB9DQorICAgICAgICBzZXQgeyBTZXRFc2NhcGVkQnl0ZXModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEVzY2FwZWRCeXRlcyhwYjo6Qnl0ZVN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRXNjYXBlZEJ5dGVzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5lc2NhcGVkQnl0ZXNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJFc2NhcGVkQnl0ZXMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0VzY2FwZWRCeXRlcyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmVzY2FwZWRCeXRlc18gPSAocGI6OkJ5dGVTdHJpbmcpIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcy5EZXNjcmlwdG9yLkZpZWxkc1swXS5EZWZhdWx0VmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTGFyZ2VVaW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNMYXJnZVVpbnQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBMYXJnZVVpbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkxhcmdlVWludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXRMYXJnZVVpbnQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TGFyZ2VVaW50MzIodWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNMYXJnZVVpbnQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQubGFyZ2VVaW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJMYXJnZVVpbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTGFyZ2VVaW50MzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5sYXJnZVVpbnQzMl8gPSA0Mjk0OTY3Mjk1Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0xhcmdlVWludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTGFyZ2VVaW50NjQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIExhcmdlVWludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTGFyZ2VVaW50NjQ7IH0NCisgICAgICAgIHNldCB7IFNldExhcmdlVWludDY0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRMYXJnZVVpbnQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNMYXJnZVVpbnQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQubGFyZ2VVaW50NjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJMYXJnZVVpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTGFyZ2VVaW50NjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5sYXJnZVVpbnQ2NF8gPSAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1NtYWxsSW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNTbWFsbEludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgU21hbGxJbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlNtYWxsSW50MzI7IH0NCisgICAgICAgIHNldCB7IFNldFNtYWxsSW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFNtYWxsSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1NtYWxsSW50MzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnNtYWxsSW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTbWFsbEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTbWFsbEludDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuc21hbGxJbnQzMl8gPSAtMjE0NzQ4MzY0NzsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNTbWFsbEludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzU21hbGxJbnQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBTbWFsbEludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuU21hbGxJbnQ2NDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0U21hbGxJbnQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0U21hbGxJbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1NtYWxsSW50NjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnNtYWxsSW50NjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTbWFsbEludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTbWFsbEludDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuc21hbGxJbnQ2NF8gPSAtOTIyMzM3MjAzNjg1NDc3NTgwN0w7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzVXRmOFN0cmluZyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1V0ZjhTdHJpbmc7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBVdGY4U3RyaW5nIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVXRmOFN0cmluZzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0VXRmOFN0cmluZyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VXRmOFN0cmluZyhzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1V0ZjhTdHJpbmcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnV0ZjhTdHJpbmdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVdGY4U3RyaW5nKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNVdGY4U3RyaW5nID0gZmFsc2U7DQorICAgICAgICByZXN1bHQudXRmOFN0cmluZ18gPSAoc3RyaW5nKSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuRGVzY3JpcHRvci5GaWVsZHNbNV0uRGVmYXVsdFZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1plcm9GbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1plcm9GbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgWmVyb0Zsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuWmVyb0Zsb2F0OyB9DQorICAgICAgICBzZXQgeyBTZXRaZXJvRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFplcm9GbG9hdChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNaZXJvRmxvYXQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lnplcm9GbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclplcm9GbG9hdCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzWmVyb0Zsb2F0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuemVyb0Zsb2F0XyA9IDBGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09uZUZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT25lRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IE9uZUZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT25lRmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldE9uZUZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPbmVGbG9hdChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPbmVGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQub25lRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPbmVGbG9hdCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT25lRmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vbmVGbG9hdF8gPSAxRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNTbWFsbEZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzU21hbGxGbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgU21hbGxGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlNtYWxsRmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldFNtYWxsRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFNtYWxsRmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU21hbGxGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQuc21hbGxGbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclNtYWxsRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1NtYWxsRmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5zbWFsbEZsb2F0XyA9IDEuNUY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmVnYXRpdmVPbmVGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc05lZ2F0aXZlT25lRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IE5lZ2F0aXZlT25lRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OZWdhdGl2ZU9uZUZsb2F0OyB9DQorICAgICAgICBzZXQgeyBTZXROZWdhdGl2ZU9uZUZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROZWdhdGl2ZU9uZUZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05lZ2F0aXZlT25lRmxvYXQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm5lZ2F0aXZlT25lRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOZWdhdGl2ZU9uZUZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOZWdhdGl2ZU9uZUZsb2F0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubmVnYXRpdmVPbmVGbG9hdF8gPSAtMUY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmVnYXRpdmVGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc05lZ2F0aXZlRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IE5lZ2F0aXZlRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OZWdhdGl2ZUZsb2F0OyB9DQorICAgICAgICBzZXQgeyBTZXROZWdhdGl2ZUZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROZWdhdGl2ZUZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05lZ2F0aXZlRmxvYXQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm5lZ2F0aXZlRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOZWdhdGl2ZUZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOZWdhdGl2ZUZsb2F0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubmVnYXRpdmVGbG9hdF8gPSAtMS41RjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNMYXJnZUZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTGFyZ2VGbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgTGFyZ2VGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkxhcmdlRmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldExhcmdlRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldExhcmdlRmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTGFyZ2VGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQubGFyZ2VGbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckxhcmdlRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0xhcmdlRmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5sYXJnZUZsb2F0XyA9IDJFKzA4RjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNTbWFsbE5lZ2F0aXZlRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNTbWFsbE5lZ2F0aXZlRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IFNtYWxsTmVnYXRpdmVGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlNtYWxsTmVnYXRpdmVGbG9hdDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0U21hbGxOZWdhdGl2ZUZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRTbWFsbE5lZ2F0aXZlRmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU21hbGxOZWdhdGl2ZUZsb2F0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5zbWFsbE5lZ2F0aXZlRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTbWFsbE5lZ2F0aXZlRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1NtYWxsTmVnYXRpdmVGbG9hdCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnNtYWxsTmVnYXRpdmVGbG9hdF8gPSAtOEUtMjhGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0luZkRvdWJsZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0luZkRvdWJsZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZG91YmxlIEluZkRvdWJsZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkluZkRvdWJsZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0SW5mRG91YmxlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRJbmZEb3VibGUoZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0luZkRvdWJsZSA9IHRydWU7DQorICAgICAgICByZXN1bHQuaW5mRG91YmxlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFySW5mRG91YmxlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJbmZEb3VibGUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5pbmZEb3VibGVfID0gZG91YmxlLlBvc2l0aXZlSW5maW5pdHk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmVnSW5mRG91YmxlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTmVnSW5mRG91YmxlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBkb3VibGUgTmVnSW5mRG91YmxlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmVnSW5mRG91YmxlOyB9DQorICAgICAgICBzZXQgeyBTZXROZWdJbmZEb3VibGUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5lZ0luZkRvdWJsZShkb3VibGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmVnSW5mRG91YmxlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5uZWdJbmZEb3VibGVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOZWdJbmZEb3VibGUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05lZ0luZkRvdWJsZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5lZ0luZkRvdWJsZV8gPSBkb3VibGUuTmVnYXRpdmVJbmZpbml0eTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNOYW5Eb3VibGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOYW5Eb3VibGU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGRvdWJsZSBOYW5Eb3VibGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OYW5Eb3VibGU7IH0NCisgICAgICAgIHNldCB7IFNldE5hbkRvdWJsZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TmFuRG91YmxlKGRvdWJsZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOYW5Eb3VibGUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm5hbkRvdWJsZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5hbkRvdWJsZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmFuRG91YmxlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubmFuRG91YmxlXyA9IGRvdWJsZS5OYU47DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzSW5mRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNJbmZGbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgSW5mRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5JbmZGbG9hdDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0SW5mRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEluZkZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0luZkZsb2F0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5pbmZGbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckluZkZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJbmZGbG9hdCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmluZkZsb2F0XyA9IGZsb2F0LlBvc2l0aXZlSW5maW5pdHk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmVnSW5mRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOZWdJbmZGbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgTmVnSW5mRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OZWdJbmZGbG9hdDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TmVnSW5mRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5lZ0luZkZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05lZ0luZkZsb2F0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5uZWdJbmZGbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5lZ0luZkZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOZWdJbmZGbG9hdCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5lZ0luZkZsb2F0XyA9IGZsb2F0Lk5lZ2F0aXZlSW5maW5pdHk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmFuRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOYW5GbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgTmFuRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OYW5GbG9hdDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TmFuRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5hbkZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05hbkZsb2F0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5uYW5GbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5hbkZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOYW5GbG9hdCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5hbkZsb2F0XyA9IGZsb2F0Lk5hTjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNDcHBUcmlncmFwaCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0NwcFRyaWdyYXBoOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgQ3BwVHJpZ3JhcGggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5DcHBUcmlncmFwaDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Q3BwVHJpZ3JhcGgodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldENwcFRyaWdyYXBoKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQ3BwVHJpZ3JhcGggPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmNwcFRyaWdyYXBoXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQ3BwVHJpZ3JhcGgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0NwcFRyaWdyYXBoID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuY3BwVHJpZ3JhcGhfID0gIj8gPyA/PyA/PyA/Pz8gPz8vID8/LSI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgU3BhcnNlRW51bU1lc3NhZ2UgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxTcGFyc2VFbnVtTWVzc2FnZSwgU3BhcnNlRW51bU1lc3NhZ2UuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFNwYXJzZUVudW1NZXNzYWdlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNwYXJzZUVudW1NZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTcGFyc2VFbnVtTWVzc2FnZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfc3BhcnNlRW51bU1lc3NhZ2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInNwYXJzZV9lbnVtIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3NwYXJzZUVudW1NZXNzYWdlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDggfTsNCisgICAgcHVibGljIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFNwYXJzZUVudW1NZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNwYXJzZUVudW1NZXNzYWdlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfU3BhcnNlRW51bU1lc3NhZ2VfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8U3BhcnNlRW51bU1lc3NhZ2UsIFNwYXJzZUVudW1NZXNzYWdlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NwYXJzZUVudW1NZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBTcGFyc2VFbnVtRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzU3BhcnNlRW51bTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0U3BhcnNlRW51bSBzcGFyc2VFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RTcGFyc2VFbnVtLlNQQVJTRV9BOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNTcGFyc2VFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzU3BhcnNlRW51bTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0U3BhcnNlRW51bSBTcGFyc2VFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gc3BhcnNlRW51bV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3NwYXJzZUVudW1NZXNzYWdlRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzU3BhcnNlRW51bSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSgxLCBmaWVsZF9uYW1lc1swXSwgKGludCkgU3BhcnNlRW51bSwgU3BhcnNlRW51bSk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzU3BhcnNlRW51bSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDEsIChpbnQpIFNwYXJzZUVudW0pOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BhcnNlRW51bU1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFNwYXJzZUVudW1NZXNzYWdlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFNwYXJzZUVudW1NZXNzYWdlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFNwYXJzZUVudW1NZXNzYWdlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihTcGFyc2VFbnVtTWVzc2FnZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFNwYXJzZUVudW1NZXNzYWdlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFNwYXJzZUVudW1NZXNzYWdlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgU3BhcnNlRW51bU1lc3NhZ2Ugb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBTcGFyc2VFbnVtTWVzc2FnZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU3BhcnNlRW51bU1lc3NhZ2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGFyc2VFbnVtTWVzc2FnZS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTcGFyc2VFbnVtTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGFyc2VFbnVtTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNwYXJzZUVudW1NZXNzYWdlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBTcGFyc2VFbnVtTWVzc2FnZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChTcGFyc2VFbnVtTWVzc2FnZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFNwYXJzZUVudW1NZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BhcnNlRW51bU1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzU3BhcnNlRW51bSkgew0KKyAgICAgICAgICBTcGFyc2VFbnVtID0gb3RoZXIuU3BhcnNlRW51bTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3NwYXJzZUVudW1NZXNzYWdlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3NwYXJzZUVudW1NZXNzYWdlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5zcGFyc2VFbnVtXywgb3V0IHVua25vd24pKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNTcGFyc2VFbnVtID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgxLCAodWxvbmcpKGludCl1bmtub3duKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNTcGFyc2VFbnVtIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNTcGFyc2VFbnVtOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0U3BhcnNlRW51bSBTcGFyc2VFbnVtIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuU3BhcnNlRW51bTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0U3BhcnNlRW51bSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0U3BhcnNlRW51bShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0U3BhcnNlRW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTcGFyc2VFbnVtID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5zcGFyc2VFbnVtXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyU3BhcnNlRW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU3BhcnNlRW51bSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnNwYXJzZUVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFNwYXJzZUVudW0uU1BBUlNFX0E7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBPbmVTdHJpbmcgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxPbmVTdHJpbmcsIE9uZVN0cmluZy5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgT25lU3RyaW5nKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE9uZVN0cmluZyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgT25lU3RyaW5nKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9vbmVTdHJpbmdGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImRhdGEiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfb25lU3RyaW5nRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgT25lU3RyaW5nIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgT25lU3RyaW5nIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE9uZVN0cmluZyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09uZVN0cmluZ19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxPbmVTdHJpbmcsIE9uZVN0cmluZy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVTdHJpbmdfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERhdGFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEYXRhOw0KKyAgICBwcml2YXRlIHN0cmluZyBkYXRhXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEYXRhIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGF0YTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRGF0YSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRhdGFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9vbmVTdHJpbmdGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNEYXRhKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMSwgZmllbGRfbmFtZXNbMF0sIERhdGEpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0RhdGEpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDEsIERhdGEpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVTdHJpbmcgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lU3RyaW5nIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZVN0cmluZyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lU3RyaW5nIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVTdHJpbmcgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lU3RyaW5nIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZVN0cmluZyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVTdHJpbmcgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lU3RyaW5nIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZVN0cmluZyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBPbmVTdHJpbmcgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoT25lU3RyaW5nIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPE9uZVN0cmluZywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoT25lU3RyaW5nIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgT25lU3RyaW5nIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIE9uZVN0cmluZyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIE9uZVN0cmluZyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IE9uZVN0cmluZygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgT25lU3RyaW5nIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lU3RyaW5nLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIE9uZVN0cmluZyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVTdHJpbmcuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBPbmVTdHJpbmcgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIE9uZVN0cmluZykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChPbmVTdHJpbmcpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShPbmVTdHJpbmcgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVTdHJpbmcuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRGF0YSkgew0KKyAgICAgICAgICBEYXRhID0gb3RoZXIuRGF0YTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX29uZVN0cmluZ0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9vbmVTdHJpbmdGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEYXRhID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmRhdGFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEYXRhIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGF0YTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIERhdGEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EYXRhOyB9DQorICAgICAgICBzZXQgeyBTZXREYXRhKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREYXRhKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGF0YSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGF0YV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRhdGEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RhdGEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kYXRhXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBPbmVTdHJpbmcoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE9uZUJ5dGVzIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8T25lQnl0ZXMsIE9uZUJ5dGVzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBPbmVCeXRlcygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPbmVCeXRlcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgT25lQnl0ZXMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX29uZUJ5dGVzRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJkYXRhIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX29uZUJ5dGVzRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgT25lQnl0ZXMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBPbmVCeXRlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBPbmVCeXRlcyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09uZUJ5dGVzX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPE9uZUJ5dGVzLCBPbmVCeXRlcy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVCeXRlc19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGF0YUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RhdGE7DQorICAgIHByaXZhdGUgcGI6OkJ5dGVTdHJpbmcgZGF0YV8gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsNCisgICAgcHVibGljIGJvb2wgSGFzRGF0YSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RhdGE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgRGF0YSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRhdGFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9vbmVCeXRlc0ZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0RhdGEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKDEsIGZpZWxkX25hbWVzWzBdLCBEYXRhKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNEYXRhKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplKDEsIERhdGEpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVCeXRlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVCeXRlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVCeXRlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lQnl0ZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZUJ5dGVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZUJ5dGVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZUJ5dGVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZUJ5dGVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZUJ5dGVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZUJ5dGVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIE9uZUJ5dGVzIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKE9uZUJ5dGVzIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPE9uZUJ5dGVzLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihPbmVCeXRlcyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIE9uZUJ5dGVzIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIE9uZUJ5dGVzIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgT25lQnl0ZXMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBPbmVCeXRlcygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgT25lQnl0ZXMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVCeXRlcy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBPbmVCeXRlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVCeXRlcy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIE9uZUJ5dGVzIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBPbmVCeXRlcykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChPbmVCeXRlcykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKE9uZUJ5dGVzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lQnl0ZXMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRGF0YSkgew0KKyAgICAgICAgICBEYXRhID0gb3RoZXIuRGF0YTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX29uZUJ5dGVzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX29uZUJ5dGVzRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGF0YSA9IGlucHV0LlJlYWRCeXRlcyhyZWYgcmVzdWx0LmRhdGFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEYXRhIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGF0YTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgRGF0YSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRhdGE7IH0NCisgICAgICAgIHNldCB7IFNldERhdGEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERhdGEocGI6OkJ5dGVTdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RhdGEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRhdGFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEYXRhKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEYXRhID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGF0YV8gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgT25lQnl0ZXMoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RQYWNrZWRUeXBlcyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RQYWNrZWRUeXBlcywgVGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0UGFja2VkVHlwZXMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdFBhY2tlZFR5cGVzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0UGFja2VkVHlwZXMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RQYWNrZWRUeXBlc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAicGFja2VkX2Jvb2wiLCAicGFja2VkX2RvdWJsZSIsICJwYWNrZWRfZW51bSIsICJwYWNrZWRfZml4ZWQzMiIsICJwYWNrZWRfZml4ZWQ2NCIsICJwYWNrZWRfZmxvYXQiLCAicGFja2VkX2ludDMyIiwgInBhY2tlZF9pbnQ2NCIsICJwYWNrZWRfc2ZpeGVkMzIiLCAicGFja2VkX3NmaXhlZDY0IiwgInBhY2tlZF9zaW50MzIiLCAicGFja2VkX3NpbnQ2NCIsICJwYWNrZWRfdWludDMyIiwgInBhY2tlZF91aW50NjQiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFBhY2tlZFR5cGVzRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDgxOCwgODEwLCA4MjYsIDc3MCwgNzc4LCA4MDIsIDcyMiwgNzMwLCA3ODYsIDc5NCwgNzU0LCA3NjIsIDczOCwgNzQ2IH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFBhY2tlZFR5cGVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RQYWNrZWRUeXBlcyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRUeXBlc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0UGFja2VkVHlwZXMsIFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkVHlwZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEludDMyRmllbGROdW1iZXIgPSA5MDsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkSW50MzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gcGFja2VkSW50MzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBQYWNrZWRJbnQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkSW50MzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkSW50MzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZEludDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgR2V0UGFja2VkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZEludDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkSW50NjRGaWVsZE51bWJlciA9IDkxOw0KKyAgICBwcml2YXRlIGludCBwYWNrZWRJbnQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gcGFja2VkSW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGxvbmc+IFBhY2tlZEludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRJbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRJbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkSW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0UGFja2VkSW50NjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZEludDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkVWludDMyRmllbGROdW1iZXIgPSA5MjsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkVWludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PiBwYWNrZWRVaW50MzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1aW50PiBQYWNrZWRVaW50MzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZFVpbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRVaW50MzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZFVpbnQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgR2V0UGFja2VkVWludDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRVaW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRVaW50NjRGaWVsZE51bWJlciA9IDkzOw0KKyAgICBwcml2YXRlIGludCBwYWNrZWRVaW50NjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiBwYWNrZWRVaW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IFBhY2tlZFVpbnQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkVWludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZFVpbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkVWludDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgR2V0UGFja2VkVWludDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRVaW50NjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTaW50MzJGaWVsZE51bWJlciA9IDk0Ow0KKyAgICBwcml2YXRlIGludCBwYWNrZWRTaW50MzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gcGFja2VkU2ludDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gUGFja2VkU2ludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRTaW50MzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkU2ludDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRTaW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRQYWNrZWRTaW50MzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZFNpbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFNpbnQ2NEZpZWxkTnVtYmVyID0gOTU7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZFNpbnQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gcGFja2VkU2ludDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBQYWNrZWRTaW50NjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZFNpbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRTaW50NjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZFNpbnQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBHZXRQYWNrZWRTaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZFNpbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEZpeGVkMzJGaWVsZE51bWJlciA9IDk2Ow0KKyAgICBwcml2YXRlIGludCBwYWNrZWRGaXhlZDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PiBwYWNrZWRGaXhlZDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWludD4gUGFja2VkRml4ZWQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkRml4ZWQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRGaXhlZDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRGaXhlZDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBHZXRQYWNrZWRGaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRGaXhlZDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRml4ZWQ2NEZpZWxkTnVtYmVyID0gOTc7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZEZpeGVkNjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiBwYWNrZWRGaXhlZDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVsb25nPiBQYWNrZWRGaXhlZDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRGaXhlZDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZEZpeGVkNjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZEZpeGVkNjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBHZXRQYWNrZWRGaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRGaXhlZDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkU2ZpeGVkMzJGaWVsZE51bWJlciA9IDk4Ow0KKyAgICBwcml2YXRlIGludCBwYWNrZWRTZml4ZWQzMk1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiBwYWNrZWRTZml4ZWQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFBhY2tlZFNmaXhlZDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRTZml4ZWQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRTZml4ZWQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkU2ZpeGVkMzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRQYWNrZWRTZml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkU2ZpeGVkMzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTZml4ZWQ2NEZpZWxkTnVtYmVyID0gOTk7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZFNmaXhlZDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiBwYWNrZWRTZml4ZWQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gUGFja2VkU2ZpeGVkNjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZFNmaXhlZDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZFNmaXhlZDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRTZml4ZWQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBHZXRQYWNrZWRTZml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkU2ZpeGVkNjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRGbG9hdEZpZWxkTnVtYmVyID0gMTAwOw0KKyAgICBwcml2YXRlIGludCBwYWNrZWRGbG9hdE1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8ZmxvYXQ+IHBhY2tlZEZsb2F0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxmbG9hdD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8ZmxvYXQ+IFBhY2tlZEZsb2F0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRGbG9hdF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRGbG9hdENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkRmxvYXRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IEdldFBhY2tlZEZsb2F0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRGbG9hdF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZERvdWJsZUZpZWxkTnVtYmVyID0gMTAxOw0KKyAgICBwcml2YXRlIGludCBwYWNrZWREb3VibGVNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGRvdWJsZT4gcGFja2VkRG91YmxlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxkb3VibGU+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGRvdWJsZT4gUGFja2VkRG91YmxlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWREb3VibGVfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkRG91YmxlQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWREb3VibGVfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGRvdWJsZSBHZXRQYWNrZWREb3VibGUoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZERvdWJsZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEJvb2xGaWVsZE51bWJlciA9IDEwMjsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkQm9vbE1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Ym9vbD4gcGFja2VkQm9vbF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Ym9vbD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Ym9vbD4gUGFja2VkQm9vbExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkQm9vbF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRCb29sQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRCb29sXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEdldFBhY2tlZEJvb2woaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZEJvb2xfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRFbnVtRmllbGROdW1iZXIgPSAxMDM7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZEVudW1NZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiBwYWNrZWRFbnVtXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IFBhY2tlZEVudW1MaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZEVudW1fKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkRW51bUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkRW51bV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gR2V0UGFja2VkRW51bShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkRW51bV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFBhY2tlZFR5cGVzRmllbGROYW1lczsNCisgICAgICBpZiAocGFja2VkSW50MzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkSW50MzJBcnJheSg5MCwgZmllbGRfbmFtZXNbNl0sIHBhY2tlZEludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkSW50MzJfKTsNCisgICAgICB9DQorICAgICAgaWYgKHBhY2tlZEludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZEludDY0QXJyYXkoOTEsIGZpZWxkX25hbWVzWzddLCBwYWNrZWRJbnQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZEludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRVaW50MzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkVUludDMyQXJyYXkoOTIsIGZpZWxkX25hbWVzWzEyXSwgcGFja2VkVWludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkVWludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRVaW50NjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkVUludDY0QXJyYXkoOTMsIGZpZWxkX25hbWVzWzEzXSwgcGFja2VkVWludDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkVWludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRTaW50MzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkU0ludDMyQXJyYXkoOTQsIGZpZWxkX25hbWVzWzEwXSwgcGFja2VkU2ludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkU2ludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRTaW50NjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkU0ludDY0QXJyYXkoOTUsIGZpZWxkX25hbWVzWzExXSwgcGFja2VkU2ludDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkU2ludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRGaXhlZDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZEZpeGVkMzJBcnJheSg5NiwgZmllbGRfbmFtZXNbM10sIHBhY2tlZEZpeGVkMzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRGaXhlZDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRGaXhlZDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZEZpeGVkNjRBcnJheSg5NywgZmllbGRfbmFtZXNbNF0sIHBhY2tlZEZpeGVkNjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRGaXhlZDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRTZml4ZWQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRTRml4ZWQzMkFycmF5KDk4LCBmaWVsZF9uYW1lc1s4XSwgcGFja2VkU2ZpeGVkMzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRTZml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkU2ZpeGVkNjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkU0ZpeGVkNjRBcnJheSg5OSwgZmllbGRfbmFtZXNbOV0sIHBhY2tlZFNmaXhlZDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkU2ZpeGVkNjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHBhY2tlZEZsb2F0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZEZsb2F0QXJyYXkoMTAwLCBmaWVsZF9uYW1lc1s1XSwgcGFja2VkRmxvYXRNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRGbG9hdF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkRG91YmxlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZERvdWJsZUFycmF5KDEwMSwgZmllbGRfbmFtZXNbMV0sIHBhY2tlZERvdWJsZU1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZERvdWJsZV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkQm9vbF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRCb29sQXJyYXkoMTAyLCBmaWVsZF9uYW1lc1swXSwgcGFja2VkQm9vbE1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZEJvb2xfKTsNCisgICAgICB9DQorICAgICAgaWYgKHBhY2tlZEVudW1fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkRW51bUFycmF5KDEwMywgZmllbGRfbmFtZXNbMl0sIHBhY2tlZEVudW1NZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRFbnVtXyk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoaW50IGVsZW1lbnQgaW4gUGFja2VkSW50MzJMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZEludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkSW50MzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChsb25nIGVsZW1lbnQgaW4gUGFja2VkSW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZEludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkSW50NjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoICh1aW50IGVsZW1lbnQgaW4gUGFja2VkVWludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkVWludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkVWludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAodWxvbmcgZWxlbWVudCBpbiBQYWNrZWRVaW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRVaW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRVaW50NjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChpbnQgZWxlbWVudCBpbiBQYWNrZWRTaW50MzJMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRTaW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRTaW50MzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChsb25nIGVsZW1lbnQgaW4gUGFja2VkU2ludDY0TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQ2NFNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkU2ludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkU2ludDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogcGFja2VkRml4ZWQzMl8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZEZpeGVkMzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRGaXhlZDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogcGFja2VkRml4ZWQ2NF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZEZpeGVkNjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRGaXhlZDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogcGFja2VkU2ZpeGVkMzJfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRTZml4ZWQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZFNmaXhlZDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogcGFja2VkU2ZpeGVkNjRfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRTZml4ZWQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZFNmaXhlZDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogcGFja2VkRmxvYXRfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRGbG9hdF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZEZsb2F0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogcGFja2VkRG91YmxlXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkRG91YmxlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkRG91YmxlTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSAxICogcGFja2VkQm9vbF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZEJvb2xfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRCb29sTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKHBhY2tlZEVudW1fLkNvdW50ID4gMCkgew0KKyAgICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBlbGVtZW50IGluIHBhY2tlZEVudW1fKSB7DQorICAgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZU5vVGFnKChpbnQpIGVsZW1lbnQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICAgIHNpemUgKz0gMjsNCisgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZSgodWludCkgZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkRW51bU1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdFBhY2tlZFR5cGVzIE1ha2VSZWFkT25seSgpIHsNCisgICAgICBwYWNrZWRJbnQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkSW50NjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZFVpbnQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkVWludDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRTaW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZFNpbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkRml4ZWQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkRml4ZWQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkU2ZpeGVkMzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZFNmaXhlZDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRGbG9hdF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkRG91YmxlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRCb29sXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRFbnVtXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RQYWNrZWRUeXBlcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0UGFja2VkVHlwZXMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RQYWNrZWRUeXBlcyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RQYWNrZWRUeXBlcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0UGFja2VkVHlwZXMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0UGFja2VkVHlwZXMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0UGFja2VkVHlwZXMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RQYWNrZWRUeXBlcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRUeXBlcy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UGFja2VkVHlwZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZFR5cGVzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFBhY2tlZFR5cGVzIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0UGFja2VkVHlwZXMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdFBhY2tlZFR5cGVzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdFBhY2tlZFR5cGVzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZFR5cGVzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZEludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQzMl8uQWRkKG90aGVyLnBhY2tlZEludDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkSW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZEludDY0Xy5BZGQob3RoZXIucGFja2VkSW50NjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWRVaW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQzMl8uQWRkKG90aGVyLnBhY2tlZFVpbnQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZFVpbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkVWludDY0Xy5BZGQob3RoZXIucGFja2VkVWludDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkU2ludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRTaW50MzJfLkFkZChvdGhlci5wYWNrZWRTaW50MzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWRTaW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQ2NF8uQWRkKG90aGVyLnBhY2tlZFNpbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZEZpeGVkMzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZEZpeGVkMzJfLkFkZChvdGhlci5wYWNrZWRGaXhlZDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkRml4ZWQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkRml4ZWQ2NF8uQWRkKG90aGVyLnBhY2tlZEZpeGVkNjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWRTZml4ZWQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkU2ZpeGVkMzJfLkFkZChvdGhlci5wYWNrZWRTZml4ZWQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZFNmaXhlZDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQ2NF8uQWRkKG90aGVyLnBhY2tlZFNmaXhlZDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkRmxvYXRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZEZsb2F0Xy5BZGQob3RoZXIucGFja2VkRmxvYXRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWREb3VibGVfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZERvdWJsZV8uQWRkKG90aGVyLnBhY2tlZERvdWJsZV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZEJvb2xfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZEJvb2xfLkFkZChvdGhlci5wYWNrZWRCb29sXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkRW51bV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkRW51bV8uQWRkKG90aGVyLnBhY2tlZEVudW1fKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RQYWNrZWRUeXBlc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0UGFja2VkVHlwZXNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzIyOg0KKyAgICAgICAgICAgIGNhc2UgNzIwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWRJbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzMwOg0KKyAgICAgICAgICAgIGNhc2UgNzI4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWRJbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzM4Og0KKyAgICAgICAgICAgIGNhc2UgNzM2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkVUludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkVWludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NDY6DQorICAgICAgICAgICAgY2FzZSA3NDQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRVSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWRVaW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc1NDoNCisgICAgICAgICAgICBjYXNlIDc1Mjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZFNpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzYyOg0KKyAgICAgICAgICAgIGNhc2UgNzYwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ludDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkU2ludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NzA6DQorICAgICAgICAgICAgY2FzZSA3NzM6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkRml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzc4Og0KKyAgICAgICAgICAgIGNhc2UgNzc3OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRml4ZWQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZEZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc4NjoNCisgICAgICAgICAgICBjYXNlIDc4OTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNGaXhlZDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkU2ZpeGVkMzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc5NDoNCisgICAgICAgICAgICBjYXNlIDc5Mzogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNGaXhlZDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkU2ZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgwMjoNCisgICAgICAgICAgICBjYXNlIDgwNTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEZsb2F0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkRmxvYXRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgxMDoNCisgICAgICAgICAgICBjYXNlIDgwOTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZERvdWJsZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZERvdWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODE4Og0KKyAgICAgICAgICAgIGNhc2UgODE2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkQm9vbEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZEJvb2xfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgyNjoNCisgICAgICAgICAgICBjYXNlIDgyNDogew0KKyAgICAgICAgICAgICAgc2NnOjpJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd25JdGVtczsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXk8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZEVudW1fLCBvdXQgdW5rbm93bkl0ZW1zKTsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duSXRlbXMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCByYXdWYWx1ZSBpbiB1bmtub3duSXRlbXMpDQorICAgICAgICAgICAgICAgICAgaWYgKHJhd1ZhbHVlIGlzIGludCkNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgxMDMsICh1bG9uZykoaW50KXJhd1ZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gUGFja2VkSW50MzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZEludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZEludDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRJbnQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0UGFja2VkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZEludDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkSW50MzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkSW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZEludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZEludDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkSW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkSW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gUGFja2VkSW50NjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZEludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZEludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRJbnQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEdldFBhY2tlZEludDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRJbnQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZEludDY0KGludCBpbmRleCwgbG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkSW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZEludDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEludDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZEludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVpbnQ+IFBhY2tlZFVpbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkVWludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZFVpbnQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkVWludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgR2V0UGFja2VkVWludDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRVaW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRVaW50MzIoaW50IGluZGV4LCB1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkVWludDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkVWludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkVWludDMyKHNjZzo6SUVudW1lcmFibGU8dWludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRVaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVsb25nPiBQYWNrZWRVaW50NjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZFVpbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRVaW50NjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZFVpbnQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBHZXRQYWNrZWRVaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZFVpbnQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZFVpbnQ2NChpbnQgaW5kZXgsIHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkVWludDY0KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZFVpbnQ2NChzY2c6OklFbnVtZXJhYmxlPHVsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkVWludDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZFVpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkVWludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBQYWNrZWRTaW50MzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZFNpbnQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRTaW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZFNpbnQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0UGFja2VkU2ludDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRTaW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRTaW50MzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ludDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRTaW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZFNpbnQzMihzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRTaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGxvbmc+IFBhY2tlZFNpbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkU2ludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZFNpbnQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkU2ludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0UGFja2VkU2ludDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRTaW50NjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRTaW50NjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkU2ludDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkU2ludDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRTaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVpbnQ+IFBhY2tlZEZpeGVkMzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZEZpeGVkMzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkRml4ZWQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkRml4ZWQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1aW50IEdldFBhY2tlZEZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZEZpeGVkMzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRGaXhlZDMyKGludCBpbmRleCwgdWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGaXhlZDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRGaXhlZDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRml4ZWQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZEZpeGVkMzIoc2NnOjpJRW51bWVyYWJsZTx1aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRml4ZWQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRGaXhlZDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGaXhlZDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IFBhY2tlZEZpeGVkNjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZEZpeGVkNjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkRml4ZWQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkRml4ZWQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBHZXRQYWNrZWRGaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRGaXhlZDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkRml4ZWQ2NChpbnQgaW5kZXgsIHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZpeGVkNjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZEZpeGVkNjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRml4ZWQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZEZpeGVkNjQoc2NnOjpJRW51bWVyYWJsZTx1bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZpeGVkNjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkRml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRml4ZWQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gUGFja2VkU2ZpeGVkMzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZFNmaXhlZDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZFNmaXhlZDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRTZml4ZWQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0UGFja2VkU2ZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZFNmaXhlZDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkU2ZpeGVkMzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ZpeGVkMzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZFNmaXhlZDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZFNmaXhlZDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ZpeGVkMzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkU2ZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNmaXhlZDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gUGFja2VkU2ZpeGVkNjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZFNmaXhlZDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZFNmaXhlZDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRTZml4ZWQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEdldFBhY2tlZFNmaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRTZml4ZWQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZFNmaXhlZDY0KGludCBpbmRleCwgbG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkU2ZpeGVkNjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZFNmaXhlZDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNmaXhlZDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZFNmaXhlZDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGZsb2F0PiBQYWNrZWRGbG9hdExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkRmxvYXRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkRmxvYXRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZEZsb2F0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEdldFBhY2tlZEZsb2F0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRGbG9hdChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZEZsb2F0KGludCBpbmRleCwgZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRmxvYXRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZEZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZsb2F0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkRmxvYXQoc2NnOjpJRW51bWVyYWJsZTxmbG9hdD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZsb2F0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZEZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGbG9hdF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGRvdWJsZT4gUGFja2VkRG91YmxlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWREb3VibGVfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkRG91YmxlQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWREb3VibGVDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZG91YmxlIEdldFBhY2tlZERvdWJsZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkRG91YmxlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkRG91YmxlKGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZERvdWJsZV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkRG91YmxlKGRvdWJsZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWREb3VibGVfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWREb3VibGUoc2NnOjpJRW51bWVyYWJsZTxkb3VibGU+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWREb3VibGVfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkRG91YmxlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWREb3VibGVfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxib29sPiBQYWNrZWRCb29sTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRCb29sXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZEJvb2xDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZEJvb2xDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBHZXRQYWNrZWRCb29sKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRCb29sKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkQm9vbChpbnQgaW5kZXgsIGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkQm9vbF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkQm9vbChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEJvb2xfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRCb29sKHNjZzo6SUVudW1lcmFibGU8Ym9vbD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEJvb2xfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkQm9vbCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkQm9vbF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiBQYWNrZWRFbnVtTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRFbnVtXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZEVudW1Db3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZEVudW1Db3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gR2V0UGFja2VkRW51bShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkRW51bShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZEVudW0oaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRFbnVtX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRFbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEVudW1fLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRFbnVtKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRFbnVtXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZEVudW0oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEVudW1fLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RQYWNrZWRUeXBlcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFVucGFja2VkVHlwZXMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0VW5wYWNrZWRUeXBlcywgVGVzdFVucGFja2VkVHlwZXMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RVbnBhY2tlZFR5cGVzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RVbnBhY2tlZFR5cGVzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0VW5wYWNrZWRUeXBlcygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFVucGFja2VkVHlwZXNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInVucGFja2VkX2Jvb2wiLCAidW5wYWNrZWRfZG91YmxlIiwgInVucGFja2VkX2VudW0iLCAidW5wYWNrZWRfZml4ZWQzMiIsICJ1bnBhY2tlZF9maXhlZDY0IiwgInVucGFja2VkX2Zsb2F0IiwgInVucGFja2VkX2ludDMyIiwgInVucGFja2VkX2ludDY0IiwgInVucGFja2VkX3NmaXhlZDMyIiwgInVucGFja2VkX3NmaXhlZDY0IiwgInVucGFja2VkX3NpbnQzMiIsICJ1bnBhY2tlZF9zaW50NjQiLCAidW5wYWNrZWRfdWludDMyIiwgInVucGFja2VkX3VpbnQ2NCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0VW5wYWNrZWRUeXBlc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4MTYsIDgwOSwgODI0LCA3NzMsIDc3NywgODA1LCA3MjAsIDcyOCwgNzg5LCA3OTMsIDc1MiwgNzYwLCA3MzYsIDc0NCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFVucGFja2VkVHlwZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFVucGFja2VkVHlwZXMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0VW5wYWNrZWRUeXBlc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0VW5wYWNrZWRUeXBlcywgVGVzdFVucGFja2VkVHlwZXMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFVucGFja2VkVHlwZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkSW50MzJGaWVsZE51bWJlciA9IDkwOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gdW5wYWNrZWRJbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFVucGFja2VkSW50MzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHVucGFja2VkSW50MzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRJbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRJbnQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFVucGFja2VkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVucGFja2VkSW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEludDY0RmllbGROdW1iZXIgPSA5MTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiB1bnBhY2tlZEludDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBVbnBhY2tlZEludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZEludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkSW50NjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkSW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0VW5wYWNrZWRJbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRJbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkVWludDMyRmllbGROdW1iZXIgPSA5MjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PiB1bnBhY2tlZFVpbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVpbnQ+IFVucGFja2VkVWludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFVpbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFVpbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRVaW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IEdldFVucGFja2VkVWludDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZFVpbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkVWludDY0RmllbGROdW1iZXIgPSA5MzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4gdW5wYWNrZWRVaW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IFVucGFja2VkVWludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFVpbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFVpbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRVaW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBHZXRVbnBhY2tlZFVpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRVaW50NjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFNpbnQzMkZpZWxkTnVtYmVyID0gOTQ7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiB1bnBhY2tlZFNpbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFVucGFja2VkU2ludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFNpbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFNpbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRTaW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRVbnBhY2tlZFNpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRTaW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFNpbnQ2NEZpZWxkTnVtYmVyID0gOTU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gdW5wYWNrZWRTaW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGxvbmc+IFVucGFja2VkU2ludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFNpbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFNpbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRTaW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0VW5wYWNrZWRTaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVucGFja2VkU2ludDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRGaXhlZDMyRmllbGROdW1iZXIgPSA5NjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PiB1bnBhY2tlZEZpeGVkMzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1aW50PiBVbnBhY2tlZEZpeGVkMzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHVucGFja2VkRml4ZWQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZEZpeGVkMzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkRml4ZWQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgR2V0VW5wYWNrZWRGaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZEZpeGVkMzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEZpeGVkNjRGaWVsZE51bWJlciA9IDk3Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiB1bnBhY2tlZEZpeGVkNjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IFVucGFja2VkRml4ZWQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRGaXhlZDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkRml4ZWQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRGaXhlZDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgR2V0VW5wYWNrZWRGaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZEZpeGVkNjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFNmaXhlZDMyRmllbGROdW1iZXIgPSA5ODsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IHVucGFja2VkU2ZpeGVkMzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBVbnBhY2tlZFNmaXhlZDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFNmaXhlZDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkU2ZpeGVkMzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkU2ZpeGVkMzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRVbnBhY2tlZFNmaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZFNmaXhlZDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRTZml4ZWQ2NEZpZWxkTnVtYmVyID0gOTk7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gdW5wYWNrZWRTZml4ZWQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gVW5wYWNrZWRTZml4ZWQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRTZml4ZWQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFNmaXhlZDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZFNmaXhlZDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEdldFVucGFja2VkU2ZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVucGFja2VkU2ZpeGVkNjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEZsb2F0RmllbGROdW1iZXIgPSAxMDA7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8ZmxvYXQ+IHVucGFja2VkRmxvYXRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGZsb2F0PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxmbG9hdD4gVW5wYWNrZWRGbG9hdExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRGbG9hdF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZEZsb2F0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZEZsb2F0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBHZXRVbnBhY2tlZEZsb2F0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZEZsb2F0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWREb3VibGVGaWVsZE51bWJlciA9IDEwMTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxkb3VibGU+IHVucGFja2VkRG91YmxlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxkb3VibGU+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGRvdWJsZT4gVW5wYWNrZWREb3VibGVMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHVucGFja2VkRG91YmxlXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkRG91YmxlQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZERvdWJsZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZG91YmxlIEdldFVucGFja2VkRG91YmxlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZERvdWJsZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkQm9vbEZpZWxkTnVtYmVyID0gMTAyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGJvb2w+IHVucGFja2VkQm9vbF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Ym9vbD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Ym9vbD4gVW5wYWNrZWRCb29sTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZEJvb2xfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRCb29sQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZEJvb2xfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgR2V0VW5wYWNrZWRCb29sKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZEJvb2xfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEVudW1GaWVsZE51bWJlciA9IDEwMzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gdW5wYWNrZWRFbnVtXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IFVucGFja2VkRW51bUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRFbnVtXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkRW51bUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRFbnVtXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBHZXRVbnBhY2tlZEVudW0oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVucGFja2VkRW51bV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFVucGFja2VkVHlwZXNGaWVsZE5hbWVzOw0KKyAgICAgIGlmICh1bnBhY2tlZEludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyQXJyYXkoOTAsIGZpZWxkX25hbWVzWzZdLCB1bnBhY2tlZEludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1bnBhY2tlZEludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0QXJyYXkoOTEsIGZpZWxkX25hbWVzWzddLCB1bnBhY2tlZEludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1bnBhY2tlZFVpbnQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50MzJBcnJheSg5MiwgZmllbGRfbmFtZXNbMTJdLCB1bnBhY2tlZFVpbnQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRVaW50NjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlVUludDY0QXJyYXkoOTMsIGZpZWxkX25hbWVzWzEzXSwgdW5wYWNrZWRVaW50NjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHVucGFja2VkU2ludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNJbnQzMkFycmF5KDk0LCBmaWVsZF9uYW1lc1sxMF0sIHVucGFja2VkU2ludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1bnBhY2tlZFNpbnQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTSW50NjRBcnJheSg5NSwgZmllbGRfbmFtZXNbMTFdLCB1bnBhY2tlZFNpbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRGaXhlZDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkMzJBcnJheSg5NiwgZmllbGRfbmFtZXNbM10sIHVucGFja2VkRml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRGaXhlZDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkNjRBcnJheSg5NywgZmllbGRfbmFtZXNbNF0sIHVucGFja2VkRml4ZWQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRTZml4ZWQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQzMkFycmF5KDk4LCBmaWVsZF9uYW1lc1s4XSwgdW5wYWNrZWRTZml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQ2NEFycmF5KDk5LCBmaWVsZF9uYW1lc1s5XSwgdW5wYWNrZWRTZml4ZWQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRGbG9hdF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdEFycmF5KDEwMCwgZmllbGRfbmFtZXNbNV0sIHVucGFja2VkRmxvYXRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHVucGFja2VkRG91YmxlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZURvdWJsZUFycmF5KDEwMSwgZmllbGRfbmFtZXNbMV0sIHVucGFja2VkRG91YmxlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1bnBhY2tlZEJvb2xfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbEFycmF5KDEwMiwgZmllbGRfbmFtZXNbMF0sIHVucGFja2VkQm9vbF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW1BcnJheSgxMDMsIGZpZWxkX25hbWVzWzJdLCB1bnBhY2tlZEVudW1fKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChpbnQgZWxlbWVudCBpbiBVbnBhY2tlZEludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkSW50MzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAobG9uZyBlbGVtZW50IGluIFVucGFja2VkSW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRJbnQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoICh1aW50IGVsZW1lbnQgaW4gVW5wYWNrZWRVaW50MzJMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkVWludDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHVsb25nIGVsZW1lbnQgaW4gVW5wYWNrZWRVaW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkVWludDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIFVucGFja2VkU2ludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZFNpbnQzMl8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChsb25nIGVsZW1lbnQgaW4gVW5wYWNrZWRTaW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkU2ludDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHVucGFja2VkRml4ZWQzMl8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRGaXhlZDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHVucGFja2VkRml4ZWQ2NF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRGaXhlZDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHVucGFja2VkU2ZpeGVkMzJfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkU2ZpeGVkMzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogdW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDQgKiB1bnBhY2tlZEZsb2F0Xy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZEZsb2F0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHVucGFja2VkRG91YmxlXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZERvdWJsZV8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDEgKiB1bnBhY2tlZEJvb2xfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkQm9vbF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBpZiAodW5wYWNrZWRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gZWxlbWVudCBpbiB1bnBhY2tlZEVudW1fKSB7DQorICAgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZU5vVGFnKChpbnQpIGVsZW1lbnQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkRW51bV8uQ291bnQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRUeXBlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdFVucGFja2VkVHlwZXMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHVucGFja2VkSW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkSW50NjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkVWludDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB1bnBhY2tlZFVpbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRTaW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkU2ludDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB1bnBhY2tlZEZpeGVkMzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkRml4ZWQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRTZml4ZWQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRTZml4ZWQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRGbG9hdF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWREb3VibGVfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkQm9vbF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRFbnVtXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RVbnBhY2tlZFR5cGVzIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RVbnBhY2tlZFR5cGVzLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0VW5wYWNrZWRUeXBlcyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RVbnBhY2tlZFR5cGVzIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RVbnBhY2tlZFR5cGVzIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFVucGFja2VkVHlwZXMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0VW5wYWNrZWRUeXBlcygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFVucGFja2VkVHlwZXMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRUeXBlcy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0VW5wYWNrZWRUeXBlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRUeXBlcy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RVbnBhY2tlZFR5cGVzIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0VW5wYWNrZWRUeXBlcykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0VW5wYWNrZWRUeXBlcykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RVbnBhY2tlZFR5cGVzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkVHlwZXMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRJbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRJbnQzMl8uQWRkKG90aGVyLnVucGFja2VkSW50MzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZEludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZEludDY0Xy5BZGQob3RoZXIudW5wYWNrZWRJbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkVWludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZFVpbnQzMl8uQWRkKG90aGVyLnVucGFja2VkVWludDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRVaW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVucGFja2VkVWludDY0Xy5BZGQob3RoZXIudW5wYWNrZWRVaW50NjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZFNpbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50MzJfLkFkZChvdGhlci51bnBhY2tlZFNpbnQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkU2ludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZFNpbnQ2NF8uQWRkKG90aGVyLnVucGFja2VkU2ludDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRGaXhlZDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkMzJfLkFkZChvdGhlci51bnBhY2tlZEZpeGVkMzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZEZpeGVkNjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVucGFja2VkRml4ZWQ2NF8uQWRkKG90aGVyLnVucGFja2VkRml4ZWQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkU2ZpeGVkMzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVucGFja2VkU2ZpeGVkMzJfLkFkZChvdGhlci51bnBhY2tlZFNmaXhlZDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQ2NF8uQWRkKG90aGVyLnVucGFja2VkU2ZpeGVkNjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZEZsb2F0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZEZsb2F0Xy5BZGQob3RoZXIudW5wYWNrZWRGbG9hdF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkRG91YmxlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZERvdWJsZV8uQWRkKG90aGVyLnVucGFja2VkRG91YmxlXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRCb29sXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZEJvb2xfLkFkZChvdGhlci51bnBhY2tlZEJvb2xfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZEVudW1fLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVucGFja2VkRW51bV8uQWRkKG90aGVyLnVucGFja2VkRW51bV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdFVucGFja2VkVHlwZXNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFVucGFja2VkVHlwZXNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzIyOg0KKyAgICAgICAgICAgIGNhc2UgNzIwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZEludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3MzA6DQorICAgICAgICAgICAgY2FzZSA3Mjg6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRJbnQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkSW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDczODoNCisgICAgICAgICAgICBjYXNlIDczNjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFVJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkVWludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NDY6DQorICAgICAgICAgICAgY2FzZSA3NDQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRVSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZFVpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzU0Og0KKyAgICAgICAgICAgIGNhc2UgNzUyOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRTaW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc2MjoNCisgICAgICAgICAgICBjYXNlIDc2MDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNJbnQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkU2ludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NzA6DQorICAgICAgICAgICAgY2FzZSA3NzM6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRGaXhlZDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3Nzg6DQorICAgICAgICAgICAgY2FzZSA3Nzc6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRGaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3ODY6DQorICAgICAgICAgICAgY2FzZSA3ODk6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTRml4ZWQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkU2ZpeGVkMzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc5NDoNCisgICAgICAgICAgICBjYXNlIDc5Mzogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNGaXhlZDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRTZml4ZWQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODAyOg0KKyAgICAgICAgICAgIGNhc2UgODA1OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRmxvYXRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZEZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4MTA6DQorICAgICAgICAgICAgY2FzZSA4MDk6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWREb3VibGVBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZERvdWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODE4Og0KKyAgICAgICAgICAgIGNhc2UgODE2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkQm9vbEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkQm9vbF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODI2Og0KKyAgICAgICAgICAgIGNhc2UgODI0OiB7DQorICAgICAgICAgICAgICBzY2c6OklDb2xsZWN0aW9uPG9iamVjdD4gdW5rbm93bkl0ZW1zOw0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEVudW1BcnJheTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4odGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRFbnVtXywgb3V0IHVua25vd25JdGVtcyk7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkl0ZW1zICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgcmF3VmFsdWUgaW4gdW5rbm93bkl0ZW1zKQ0KKyAgICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZSBpcyBpbnQpDQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoMTAzLCAodWxvbmcpKGludClyYXdWYWx1ZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IFVucGFja2VkSW50MzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkSW50MzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRJbnQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRJbnQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0VW5wYWNrZWRJbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRJbnQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkSW50MzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRJbnQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRJbnQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRJbnQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkSW50MzIoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEludDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkSW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkSW50MzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBVbnBhY2tlZEludDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZEludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkSW50NjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkSW50NjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBHZXRVbnBhY2tlZEludDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZEludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRJbnQ2NChpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRJbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRJbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkSW50NjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZEludDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkSW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRJbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRJbnQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVpbnQ+IFVucGFja2VkVWludDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZFVpbnQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZFVpbnQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRVaW50MzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBHZXRVbnBhY2tlZFVpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRVaW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZFVpbnQzMihpbnQgaW5kZXgsIHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkVWludDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZFVpbnQzMihzY2c6OklFbnVtZXJhYmxlPHVpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFVpbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZFVpbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50MzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1bG9uZz4gVW5wYWNrZWRVaW50NjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkVWludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkVWludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbnBhY2tlZFVpbnQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBHZXRVbnBhY2tlZFVpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRVaW50NjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZFVpbnQ2NChpbnQgaW5kZXgsIHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkVWludDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZFVpbnQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFVpbnQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkVWludDY0KHNjZzo6SUVudW1lcmFibGU8dWxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFVpbnQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZFVpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50NjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IFVucGFja2VkU2ludDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZFNpbnQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZFNpbnQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRTaW50MzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFVucGFja2VkU2ludDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZFNpbnQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkU2ludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ludDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZFNpbnQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZFNpbnQzMihzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ludDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkU2ludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNpbnQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGxvbmc+IFVucGFja2VkU2ludDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZFNpbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZFNpbnQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRTaW50NjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBHZXRVbnBhY2tlZFNpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRTaW50NjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZFNpbnQ2NChpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50NjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkU2ludDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50NjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZFNpbnQ2NChzY2c6OklFbnVtZXJhYmxlPGxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNpbnQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZFNpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50NjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1aW50PiBVbnBhY2tlZEZpeGVkMzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkRml4ZWQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZEZpeGVkMzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkRml4ZWQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1aW50IEdldFVucGFja2VkRml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRGaXhlZDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRGaXhlZDMyKGludCBpbmRleCwgdWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkMzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkRml4ZWQzMih1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRml4ZWQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkRml4ZWQzMihzY2c6OklFbnVtZXJhYmxlPHVpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkMzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRGaXhlZDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkMzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1bG9uZz4gVW5wYWNrZWRGaXhlZDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZEZpeGVkNjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRGaXhlZDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbnBhY2tlZEZpeGVkNjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgR2V0VW5wYWNrZWRGaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZEZpeGVkNjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZEZpeGVkNjQoaW50IGluZGV4LCB1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkNjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkRml4ZWQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkNjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZEZpeGVkNjQoc2NnOjpJRW51bWVyYWJsZTx1bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRml4ZWQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZEZpeGVkNjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRml4ZWQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gVW5wYWNrZWRTZml4ZWQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRTZml4ZWQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZFNmaXhlZDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbnBhY2tlZFNmaXhlZDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXRVbnBhY2tlZFNmaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZFNmaXhlZDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRTZml4ZWQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNmaXhlZDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZFNmaXhlZDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNmaXhlZDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRTZml4ZWQzMihzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ZpeGVkMzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRTZml4ZWQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGxvbmc+IFVucGFja2VkU2ZpeGVkNjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkU2ZpeGVkNjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRTZml4ZWQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRTZml4ZWQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEdldFVucGFja2VkU2ZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkU2ZpeGVkNjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZFNmaXhlZDY0KGludCBpbmRleCwgbG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNmaXhlZDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZFNmaXhlZDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkU2ZpeGVkNjQoc2NnOjpJRW51bWVyYWJsZTxsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZFNmaXhlZDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNmaXhlZDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8ZmxvYXQ+IFVucGFja2VkRmxvYXRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkRmxvYXRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRGbG9hdENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRGbG9hdENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBHZXRVbnBhY2tlZEZsb2F0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZEZsb2F0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRGbG9hdChpbnQgaW5kZXgsIGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRmxvYXRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkRmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRGbG9hdF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkRmxvYXQoc2NnOjpJRW51bWVyYWJsZTxmbG9hdD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRmxvYXRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRGbG9hdCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRGbG9hdF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGRvdWJsZT4gVW5wYWNrZWREb3VibGVMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkRG91YmxlXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkRG91YmxlQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbnBhY2tlZERvdWJsZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBkb3VibGUgR2V0VW5wYWNrZWREb3VibGUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkRG91YmxlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWREb3VibGUoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWREb3VibGVfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkRG91YmxlKGRvdWJsZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZERvdWJsZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkRG91YmxlKHNjZzo6SUVudW1lcmFibGU8ZG91YmxlPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWREb3VibGVfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWREb3VibGUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRG91YmxlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Ym9vbD4gVW5wYWNrZWRCb29sTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZEJvb2xfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRCb29sQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbnBhY2tlZEJvb2xDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBHZXRVbnBhY2tlZEJvb2woaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkQm9vbChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkQm9vbChpbnQgaW5kZXgsIGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRCb29sX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZEJvb2woYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEJvb2xfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZEJvb2woc2NnOjpJRW51bWVyYWJsZTxib29sPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRCb29sXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkQm9vbCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRCb29sXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IFVucGFja2VkRW51bUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRFbnVtXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkRW51bUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRFbnVtQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEdldFVucGFja2VkRW51bShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRFbnVtKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRFbnVtKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRFbnVtX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRFbnVtXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRFbnVtKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEVudW1fLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRFbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEVudW1fLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0UGFja2VkRXh0ZW5zaW9ucyA6IHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxUZXN0UGFja2VkRXh0ZW5zaW9ucywgVGVzdFBhY2tlZEV4dGVuc2lvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RQYWNrZWRFeHRlbnNpb25zKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RQYWNrZWRFeHRlbnNpb25zIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0UGFja2VkRXh0ZW5zaW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFBhY2tlZEV4dGVuc2lvbnNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFBhY2tlZEV4dGVuc2lvbnNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UGFja2VkRXh0ZW5zaW9ucyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UGFja2VkRXh0ZW5zaW9ucyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRFeHRlbnNpb25zX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RQYWNrZWRFeHRlbnNpb25zLCBUZXN0UGFja2VkRXh0ZW5zaW9ucy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIUV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFBhY2tlZEV4dGVuc2lvbnNGaWVsZE5hbWVzOw0KKyAgICAgIHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxUZXN0UGFja2VkRXh0ZW5zaW9ucywgVGVzdFBhY2tlZEV4dGVuc2lvbnMuQnVpbGRlcj4uRXh0ZW5zaW9uV3JpdGVyIGV4dGVuc2lvbldyaXRlciA9IENyZWF0ZUV4dGVuc2lvbldyaXRlcih0aGlzKTsNCisgICAgICBleHRlbnNpb25Xcml0ZXIuV3JpdGVVbnRpbCg1MzY4NzA5MTIsIG91dHB1dCk7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHNpemUgKz0gRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkRXh0ZW5zaW9ucyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdFBhY2tlZEV4dGVuc2lvbnMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdFBhY2tlZEV4dGVuc2lvbnMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkV4dGVuZGFibGVCdWlsZGVyPFRlc3RQYWNrZWRFeHRlbnNpb25zLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0UGFja2VkRXh0ZW5zaW9ucyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RQYWNrZWRFeHRlbnNpb25zIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RQYWNrZWRFeHRlbnNpb25zIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0UGFja2VkRXh0ZW5zaW9ucygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFBhY2tlZEV4dGVuc2lvbnMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9ucy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UGFja2VkRXh0ZW5zaW9ucyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9ucy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RQYWNrZWRFeHRlbnNpb25zIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0UGFja2VkRXh0ZW5zaW9ucykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0UGFja2VkRXh0ZW5zaW9ucykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RQYWNrZWRFeHRlbnNpb25zIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgIHRoaXMuTWVyZ2VFeHRlbnNpb25GaWVsZHMob3RoZXIpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdFBhY2tlZEV4dGVuc2lvbnNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFBhY2tlZEV4dGVuc2lvbnNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0UGFja2VkRXh0ZW5zaW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdER5bmFtaWNFeHRlbnNpb25zIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdER5bmFtaWNFeHRlbnNpb25zLCBUZXN0RHluYW1pY0V4dGVuc2lvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3REeW5hbWljRXh0ZW5zaW9ucygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0RHluYW1pY0V4dGVuc2lvbnMgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3REeW5hbWljRXh0ZW5zaW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdER5bmFtaWNFeHRlbnNpb25zRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJkeW5hbWljX2VudW1fZXh0ZW5zaW9uIiwgImR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24iLCAiZW51bV9leHRlbnNpb24iLCAibWVzc2FnZV9leHRlbnNpb24iLCAicGFja2VkX2V4dGVuc2lvbiIsICJyZXBlYXRlZF9leHRlbnNpb24iLCAic2NhbGFyX2V4dGVuc2lvbiIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0RHluYW1pY0V4dGVuc2lvbnNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTYwMTYsIDE2MDM0LCAxNjAwOCwgMTYwMjYsIDE2MDUwLCAxNjA0MiwgMTYwMDUgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHluYW1pY0V4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RHluYW1pY0V4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdER5bmFtaWNFeHRlbnNpb25zIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3REeW5hbWljRXh0ZW5zaW9ucywgVGVzdER5bmFtaWNFeHRlbnNpb25zLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REeW5hbWljRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgICNyZWdpb24gTmVzdGVkIHR5cGVzDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7DQorICAgICAgcHVibGljIGVudW0gRHluYW1pY0VudW1UeXBlIHsNCisgICAgICAgIERZTkFNSUNfRk9PID0gMjIwMCwNCisgICAgICAgIERZTkFNSUNfQkFSID0gMjIwMSwNCisgICAgICAgIERZTkFNSUNfQkFaID0gMjIwMiwNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRHluYW1pY01lc3NhZ2VUeXBlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8RHluYW1pY01lc3NhZ2VUeXBlLCBEeW5hbWljTWVzc2FnZVR5cGUuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBEeW5hbWljTWVzc2FnZVR5cGUoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IER5bmFtaWNNZXNzYWdlVHlwZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgRHluYW1pY01lc3NhZ2VUeXBlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZHluYW1pY01lc3NhZ2VUeXBlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJkeW5hbWljX2ZpZWxkIiB9Ow0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9keW5hbWljTWVzc2FnZVR5cGVGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTY4MDAgfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2VUeXBlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIER5bmFtaWNNZXNzYWdlVHlwZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRHluYW1pY01lc3NhZ2VUeXBlIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHluYW1pY0V4dGVuc2lvbnNfRHluYW1pY01lc3NhZ2VUeXBlX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPER5bmFtaWNNZXNzYWdlVHlwZSwgRHluYW1pY01lc3NhZ2VUeXBlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHluYW1pY0V4dGVuc2lvbnNfRHluYW1pY01lc3NhZ2VUeXBlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBEeW5hbWljRmllbGRGaWVsZE51bWJlciA9IDIxMDA7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzRHluYW1pY0ZpZWxkOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgZHluYW1pY0ZpZWxkXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0R5bmFtaWNGaWVsZCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNEeW5hbWljRmllbGQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgRHluYW1pY0ZpZWxkIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGR5bmFtaWNGaWVsZF87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfZHluYW1pY01lc3NhZ2VUeXBlRmllbGROYW1lczsNCisgICAgICAgICAgaWYgKGhhc0R5bmFtaWNGaWVsZCkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIxMDAsIGZpZWxkX25hbWVzWzBdLCBEeW5hbWljRmllbGQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIGlmIChoYXNEeW5hbWljRmllbGQpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIxMDAsIER5bmFtaWNGaWVsZCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlVHlwZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZVR5cGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2VUeXBlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZVR5cGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlVHlwZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZVR5cGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2VUeXBlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlVHlwZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZVR5cGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2VUeXBlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIER5bmFtaWNNZXNzYWdlVHlwZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoRHluYW1pY01lc3NhZ2VUeXBlIHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8RHluYW1pY01lc3NhZ2VUeXBlLCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKER5bmFtaWNNZXNzYWdlVHlwZSBjbG9uZUZyb20pIHsNCisgICAgICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgICAgICBwcml2YXRlIER5bmFtaWNNZXNzYWdlVHlwZSByZXN1bHQ7DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIER5bmFtaWNNZXNzYWdlVHlwZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgRHluYW1pY01lc3NhZ2VUeXBlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IER5bmFtaWNNZXNzYWdlVHlwZSgpOw0KKyAgICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBEeW5hbWljTWVzc2FnZVR5cGUgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZS5EZXNjcmlwdG9yOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBEeW5hbWljTWVzc2FnZVR5cGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljTWVzc2FnZVR5cGUuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBEeW5hbWljTWVzc2FnZVR5cGUgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGlzIER5bmFtaWNNZXNzYWdlVHlwZSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRHluYW1pY01lc3NhZ2VUeXBlKSBvdGhlcik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKER5bmFtaWNNZXNzYWdlVHlwZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzRHluYW1pY0ZpZWxkKSB7DQorICAgICAgICAgICAgICBEeW5hbWljRmllbGQgPSBvdGhlci5EeW5hbWljRmllbGQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2R5bmFtaWNNZXNzYWdlVHlwZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX2R5bmFtaWNNZXNzYWdlVHlwZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDE2ODAwOiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R5bmFtaWNGaWVsZCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR5bmFtaWNGaWVsZF8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNEeW5hbWljRmllbGQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHluYW1pY0ZpZWxkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBEeW5hbWljRmllbGQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHluYW1pY0ZpZWxkOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RHluYW1pY0ZpZWxkKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldER5bmFtaWNGaWVsZChpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNEeW5hbWljRmllbGQgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5keW5hbWljRmllbGRfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEeW5hbWljRmllbGQoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRHluYW1pY0ZpZWxkID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmR5bmFtaWNGaWVsZF8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgRHluYW1pY01lc3NhZ2VUeXBlKCkgew0KKyAgICAgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFNjYWxhckV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMjAwMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc1NjYWxhckV4dGVuc2lvbjsNCisgICAgcHJpdmF0ZSB1aW50IHNjYWxhckV4dGVuc2lvbl87DQorICAgIHB1YmxpYyBib29sIEhhc1NjYWxhckV4dGVuc2lvbiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1NjYWxhckV4dGVuc2lvbjsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBTY2FsYXJFeHRlbnNpb24gew0KKyAgICAgIGdldCB7IHJldHVybiBzY2FsYXJFeHRlbnNpb25fOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMjAwMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0VudW1FeHRlbnNpb247DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gZW51bUV4dGVuc2lvbl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPTzsNCisgICAgcHVibGljIGJvb2wgSGFzRW51bUV4dGVuc2lvbiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0VudW1FeHRlbnNpb247IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gRW51bUV4dGVuc2lvbiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGVudW1FeHRlbnNpb25fOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHluYW1pY0VudW1FeHRlbnNpb25GaWVsZE51bWJlciA9IDIwMDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEeW5hbWljRW51bUV4dGVuc2lvbjsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY0VudW1UeXBlIGR5bmFtaWNFbnVtRXh0ZW5zaW9uXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljRW51bVR5cGUuRFlOQU1JQ19GT087DQorICAgIHB1YmxpYyBib29sIEhhc0R5bmFtaWNFbnVtRXh0ZW5zaW9uIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHluYW1pY0VudW1FeHRlbnNpb247IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNFbnVtVHlwZSBEeW5hbWljRW51bUV4dGVuc2lvbiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR5bmFtaWNFbnVtRXh0ZW5zaW9uXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE1lc3NhZ2VFeHRlbnNpb25GaWVsZE51bWJlciA9IDIwMDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNNZXNzYWdlRXh0ZW5zaW9uOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIG1lc3NhZ2VFeHRlbnNpb25fOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNNZXNzYWdlRXh0ZW5zaW9uIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTWVzc2FnZUV4dGVuc2lvbjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBNZXNzYWdlRXh0ZW5zaW9uIHsNCisgICAgICBnZXQgeyByZXR1cm4gbWVzc2FnZUV4dGVuc2lvbl8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHluYW1pY01lc3NhZ2VFeHRlbnNpb25GaWVsZE51bWJlciA9IDIwMDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbjsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlIGR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uXzsNCisgICAgcHVibGljIGJvb2wgSGFzRHluYW1pY01lc3NhZ2VFeHRlbnNpb24gew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlIER5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHluYW1pY01lc3NhZ2VFeHRlbnNpb25fID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljTWVzc2FnZVR5cGUuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRFeHRlbnNpb25GaWVsZE51bWJlciA9IDIwMDU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiByZXBlYXRlZEV4dGVuc2lvbl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxzdHJpbmc+IFJlcGVhdGVkRXh0ZW5zaW9uTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEV4dGVuc2lvbl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEV4dGVuc2lvbkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRFeHRlbnNpb25fLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZEV4dGVuc2lvbihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRFeHRlbnNpb25fW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRFeHRlbnNpb25GaWVsZE51bWJlciA9IDIwMDY7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZEV4dGVuc2lvbk1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiBwYWNrZWRFeHRlbnNpb25fID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBQYWNrZWRFeHRlbnNpb25MaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZEV4dGVuc2lvbl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRFeHRlbnNpb25Db3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZEV4dGVuc2lvbl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFBhY2tlZEV4dGVuc2lvbihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkRXh0ZW5zaW9uX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0RHluYW1pY0V4dGVuc2lvbnNGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNTY2FsYXJFeHRlbnNpb24pIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkMzIoMjAwMCwgZmllbGRfbmFtZXNbNl0sIFNjYWxhckV4dGVuc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNFbnVtRXh0ZW5zaW9uKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDIwMDEsIGZpZWxkX25hbWVzWzJdLCAoaW50KSBFbnVtRXh0ZW5zaW9uLCBFbnVtRXh0ZW5zaW9uKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R5bmFtaWNFbnVtRXh0ZW5zaW9uKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDIwMDIsIGZpZWxkX25hbWVzWzBdLCAoaW50KSBEeW5hbWljRW51bUV4dGVuc2lvbiwgRHluYW1pY0VudW1FeHRlbnNpb24pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTWVzc2FnZUV4dGVuc2lvbikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZSgyMDAzLCBmaWVsZF9uYW1lc1szXSwgTWVzc2FnZUV4dGVuc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZSgyMDA0LCBmaWVsZF9uYW1lc1sxXSwgRHluYW1pY01lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRFeHRlbnNpb25fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoMjAwNSwgZmllbGRfbmFtZXNbNV0sIHJlcGVhdGVkRXh0ZW5zaW9uXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRFeHRlbnNpb25fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkU0ludDMyQXJyYXkoMjAwNiwgZmllbGRfbmFtZXNbNF0sIHBhY2tlZEV4dGVuc2lvbk1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZEV4dGVuc2lvbl8pOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc1NjYWxhckV4dGVuc2lvbikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZpeGVkMzJTaXplKDIwMDAsIFNjYWxhckV4dGVuc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNFbnVtRXh0ZW5zaW9uKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoMjAwMSwgKGludCkgRW51bUV4dGVuc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEeW5hbWljRW51bUV4dGVuc2lvbikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDIwMDIsIChpbnQpIER5bmFtaWNFbnVtRXh0ZW5zaW9uKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc01lc3NhZ2VFeHRlbnNpb24pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgyMDAzLCBNZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMjAwNCwgRHluYW1pY01lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGVsZW1lbnQgaW4gUmVwZWF0ZWRFeHRlbnNpb25MaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkRXh0ZW5zaW9uXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIFBhY2tlZEV4dGVuc2lvbkxpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50MzJTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZEV4dGVuc2lvbl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZEV4dGVuc2lvbk1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER5bmFtaWNFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHluYW1pY0V4dGVuc2lvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER5bmFtaWNFeHRlbnNpb25zIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHluYW1pY0V4dGVuc2lvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER5bmFtaWNFeHRlbnNpb25zIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHluYW1pY0V4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdER5bmFtaWNFeHRlbnNpb25zIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXBlYXRlZEV4dGVuc2lvbl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkRXh0ZW5zaW9uXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3REeW5hbWljRXh0ZW5zaW9ucyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0RHluYW1pY0V4dGVuc2lvbnMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3REeW5hbWljRXh0ZW5zaW9ucyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3REeW5hbWljRXh0ZW5zaW9ucyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0RHluYW1pY0V4dGVuc2lvbnMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0RHluYW1pY0V4dGVuc2lvbnMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0RHluYW1pY0V4dGVuc2lvbnMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RHluYW1pY0V4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdER5bmFtaWNFeHRlbnNpb25zIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0RHluYW1pY0V4dGVuc2lvbnMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdER5bmFtaWNFeHRlbnNpb25zKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdER5bmFtaWNFeHRlbnNpb25zIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc1NjYWxhckV4dGVuc2lvbikgew0KKyAgICAgICAgICBTY2FsYXJFeHRlbnNpb24gPSBvdGhlci5TY2FsYXJFeHRlbnNpb247DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRW51bUV4dGVuc2lvbikgew0KKyAgICAgICAgICBFbnVtRXh0ZW5zaW9uID0gb3RoZXIuRW51bUV4dGVuc2lvbjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEeW5hbWljRW51bUV4dGVuc2lvbikgew0KKyAgICAgICAgICBEeW5hbWljRW51bUV4dGVuc2lvbiA9IG90aGVyLkR5bmFtaWNFbnVtRXh0ZW5zaW9uOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc01lc3NhZ2VFeHRlbnNpb24pIHsNCisgICAgICAgICAgTWVyZ2VNZXNzYWdlRXh0ZW5zaW9uKG90aGVyLk1lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uKSB7DQorICAgICAgICAgIE1lcmdlRHluYW1pY01lc3NhZ2VFeHRlbnNpb24ob3RoZXIuRHluYW1pY01lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkRXh0ZW5zaW9uXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEV4dGVuc2lvbl8uQWRkKG90aGVyLnJlcGVhdGVkRXh0ZW5zaW9uXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkRXh0ZW5zaW9uXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRFeHRlbnNpb25fLkFkZChvdGhlci5wYWNrZWRFeHRlbnNpb25fKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3REeW5hbWljRXh0ZW5zaW9uc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0RHluYW1pY0V4dGVuc2lvbnNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTYwMDU6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNTY2FsYXJFeHRlbnNpb24gPSBpbnB1dC5SZWFkRml4ZWQzMihyZWYgcmVzdWx0LnNjYWxhckV4dGVuc2lvbl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTYwMDg6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5lbnVtRXh0ZW5zaW9uXywgb3V0IHVua25vd24pKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNFbnVtRXh0ZW5zaW9uID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgyMDAxLCAodWxvbmcpKGludCl1bmtub3duKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2MDE2OiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQuZHluYW1pY0VudW1FeHRlbnNpb25fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R5bmFtaWNFbnVtRXh0ZW5zaW9uID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgyMDAyLCAodWxvbmcpKGludCl1bmtub3duKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2MDI2OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc01lc3NhZ2VFeHRlbnNpb24pIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oTWVzc2FnZUV4dGVuc2lvbik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBNZXNzYWdlRXh0ZW5zaW9uID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2MDM0OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljTWVzc2FnZVR5cGUuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbikgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShEeW5hbWljTWVzc2FnZUV4dGVuc2lvbik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBEeW5hbWljTWVzc2FnZUV4dGVuc2lvbiA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjA0Mjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkRXh0ZW5zaW9uXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjA1MDoNCisgICAgICAgICAgICBjYXNlIDE2MDQ4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkRXh0ZW5zaW9uXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzU2NhbGFyRXh0ZW5zaW9uIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzU2NhbGFyRXh0ZW5zaW9uOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1aW50IFNjYWxhckV4dGVuc2lvbiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlNjYWxhckV4dGVuc2lvbjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0U2NhbGFyRXh0ZW5zaW9uKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRTY2FsYXJFeHRlbnNpb24odWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTY2FsYXJFeHRlbnNpb24gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnNjYWxhckV4dGVuc2lvbl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclNjYWxhckV4dGVuc2lvbigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU2NhbGFyRXh0ZW5zaW9uID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuc2NhbGFyRXh0ZW5zaW9uXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRW51bUV4dGVuc2lvbiB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRW51bUV4dGVuc2lvbjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gRW51bUV4dGVuc2lvbiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkVudW1FeHRlbnNpb247IH0NCisgICAgICAgIHNldCB7IFNldEVudW1FeHRlbnNpb24odmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEVudW1FeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRW51bUV4dGVuc2lvbiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZW51bUV4dGVuc2lvbl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckVudW1FeHRlbnNpb24oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0VudW1FeHRlbnNpb24gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5lbnVtRXh0ZW5zaW9uXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtLkZPUkVJR05fRk9POw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0R5bmFtaWNFbnVtRXh0ZW5zaW9uIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEeW5hbWljRW51bUV4dGVuc2lvbjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNFbnVtVHlwZSBEeW5hbWljRW51bUV4dGVuc2lvbiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkR5bmFtaWNFbnVtRXh0ZW5zaW9uOyB9DQorICAgICAgICBzZXQgeyBTZXREeW5hbWljRW51bUV4dGVuc2lvbih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHluYW1pY0VudW1FeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNFbnVtVHlwZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEeW5hbWljRW51bUV4dGVuc2lvbiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHluYW1pY0VudW1FeHRlbnNpb25fID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEeW5hbWljRW51bUV4dGVuc2lvbigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHluYW1pY0VudW1FeHRlbnNpb24gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5keW5hbWljRW51bUV4dGVuc2lvbl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY0VudW1UeXBlLkRZTkFNSUNfRk9POw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc01lc3NhZ2VFeHRlbnNpb24gew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc01lc3NhZ2VFeHRlbnNpb247IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIE1lc3NhZ2VFeHRlbnNpb24gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5NZXNzYWdlRXh0ZW5zaW9uOyB9DQorICAgICAgICBzZXQgeyBTZXRNZXNzYWdlRXh0ZW5zaW9uKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRNZXNzYWdlRXh0ZW5zaW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNZXNzYWdlRXh0ZW5zaW9uID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5tZXNzYWdlRXh0ZW5zaW9uXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE1lc3NhZ2VFeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZUV4dGVuc2lvbiA9IHRydWU7DQorICAgICAgICByZXN1bHQubWVzc2FnZUV4dGVuc2lvbl8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU1lc3NhZ2VFeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNNZXNzYWdlRXh0ZW5zaW9uICYmDQorICAgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VFeHRlbnNpb25fICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5tZXNzYWdlRXh0ZW5zaW9uXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm1lc3NhZ2VFeHRlbnNpb25fKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VFeHRlbnNpb25fID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZUV4dGVuc2lvbiA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJNZXNzYWdlRXh0ZW5zaW9uKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNZXNzYWdlRXh0ZW5zaW9uID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubWVzc2FnZUV4dGVuc2lvbl8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0R5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZSBEeW5hbWljTWVzc2FnZUV4dGVuc2lvbiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uOyB9DQorICAgICAgICBzZXQgeyBTZXREeW5hbWljTWVzc2FnZUV4dGVuc2lvbih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHluYW1pY01lc3NhZ2VFeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHluYW1pY01lc3NhZ2VFeHRlbnNpb24gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldER5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljTWVzc2FnZVR5cGUuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHluYW1pY01lc3NhZ2VFeHRlbnNpb24gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlRHluYW1pY01lc3NhZ2VFeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0R5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uICYmDQorICAgICAgICAgICAgcmVzdWx0LmR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5keW5hbWljTWVzc2FnZUV4dGVuc2lvbl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5keW5hbWljTWVzc2FnZUV4dGVuc2lvbl8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbiA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEeW5hbWljTWVzc2FnZUV4dGVuc2lvbigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHluYW1pY01lc3NhZ2VFeHRlbnNpb24gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5keW5hbWljTWVzc2FnZUV4dGVuc2lvbl8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBSZXBlYXRlZEV4dGVuc2lvbkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRFeHRlbnNpb25fOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRFeHRlbnNpb25Db3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkRXh0ZW5zaW9uQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZEV4dGVuc2lvbihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRFeHRlbnNpb24oaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEV4dGVuc2lvbihpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRFeHRlbnNpb25fW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkRXh0ZW5zaW9uKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRFeHRlbnNpb25fLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEV4dGVuc2lvbihzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRXh0ZW5zaW9uXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRXh0ZW5zaW9uKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEV4dGVuc2lvbl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gUGFja2VkRXh0ZW5zaW9uTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRFeHRlbnNpb25fOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkRXh0ZW5zaW9uQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRFeHRlbnNpb25Db3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFBhY2tlZEV4dGVuc2lvbihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkRXh0ZW5zaW9uKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkRXh0ZW5zaW9uKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEV4dGVuc2lvbl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkRXh0ZW5zaW9uKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRFeHRlbnNpb25fLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRFeHRlbnNpb24oc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRFeHRlbnNpb25fLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkRXh0ZW5zaW9uKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRFeHRlbnNpb25fLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3REeW5hbWljRXh0ZW5zaW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcywgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInJlcGVhdGVkX2ZpeGVkMzIiLCAicmVwZWF0ZWRfZml4ZWQ2NCIsICJyZXBlYXRlZF9mbG9hdCIsICJyZXBlYXRlZF9pbnQzMiIsICJyZXBlYXRlZF9pbnQ2NCIsICJyZXBlYXRlZF91aW50NjQiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAxLCAxNjM2OSwgMjA5NzE0MSwgMTA0LCAxNjM3NiwgMjA5NzE0NCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcywgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRml4ZWQzMkZpZWxkTnVtYmVyID0gMTI7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4gcmVwZWF0ZWRGaXhlZDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWludD4gUmVwZWF0ZWRGaXhlZDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEZpeGVkMzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGaXhlZDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEZpeGVkMzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IEdldFJlcGVhdGVkRml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRGaXhlZDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbnQzMkZpZWxkTnVtYmVyID0gMTM7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiByZXBlYXRlZEludDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gUmVwZWF0ZWRJbnQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRJbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEludDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEludDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgR2V0UmVwZWF0ZWRJbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRJbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRml4ZWQ2NEZpZWxkTnVtYmVyID0gMjA0NjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4gcmVwZWF0ZWRGaXhlZDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVsb25nPiBSZXBlYXRlZEZpeGVkNjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkRml4ZWQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEZpeGVkNjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRml4ZWQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIEdldFJlcGVhdGVkRml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRGaXhlZDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbnQ2NEZpZWxkTnVtYmVyID0gMjA0NzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiByZXBlYXRlZEludDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBSZXBlYXRlZEludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW50NjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkSW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRJbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRJbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRmxvYXRGaWVsZE51bWJlciA9IDI2MjE0MjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxmbG9hdD4gcmVwZWF0ZWRGbG9hdF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8ZmxvYXQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGZsb2F0PiBSZXBlYXRlZEZsb2F0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEZsb2F0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRmxvYXRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRmxvYXRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IEdldFJlcGVhdGVkRmxvYXQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRmxvYXRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFVpbnQ2NEZpZWxkTnVtYmVyID0gMjYyMTQzOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiByZXBlYXRlZFVpbnQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1bG9uZz4gUmVwZWF0ZWRVaW50NjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkVWludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkVWludDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFVpbnQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIEdldFJlcGVhdGVkVWludDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFVpbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChyZXBlYXRlZEZpeGVkMzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQzMkFycmF5KDEyLCBmaWVsZF9uYW1lc1swXSwgcmVwZWF0ZWRGaXhlZDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyQXJyYXkoMTMsIGZpZWxkX25hbWVzWzNdLCByZXBlYXRlZEludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEZpeGVkNjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQ2NEFycmF5KDIwNDYsIGZpZWxkX25hbWVzWzFdLCByZXBlYXRlZEZpeGVkNjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkSW50NjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50NjRBcnJheSgyMDQ3LCBmaWVsZF9uYW1lc1s0XSwgcmVwZWF0ZWRJbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRGbG9hdF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdEFycmF5KDI2MjE0MiwgZmllbGRfbmFtZXNbMl0sIHJlcGVhdGVkRmxvYXRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkVWludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQ2NEFycmF5KDI2MjE0MywgZmllbGRfbmFtZXNbNV0sIHJlcGVhdGVkVWludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogcmVwZWF0ZWRGaXhlZDMyXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDEgKiByZXBlYXRlZEZpeGVkMzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoaW50IGVsZW1lbnQgaW4gUmVwZWF0ZWRJbnQzMkxpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDEgKiByZXBlYXRlZEludDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHJlcGVhdGVkRml4ZWQ2NF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRGaXhlZDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGxvbmcgZWxlbWVudCBpbiBSZXBlYXRlZEludDY0TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkSW50NjRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogcmVwZWF0ZWRGbG9hdF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAzICogcmVwZWF0ZWRGbG9hdF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoICh1bG9uZyBlbGVtZW50IGluIFJlcGVhdGVkVWludDY0TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQ2NFNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDMgKiByZXBlYXRlZFVpbnQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJlcGVhdGVkRml4ZWQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRJbnQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRGaXhlZDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEludDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEZsb2F0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZFVpbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkRml4ZWQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXy5BZGQob3RoZXIucmVwZWF0ZWRGaXhlZDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRJbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQzMl8uQWRkKG90aGVyLnJlcGVhdGVkSW50MzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEZpeGVkNjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQ2NF8uQWRkKG90aGVyLnJlcGVhdGVkRml4ZWQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkSW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50NjRfLkFkZChvdGhlci5yZXBlYXRlZEludDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRGbG9hdF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRGbG9hdF8uQWRkKG90aGVyLnJlcGVhdGVkRmxvYXRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFVpbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50NjRfLkFkZChvdGhlci5yZXBlYXRlZFVpbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgOTg6DQorICAgICAgICAgICAgY2FzZSAxMDE6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDY6DQorICAgICAgICAgICAgY2FzZSAxMDQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkSW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2MzcwOg0KKyAgICAgICAgICAgIGNhc2UgMTYzNjk6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjM3ODoNCisgICAgICAgICAgICBjYXNlIDE2Mzc2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMDk3MTM4Og0KKyAgICAgICAgICAgIGNhc2UgMjA5NzE0MTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEZsb2F0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjA5NzE0NjoNCisgICAgICAgICAgICBjYXNlIDIwOTcxNDQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRVSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZFVpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWludD4gUmVwZWF0ZWRGaXhlZDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEZpeGVkMzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGaXhlZDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEZpeGVkMzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBHZXRSZXBlYXRlZEZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRml4ZWQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkRml4ZWQzMihpbnQgaW5kZXgsIHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEZpeGVkMzIodWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkMzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEZpeGVkMzIoc2NnOjpJRW51bWVyYWJsZTx1aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRml4ZWQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBSZXBlYXRlZEludDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkSW50MzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkSW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEludDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IFJlcGVhdGVkRml4ZWQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRGaXhlZDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRml4ZWQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRGaXhlZDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEdldFJlcGVhdGVkRml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRGaXhlZDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRGaXhlZDY0KGludCBpbmRleCwgdWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEZpeGVkNjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRGaXhlZDY0KHNjZzo6SUVudW1lcmFibGU8dWxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkNjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRGaXhlZDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkNjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBSZXBlYXRlZEludDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW50NjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkSW50NjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBHZXRSZXBlYXRlZEludDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRJbnQ2NChpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRJbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50NjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEludDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRJbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGZsb2F0PiBSZXBlYXRlZEZsb2F0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEZsb2F0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRmxvYXRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkRmxvYXRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgR2V0UmVwZWF0ZWRGbG9hdChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRGbG9hdChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkRmxvYXQoaW50IGluZGV4LCBmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRmxvYXRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEZsb2F0KHNjZzo6SUVudW1lcmFibGU8ZmxvYXQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRmxvYXRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1bG9uZz4gUmVwZWF0ZWRVaW50NjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkVWludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkVWludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFVpbnQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBHZXRSZXBlYXRlZFVpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRVaW50NjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZFVpbnQ2NChpbnQgaW5kZXgsIHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZFVpbnQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkVWludDY0KHNjZzo6SUVudW1lcmFibGU8dWxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZFVpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50NjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBGb29SZXF1ZXN0IDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8Rm9vUmVxdWVzdCwgRm9vUmVxdWVzdC5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgRm9vUmVxdWVzdCgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGb29SZXF1ZXN0IGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBGb29SZXF1ZXN0KCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9mb29SZXF1ZXN0RmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2Zvb1JlcXVlc3RGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVxdWVzdCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEZvb1JlcXVlc3QgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRm9vUmVxdWVzdCBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0Zvb1JlcXVlc3RfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Rm9vUmVxdWVzdCwgRm9vUmVxdWVzdC5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXF1ZXN0X19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2Zvb1JlcXVlc3RGaWVsZE5hbWVzOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXF1ZXN0IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1JlcXVlc3QgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVxdWVzdCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVxdWVzdCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVxdWVzdCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXF1ZXN0IFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1JlcXVlc3QgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVxdWVzdCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXF1ZXN0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1JlcXVlc3QgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgRm9vUmVxdWVzdCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihGb29SZXF1ZXN0IHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPEZvb1JlcXVlc3QsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEZvb1JlcXVlc3QgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBGb29SZXF1ZXN0IHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIEZvb1JlcXVlc3QgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBGb29SZXF1ZXN0IG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgRm9vUmVxdWVzdCgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRm9vUmVxdWVzdCBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvb1JlcXVlc3QuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRm9vUmVxdWVzdCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0LkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRm9vUmVxdWVzdCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgRm9vUmVxdWVzdCkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChGb29SZXF1ZXN0KSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRm9vUmVxdWVzdCBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvb1JlcXVlc3QuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9mb29SZXF1ZXN0RmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2Zvb1JlcXVlc3RGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBGb29SZXF1ZXN0KCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBGb29SZXNwb25zZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPEZvb1Jlc3BvbnNlLCBGb29SZXNwb25zZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgRm9vUmVzcG9uc2UoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRm9vUmVzcG9uc2UgZGVmYXVsdEluc3RhbmNlID0gbmV3IEZvb1Jlc3BvbnNlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9mb29SZXNwb25zZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9mb29SZXNwb25zZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAgfTsNCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEZvb1Jlc3BvbnNlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZvb1Jlc3BvbnNlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9vUmVzcG9uc2VfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Rm9vUmVzcG9uc2UsIEZvb1Jlc3BvbnNlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0Zvb1Jlc3BvbnNlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2Zvb1Jlc3BvbnNlRmllbGROYW1lczsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVzcG9uc2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1Jlc3BvbnNlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBGb29SZXNwb25zZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihGb29SZXNwb25zZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxGb29SZXNwb25zZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoRm9vUmVzcG9uc2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBGb29SZXNwb25zZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBGb29SZXNwb25zZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEZvb1Jlc3BvbnNlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgRm9vUmVzcG9uc2UoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZvb1Jlc3BvbnNlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRm9vUmVzcG9uc2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBGb29SZXNwb25zZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgRm9vUmVzcG9uc2UpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRm9vUmVzcG9uc2UpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShGb29SZXNwb25zZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvb1Jlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfZm9vUmVzcG9uc2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfZm9vUmVzcG9uc2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBGb29SZXNwb25zZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQmFyUmVxdWVzdCA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPEJhclJlcXVlc3QsIEJhclJlcXVlc3QuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEJhclJlcXVlc3QoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQmFyUmVxdWVzdCBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQmFyUmVxdWVzdCgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfYmFyUmVxdWVzdEZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9iYXJSZXF1ZXN0RmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlcXVlc3QgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBCYXJSZXF1ZXN0IERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJhclJlcXVlc3QgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXF1ZXN0X19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEJhclJlcXVlc3QsIEJhclJlcXVlc3QuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQmFyUmVxdWVzdF9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9iYXJSZXF1ZXN0RmllbGROYW1lczsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVxdWVzdCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXF1ZXN0IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlcXVlc3QgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlcXVlc3QgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlcXVlc3QgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVxdWVzdCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXF1ZXN0IFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlcXVlc3QgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVxdWVzdCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXF1ZXN0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIEJhclJlcXVlc3QgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQmFyUmVxdWVzdCBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxCYXJSZXF1ZXN0LCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihCYXJSZXF1ZXN0IGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQmFyUmVxdWVzdCByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBCYXJSZXF1ZXN0IFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgQmFyUmVxdWVzdCBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEJhclJlcXVlc3QoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJhclJlcXVlc3QgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXF1ZXN0LkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJhclJlcXVlc3QgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQmFyUmVxdWVzdC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJhclJlcXVlc3QgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEJhclJlcXVlc3QpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoQmFyUmVxdWVzdCkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEJhclJlcXVlc3Qgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXF1ZXN0LkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfYmFyUmVxdWVzdEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9iYXJSZXF1ZXN0RmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgQmFyUmVxdWVzdCgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQmFyUmVzcG9uc2UgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxCYXJSZXNwb25zZSwgQmFyUmVzcG9uc2UuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEJhclJlc3BvbnNlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEJhclJlc3BvbnNlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBCYXJSZXNwb25zZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfYmFyUmVzcG9uc2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfYmFyUmVzcG9uc2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBCYXJSZXNwb25zZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBCYXJSZXNwb25zZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0JhclJlc3BvbnNlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEJhclJlc3BvbnNlLCBCYXJSZXNwb25zZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9iYXJSZXNwb25zZUZpZWxkTmFtZXM7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlc3BvbnNlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlc3BvbnNlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlc3BvbnNlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXNwb25zZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgQmFyUmVzcG9uc2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQmFyUmVzcG9uc2UgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8QmFyUmVzcG9uc2UsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEJhclJlc3BvbnNlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQmFyUmVzcG9uc2UgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgQmFyUmVzcG9uc2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBCYXJSZXNwb25zZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEJhclJlc3BvbnNlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCYXJSZXNwb25zZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJhclJlc3BvbnNlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQmFyUmVzcG9uc2UgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEJhclJlc3BvbnNlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEJhclJlc3BvbnNlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oQmFyUmVzcG9uc2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXNwb25zZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2JhclJlc3BvbnNlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2JhclJlc3BvbnNlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgQmFyUmVzcG9uc2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCisgICNyZWdpb24gU2VydmljZXMNCisgIC8qDQorICAqIFNlcnZpY2UgZ2VuZXJhdGlvbiBpcyBub3cgZGlzYWJsZWQgYnkgZGVmYXVsdCwgdXNlIHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGVuYWJsZToNCisgICogb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykuc2VydmljZV9nZW5lcmF0b3JfdHlwZSA9IEdFTkVSSUM7DQorICAqLw0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorfQ0KKw0KKyNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvQmVuY2gvZ29vZ2xlX21lc3NhZ2UxLmRhdCBiL2NzaGFycC9zcmMvUHJvdG9CZW5jaC9nb29nbGVfbWVzc2FnZTEuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGYwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvQmVuY2gvZ29vZ2xlX21lc3NhZ2UxLmRhdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvQmVuY2gvZ29vZ2xlX21lc3NhZ2UyLmRhdCBiL2NzaGFycC9zcmMvUHJvdG9CZW5jaC9nb29nbGVfbWVzc2FnZTIuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YzA5NDQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvQmVuY2gvZ29vZ2xlX21lc3NhZ2UyLmRhdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvRHVtcC9Qcm9ncmFtLmNzIGIvY3NoYXJwL3NyYy9Qcm90b0R1bXAvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTM1ZTc4Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b0R1bXAvUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDg4IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5JTzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0R1bXANCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFNtYWxsIHV0aWxpdHkgdG8gbG9hZCBhIGJpbmFyeSBtZXNzYWdlIGFuZCBkdW1wIGl0IGluIHRleHQgZm9ybQ0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBpbnRlcm5hbCBjbGFzcyBQcm9ncmFtDQorICAgIHsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBNYWluKHN0cmluZ1tdIGFyZ3MpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoICE9IDIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgiVXNhZ2U6IFByb3RvRHVtcCA8ZGVzY3JpcHRvciB0eXBlIG5hbWU+IDxpbnB1dCBkYXRhPiIpOw0KKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgiVGhlIGRlc2NyaXB0b3IgdHlwZSBuYW1lIGlzIHRoZSBmdWxseS1xdWFsaWZpZWQgbWVzc2FnZSBuYW1lLCIpOw0KKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgiaW5jbHVkaW5nIGFzc2VtYmx5IGUuZy4gUHJvamVjdE5hbWVzcGFjZS5NZXNzYWdlLENvbXBhbnkuUHJvamVjdCIpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgSU1lc3NhZ2UgZGVmYXVsdE1lc3NhZ2U7DQorICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZSA9IE1lc3NhZ2VVdGlsLkdldERlZmF1bHRNZXNzYWdlKGFyZ3NbMF0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoQXJndW1lbnRFeGNlcHRpb24gZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKGUuTWVzc2FnZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIElCdWlsZGVyIGJ1aWxkZXIgPSBkZWZhdWx0TWVzc2FnZS5XZWFrQ3JlYXRlQnVpbGRlckZvclR5cGUoKTsNCisgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIlVuYWJsZSB0byBjcmVhdGUgYnVpbGRlciIpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnl0ZVtdIGlucHV0RGF0YSA9IEZpbGUuUmVhZEFsbEJ5dGVzKGFyZ3NbMV0pOw0KKyAgICAgICAgICAgICAgICBidWlsZGVyLldlYWtNZXJnZUZyb20oQnl0ZVN0cmluZy5Db3B5RnJvbShpbnB1dERhdGEpKTsNCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoVGV4dEZvcm1hdC5QcmludFRvU3RyaW5nKGJ1aWxkZXIuV2Vha0J1aWxkKCkpKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJFcnJvcjogezB9IiwgZS5NZXNzYWdlKTsNCisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoKTsNCisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIkRldGFpbGVkIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbjogezB9IiwgZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvRHVtcC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2NzaGFycC9zcmMvUHJvdG9EdW1wL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Y2U4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvRHVtcC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDMwIEBACit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOw0KK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCisNCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIA0KKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uDQorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5Lg0KKw0KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiUHJvdG9EdW1wIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJQcm90b0R1bXAiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMDkiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildDQorDQorLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoNCisvLw0KKy8vICAgICAgTWFqb3IgVmVyc2lvbg0KKy8vICAgICAgTWlub3IgVmVyc2lvbiANCisvLyAgICAgIEJ1aWxkIE51bWJlcg0KKy8vICAgICAgUmV2aXNpb24NCisvLw0KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzIA0KKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6DQorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjIuNC4xLjU1NSIpXQ0KKw0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIyLjQuMS41NTUiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjIuNC4xLjU1NSIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9EdW1wL1Byb3RvRHVtcC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvRHVtcC9Qcm90b0R1bXAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNDBkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvRHVtcC9Qcm90b0R1bXAuY3Nwcm9qCkBAIC0wLDAgKzEsNjUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQzNTwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntENzI4MkU5OS0yREMzLTQwNUItOTQ2Ri0xNzdEQjJGRDJBRTJ9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9EdW1wPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPlByb3RvRHVtcDwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMzVcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMzVcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDM1XFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvR2VuLlRlc3QvRGVwZW5kZW5jeVJlc29sdXRpb25UZXN0LmNzIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi5UZXN0L0RlcGVuZGVuY3lSZXNvbHV0aW9uVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2M2ZjFhCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi5UZXN0L0RlcGVuZGVuY3lSZXNvbHV0aW9uVGVzdC5jcwpAQCAtMCwwICsxLDE1MCBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3RvczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIE5Vbml0LkZyYW1ld29yazsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbg0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gVGVzdHMgZm9yIHRoZSBkZXBlbmRlbmN5IHJlc29sdXRpb24gaW4gR2VuZXJhdG9yLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBbVGVzdEZpeHR1cmVdDQorICAgIHB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5UmVzb2x1dGlvblRlc3QNCisgICAgew0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUd29EaXN0aW5jdEZpbGVzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpcnN0ID0gbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG8uQnVpbGRlciB7TmFtZSA9ICJGaXJzdCJ9LkJ1aWxkKCk7DQorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBzZWNvbmQgPSBuZXcgRmlsZURlc2NyaXB0b3JQcm90by5CdWlsZGVyIHtOYW1lID0gIlNlY29uZCJ9LkJ1aWxkKCk7DQorICAgICAgICAgICAgdmFyIHNldCA9IG5ldyBMaXN0PEZpbGVEZXNjcmlwdG9yUHJvdG8+IHsgZmlyc3QsIHNlY29uZCB9Ow0KKw0KKyAgICAgICAgICAgIElMaXN0PEZpbGVEZXNjcmlwdG9yPiBjb252ZXJ0ZWQgPSBHZW5lcmF0b3IuQ29udmVydERlc2NyaXB0b3JzKENTaGFycEZpbGVPcHRpb25zLkRlZmF1bHRJbnN0YW5jZSwgc2V0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgY29udmVydGVkLkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkZpcnN0IiwgY29udmVydGVkWzBdLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBjb252ZXJ0ZWRbMF0uRGVwZW5kZW5jaWVzLkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlNlY29uZCIsIGNvbnZlcnRlZFsxXS5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgY29udmVydGVkWzFdLkRlcGVuZGVuY2llcy5Db3VudCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0RGVwZW5kc09uU2Vjb25kKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpcnN0ID0NCisgICAgICAgICAgICAgICAgbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG8uQnVpbGRlciB7TmFtZSA9ICJGaXJzdCIsIERlcGVuZGVuY3lMaXN0ID0geyJTZWNvbmQifX0uQnVpbGQoKTsNCisgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvIHNlY29uZCA9IG5ldyBGaWxlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIge05hbWUgPSAiU2Vjb25kIn0uQnVpbGQoKTsNCisgICAgICAgICAgICB2YXIgc2V0ID0gbmV3IExpc3Q8RmlsZURlc2NyaXB0b3JQcm90bz4geyBmaXJzdCwgc2Vjb25kIH07DQorICAgICAgICAgICAgSUxpc3Q8RmlsZURlc2NyaXB0b3I+IGNvbnZlcnRlZCA9IEdlbmVyYXRvci5Db252ZXJ0RGVzY3JpcHRvcnMoQ1NoYXJwRmlsZU9wdGlvbnMuRGVmYXVsdEluc3RhbmNlLCBzZXQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBjb252ZXJ0ZWQuQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiRmlyc3QiLCBjb252ZXJ0ZWRbMF0uTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGNvbnZlcnRlZFswXS5EZXBlbmRlbmNpZXMuQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChjb252ZXJ0ZWRbMV0sIGNvbnZlcnRlZFswXS5EZXBlbmRlbmNpZXNbMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiU2Vjb25kIiwgY29udmVydGVkWzFdLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBjb252ZXJ0ZWRbMV0uRGVwZW5kZW5jaWVzLkNvdW50KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgU2Vjb25kRGVwZW5kc09uRmlyc3QoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlyc3QgPSBuZXcgRmlsZURlc2NyaXB0b3JQcm90by5CdWlsZGVyIHtOYW1lID0gIkZpcnN0In0uQnVpbGQoKTsNCisgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvIHNlY29uZCA9DQorICAgICAgICAgICAgICAgIG5ldyBGaWxlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIge05hbWUgPSAiU2Vjb25kIiwgRGVwZW5kZW5jeUxpc3QgPSB7IkZpcnN0In19LkJ1aWxkKCk7DQorICAgICAgICAgICAgdmFyIHNldCA9IG5ldyBMaXN0PEZpbGVEZXNjcmlwdG9yUHJvdG8+IHsgZmlyc3QsIHNlY29uZCB9Ow0KKyAgICAgICAgICAgIElMaXN0PEZpbGVEZXNjcmlwdG9yPiBjb252ZXJ0ZWQgPSBHZW5lcmF0b3IuQ29udmVydERlc2NyaXB0b3JzKENTaGFycEZpbGVPcHRpb25zLkRlZmF1bHRJbnN0YW5jZSwgc2V0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgY29udmVydGVkLkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkZpcnN0IiwgY29udmVydGVkWzBdLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBjb252ZXJ0ZWRbMF0uRGVwZW5kZW5jaWVzLkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlNlY29uZCIsIGNvbnZlcnRlZFsxXS5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgY29udmVydGVkWzFdLkRlcGVuZGVuY2llcy5Db3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGNvbnZlcnRlZFswXSwgY29udmVydGVkWzFdLkRlcGVuZGVuY2llc1swXSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIENpcmN1bGFyRGVwZW5kZW5jeSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaXJzdCA9DQorICAgICAgICAgICAgICAgIG5ldyBGaWxlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIge05hbWUgPSAiRmlyc3QiLCBEZXBlbmRlbmN5TGlzdCA9IHsiU2Vjb25kIn19LkJ1aWxkKCk7DQorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBzZWNvbmQgPQ0KKyAgICAgICAgICAgICAgICBuZXcgRmlsZURlc2NyaXB0b3JQcm90by5CdWlsZGVyIHtOYW1lID0gIlNlY29uZCIsIERlcGVuZGVuY3lMaXN0ID0geyJGaXJzdCJ9fS5CdWlsZCgpOw0KKyAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgTGlzdDxGaWxlRGVzY3JpcHRvclByb3RvPiB7IGZpcnN0LCBzZWNvbmQgfTsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEdlbmVyYXRvci5Db252ZXJ0RGVzY3JpcHRvcnMoQ1NoYXJwRmlsZU9wdGlvbnMuRGVmYXVsdEluc3RhbmNlLCBzZXQpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuRmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBNaXNzaW5nRGVwZW5kZW5jeSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaXJzdCA9DQorICAgICAgICAgICAgICAgIG5ldyBGaWxlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIge05hbWUgPSAiRmlyc3QiLCBEZXBlbmRlbmN5TGlzdCA9IHsiU2Vjb25kIn19LkJ1aWxkKCk7DQorICAgICAgICAgICAgdmFyIHNldCA9IG5ldyBMaXN0PEZpbGVEZXNjcmlwdG9yUHJvdG8+IHsgZmlyc3QgfTsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEdlbmVyYXRvci5Db252ZXJ0RGVzY3JpcHRvcnMoQ1NoYXJwRmlsZU9wdGlvbnMuRGVmYXVsdEluc3RhbmNlLCBzZXQpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuRmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBTZWxmRGVwZW5kZW5jeSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaXJzdCA9DQorICAgICAgICAgICAgICAgIG5ldyBGaWxlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIge05hbWUgPSAiRmlyc3QiLCBEZXBlbmRlbmN5TGlzdCA9IHsiRmlyc3QifX0uQnVpbGQoKTsNCisgICAgICAgICAgICB2YXIgc2V0ID0gbmV3IExpc3Q8RmlsZURlc2NyaXB0b3JQcm90bz4geyBmaXJzdCB9Ow0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgR2VuZXJhdG9yLkNvbnZlcnREZXNjcmlwdG9ycyhDU2hhcnBGaWxlT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2UsIHNldCk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5GYWlsKCJFeHBlY3RlZCBleGNlcHRpb24iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKERlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b0dlbi5UZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi5UZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjMyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvR2VuLlRlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSwzMCBAQAordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQorDQorLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyANCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbg0KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4NCisNCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlByb3RvR2VuLlRlc3QiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlByb3RvR2VuLlRlc3QiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMDgiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildDQorDQorLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoNCisvLw0KKy8vICAgICAgTWFqb3IgVmVyc2lvbg0KKy8vICAgICAgTWlub3IgVmVyc2lvbiANCisvLyAgICAgIEJ1aWxkIE51bWJlcg0KKy8vICAgICAgUmV2aXNpb24NCisvLw0KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzIA0KKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6DQorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjIuNC4xLjU1NSIpXQ0KKw0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIyLjQuMS41NTUiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjIuNC4xLjU1NSIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4uVGVzdC9Qcm90b0dlbi5UZXN0LmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9HZW4uVGVzdC9Qcm90b0dlbi5UZXN0LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWY4NDc5Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi5UZXN0L1Byb3RvR2VuLlRlc3QuY3Nwcm9qCkBAIC0wLDAgKzEsOTkgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQzNTwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntDMjY4REE0Qy00MDA0LTQ3REEtQUYyMy00NEM5ODMyODFBNjh9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvR2VuPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW4uVGVzdDwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMzVcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibnVuaXQuZnJhbWV3b3JrIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxOVW5pdFxsaWJcbnVuaXQuZnJhbWV3b3JrLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXBlbmRlbmN5UmVzb2x1dGlvblRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZW1wRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByZXByb2Nlc3NpbmcuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnM8L05hbWU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9HZW5cUHJvdG9HZW4uY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57MjUwQURFMzQtODJGRC00QkFFLTg2RDUtOTg1RkJFNTg5QzRBfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b0dlbjwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29udGVudCBJbmNsdWRlPSIuLlwuLlxsaWJccHJvdG9jLmV4ZSI+DQorICAgICAgPExpbms+cHJvdG9jLmV4ZTwvTGluaz4NCisgICAgICA8Q29weVRvT3V0cHV0RGlyZWN0b3J5PlByZXNlcnZlTmV3ZXN0PC9Db3B5VG9PdXRwdXREaXJlY3Rvcnk+DQorICAgIDwvQ29udGVudD4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5ccHJvdG9zXGdvb2dsZVxwcm90b2J1Zlxjc2hhcnBfb3B0aW9ucy5wcm90byI+DQorICAgICAgPExpbms+Z29vZ2xlXHByb3RvYnVmXGNzaGFycF9vcHRpb25zLnByb3RvPC9MaW5rPg0KKyAgICAgIDxDb3B5VG9PdXRwdXREaXJlY3Rvcnk+UHJlc2VydmVOZXdlc3Q8L0NvcHlUb091dHB1dERpcmVjdG9yeT4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXGRlc2NyaXB0b3IucHJvdG8iPg0KKyAgICAgIDxMaW5rPmdvb2dsZVxwcm90b2J1ZlxkZXNjcmlwdG9yLnByb3RvPC9MaW5rPg0KKyAgICAgIDxDb3B5VG9PdXRwdXREaXJlY3Rvcnk+UHJlc2VydmVOZXdlc3Q8L0NvcHlUb091dHB1dERpcmVjdG9yeT4NCisgICAgPC9Ob25lPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8U3RhcnRBY3Rpb24+UHJvZ3JhbTwvU3RhcnRBY3Rpb24+DQorICAgIDxTdGFydFByb2dyYW0+JChQcm9qZWN0RGlyKS4uXC4uXGxpYlxOVW5pdFx0b29sc1xudW5pdC1jb25zb2xlLmV4ZTwvU3RhcnRQcm9ncmFtPg0KKyAgICA8U3RhcnRBcmd1bWVudHM+L25vbG9nbyAvbm9zaGFkb3cgL2xhYmVscyAvd2FpdCAkKEFzc2VtYmx5TmFtZSkuZGxsPC9TdGFydEFyZ3VtZW50cz4NCisgICAgPFN0YXJ0V29ya2luZ0RpcmVjdG9yeT4kKFByb2plY3REaXIpJChPdXRwdXRQYXRoKTwvU3RhcnRXb3JraW5nRGlyZWN0b3J5Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvR2VuLlRlc3QvUHJvdG9jR2VuQ3NVbml0dGVzdHMuY3MgYi9jc2hhcnAvc3JjL1Byb3RvR2VuLlRlc3QvUHJvdG9jR2VuQ3NVbml0dGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVlNTZkZQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4uVGVzdC9Qcm90b2NHZW5Dc1VuaXR0ZXN0cy5jcwpAQCAtMCwwICsxLDY4MyBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIE5Vbml0LkZyYW1ld29yazsNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbg0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gVGVzdHMgcHJvdG9jLWdlbi1jcyBwbHVnaW4uDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIFtUZXN0Rml4dHVyZV0NCisgICAgW0NhdGVnb3J5KCJQcmVwcm9jZXNzb3IiKV0NCisgICAgcHVibGljIHBhcnRpYWwgY2xhc3MgUHJvdG9jR2VuQ3NVbml0dGVzdHMNCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nIFRlbXBQYXRoID0gUGF0aC5Db21iaW5lKFBhdGguR2V0VGVtcFBhdGgoKSwgInByb3RvYy1nZW4tY3MuVGVzdCIpOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgRGVmYXVsdFByb3RvID0NCisgICAgICAgICAgICBAIg0KK3BhY2thZ2UgbnVuaXQuc2ltcGxlOw0KKy8vIFRlc3QgYSB2ZXJ5IHNpbXBsZSBtZXNzYWdlLg0KK21lc3NhZ2UgTXlNZXNzYWdlIHsNCisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsNCit9IjsNCisNCisgICAgICAgICNyZWdpb24gVGVzdEZpeHR1cmUgU2V0VXAvVGVhckRvd24NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZyBPcmlnaW5hbFdvcmtpbmdEaXJlY3RvcnkgPSBFbnZpcm9ubWVudC5DdXJyZW50RGlyZWN0b3J5Ow0KKw0KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQorDQorICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0NCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2V0dXAoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlYXJkb3duKCk7DQorICAgICAgICAgICAgRGlyZWN0b3J5LkNyZWF0ZURpcmVjdG9yeShUZW1wUGF0aCk7DQorICAgICAgICAgICAgRW52aXJvbm1lbnQuQ3VycmVudERpcmVjdG9yeSA9IFRlbXBQYXRoOw0KKyAgICAgICAgICAgIHRoaXMuYnVmZmVyLkxlbmd0aCA9IDA7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdEZpeHR1cmVUZWFyRG93bl0NCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgVGVhcmRvd24oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEVudmlyb25tZW50LkN1cnJlbnREaXJlY3RvcnkgPSBPcmlnaW5hbFdvcmtpbmdEaXJlY3Rvcnk7DQorICAgICAgICAgICAgaWYgKERpcmVjdG9yeS5FeGlzdHMoVGVtcFBhdGgpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRGlyZWN0b3J5LkRlbGV0ZShUZW1wUGF0aCwgdHJ1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgI3JlZ2lvbiBIZWxwZXIgTWV0aG9kcyBSdW5Qcm90b0dlbiAvIFJ1bkNzYw0KKw0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJ1blByb3RvYyhpbnQgZXhwZWN0LCBzdHJpbmcgcHJvdG9GaWxlLCBwYXJhbXMgc3RyaW5nW10gYXJncykNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgcHJvdG9QYXRoID0gc3RyaW5nLkZvcm1hdCgiLUkuIC1JXCJ7MH1cIiIsIE9yaWdpbmFsV29ya2luZ0RpcmVjdG9yeSk7DQorICAgICAgICAgICAgc3RyaW5nIHBsdWdpbiA9IHN0cmluZy5Gb3JtYXQoIi0tcGx1Z2luPVwiezB9XCIiLCBQYXRoLkNvbWJpbmUoT3JpZ2luYWxXb3JraW5nRGlyZWN0b3J5LCAicHJvdG9jLWdlbi1jcy5leGUiKSk7DQorICAgICAgICAgICAgc3RyaW5nIGNzT3V0ID0gYXJncy5MZW5ndGggPT0gMCA/ICItLWNzX291dD0uIiA6IHN0cmluZy5Gb3JtYXQoIi0tY3Nfb3V0PVwiezB9Oi5cIiIsIHN0cmluZy5Kb2luKCIgIiwgYXJncykpOw0KKyAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBjaGlsZCBwcm9jZXNzLg0KKyAgICAgICAgICAgIFByb2Nlc3MgcCA9IG5ldyBQcm9jZXNzKCk7DQorICAgICAgICAgICAgLy8gUmVkaXJlY3QgdGhlIG91dHB1dCBzdHJlYW0gb2YgdGhlIGNoaWxkIHByb2Nlc3MuDQorICAgICAgICAgICAgcC5TdGFydEluZm8uQ3JlYXRlTm9XaW5kb3cgPSB0cnVlOw0KKyAgICAgICAgICAgIHAuU3RhcnRJbmZvLlVzZVNoZWxsRXhlY3V0ZSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHAuU3RhcnRJbmZvLlJlZGlyZWN0U3RhbmRhcmRFcnJvciA9IHRydWU7DQorICAgICAgICAgICAgcC5TdGFydEluZm8uUmVkaXJlY3RTdGFuZGFyZE91dHB1dCA9IHRydWU7DQorICAgICAgICAgICAgcC5TdGFydEluZm8uV29ya2luZ0RpcmVjdG9yeSA9IFRlbXBQYXRoOw0KKyAgICAgICAgICAgIHAuU3RhcnRJbmZvLkZpbGVOYW1lID0gUGF0aC5Db21iaW5lKE9yaWdpbmFsV29ya2luZ0RpcmVjdG9yeSwgInByb3RvYy5leGUiKTsNCisgICAgICAgICAgICBwLlN0YXJ0SW5mby5Bcmd1bWVudHMgPSBzdHJpbmcuSm9pbigiICIsIG5ldyBzdHJpbmdbXSB7IHBsdWdpbiwgY3NPdXQsIHByb3RvUGF0aCwgcHJvdG9GaWxlIH0pOw0KKyAgICAgICAgICAgIHAuU3RhcnQoKTsNCisgICAgICAgICAgICAvLyBSZWFkIHRoZSBvdXRwdXQgc3RyZWFtIGZpcnN0IGFuZCB0aGVuIHdhaXQuDQorICAgICAgICAgICAgYnVmZmVyLkFwcGVuZExpbmUoc3RyaW5nLkZvcm1hdCgiezB9PiBcInsxfVwiIHsyfSIsIHAuU3RhcnRJbmZvLldvcmtpbmdEaXJlY3RvcnksIHAuU3RhcnRJbmZvLkZpbGVOYW1lLCBwLlN0YXJ0SW5mby5Bcmd1bWVudHMpKTsNCisgICAgICAgICAgICBidWZmZXIuQXBwZW5kTGluZShwLlN0YW5kYXJkRXJyb3IuUmVhZFRvRW5kKCkpOw0KKyAgICAgICAgICAgIGJ1ZmZlci5BcHBlbmRMaW5lKHAuU3RhbmRhcmRPdXRwdXQuUmVhZFRvRW5kKCkpOw0KKyAgICAgICAgICAgIHAuV2FpdEZvckV4aXQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0LCBwLkV4aXRDb2RlLCB0aGlzLmJ1ZmZlci5Ub1N0cmluZygpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgQXNzZW1ibHkgUnVuQ3NjKGludCBleHBlY3QsIHBhcmFtcyBzdHJpbmdbXSBzb3VyY2VzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSB0ZW1wRGxsID0gbmV3IFRlbXBGaWxlKFN0cmluZy5FbXB0eSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0ZW1wRGxsLkNoYW5nZUV4dGVuc2lvbigiLmRsbCIpOw0KKyAgICAgICAgICAgICAgICBMaXN0PHN0cmluZz4gYXJncyA9IG5ldyBMaXN0PHN0cmluZz4oKTsNCisgICAgICAgICAgICAgICAgYXJncy5BZGQoIi9ub2xvZ28iKTsNCisgICAgICAgICAgICAgICAgYXJncy5BZGQoIi90YXJnZXQ6bGlicmFyeSIpOw0KKyAgICAgICAgICAgICAgICBhcmdzLkFkZCgiL2RlYnVnLSIpOw0KKyAgICAgICAgICAgICAgICBhcmdzLkFkZChTdHJpbmcuRm9ybWF0KEAiIiIvb3V0OnswfSIiIiwgdGVtcERsbC5UZW1wUGF0aCkpOw0KKyAgICAgICAgICAgICAgICBhcmdzLkFkZCgiL3I6U3lzdGVtLmRsbCIpOw0KKyAgICAgICAgICAgICAgICBhcmdzLkFkZChTdHJpbmcuRm9ybWF0KEAiIiIvcjp7MH0iIiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mKEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8pLkFzc2VtYmx5Lg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbikpOw0KKyAgICAgICAgICAgICAgICBhcmdzLkFkZFJhbmdlKHNvdXJjZXMpOw0KKw0KKyAgICAgICAgICAgICAgICBzdHJpbmcgZXhlID0gUGF0aC5Db21iaW5lKFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5SdW50aW1lRW52aXJvbm1lbnQuR2V0UnVudGltZURpcmVjdG9yeSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjc2MuZXhlIik7DQorICAgICAgICAgICAgICAgIFByb2Nlc3NTdGFydEluZm8gcHNpID0gbmV3IFByb2Nlc3NTdGFydEluZm8oZXhlKTsNCisgICAgICAgICAgICAgICAgcHNpLldvcmtpbmdEaXJlY3RvcnkgPSBUZW1wUGF0aDsNCisgICAgICAgICAgICAgICAgcHNpLkNyZWF0ZU5vV2luZG93ID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgcHNpLlVzZVNoZWxsRXhlY3V0ZSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgICBwc2kuUmVkaXJlY3RTdGFuZGFyZE91dHB1dCA9IHRydWU7DQorICAgICAgICAgICAgICAgIHBzaS5SZWRpcmVjdFN0YW5kYXJkRXJyb3IgPSB0cnVlOw0KKyAgICAgICAgICAgICAgICBwc2kuQXJndW1lbnRzID0gc3RyaW5nLkpvaW4oIiAiLCBhcmdzLlRvQXJyYXkoKSk7DQorICAgICAgICAgICAgICAgIFByb2Nlc3MgcCA9IFByb2Nlc3MuU3RhcnQocHNpKTsNCisgICAgICAgICAgICAgICAgYnVmZmVyLkFwcGVuZExpbmUoc3RyaW5nLkZvcm1hdCgiezB9PiBcInsxfVwiIHsyfSIsIHAuU3RhcnRJbmZvLldvcmtpbmdEaXJlY3RvcnksIHAuU3RhcnRJbmZvLkZpbGVOYW1lLCBwLlN0YXJ0SW5mby5Bcmd1bWVudHMpKTsNCisgICAgICAgICAgICAgICAgYnVmZmVyLkFwcGVuZExpbmUocC5TdGFuZGFyZEVycm9yLlJlYWRUb0VuZCgpKTsNCisgICAgICAgICAgICAgICAgYnVmZmVyLkFwcGVuZExpbmUocC5TdGFuZGFyZE91dHB1dC5SZWFkVG9FbmQoKSk7DQorICAgICAgICAgICAgICAgIHAuV2FpdEZvckV4aXQoKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdCwgcC5FeGl0Q29kZSwgdGhpcy5idWZmZXIuVG9TdHJpbmcoKSk7DQorDQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGFzbSA9IG51bGw7DQorICAgICAgICAgICAgICAgIGlmIChwLkV4aXRDb2RlID09IDApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBhbGxieXRlcyA9IEZpbGUuUmVhZEFsbEJ5dGVzKHRlbXBEbGwuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICAgICAgYXNtID0gQXNzZW1ibHkuTG9hZChhbGxieXRlcyk7DQorDQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChUeXBlIHQgaW4gYXNtLkdldFR5cGVzKCkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRGVidWcuV3JpdGVMaW5lKHQuRnVsbE5hbWUsIGFzbS5GdWxsTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGFzbTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHRlc3RzIGV4Y2VyY2lzZSBvcHRpb25zIGZvciBwcm90b2dlbi5leGUNCisgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFByb3RvRmlsZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRlc3QgPSBuZXcgU3RhY2tGcmFtZShmYWxzZSkuR2V0TWV0aG9kKCkuTmFtZTsNCisgICAgICAgICAgICBTZXR1cCgpOw0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSBzb3VyY2UgPSBUZW1wRmlsZS5BdHRhY2godGVzdCArICIuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsIERlZmF1bHRQcm90bykpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b2MoMCwgcHJvdG8uVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICBBc3NlbWJseSBhID0gUnVuQ3NjKDAsIHNvdXJjZS5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdCA9IGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLk15TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0KSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLiIgKyB0ZXN0LCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQcm90b0ZpbGVXaXRoQ29uZmxpY3RpbmdUeXBlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nICgNCisgICAgICAgICAgICAgICAgUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCINCitwYWNrYWdlIG51bml0LnNpbXBsZTsNCisvLyBUZXN0IGEgdmVyeSBzaW1wbGUgbWVzc2FnZS4NCittZXNzYWdlICIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QgKyBAIiB7DQorICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7DQorfSAiKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFJ1blByb3RvYygwLCBwcm90by5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGEgPSBSdW5Dc2MoMCwgc291cmNlLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB0aGUgbWVzc2FnZSB0eXBlIGlzIGluIHRoZSBleHBlY3RlZCBuYW1lc3BhY2UNCisgICAgICAgICAgICAgICAgVHlwZSB0ID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuIiArIHRlc3QsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0KSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLlByb3RvLiIgKyB0ZXN0LCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQcm90b0ZpbGVXaXRoTmFtZXNwYWNlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nIChQcm90b0ZpbGUgcHJvdG8gPSBuZXcgUHJvdG9GaWxlKHRlc3QgKyAiLnByb3RvIiwgRGVmYXVsdFByb3RvKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFJ1blByb3RvYygwLCBwcm90by5UZW1wUGF0aCwgIi1uYW1lc3BhY2U9TXlOZXdOYW1lc3BhY2UiKTsNCisgICAgICAgICAgICAgICAgQXNzZW1ibHkgYSA9IFJ1bkNzYygwLCBzb3VyY2UuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBtZXNzYWdlIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQgPSBhLkdldFR5cGUoIk15TmV3TmFtZXNwYWNlLk15TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0KSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgiTXlOZXdOYW1lc3BhY2UuIiArIHRlc3QsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFByb3RvRmlsZVdpdGhVbWJyZWxsYUNsYXNzTmFtZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRlc3QgPSBuZXcgU3RhY2tGcmFtZShmYWxzZSkuR2V0TWV0aG9kKCkuTmFtZTsNCisgICAgICAgICAgICBTZXR1cCgpOw0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSBzb3VyY2UgPSBUZW1wRmlsZS5BdHRhY2goIk15VW1icmVsbGFDbGFzc25hbWUuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsIERlZmF1bHRQcm90bykpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b2MoMCwgcHJvdG8uVGVtcFBhdGgsICIvdW1icmVsbGFfY2xhc3NuYW1lPU15VW1icmVsbGFDbGFzc25hbWUiKTsNCisgICAgICAgICAgICAgICAgQXNzZW1ibHkgYSA9IFJ1bkNzYygwLCBzb3VyY2UuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBtZXNzYWdlIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQgPSBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5NeU1lc3NhZ2UiLCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh0eXBlb2YoSU1lc3NhZ2UpLklzQXNzaWduYWJsZUZyb20odCksICJFeHBlY3QgYW4gSU1lc3NhZ2UiKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB3ZSBjYW4gZmluZCB0aGUgc3RhdGljIGRlc2NyaXB0b3IgdHlwZQ0KKyAgICAgICAgICAgICAgICBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5NeVVtYnJlbGxhQ2xhc3NuYW1lIiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UHJvdG9GaWxlV2l0aE5lc3RlZENsYXNzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nIChQcm90b0ZpbGUgcHJvdG8gPSBuZXcgUHJvdG9GaWxlKHRlc3QgKyAiLnByb3RvIiwgRGVmYXVsdFByb3RvKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFJ1blByb3RvYygwLCBwcm90by5UZW1wUGF0aCwgIi1uZXN0X2NsYXNzZXM9dHJ1ZSIpOw0KKyAgICAgICAgICAgICAgICBBc3NlbWJseSBhID0gUnVuQ3NjKDAsIHNvdXJjZS5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdCA9IGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLiIgKyB0ZXN0ICsgIitNeU1lc3NhZ2UiLCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh0eXBlb2YoSU1lc3NhZ2UpLklzQXNzaWduYWJsZUZyb20odCksICJFeHBlY3QgYW4gSU1lc3NhZ2UiKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB3ZSBjYW4gZmluZCB0aGUgc3RhdGljIGRlc2NyaXB0b3IgdHlwZQ0KKyAgICAgICAgICAgICAgICBhLkdldFR5cGUoIm51bml0LnNpbXBsZS4iICsgdGVzdCwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UHJvdG9GaWxlV2l0aEV4cGFuZGVkTnNEaXJlY3RvcmllcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRlc3QgPSBuZXcgU3RhY2tGcmFtZShmYWxzZSkuR2V0TWV0aG9kKCkuTmFtZTsNCisgICAgICAgICAgICBTZXR1cCgpOw0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSBzb3VyY2UgPSBUZW1wRmlsZS5BdHRhY2goQCJudW5pdFxzaW1wbGVcIiArIHRlc3QgKyAiLmNzIikpDQorICAgICAgICAgICAgdXNpbmcgKFByb3RvRmlsZSBwcm90byA9IG5ldyBQcm90b0ZpbGUodGVzdCArICIucHJvdG8iLCBEZWZhdWx0UHJvdG8pKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9jKDAsIHByb3RvLlRlbXBQYXRoLCAiLWV4cGFuZF9uYW1lc3BhY2VfZGlyZWN0b3JpZXM9dHJ1ZSIpOw0KKyAgICAgICAgICAgICAgICBBc3NlbWJseSBhID0gUnVuQ3NjKDAsIHNvdXJjZS5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdCA9IGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLk15TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0KSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLiIgKyB0ZXN0LCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQcm90b0ZpbGVXaXRoTmV3RXh0ZW5zaW9uKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5HZW5lcmF0ZWQuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsIERlZmF1bHRQcm90bykpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b2MoMCwgcHJvdG8uVGVtcFBhdGgsICItZmlsZV9leHRlbnNpb249LkdlbmVyYXRlZC5jcyIpOw0KKyAgICAgICAgICAgICAgICBBc3NlbWJseSBhID0gUnVuQ3NjKDAsIHNvdXJjZS5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdCA9IGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLk15TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0KSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLiIgKyB0ZXN0LCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQcm90b0ZpbGVXaXRoVW1icmVsbGFOYW1lc3BhY2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyB0ZXN0ID0gbmV3IFN0YWNrRnJhbWUoZmFsc2UpLkdldE1ldGhvZCgpLk5hbWU7DQorICAgICAgICAgICAgU2V0dXAoKTsNCisgICAgICAgICAgICB1c2luZyAoVGVtcEZpbGUgc291cmNlID0gVGVtcEZpbGUuQXR0YWNoKHRlc3QgKyAiLmNzIikpDQorICAgICAgICAgICAgdXNpbmcgKFByb3RvRmlsZSBwcm90byA9IG5ldyBQcm90b0ZpbGUodGVzdCArICIucHJvdG8iLCBEZWZhdWx0UHJvdG8pKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9jKDAsIHByb3RvLlRlbXBQYXRoLCAiLXVtYnJlbGxhX25hbWVzcGFjZT1NeVVtYnJlbGxhLk5hbWVzcGFjZSIpOw0KKyAgICAgICAgICAgICAgICBBc3NlbWJseSBhID0gUnVuQ3NjKDAsIHNvdXJjZS5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdCA9IGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLk15TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0KSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLk15VW1icmVsbGEuTmFtZXNwYWNlLiIgKyB0ZXN0LCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQcm90b0ZpbGVXaXRoSWdub3JlZFVtYnJlbGxhTmFtZXNwYWNlRHVlVG9OZXN0aW5nKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nIChQcm90b0ZpbGUgcHJvdG8gPSBuZXcgUHJvdG9GaWxlKHRlc3QgKyAiLnByb3RvIiwgRGVmYXVsdFByb3RvKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFJ1blByb3RvYygwLCBwcm90by5UZW1wUGF0aCwgIi1uZXN0X2NsYXNzZXM9dHJ1ZSIsICItdW1icmVsbGFfbmFtZXNwYWNlPU15VW1icmVsbGEuTmFtZXNwYWNlIik7DQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGEgPSBSdW5Dc2MoMCwgc291cmNlLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB0aGUgbWVzc2FnZSB0eXBlIGlzIGluIHRoZSBleHBlY3RlZCBuYW1lc3BhY2UNCisgICAgICAgICAgICAgICAgVHlwZSB0ID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuIiArIHRlc3QgKyAiK015TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0KSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLiIgKyB0ZXN0LCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQcm90b0ZpbGVXaXRoRXhwbGljaXRFbXB0eVVtYnJlbGxhTmFtZXNwYWNlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nICgNCisgICAgICAgICAgICAgICAgUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCINCitwYWNrYWdlIG51bml0LnNpbXBsZTsNCisvLyBUZXN0IGEgdmVyeSBzaW1wbGUgbWVzc2FnZS4NCittZXNzYWdlICIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QgKyBAIiB7DQorICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7DQorfSAiKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vRm9yY2VzIHRoZSB1bWJyZWxsYSBjbGFzcyB0byBub3QgdXNlIGEgbmFtZXNwYWNlIGV2ZW4gaWYgYSBjb2xsaXNpb24gd2l0aCBhIHR5cGUgaXMgZGV0ZWN0ZWQuDQorICAgICAgICAgICAgICAgIFJ1blByb3RvYygwLCBwcm90by5UZW1wUGF0aCwgIi11bWJyZWxsYV9uYW1lc3BhY2U9Iik7DQorICAgICAgICAgICAgICAgIC8vZXJyb3IgQ1MwNDQxOiAnbnVuaXQuc2ltcGxlLlRlc3RQcm90b0ZpbGVXaXRoRXhwbGljaXRFbXB0eVVtYnJlbGxhTmFtZXNwYWNlJzogYSBjbGFzcyBjYW5ub3QgYmUgYm90aCBzdGF0aWMgYW5kIHNlYWxlZA0KKyAgICAgICAgICAgICAgICBSdW5Dc2MoMSwgc291cmNlLlRlbXBQYXRoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQcm90b0ZpbGVXaXRoTmV3T3V0cHV0Rm9sZGVyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaChAImdlbmVyYXRlZC1jb2RlXCIgKyB0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nIChQcm90b0ZpbGUgcHJvdG8gPSBuZXcgUHJvdG9GaWxlKHRlc3QgKyAiLnByb3RvIiwgRGVmYXVsdFByb3RvKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFJ1blByb3RvYygxLCBwcm90by5UZW1wUGF0aCwgIi1vdXRwdXRfZGlyZWN0b3J5PWdlbmVyYXRlZC1jb2RlIik7DQorICAgICAgICAgICAgICAgIERpcmVjdG9yeS5DcmVhdGVEaXJlY3RvcnkoImdlbmVyYXRlZC1jb2RlIik7DQorICAgICAgICAgICAgICAgIFJ1blByb3RvYygwLCBwcm90by5UZW1wUGF0aCwgIi1vdXRwdXRfZGlyZWN0b3J5PWdlbmVyYXRlZC1jb2RlIik7DQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGEgPSBSdW5Dc2MoMCwgc291cmNlLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB0aGUgbWVzc2FnZSB0eXBlIGlzIGluIHRoZSBleHBlY3RlZCBuYW1lc3BhY2UNCisgICAgICAgICAgICAgICAgVHlwZSB0ID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuTXlNZXNzYWdlIiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodHlwZW9mKElNZXNzYWdlKS5Jc0Fzc2lnbmFibGVGcm9tKHQpLCAiRXhwZWN0IGFuIElNZXNzYWdlIik7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgd2UgY2FuIGZpbmQgdGhlIHN0YXRpYyBkZXNjcmlwdG9yIHR5cGUNCisgICAgICAgICAgICAgICAgYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuIiArIHRlc3QsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFByb3RvRmlsZUFuZElnbm9yZUdvb2dsZVByb3RvYnVmKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nICgNCisgICAgICAgICAgICAgICAgUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCINCitpbXBvcnQgIiJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iIjsNCitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS5uYW1lc3BhY2UgPSAiIk15TmV3TmFtZXNwYWNlIiI7DQorIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdFByb3RvKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHN0cmluZyBnb29nbGUgPSBQYXRoLkNvbWJpbmUoVGVtcFBhdGgsICJnb29nbGVcXHByb3RvYnVmIik7DQorICAgICAgICAgICAgICAgIERpcmVjdG9yeS5DcmVhdGVEaXJlY3RvcnkoZ29vZ2xlKTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGZpbGUgaW4gRGlyZWN0b3J5LkdldEZpbGVzKFBhdGguQ29tYmluZShPcmlnaW5hbFdvcmtpbmdEaXJlY3RvcnksICJnb29nbGVcXHByb3RvYnVmIikpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBGaWxlLkNvcHkoZmlsZSwgUGF0aC5Db21iaW5lKGdvb2dsZSwgUGF0aC5HZXRGaWxlTmFtZShmaWxlKSkpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBEaXJlY3RvcnkuR2V0RmlsZXMoVGVtcFBhdGgsICIqLmNzIikuTGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9jKDAsIHByb3RvLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIERpcmVjdG9yeS5HZXRGaWxlcyhUZW1wUGF0aCwgIiouY3MiKS5MZW5ndGgpOw0KKw0KKyAgICAgICAgICAgICAgICBBc3NlbWJseSBhID0gUnVuQ3NjKDAsIHNvdXJjZS5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdCA9IGEuR2V0VHlwZSgiTXlOZXdOYW1lc3BhY2UuTXlNZXNzYWdlIiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodHlwZW9mKElNZXNzYWdlKS5Jc0Fzc2lnbmFibGVGcm9tKHQpLCAiRXhwZWN0IGFuIElNZXNzYWdlIik7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgd2UgY2FuIGZpbmQgdGhlIHN0YXRpYyBkZXNjcmlwdG9yIHR5cGUNCisgICAgICAgICAgICAgICAgYS5HZXRUeXBlKCJNeU5ld05hbWVzcGFjZS4iICsgdGVzdCwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UHJvdG9GaWxlV2l0aG91dElnbm9yZUdvb2dsZVByb3RvYnVmKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nICgNCisgICAgICAgICAgICAgICAgUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCINCitpbXBvcnQgIiJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iIjsNCitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS5uYW1lc3BhY2UgPSAiIk15TmV3TmFtZXNwYWNlIiI7DQorIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdFByb3RvKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHN0cmluZyBnb29nbGUgPSBQYXRoLkNvbWJpbmUoVGVtcFBhdGgsICJnb29nbGVcXHByb3RvYnVmIik7DQorICAgICAgICAgICAgICAgIERpcmVjdG9yeS5DcmVhdGVEaXJlY3RvcnkoZ29vZ2xlKTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGZpbGUgaW4gRGlyZWN0b3J5LkdldEZpbGVzKFBhdGguQ29tYmluZShPcmlnaW5hbFdvcmtpbmdEaXJlY3RvcnksICJnb29nbGVcXHByb3RvYnVmIikpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBGaWxlLkNvcHkoZmlsZSwgUGF0aC5Db21iaW5lKGdvb2dsZSwgUGF0aC5HZXRGaWxlTmFtZShmaWxlKSkpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBEaXJlY3RvcnkuR2V0RmlsZXMoVGVtcFBhdGgsICIqLmNzIikuTGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgLy9XaXRob3V0IHRoZSBvcHRpb24gdGhpcyBmYWlscyBkdWUgdG8gYmVpbmcgdW5hYmxlIHRvIHJlc29sdmUgZ29vZ2xlL3Byb3RvYnVmIGRlc2NyaXB0b3JzDQorICAgICAgICAgICAgICAgIFJ1blByb3RvYygwLCBwcm90by5UZW1wUGF0aCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyB0ZXN0cyBleGNlcmNpc2Ugb3B0aW9ucyBmb3IgcHJvdG9jLmV4ZQ0KKyAgICAgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UHJvdG9GaWxlV2l0aEluY2x1ZGVJbXBvcnRzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nICgNCisgICAgICAgICAgICAgICAgUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCINCitpbXBvcnQgIiJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iIjsNCitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS5uYW1lc3BhY2UgPSAiIk15TmV3TmFtZXNwYWNlIiI7DQorDQorcGFja2FnZSBudW5pdC5zaW1wbGU7DQorLy8gVGVzdCBhIHZlcnkgc2ltcGxlIG1lc3NhZ2UuDQorbWVzc2FnZSBNeU1lc3NhZ2Ugew0KKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOw0KK30gIikNCisgICAgICAgICAgICAgICAgKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3RyaW5nIGdvb2dsZSA9IFBhdGguQ29tYmluZShUZW1wUGF0aCwgImdvb2dsZVxccHJvdG9idWYiKTsNCisgICAgICAgICAgICAgICAgRGlyZWN0b3J5LkNyZWF0ZURpcmVjdG9yeShnb29nbGUpOw0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgZmlsZSBpbiBEaXJlY3RvcnkuR2V0RmlsZXMoUGF0aC5Db21iaW5lKE9yaWdpbmFsV29ya2luZ0RpcmVjdG9yeSwgImdvb2dsZVxccHJvdG9idWYiKSkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEZpbGUuQ29weShmaWxlLCBQYXRoLkNvbWJpbmUoZ29vZ2xlLCBQYXRoLkdldEZpbGVOYW1lKGZpbGUpKSk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIERpcmVjdG9yeS5HZXRGaWxlcyhUZW1wUGF0aCwgIiouY3MiKS5MZW5ndGgpOw0KKyAgICAgICAgICAgICAgICAvL2lmIHlvdSBzcGVjaWZ5IHRoZSBwcm90b2Mgb3B0aW9uIC0taW5jbHVkZV9pbXBvcnRzIHRoaXMgc2hvdWxkIGJ1aWxkIHRocmVlIHNvdXJjZSBmaWxlcw0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b2MoMCwgcHJvdG8uVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgRGlyZWN0b3J5LkdldEZpbGVzKFRlbXBQYXRoLCAiKi5jcyIpLkxlbmd0aCk7DQorDQorICAgICAgICAgICAgICAgIC8veW91IGNhbiAoYW5kIHNob3VsZCkgc2ltcGx5IG9taXQgdGhlIGluY2x1c2lvbiBvZiB0aGUgZXh0cmEgc291cmNlIGZpbGVzIGluIHlvdXIgcHJvamVjdA0KKyAgICAgICAgICAgICAgICBBc3NlbWJseSBhID0gUnVuQ3NjKDAsIHNvdXJjZS5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdCA9IGEuR2V0VHlwZSgiTXlOZXdOYW1lc3BhY2UuTXlNZXNzYWdlIiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodHlwZW9mKElNZXNzYWdlKS5Jc0Fzc2lnbmFibGVGcm9tKHQpLCAiRXhwZWN0IGFuIElNZXNzYWdlIik7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgd2UgY2FuIGZpbmQgdGhlIHN0YXRpYyBkZXNjcmlwdG9yIHR5cGUNCisgICAgICAgICAgICAgICAgYS5HZXRUeXBlKCJNeU5ld05hbWVzcGFjZS4iICsgdGVzdCwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy9TZWVtcyB0aGUgLS1wcm90b19wYXRoIG9yIC1JIG9wdGlvbiBpcyBub24tZnVuY3Rpb25hbCBmb3IgbWUuICBNYXliZSBvdGhlcnMgaGF2ZSBsdWNrPw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UHJvdG9GaWxlSW5EaWZmZXJlbnREaXJlY3RvcnkoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyB0ZXN0ID0gbmV3IFN0YWNrRnJhbWUoZmFsc2UpLkdldE1ldGhvZCgpLk5hbWU7DQorICAgICAgICAgICAgU2V0dXAoKTsNCisgICAgICAgICAgICB1c2luZyAoVGVtcEZpbGUgc291cmNlID0gVGVtcEZpbGUuQXR0YWNoKHRlc3QgKyAiLmNzIikpDQorICAgICAgICAgICAgdXNpbmcgKFByb3RvRmlsZSBwcm90byA9IG5ldyBQcm90b0ZpbGUodGVzdCArICIucHJvdG8iLCBEZWZhdWx0UHJvdG8pKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuQ3VycmVudERpcmVjdG9yeSA9IE9yaWdpbmFsV29ya2luZ0RpcmVjdG9yeTsNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9jKDAsIHByb3RvLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgQXNzZW1ibHkgYSA9IFJ1bkNzYygwLCBzb3VyY2UuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBtZXNzYWdlIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQgPSBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5NeU1lc3NhZ2UiLCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh0eXBlb2YoSU1lc3NhZ2UpLklzQXNzaWduYWJsZUZyb20odCksICJFeHBlY3QgYW4gSU1lc3NhZ2UiKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB3ZSBjYW4gZmluZCB0aGUgc3RhdGljIGRlc2NyaXB0b3IgdHlwZQ0KKyAgICAgICAgICAgICAgICBhLkdldFR5cGUoIm51bml0LnNpbXBsZS4iICsgdGVzdCwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAgICAgICAgLy8gSGFuZGxpbmcgb2YgbXV0bGlwbGUgaW5wdXQgZmlsZXMNCisgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE11bHRpcGxlUHJvdG9GaWxlcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgU2V0dXAoKTsNCisgICAgICAgICAgICB1c2luZyAoVGVtcEZpbGUgc291cmNlMSA9IFRlbXBGaWxlLkF0dGFjaCgiTXlNZXNzYWdlLmNzIikpDQorICAgICAgICAgICAgdXNpbmcgKA0KKyAgICAgICAgICAgICAgICBQcm90b0ZpbGUgcHJvdG8xID0gbmV3IFByb3RvRmlsZSgiTXlNZXNzYWdlLnByb3RvIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCINCitwYWNrYWdlIG51bml0LnNpbXBsZTsNCisvLyBUZXN0IGEgdmVyeSBzaW1wbGUgbWVzc2FnZS4NCittZXNzYWdlIE15TWVzc2FnZSB7DQorICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7DQorfSIpDQorICAgICAgICAgICAgICAgICkNCisgICAgICAgICAgICB1c2luZyAoVGVtcEZpbGUgc291cmNlMiA9IFRlbXBGaWxlLkF0dGFjaCgiTXlNZXNzYWdlTGlzdC5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nICgNCisgICAgICAgICAgICAgICAgUHJvdG9GaWxlIHByb3RvMiA9IG5ldyBQcm90b0ZpbGUoIk15TWVzc2FnZUxpc3QucHJvdG8iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIg0KK3BhY2thZ2UgbnVuaXQuc2ltcGxlOw0KK2ltcG9ydCAiIk15TWVzc2FnZS5wcm90byIiOw0KKy8vIFRlc3QgYSB2ZXJ5IHNpbXBsZSBtZXNzYWdlLg0KK21lc3NhZ2UgTXlNZXNzYWdlTGlzdCB7DQorICByZXBlYXRlZCBNeU1lc3NhZ2UgbWVzc2FnZXMgPSAxOw0KK30iKQ0KKyAgICAgICAgICAgICAgICApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b2MoMCwgcHJvdG8xLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9jKDAsIHByb3RvMi5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGEgPSBSdW5Dc2MoMCwgc291cmNlMS5UZW1wUGF0aCwgc291cmNlMi5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdDEgPSBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5NeU1lc3NhZ2UiLCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh0eXBlb2YoSU1lc3NhZ2UpLklzQXNzaWduYWJsZUZyb20odDEpLCAiRXhwZWN0IGFuIElNZXNzYWdlIik7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdDIgPSBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5NeU1lc3NhZ2VMaXN0IiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodHlwZW9mKElNZXNzYWdlKS5Jc0Fzc2lnbmFibGVGcm9tKHQyKSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLlByb3RvLk15TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5Qcm90by5NeU1lc3NhZ2VMaXN0IiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0T25lUHJvdG9GaWxlV2l0aEJ1ZmZlckZpbGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZTEgPSBUZW1wRmlsZS5BdHRhY2goIk15TWVzc2FnZS5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nICgNCisgICAgICAgICAgICAgICAgUHJvdG9GaWxlIHByb3RvMSA9IG5ldyBQcm90b0ZpbGUoIk15TWVzc2FnZS5wcm90byIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiDQorcGFja2FnZSBudW5pdC5zaW1wbGU7DQorLy8gVGVzdCBhIHZlcnkgc2ltcGxlIG1lc3NhZ2UuDQorbWVzc2FnZSBNeU1lc3NhZ2Ugew0KKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOw0KK30iKQ0KKyAgICAgICAgICAgICAgICApDQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZTIgPSBUZW1wRmlsZS5BdHRhY2goIk15TWVzc2FnZUxpc3QuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoDQorICAgICAgICAgICAgICAgIFByb3RvRmlsZSBwcm90bzIgPSBuZXcgUHJvdG9GaWxlKCJNeU1lc3NhZ2VMaXN0LnByb3RvIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCINCitwYWNrYWdlIG51bml0LnNpbXBsZTsNCitpbXBvcnQgIiJNeU1lc3NhZ2UucHJvdG8iIjsNCisvLyBUZXN0IGEgdmVyeSBzaW1wbGUgbWVzc2FnZS4NCittZXNzYWdlIE15TWVzc2FnZUxpc3Qgew0KKyAgcmVwZWF0ZWQgTXlNZXNzYWdlIG1lc3NhZ2VzID0gMTsNCit9IikNCisgICAgICAgICAgICAgICAgKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy9idWlsZCB0aGUgcHJvdG8gYnVmZmVyIGZvciBNeU1lc3NhZ2UNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9jKDAsIHByb3RvMS5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIC8vYnVpbGQgdGhlIE15TWVzc2FnZUxpc3QgcHJvdG8tYnVmZmVyIGFuZCBnZW5lcmF0ZSBjb2RlIGJ5IGluY2x1ZGluZyBNeU1lc3NhZ2UucGINCisgICAgICAgICAgICAgICAgUnVuUHJvdG9jKDAsIHByb3RvMi5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGEgPSBSdW5Dc2MoMCwgc291cmNlMS5UZW1wUGF0aCwgc291cmNlMi5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdDEgPSBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5NeU1lc3NhZ2UiLCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh0eXBlb2YoSU1lc3NhZ2UpLklzQXNzaWduYWJsZUZyb20odDEpLCAiRXhwZWN0IGFuIElNZXNzYWdlIik7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdDIgPSBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5NeU1lc3NhZ2VMaXN0IiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodHlwZW9mKElNZXNzYWdlKS5Jc0Fzc2lnbmFibGVGcm9tKHQyKSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLlByb3RvLk15TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5Qcm90by5NeU1lc3NhZ2VMaXN0IiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UHJvdG9GaWxlV2l0aFNlcnZpY2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyB0ZXN0ID0gbmV3IFN0YWNrRnJhbWUoZmFsc2UpLkdldE1ldGhvZCgpLk5hbWU7DQorICAgICAgICAgICAgU2V0dXAoKTsNCisgICAgICAgICAgICB1c2luZyAoVGVtcEZpbGUgc291cmNlID0gVGVtcEZpbGUuQXR0YWNoKHRlc3QgKyAiLmNzIikpDQorICAgICAgICAgICAgdXNpbmcgKFByb3RvRmlsZSBwcm90byA9IG5ldyBQcm90b0ZpbGUodGVzdCArICIucHJvdG8iLA0KK0AiDQoraW1wb3J0ICIiZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIiI7DQorb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykuc2VydmljZV9nZW5lcmF0b3JfdHlwZSA9IEdFTkVSSUM7DQorDQorcGFja2FnZSBudW5pdC5zaW1wbGU7DQorLy8gVGVzdCBhIHZlcnkgc2ltcGxlIG1lc3NhZ2UuDQorbWVzc2FnZSBNeU1lc3NhZ2Ugew0KKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOw0KK30NCisvLyB0ZXN0IGEgdmVyeSBzaW1wbGUgc2VydmljZS4NCitzZXJ2aWNlIFRlc3RTZXJ2aWNlIHsNCisgIHJwYyBFeGVjdXRlIChNeU1lc3NhZ2UpIHJldHVybnMgKE15TWVzc2FnZSk7DQorfSIpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ29weUluR29vZ2xlUHJvdG9GaWxlcygpOw0KKw0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b2MoMCwgcHJvdG8uVGVtcFBhdGgsICItbmVzdF9jbGFzc2VzPWZhbHNlIik7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBEaXJlY3RvcnkuR2V0RmlsZXMoVGVtcFBhdGgsICIqLmNzIikuTGVuZ3RoKTsNCisNCisgICAgICAgICAgICAgICAgQXNzZW1ibHkgYSA9IFJ1bkNzYygwLCBzb3VyY2UuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBzZXJ2aWNlIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQxID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuVGVzdFNlcnZpY2UiLCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh0eXBlb2YoSVNlcnZpY2UpLklzQXNzaWduYWJsZUZyb20odDEpLCAiRXhwZWN0IGFuIElTZXJ2aWNlIik7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodDEuSXNBYnN0cmFjdCwgIkV4cGVjdCBhYnN0cmFjdCBjbGFzcyIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBTdHViIHN1YmNsYXNzIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQyID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuVGVzdFNlcnZpY2UrU3R1YiIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHQxLklzQXNzaWduYWJsZUZyb20odDIpLCAiRXhwZWN0IGEgc3ViIG9mIFRlc3RTZXJ2aWNlIik7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHQyLklzQWJzdHJhY3QsICJFeHBlY3QgY29uY3JldGUgY2xhc3MiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQcm90b0ZpbGVXaXRoU2VydmljZUludGVybmFsKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nIChQcm90b0ZpbGUgcHJvdG8gPSBuZXcgUHJvdG9GaWxlKHRlc3QgKyAiLnByb3RvIiwNCitAIg0KK2ltcG9ydCAiImdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byIiOw0KK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLnNlcnZpY2VfZ2VuZXJhdG9yX3R5cGUgPSBHRU5FUklDOw0KKw0KK3BhY2thZ2UgbnVuaXQuc2ltcGxlOw0KKy8vIFRlc3QgYSB2ZXJ5IHNpbXBsZSBtZXNzYWdlLg0KK21lc3NhZ2UgTXlNZXNzYWdlIHsNCisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsNCit9DQorLy8gdGVzdCBhIHZlcnkgc2ltcGxlIHNlcnZpY2UuDQorc2VydmljZSBUZXN0U2VydmljZSB7DQorICBycGMgRXhlY3V0ZSAoTXlNZXNzYWdlKSByZXR1cm5zIChNeU1lc3NhZ2UpOw0KK30iKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENvcHlJbkdvb2dsZVByb3RvRmlsZXMoKTsNCisNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9jKDAsIHByb3RvLlRlbXBQYXRoLCAiLW5lc3RfY2xhc3Nlcz1mYWxzZSIsICItcHVibGljX2NsYXNzZXM9ZmFsc2UiKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIERpcmVjdG9yeS5HZXRGaWxlcyhUZW1wUGF0aCwgIiouY3MiKS5MZW5ndGgpOw0KKw0KKyAgICAgICAgICAgICAgICBBc3NlbWJseSBhID0gUnVuQ3NjKDAsIHNvdXJjZS5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIHNlcnZpY2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdDEgPSBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5UZXN0U2VydmljZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJU2VydmljZSkuSXNBc3NpZ25hYmxlRnJvbSh0MSksICJFeHBlY3QgYW4gSVNlcnZpY2UiKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh0MS5Jc0Fic3RyYWN0LCAiRXhwZWN0IGFic3RyYWN0IGNsYXNzIik7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIFN0dWIgc3ViY2xhc3MgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdDIgPSBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5UZXN0U2VydmljZStTdHViIiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodDEuSXNBc3NpZ25hYmxlRnJvbSh0MiksICJFeHBlY3QgYSBzdWIgb2YgVGVzdFNlcnZpY2UiKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UodDIuSXNBYnN0cmFjdCwgIkV4cGVjdCBjb25jcmV0ZSBjbGFzcyIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29weUluR29vZ2xlUHJvdG9GaWxlcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIGdvb2dsZSA9IFBhdGguQ29tYmluZShUZW1wUGF0aCwgImdvb2dsZVxccHJvdG9idWYiKTsNCisgICAgICAgICAgICBEaXJlY3RvcnkuQ3JlYXRlRGlyZWN0b3J5KGdvb2dsZSk7DQorICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGZpbGUgaW4gRGlyZWN0b3J5LkdldEZpbGVzKFBhdGguQ29tYmluZShPcmlnaW5hbFdvcmtpbmdEaXJlY3RvcnksICJnb29nbGVcXHByb3RvYnVmIikpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRmlsZS5Db3B5KGZpbGUsIFBhdGguQ29tYmluZShnb29nbGUsIFBhdGguR2V0RmlsZU5hbWUoZmlsZSkpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b0dlbi5UZXN0L1RlbXBGaWxlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi5UZXN0L1RlbXBGaWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YTE4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvR2VuLlRlc3QvVGVtcEZpbGUuY3MKQEAgLTAsMCArMSw1OSBAQAordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbg0KK3sNCisgICAgaW50ZXJuYWwgY2xhc3MgUHJvdG9GaWxlIDogVGVtcEZpbGUNCisgICAgew0KKyAgICAgICAgcHVibGljIFByb3RvRmlsZShzdHJpbmcgZmlsZW5hbWUsIHN0cmluZyBjb250ZW50cykNCisgICAgICAgICAgICA6IGJhc2UoZmlsZW5hbWUsIGNvbnRlbnRzKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIGludGVybmFsIGNsYXNzIFRlbXBGaWxlIDogSURpc3Bvc2FibGUNCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgdGVtcEZpbGU7DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIFRlbXBGaWxlIEF0dGFjaChzdHJpbmcgcGF0aCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IFRlbXBGaWxlKHBhdGgsIG51bGwpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJvdGVjdGVkIFRlbXBGaWxlKHN0cmluZyBmaWxlbmFtZSwgc3RyaW5nIGNvbnRlbnRzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRlbXBGaWxlID0gZmlsZW5hbWU7DQorICAgICAgICAgICAgaWYgKGNvbnRlbnRzICE9IG51bGwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBGaWxlLldyaXRlQWxsVGV4dCh0ZW1wRmlsZSwgY29udGVudHMsIG5ldyBVVEY4RW5jb2RpbmcoZmFsc2UpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgVGVtcEZpbGUoc3RyaW5nIGNvbnRlbnRzKQ0KKyAgICAgICAgICAgIDogdGhpcyhQYXRoLkdldFRlbXBGaWxlTmFtZSgpLCBjb250ZW50cykNCisgICAgICAgIHsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdHJpbmcgVGVtcFBhdGgNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGVtcEZpbGU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIENoYW5nZUV4dGVuc2lvbihzdHJpbmcgZXh0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyBuZXdGaWxlID0gUGF0aC5DaGFuZ2VFeHRlbnNpb24odGVtcEZpbGUsIGV4dCk7DQorICAgICAgICAgICAgRmlsZS5Nb3ZlKHRlbXBGaWxlLCBuZXdGaWxlKTsNCisgICAgICAgICAgICB0ZW1wRmlsZSA9IG5ld0ZpbGU7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHModGVtcEZpbGUpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRmlsZS5EZWxldGUodGVtcEZpbGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvR2VuLlRlc3QvVGVzdFByZXByb2Nlc3NpbmcuY3MgYi9jc2hhcnAvc3JjL1Byb3RvR2VuLlRlc3QvVGVzdFByZXByb2Nlc3NpbmcuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzYjA2NgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4uVGVzdC9UZXN0UHJlcHJvY2Vzc2luZy5jcwpAQCAtMCwwICsxLDczMyBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7DQordXNpbmcgU3lzdGVtLklPOw0KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOw0KK3VzaW5nIE5Vbml0LkZyYW1ld29yazsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbg0KK3sNCisgICAgW1Rlc3RGaXh0dXJlXQ0KKyAgICBbQ2F0ZWdvcnkoIlByZXByb2Nlc3NvciIpXQ0KKyAgICBwdWJsaWMgcGFydGlhbCBjbGFzcyBUZXN0UHJlcHJvY2Vzc2luZw0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmcgVGVtcFBhdGggPSBQYXRoLkNvbWJpbmUoUGF0aC5HZXRUZW1wUGF0aCgpLCAicHJvdG8tZ2VuLXRlc3QiKTsNCisNCisgICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIERlZmF1bHRQcm90byA9DQorICAgICAgICAgICAgQCINCitwYWNrYWdlIG51bml0LnNpbXBsZTsNCisvLyBUZXN0IGEgdmVyeSBzaW1wbGUgbWVzc2FnZS4NCittZXNzYWdlIE15TWVzc2FnZSB7DQorICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7DQorfSI7DQorDQorICAgICAgICAjcmVnaW9uIFRlc3RGaXh0dXJlIFNldFVwL1RlYXJEb3duDQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmcgT3JpZ2luYWxXb3JraW5nRGlyZWN0b3J5ID0gRW52aXJvbm1lbnQuQ3VycmVudERpcmVjdG9yeTsNCisNCisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQ0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXR1cCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVhcmRvd24oKTsNCisgICAgICAgICAgICBEaXJlY3RvcnkuQ3JlYXRlRGlyZWN0b3J5KFRlbXBQYXRoKTsNCisgICAgICAgICAgICBFbnZpcm9ubWVudC5DdXJyZW50RGlyZWN0b3J5ID0gVGVtcFBhdGg7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdEZpeHR1cmVUZWFyRG93bl0NCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgVGVhcmRvd24oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEVudmlyb25tZW50LkN1cnJlbnREaXJlY3RvcnkgPSBPcmlnaW5hbFdvcmtpbmdEaXJlY3Rvcnk7DQorICAgICAgICAgICAgaWYgKERpcmVjdG9yeS5FeGlzdHMoVGVtcFBhdGgpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRGlyZWN0b3J5LkRlbGV0ZShUZW1wUGF0aCwgdHJ1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgI3JlZ2lvbiBIZWxwZXIgTWV0aG9kcyBSdW5Qcm90b0dlbiAvIFJ1bkNzYw0KKw0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJ1blByb3RvR2VuKGludCBleHBlY3QsIHBhcmFtcyBzdHJpbmdbXSBhcmdzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRleHRXcml0ZXIgdG91dCA9IENvbnNvbGUuT3V0LCB0ZXJyID0gQ29uc29sZS5FcnJvcjsNCisgICAgICAgICAgICBTdHJpbmdXcml0ZXIgdGVtcCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCisgICAgICAgICAgICBDb25zb2xlLlNldE91dCh0ZW1wKTsNCisgICAgICAgICAgICBDb25zb2xlLlNldEVycm9yKHRlbXApOw0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdCwgUHJvZ3JhbVByZXByb2Nlc3MuUnVuKGFyZ3MpLCAiUHJvdG9HZW4gRmFpbGVkOiB7MH0iLCB0ZW1wKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZmluYWxseQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ29uc29sZS5TZXRPdXQodG91dCk7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuU2V0RXJyb3IodGVycik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBBc3NlbWJseSBSdW5Dc2MoaW50IGV4cGVjdCwgcGFyYW1zIHN0cmluZ1tdIHNvdXJjZXMpDQorICAgICAgICB7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHRlbXBEbGwgPSBuZXcgVGVtcEZpbGUoU3RyaW5nLkVtcHR5KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRlbXBEbGwuQ2hhbmdlRXh0ZW5zaW9uKCIuZGxsIik7DQorICAgICAgICAgICAgICAgIExpc3Q8c3RyaW5nPiBhcmdzID0gbmV3IExpc3Q8c3RyaW5nPigpOw0KKyAgICAgICAgICAgICAgICBhcmdzLkFkZCgiL25vbG9nbyIpOw0KKyAgICAgICAgICAgICAgICBhcmdzLkFkZCgiL3RhcmdldDpsaWJyYXJ5Iik7DQorICAgICAgICAgICAgICAgIGFyZ3MuQWRkKCIvZGVidWctIik7DQorICAgICAgICAgICAgICAgIGFyZ3MuQWRkKFN0cmluZy5Gb3JtYXQoQCIiIi9vdXQ6ezB9IiIiLCB0ZW1wRGxsLlRlbXBQYXRoKSk7DQorICAgICAgICAgICAgICAgIGFyZ3MuQWRkKCIvcjpTeXN0ZW0uZGxsIik7DQorICAgICAgICAgICAgICAgIGFyZ3MuQWRkKFN0cmluZy5Gb3JtYXQoQCIiIi9yOnswfSIiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YoR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90bykuQXNzZW1ibHkuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uKSk7DQorICAgICAgICAgICAgICAgIGFyZ3MuQWRkUmFuZ2Uoc291cmNlcyk7DQorDQorICAgICAgICAgICAgICAgIHN0cmluZyBleGUgPSBQYXRoLkNvbWJpbmUoU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLlJ1bnRpbWVFbnZpcm9ubWVudC5HZXRSdW50aW1lRGlyZWN0b3J5KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNzYy5leGUiKTsNCisgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXJ0SW5mbyBwc2kgPSBuZXcgUHJvY2Vzc1N0YXJ0SW5mbyhleGUpOw0KKyAgICAgICAgICAgICAgICBwc2kuQ3JlYXRlTm9XaW5kb3cgPSB0cnVlOw0KKyAgICAgICAgICAgICAgICBwc2kuVXNlU2hlbGxFeGVjdXRlID0gZmFsc2U7DQorICAgICAgICAgICAgICAgIHBzaS5SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgcHNpLlJlZGlyZWN0U3RhbmRhcmRFcnJvciA9IHRydWU7DQorICAgICAgICAgICAgICAgIHBzaS5Bcmd1bWVudHMgPSBzdHJpbmcuSm9pbigiICIsIGFyZ3MuVG9BcnJheSgpKTsNCisgICAgICAgICAgICAgICAgUHJvY2VzcyBwID0gUHJvY2Vzcy5TdGFydChwc2kpOw0KKyAgICAgICAgICAgICAgICBwLldhaXRGb3JFeGl0KCk7DQorICAgICAgICAgICAgICAgIHN0cmluZyBlcnJvclRleHQgPSBwLlN0YW5kYXJkT3V0cHV0LlJlYWRUb0VuZCgpICsgcC5TdGFuZGFyZEVycm9yLlJlYWRUb0VuZCgpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0LCBwLkV4aXRDb2RlLCAiQ1NDLmV4ZSBGYWlsZWQ6IHswfSIsIGVycm9yVGV4dCk7DQorDQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGFzbSA9IG51bGw7DQorICAgICAgICAgICAgICAgIGlmIChwLkV4aXRDb2RlID09IDApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBhbGxieXRlcyA9IEZpbGUuUmVhZEFsbEJ5dGVzKHRlbXBEbGwuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICAgICAgYXNtID0gQXNzZW1ibHkuTG9hZChhbGxieXRlcyk7DQorDQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChUeXBlIHQgaW4gYXNtLkdldFR5cGVzKCkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRGVidWcuV3JpdGVMaW5lKHQuRnVsbE5hbWUsIGFzbS5GdWxsTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGFzbTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHRlc3RzIGV4Y2VyY2lzZSBvcHRpb25zIGZvciBwcm90b2dlbi5leGUNCisgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFByb3RvRmlsZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRlc3QgPSBuZXcgU3RhY2tGcmFtZShmYWxzZSkuR2V0TWV0aG9kKCkuTmFtZTsNCisgICAgICAgICAgICBTZXR1cCgpOw0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSBzb3VyY2UgPSBUZW1wRmlsZS5BdHRhY2godGVzdCArICIuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsIERlZmF1bHRQcm90bykpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b0dlbigwLCBwcm90by5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGEgPSBSdW5Dc2MoMCwgc291cmNlLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB0aGUgbWVzc2FnZSB0eXBlIGlzIGluIHRoZSBleHBlY3RlZCBuYW1lc3BhY2UNCisgICAgICAgICAgICAgICAgVHlwZSB0ID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuTXlNZXNzYWdlIiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodHlwZW9mKElNZXNzYWdlKS5Jc0Fzc2lnbmFibGVGcm9tKHQpLCAiRXhwZWN0IGFuIElNZXNzYWdlIik7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgd2UgY2FuIGZpbmQgdGhlIHN0YXRpYyBkZXNjcmlwdG9yIHR5cGUNCisgICAgICAgICAgICAgICAgYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuIiArIHRlc3QsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFByb3RvRmlsZVdpdGhDb25mbGljdGluZ1R5cGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyB0ZXN0ID0gbmV3IFN0YWNrRnJhbWUoZmFsc2UpLkdldE1ldGhvZCgpLk5hbWU7DQorICAgICAgICAgICAgU2V0dXAoKTsNCisgICAgICAgICAgICB1c2luZyAoVGVtcEZpbGUgc291cmNlID0gVGVtcEZpbGUuQXR0YWNoKHRlc3QgKyAiLmNzIikpDQorICAgICAgICAgICAgdXNpbmcgKA0KKyAgICAgICAgICAgICAgICBQcm90b0ZpbGUgcHJvdG8gPSBuZXcgUHJvdG9GaWxlKHRlc3QgKyAiLnByb3RvIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIg0KK3BhY2thZ2UgbnVuaXQuc2ltcGxlOw0KKy8vIFRlc3QgYSB2ZXJ5IHNpbXBsZSBtZXNzYWdlLg0KK21lc3NhZ2UgIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCArIEAiIHsNCisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsNCit9ICIpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9HZW4oMCwgcHJvdG8uVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICBBc3NlbWJseSBhID0gUnVuQ3NjKDAsIHNvdXJjZS5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdCA9IGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLiIgKyB0ZXN0LCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh0eXBlb2YoSU1lc3NhZ2UpLklzQXNzaWduYWJsZUZyb20odCksICJFeHBlY3QgYW4gSU1lc3NhZ2UiKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB3ZSBjYW4gZmluZCB0aGUgc3RhdGljIGRlc2NyaXB0b3IgdHlwZQ0KKyAgICAgICAgICAgICAgICBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5Qcm90by4iICsgdGVzdCwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UHJvdG9GaWxlV2l0aE5hbWVzcGFjZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRlc3QgPSBuZXcgU3RhY2tGcmFtZShmYWxzZSkuR2V0TWV0aG9kKCkuTmFtZTsNCisgICAgICAgICAgICBTZXR1cCgpOw0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSBzb3VyY2UgPSBUZW1wRmlsZS5BdHRhY2godGVzdCArICIuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsIERlZmF1bHRQcm90bykpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b0dlbigwLCBwcm90by5UZW1wUGF0aCwgIi1uYW1lc3BhY2U6TXlOZXdOYW1lc3BhY2UiKTsNCisgICAgICAgICAgICAgICAgQXNzZW1ibHkgYSA9IFJ1bkNzYygwLCBzb3VyY2UuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBtZXNzYWdlIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQgPSBhLkdldFR5cGUoIk15TmV3TmFtZXNwYWNlLk15TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0KSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgiTXlOZXdOYW1lc3BhY2UuIiArIHRlc3QsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFByb3RvRmlsZVdpdGhVbWJyZWxsYUNsYXNzTmFtZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRlc3QgPSBuZXcgU3RhY2tGcmFtZShmYWxzZSkuR2V0TWV0aG9kKCkuTmFtZTsNCisgICAgICAgICAgICBTZXR1cCgpOw0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSBzb3VyY2UgPSBUZW1wRmlsZS5BdHRhY2goIk15VW1icmVsbGFDbGFzc25hbWUuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsIERlZmF1bHRQcm90bykpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b0dlbigwLCBwcm90by5UZW1wUGF0aCwgIi91bWJyZWxsYV9jbGFzc25hbWU9TXlVbWJyZWxsYUNsYXNzbmFtZSIpOw0KKyAgICAgICAgICAgICAgICBBc3NlbWJseSBhID0gUnVuQ3NjKDAsIHNvdXJjZS5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdCA9IGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLk15TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0KSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLk15VW1icmVsbGFDbGFzc25hbWUiLCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQcm90b0ZpbGVXaXRoTmVzdGVkQ2xhc3MoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyB0ZXN0ID0gbmV3IFN0YWNrRnJhbWUoZmFsc2UpLkdldE1ldGhvZCgpLk5hbWU7DQorICAgICAgICAgICAgU2V0dXAoKTsNCisgICAgICAgICAgICB1c2luZyAoVGVtcEZpbGUgc291cmNlID0gVGVtcEZpbGUuQXR0YWNoKHRlc3QgKyAiLmNzIikpDQorICAgICAgICAgICAgdXNpbmcgKFByb3RvRmlsZSBwcm90byA9IG5ldyBQcm90b0ZpbGUodGVzdCArICIucHJvdG8iLCBEZWZhdWx0UHJvdG8pKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9HZW4oMCwgcHJvdG8uVGVtcFBhdGgsICItbmVzdF9jbGFzc2VzOnRydWUiKTsNCisgICAgICAgICAgICAgICAgQXNzZW1ibHkgYSA9IFJ1bkNzYygwLCBzb3VyY2UuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBtZXNzYWdlIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQgPSBhLkdldFR5cGUoIm51bml0LnNpbXBsZS4iICsgdGVzdCArICIrTXlNZXNzYWdlIiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodHlwZW9mKElNZXNzYWdlKS5Jc0Fzc2lnbmFibGVGcm9tKHQpLCAiRXhwZWN0IGFuIElNZXNzYWdlIik7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgd2UgY2FuIGZpbmQgdGhlIHN0YXRpYyBkZXNjcmlwdG9yIHR5cGUNCisgICAgICAgICAgICAgICAgYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuIiArIHRlc3QsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFByb3RvRmlsZVdpdGhFeHBhbmRlZE5zRGlyZWN0b3JpZXMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyB0ZXN0ID0gbmV3IFN0YWNrRnJhbWUoZmFsc2UpLkdldE1ldGhvZCgpLk5hbWU7DQorICAgICAgICAgICAgU2V0dXAoKTsNCisgICAgICAgICAgICB1c2luZyAoVGVtcEZpbGUgc291cmNlID0gVGVtcEZpbGUuQXR0YWNoKEAibnVuaXRcc2ltcGxlXCIgKyB0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nIChQcm90b0ZpbGUgcHJvdG8gPSBuZXcgUHJvdG9GaWxlKHRlc3QgKyAiLnByb3RvIiwgRGVmYXVsdFByb3RvKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFJ1blByb3RvR2VuKDAsIHByb3RvLlRlbXBQYXRoLCAiLWV4cGFuZF9uYW1lc3BhY2VfZGlyZWN0b3JpZXM6dHJ1ZSIpOw0KKyAgICAgICAgICAgICAgICBBc3NlbWJseSBhID0gUnVuQ3NjKDAsIHNvdXJjZS5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgdHlwZSBpcyBpbiB0aGUgZXhwZWN0ZWQgbmFtZXNwYWNlDQorICAgICAgICAgICAgICAgIFR5cGUgdCA9IGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLk15TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0KSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLiIgKyB0ZXN0LCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQcm90b0ZpbGVXaXRoTmV3RXh0ZW5zaW9uKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5HZW5lcmF0ZWQuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsIERlZmF1bHRQcm90bykpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b0dlbigwLCBwcm90by5UZW1wUGF0aCwgIi1maWxlX2V4dGVuc2lvbjouR2VuZXJhdGVkLmNzIik7DQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGEgPSBSdW5Dc2MoMCwgc291cmNlLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB0aGUgbWVzc2FnZSB0eXBlIGlzIGluIHRoZSBleHBlY3RlZCBuYW1lc3BhY2UNCisgICAgICAgICAgICAgICAgVHlwZSB0ID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuTXlNZXNzYWdlIiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodHlwZW9mKElNZXNzYWdlKS5Jc0Fzc2lnbmFibGVGcm9tKHQpLCAiRXhwZWN0IGFuIElNZXNzYWdlIik7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgd2UgY2FuIGZpbmQgdGhlIHN0YXRpYyBkZXNjcmlwdG9yIHR5cGUNCisgICAgICAgICAgICAgICAgYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuIiArIHRlc3QsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFByb3RvRmlsZVdpdGhVbWJyZWxsYU5hbWVzcGFjZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRlc3QgPSBuZXcgU3RhY2tGcmFtZShmYWxzZSkuR2V0TWV0aG9kKCkuTmFtZTsNCisgICAgICAgICAgICBTZXR1cCgpOw0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSBzb3VyY2UgPSBUZW1wRmlsZS5BdHRhY2godGVzdCArICIuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsIERlZmF1bHRQcm90bykpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b0dlbigwLCBwcm90by5UZW1wUGF0aCwgIi11bWJyZWxsYV9uYW1lc3BhY2U6TXlVbWJyZWxsYS5OYW1lc3BhY2UiKTsNCisgICAgICAgICAgICAgICAgQXNzZW1ibHkgYSA9IFJ1bkNzYygwLCBzb3VyY2UuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBtZXNzYWdlIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQgPSBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5NeU1lc3NhZ2UiLCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh0eXBlb2YoSU1lc3NhZ2UpLklzQXNzaWduYWJsZUZyb20odCksICJFeHBlY3QgYW4gSU1lc3NhZ2UiKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB3ZSBjYW4gZmluZCB0aGUgc3RhdGljIGRlc2NyaXB0b3IgdHlwZQ0KKyAgICAgICAgICAgICAgICBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5NeVVtYnJlbGxhLk5hbWVzcGFjZS4iICsgdGVzdCwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UHJvdG9GaWxlV2l0aElnbm9yZWRVbWJyZWxsYU5hbWVzcGFjZUR1ZVRvTmVzdGluZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRlc3QgPSBuZXcgU3RhY2tGcmFtZShmYWxzZSkuR2V0TWV0aG9kKCkuTmFtZTsNCisgICAgICAgICAgICBTZXR1cCgpOw0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSBzb3VyY2UgPSBUZW1wRmlsZS5BdHRhY2godGVzdCArICIuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsIERlZmF1bHRQcm90bykpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b0dlbigwLCBwcm90by5UZW1wUGF0aCwgIi1uZXN0X2NsYXNzZXM6dHJ1ZSIsICItdW1icmVsbGFfbmFtZXNwYWNlOk15VW1icmVsbGEuTmFtZXNwYWNlIik7DQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGEgPSBSdW5Dc2MoMCwgc291cmNlLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB0aGUgbWVzc2FnZSB0eXBlIGlzIGluIHRoZSBleHBlY3RlZCBuYW1lc3BhY2UNCisgICAgICAgICAgICAgICAgVHlwZSB0ID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuIiArIHRlc3QgKyAiK015TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0KSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLiIgKyB0ZXN0LCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQcm90b0ZpbGVXaXRoRXhwbGljaXRFbXB0eVVtYnJlbGxhTmFtZXNwYWNlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nICgNCisgICAgICAgICAgICAgICAgUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCINCitwYWNrYWdlIG51bml0LnNpbXBsZTsNCisvLyBUZXN0IGEgdmVyeSBzaW1wbGUgbWVzc2FnZS4NCittZXNzYWdlICIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QgKyBAIiB7DQorICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7DQorfSAiKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vRm9yY2VzIHRoZSB1bWJyZWxsYSBjbGFzcyB0byBub3QgdXNlIGEgbmFtZXNwYWNlIGV2ZW4gaWYgYSBjb2xsaXNpb24gd2l0aCBhIHR5cGUgaXMgZGV0ZWN0ZWQuDQorICAgICAgICAgICAgICAgIFJ1blByb3RvR2VuKDAsIHByb3RvLlRlbXBQYXRoLCAiLXVtYnJlbGxhX25hbWVzcGFjZToiKTsNCisgICAgICAgICAgICAgICAgLy9lcnJvciBDUzA0NDE6ICdudW5pdC5zaW1wbGUuVGVzdFByb3RvRmlsZVdpdGhFeHBsaWNpdEVtcHR5VW1icmVsbGFOYW1lc3BhY2UnOiBhIGNsYXNzIGNhbm5vdCBiZSBib3RoIHN0YXRpYyBhbmQgc2VhbGVkDQorICAgICAgICAgICAgICAgIFJ1bkNzYygxLCBzb3VyY2UuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFByb3RvRmlsZVdpdGhOZXdPdXRwdXRGb2xkZXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyB0ZXN0ID0gbmV3IFN0YWNrRnJhbWUoZmFsc2UpLkdldE1ldGhvZCgpLk5hbWU7DQorICAgICAgICAgICAgU2V0dXAoKTsNCisgICAgICAgICAgICB1c2luZyAoVGVtcEZpbGUgc291cmNlID0gVGVtcEZpbGUuQXR0YWNoKEAiZ2VuZXJhdGVkLWNvZGVcIiArIHRlc3QgKyAiLmNzIikpDQorICAgICAgICAgICAgdXNpbmcgKFByb3RvRmlsZSBwcm90byA9IG5ldyBQcm90b0ZpbGUodGVzdCArICIucHJvdG8iLCBEZWZhdWx0UHJvdG8pKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9HZW4oMSwgcHJvdG8uVGVtcFBhdGgsICItb3V0cHV0X2RpcmVjdG9yeTpnZW5lcmF0ZWQtY29kZSIpOw0KKyAgICAgICAgICAgICAgICBEaXJlY3RvcnkuQ3JlYXRlRGlyZWN0b3J5KCJnZW5lcmF0ZWQtY29kZSIpOw0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b0dlbigwLCBwcm90by5UZW1wUGF0aCwgIi1vdXRwdXRfZGlyZWN0b3J5OmdlbmVyYXRlZC1jb2RlIik7DQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGEgPSBSdW5Dc2MoMCwgc291cmNlLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB0aGUgbWVzc2FnZSB0eXBlIGlzIGluIHRoZSBleHBlY3RlZCBuYW1lc3BhY2UNCisgICAgICAgICAgICAgICAgVHlwZSB0ID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuTXlNZXNzYWdlIiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodHlwZW9mKElNZXNzYWdlKS5Jc0Fzc2lnbmFibGVGcm9tKHQpLCAiRXhwZWN0IGFuIElNZXNzYWdlIik7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgd2UgY2FuIGZpbmQgdGhlIHN0YXRpYyBkZXNjcmlwdG9yIHR5cGUNCisgICAgICAgICAgICAgICAgYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuIiArIHRlc3QsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFByb3RvRmlsZUFuZElnbm9yZUdvb2dsZVByb3RvYnVmKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nICgNCisgICAgICAgICAgICAgICAgUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCINCitpbXBvcnQgIiJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iIjsNCitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS5uYW1lc3BhY2UgPSAiIk15TmV3TmFtZXNwYWNlIiI7DQorIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdFByb3RvKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHN0cmluZyBnb29nbGUgPSBQYXRoLkNvbWJpbmUoVGVtcFBhdGgsICJnb29nbGVcXHByb3RvYnVmIik7DQorICAgICAgICAgICAgICAgIERpcmVjdG9yeS5DcmVhdGVEaXJlY3RvcnkoZ29vZ2xlKTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGZpbGUgaW4gRGlyZWN0b3J5LkdldEZpbGVzKFBhdGguQ29tYmluZShPcmlnaW5hbFdvcmtpbmdEaXJlY3RvcnksICJnb29nbGVcXHByb3RvYnVmIikpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBGaWxlLkNvcHkoZmlsZSwgUGF0aC5Db21iaW5lKGdvb2dsZSwgUGF0aC5HZXRGaWxlTmFtZShmaWxlKSkpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBEaXJlY3RvcnkuR2V0RmlsZXMoVGVtcFBhdGgsICIqLmNzIikuTGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9HZW4oMCwgcHJvdG8uVGVtcFBhdGgsICItaWdub3JlX2dvb2dsZV9wcm90b2J1Zjp0cnVlIik7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBEaXJlY3RvcnkuR2V0RmlsZXMoVGVtcFBhdGgsICIqLmNzIikuTGVuZ3RoKTsNCisNCisgICAgICAgICAgICAgICAgQXNzZW1ibHkgYSA9IFJ1bkNzYygwLCBzb3VyY2UuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBtZXNzYWdlIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQgPSBhLkdldFR5cGUoIk15TmV3TmFtZXNwYWNlLk15TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0KSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgiTXlOZXdOYW1lc3BhY2UuIiArIHRlc3QsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFByb3RvRmlsZVdpdGhvdXRJZ25vcmVHb29nbGVQcm90b2J1ZigpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRlc3QgPSBuZXcgU3RhY2tGcmFtZShmYWxzZSkuR2V0TWV0aG9kKCkuTmFtZTsNCisgICAgICAgICAgICBTZXR1cCgpOw0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSBzb3VyY2UgPSBUZW1wRmlsZS5BdHRhY2godGVzdCArICIuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoDQorICAgICAgICAgICAgICAgIFByb3RvRmlsZSBwcm90byA9IG5ldyBQcm90b0ZpbGUodGVzdCArICIucHJvdG8iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiDQoraW1wb3J0ICIiZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIiI7DQorb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykubmFtZXNwYWNlID0gIiJNeU5ld05hbWVzcGFjZSIiOw0KKyIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRQcm90bykpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBzdHJpbmcgZ29vZ2xlID0gUGF0aC5Db21iaW5lKFRlbXBQYXRoLCAiZ29vZ2xlXFxwcm90b2J1ZiIpOw0KKyAgICAgICAgICAgICAgICBEaXJlY3RvcnkuQ3JlYXRlRGlyZWN0b3J5KGdvb2dsZSk7DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBmaWxlIGluIERpcmVjdG9yeS5HZXRGaWxlcyhQYXRoLkNvbWJpbmUoT3JpZ2luYWxXb3JraW5nRGlyZWN0b3J5LCAiZ29vZ2xlXFxwcm90b2J1ZiIpKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgRmlsZS5Db3B5KGZpbGUsIFBhdGguQ29tYmluZShnb29nbGUsIFBhdGguR2V0RmlsZU5hbWUoZmlsZSkpKTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgRGlyZWN0b3J5LkdldEZpbGVzKFRlbXBQYXRoLCAiKi5jcyIpLkxlbmd0aCk7DQorICAgICAgICAgICAgICAgIC8vV2l0aG91dCB0aGUgb3B0aW9uIHRoaXMgZmFpbHMgZHVlIHRvIGJlaW5nIHVuYWJsZSB0byByZXNvbHZlIGdvb2dsZS9wcm90b2J1ZiBkZXNjcmlwdG9ycw0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b0dlbigxLCBwcm90by5UZW1wUGF0aCwgIi1pZ25vcmVfZ29vZ2xlX3Byb3RvYnVmOmZhbHNlIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyB0ZXN0cyBleGNlcmNpc2Ugb3B0aW9ucyBmb3IgcHJvdG9jLmV4ZQ0KKyAgICAgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UHJvdG9GaWxlV2l0aEluY2x1ZGVJbXBvcnRzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nICgNCisgICAgICAgICAgICAgICAgUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCINCitpbXBvcnQgIiJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iIjsNCitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS5uYW1lc3BhY2UgPSAiIk15TmV3TmFtZXNwYWNlIiI7DQorDQorcGFja2FnZSBudW5pdC5zaW1wbGU7DQorLy8gVGVzdCBhIHZlcnkgc2ltcGxlIG1lc3NhZ2UuDQorbWVzc2FnZSBNeU1lc3NhZ2Ugew0KKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOw0KK30gIikNCisgICAgICAgICAgICAgICAgKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3RyaW5nIGdvb2dsZSA9IFBhdGguQ29tYmluZShUZW1wUGF0aCwgImdvb2dsZVxccHJvdG9idWYiKTsNCisgICAgICAgICAgICAgICAgRGlyZWN0b3J5LkNyZWF0ZURpcmVjdG9yeShnb29nbGUpOw0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgZmlsZSBpbiBEaXJlY3RvcnkuR2V0RmlsZXMoUGF0aC5Db21iaW5lKE9yaWdpbmFsV29ya2luZ0RpcmVjdG9yeSwgImdvb2dsZVxccHJvdG9idWYiKSkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEZpbGUuQ29weShmaWxlLCBQYXRoLkNvbWJpbmUoZ29vZ2xlLCBQYXRoLkdldEZpbGVOYW1lKGZpbGUpKSk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIERpcmVjdG9yeS5HZXRGaWxlcyhUZW1wUGF0aCwgIiouY3MiKS5MZW5ndGgpOw0KKyAgICAgICAgICAgICAgICAvL2lmIHlvdSBzcGVjaWZ5IHRoZSBwcm90b2Mgb3B0aW9uIC0taW5jbHVkZV9pbXBvcnRzIHRoaXMgc2hvdWxkIGJ1aWxkIHRocmVlIHNvdXJjZSBmaWxlcw0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b0dlbigwLCBwcm90by5UZW1wUGF0aCwgIi0taW5jbHVkZV9pbXBvcnRzIik7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBEaXJlY3RvcnkuR2V0RmlsZXMoVGVtcFBhdGgsICIqLmNzIikuTGVuZ3RoKTsNCisNCisgICAgICAgICAgICAgICAgLy95b3UgY2FuIChhbmQgc2hvdWxkKSBzaW1wbHkgb21pdCB0aGUgaW5jbHVzaW9uIG9mIHRoZSBleHRyYSBzb3VyY2UgZmlsZXMgaW4geW91ciBwcm9qZWN0DQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGEgPSBSdW5Dc2MoMCwgc291cmNlLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB0aGUgbWVzc2FnZSB0eXBlIGlzIGluIHRoZSBleHBlY3RlZCBuYW1lc3BhY2UNCisgICAgICAgICAgICAgICAgVHlwZSB0ID0gYS5HZXRUeXBlKCJNeU5ld05hbWVzcGFjZS5NeU1lc3NhZ2UiLCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh0eXBlb2YoSU1lc3NhZ2UpLklzQXNzaWduYWJsZUZyb20odCksICJFeHBlY3QgYW4gSU1lc3NhZ2UiKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB3ZSBjYW4gZmluZCB0aGUgc3RhdGljIGRlc2NyaXB0b3IgdHlwZQ0KKyAgICAgICAgICAgICAgICBhLkdldFR5cGUoIk15TmV3TmFtZXNwYWNlLiIgKyB0ZXN0LCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQcm90b0ZpbGVXaXRoSW5jbHVkZUltcG9ydHNBbmRJZ25vcmVHb29nbGVQcm90b2J1ZigpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRlc3QgPSBuZXcgU3RhY2tGcmFtZShmYWxzZSkuR2V0TWV0aG9kKCkuTmFtZTsNCisgICAgICAgICAgICBTZXR1cCgpOw0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSBzb3VyY2UgPSBUZW1wRmlsZS5BdHRhY2godGVzdCArICIuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoDQorICAgICAgICAgICAgICAgIFByb3RvRmlsZSBwcm90byA9IG5ldyBQcm90b0ZpbGUodGVzdCArICIucHJvdG8iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiDQoraW1wb3J0ICIiZ29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIiI7DQorb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykubmFtZXNwYWNlID0gIiJNeU5ld05hbWVzcGFjZSIiOw0KKw0KK3BhY2thZ2UgbnVuaXQuc2ltcGxlOw0KKy8vIFRlc3QgYSB2ZXJ5IHNpbXBsZSBtZXNzYWdlLg0KK21lc3NhZ2UgTXlNZXNzYWdlIHsNCisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsNCit9ICIpDQorICAgICAgICAgICAgICAgICkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHN0cmluZyBnb29nbGUgPSBQYXRoLkNvbWJpbmUoVGVtcFBhdGgsICJnb29nbGVcXHByb3RvYnVmIik7DQorICAgICAgICAgICAgICAgIERpcmVjdG9yeS5DcmVhdGVEaXJlY3RvcnkoZ29vZ2xlKTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGZpbGUgaW4gRGlyZWN0b3J5LkdldEZpbGVzKFBhdGguQ29tYmluZShPcmlnaW5hbFdvcmtpbmdEaXJlY3RvcnksICJnb29nbGVcXHByb3RvYnVmIikpKQ0KKyAgICAgICAgICAgICAgICAgICAgRmlsZS5Db3B5KGZpbGUsIFBhdGguQ29tYmluZShnb29nbGUsIFBhdGguR2V0RmlsZU5hbWUoZmlsZSkpKTsNCisNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIERpcmVjdG9yeS5HZXRGaWxlcyhUZW1wUGF0aCwgIiouY3MiKS5MZW5ndGgpOw0KKyAgICAgICAgICAgICAgICAvL0V2ZW4gd2l0aCAtLWluY2x1ZGVfaW1wb3J0cywgaWYgeW91IHByb3ZpZGUgLWlnbm9yZV9nb29nbGVfcHJvdG9idWY6dHJ1ZSB5b3Ugb25seSBnZXQgdGhlIG9uZSBzb3VyY2UgZmlsZQ0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b0dlbigwLCBwcm90by5UZW1wUGF0aCwgIi1pZ25vcmVfZ29vZ2xlX3Byb3RvYnVmOnRydWUiLCAiLS1pbmNsdWRlX2ltcG9ydHMiKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIERpcmVjdG9yeS5HZXRGaWxlcyhUZW1wUGF0aCwgIiouY3MiKS5MZW5ndGgpOw0KKw0KKyAgICAgICAgICAgICAgICAvL3lvdSBjYW4gKGFuZCBzaG91bGQpIHNpbXBseSBvbWl0IHRoZSBpbmNsdXNpb24gb2YgdGhlIGV4dHJhIHNvdXJjZSBmaWxlcyBpbiB5b3VyIHByb2plY3QNCisgICAgICAgICAgICAgICAgQXNzZW1ibHkgYSA9IFJ1bkNzYygwLCBzb3VyY2UuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBtZXNzYWdlIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQgPSBhLkdldFR5cGUoIk15TmV3TmFtZXNwYWNlLk15TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0KSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHdlIGNhbiBmaW5kIHRoZSBzdGF0aWMgZGVzY3JpcHRvciB0eXBlDQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgiTXlOZXdOYW1lc3BhY2UuIiArIHRlc3QsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFByb3RvRmlsZUtlZXBpbmdUaGVQcm90b0J1ZmZlcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRlc3QgPSBuZXcgU3RhY2tGcmFtZShmYWxzZSkuR2V0TWV0aG9kKCkuTmFtZTsNCisgICAgICAgICAgICBTZXR1cCgpOw0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSBwcm90b2J1ZiA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5wYiIpKQ0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSBzb3VyY2UgPSBUZW1wRmlsZS5BdHRhY2godGVzdCArICIuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoDQorICAgICAgICAgICAgICAgIFByb3RvRmlsZSBwcm90byA9IG5ldyBQcm90b0ZpbGUodGVzdCArICIucHJvdG8iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiDQorcGFja2FnZSBudW5pdC5zaW1wbGU7DQorLy8gVGVzdCBhIHZlcnkgc2ltcGxlIG1lc3NhZ2UuDQorbWVzc2FnZSBNeU1lc3NhZ2Ugew0KKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOw0KK30gIikNCisgICAgICAgICAgICAgICAgKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9HZW4oMCwgcHJvdG8uVGVtcFBhdGgsICItLWRlc2NyaXB0b3Jfc2V0X291dD0iICsgcHJvdG9idWYuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKEZpbGUuRXhpc3RzKHByb3RvYnVmLlRlbXBQYXRoKSwgIk1pc3Npbmc6ICIgKyBwcm90b2J1Zi5UZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGEgPSBSdW5Dc2MoMCwgc291cmNlLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB0aGUgbWVzc2FnZSB0eXBlIGlzIGluIHRoZSBleHBlY3RlZCBuYW1lc3BhY2UNCisgICAgICAgICAgICAgICAgVHlwZSB0ID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuTXlNZXNzYWdlIiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodHlwZW9mKElNZXNzYWdlKS5Jc0Fzc2lnbmFibGVGcm9tKHQpLCAiRXhwZWN0IGFuIElNZXNzYWdlIik7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgd2UgY2FuIGZpbmQgdGhlIHN0YXRpYyBkZXNjcmlwdG9yIHR5cGUNCisgICAgICAgICAgICAgICAgYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuIiArIHRlc3QsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vU2VlbXMgdGhlIC0tcHJvdG9fcGF0aCBvciAtSSBvcHRpb24gaXMgbm9uLWZ1bmN0aW9uYWwgZm9yIG1lLiAgTWF5YmUgb3RoZXJzIGhhdmUgbHVjaz8NCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFByb3RvRmlsZUluRGlmZmVyZW50RGlyZWN0b3J5KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nIChQcm90b0ZpbGUgcHJvdG8gPSBuZXcgUHJvdG9GaWxlKHRlc3QgKyAiLnByb3RvIiwgRGVmYXVsdFByb3RvKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEVudmlyb25tZW50LkN1cnJlbnREaXJlY3RvcnkgPSBPcmlnaW5hbFdvcmtpbmdEaXJlY3Rvcnk7DQorICAgICAgICAgICAgICAgIFJ1blByb3RvR2VuKDAsIHByb3RvLlRlbXBQYXRoLCAiLS1wcm90b19wYXRoPSIgKyBUZW1wUGF0aCk7DQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGEgPSBSdW5Dc2MoMCwgc291cmNlLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB0aGUgbWVzc2FnZSB0eXBlIGlzIGluIHRoZSBleHBlY3RlZCBuYW1lc3BhY2UNCisgICAgICAgICAgICAgICAgVHlwZSB0ID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuTXlNZXNzYWdlIiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodHlwZW9mKElNZXNzYWdlKS5Jc0Fzc2lnbmFibGVGcm9tKHQpLCAiRXhwZWN0IGFuIElNZXNzYWdlIik7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgd2UgY2FuIGZpbmQgdGhlIHN0YXRpYyBkZXNjcmlwdG9yIHR5cGUNCisgICAgICAgICAgICAgICAgYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuIiArIHRlc3QsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgICAgICAgIC8vIEhhbmRsaW5nIG9mIG11dGxpcGxlIGlucHV0IGZpbGVzDQorICAgICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RNdWx0aXBsZVByb3RvRmlsZXMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZTEgPSBUZW1wRmlsZS5BdHRhY2goIk15TWVzc2FnZS5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nICgNCisgICAgICAgICAgICAgICAgUHJvdG9GaWxlIHByb3RvMSA9IG5ldyBQcm90b0ZpbGUoIk15TWVzc2FnZS5wcm90byIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiDQorcGFja2FnZSBudW5pdC5zaW1wbGU7DQorLy8gVGVzdCBhIHZlcnkgc2ltcGxlIG1lc3NhZ2UuDQorbWVzc2FnZSBNeU1lc3NhZ2Ugew0KKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOw0KK30iKQ0KKyAgICAgICAgICAgICAgICApDQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZTIgPSBUZW1wRmlsZS5BdHRhY2goIk15TWVzc2FnZUxpc3QuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoDQorICAgICAgICAgICAgICAgIFByb3RvRmlsZSBwcm90bzIgPSBuZXcgUHJvdG9GaWxlKCJNeU1lc3NhZ2VMaXN0LnByb3RvIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCINCitwYWNrYWdlIG51bml0LnNpbXBsZTsNCitpbXBvcnQgIiJNeU1lc3NhZ2UucHJvdG8iIjsNCisvLyBUZXN0IGEgdmVyeSBzaW1wbGUgbWVzc2FnZS4NCittZXNzYWdlIE15TWVzc2FnZUxpc3Qgew0KKyAgcmVwZWF0ZWQgTXlNZXNzYWdlIG1lc3NhZ2VzID0gMTsNCit9IikNCisgICAgICAgICAgICAgICAgKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9HZW4oMCwgcHJvdG8xLlRlbXBQYXRoLCBwcm90bzIuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICBBc3NlbWJseSBhID0gUnVuQ3NjKDAsIHNvdXJjZTEuVGVtcFBhdGgsIHNvdXJjZTIuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBtZXNzYWdlIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQxID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuTXlNZXNzYWdlIiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodHlwZW9mKElNZXNzYWdlKS5Jc0Fzc2lnbmFibGVGcm9tKHQxKSwgIkV4cGVjdCBhbiBJTWVzc2FnZSIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBtZXNzYWdlIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQyID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuTXlNZXNzYWdlTGlzdCIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0MiksICJFeHBlY3QgYW4gSU1lc3NhZ2UiKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB3ZSBjYW4gZmluZCB0aGUgc3RhdGljIGRlc2NyaXB0b3IgdHlwZQ0KKyAgICAgICAgICAgICAgICBhLkdldFR5cGUoIm51bml0LnNpbXBsZS5Qcm90by5NeU1lc3NhZ2UiLCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuUHJvdG8uTXlNZXNzYWdlTGlzdCIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE9uZVByb3RvRmlsZVdpdGhCdWZmZXJGaWxlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBTZXR1cCgpOw0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSBzb3VyY2UxID0gVGVtcEZpbGUuQXR0YWNoKCJNeU1lc3NhZ2UuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoVGVtcEZpbGUgcHJvdG9idWYgPSBUZW1wRmlsZS5BdHRhY2goIk15TWVzc2FnZS5wYiIpKQ0KKyAgICAgICAgICAgIHVzaW5nICgNCisgICAgICAgICAgICAgICAgUHJvdG9GaWxlIHByb3RvMSA9IG5ldyBQcm90b0ZpbGUoIk15TWVzc2FnZS5wcm90byIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiDQorcGFja2FnZSBudW5pdC5zaW1wbGU7DQorLy8gVGVzdCBhIHZlcnkgc2ltcGxlIG1lc3NhZ2UuDQorbWVzc2FnZSBNeU1lc3NhZ2Ugew0KKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOw0KK30iKQ0KKyAgICAgICAgICAgICAgICApDQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZTIgPSBUZW1wRmlsZS5BdHRhY2goIk15TWVzc2FnZUxpc3QuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoDQorICAgICAgICAgICAgICAgIFByb3RvRmlsZSBwcm90bzIgPSBuZXcgUHJvdG9GaWxlKCJNeU1lc3NhZ2VMaXN0LnByb3RvIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCINCitwYWNrYWdlIG51bml0LnNpbXBsZTsNCitpbXBvcnQgIiJNeU1lc3NhZ2UucHJvdG8iIjsNCisvLyBUZXN0IGEgdmVyeSBzaW1wbGUgbWVzc2FnZS4NCittZXNzYWdlIE15TWVzc2FnZUxpc3Qgew0KKyAgcmVwZWF0ZWQgTXlNZXNzYWdlIG1lc3NhZ2VzID0gMTsNCit9IikNCisgICAgICAgICAgICAgICAgKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy9idWlsZCB0aGUgcHJvdG8gYnVmZmVyIGZvciBNeU1lc3NhZ2UNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9HZW4oMCwgcHJvdG8xLlRlbXBQYXRoLCAiLS1kZXNjcmlwdG9yX3NldF9vdXQ9IiArIHByb3RvYnVmLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgLy9idWlsZCB0aGUgTXlNZXNzYWdlTGlzdCBwcm90by1idWZmZXIgYW5kIGdlbmVyYXRlIGNvZGUgYnkgaW5jbHVkaW5nIE15TWVzc2FnZS5wYg0KKyAgICAgICAgICAgICAgICBSdW5Qcm90b0dlbigwLCBwcm90bzIuVGVtcFBhdGgsIHByb3RvYnVmLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgQXNzZW1ibHkgYSA9IFJ1bkNzYygwLCBzb3VyY2UxLlRlbXBQYXRoLCBzb3VyY2UyLlRlbXBQYXRoKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB0aGUgbWVzc2FnZSB0eXBlIGlzIGluIHRoZSBleHBlY3RlZCBuYW1lc3BhY2UNCisgICAgICAgICAgICAgICAgVHlwZSB0MSA9IGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLk15TWVzc2FnZSIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHR5cGVvZihJTWVzc2FnZSkuSXNBc3NpZ25hYmxlRnJvbSh0MSksICJFeHBlY3QgYW4gSU1lc3NhZ2UiKTsNCisgICAgICAgICAgICAgICAgLy9hc3NlcnQgdGhhdCB0aGUgbWVzc2FnZSB0eXBlIGlzIGluIHRoZSBleHBlY3RlZCBuYW1lc3BhY2UNCisgICAgICAgICAgICAgICAgVHlwZSB0MiA9IGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLk15TWVzc2FnZUxpc3QiLCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh0eXBlb2YoSU1lc3NhZ2UpLklzQXNzaWduYWJsZUZyb20odDIpLCAiRXhwZWN0IGFuIElNZXNzYWdlIik7DQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0IHRoYXQgd2UgY2FuIGZpbmQgdGhlIHN0YXRpYyBkZXNjcmlwdG9yIHR5cGUNCisgICAgICAgICAgICAgICAgYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuUHJvdG8uTXlNZXNzYWdlIiwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIGEuR2V0VHlwZSgibnVuaXQuc2ltcGxlLlByb3RvLk15TWVzc2FnZUxpc3QiLCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQcm90b0ZpbGVXaXRoU2VydmljZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRlc3QgPSBuZXcgU3RhY2tGcmFtZShmYWxzZSkuR2V0TWV0aG9kKCkuTmFtZTsNCisgICAgICAgICAgICBTZXR1cCgpOw0KKyAgICAgICAgICAgIHVzaW5nIChUZW1wRmlsZSBzb3VyY2UgPSBUZW1wRmlsZS5BdHRhY2godGVzdCArICIuY3MiKSkNCisgICAgICAgICAgICB1c2luZyAoUHJvdG9GaWxlIHByb3RvID0gbmV3IFByb3RvRmlsZSh0ZXN0ICsgIi5wcm90byIsDQorQCINCitpbXBvcnQgIiJnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8iIjsNCitvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS5zZXJ2aWNlX2dlbmVyYXRvcl90eXBlID0gR0VORVJJQzsNCisNCitwYWNrYWdlIG51bml0LnNpbXBsZTsNCisvLyBUZXN0IGEgdmVyeSBzaW1wbGUgbWVzc2FnZS4NCittZXNzYWdlIE15TWVzc2FnZSB7DQorICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7DQorfQ0KKy8vIHRlc3QgYSB2ZXJ5IHNpbXBsZSBzZXJ2aWNlLg0KK3NlcnZpY2UgVGVzdFNlcnZpY2Ugew0KKyAgcnBjIEV4ZWN1dGUgKE15TWVzc2FnZSkgcmV0dXJucyAoTXlNZXNzYWdlKTsNCit9IikpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDb3B5SW5Hb29nbGVQcm90b0ZpbGVzKCk7DQorDQorICAgICAgICAgICAgICAgIFJ1blByb3RvR2VuKDAsIHByb3RvLlRlbXBQYXRoLCAiLWlnbm9yZV9nb29nbGVfcHJvdG9idWY6dHJ1ZSIsICItbmVzdF9jbGFzc2VzPWZhbHNlIik7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBEaXJlY3RvcnkuR2V0RmlsZXMoVGVtcFBhdGgsICIqLmNzIikuTGVuZ3RoKTsNCisNCisgICAgICAgICAgICAgICAgQXNzZW1ibHkgYSA9IFJ1bkNzYygwLCBzb3VyY2UuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBzZXJ2aWNlIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQxID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuVGVzdFNlcnZpY2UiLCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh0eXBlb2YoSVNlcnZpY2UpLklzQXNzaWduYWJsZUZyb20odDEpLCAiRXhwZWN0IGFuIElTZXJ2aWNlIik7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodDEuSXNBYnN0cmFjdCwgIkV4cGVjdCBhYnN0cmFjdCBjbGFzcyIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBTdHViIHN1YmNsYXNzIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQyID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuVGVzdFNlcnZpY2UrU3R1YiIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHQxLklzQXNzaWduYWJsZUZyb20odDIpLCAiRXhwZWN0IGEgc3ViIG9mIFRlc3RTZXJ2aWNlIik7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHQyLklzQWJzdHJhY3QsICJFeHBlY3QgY29uY3JldGUgY2xhc3MiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQcm90b0ZpbGVXaXRoU2VydmljZUludGVybmFsKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGVzdCA9IG5ldyBTdGFja0ZyYW1lKGZhbHNlKS5HZXRNZXRob2QoKS5OYW1lOw0KKyAgICAgICAgICAgIFNldHVwKCk7DQorICAgICAgICAgICAgdXNpbmcgKFRlbXBGaWxlIHNvdXJjZSA9IFRlbXBGaWxlLkF0dGFjaCh0ZXN0ICsgIi5jcyIpKQ0KKyAgICAgICAgICAgIHVzaW5nIChQcm90b0ZpbGUgcHJvdG8gPSBuZXcgUHJvdG9GaWxlKHRlc3QgKyAiLnByb3RvIiwNCitAIg0KK2ltcG9ydCAiImdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byIiOw0KK29wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLnNlcnZpY2VfZ2VuZXJhdG9yX3R5cGUgPSBHRU5FUklDOw0KKw0KK3BhY2thZ2UgbnVuaXQuc2ltcGxlOw0KKy8vIFRlc3QgYSB2ZXJ5IHNpbXBsZSBtZXNzYWdlLg0KK21lc3NhZ2UgTXlNZXNzYWdlIHsNCisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsNCit9DQorLy8gdGVzdCBhIHZlcnkgc2ltcGxlIHNlcnZpY2UuDQorc2VydmljZSBUZXN0U2VydmljZSB7DQorICBycGMgRXhlY3V0ZSAoTXlNZXNzYWdlKSByZXR1cm5zIChNeU1lc3NhZ2UpOw0KK30iKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENvcHlJbkdvb2dsZVByb3RvRmlsZXMoKTsNCisNCisgICAgICAgICAgICAgICAgUnVuUHJvdG9HZW4oMCwgcHJvdG8uVGVtcFBhdGgsICItaWdub3JlX2dvb2dsZV9wcm90b2J1Zjp0cnVlIiwgIi1uZXN0X2NsYXNzZXM9ZmFsc2UiLCAiLXB1YmxpY19jbGFzc2VzPWZhbHNlIik7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBEaXJlY3RvcnkuR2V0RmlsZXMoVGVtcFBhdGgsICIqLmNzIikuTGVuZ3RoKTsNCisNCisgICAgICAgICAgICAgICAgQXNzZW1ibHkgYSA9IFJ1bkNzYygwLCBzb3VyY2UuVGVtcFBhdGgpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBzZXJ2aWNlIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQxID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuVGVzdFNlcnZpY2UiLCB0cnVlLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh0eXBlb2YoSVNlcnZpY2UpLklzQXNzaWduYWJsZUZyb20odDEpLCAiRXhwZWN0IGFuIElTZXJ2aWNlIik7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodDEuSXNBYnN0cmFjdCwgIkV4cGVjdCBhYnN0cmFjdCBjbGFzcyIpOw0KKyAgICAgICAgICAgICAgICAvL2Fzc2VydCB0aGF0IHRoZSBTdHViIHN1YmNsYXNzIHR5cGUgaXMgaW4gdGhlIGV4cGVjdGVkIG5hbWVzcGFjZQ0KKyAgICAgICAgICAgICAgICBUeXBlIHQyID0gYS5HZXRUeXBlKCJudW5pdC5zaW1wbGUuVGVzdFNlcnZpY2UrU3R1YiIsIHRydWUsIHRydWUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHQxLklzQXNzaWduYWJsZUZyb20odDIpLCAiRXhwZWN0IGEgc3ViIG9mIFRlc3RTZXJ2aWNlIik7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHQyLklzQWJzdHJhY3QsICJFeHBlY3QgY29uY3JldGUgY2xhc3MiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvcHlJbkdvb2dsZVByb3RvRmlsZXMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyBnb29nbGUgPSBQYXRoLkNvbWJpbmUoVGVtcFBhdGgsICJnb29nbGVcXHByb3RvYnVmIik7DQorICAgICAgICAgICAgRGlyZWN0b3J5LkNyZWF0ZURpcmVjdG9yeShnb29nbGUpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBmaWxlIGluIERpcmVjdG9yeS5HZXRGaWxlcyhQYXRoLkNvbWJpbmUoT3JpZ2luYWxXb3JraW5nRGlyZWN0b3J5LCAiZ29vZ2xlXFxwcm90b2J1ZiIpKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEZpbGUuQ29weShmaWxlLCBQYXRoLkNvbWJpbmUoZ29vZ2xlLCBQYXRoLkdldEZpbGVOYW1lKGZpbGUpKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4uVGVzdC9wcm90b2MtZ2VuLWNzLlRlc3QuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi5UZXN0L3Byb3RvYy1nZW4tY3MuVGVzdC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4MTYxMQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4uVGVzdC9wcm90b2MtZ2VuLWNzLlRlc3QuY3Nwcm9qCkBAIC0wLDAgKzEsMTAxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DTElFTlRQUk9GSUxFPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+TkVUMzU8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57QzEwMjRDOUMtODE3Ni00OEMzLUI1NDctQjlGNkRGNkI4MEE2fTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbjwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5wcm90b2MtZ2VuLWNzLlRlc3Q8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMzVcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDM1XFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yayI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTlVuaXRcbGliXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jR2VuQ3NVbml0dGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZW1wRmlsZS5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4YmRjZS1kOTI1LTQzZjMtOTRhYy1hNTMxZTZkZjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b0dlblxwcm90b2MtZ2VuLWNzLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezI1MGFkZTM0LTgyZmQtNGJhZS04NmQ1LTk4NWZiZTU4OWM0Yn08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+cHJvdG9jLWdlbi1jczwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29udGVudCBJbmNsdWRlPSIuLlwuLlxsaWJccHJvdG9jLmV4ZSI+DQorICAgICAgPExpbms+cHJvdG9jLmV4ZTwvTGluaz4NCisgICAgICA8Q29weVRvT3V0cHV0RGlyZWN0b3J5PlByZXNlcnZlTmV3ZXN0PC9Db3B5VG9PdXRwdXREaXJlY3Rvcnk+DQorICAgIDwvQ29udGVudD4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5ccHJvdG9zXGdvb2dsZVxwcm90b2J1Zlxjc2hhcnBfb3B0aW9ucy5wcm90byI+DQorICAgICAgPExpbms+Z29vZ2xlXHByb3RvYnVmXGNzaGFycF9vcHRpb25zLnByb3RvPC9MaW5rPg0KKyAgICAgIDxDb3B5VG9PdXRwdXREaXJlY3Rvcnk+UHJlc2VydmVOZXdlc3Q8L0NvcHlUb091dHB1dERpcmVjdG9yeT4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlwuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXGRlc2NyaXB0b3IucHJvdG8iPg0KKyAgICAgIDxMaW5rPmdvb2dsZVxwcm90b2J1ZlxkZXNjcmlwdG9yLnByb3RvPC9MaW5rPg0KKyAgICAgIDxDb3B5VG9PdXRwdXREaXJlY3Rvcnk+UHJlc2VydmVOZXdlc3Q8L0NvcHlUb091dHB1dERpcmVjdG9yeT4NCisgICAgPC9Ob25lPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8U2VydmljZSBJbmNsdWRlPSJ7ODJBN0Y0OEQtM0I1MC00QjFFLUI4MkUtM0FEQTgyMTBDMzU4fSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPFN0YXJ0QWN0aW9uPlByb2dyYW08L1N0YXJ0QWN0aW9uPg0KKyAgICA8U3RhcnRQcm9ncmFtPiQoUHJvamVjdERpcikuLlwuLlxsaWJcTlVuaXRcdG9vbHNcbnVuaXQtY29uc29sZS5leGU8L1N0YXJ0UHJvZ3JhbT4NCisgICAgPFN0YXJ0QXJndW1lbnRzPi9ub2xvZ28gL25vc2hhZG93IC9sYWJlbHMgL3dhaXQgJChBc3NlbWJseU5hbWUpLmRsbDwvU3RhcnRBcmd1bWVudHM+DQorICAgIDxTdGFydFdvcmtpbmdEaXJlY3Rvcnk+JChQcm9qZWN0RGlyKSQoT3V0cHV0UGF0aCk8L1N0YXJ0V29ya2luZ0RpcmVjdG9yeT4NCisgIDwvUHJvcGVydHlHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b0dlbi9EZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbi5jcyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmMTkyZQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24uY3MKQEAgLTAsMCArMSw1NSBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbg0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gRXhjZXB0aW9uIHRocm93biB3aGVuIGRlcGVuZGVuY2llcyB3aXRoaW4gYSBkZXNjcmlwdG9yIHNldCBjYW4ndCBiZSByZXNvbHZlZC4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbiA6IEV4Y2VwdGlvbg0KKyAgICB7DQorICAgICAgICBwdWJsaWMgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpIDogYmFzZShtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIERlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uKHN0cmluZyBmb3JtYXQsIHBhcmFtcyBvYmplY3RbXSBhcmdzKQ0KKyAgICAgICAgICAgIDogYmFzZShzdHJpbmcuRm9ybWF0KGZvcm1hdCwgYXJncykpDQorICAgICAgICB7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b0dlbi9EZXNjcmlwdG9yVXRpbC5jcyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vRGVzY3JpcHRvclV0aWwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2NmJiOQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vRGVzY3JpcHRvclV0aWwuY3MKQEAgLTAsMCArMSwxMDYgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW4NCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFV0aWxpdHkgY2xhc3MgZm9yIGRldGVybWluaW5nIG5hbWVzcGFjZXMgZXRjLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRGVzY3JpcHRvclV0aWwNCisgICAgew0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBHZXRGdWxsVW1icmVsbGFDbGFzc05hbWUoSURlc2NyaXB0b3IgZGVzY3JpcHRvcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBDU2hhcnBGaWxlT3B0aW9ucyBvcHRpb25zID0gZGVzY3JpcHRvci5GaWxlLkNTaGFycE9wdGlvbnM7DQorICAgICAgICAgICAgc3RyaW5nIHJlc3VsdCA9IG9wdGlvbnMuTmFtZXNwYWNlOw0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gIiIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gJy4nOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHQgKz0gR2V0UXVhbGlmaWVkVW1icmVsbGFDbGFzc05hbWUob3B0aW9ucyk7DQorICAgICAgICAgICAgcmV0dXJuICJnbG9iYWw6OiIgKyByZXN1bHQ7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRXZhbHVhdGVzIHRoZSBvcHRpb25zIGFuZCByZXR1cm5zIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdW1icmVsbGEgY2xhc3MNCisgICAgICAgIC8vLyByZWxhdGl2ZSB0byB0aGUgZGVzY3JpcHRvciB0eXBlJ3MgbmFtZXNwYWNlLiAgQmFzaWNhbGx5IGNvbmNhdGVuYXRlcyB0aGUNCisgICAgICAgIC8vLyBVbWJyZWxsYU5hbWVzcGFjZSArIFVtYnJlbGxhQ2xhc3NuYW1lIGZpZWxkcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldFF1YWxpZmllZFVtYnJlbGxhQ2xhc3NOYW1lKENTaGFycEZpbGVPcHRpb25zIG9wdGlvbnMpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIGZ1bGxOYW1lID0gb3B0aW9ucy5VbWJyZWxsYUNsYXNzbmFtZTsNCisgICAgICAgICAgICBpZiAoIW9wdGlvbnMuTmVzdENsYXNzZXMgJiYgb3B0aW9ucy5VbWJyZWxsYU5hbWVzcGFjZSAhPSAiIikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGZ1bGxOYW1lID0gU3RyaW5nLkZvcm1hdCgiezB9LnsxfSIsIG9wdGlvbnMuVW1icmVsbGFOYW1lc3BhY2UsIG9wdGlvbnMuVW1icmVsbGFDbGFzc25hbWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gZnVsbE5hbWU7DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldE1hcHBlZFR5cGVOYW1lKE1hcHBlZFR5cGUgdHlwZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuSW50MzI6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludCI7DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5JbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAibG9uZyI7DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5VSW50MzI6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gInVpbnQiOw0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuVUludDY0Og0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ1bG9uZyI7DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5TaW5nbGU6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImZsb2F0IjsNCisgICAgICAgICAgICAgICAgY2FzZSBNYXBwZWRUeXBlLkRvdWJsZToNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZG91YmxlIjsNCisgICAgICAgICAgICAgICAgY2FzZSBNYXBwZWRUeXBlLkJvb2xlYW46DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImJvb2wiOw0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuU3RyaW5nOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOw0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuQnl0ZVN0cmluZzoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAicGI6OkJ5dGVTdHJpbmciOw0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuRW51bToNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuTWVzc2FnZToNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiVW5rbm93biBtYXBwZWQgdHlwZSAiICsgdHlwZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4vRW51bUZpZWxkR2VuZXJhdG9yLmNzIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9FbnVtRmllbGRHZW5lcmF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3MGJjNgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vRW51bUZpZWxkR2VuZXJhdG9yLmNzCkBAIC0wLDAgKzEsMTQ4IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbg0KK3sNCisgICAgaW50ZXJuYWwgY2xhc3MgRW51bUZpZWxkR2VuZXJhdG9yIDogRmllbGRHZW5lcmF0b3JCYXNlLCBJRmllbGRTb3VyY2VHZW5lcmF0b3INCisgICAgew0KKyAgICAgICAgaW50ZXJuYWwgRW51bUZpZWxkR2VuZXJhdG9yKEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBpbnQgZmllbGRPcmRpbmFsKQ0KKyAgICAgICAgICAgIDogYmFzZShkZXNjcmlwdG9yLCBmaWVsZE9yZGluYWwpDQorICAgICAgICB7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHJpdmF0ZSBib29sIGhhc3swfTsiLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInByaXZhdGUgezB9IHsxfV8gPSB7Mn07IiwgVHlwZU5hbWUsIE5hbWUsIERlZmF1bHRWYWx1ZSk7DQorICAgICAgICAgICAgQWRkRGVwcmVjYXRlZEZsYWcod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgYm9vbCBIYXN7MH0ge3siLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgZ2V0IHt7IHJldHVybiBoYXN7MH07IH19IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgQWRkUHVibGljTWVtYmVyQXR0cmlidXRlcyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyB7MH0gezF9IHt7IiwgVHlwZU5hbWUsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBnZXQge3sgcmV0dXJuIHswfV87IH19IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBib29sIEhhc3swfSB7eyIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiIGdldCB7eyByZXR1cm4gcmVzdWx0Lmhhc3swfTsgfX0iLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICBBZGRQdWJsaWNNZW1iZXJBdHRyaWJ1dGVzKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHswfSB7MX0ge3siLCBUeXBlTmFtZSwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGdldCB7eyByZXR1cm4gcmVzdWx0LnswfTsgfX0iLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgc2V0IHt7IFNldHswfSh2YWx1ZSk7IH19IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgQWRkUHVibGljTWVtYmVyQXR0cmlidXRlcyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBCdWlsZGVyIFNldHswfSh7MX0gdmFsdWUpIHt7IiwgUHJvcGVydHlOYW1lLCBUeXBlTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBQcmVwYXJlQnVpbGRlcigpOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmVzdWx0Lmhhc3swfSA9IHRydWU7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdC57MH1fID0gdmFsdWU7IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gdGhpczsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgQWRkRGVwcmVjYXRlZEZsYWcod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgQnVpbGRlciBDbGVhcnswfSgpIHt7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIFByZXBhcmVCdWlsZGVyKCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXN1bHQuaGFzezB9ID0gZmFsc2U7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdC57MH1fID0gezF9OyIsIE5hbWUsIERlZmF1bHRWYWx1ZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gdGhpczsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlmIChvdGhlci5IYXN7MH0pIHt7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHswfSA9IG90aGVyLnswfTsiLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZSBmb3IgZW51bSB0eXBlcw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJvYmplY3QgdW5rbm93bjsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpZihpbnB1dC5SZWFkRW51bShyZWYgcmVzdWx0LnswfV8sIG91dCB1bmtub3duKSkge3siLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdC5oYXN7MH0gPSB0cnVlOyIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSBlbHNlIGlmKHVua25vd24gaXMgaW50KSB7Iik7DQorICAgICAgICAgICAgaWYgKCFVc2VMaXRlUnVudGltZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgeyIpOyAvLyBGaXJzdCB1bmtub3duIGZpZWxkIC0gY3JlYXRlIGJ1aWxkZXIgbm93DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7Iik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgfSIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCh7MH0sICh1bG9uZykoaW50KXVua25vd24pOyIsIE51bWJlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYgKGhhc3swfSkge3siLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgb3V0cHV0LldyaXRlRW51bSh7MH0sIGZpZWxkX25hbWVzW3syfV0sIChpbnQpIHsxfSwgezF9KTsiLCBOdW1iZXIsIFByb3BlcnR5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkT3JkaW5hbCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYgKGhhc3swfSkge3siLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKHswfSwgKGludCkgezF9KTsiLCBOdW1iZXIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVIYXNoKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlmIChoYXN7MH0pIGhhc2ggXj0gezF9Xy5HZXRIYXNoQ29kZSgpOyIsIFByb3BlcnR5TmFtZSwgTmFtZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUVxdWFscyhUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpZiAoaGFzezB9ICE9IG90aGVyLmhhc3swfSB8fCAoaGFzezB9ICYmICF7MX1fLkVxdWFscyhvdGhlci57MX1fKSkpIHJldHVybiBmYWxzZTsiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlOYW1lLCBOYW1lKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG9TdHJpbmcoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiUHJpbnRGaWVsZChcInswfVwiLCBoYXN7MX0sIHsyfV8sIHdyaXRlcik7IiwgRGVzY3JpcHRvci5OYW1lLCBQcm9wZXJ0eU5hbWUsIE5hbWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4vRW51bUdlbmVyYXRvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vRW51bUdlbmVyYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmVkNDVkCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9FbnVtR2VuZXJhdG9yLmNzCkBAIC0wLDAgKzEsNjIgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvR2VuDQorew0KKyAgICBpbnRlcm5hbCBjbGFzcyBFbnVtR2VuZXJhdG9yIDogU291cmNlR2VuZXJhdG9yQmFzZTxFbnVtRGVzY3JpcHRvcj4sIElTb3VyY2VHZW5lcmF0b3INCisgICAgew0KKyAgICAgICAgaW50ZXJuYWwgRW51bUdlbmVyYXRvcihFbnVtRGVzY3JpcHRvciBkZXNjcmlwdG9yKSA6IGJhc2UoZGVzY3JpcHRvcikNCisgICAgICAgIHsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIFRPRE8oam9uc2tlZXQpOiBXcml0ZSBvdXQgZW51bSBkZXNjcmlwdG9ycz8gQ2FuIGJlIHJldHJpZXZlZCBmcm9tIGZpbGUuLi4NCisgICAgICAgIHB1YmxpYyB2b2lkIEdlbmVyYXRlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ7MH0gZW51bSB7MX0ge3siLCBDbGFzc0FjY2Vzc0xldmVsLCBEZXNjcmlwdG9yLk5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisgICAgICAgICAgICBmb3JlYWNoIChFbnVtVmFsdWVEZXNjcmlwdG9yIHZhbHVlIGluIERlc2NyaXB0b3IuVmFsdWVzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9ID0gezF9LCIsIHZhbHVlLk5hbWUsIHZhbHVlLk51bWJlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvR2VuL0V4dGVuc2lvbkdlbmVyYXRvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vRXh0ZW5zaW9uR2VuZXJhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NjJhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL0V4dGVuc2lvbkdlbmVyYXRvci5jcwpAQCAtMCwwICsxLDE4MyBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvR2VuDQorew0KKyAgICBpbnRlcm5hbCBjbGFzcyBFeHRlbnNpb25HZW5lcmF0b3IgOiBGaWVsZEdlbmVyYXRvckJhc2UsIElTb3VyY2VHZW5lcmF0b3INCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgZXh0ZW5kczsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIHNjb3BlOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgdHlwZTsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIG5hbWU7DQorDQorICAgICAgICBpbnRlcm5hbCBFeHRlbnNpb25HZW5lcmF0b3IoRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IpDQorICAgICAgICAgICAgOiBiYXNlKGRlc2NyaXB0b3IsIDApDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuRXh0ZW5zaW9uU2NvcGUgIT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHNjb3BlID0gR2V0Q2xhc3NOYW1lKERlc2NyaXB0b3IuRXh0ZW5zaW9uU2NvcGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBzY29wZSA9IERlc2NyaXB0b3JVdGlsLkdldEZ1bGxVbWJyZWxsYUNsYXNzTmFtZShEZXNjcmlwdG9yLkZpbGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzd2l0Y2ggKERlc2NyaXB0b3IuTWFwcGVkVHlwZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5NZXNzYWdlOg0KKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEdldENsYXNzTmFtZShEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuRW51bToNCisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBHZXRDbGFzc05hbWUoRGVzY3JpcHRvci5FbnVtVHlwZSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEZXNjcmlwdG9yVXRpbC5HZXRNYXBwZWRUeXBlTmFtZShEZXNjcmlwdG9yLk1hcHBlZFR5cGUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGV4dGVuZHMgPSBHZXRDbGFzc05hbWUoRGVzY3JpcHRvci5Db250YWluaW5nVHlwZSk7DQorICAgICAgICAgICAgbmFtZSA9IERlc2NyaXB0b3IuQ1NoYXJwT3B0aW9ucy5Qcm9wZXJ0eU5hbWU7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZShUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoRGVzY3JpcHRvci5GaWxlLkNTaGFycE9wdGlvbnMuQ2xzQ29tcGxpYW5jZSAmJiBHZXRGaWVsZENvbnN0YW50TmFtZShEZXNjcmlwdG9yKS5TdGFydHNXaXRoKCJfIikpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0iKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIGNvbnN0IGludCB7MH0gPSB7MX07IiwgR2V0RmllbGRDb25zdGFudE5hbWUoRGVzY3JpcHRvciksIERlc2NyaXB0b3IuRmllbGROdW1iZXIpOw0KKw0KKyAgICAgICAgICAgIGlmIChVc2VMaXRlUnVudGltZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChEZXNjcmlwdG9yLk1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5NZXNzYWdlICYmIERlc2NyaXB0b3IuTWVzc2FnZVR5cGUuT3B0aW9ucy5NZXNzYWdlU2V0V2lyZUZvcm1hdCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlOyBpcyBub3Qgc3VwcG9ydGVkIGluIExpdGUgcnVudGltZSBleHRlbnNpb25zLiIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmICghRGVzY3JpcHRvci5Jc0NMU0NvbXBsaWFudCAmJiBEZXNjcmlwdG9yLkZpbGUuQ1NoYXJwT3B0aW9ucy5DbHNDb21wbGlhbmNlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ7MH0gc3RhdGljIHBiOjp7NH08ezF9LCB7Mn0+IHszfTsiLCBDbGFzc0FjY2Vzc0xldmVsLCBleHRlbmRzLCB0eXBlLCBuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IuSXNSZXBlYXRlZCA/ICJHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlIiA6ICJHZW5lcmF0ZWRFeHRlbnNpb25MaXRlIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgaWYgKERlc2NyaXB0b3IuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmICghRGVzY3JpcHRvci5Jc0NMU0NvbXBsaWFudCAmJiBEZXNjcmlwdG9yLkZpbGUuQ1NoYXJwT3B0aW9ucy5DbHNDb21wbGlhbmNlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ7MH0gc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8ezF9Pj4gezJ9OyIsIENsYXNzQWNjZXNzTGV2ZWwsIHR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmICghRGVzY3JpcHRvci5Jc0NMU0NvbXBsaWFudCAmJiBEZXNjcmlwdG9yLkZpbGUuQ1NoYXJwT3B0aW9ucy5DbHNDb21wbGlhbmNlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ7MH0gc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHsxfT4gezJ9OyIsIENsYXNzQWNjZXNzTGV2ZWwsIHR5cGUsIG5hbWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHZvaWQgR2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycyhUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoVXNlTGl0ZVJ1bnRpbWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ7MH0uezF9ID0gIiwgc2NvcGUsIG5hbWUpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIm5ldyBwYjo6ezB9PHsxfSwgezJ9PigiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IuSXNSZXBlYXRlZCA/ICJHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlIiA6ICJHZW5lcmF0ZWRFeHRlbnNpb25MaXRlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRzLCB0eXBlKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJcInswfVwiLCIsIERlc2NyaXB0b3IuRnVsbE5hbWUpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ7MH0uRGVmYXVsdEluc3RhbmNlLCIsIGV4dGVuZHMpOw0KKyAgICAgICAgICAgICAgICBpZiAoIURlc2NyaXB0b3IuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9LCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IuSGFzRGVmYXVsdFZhbHVlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IERlZmF1bHRWYWx1ZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJc051bGxhYmxlVHlwZSA/ICJudWxsIiA6ICJkZWZhdWx0KCIgKyB0eXBlICsgIikiKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ7MH0sIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGVzY3JpcHRvci5NYXBwZWRUeXBlID09IE1hcHBlZFR5cGUuTWVzc2FnZSkgPyB0eXBlICsgIi5EZWZhdWx0SW5zdGFuY2UiIDogIm51bGwiKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9LCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERlc2NyaXB0b3IuTWFwcGVkVHlwZSA9PSBNYXBwZWRUeXBlLkVudW0pID8gIm5ldyBFbnVtTGl0ZU1hcDwiICsgdHlwZSArICI+KCkiIDogIm51bGwiKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9LnsxfUZpZWxkTnVtYmVyLCIsIHNjb3BlLCBuYW1lKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCJwYmQ6OkZpZWxkVHlwZS57MH0iLCBEZXNjcmlwdG9yLkZpZWxkVHlwZSk7DQorICAgICAgICAgICAgICAgIGlmIChEZXNjcmlwdG9yLklzUmVwZWF0ZWQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiwiKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShEZXNjcmlwdG9yLklzUGFja2VkID8gInRydWUiIDogImZhbHNlIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiKTsiKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZiAoRGVzY3JpcHRvci5Jc1JlcGVhdGVkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgNCisgICAgICAgICAgICAgICAgICAgICJ7MH0uezF9ID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjx7Mn0+LkNyZWF0ZUluc3RhbmNlKHswfS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbezN9XSk7Iiwgc2NvcGUsDQorICAgICAgICAgICAgICAgICAgICBuYW1lLCB0eXBlLCBEZXNjcmlwdG9yLkluZGV4KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgNCisgICAgICAgICAgICAgICAgICAgICJ7MH0uezF9ID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjx7Mn0+LkNyZWF0ZUluc3RhbmNlKHswfS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbezN9XSk7Iiwgc2NvcGUsDQorICAgICAgICAgICAgICAgICAgICBuYW1lLCB0eXBlLCBEZXNjcmlwdG9yLkluZGV4KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCB2b2lkIEdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZShUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJyZWdpc3RyeS5BZGQoezB9LnsxfSk7Iiwgc2NvcGUsIG5hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVIYXNoKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVFcXVhbHMoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvU3RyaW5nKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4vRmllbGRHZW5lcmF0b3JCYXNlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9GaWVsZEdlbmVyYXRvckJhc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhZWU2YwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vRmllbGRHZW5lcmF0b3JCYXNlLmNzCkBAIC0wLDAgKzEsMzg5IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOw0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW4NCit7DQorICAgIGludGVybmFsIGFic3RyYWN0IGNsYXNzIEZpZWxkR2VuZXJhdG9yQmFzZSA6IFNvdXJjZUdlbmVyYXRvckJhc2U8RmllbGREZXNjcmlwdG9yPg0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfZmllbGRPcmRpbmFsOw0KKw0KKyAgICAgICAgcHJvdGVjdGVkIEZpZWxkR2VuZXJhdG9yQmFzZShGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciwgaW50IGZpZWxkT3JkaW5hbCkNCisgICAgICAgICAgICA6IGJhc2UoZGVzY3JpcHRvcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBfZmllbGRPcmRpbmFsID0gZmllbGRPcmRpbmFsOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVIYXNoKFRleHRHZW5lcmF0b3Igd3JpdGVyKTsNCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRXF1YWxzKFRleHRHZW5lcmF0b3Igd3JpdGVyKTsNCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlVG9TdHJpbmcoVGV4dEdlbmVyYXRvciB3cml0ZXIpOw0KKw0KKyAgICAgICAgcHVibGljIGludCBGaWVsZE9yZGluYWwNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2ZpZWxkT3JkaW5hbDsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBBbGxQcmludGFibGVBc2NpaShzdHJpbmcgdGV4dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoIChjaGFyIGMgaW4gdGV4dCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChjIDwgMHgyMCB8fCBjID4gMHg3ZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBoYXMgYSBub24tZGVmYXVsdCBkZWZhdWx0IHZhbHVlLiAgRm9yIGluc3RhbmNlIHRoaXMgcmV0dXJucyANCisgICAgICAgIC8vLyBmYWxzZSBmb3IgbnVtZXJpY3Mgd2l0aCBhIGRlZmF1bHQgb2YgemVybyAnMCcsIG9yIGJvb2xlYW5zIHdpdGggYSBkZWZhdWx0IG9mIGZhbHNlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBib29sIEhhc0RlZmF1bHRWYWx1ZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3dpdGNoIChEZXNjcmlwdG9yLkZpZWxkVHlwZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRmxvYXQ6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Eb3VibGU6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkludDY0Og0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ludDMyOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ludDY0Og0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TRml4ZWQ2NDoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GaXhlZDY0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNvbnZlcnRpYmxlIHZhbHVlID0gKElDb252ZXJ0aWJsZSkgRGVzY3JpcHRvci5EZWZhdWx0VmFsdWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSAhPSAiMCI7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuQm9vbDoNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChib29sKSBEZXNjcmlwdG9yLkRlZmF1bHRWYWx1ZSkgPT0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHJlbWFya3M+Q29weSBleGlzdHMgaW4gRXh0ZW5zaW9uR2VuZXJhdG9yLmNzPC9yZW1hcmtzPg0KKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBEZWZhdWx0VmFsdWUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXggPSAiIjsNCisgICAgICAgICAgICAgICAgc3dpdGNoIChEZXNjcmlwdG9yLkZpZWxkVHlwZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRmxvYXQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIkYiOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRG91YmxlOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJEIjsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkludDY0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJMIjsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiVUwiOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHN3aXRjaCAoRGVzY3JpcHRvci5GaWVsZFR5cGUpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZsb2F0Og0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRG91YmxlOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuSW50MzI6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNGaXhlZDMyOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkNjQ6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50MzI6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50NjQ6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GaXhlZDMyOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRml4ZWQ2NDoNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzaW1wbGUgT2JqZWN0LlRvU3RyaW5nIGNvbnZlcnRzIHVzaW5nIHRoZSBjdXJyZW50IGN1bHR1cmUuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gYWx3YXlzIHVzZSB0aGUgaW52YXJpYW50IGN1bHR1cmUgc28gaXQncyBwcmVkaWN0YWJsZS4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNvbnZlcnRpYmxlIHZhbHVlID0gKElDb252ZXJ0aWJsZSkgRGVzY3JpcHRvci5EZWZhdWx0VmFsdWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYSBmZXcgdGhpbmdzIHRoYXQgbXVzdCBiZSBoYW5kbGVkIGV4cGxpY2l0bHkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuRmllbGRUeXBlID09IEZpZWxkVHlwZS5Eb3VibGUgJiYgdmFsdWUgaXMgZG91YmxlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG91YmxlLklzTmFOKChkb3VibGUpIHZhbHVlKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImRvdWJsZS5OYU4iOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5Jc1Bvc2l0aXZlSW5maW5pdHkoKGRvdWJsZSkgdmFsdWUpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZG91YmxlLlBvc2l0aXZlSW5maW5pdHkiOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5Jc05lZ2F0aXZlSW5maW5pdHkoKGRvdWJsZSkgdmFsdWUpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZG91YmxlLk5lZ2F0aXZlSW5maW5pdHkiOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKERlc2NyaXB0b3IuRmllbGRUeXBlID09IEZpZWxkVHlwZS5GbG9hdCAmJiB2YWx1ZSBpcyBmbG9hdCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsb2F0LklzTmFOKChmbG9hdCkgdmFsdWUpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZmxvYXQuTmFOIjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbG9hdC5Jc1Bvc2l0aXZlSW5maW5pdHkoKGZsb2F0KSB2YWx1ZSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJmbG9hdC5Qb3NpdGl2ZUluZmluaXR5IjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbG9hdC5Jc05lZ2F0aXZlSW5maW5pdHkoKGZsb2F0KSB2YWx1ZSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJmbG9hdC5OZWdhdGl2ZUluZmluaXR5IjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyBzdWZmaXg7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuQm9vbDoNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2wpIERlc2NyaXB0b3IuRGVmYXVsdFZhbHVlID8gInRydWUiIDogImZhbHNlIjsNCisNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkJ5dGVzOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRGVzY3JpcHRvci5IYXNEZWZhdWx0VmFsdWUpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInBiOjpCeXRlU3RyaW5nLkVtcHR5IjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFVzZUxpdGVSdW50aW1lICYmIERlc2NyaXB0b3IuRGVmYXVsdFZhbHVlIGlzIEJ5dGVTdHJpbmcpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGVtcCA9ICgoKEJ5dGVTdHJpbmcpIERlc2NyaXB0b3IuRGVmYXVsdFZhbHVlKS5Ub0Jhc2U2NCgpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5Gb3JtYXQoInBiOjpCeXRlU3RyaW5nLkZyb21CYXNlNjQoXCJ7MH1cIikiLCB0ZW1wKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoIihwYjo6Qnl0ZVN0cmluZykgezB9LkRlc2NyaXB0b3IuRmllbGRzW3sxfV0uRGVmYXVsdFZhbHVlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDbGFzc05hbWUoRGVzY3JpcHRvci5Db250YWluaW5nVHlwZSksIERlc2NyaXB0b3IuSW5kZXgpOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU3RyaW5nOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbGxQcmludGFibGVBc2NpaShEZXNjcmlwdG9yLlByb3RvLkRlZmF1bHRWYWx1ZSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgY2hhcnMgYXJlIEFTQ0lJIGFuZCBwcmludGFibGUuICBJbiB0aGlzIGNhc2Ugd2Ugb25seQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGVzY2FwZSBxdW90ZXMgYW5kIGJhY2tzbGFzaGVzLg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlwiIiArIERlc2NyaXB0b3IuUHJvdG8uRGVmYXVsdFZhbHVlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5SZXBsYWNlKCJcXCIsICJcXFxcIikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJlcGxhY2UoIiciLCAiXFwnIikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJlcGxhY2UoIlwiIiwgIlxcXCIiKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIiOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVXNlTGl0ZVJ1bnRpbWUgJiYgRGVzY3JpcHRvci5EZWZhdWx0VmFsdWUgaXMgU3RyaW5nKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRlbXAgPSBDb252ZXJ0LlRvQmFzZTY0U3RyaW5nKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoKFN0cmluZykgRGVzY3JpcHRvci5EZWZhdWx0VmFsdWUpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5Gb3JtYXQoInBiOjpCeXRlU3RyaW5nLkZyb21CYXNlNjQoXCJ7MH1cIikuVG9TdHJpbmdVdGY4KCkiLCB0ZW1wKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoIihzdHJpbmcpIHswfS5EZXNjcmlwdG9yLkZpZWxkc1t7MX1dLkRlZmF1bHRWYWx1ZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q2xhc3NOYW1lKERlc2NyaXB0b3IuQ29udGFpbmluZ1R5cGUpLCBEZXNjcmlwdG9yLkluZGV4KTsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkVudW06DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR5cGVOYW1lICsgIi4iICsgKChFbnVtVmFsdWVEZXNjcmlwdG9yKSBEZXNjcmlwdG9yLkRlZmF1bHRWYWx1ZSkuTmFtZTsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLk1lc3NhZ2U6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Hcm91cDoNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHlwZU5hbWUgKyAiLkRlZmF1bHRJbnN0YW5jZSI7DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIGZpZWxkIGRlc2NyaXB0b3IgdHlwZSIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBQcm9wZXJ0eU5hbWUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvci5DU2hhcnBPcHRpb25zLlByb3BlcnR5TmFtZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBOYW1lDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIE5hbWVIZWxwZXJzLlVuZGVyc2NvcmVzVG9DYW1lbENhc2UoR2V0RmllbGROYW1lKERlc2NyaXB0b3IpKTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJvdGVjdGVkIGludCBOdW1iZXINCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvci5GaWVsZE51bWJlcjsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgQWRkTnVsbENoZWNrKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFkZE51bGxDaGVjayh3cml0ZXIsICJ2YWx1ZSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgQWRkTnVsbENoZWNrKFRleHRHZW5lcmF0b3Igd3JpdGVyLCBzdHJpbmcgbmFtZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoSXNOdWxsYWJsZVR5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh7MH0sIFwiezB9XCIpOyIsIG5hbWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCB2b2lkIEFkZFB1YmxpY01lbWJlckF0dHJpYnV0ZXMoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgQWRkRGVwcmVjYXRlZEZsYWcod3JpdGVyKTsNCisgICAgICAgICAgICBBZGRDbHNDb21wbGlhbmNlQ2hlY2sod3JpdGVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCB2b2lkIEFkZENsc0NvbXBsaWFuY2VDaGVjayhUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoIURlc2NyaXB0b3IuSXNDTFNDb21wbGlhbnQgJiYgRGVzY3JpcHRvci5GaWxlLkNTaGFycE9wdGlvbnMuQ2xzQ29tcGxpYW5jZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIltnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXSIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCBib29sIElzT2Jzb2xldGUgeyBnZXQgeyByZXR1cm4gRGVzY3JpcHRvci5PcHRpb25zLkRlcHJlY2F0ZWQ7IH0gfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0gaWYgdGhlIG1lbWJlciBpcyBvYnNvbGV0ZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCB2b2lkIEFkZERlcHJlY2F0ZWRGbGFnKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChJc09ic29sZXRlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEZvciBlbmNvZGluZ3Mgd2l0aCBmaXhlZCBzaXplcywgcmV0dXJucyB0aGF0IHNpemUgaW4gYnl0ZXMuICBPdGhlcndpc2UNCisgICAgICAgIC8vLyByZXR1cm5zIC0xLiBUT0RPKGpvbnNrZWV0KTogTWFrZSB0aGlzIGxlc3MgdWdseS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgaW50IEZpeGVkU2l6ZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3dpdGNoIChEZXNjcmlwdG9yLkZpZWxkVHlwZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuVUludDMyOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuVUludDY0Og0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuSW50MzI6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkVudW06DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5CeXRlczoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlN0cmluZzoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLk1lc3NhZ2U6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Hcm91cDoNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GbG9hdDoNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2lyZUZvcm1hdC5GbG9hdFNpemU7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TRml4ZWQzMjoNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2lyZUZvcm1hdC5TRml4ZWQzMlNpemU7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GaXhlZDMyOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXaXJlRm9ybWF0LkZpeGVkMzJTaXplOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRG91YmxlOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXaXJlRm9ybWF0LkRvdWJsZVNpemU7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TRml4ZWQ2NDoNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2lyZUZvcm1hdC5TRml4ZWQ2NFNpemU7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GaXhlZDY0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXaXJlRm9ybWF0LkZpeGVkNjRTaXplOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuQm9vbDoNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2lyZUZvcm1hdC5Cb29sU2l6ZTsNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkludmFsaWQgZmllbGQgZGVzY3JpcHRvciB0eXBlIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwcm90ZWN0ZWQgYm9vbCBJc051bGxhYmxlVHlwZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3dpdGNoIChEZXNjcmlwdG9yLkZpZWxkVHlwZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRmxvYXQ6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Eb3VibGU6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkludDY0Og0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ludDMyOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ludDY0Og0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TRml4ZWQ2NDoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GaXhlZDY0Og0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuQm9vbDoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkVudW06DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuQnl0ZXM6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TdHJpbmc6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5NZXNzYWdlOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuR3JvdXA6DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIGZpZWxkIGRlc2NyaXB0b3IgdHlwZSIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBUeXBlTmFtZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3dpdGNoIChEZXNjcmlwdG9yLkZpZWxkVHlwZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRW51bToNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0Q2xhc3NOYW1lKERlc2NyaXB0b3IuRW51bVR5cGUpOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuTWVzc2FnZToNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkdyb3VwOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRDbGFzc05hbWUoRGVzY3JpcHRvci5NZXNzYWdlVHlwZSk7DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEZXNjcmlwdG9yVXRpbC5HZXRNYXBwZWRUeXBlTmFtZShEZXNjcmlwdG9yLk1hcHBlZFR5cGUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBNZXNzYWdlT3JHcm91cA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yLkZpZWxkVHlwZSA9PSBGaWVsZFR5cGUuR3JvdXAgPyAiR3JvdXAiIDogIk1lc3NhZ2UiOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0aGUgdHlwZSBuYW1lIGFzIHVzZWQgaW4gQ29kZWRJbnB1dFN0cmVhbSBtZXRob2QgbmFtZXM6IFNGaXhlZDMyLCBVSW50MzIgZXRjLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBzdHJpbmcgQ2FwaXRhbGl6ZWRUeXBlTmFtZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gT3VyIGVudW0gbmFtZXMgbWF0Y2ggcGVyZmVjdGx5LiBIb3cgc2VyZW5kaXBpdG91cy4NCisgICAgICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0b3IuRmllbGRUeXBlLlRvU3RyaW5nKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4vR2VuZXJhdG9yLmNzIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9HZW5lcmF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0ODFlYwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vR2VuZXJhdG9yLmNzCkBAIC0wLDAgKzEsMjY3IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG87DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW4NCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIENvZGUgZ2VuZXJhdG9yIGZvciBwcm90b2NvbCBidWZmZXJzLiBPbmx5IEMjIGlzIHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50Lg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEdlbmVyYXRvcg0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEdlbmVyYXRvck9wdGlvbnMgb3B0aW9uczsNCisNCisgICAgICAgIHByaXZhdGUgR2VuZXJhdG9yKEdlbmVyYXRvck9wdGlvbnMgb3B0aW9ucykNCisgICAgICAgIHsNCisgICAgICAgICAgICBvcHRpb25zLlZhbGlkYXRlKCk7DQorICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIGEgZ2VuZXJhdG9yIGNvbmZpZ3VyZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG9wdGlvbnMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHZW5lcmF0b3IgQ3JlYXRlR2VuZXJhdG9yKEdlbmVyYXRvck9wdGlvbnMgb3B0aW9ucykNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IEdlbmVyYXRvcihvcHRpb25zKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEdlbmVyYXRlKENvZGVHZW5lcmF0b3JSZXF1ZXN0IHJlcXVlc3QsIENvZGVHZW5lcmF0b3JSZXNwb25zZS5CdWlsZGVyIHJlc3BvbnNlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIElMaXN0PEZpbGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9ycyA9IENvbnZlcnREZXNjcmlwdG9ycyhvcHRpb25zLkZpbGVPcHRpb25zLCByZXF1ZXN0LlByb3RvRmlsZUxpc3QpOw0KKw0KKyAgICAgICAgICAgIC8vIENvbWJpbmUgd2l0aCBvcHRpb25zIGZyb20gY29tbWFuZCBsaW5lDQorICAgICAgICAgICAgZm9yZWFjaCAoRmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvciBpbiBkZXNjcmlwdG9ycykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuQ29uZmlndXJlV2l0aERlZmF1bHRPcHRpb25zKG9wdGlvbnMuRmlsZU9wdGlvbnMpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBib29sIGR1cGxpY2F0ZXMgPSBmYWxzZTsNCisgICAgICAgICAgICBEaWN0aW9uYXJ5PHN0cmluZywgYm9vbD4gbmFtZXMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIGJvb2w+KFN0cmluZ0NvbXBhcmVyLk9yZGluYWxJZ25vcmVDYXNlKTsNCisgICAgICAgICAgICBmb3JlYWNoIChGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yIGluIGRlc2NyaXB0b3JzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3RyaW5nIGZpbGUgPSBHZXRPdXRwdXRGaWxlKGRlc2NyaXB0b3IsIGZhbHNlKTsNCisgICAgICAgICAgICAgICAgaWYgKG5hbWVzLkNvbnRhaW5zS2V5KGZpbGUpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVzID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG5hbWVzLkFkZChmaWxlLCB0cnVlKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy9ST0sgLSBDaGFuZ2VkIHRvIGRpY3Rpb25hcnkgZnJvbSBIYXNoU2V0IHRvIGFsbG93IDIuMCBjb21waWxlDQorICAgICAgICAgICAgdmFyIGZpbGVzVG9HZW5lcmF0ZSA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPihTdHJpbmdDb21wYXJlci5PcmRpbmFsSWdub3JlQ2FzZSk7DQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gcmVxdWVzdC5GaWxlVG9HZW5lcmF0ZUxpc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBmaWxlc1RvR2VuZXJhdGVbaXRlbV0gPSBudWxsOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3JlYWNoIChGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yIGluIGRlc2NyaXB0b3JzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gT3B0aW9uYWxseSBleGNsdWRlIGRlc2NyaXB0b3JzIGluIGdvb2dsZS5wcm90b2J1Zg0KKyAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5DU2hhcnBPcHRpb25zLklnbm9yZUdvb2dsZVByb3RvYnVmICYmIGRlc2NyaXB0b3IuUGFja2FnZSA9PSAiZ29vZ2xlLnByb3RvYnVmIikNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKGZpbGVzVG9HZW5lcmF0ZS5Db250YWluc0tleShkZXNjcmlwdG9yLk5hbWUpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZShkZXNjcmlwdG9yLCBkdXBsaWNhdGVzLCByZXNwb25zZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gR2VuZXJhdGVzIGNvZGUgZm9yIGEgcGFydGljdWxhciBmaWxlLiBBbGwgZGVwZW5kZW5jaWVzIG11c3QNCisgICAgICAgIC8vLyBhbHJlYWR5IGhhdmUgYmVlbiByZXNvbHZlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHZvaWQgR2VuZXJhdGUoRmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvciwgYm9vbCBkdXBsaWNhdGVzLCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UuQnVpbGRlciByZXNwb25zZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YXIgY29kZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQorICAgICAgICAgICAgdmFyIHVjZyA9IG5ldyBVbWJyZWxsYUNsYXNzR2VuZXJhdG9yKGRlc2NyaXB0b3IpOw0KKyAgICAgICAgICAgIHVzaW5nIChTdHJpbmdXcml0ZXIgdGV4dFdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoY29kZSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yIHdyaXRlciA9IG5ldyBUZXh0R2VuZXJhdG9yKHRleHRXcml0ZXIsIG9wdGlvbnMuTGluZUJyZWFrKTsNCisgICAgICAgICAgICAgICAgdWNnLkdlbmVyYXRlKHdyaXRlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3BvbnNlLkFkZEZpbGUobmV3IENvZGVHZW5lcmF0b3JSZXNwb25zZS5UeXBlcy5GaWxlLkJ1aWxkZXINCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIE5hbWUgPSBHZXRPdXRwdXRGaWxlKGRlc2NyaXB0b3IsIGR1cGxpY2F0ZXMpLA0KKyAgICAgICAgICAgICAgICBDb250ZW50ID0gY29kZS5Ub1N0cmluZygpLA0KKyAgICAgICAgICAgIH0uQnVpbGQoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0cmluZyBHZXRPdXRwdXRGaWxlKEZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGJvb2wgZHVwbGljYXRlcykNCisgICAgICAgIHsNCisgICAgICAgICAgICBDU2hhcnBGaWxlT3B0aW9ucyBmaWxlT3B0aW9ucyA9IGRlc2NyaXB0b3IuQ1NoYXJwT3B0aW9uczsNCisNCisgICAgICAgICAgICBzdHJpbmcgZmlsZW5hbWUgPSBkZXNjcmlwdG9yLkNTaGFycE9wdGlvbnMuVW1icmVsbGFDbGFzc25hbWUgKyBkZXNjcmlwdG9yLkNTaGFycE9wdGlvbnMuRmlsZUV4dGVuc2lvbjsNCisgICAgICAgICAgICBpZiAoZHVwbGljYXRlcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lcGFydDsNCisgICAgICAgICAgICAgICAgaWYgKFN0cmluZy5Jc051bGxPckVtcHR5KGRlc2NyaXB0b3IuTmFtZSkgfHwgU3RyaW5nLklzTnVsbE9yRW1wdHkobmFtZXBhcnQgPSBQYXRoLkdldEZpbGVOYW1lV2l0aG91dEV4dGVuc2lvbihkZXNjcmlwdG9yLk5hbWUpKSkNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbigiRHVwbGljYXRlIFVtYnJlbGxhQ2xhc3NuYW1lIG9wdGlvbnMgY3JlYXRlZCBhIGZpbGUgbmFtZSBjb2xsaXNpb24uIik7DQorDQorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbmFtZXBhcnQgKyBkZXNjcmlwdG9yLkNTaGFycE9wdGlvbnMuRmlsZUV4dGVuc2lvbjsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgc3RyaW5nIG91dHB1dERpcmVjdG9yeSA9IGRlc2NyaXB0b3IuQ1NoYXJwT3B0aW9ucy5PdXRwdXREaXJlY3Rvcnk7DQorICAgICAgICAgICAgaWYgKGZpbGVPcHRpb25zLkV4cGFuZE5hbWVzcGFjZURpcmVjdG9yaWVzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3RyaW5nIHBhY2thZ2UgPSBmaWxlT3B0aW9ucy5OYW1lc3BhY2U7DQorICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkocGFja2FnZSkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHN0cmluZ1tdIGJpdHMgPSBwYWNrYWdlLlNwbGl0KCcuJyk7DQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgYml0IGluIGJpdHMpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5ID0gUGF0aC5Db21iaW5lKG91dHB1dERpcmVjdG9yeSwgYml0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBBcyB0aGUgZGlyZWN0b3J5IGNhbiBiZSBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiBvcHRpb25zLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBleGlzdHMNCisgICAgICAgICAgICBEaXJlY3RvcnkuQ3JlYXRlRGlyZWN0b3J5KG91dHB1dERpcmVjdG9yeSk7DQorICAgICAgICAgICAgcmV0dXJuIFBhdGguQ29tYmluZShvdXRwdXREaXJlY3RvcnksIGZpbGVuYW1lKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXNvbHZlcyBhbnkgZGVwZW5kZW5jaWVzIGFuZCBjb252ZXJ0cyBGaWxlRGVzY3JpcHRvclByb3RvcyBpbnRvIEZpbGVEZXNjcmlwdG9ycy4NCisgICAgICAgIC8vLyBUaGUgbGlzdCByZXR1cm5lZCBpcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgcHJvdG9zIGFyZSBsaXN0ZWQgaW4gdGhlIGRlc2NyaXB0b3Igc2V0Lg0KKyAgICAgICAgLy8vIE5vdGU6IHRoaXMgbWV0aG9kIGlzIGludGVybmFsIHJhdGhlciB0aGFuIHByaXZhdGUgdG8gYWxsb3cgdGVzdGluZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbiI+Tm90IGFsbCBkZXBlbmRlbmNpZXMgY291bGQgYmUgcmVzb2x2ZWQuPC9leGNlcHRpb24+DQorICAgICAgICBwdWJsaWMgc3RhdGljIElMaXN0PEZpbGVEZXNjcmlwdG9yPiBDb252ZXJ0RGVzY3JpcHRvcnMoQ1NoYXJwRmlsZU9wdGlvbnMgb3B0aW9ucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTGlzdDxGaWxlRGVzY3JpcHRvclByb3RvPiBmaWxlTGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBGaWxlRGVzY3JpcHRvcltdIGNvbnZlcnRlZCA9IG5ldyBGaWxlRGVzY3JpcHRvcltmaWxlTGlzdC5Db3VudF07DQorDQorICAgICAgICAgICAgRGljdGlvbmFyeTxzdHJpbmcsIEZpbGVEZXNjcmlwdG9yPiBjb252ZXJ0ZWRNYXAgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIEZpbGVEZXNjcmlwdG9yPigpOw0KKw0KKyAgICAgICAgICAgIGludCB0b3RhbENvbnZlcnRlZCA9IDA7DQorDQorICAgICAgICAgICAgYm9vbCBtYWRlUHJvZ3Jlc3MgPSB0cnVlOw0KKyAgICAgICAgICAgIHdoaWxlIChtYWRlUHJvZ3Jlc3MgJiYgdG90YWxDb252ZXJ0ZWQgPCBjb252ZXJ0ZWQuTGVuZ3RoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbWFkZVByb2dyZXNzID0gZmFsc2U7DQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udmVydGVkLkxlbmd0aDsgaSsrKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY29udmVydGVkW2ldICE9IG51bGwpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBkb25lIHRoaXMgb25lDQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvIGNhbmRpZGF0ZSA9IGZpbGVMaXN0W2ldOw0KKyAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmNpZXMgPSBuZXcgRmlsZURlc2NyaXB0b3JbY2FuZGlkYXRlLkRlcGVuZGVuY3lMaXN0LkNvdW50XTsNCisNCisNCisgICAgICAgICAgICAgICAgICAgIENTaGFycEZpbGVPcHRpb25zLkJ1aWxkZXIgYnVpbGRlciA9IG9wdGlvbnMuVG9CdWlsZGVyKCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlLk9wdGlvbnMuSGFzRXh0ZW5zaW9uKENTaGFycE9wdGlvbnMuQ1NoYXJwRmlsZU9wdGlvbnMpKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuTWVyZ2VGcm9tKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUuT3B0aW9ucy5HZXRFeHRlbnNpb24oQ1NoYXJwT3B0aW9ucy5DU2hhcnBGaWxlT3B0aW9ucykpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgQ1NoYXJwRmlsZU9wdGlvbnMgbG9jYWxPcHRpb25zID0gYnVpbGRlci5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3VuZEFsbERlcGVuZGVuY2llcyA9IHRydWU7DQorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlcGVuZGVuY2llcy5MZW5ndGg7IGorKykNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnZlcnRlZE1hcC5UcnlHZXRWYWx1ZShjYW5kaWRhdGUuRGVwZW5kZW5jeUxpc3Rbal0sIG91dCBkZXBlbmRlbmNpZXNbal0pKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGF1dG8tbWFnaWNhbGx5IHJlc29sdmUgdGhlc2Ugc2luY2Ugd2UgYWxyZWFkeSBoYXZlIHRoZWlyIGRlc2NyaXB0aW9uDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2F5IGlmIHRoZSBmaWxlIGlzIG9ubHkgcmVmZXJlbmNpbmcgb3B0aW9ucyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIGJ1aWx0IHdpdGggdGhlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0taW5jbHVkZV9pbXBvcnRzIGRlZmluaXRpb24uDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE9wdGlvbnMuSWdub3JlR29vZ2xlUHJvdG9idWYgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYW5kaWRhdGUuRGVwZW5kZW5jeUxpc3Rbal0gPT0gImdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byIpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNbal0gPSBDU2hhcnBPcHRpb25zLkRlc2NyaXB0b3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxPcHRpb25zLklnbm9yZUdvb2dsZVByb3RvYnVmICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FuZGlkYXRlLkRlcGVuZGVuY3lMaXN0W2pdID09ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNbal0gPSBEZXNjcmlwdG9yUHJvdG9GaWxlLkRlc2NyaXB0b3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEFsbERlcGVuZGVuY2llcyA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kQWxsRGVwZW5kZW5jaWVzKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgbWFkZVByb2dyZXNzID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgIHRvdGFsQ29udmVydGVkKys7DQorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRbaV0gPSBGaWxlRGVzY3JpcHRvci5CdWlsZEZyb20oY2FuZGlkYXRlLCBkZXBlbmRlbmNpZXMpOw0KKyAgICAgICAgICAgICAgICAgICAgY29udmVydGVkTWFwW2NhbmRpZGF0ZS5OYW1lXSA9IGNvbnZlcnRlZFtpXTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoIW1hZGVQcm9ncmVzcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVtYWluaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb252ZXJ0ZWQuTGVuZ3RoOyBpKyspDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjb252ZXJ0ZWRbaV0gPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nLkxlbmd0aCAhPSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nLkFwcGVuZCgiLCAiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBmYWlsdXJlID0gZmlsZUxpc3RbaV07DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nLkFwcGVuZChmYWlsdXJlLk5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZy5BcHBlbmQoIjoiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgZGVwZW5kZW5jeSBpbiBmYWlsdXJlLkRlcGVuZGVuY3lMaXN0KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb252ZXJ0ZWRNYXAuQ29udGFpbnNLZXkoZGVwZW5kZW5jeSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZy5BcHBlbmQoIiAiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZy5BcHBlbmQoZGVwZW5kZW5jeSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nLkFwcGVuZCgiOyIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlc29sdmUgYWxsIGRlcGVuZGVuY2llczogIiArIHJlbWFpbmluZyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBMaXN0cy5Bc1JlYWRPbmx5KGNvbnZlcnRlZCk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b0dlbi9HZW5lcmF0b3JPcHRpb25zLmNzIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9HZW5lcmF0b3JPcHRpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNTAwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL0dlbmVyYXRvck9wdGlvbnMuY3MKQEAgLTAsMCArMSwzMzAgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgU3lzdGVtLklPOw0KK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3M7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbg0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gQWxsIHRoZSBjb25maWd1cmF0aW9uIHJlcXVpcmVkIGZvciB0aGUgZ2VuZXJhdG9yIC0gd2hlcmUgdG8gZ2VuZXJhdGUNCisgICAgLy8vIG91dHB1dCBmaWxlcywgdGhlIGxvY2F0aW9uIG9mIGlucHV0IGZpbGVzIGV0Yy4gV2hpbGUgdGhpcyBpc24ndCBpbW11dGFibGUNCisgICAgLy8vIGluIHByYWN0aWNlLCB0aGUgY29udGVudHMgc2hvdWxkbid0IGJlIGNoYW5nZWQgYWZ0ZXIgYmVpbmcgcGFzc2VkIHRvDQorICAgIC8vLyB0aGUgZ2VuZXJhdG9yLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEdlbmVyYXRvck9wdGlvbnMNCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gTGluZUJyZWFrcyA9DQorICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KFN0cmluZ0NvbXBhcmVyLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB7IldpbmRvd3MiLCAiXHJcbiJ9LA0KKyAgICAgICAgICAgICAgICAgICAgeyJVbml4IiwgIlxuIn0sDQorICAgICAgICAgICAgICAgICAgICB7IkRlZmF1bHQiLCBFbnZpcm9ubWVudC5OZXdMaW5lfQ0KKyAgICAgICAgICAgICAgICB9Ow0KKw0KKyAgICAgICAgcHVibGljIElMaXN0PHN0cmluZz4gSW5wdXRGaWxlcyB7IGdldDsgc2V0OyB9DQorDQorICAgICAgICBwdWJsaWMgR2VuZXJhdG9yT3B0aW9ucygpDQorICAgICAgICB7DQorICAgICAgICAgICAgTGluZUJyZWFrID0gRW52aXJvbm1lbnQuTmV3TGluZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBdHRlbXB0cyB0byB2YWxpZGF0ZSB0aGUgb3B0aW9ucywgYnV0IGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZXkncmUgaW52YWxpZC4NCisgICAgICAgIC8vLyBJbnN0ZWFkLCB3aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoZSBvdXRwdXQgdmFyaWFibGUgd2lsbCBjb250YWluIGEgY29sbGVjdGlvbg0KKyAgICAgICAgLy8vIG9mIHJlYXNvbnMgZm9yIHRoZSB2YWxpZGF0aW9uIGZhaWx1cmUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyZWFzb25zIj5WYXJpYWJsZSB0byByZWNlaXZlIGEgbGlzdCBvZiByZWFzb25zIGluIGNhc2Ugb2YgdmFsaWRhdGlvbiBmYWlsdXJlLjwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB0aGUgb3B0aW9ucyBhcmUgdmFsaWQ7IGZhbHNlIG90aGVyd2lzZTwvcmV0dXJucz4NCisgICAgICAgIHB1YmxpYyBib29sIFRyeVZhbGlkYXRlKG91dCBJTGlzdDxzdHJpbmc+IHJlYXNvbnMpDQorICAgICAgICB7DQorICAgICAgICAgICAgTGlzdDxzdHJpbmc+IHRtcFJlYXNvbnMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7DQorDQorICAgICAgICAgICAgUGFyc2VBcmd1bWVudHModG1wUmVhc29ucyk7DQorDQorICAgICAgICAgICAgLy8gT3V0cHV0IGRpcmVjdG9yeSB2YWxpZGF0aW9uDQorICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KEZpbGVPcHRpb25zLk91dHB1dERpcmVjdG9yeSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0bXBSZWFzb25zLkFkZCgiTm8gb3V0cHV0IGRpcmVjdG9yeSBzcGVjaWZpZWQiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKCFEaXJlY3RvcnkuRXhpc3RzKEZpbGVPcHRpb25zLk91dHB1dERpcmVjdG9yeSkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRtcFJlYXNvbnMuQWRkKCJTcGVjaWZpZWQgb3V0cHV0IGRpcmVjdG9yeSAoIiArIEZpbGVPcHRpb25zLk91dHB1dERpcmVjdG9yeSArICIgZG9lc24ndCBleGlzdC4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBJbnB1dCBmaWxlIHZhbGlkYXRpb24gKGp1c3QgaW4gdGVybXMgb2YgcHJlc2VuY2UpDQorICAgICAgICAgICAgaWYgKElucHV0RmlsZXMgPT0gbnVsbCB8fCBJbnB1dEZpbGVzLkNvdW50ID09IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0bXBSZWFzb25zLkFkZCgiTm8gaW5wdXQgZmlsZXMgc3BlY2lmaWVkIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBpbnB1dCBpbiBJbnB1dEZpbGVzKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBGaWxlSW5mbyBmaSA9IG5ldyBGaWxlSW5mbyhpbnB1dCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIWZpLkV4aXN0cykNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB0bXBSZWFzb25zLkFkZCgiSW5wdXQgZmlsZSAiICsgaW5wdXQgKyAiIGRvZXNuJ3QgZXhpc3QuIik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHRtcFJlYXNvbnMuQ291bnQgIT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJlYXNvbnMgPSB0bXBSZWFzb25zOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHJlYXNvbnMgPSBudWxsOw0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFZhbGlkYXRlcyB0aGF0IGFsbCB0aGUgb3B0aW9ucyBoYXZlIGJlZW4gc2V0IGFuZCBhcmUgdmFsaWQsDQorICAgICAgICAvLy8gdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZXkgaGF2ZW4ndC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkT3B0aW9uc0V4Y2VwdGlvbiI+VGhlIG9wdGlvbnMgYXJlIGludmFsaWQuPC9leGNlcHRpb24+DQorICAgICAgICBwdWJsaWMgdm9pZCBWYWxpZGF0ZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgSUxpc3Q8c3RyaW5nPiByZWFzb25zOw0KKyAgICAgICAgICAgIGlmICghVHJ5VmFsaWRhdGUob3V0IHJlYXNvbnMpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcHRpb25zRXhjZXB0aW9uKHJlYXNvbnMpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIFJhdyBhcmd1bWVudHMsIHVzZWQgdG8gcHJvdmlkZSBkZWZhdWx0cyBmb3IgcHJvdG8gZmlsZSBvcHRpb25zDQorICAgICAgICBwdWJsaWMgSUxpc3Q8c3RyaW5nPiBBcmd1bWVudHMgeyBnZXQ7IHNldDsgfQ0KKw0KKyAgICAgICAgW09ic29sZXRlKCJQbGVhc2UgdXNlIEdlbmVyYXRvck9wdGlvbnMuRmlsZU9wdGlvbnMuT3V0cHV0RGlyZWN0b3J5IGluc3RlYWQiKV0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgT3V0cHV0RGlyZWN0b3J5DQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIEZpbGVPcHRpb25zLk91dHB1dERpcmVjdG9yeTsgfQ0KKyAgICAgICAgICAgIHNldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ1NoYXJwRmlsZU9wdGlvbnMuQnVpbGRlciBibGQgPSBGaWxlT3B0aW9ucy5Ub0J1aWxkZXIoKTsNCisgICAgICAgICAgICAgICAgYmxkLk91dHB1dERpcmVjdG9yeSA9IHZhbHVlOw0KKyAgICAgICAgICAgICAgICBGaWxlT3B0aW9ucyA9IGJsZC5CdWlsZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJlZ2V4IEFyZ01hdGNoID0gbmV3IFJlZ2V4KEAiXlstL10oPzxuYW1lPltcd19dKz8pWzo9XSg/PHZhbHVlPi4qKSQiKTsNCisgICAgICAgIHByaXZhdGUgQ1NoYXJwRmlsZU9wdGlvbnMgZmlsZU9wdGlvbnM7DQorDQorICAgICAgICBwdWJsaWMgQ1NoYXJwRmlsZU9wdGlvbnMgRmlsZU9wdGlvbnMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmlsZU9wdGlvbnMgPz8gKGZpbGVPcHRpb25zID0gQ1NoYXJwRmlsZU9wdGlvbnMuRGVmYXVsdEluc3RhbmNlKTsgfQ0KKyAgICAgICAgICAgIHNldCB7IGZpbGVPcHRpb25zID0gdmFsdWU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTGluZUJyZWFrIHsgZ2V0OyBzZXQ7IH0NCisNCisgICAgICAgIHByaXZhdGUgdm9pZCBQYXJzZUFyZ3VtZW50cyhJTGlzdDxzdHJpbmc+IHRtcFJlYXNvbnMpDQorICAgICAgICB7DQorICAgICAgICAgICAgYm9vbCBkb0hlbHAgPSBBcmd1bWVudHMuQ291bnQgPT0gMDsNCisNCisgICAgICAgICAgICBJbnB1dEZpbGVzID0gbmV3IExpc3Q8c3RyaW5nPigpOw0KKyAgICAgICAgICAgIENTaGFycEZpbGVPcHRpb25zLkJ1aWxkZXIgYnVpbGRlciA9IEZpbGVPcHRpb25zLlRvQnVpbGRlcigpOw0KKyAgICAgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9DQorICAgICAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgRmllbGREZXNjcmlwdG9yPihTdHJpbmdDb21wYXJlci5PcmRpbmFsSWdub3JlQ2FzZSk7DQorICAgICAgICAgICAgZm9yZWFjaCAoRmllbGREZXNjcmlwdG9yIGZsZCBpbiBidWlsZGVyLkRlc2NyaXB0b3JGb3JUeXBlLkZpZWxkcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGZpZWxkcy5BZGQoZmxkLk5hbWUsIGZsZCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBhcmd1bWVudCBpbiBBcmd1bWVudHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoU3RyaW5nQ29tcGFyZXIuT3JkaW5hbElnbm9yZUNhc2UuRXF1YWxzKCItaGVscCIsIGFyZ3VtZW50KSB8fA0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29tcGFyZXIuT3JkaW5hbElnbm9yZUNhc2UuRXF1YWxzKCIvaGVscCIsIGFyZ3VtZW50KSB8fA0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29tcGFyZXIuT3JkaW5hbElnbm9yZUNhc2UuRXF1YWxzKCItPyIsIGFyZ3VtZW50KSB8fA0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29tcGFyZXIuT3JkaW5hbElnbm9yZUNhc2UuRXF1YWxzKCIvPyIsIGFyZ3VtZW50KSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZG9IZWxwID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIE1hdGNoIG0gPSBBcmdNYXRjaC5NYXRjaChhcmd1bWVudCk7DQorICAgICAgICAgICAgICAgIGlmIChtLlN1Y2Nlc3MpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBmbGQ7DQorICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSA9IG0uR3JvdXBzWyJuYW1lIl0uVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdmFsdWUgPSBtLkdyb3Vwc1sidmFsdWUiXS5WYWx1ZTsNCisNCisgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZHMuVHJ5R2V0VmFsdWUobmFtZSwgb3V0IGZsZCkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IG9iajsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVHJ5Q29lcmNlVHlwZSh2YWx1ZSwgZmxkLCBvdXQgb2JqLCB0bXBSZWFzb25zKSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXJbZmxkXSA9IG9iajsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lID09ICJsaW5lX2JyZWFrIikNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdG1wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMaW5lQnJlYWtzLlRyeUdldFZhbHVlKHZhbHVlLCBvdXQgdG1wKSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVCcmVhayA9IHRtcDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wUmVhc29ucy5BZGQoIkludmFsaWQgdmFsdWUgZm9yICdsaW5lX2JyZWFrJzogIiArIHZhbHVlICsgIi4iKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghRmlsZS5FeGlzdHMoYXJndW1lbnQpKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRvSGVscCA9IHRydWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgdG1wUmVhc29ucy5BZGQoIlVua25vd24gYXJndW1lbnQgJyIgKyBuYW1lICsgIicuIik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRGaWxlcy5BZGQoYXJndW1lbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgSW5wdXRGaWxlcy5BZGQoYXJndW1lbnQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmIChkb0hlbHAgfHwgSW5wdXRGaWxlcy5Db3VudCA9PSAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdG1wUmVhc29ucy5BZGQoIkFyZ3VtZW50czoiKTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPHN0cmluZywgRmllbGREZXNjcmlwdG9yPiBmaWVsZCBpbiBmaWVsZHMpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRtcFJlYXNvbnMuQWRkKFN0cmluZy5Gb3JtYXQoIi17MH09W3sxfV0iLCBmaWVsZC5LZXksIGZpZWxkLlZhbHVlLkZpZWxkVHlwZSkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHRtcFJlYXNvbnMuQWRkKCItbGluZV9icmVhaz1bIiArIHN0cmluZy5Kb2luKCJ8IiwgbmV3IExpc3Q8c3RyaW5nPihMaW5lQnJlYWtzLktleXMpLlRvQXJyYXkoKSkgKyAiXSIpOw0KKyAgICAgICAgICAgICAgICB0bXBSZWFzb25zLkFkZCgiZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZmlsZSBwYXRocy4iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRmlsZU9wdGlvbnMgPSBidWlsZGVyLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBUcnlDb2VyY2VUeXBlKHN0cmluZyB0ZXh0LCBGaWVsZERlc2NyaXB0b3IgZmllbGQsIG91dCBvYmplY3QgdmFsdWUsIElMaXN0PHN0cmluZz4gdG1wUmVhc29ucykNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YWx1ZSA9IG51bGw7DQorDQorICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5GaWVsZFR5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQzMjoNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ludDMyOg0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TRml4ZWQzMjoNCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gSW50MzIuUGFyc2UodGV4dCk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuSW50NjQ6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQ2NDoNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkNjQ6DQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEludDY0LlBhcnNlKHRleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQzMjoNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRml4ZWQzMjoNCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gVUludDMyLlBhcnNlKHRleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQ2NDoNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRml4ZWQ2NDoNCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gVUludDY0LlBhcnNlKHRleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZsb2F0Og0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmbG9hdC5QYXJzZSh0ZXh0KTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Eb3VibGU6DQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IERvdWJsZS5QYXJzZSh0ZXh0KTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Cb29sOg0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBCb29sZWFuLlBhcnNlKHRleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlN0cmluZzoNCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGV4dDsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5FbnVtOg0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yIGVudW1UeXBlID0gZmllbGQuRW51bVR5cGU7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcjsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKHRleHQsIG91dCBudW1iZXIpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlbnVtVHlwZS5GaW5kVmFsdWVCeU51bWJlcihudW1iZXIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wUmVhc29ucy5BZGQoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVudW0gdHlwZSBcIiIgKyBlbnVtVHlwZS5GdWxsTmFtZSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGhhcyBubyB2YWx1ZSB3aXRoIG51bWJlciAiICsgbnVtYmVyICsgIi4iKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudW1UeXBlLkZpbmRWYWx1ZUJ5TmFtZSh0ZXh0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcFJlYXNvbnMuQWRkKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnVtIHR5cGUgXCIiICsgZW51bVR5cGUuRnVsbE5hbWUgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBoYXMgbm8gdmFsdWUgbmFtZWQgXCIiICsgdGV4dCArICJcIi4iKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuQnl0ZXM6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLk1lc3NhZ2U6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkdyb3VwOg0KKyAgICAgICAgICAgICAgICAgICAgdG1wUmVhc29ucy5BZGQoIlVuaGFuZGxlZCBmaWVsZCB0eXBlICIgKyBmaWVsZC5GaWVsZFR5cGUuVG9TdHJpbmcoKSArICIuIik7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4vSGVscGVycy5jcyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vSGVscGVycy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzAwMTE1Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9IZWxwZXJzLmNzCkBAIC0wLDAgKzEsNDUgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbg0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gSGVscGVycyB0byByZXNvbHZlIGNsYXNzIG5hbWVzIGV0Yy4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIEhlbHBlcnMNCisgICAgew0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4vSUZpZWxkU291cmNlR2VuZXJhdG9yLmNzIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9JRmllbGRTb3VyY2VHZW5lcmF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUzYWU1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vSUZpZWxkU291cmNlR2VuZXJhdG9yLmNzCkBAIC0wLDAgKzEsNTMgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbg0KK3sNCisgICAgaW50ZXJuYWwgaW50ZXJmYWNlIElGaWVsZFNvdXJjZUdlbmVyYXRvcg0KKyAgICB7DQorICAgICAgICB2b2lkIEdlbmVyYXRlTWVtYmVycyhUZXh0R2VuZXJhdG9yIHdyaXRlcik7DQorICAgICAgICB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoVGV4dEdlbmVyYXRvciB3cml0ZXIpOw0KKyAgICAgICAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKFRleHRHZW5lcmF0b3Igd3JpdGVyKTsNCisgICAgICAgIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpOw0KKyAgICAgICAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKFRleHRHZW5lcmF0b3Igd3JpdGVyKTsNCisgICAgICAgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShUZXh0R2VuZXJhdG9yIHdyaXRlcik7DQorICAgICAgICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKFRleHRHZW5lcmF0b3Igd3JpdGVyKTsNCisNCisgICAgICAgIHZvaWQgV3JpdGVIYXNoKFRleHRHZW5lcmF0b3Igd3JpdGVyKTsNCisgICAgICAgIHZvaWQgV3JpdGVFcXVhbHMoVGV4dEdlbmVyYXRvciB3cml0ZXIpOw0KKyAgICAgICAgdm9pZCBXcml0ZVRvU3RyaW5nKFRleHRHZW5lcmF0b3Igd3JpdGVyKTsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvR2VuL0lTb3VyY2VHZW5lcmF0b3IuY3MgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL0lTb3VyY2VHZW5lcmF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyZDg1NAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vSVNvdXJjZUdlbmVyYXRvci5jcwpAQCAtMCwwICsxLDQzIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW4NCit7DQorICAgIGludGVybmFsIGludGVyZmFjZSBJU291cmNlR2VuZXJhdG9yDQorICAgIHsNCisgICAgICAgIHZvaWQgR2VuZXJhdGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpOw0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4vSW52YWxpZE9wdGlvbnNFeGNlcHRpb24uY3MgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL0ludmFsaWRPcHRpb25zRXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNjk4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL0ludmFsaWRPcHRpb25zRXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsNzcgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgU3lzdGVtLlRleHQ7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbg0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gRXhjZXB0aW9uIHRocm93biB0byBpbmRpY2F0ZSB0aGF0IHRoZSBvcHRpb25zIHBhc3NlZCB3ZXJlIGludmFsaWQuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgSW52YWxpZE9wdGlvbnNFeGNlcHRpb24gOiBFeGNlcHRpb24NCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJTGlzdDxzdHJpbmc+IHJlYXNvbnM7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQW4gaW1tdXRhYmxlIGxpc3Qgb2YgcmVhc29ucyB3aHkgdGhlIG9wdGlvbnMgd2VyZSBpbnZhbGlkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBJTGlzdDxzdHJpbmc+IFJlYXNvbnMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVhc29uczsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIEludmFsaWRPcHRpb25zRXhjZXB0aW9uKElMaXN0PHN0cmluZz4gcmVhc29ucykNCisgICAgICAgICAgICA6IGJhc2UoQnVpbGRNZXNzYWdlKHJlYXNvbnMpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRoaXMucmVhc29ucyA9IExpc3RzLkFzUmVhZE9ubHkocmVhc29ucyk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgQnVpbGRNZXNzYWdlKElFbnVtZXJhYmxlPHN0cmluZz4gcmVhc29ucykNCisgICAgICAgIHsNCisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiSW52YWxpZCBvcHRpb25zOiIpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kTGluZSgpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyByZWFzb24gaW4gcmVhc29ucykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKCIgICIpOw0KKyAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZExpbmUocmVhc29uKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuVG9TdHJpbmcoKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvR2VuL01lc3NhZ2VGaWVsZEdlbmVyYXRvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vTWVzc2FnZUZpZWxkR2VuZXJhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YjU4YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL01lc3NhZ2VGaWVsZEdlbmVyYXRvci5jcwpAQCAtMCwwICsxLDE3NCBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW4NCit7DQorICAgIGludGVybmFsIGNsYXNzIE1lc3NhZ2VGaWVsZEdlbmVyYXRvciA6IEZpZWxkR2VuZXJhdG9yQmFzZSwgSUZpZWxkU291cmNlR2VuZXJhdG9yDQorICAgIHsNCisgICAgICAgIGludGVybmFsIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciwgaW50IGZpZWxkT3JkaW5hbCkNCisgICAgICAgICAgICA6IGJhc2UoZGVzY3JpcHRvciwgZmllbGRPcmRpbmFsKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVNZW1iZXJzKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInByaXZhdGUgYm9vbCBoYXN7MH07IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwcml2YXRlIHswfSB7MX1fOyIsIFR5cGVOYW1lLCBOYW1lKTsNCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBib29sIEhhc3swfSB7eyIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBnZXQge3sgcmV0dXJuIGhhc3swfTsgfX0iLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyB7MH0gezF9IHt7IiwgVHlwZU5hbWUsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBnZXQge3sgcmV0dXJuIHswfV8gPz8gezF9OyB9fSIsIE5hbWUsIERlZmF1bHRWYWx1ZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBib29sIEhhc3swfSB7eyIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiIGdldCB7eyByZXR1cm4gcmVzdWx0Lmhhc3swfTsgfX0iLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyB7MH0gezF9IHt7IiwgVHlwZU5hbWUsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBnZXQge3sgcmV0dXJuIHJlc3VsdC57MH07IH19IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHNldCB7eyBTZXR7MH0odmFsdWUpOyB9fSIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIEFkZERlcHJlY2F0ZWRGbGFnKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIEJ1aWxkZXIgU2V0ezB9KHsxfSB2YWx1ZSkge3siLCBQcm9wZXJ0eU5hbWUsIFR5cGVOYW1lKTsNCisgICAgICAgICAgICBBZGROdWxsQ2hlY2sod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIFByZXBhcmVCdWlsZGVyKCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXN1bHQuaGFzezB9ID0gdHJ1ZTsiLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmVzdWx0LnswfV8gPSB2YWx1ZTsiLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybiB0aGlzOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBCdWlsZGVyIFNldHswfSh7MX0uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHt7IiwgUHJvcGVydHlOYW1lLCBUeXBlTmFtZSk7DQorICAgICAgICAgICAgQWRkTnVsbENoZWNrKHdyaXRlciwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgUHJlcGFyZUJ1aWxkZXIoKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdC5oYXN7MH0gPSB0cnVlOyIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXN1bHQuezB9XyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOyIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuIHRoaXM7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIEFkZERlcHJlY2F0ZWRGbGFnKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIEJ1aWxkZXIgTWVyZ2V7MH0oezF9IHZhbHVlKSB7eyIsIFByb3BlcnR5TmFtZSwgVHlwZU5hbWUpOw0KKyAgICAgICAgICAgIEFkZE51bGxDaGVjayh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgUHJlcGFyZUJ1aWxkZXIoKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGlmIChyZXN1bHQuaGFzezB9ICYmIiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgICByZXN1bHQuezB9XyAhPSB7MX0pIHt7IiwgTmFtZSwgRGVmYXVsdFZhbHVlKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgICByZXN1bHQuezB9XyA9IHsxfS5DcmVhdGVCdWlsZGVyKHJlc3VsdC57MH1fKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOyIsIE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICB9IGVsc2UgeyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICByZXN1bHQuezB9XyA9IHZhbHVlOyIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgfSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmVzdWx0Lmhhc3swfSA9IHRydWU7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybiB0aGlzOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBCdWlsZGVyIENsZWFyezB9KCkge3siLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgUHJlcGFyZUJ1aWxkZXIoKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdC5oYXN7MH0gPSBmYWxzZTsiLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmVzdWx0LnswfV8gPSBudWxsOyIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuIHRoaXM7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpZiAob3RoZXIuSGFzezB9KSB7eyIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBNZXJnZXswfShvdGhlci57MH0pOyIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbyBmb3Igc2luZ3VsYXIgZmllbGRzDQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInswfS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSB7MH0uQ3JlYXRlQnVpbGRlcigpOyIsIFR5cGVOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpZiAocmVzdWx0Lmhhc3swfSkge3siLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgc3ViQnVpbGRlci5NZXJnZUZyb20oezB9KTsiLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICBpZiAoRGVzY3JpcHRvci5GaWVsZFR5cGUgPT0gRmllbGRUeXBlLkdyb3VwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaW5wdXQuUmVhZEdyb3VwKHswfSwgc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOyIsIE51bWJlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9ID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsiLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpZiAoaGFzezB9KSB7eyIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBvdXRwdXQuV3JpdGV7MH0oezF9LCBmaWVsZF9uYW1lc1t7M31dLCB7Mn0pOyIsIE1lc3NhZ2VPckdyb3VwLCBOdW1iZXIsIFByb3BlcnR5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkT3JkaW5hbCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYgKGhhc3swfSkge3siLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZXswfVNpemUoezF9LCB7Mn0pOyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlT3JHcm91cCwgTnVtYmVyLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSGFzaChUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpZiAoaGFzezB9KSBoYXNoIF49IHsxfV8uR2V0SGFzaENvZGUoKTsiLCBQcm9wZXJ0eU5hbWUsIE5hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVFcXVhbHMoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYgKGhhc3swfSAhPSBvdGhlci5oYXN7MH0gfHwgKGhhc3swfSAmJiAhezF9Xy5FcXVhbHMob3RoZXIuezF9XykpKSByZXR1cm4gZmFsc2U7IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5TmFtZSwgTmFtZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvU3RyaW5nKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIlByaW50RmllbGQoXCJ7Mn1cIiwgaGFzezB9LCB7MX1fLCB3cml0ZXIpOyIsIFByb3BlcnR5TmFtZSwgTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IuRmllbGRUeXBlID09IEZpZWxkVHlwZS5Hcm91cCA/IERlc2NyaXB0b3IuTWVzc2FnZVR5cGUuTmFtZSA6IERlc2NyaXB0b3IuTmFtZSk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b0dlbi9NZXNzYWdlR2VuZXJhdG9yLmNzIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9NZXNzYWdlR2VuZXJhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZWQxZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL01lc3NhZ2VHZW5lcmF0b3IuY3MKQEAgLTAsMCArMSw4OTMgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW4NCit7DQorICAgIGludGVybmFsIGNsYXNzIE1lc3NhZ2VHZW5lcmF0b3IgOiBTb3VyY2VHZW5lcmF0b3JCYXNlPE1lc3NhZ2VEZXNjcmlwdG9yPiwgSVNvdXJjZUdlbmVyYXRvcg0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHN0cmluZ1tdIF9maWVsZE5hbWVzOw0KKw0KKyAgICAgICAgaW50ZXJuYWwgTWVzc2FnZUdlbmVyYXRvcihNZXNzYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSA6IGJhc2UoZGVzY3JpcHRvcikNCisgICAgICAgIHsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIENsYXNzTmFtZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yLk5hbWU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIEZ1bGxDbGFzc05hbWUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gR2V0Q2xhc3NOYW1lKERlc2NyaXB0b3IpOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gR2V0IGFuIGlkZW50aWZpZXIgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgdHlwZSB3aXRoaW4gdGhlIGZpbGUuDQorICAgICAgICAvLy8gVGhpcyBpcyB1c2VkIHRvIGRlY2xhcmUgc3RhdGljIHZhcmlhYmxlcyByZWxhdGVkIHRvIHRoaXMgdHlwZSBhdCB0aGUNCisgICAgICAgIC8vLyBvdXRlcm1vc3QgZmlsZSBzY29wZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0VW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihJRGVzY3JpcHRvciBkZXNjcmlwdG9yKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiAic3RhdGljXyIgKyBkZXNjcmlwdG9yLkZ1bGxOYW1lLlJlcGxhY2UoIi4iLCAiXyIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlcyhUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBCZWNhdXNlIGRlc2NyaXB0b3IucHJvdG8gKEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3RvcykgaXMNCisgICAgICAgICAgICAvLyB1c2VkIGluIHRoZSBjb25zdHJ1Y3Rpb24gb2YgZGVzY3JpcHRvcnMsIHdlIGhhdmUgYSB0cmlja3kgYm9vdHN0cmFwcGluZw0KKyAgICAgICAgICAgIC8vIHByb2JsZW0uICBUbyBoZWxwIGNvbnRyb2wgc3RhdGljIGluaXRpYWxpemF0aW9uIG9yZGVyLCB3ZSBtYWtlIHN1cmUgYWxsDQorICAgICAgICAgICAgLy8gZGVzY3JpcHRvcnMgYW5kIG90aGVyIHN0YXRpYyBkYXRhIHRoYXQgZGVwZW5kcyBvbiB0aGVtIGFyZSBtZW1iZXJzIG9mDQorICAgICAgICAgICAgLy8gdGhlIHByb3RvLWRlc2NyaXB0b3IgY2xhc3MuICBUaGlzIHdheSwgdGhleSB3aWxsIGJlIGluaXRpYWxpemVkIGluDQorICAgICAgICAgICAgLy8gYSBkZXRlcm1pbmlzdGljIG9yZGVyLg0KKw0KKyAgICAgICAgICAgIHN0cmluZyBpZGVudGlmaWVyID0gR2V0VW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihEZXNjcmlwdG9yKTsNCisNCisgICAgICAgICAgICBpZiAoIVVzZUxpdGVSdW50aW1lKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gVGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgdHlwZS4NCisgICAgICAgICAgICAgICAgc3RyaW5nIGFjY2VzcyA9IERlc2NyaXB0b3IuRmlsZS5DU2hhcnBPcHRpb25zLk5lc3RDbGFzc2VzID8gInByaXZhdGUiIDogImludGVybmFsIjsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9IHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX197MX1fX0Rlc2NyaXB0b3I7IiwgYWNjZXNzLCBpZGVudGlmaWVyKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgNCisgICAgICAgICAgICAgICAgICAgICJ7MH0gc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8ezF9LCB7MX0uQnVpbGRlcj4gaW50ZXJuYWxfX3syfV9fRmllbGRBY2Nlc3NvclRhYmxlOyIsDQorICAgICAgICAgICAgICAgICAgICBhY2Nlc3MsIEZ1bGxDbGFzc05hbWUsIGlkZW50aWZpZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICAvLyBHZW5lcmF0ZSBzdGF0aWMgbWVtYmVycyBmb3IgYWxsIG5lc3RlZCB0eXBlcy4NCisgICAgICAgICAgICBmb3JlYWNoIChNZXNzYWdlRGVzY3JpcHRvciBuZXN0ZWRNZXNzYWdlIGluIERlc2NyaXB0b3IuTmVzdGVkVHlwZXMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZUdlbmVyYXRvcihuZXN0ZWRNZXNzYWdlKS5HZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlcyh3cml0ZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHZvaWQgR2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycyhUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgaWRlbnRpZmllciA9IEdldFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoRGVzY3JpcHRvcik7DQorDQorICAgICAgICAgICAgaWYgKCFVc2VMaXRlUnVudGltZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgiaW50ZXJuYWxfX3swfV9fRGVzY3JpcHRvciA9ICIsIGlkZW50aWZpZXIpOw0KKyAgICAgICAgICAgICAgICBpZiAoRGVzY3JpcHRvci5Db250YWluaW5nVHlwZSA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1t7MH1dOyIsIERlc2NyaXB0b3IuSW5kZXgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaW50ZXJuYWxfX3swfV9fRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1t7MX1dOyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoRGVzY3JpcHRvci5Db250YWluaW5nVHlwZSksIERlc2NyaXB0b3IuSW5kZXgpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImludGVybmFsX197MH1fX0ZpZWxkQWNjZXNzb3JUYWJsZSA9ICIsIGlkZW50aWZpZXIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKA0KKyAgICAgICAgICAgICAgICAgICAgIiAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTx7MX0sIHsxfS5CdWlsZGVyPihpbnRlcm5hbF9fezB9X19EZXNjcmlwdG9yLCIsDQorICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyLCBGdWxsQ2xhc3NOYW1lKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLlByaW50KCIgICAgICAgIG5ldyBzdHJpbmdbXSB7ICIpOw0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChGaWVsZERlc2NyaXB0b3IgZmllbGQgaW4gRGVzY3JpcHRvci5GaWVsZHMpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgiXCJ7MH1cIiwgIiwgZmllbGQuQ1NoYXJwT3B0aW9ucy5Qcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0pOyIpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBHZW5lcmF0ZSBzdGF0aWMgbWVtYmVyIGluaXRpYWxpemVycyBmb3IgYWxsIG5lc3RlZCB0eXBlcy4NCisgICAgICAgICAgICBmb3JlYWNoIChNZXNzYWdlRGVzY3JpcHRvciBuZXN0ZWRNZXNzYWdlIGluIERlc2NyaXB0b3IuTmVzdGVkVHlwZXMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZUdlbmVyYXRvcihuZXN0ZWRNZXNzYWdlKS5HZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKHdyaXRlcik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBleHRlbnNpb24gaW4gRGVzY3JpcHRvci5FeHRlbnNpb25zKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbmV3IEV4dGVuc2lvbkdlbmVyYXRvcihleHRlbnNpb24pLkdlbmVyYXRlU3RhdGljVmFyaWFibGVJbml0aWFsaXplcnMod3JpdGVyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RyaW5nW10gRmllbGROYW1lcw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKF9maWVsZE5hbWVzID09IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIExpc3Q8c3RyaW5nPiBuYW1lcyA9IG5ldyBMaXN0PHN0cmluZz4oKTsNCisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBmaWVsZERlc2NyaXB0b3IgaW4gRGVzY3JpcHRvci5GaWVsZHMpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuQWRkKGZpZWxkRGVzY3JpcHRvci5OYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIC8vaWYgeW91IGNoYW5nZSB0aGlzLCB0aGUgc2VhcmNoIG11c3QgYWxzbyBjaGFuZ2UgaW4gR2VuZXJhdGVCdWlsZGVyUGFyc2luZ01ldGhvZHMNCisgICAgICAgICAgICAgICAgICAgIG5hbWVzLlNvcnQoU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgICAgICAgICBfZmllbGROYW1lcyA9IG5hbWVzLlRvQXJyYXkoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2ZpZWxkTmFtZXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgaW50IEZpZWxkT3JkaW5hbChGaWVsZERlc2NyaXB0b3IgZmllbGQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEFycmF5LkJpbmFyeVNlYXJjaChGaWVsZE5hbWVzLCBmaWVsZC5OYW1lLCBTdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgSUZpZWxkU291cmNlR2VuZXJhdG9yIENyZWF0ZUZpZWxkR2VuZXJhdG9yKEZpZWxkRGVzY3JpcHRvciBmaWVsZERlc2NyaXB0b3IpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIFNvdXJjZUdlbmVyYXRvcnMuQ3JlYXRlRmllbGRHZW5lcmF0b3IoZmllbGREZXNjcmlwdG9yLCBGaWVsZE9yZGluYWwoZmllbGREZXNjcmlwdG9yKSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyB2b2lkIEdlbmVyYXRlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChEZXNjcmlwdG9yLkZpbGUuQ1NoYXJwT3B0aW9ucy5BZGRTZXJpYWxpemFibGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJbZ2xvYmFsOjpTeXN0ZW0uU2VyaWFsaXphYmxlQXR0cmlidXRlKCldIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIltnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldIik7DQorICAgICAgICAgICAgV3JpdGVHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInswfSBzZWFsZWQgcGFydGlhbCBjbGFzcyB7MX0gOiBwYjo6ezJ9TWVzc2FnZXszfTx7MX0sIHsxfS5CdWlsZGVyPiB7eyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0FjY2Vzc0xldmVsLCBDbGFzc05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yLlByb3RvLkV4dGVuc2lvblJhbmdlQ291bnQgPiAwID8gIkV4dGVuZGFibGUiIDogIkdlbmVyYXRlZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lU3VmZml4KTsNCisgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuRmlsZS5DU2hhcnBPcHRpb25zLkdlbmVyYXRlUHJpdmF0ZUN0b3IpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwcml2YXRlIHswfSgpIHt7IH19IiwgQ2xhc3NOYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgLy8gTXVzdCBjYWxsIE1ha2VSZWFkT25seSgpIHRvIG1ha2Ugc3VyZSBhbGwgbGlzdHMgYXJlIG1hZGUgcmVhZC1vbmx5DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgezB9IGRlZmF1bHRJbnN0YW5jZSA9IG5ldyB7MH0oKS5NYWtlUmVhZE9ubHkoKTsiLCBDbGFzc05hbWUpOw0KKw0KKyAgICAgICAgICAgIGlmIChPcHRpbWl6ZVNwZWVkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3swfUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10ge3sgezJ9ezF9ezJ9IH19OyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZUhlbHBlcnMuVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShDbGFzc05hbWUpLCBTdHJpbmcuSm9pbigiXCIsIFwiIiwgRmllbGROYW1lcyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGROYW1lcy5MZW5ndGggPiAwID8gIlwiIiA6ICIiKTsNCisgICAgICAgICAgICAgICAgTGlzdDxzdHJpbmc+IHRhZ3MgPSBuZXcgTGlzdDxzdHJpbmc+KCk7DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBuYW1lIGluIEZpZWxkTmFtZXMpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRhZ3MuQWRkKFdpcmVGb3JtYXQuTWFrZVRhZyhEZXNjcmlwdG9yLkZpbmRGaWVsZEJ5TmFtZShuYW1lKSkuVG9TdHJpbmcoKSk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF97MH1GaWVsZFRhZ3MgPSBuZXcgdWludFtdIHt7IHsxfSB9fTsiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVIZWxwZXJzLlVuZGVyc2NvcmVzVG9DYW1lbENhc2UoQ2xhc3NOYW1lKSwgU3RyaW5nLkpvaW4oIiwgIiwgdGFncy5Ub0FycmF5KCkpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHN0YXRpYyB7MH0gRGVmYXVsdEluc3RhbmNlIHt7IiwgQ2xhc3NOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBvdmVycmlkZSB7MH0gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7eyIsIENsYXNzTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwcm90ZWN0ZWQgb3ZlcnJpZGUgezB9IFRoaXNNZXNzYWdlIHt7IiwgQ2xhc3NOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGdldCB7IHJldHVybiB0aGlzOyB9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgICAgICBpZiAoIVVzZUxpdGVSdW50aW1lKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgeyIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGdldCB7eyByZXR1cm4gezB9LmludGVybmFsX197MX1fX0Rlc2NyaXB0b3I7IH19IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yVXRpbC5HZXRGdWxsVW1icmVsbGFDbGFzc05hbWUoRGVzY3JpcHRvciksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihEZXNjcmlwdG9yKSk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKA0KKyAgICAgICAgICAgICAgICAgICAgInByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPHswfSwgezB9LkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMge3siLA0KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBnZXQge3sgcmV0dXJuIHswfS5pbnRlcm5hbF9fezF9X19GaWVsZEFjY2Vzc29yVGFibGU7IH19IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yVXRpbC5HZXRGdWxsVW1icmVsbGFDbGFzc05hbWUoRGVzY3JpcHRvciksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihEZXNjcmlwdG9yKSk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBFeHRlbnNpb25zIGRvbid0IG5lZWQgdG8gZ28gaW4gYW4gZXh0cmEgbmVzdGVkIHR5cGUgDQorICAgICAgICAgICAgV3JpdGVDaGlsZHJlbih3cml0ZXIsIG51bGwsIERlc2NyaXB0b3IuRXh0ZW5zaW9ucyk7DQorDQorICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuRW51bVR5cGVzLkNvdW50ICsgRGVzY3JpcHRvci5OZXN0ZWRUeXBlcy5Db3VudCA+IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIjcmVnaW9uIE5lc3RlZCB0eXBlcyIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXSIpOw0KKyAgICAgICAgICAgICAgICBXcml0ZUdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzKHdyaXRlcik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7Iik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisgICAgICAgICAgICAgICAgV3JpdGVDaGlsZHJlbih3cml0ZXIsIG51bGwsIERlc2NyaXB0b3IuRW51bVR5cGVzKTsNCisgICAgICAgICAgICAgICAgV3JpdGVDaGlsZHJlbih3cml0ZXIsIG51bGwsIERlc2NyaXB0b3IuTmVzdGVkVHlwZXMpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuT3V0ZGVudCgpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiNlbmRyZWdpb24iKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBmb3JlYWNoIChGaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yIGluIERlc2NyaXB0b3IuRmllbGRzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuRmlsZS5DU2hhcnBPcHRpb25zLkNsc0NvbXBsaWFuY2UgJiYgR2V0RmllbGRDb25zdGFudE5hbWUoZmllbGREZXNjcmlwdG9yKS5TdGFydHNXaXRoKCJfIikpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIltnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXSIpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIC8vIFJhdHM6IHdlIGxvc2UgdGhlIGRlYnVnIGNvbW1lbnQgaGVyZSA6KA0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgY29uc3QgaW50IHswfSA9IHsxfTsiLCBHZXRGaWVsZENvbnN0YW50TmFtZShmaWVsZERlc2NyaXB0b3IpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkRGVzY3JpcHRvci5GaWVsZE51bWJlcik7DQorICAgICAgICAgICAgICAgIENyZWF0ZUZpZWxkR2VuZXJhdG9yKGZpZWxkRGVzY3JpcHRvcikuR2VuZXJhdGVNZW1iZXJzKHdyaXRlcik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKE9wdGltaXplU3BlZWQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQod3JpdGVyKTsNCisgICAgICAgICAgICAgICAgR2VuZXJhdGVNZXNzYWdlU2VyaWFsaXphdGlvbk1ldGhvZHMod3JpdGVyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKFVzZUxpdGVSdW50aW1lKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgR2VuZXJhdGVMaXRlUnVudGltZU1ldGhvZHMod3JpdGVyKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgR2VuZXJhdGVQYXJzZUZyb21NZXRob2RzKHdyaXRlcik7DQorICAgICAgICAgICAgR2VuZXJhdGVCdWlsZGVyKHdyaXRlcik7DQorDQorICAgICAgICAgICAgLy8gRm9yY2UgdGhlIHN0YXRpYyBpbml0aWFsaXphdGlvbiBjb2RlIGZvciB0aGUgZmlsZSB0byBydW4sIHNpbmNlIGl0IG1heQ0KKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgc3RhdGljIHZhcmlhYmxlcyBkZWNsYXJlZCBpbiB0aGlzIGNsYXNzLg0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInN0YXRpYyB7MH0oKSB7eyIsIENsYXNzTmFtZSk7DQorICAgICAgICAgICAgLy8gV2UgY2FsbCBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKCkganVzdCB0byBtYWtlIGl0IGEgdmFsaWQgc3RhdGVtZW50IG9uIGl0cyBvd24uDQorICAgICAgICAgICAgLy8gQW5vdGhlciBvcHRpb24gd291bGQgYmUgR2V0VHlwZSgpLCBidXQgdGhhdCBjYXVzZXMgcHJvYmxlbXMgaW4gRGVzY3JpcHRvclByb3RvRmlsZSwNCisgICAgICAgICAgICAvLyB3aGVyZSB0aGUgYm9vdHN0cmFwcGluZyBpcyBzb21ld2hhdCByZWN1cnNpdmUgLSB0eXBlIGluaXRpYWxpemVycyBjYWxsDQorICAgICAgICAgICAgLy8gZWFjaCBvdGhlciwgZWZmZWN0aXZlbHkuIFdlIHRlbXBvcmFyaWx5IHNlZSBEZXNjcmlwdG9yIGFzIG51bGwuDQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKHswfS5EZXNjcmlwdG9yLCBudWxsKTsiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclV0aWwuR2V0RnVsbFVtYnJlbGxhQ2xhc3NOYW1lKERlc2NyaXB0b3IpKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorDQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEdlbmVyYXRlTGl0ZVJ1bnRpbWVNZXRob2RzKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJvb2wgY2FsbGJhc2UgPSBEZXNjcmlwdG9yLlByb3RvLkV4dGVuc2lvblJhbmdlQ291bnQgPiAwOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiNyZWdpb24gTGl0ZSBydW50aW1lIG1ldGhvZHMiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgeyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpbnQgaGFzaCA9IEdldFR5cGUoKS5HZXRIYXNoQ29kZSgpOyIpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBmaWVsZERlc2NyaXB0b3IgaW4gRGVzY3JpcHRvci5GaWVsZHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDcmVhdGVGaWVsZEdlbmVyYXRvcihmaWVsZERlc2NyaXB0b3IpLldyaXRlSGFzaCh3cml0ZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoY2FsbGJhc2UpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJoYXNoIF49IGJhc2UuR2V0SGFzaENvZGUoKTsiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicmV0dXJuIGhhc2g7Iik7DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKSB7Iik7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInswfSBvdGhlciA9IG9iaiBhcyB7MH07IiwgQ2xhc3NOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyIpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBmaWVsZERlc2NyaXB0b3IgaW4gRGVzY3JpcHRvci5GaWVsZHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDcmVhdGVGaWVsZEdlbmVyYXRvcihmaWVsZERlc2NyaXB0b3IpLldyaXRlRXF1YWxzKHdyaXRlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChjYWxsYmFzZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlmICghYmFzZS5FcXVhbHMob3RoZXIpKSByZXR1cm4gZmFsc2U7Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInJldHVybiB0cnVlOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludFRvKGdsb2JhbDo6U3lzdGVtLklPLlRleHRXcml0ZXIgd3JpdGVyKSB7Iik7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgIExpc3Q8RmllbGREZXNjcmlwdG9yPiBzb3J0ZWQgPSBuZXcgTGlzdDxGaWVsZERlc2NyaXB0b3I+KERlc2NyaXB0b3IuRmllbGRzKTsNCisgICAgICAgICAgICBzb3J0ZWQuU29ydCgNCisgICAgICAgICAgICAgICAgbmV3IENvbXBhcmlzb248RmllbGREZXNjcmlwdG9yPigNCisgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlKEZpZWxkRGVzY3JpcHRvciBhLCBGaWVsZERlc2NyaXB0b3IgYikgeyByZXR1cm4gYS5GaWVsZE51bWJlci5Db21wYXJlVG8oYi5GaWVsZE51bWJlcik7IH0pKTsNCisgICAgICAgICAgICBmb3JlYWNoIChGaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yIGluIHNvcnRlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENyZWF0ZUZpZWxkR2VuZXJhdG9yKGZpZWxkRGVzY3JpcHRvcikuV3JpdGVUb1N0cmluZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoY2FsbGJhc2UpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJiYXNlLlByaW50VG8od3JpdGVyKTsiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiI2VuZHJlZ2lvbiIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgdm9pZCBHZW5lcmF0ZU1lc3NhZ2VTZXJpYWxpemF0aW9uTWV0aG9kcyhUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBMaXN0PEZpZWxkRGVzY3JpcHRvcj4gc29ydGVkRmllbGRzID0gbmV3IExpc3Q8RmllbGREZXNjcmlwdG9yPihEZXNjcmlwdG9yLkZpZWxkcyk7DQorICAgICAgICAgICAgc29ydGVkRmllbGRzLlNvcnQoKGYxLCBmMikgPT4gZjEuRmllbGROdW1iZXIuQ29tcGFyZVRvKGYyLkZpZWxkTnVtYmVyKSk7DQorDQorICAgICAgICAgICAgTGlzdDxEZXNjcmlwdG9yUHJvdG8uVHlwZXMuRXh0ZW5zaW9uUmFuZ2U+IHNvcnRlZEV4dGVuc2lvbnMgPQ0KKyAgICAgICAgICAgICAgICBuZXcgTGlzdDxEZXNjcmlwdG9yUHJvdG8uVHlwZXMuRXh0ZW5zaW9uUmFuZ2U+KERlc2NyaXB0b3IuUHJvdG8uRXh0ZW5zaW9uUmFuZ2VMaXN0KTsNCisgICAgICAgICAgICBzb3J0ZWRFeHRlbnNpb25zLlNvcnQoKHIxLCByMikgPT4gKHIxLlN0YXJ0LkNvbXBhcmVUbyhyMi5TdGFydCkpKTsNCisNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Iik7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSd2ZSBjb21wdXRlZCB0aGUgc2VyaWFsaXplZCBsZW5ndGgsIHNvIHRoYXQgcGFja2VkIGZpZWxkcyBhcmUgZ2VuZXJhdGVkIGNvcnJlY3RseS4NCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJDYWxjU2VyaWFsaXplZFNpemUoKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF97MH1GaWVsZE5hbWVzOyIsIE5hbWVIZWxwZXJzLlVuZGVyc2NvcmVzVG9DYW1lbENhc2UoQ2xhc3NOYW1lKSk7DQorICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuUHJvdG8uRXh0ZW5zaW9uUmFuZ2VMaXN0LkNvdW50ID4gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoDQorICAgICAgICAgICAgICAgICAgICAicGI6OkV4dGVuZGFibGVNZXNzYWdlezF9PHswfSwgezB9LkJ1aWxkZXI+LkV4dGVuc2lvbldyaXRlciBleHRlbnNpb25Xcml0ZXIgPSBDcmVhdGVFeHRlbnNpb25Xcml0ZXIodGhpcyk7IiwNCisgICAgICAgICAgICAgICAgICAgIENsYXNzTmFtZSwgUnVudGltZVN1ZmZpeCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vIE1lcmdlIHRoZSBmaWVsZHMgYW5kIHRoZSBleHRlbnNpb24gcmFuZ2VzLCBib3RoIHNvcnRlZCBieSBmaWVsZCBudW1iZXIuDQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGogPSAwOyBpIDwgRGVzY3JpcHRvci5GaWVsZHMuQ291bnQgfHwgaiA8IHNvcnRlZEV4dGVuc2lvbnMuQ291bnQ7KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGkgPT0gRGVzY3JpcHRvci5GaWVsZHMuQ291bnQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlU2VyaWFsaXplT25lRXh0ZW5zaW9uUmFuZ2Uod3JpdGVyLCBzb3J0ZWRFeHRlbnNpb25zW2orK10pOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGogPT0gc29ydGVkRXh0ZW5zaW9ucy5Db3VudCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZCh3cml0ZXIsIHNvcnRlZEZpZWxkc1tpKytdKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzb3J0ZWRGaWVsZHNbaV0uRmllbGROdW1iZXIgPCBzb3J0ZWRFeHRlbnNpb25zW2pdLlN0YXJ0KQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZVNlcmlhbGl6ZU9uZUZpZWxkKHdyaXRlciwgc29ydGVkRmllbGRzW2krK10pOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZSh3cml0ZXIsIHNvcnRlZEV4dGVuc2lvbnNbaisrXSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKCFVc2VMaXRlUnVudGltZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChEZXNjcmlwdG9yLlByb3RvLk9wdGlvbnMuTWVzc2FnZVNldFdpcmVGb3JtYXQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIlVua25vd25GaWVsZHMuV3JpdGVBc01lc3NhZ2VTZXRUbyhvdXRwdXQpOyIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7Iik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsiKTsNCisgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiZ2V0IHsiKTsNCisgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJyZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsiKTsNCisgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgic2l6ZSA9IDA7Iik7DQorICAgICAgICAgICAgZm9yZWFjaCAoRmllbGREZXNjcmlwdG9yIGZpZWxkIGluIERlc2NyaXB0b3IuRmllbGRzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ3JlYXRlRmllbGRHZW5lcmF0b3IoZmllbGQpLkdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKHdyaXRlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChEZXNjcmlwdG9yLlByb3RvLkV4dGVuc2lvblJhbmdlQ291bnQgPiAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgic2l6ZSArPSBFeHRlbnNpb25zU2VyaWFsaXplZFNpemU7Iik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmICghVXNlTGl0ZVJ1bnRpbWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoRGVzY3JpcHRvci5PcHRpb25zLk1lc3NhZ2VTZXRXaXJlRm9ybWF0KQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQ7Iik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7Iik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgibWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicmV0dXJuIHNpemU7Iik7DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZChUZXh0R2VuZXJhdG9yIHdyaXRlciwgRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBDcmVhdGVGaWVsZEdlbmVyYXRvcihmaWVsZERlc2NyaXB0b3IpLkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUod3JpdGVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZShUZXh0R2VuZXJhdG9yIHdyaXRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG8uVHlwZXMuRXh0ZW5zaW9uUmFuZ2UgZXh0ZW5zaW9uUmFuZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoezB9LCBvdXRwdXQpOyIsIGV4dGVuc2lvblJhbmdlLkVuZCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHZvaWQgR2VuZXJhdGVQYXJzZUZyb21NZXRob2RzKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIE5vdGU6ICBUaGVzZSBhcmUgc2VwYXJhdGUgZnJvbSBHZW5lcmF0ZU1lc3NhZ2VTZXJpYWxpemF0aW9uTWV0aG9kcygpDQorICAgICAgICAgICAgLy8gICBiZWNhdXNlIHRoZXkgbmVlZCB0byBiZSBnZW5lcmF0ZWQgZXZlbiBmb3IgbWVzc2FnZXMgdGhhdCBhcmUgb3B0aW1pemVkDQorICAgICAgICAgICAgLy8gICBmb3IgY29kZSBzaXplLg0KKw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBzdGF0aWMgezB9IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7eyIsIENsYXNzTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKA0KKyAgICAgICAgICAgICAgICAicHVibGljIHN0YXRpYyB7MH0gUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkge3siLA0KKyAgICAgICAgICAgICAgICBDbGFzc05hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBzdGF0aWMgezB9IFBhcnNlRnJvbShieXRlW10gZGF0YSkge3siLCBDbGFzc05hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHN0YXRpYyB7MH0gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHt7IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHN0YXRpYyB7MH0gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkge3siLCBDbGFzc05hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoDQorICAgICAgICAgICAgICAgICJwdWJsaWMgc3RhdGljIHswfSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHt7IiwNCisgICAgICAgICAgICAgICAgQ2xhc3NOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHN0YXRpYyB7MH0gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkge3siLCBDbGFzc05hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoDQorICAgICAgICAgICAgICAgICJwdWJsaWMgc3RhdGljIHswfSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHt7IiwNCisgICAgICAgICAgICAgICAgQ2xhc3NOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHN0YXRpYyB7MH0gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkge3siLCBDbGFzc05hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoDQorICAgICAgICAgICAgICAgICJwdWJsaWMgc3RhdGljIHswfSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHt7IiwNCisgICAgICAgICAgICAgICAgQ2xhc3NOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgdHlwZSBoYXMgYW55IHJlcXVpcmVkIGZpZWxkcy4NCisgICAgICAgIC8vLyBJZiBpdCBkb2Vzbid0LCBjYWxscyB0byBjaGVjayBmb3IgaW5pdGlhbGl6YXRpb24gY2FuIGJlIG9wdGltaXNlZC4NCisgICAgICAgIC8vLyBUT0RPKGpvbnNrZWV0KTogTW92ZSB0aGlzIGludG8gTWVzc2FnZURlc2NyaXB0b3I/DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBIYXNSZXF1aXJlZEZpZWxkcyhNZXNzYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE1lc3NhZ2VEZXNjcmlwdG9yLCBvYmplY3Q+IGFscmVhZHlTZWVuKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChhbHJlYWR5U2Vlbi5Db250YWluc0tleShkZXNjcmlwdG9yKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIFRoZSB0eXBlIGlzIGFscmVhZHkgaW4gY2FjaGUuICBUaGlzIG1lYW5zIHRoYXQgZWl0aGVyOg0KKyAgICAgICAgICAgICAgICAvLyBhLiBUaGUgdHlwZSBoYXMgbm8gcmVxdWlyZWQgZmllbGRzLg0KKyAgICAgICAgICAgICAgICAvLyBiLiBXZSBhcmUgaW4gdGhlIG1pZHN0IG9mIGNoZWNraW5nIGlmIHRoZSB0eXBlIGhhcyByZXF1aXJlZCBmaWVsZHMsDQorICAgICAgICAgICAgICAgIC8vICAgIHNvbWV3aGVyZSB1cCB0aGUgc3RhY2suICBJbiB0aGlzIGNhc2UsIHdlIGtub3cgdGhhdCBpZiB0aGUgdHlwZQ0KKyAgICAgICAgICAgICAgICAvLyAgICBoYXMgYW55IHJlcXVpcmVkIGZpZWxkcywgdGhleSdsbCBiZSBmb3VuZCB3aGVuIHdlIHJldHVybiB0byBpdCwNCisgICAgICAgICAgICAgICAgLy8gICAgYW5kIHRoZSB3aG9sZSBjYWxsIHRvIEhhc1JlcXVpcmVkRmllbGRzKCkgd2lsbCByZXR1cm4gdHJ1ZS4NCisgICAgICAgICAgICAgICAgLy8gICAgVGhlcmVmb3JlLCB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGlmIHRoaXMgdHlwZSBoYXMgcmVxdWlyZWQgZmllbGRzDQorICAgICAgICAgICAgICAgIC8vICAgIGhlcmUuDQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYWxyZWFkeVNlZW5bZGVzY3JpcHRvcl0gPSBkZXNjcmlwdG9yOyAvLyBWYWx1ZSBpcyBpcnJlbGV2YW50DQorDQorICAgICAgICAgICAgLy8gSWYgdGhlIHR5cGUgaGFzIGV4dGVuc2lvbnMsIGFuIGV4dGVuc2lvbiB3aXRoIG1lc3NhZ2UgdHlwZSBjb3VsZCBjb250YWluDQorICAgICAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzLCBzbyB3ZSBoYXZlIHRvIGJlIGNvbnNlcnZhdGl2ZSBhbmQgYXNzdW1lIHN1Y2ggYW4NCisgICAgICAgICAgICAvLyBleHRlbnNpb24gZXhpc3RzLg0KKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLkV4dGVuc2lvbnMuQ291bnQgPiAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBmaWVsZCBpbiBkZXNjcmlwdG9yLkZpZWxkcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Jc1JlcXVpcmVkKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAvLyBNZXNzYWdlIG9yIGdyb3VwDQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5NYXBwZWRUeXBlID09IE1hcHBlZFR5cGUuTWVzc2FnZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEhhc1JlcXVpcmVkRmllbGRzKGZpZWxkLk1lc3NhZ2VUeXBlLCBhbHJlYWR5U2VlbikpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEdlbmVyYXRlQnVpbGRlcihUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwcml2YXRlIHswfSBNYWtlUmVhZE9ubHkoKSB7eyIsIENsYXNzTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBmaWVsZCBpbiBEZXNjcmlwdG9yLkZpZWxkcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENyZWF0ZUZpZWxkR2VuZXJhdG9yKGZpZWxkKS5HZW5lcmF0ZUJ1aWxkaW5nQ29kZSh3cml0ZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJyZXR1cm4gdGhpczsiKTsNCisgICAgICAgICAgICB3cml0ZXIuT3V0ZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorDQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKHswfSBwcm90b3R5cGUpIHt7IiwgQ2xhc3NOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuRmlsZS5DU2hhcnBPcHRpb25zLkFkZFNlcmlhbGl6YWJsZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIltnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGVBdHRyaWJ1dGUoKV0iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0iKTsNCisgICAgICAgICAgICBXcml0ZUdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9IHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6ezJ9QnVpbGRlcnszfTx7MX0sIEJ1aWxkZXI+IHt7IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzQWNjZXNzTGV2ZWwsIENsYXNzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IuUHJvdG8uRXh0ZW5zaW9uUmFuZ2VDb3VudCA+IDAgPyAiRXh0ZW5kYWJsZSIgOiAiR2VuZXJhdGVkIiwgUnVudGltZVN1ZmZpeCk7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGdldCB7IHJldHVybiB0aGlzOyB9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIEdlbmVyYXRlQ29tbW9uQnVpbGRlck1ldGhvZHMod3JpdGVyKTsNCisgICAgICAgICAgICBpZiAoT3B0aW1pemVTcGVlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEdlbmVyYXRlQnVpbGRlclBhcnNpbmdNZXRob2RzKHdyaXRlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBmaWVsZCBpbiBEZXNjcmlwdG9yLkZpZWxkcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgICAgICAgICAgLy8gTm8gZmllbGQgY29tbWVudCA6KA0KKyAgICAgICAgICAgICAgICBDcmVhdGVGaWVsZEdlbmVyYXRvcihmaWVsZCkuR2VuZXJhdGVCdWlsZGVyTWVtYmVycyh3cml0ZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3cml0ZXIuT3V0ZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgdm9pZCBHZW5lcmF0ZUNvbW1vbkJ1aWxkZXJNZXRob2RzKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vZGVmYXVsdCBjb25zdHJ1Y3Rvcg0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBCdWlsZGVyKCkgeyIpOw0KKyAgICAgICAgICAgIC8vRHVycmluZyBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2YgbWVzc2FnZSwgRGVmYXVsdEluc3RhbmNlIGlzIGV4cGVjdGVkIHRvIHJldHVybiBudWxsLg0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIC8vY2xvbmUgY29uc3RydWN0b3INCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpbnRlcm5hbCBCdWlsZGVyKHswfSBjbG9uZUZyb20pIHt7IiwgQ2xhc3NOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdCA9IGNsb25lRnJvbTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHJpdmF0ZSB7MH0gcmVzdWx0OyIsIENsYXNzTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInByaXZhdGUgezB9IFByZXBhcmVCdWlsZGVyKCkge3siLCBDbGFzc05hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgezB9IG9yaWdpbmFsID0gcmVzdWx0OyIsIENsYXNzTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICAgIHJlc3VsdCA9IG5ldyB7MH0oKTsiLCBDbGFzc05hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICB9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gcmVzdWx0OyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInByb3RlY3RlZCBvdmVycmlkZSB7MH0gTWVzc2FnZUJlaW5nQnVpbHQge3siLCBDbGFzc05hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIC8vTm90IGFjdHVhbGx5IGV4cGVjdGluZyB0aGF0IERlZmF1bHRJbnN0YW5jZSB3b3VsZCBldmVyIGJlIG51bGwgaGVyZTsgaG93ZXZlciwgd2Ugd2lsbCBlbnN1cmUgaXQgZG9lcyBub3QgYnJlYWsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsiLCBDbGFzc05hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gdGhpczsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgeyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICB9IGVsc2UgeyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIH0iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIGlmICghVXNlTGl0ZVJ1bnRpbWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7Iik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgZ2V0IHt7IHJldHVybiB7MH0uRGVzY3JpcHRvcjsgfX0iLCBGdWxsQ2xhc3NOYW1lKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBvdmVycmlkZSB7MH0gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7eyIsIENsYXNzTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBnZXQge3sgcmV0dXJuIHswfS5EZWZhdWx0SW5zdGFuY2U7IH19IiwgRnVsbENsYXNzTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgb3ZlcnJpZGUgezB9IEJ1aWxkUGFydGlhbCgpIHt7IiwgQ2xhc3NOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybiByZXN1bHQ7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKw0KKyAgICAgICAgICAgIGlmIChPcHRpbWl6ZVNwZWVkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZXswfSBvdGhlcikge3siLCBSdW50aW1lU3VmZml4KTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBpZiAob3RoZXIgaXMgezB9KSB7eyIsIENsYXNzTmFtZSk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICByZXR1cm4gTWVyZ2VGcm9tKCh7MH0pIG90aGVyKTsiLCBDbGFzc05hbWUpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIH0gZWxzZSB7Iik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7Iik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICByZXR1cm4gdGhpczsiKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICB9Iik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oezB9IG90aGVyKSB7eyIsIENsYXNzTmFtZSk7DQorICAgICAgICAgICAgICAgIC8vIE9wdGltaXphdGlvbjogIElmIG90aGVyIGlzIHRoZSBkZWZhdWx0IGluc3RhbmNlLCB3ZSBrbm93IG5vbmUgb2YgaXRzDQorICAgICAgICAgICAgICAgIC8vIGZpZWxkcyBhcmUgc2V0IHNvIHdlIGNhbiBza2lwIHRoZSBtZXJnZS4NCisgICAgICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpZiAob3RoZXIgPT0gezB9LkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7IiwgRnVsbENsYXNzTmFtZSk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIlByZXBhcmVCdWlsZGVyKCk7Iik7DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBmaWVsZCBpbiBEZXNjcmlwdG9yLkZpZWxkcykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlRmllbGRHZW5lcmF0b3IoZmllbGQpLkdlbmVyYXRlTWVyZ2luZ0NvZGUod3JpdGVyKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAvLyBpZiBtZXNzYWdlIHR5cGUgaGFzIGV4dGVuc2lvbnMNCisgICAgICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuUHJvdG8uRXh0ZW5zaW9uUmFuZ2VDb3VudCA+IDApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgdGhpcy5NZXJnZUV4dGVuc2lvbkZpZWxkcyhvdGhlcik7Iik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKCFVc2VMaXRlUnVudGltZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgidGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7Iik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicmV0dXJuIHRoaXM7Iik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nTWV0aG9kcyhUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBMaXN0PEZpZWxkRGVzY3JpcHRvcj4gc29ydGVkRmllbGRzID0gbmV3IExpc3Q8RmllbGREZXNjcmlwdG9yPihEZXNjcmlwdG9yLkZpZWxkcyk7DQorICAgICAgICAgICAgc29ydGVkRmllbGRzLlNvcnQoKGYxLCBmMikgPT4gZjEuRmllbGROdW1iZXIuQ29tcGFyZVRvKGYyLkZpZWxkTnVtYmVyKSk7DQorDQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgeyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoDQorICAgICAgICAgICAgICAgICJwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsiKTsNCisgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiUHJlcGFyZUJ1aWxkZXIoKTsiKTsNCisgICAgICAgICAgICBpZiAoIVVzZUxpdGVSdW50aW1lKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOyIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ1aW50IHRhZzsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJzdHJpbmcgZmllbGRfbmFtZTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsiKTsNCisgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7Iik7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgIC8vaWYgeW91IGNoYW5nZSBmcm9tIFN0cmluZ0NvbXBhcmVyLk9yZGluYWwsIHRoZSBhcnJheSBzb3J0IGluIEZpZWxkTmFtZXMgeyBnZXQ7IH0gbXVzdCBhbHNvIGNoYW5nZQ0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoDQorICAgICAgICAgICAgICAgICJpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfezB9RmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7IiwNCisgICAgICAgICAgICAgICAgTmFtZUhlbHBlcnMuVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShDbGFzc05hbWUpKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpZihmaWVsZF9vcmRpbmFsID49IDApIik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICB0YWcgPSBfezB9RmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOyIsIE5hbWVIZWxwZXJzLlVuZGVyc2NvcmVzVG9DYW1lbENhc2UoQ2xhc3NOYW1lKSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiZWxzZSB7Iik7DQorICAgICAgICAgICAgaWYgKCFVc2VMaXRlUnVudGltZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgeyIpOyAvLyBGaXJzdCB1bmtub3duIGZpZWxkIC0gY3JlYXRlIGJ1aWxkZXIgbm93DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7Iik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgfSIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB7MH1leHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlTGl0ZVJ1bnRpbWUgPyAiIiA6ICJ1bmtub3duRmllbGRzLCAiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGNvbnRpbnVlOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICB3cml0ZXIuT3V0ZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJzd2l0Y2ggKHRhZykgeyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJjYXNlIDA6IHsiKTsgLy8gMCBzaWduYWxzIEVPRiAvIGxpbWl0IHJlYWNoZWQNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJkZWZhdWx0OiB7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7Iik7DQorICAgICAgICAgICAgaWYgKCFVc2VMaXRlUnVudGltZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7Iik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsiKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICAgIH0iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICAgIHJldHVybiB0aGlzOyIpOyAvLyBpdCdzIGFuIGVuZGdyb3VwIHRhZw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgfSIpOw0KKyAgICAgICAgICAgIGlmICghVXNlTGl0ZVJ1bnRpbWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsiKTsgLy8gRmlyc3QgdW5rbm93biBmaWVsZCAtIGNyZWF0ZSBidWlsZGVyIG5vdw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOyIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIH0iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgezB9ZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZUxpdGVSdW50aW1lID8gIiIgOiAidW5rbm93bkZpZWxkcywgIik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBicmVhazsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgZm9yZWFjaCAoRmllbGREZXNjcmlwdG9yIGZpZWxkIGluIHNvcnRlZEZpZWxkcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdpcmVGb3JtYXQuV2lyZVR5cGUgd3QgPSBXaXJlRm9ybWF0LkdldFdpcmVUeXBlKGZpZWxkLkZpZWxkVHlwZSk7DQorICAgICAgICAgICAgICAgIHVpbnQgdGFnID0gV2lyZUZvcm1hdC5NYWtlVGFnKGZpZWxkLkZpZWxkTnVtYmVyLCB3dCk7DQorDQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Jc1JlcGVhdGVkICYmDQorICAgICAgICAgICAgICAgICAgICAod3QgPT0gV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQgfHwgd3QgPT0gV2lyZUZvcm1hdC5XaXJlVHlwZS5GaXhlZDMyIHx8DQorICAgICAgICAgICAgICAgICAgICAgd3QgPT0gV2lyZUZvcm1hdC5XaXJlVHlwZS5GaXhlZDY0KSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiY2FzZSB7MH06IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdC5NYWtlVGFnKGZpZWxkLkZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImNhc2UgezB9OiB7eyIsIHRhZyk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisgICAgICAgICAgICAgICAgQ3JlYXRlRmllbGRHZW5lcmF0b3IoZmllbGQpLkdlbmVyYXRlUGFyc2luZ0NvZGUod3JpdGVyKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiYnJlYWs7Iik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIGlmICghVXNlTGl0ZVJ1bnRpbWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7Iik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOyIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInJldHVybiB0aGlzOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgdm9pZCBHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7Iik7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImdldCB7Iik7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKw0KKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2UgYXJlIHNldC4NCisgICAgICAgICAgICAvLyBUT0RPKGtlbnRvbik6ICBXZSBjYW4gb3B0aW1pemUgdGhpcyB3aGVuIHdlIHN3aXRjaCB0byBwdXR0aW5nIGFsbCB0aGUNCisgICAgICAgICAgICAvLyAiaGFzIiBmaWVsZHMgaW50byBhIHNpbmdsZSBiaXRmaWVsZC4NCisgICAgICAgICAgICBmb3JlYWNoIChGaWVsZERlc2NyaXB0b3IgZmllbGQgaW4gRGVzY3JpcHRvci5GaWVsZHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNSZXF1aXJlZCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYgKCFoYXN7MH0pIHJldHVybiBmYWxzZTsiLCBmaWVsZC5DU2hhcnBPcHRpb25zLlByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8gTm93IGNoZWNrIHRoYXQgYWxsIGVtYmVkZGVkIG1lc3NhZ2VzIGFyZSBpbml0aWFsaXplZC4NCisgICAgICAgICAgICBmb3JlYWNoIChGaWVsZERlc2NyaXB0b3IgZmllbGQgaW4gRGVzY3JpcHRvci5GaWVsZHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuRmllbGRUeXBlICE9IEZpZWxkVHlwZS5NZXNzYWdlIHx8DQorICAgICAgICAgICAgICAgICAgICAhSGFzUmVxdWlyZWRGaWVsZHMoZmllbGQuTWVzc2FnZVR5cGUsIG5ldyBEaWN0aW9uYXJ5PE1lc3NhZ2VEZXNjcmlwdG9yLCBvYmplY3Q+KCkpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBzdHJpbmcgcHJvcGVydHlOYW1lID0gTmFtZUhlbHBlcnMuVW5kZXJzY29yZXNUb1Bhc2NhbENhc2UoR2V0RmllbGROYW1lKGZpZWxkKSk7DQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Jc1JlcGVhdGVkKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJmb3JlYWNoICh7MH0gZWxlbWVudCBpbiB7MX1MaXN0KSB7eyIsIEdldENsYXNzTmFtZShmaWVsZC5NZXNzYWdlVHlwZSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGlmICghZWxlbWVudC5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQuSXNPcHRpb25hbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYgKEhhc3swfSkge3siLCBwcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBpZiAoIXswfS5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7IiwgcHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlmICghezB9LklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsiLCBwcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmIChEZXNjcmlwdG9yLlByb3RvLkV4dGVuc2lvblJhbmdlQ291bnQgPiAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYgKCFFeHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicmV0dXJuIHRydWU7Iik7DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBHZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbkNvZGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoRmllbGREZXNjcmlwdG9yIGV4dGVuc2lvbiBpbiBEZXNjcmlwdG9yLkV4dGVuc2lvbnMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBuZXcgRXh0ZW5zaW9uR2VuZXJhdG9yKGV4dGVuc2lvbikuR2VuZXJhdGVFeHRlbnNpb25SZWdpc3RyYXRpb25Db2RlKHdyaXRlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvcmVhY2ggKE1lc3NhZ2VEZXNjcmlwdG9yIG5lc3RlZE1lc3NhZ2UgaW4gRGVzY3JpcHRvci5OZXN0ZWRUeXBlcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdlR2VuZXJhdG9yKG5lc3RlZE1lc3NhZ2UpLkdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZSh3cml0ZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvR2VuL1BsdWdpblByb3RvRmlsZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vUGx1Z2luUHJvdG9GaWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZmVkNWMKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL1BsdWdpblByb3RvRmlsZS5jcwpAQCAtMCwwICsxLDExODcgQEAKKy8vIEdlbmVyYXRlZCBieSBwcm90b2MtZ2VuLWNzLCBWZXJzaW9uPTIuNC4xLjUyMSwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0xN2IzYjFmMDkwYzNlYTQ4LiAgRE8gTk9UIEVESVQhDQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQ0KKyNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCisNCit1c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVyczsNCit1c2luZyBwYmMgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnM7DQordXNpbmcgcGJkID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8gew0KKw0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBQbHVnaW4gew0KKw0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gU3RhdGljIHZhcmlhYmxlcw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9jb21waWxlcl9Db2RlR2VuZXJhdG9yUmVxdWVzdF9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBpbGVyLlBsdWdpblByb3RvLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlcXVlc3QuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfY29tcGlsZXJfQ29kZUdlbmVyYXRvclJlcXVlc3RfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfY29tcGlsZXJfQ29kZUdlbmVyYXRvclJlc3BvbnNlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlc3BvbnNlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlc3BvbnNlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX2NvbXBpbGVyX0NvZGVHZW5lcmF0b3JSZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9jb21waWxlcl9Db2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBpbGVyLlBsdWdpblByb3RvLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5UeXBlcy5GaWxlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlc3BvbnNlLlR5cGVzLkZpbGUuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfY29tcGlsZXJfQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIERlc2NyaXB0b3INCisgICAgcHVibGljIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOw0KKw0KKyAgICBzdGF0aWMgUGx1Z2luKCkgew0KKyAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygNCisgICAgICAgICAgc3RyaW5nLkNvbmNhdCgNCisgICAgICAgICAgICAiQ2lWbmIyOW5iR1V2Y0hKdmRHOWlkV1l2WTI5dGNHbHNaWEl2Y0d4MVoybHVMbkJ5YjNSdkVoaG5iMjluIiwNCisgICAgICAgICAgICAiYkdVdWNISnZkRzlpZFdZdVkyOXRjR2xzWlhJYUlHZHZiMmRzWlM5d2NtOTBiMkoxWmk5a1pYTmpjbWx3IiwNCisgICAgICAgICAgICAiZEc5eUxuQnliM1J2SW4wS0ZFTnZaR1ZIWlc1bGNtRjBiM0pTWlhGMVpYTjBFaGdLRUdacGJHVmZkRzlmIiwNCisgICAgICAgICAgICAiWjJWdVpYSmhkR1VZQVNBREtBa1NFUW9KY0dGeVlXMWxkR1Z5R0FJZ0FTZ0pFamdLQ25CeWIzUnZYMlpwIiwNCisgICAgICAgICAgICAiYkdVWUR5QURLQXN5SkM1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1Um1sc1pVUmxjMk55YVhCMGIzSlFjbTkwIiwNCisgICAgICAgICAgICAiYnlLcUFRb1ZRMjlrWlVkbGJtVnlZWFJ2Y2xKbGMzQnZibk5sRWcwS0JXVnljbTl5R0FFZ0FTZ0pFa0lLIiwNCisgICAgICAgICAgICAiQkdacGJHVVlEeUFES0FzeU5DNW5iMjluYkdVdWNISnZkRzlpZFdZdVkyOXRjR2xzWlhJdVEyOWtaVWRsIiwNCisgICAgICAgICAgICAiYm1WeVlYUnZjbEpsYzNCdmJuTmxMa1pwYkdVYVBnb0VSbWxzWlJJTUNnUnVZVzFsR0FFZ0FTZ0pFaGNLIiwNCisgICAgICAgICAgICAiRDJsdWMyVnlkR2x2Ymw5d2IybHVkQmdDSUFFb0NSSVBDZ2RqYjI1MFpXNTBHQThnQVNnSlFpd0tIR052IiwNCisgICAgICAgICAgImJTNW5iMjluYkdVdWNISnZkRzlpZFdZdVkyOXRjR2xzWlhKQ0RGQnNkV2RwYmxCeWIzUnZjdz09IikpOw0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgYXNzaWduZXIgPSBkZWxlZ2F0ZShwYmQ6OkZpbGVEZXNjcmlwdG9yIHJvb3QpIHsNCisgICAgICAgIGRlc2NyaXB0b3IgPSByb290Ow0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfY29tcGlsZXJfQ29kZUdlbmVyYXRvclJlcXVlc3RfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX2NvbXBpbGVyX0NvZGVHZW5lcmF0b3JSZXF1ZXN0X19GaWVsZEFjY2Vzc29yVGFibGUgPQ0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db21waWxlci5QbHVnaW5Qcm90by5Db2RlR2VuZXJhdG9yUmVxdWVzdCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBpbGVyLlBsdWdpblByb3RvLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX2NvbXBpbGVyX0NvZGVHZW5lcmF0b3JSZXF1ZXN0X19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRmlsZVRvR2VuZXJhdGUiLCAiUGFyYW1ldGVyIiwgIlByb3RvRmlsZSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfY29tcGlsZXJfQ29kZUdlbmVyYXRvclJlc3BvbnNlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9jb21waWxlcl9Db2RlR2VuZXJhdG9yUmVzcG9uc2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9DQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBpbGVyLlBsdWdpblByb3RvLkNvZGVHZW5lcmF0b3JSZXNwb25zZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBpbGVyLlBsdWdpblByb3RvLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9jb21waWxlcl9Db2RlR2VuZXJhdG9yUmVzcG9uc2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJFcnJvciIsICJGaWxlIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9jb21waWxlcl9Db2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9fRGVzY3JpcHRvciA9IGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX2NvbXBpbGVyX0NvZGVHZW5lcmF0b3JSZXNwb25zZV9fRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX2NvbXBpbGVyX0NvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX19GaWVsZEFjY2Vzc29yVGFibGUgPQ0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db21waWxlci5QbHVnaW5Qcm90by5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuVHlwZXMuRmlsZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBpbGVyLlBsdWdpblByb3RvLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5UeXBlcy5GaWxlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX2NvbXBpbGVyX0NvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiTmFtZSIsICJJbnNlcnRpb25Qb2ludCIsICJDb250ZW50IiwgfSk7DQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICB9Ow0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKGRlc2NyaXB0b3JEYXRhLA0KKyAgICAgICAgICBuZXcgcGJkOjpGaWxlRGVzY3JpcHRvcltdIHsNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5EZXNjcmlwdG9yLA0KKyAgICAgICAgICB9LCBhc3NpZ25lcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKw0KKyAgfQ0KKyAgI3JlZ2lvbiBNZXNzYWdlcw0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBDb2RlR2VuZXJhdG9yUmVxdWVzdCA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPENvZGVHZW5lcmF0b3JSZXF1ZXN0LCBDb2RlR2VuZXJhdG9yUmVxdWVzdC5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgQ29kZUdlbmVyYXRvclJlcXVlc3QoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ29kZUdlbmVyYXRvclJlcXVlc3QgZGVmYXVsdEluc3RhbmNlID0gbmV3IENvZGVHZW5lcmF0b3JSZXF1ZXN0KCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9jb2RlR2VuZXJhdG9yUmVxdWVzdEZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiZmlsZV90b19nZW5lcmF0ZSIsICJwYXJhbWV0ZXIiLCAicHJvdG9fZmlsZSIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9jb2RlR2VuZXJhdG9yUmVxdWVzdEZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCwgMTgsIDEyMiB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIENvZGVHZW5lcmF0b3JSZXF1ZXN0IERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBvdmVycmlkZSBDb2RlR2VuZXJhdG9yUmVxdWVzdCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisNCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIENvZGVHZW5lcmF0b3JSZXF1ZXN0IFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBpbGVyLlBsdWdpblByb3RvLlBsdWdpbi5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9jb21waWxlcl9Db2RlR2VuZXJhdG9yUmVxdWVzdF9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPENvZGVHZW5lcmF0b3JSZXF1ZXN0LCBDb2RlR2VuZXJhdG9yUmVxdWVzdC5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBpbGVyLlBsdWdpblByb3RvLlBsdWdpbi5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9jb21waWxlcl9Db2RlR2VuZXJhdG9yUmVxdWVzdF9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisNCisgICAgcHVibGljIGNvbnN0IGludCBGaWxlVG9HZW5lcmF0ZUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+IGZpbGVUb0dlbmVyYXRlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gRmlsZVRvR2VuZXJhdGVMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KGZpbGVUb0dlbmVyYXRlXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpbGVUb0dlbmVyYXRlQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWxlVG9HZW5lcmF0ZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEdldEZpbGVUb0dlbmVyYXRlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBmaWxlVG9HZW5lcmF0ZV9baW5kZXhdOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFyYW1ldGVyRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzUGFyYW1ldGVyOw0KKyAgICBwcml2YXRlIHN0cmluZyBwYXJhbWV0ZXJfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc1BhcmFtZXRlciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1BhcmFtZXRlcjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgUGFyYW1ldGVyIHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFyYW1ldGVyXzsgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUHJvdG9GaWxlRmllbGROdW1iZXIgPSAxNTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlRGVzY3JpcHRvclByb3RvPiBwcm90b0ZpbGVfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8+IFByb3RvRmlsZUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwcm90b0ZpbGVfOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQcm90b0ZpbGVDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHByb3RvRmlsZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JQcm90byBHZXRQcm90b0ZpbGUoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHByb3RvRmlsZV9baW5kZXhdOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlRGVzY3JpcHRvclByb3RvIGVsZW1lbnQgaW4gUHJvdG9GaWxlTGlzdCkgew0KKyAgICAgICAgICBpZiAoIWVsZW1lbnQuSXNJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBpbnQgc2l6ZSA9IFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2NvZGVHZW5lcmF0b3JSZXF1ZXN0RmllbGROYW1lczsNCisgICAgICBpZiAoZmlsZVRvR2VuZXJhdGVfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoMSwgZmllbGRfbmFtZXNbMF0sIGZpbGVUb0dlbmVyYXRlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNQYXJhbWV0ZXIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygyLCBmaWVsZF9uYW1lc1sxXSwgUGFyYW1ldGVyKTsNCisgICAgICB9DQorICAgICAgaWYgKHByb3RvRmlsZV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlQXJyYXkoMTUsIGZpZWxkX25hbWVzWzJdLCBwcm90b0ZpbGVfKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKw0KKyAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICB7DQorICAgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIEZpbGVUb0dlbmVyYXRlTGlzdCkgew0KKyAgICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICAgIHNpemUgKz0gMSAqIGZpbGVUb0dlbmVyYXRlXy5Db3VudDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChoYXNQYXJhbWV0ZXIpIHsNCisgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMiwgUGFyYW1ldGVyKTsNCisgICAgICAgIH0NCisgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8gZWxlbWVudCBpbiBQcm90b0ZpbGVMaXN0KSB7DQorICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxNSwgZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgIHJldHVybiBzaXplOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIENvZGVHZW5lcmF0b3JSZXF1ZXN0IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvZGVHZW5lcmF0b3JSZXF1ZXN0IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvZGVHZW5lcmF0b3JSZXF1ZXN0IFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb2RlR2VuZXJhdG9yUmVxdWVzdCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29kZUdlbmVyYXRvclJlcXVlc3QgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29kZUdlbmVyYXRvclJlcXVlc3QgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29kZUdlbmVyYXRvclJlcXVlc3QgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29kZUdlbmVyYXRvclJlcXVlc3QgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29kZUdlbmVyYXRvclJlcXVlc3QgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29kZUdlbmVyYXRvclJlcXVlc3QgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgQ29kZUdlbmVyYXRvclJlcXVlc3QgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIGZpbGVUb0dlbmVyYXRlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwcm90b0ZpbGVfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihDb2RlR2VuZXJhdG9yUmVxdWVzdCBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPENvZGVHZW5lcmF0b3JSZXF1ZXN0LCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihDb2RlR2VuZXJhdG9yUmVxdWVzdCBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisNCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIENvZGVHZW5lcmF0b3JSZXF1ZXN0IHJlc3VsdDsNCisNCisgICAgICBwcml2YXRlIENvZGVHZW5lcmF0b3JSZXF1ZXN0IFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgQ29kZUdlbmVyYXRvclJlcXVlc3Qgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBDb2RlR2VuZXJhdG9yUmVxdWVzdCgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisNCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQ29kZUdlbmVyYXRvclJlcXVlc3QgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisNCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlcXVlc3QuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisNCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29kZUdlbmVyYXRvclJlcXVlc3QgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBpbGVyLlBsdWdpblByb3RvLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisNCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29kZUdlbmVyYXRvclJlcXVlc3QgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIENvZGVHZW5lcmF0b3JSZXF1ZXN0KSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKENvZGVHZW5lcmF0b3JSZXF1ZXN0KSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oQ29kZUdlbmVyYXRvclJlcXVlc3Qgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlcXVlc3QuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuZmlsZVRvR2VuZXJhdGVfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LmZpbGVUb0dlbmVyYXRlXy5BZGQob3RoZXIuZmlsZVRvR2VuZXJhdGVfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNQYXJhbWV0ZXIpIHsNCisgICAgICAgICAgUGFyYW1ldGVyID0gb3RoZXIuUGFyYW1ldGVyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnByb3RvRmlsZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucHJvdG9GaWxlXy5BZGQob3RoZXIucHJvdG9GaWxlXyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisNCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisNCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9jb2RlR2VuZXJhdG9yUmVxdWVzdEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9jb2RlR2VuZXJhdG9yUmVxdWVzdEZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LmZpbGVUb0dlbmVyYXRlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1BhcmFtZXRlciA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5wYXJhbWV0ZXJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEyMjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wcm90b0ZpbGVfLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlRGVzY3JpcHRvclByb3RvLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisNCisNCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gRmlsZVRvR2VuZXJhdGVMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmZpbGVUb0dlbmVyYXRlXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpbGVUb0dlbmVyYXRlQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWxlVG9HZW5lcmF0ZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgR2V0RmlsZVRvR2VuZXJhdGUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldEZpbGVUb0dlbmVyYXRlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmlsZVRvR2VuZXJhdGUoaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpbGVUb0dlbmVyYXRlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRGaWxlVG9HZW5lcmF0ZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpbGVUb0dlbmVyYXRlXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRmlsZVRvR2VuZXJhdGUoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWxlVG9HZW5lcmF0ZV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWxlVG9HZW5lcmF0ZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmlsZVRvR2VuZXJhdGVfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorDQorICAgICAgcHVibGljIGJvb2wgSGFzUGFyYW1ldGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzUGFyYW1ldGVyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgUGFyYW1ldGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFyYW1ldGVyOyB9DQorICAgICAgICBzZXQgeyBTZXRQYXJhbWV0ZXIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhcmFtZXRlcihzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1BhcmFtZXRlciA9IHRydWU7DQorICAgICAgICByZXN1bHQucGFyYW1ldGVyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFyYW1ldGVyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNQYXJhbWV0ZXIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5wYXJhbWV0ZXJfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlRGVzY3JpcHRvclByb3RvPiBQcm90b0ZpbGVMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnByb3RvRmlsZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQcm90b0ZpbGVDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlByb3RvRmlsZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlRGVzY3JpcHRvclByb3RvIEdldFByb3RvRmlsZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UHJvdG9GaWxlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UHJvdG9GaWxlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JQcm90byB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucHJvdG9GaWxlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQcm90b0ZpbGUoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnByb3RvRmlsZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUHJvdG9GaWxlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnByb3RvRmlsZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQcm90b0ZpbGUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JQcm90by5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wcm90b0ZpbGVfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQcm90b0ZpbGUoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlRGVzY3JpcHRvclByb3RvPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucHJvdG9GaWxlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclByb3RvRmlsZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucHJvdG9GaWxlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBDb2RlR2VuZXJhdG9yUmVxdWVzdCgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db21waWxlci5QbHVnaW5Qcm90by5QbHVnaW4uRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisNCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQ29kZUdlbmVyYXRvclJlc3BvbnNlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8Q29kZUdlbmVyYXRvclJlc3BvbnNlLCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIENvZGVHZW5lcmF0b3JSZXNwb25zZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgZGVmYXVsdEluc3RhbmNlID0gbmV3IENvZGVHZW5lcmF0b3JSZXNwb25zZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfY29kZUdlbmVyYXRvclJlc3BvbnNlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJlcnJvciIsICJmaWxlIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2NvZGVHZW5lcmF0b3JSZXNwb25zZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCwgMTIyIH07DQorICAgIHB1YmxpYyBzdGF0aWMgQ29kZUdlbmVyYXRvclJlc3BvbnNlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBvdmVycmlkZSBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uUGx1Z2luLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX2NvbXBpbGVyX0NvZGVHZW5lcmF0b3JSZXNwb25zZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPENvZGVHZW5lcmF0b3JSZXNwb25zZSwgQ29kZUdlbmVyYXRvclJlc3BvbnNlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uUGx1Z2luLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX2NvbXBpbGVyX0NvZGVHZW5lcmF0b3JSZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisNCisgICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMNCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsNCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBGaWxlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8RmlsZSwgRmlsZS5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIEZpbGUoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZpbGUgZGVmYXVsdEluc3RhbmNlID0gbmV3IEZpbGUoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9maWxlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJjb250ZW50IiwgImluc2VydGlvbl9wb2ludCIsICJuYW1lIiB9Ow0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9maWxlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEyMiwgMTgsIDEwIH07DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZpbGUgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEZpbGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBGaWxlIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db21waWxlci5QbHVnaW5Qcm90by5QbHVnaW4uaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfY29tcGlsZXJfQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfX0Rlc2NyaXB0b3I7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEZpbGUsIEZpbGUuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uUGx1Z2luLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX2NvbXBpbGVyX0NvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTmFtZUZpZWxkTnVtYmVyID0gMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNOYW1lOw0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgbmFtZV8gPSAiIjsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc05hbWUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzTmFtZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIG5hbWVfOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEluc2VydGlvblBvaW50RmllbGROdW1iZXIgPSAyOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0luc2VydGlvblBvaW50Ow0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgaW5zZXJ0aW9uUG9pbnRfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNJbnNlcnRpb25Qb2ludCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNJbnNlcnRpb25Qb2ludDsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBJbnNlcnRpb25Qb2ludCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBpbnNlcnRpb25Qb2ludF87IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgQ29udGVudEZpZWxkTnVtYmVyID0gMTU7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzQ29udGVudDsNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIGNvbnRlbnRfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNDb250ZW50IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0NvbnRlbnQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgQ29udGVudCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBjb250ZW50XzsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgaW50IHNpemUgPSBTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfZmlsZUZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNOYW1lKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzJdLCBOYW1lKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzSW5zZXJ0aW9uUG9pbnQpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMiwgZmllbGRfbmFtZXNbMV0sIEluc2VydGlvblBvaW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzQ29udGVudCkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxNSwgZmllbGRfbmFtZXNbMF0sIENvbnRlbnQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisNCisgICAgICAgICAgICBzaXplID0gMDsNCisgICAgICAgICAgICBpZiAoaGFzTmFtZSkgew0KKyAgICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMSwgTmFtZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChoYXNJbnNlcnRpb25Qb2ludCkgew0KKyAgICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMiwgSW5zZXJ0aW9uUG9pbnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoaGFzQ29udGVudCkgew0KKyAgICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMTUsIENvbnRlbnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGaWxlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZpbGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZpbGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZpbGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGaWxlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZpbGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGaWxlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIEZpbGUgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihGaWxlIHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPEZpbGUsIEJ1aWxkZXI+IHsNCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludGVybmFsIEJ1aWxkZXIoRmlsZSBjbG9uZUZyb20pIHsNCisgICAgICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisNCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgRmlsZSByZXN1bHQ7DQorDQorICAgICAgICAgIHByaXZhdGUgRmlsZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgRmlsZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBGaWxlKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgICAgICB9DQorDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBGaWxlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db21waWxlci5QbHVnaW5Qcm90by5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuVHlwZXMuRmlsZS5EZXNjcmlwdG9yOyB9DQorICAgICAgICAgIH0NCisNCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEZpbGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db21waWxlci5QbHVnaW5Qcm90by5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuVHlwZXMuRmlsZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRmlsZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisNCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciBpcyBGaWxlKSB7DQorICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChGaWxlKSBvdGhlcik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRmlsZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlc3BvbnNlLlR5cGVzLkZpbGUuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNOYW1lKSB7DQorICAgICAgICAgICAgICBOYW1lID0gb3RoZXIuTmFtZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0luc2VydGlvblBvaW50KSB7DQorICAgICAgICAgICAgICBJbnNlcnRpb25Qb2ludCA9IG90aGVyLkluc2VydGlvblBvaW50Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzQ29udGVudCkgew0KKyAgICAgICAgICAgICAgQ29udGVudCA9IG90aGVyLkNvbnRlbnQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9maWxlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgICAgICB0YWcgPSBfZmlsZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc05hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQubmFtZV8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTg6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzSW5zZXJ0aW9uUG9pbnQgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuaW5zZXJ0aW9uUG9pbnRfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDEyMjogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNDb250ZW50ID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmNvbnRlbnRfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorDQorDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc05hbWUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTmFtZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OYW1lOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0TmFtZSh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXROYW1lKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzTmFtZSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0Lm5hbWVfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOYW1lKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc05hbWUgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQubmFtZV8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNJbnNlcnRpb25Qb2ludCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNJbnNlcnRpb25Qb2ludDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgSW5zZXJ0aW9uUG9pbnQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSW5zZXJ0aW9uUG9pbnQ7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRJbnNlcnRpb25Qb2ludCh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRJbnNlcnRpb25Qb2ludChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0luc2VydGlvblBvaW50ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuaW5zZXJ0aW9uUG9pbnRfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJJbnNlcnRpb25Qb2ludCgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNJbnNlcnRpb25Qb2ludCA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5pbnNlcnRpb25Qb2ludF8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNDb250ZW50IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0NvbnRlbnQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgc3RyaW5nIENvbnRlbnQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQ29udGVudDsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldENvbnRlbnQodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Q29udGVudChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0NvbnRlbnQgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5jb250ZW50XyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQ29udGVudCgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNDb250ZW50ID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmNvbnRlbnRfID0gIiI7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0YXRpYyBGaWxlKCkgew0KKyAgICAgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db21waWxlci5QbHVnaW5Qcm90by5QbHVnaW4uRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisNCisgICAgcHVibGljIGNvbnN0IGludCBFcnJvckZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0Vycm9yOw0KKyAgICBwcml2YXRlIHN0cmluZyBlcnJvcl8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRXJyb3Igew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNFcnJvcjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRXJyb3Igew0KKyAgICAgIGdldCB7IHJldHVybiBlcnJvcl87IH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpbGVGaWVsZE51bWJlciA9IDE1Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db21waWxlci5QbHVnaW5Qcm90by5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuVHlwZXMuRmlsZT4gZmlsZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBpbGVyLlBsdWdpblByb3RvLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5UeXBlcy5GaWxlPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlc3BvbnNlLlR5cGVzLkZpbGU+IEZpbGVMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmlsZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpbGVDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpbGVfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db21waWxlci5QbHVnaW5Qcm90by5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuVHlwZXMuRmlsZSBHZXRGaWxlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBmaWxlX1tpbmRleF07DQorICAgIH0NCisNCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgaW50IHNpemUgPSBTZXJpYWxpemVkU2l6ZTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9jb2RlR2VuZXJhdG9yUmVzcG9uc2VGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNFcnJvcikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzBdLCBFcnJvcik7DQorICAgICAgfQ0KKyAgICAgIGlmIChmaWxlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSgxNSwgZmllbGRfbmFtZXNbMV0sIGZpbGVfKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKw0KKyAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICBpZiAoaGFzRXJyb3IpIHsNCisgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMSwgRXJyb3IpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBpbGVyLlBsdWdpblByb3RvLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5UeXBlcy5GaWxlIGVsZW1lbnQgaW4gRmlsZUxpc3QpIHsNCisgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDE1LCBlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgQ29kZUdlbmVyYXRvclJlc3BvbnNlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvZGVHZW5lcmF0b3JSZXNwb25zZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvZGVHZW5lcmF0b3JSZXNwb25zZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29kZUdlbmVyYXRvclJlc3BvbnNlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvZGVHZW5lcmF0b3JSZXNwb25zZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29kZUdlbmVyYXRvclJlc3BvbnNlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvZGVHZW5lcmF0b3JSZXNwb25zZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgQ29kZUdlbmVyYXRvclJlc3BvbnNlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICBmaWxlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQ29kZUdlbmVyYXRvclJlc3BvbnNlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8Q29kZUdlbmVyYXRvclJlc3BvbnNlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihDb2RlR2VuZXJhdG9yUmVzcG9uc2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgcmVzdWx0Ow0KKw0KKyAgICAgIHByaXZhdGUgQ29kZUdlbmVyYXRvclJlc3BvbnNlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgQ29kZUdlbmVyYXRvclJlc3BvbnNlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKw0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKw0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisNCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlc3BvbnNlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorDQorICAgICAgcHVibGljIG92ZXJyaWRlIENvZGVHZW5lcmF0b3JSZXNwb25zZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisNCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29kZUdlbmVyYXRvclJlc3BvbnNlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKw0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBDb2RlR2VuZXJhdG9yUmVzcG9uc2UpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoQ29kZUdlbmVyYXRvclJlc3BvbnNlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oQ29kZUdlbmVyYXRvclJlc3BvbnNlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBpbGVyLlBsdWdpblByb3RvLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNFcnJvcikgew0KKyAgICAgICAgICBFcnJvciA9IG90aGVyLkVycm9yOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLmZpbGVfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LmZpbGVfLkFkZChvdGhlci5maWxlXyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisNCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisNCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9jb2RlR2VuZXJhdG9yUmVzcG9uc2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfY29kZUdlbmVyYXRvclJlc3BvbnNlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRXJyb3IgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZXJyb3JfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEyMjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5maWxlXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBpbGVyLlBsdWdpblByb3RvLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5UeXBlcy5GaWxlLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisNCisNCisgICAgICBwdWJsaWMgYm9vbCBIYXNFcnJvciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0Vycm9yOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRXJyb3Igew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5FcnJvcjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RXJyb3IodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEVycm9yKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRXJyb3IgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmVycm9yXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRXJyb3IoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0Vycm9yID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZXJyb3JfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlc3BvbnNlLlR5cGVzLkZpbGU+IEZpbGVMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmZpbGVfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmlsZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmlsZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlc3BvbnNlLlR5cGVzLkZpbGUgR2V0RmlsZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0RmlsZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpbGUoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlc3BvbnNlLlR5cGVzLkZpbGUgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpbGVfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpbGUoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlc3BvbnNlLlR5cGVzLkZpbGUuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmlsZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmlsZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlc3BvbnNlLlR5cGVzLkZpbGUgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpbGVfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmlsZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlc3BvbnNlLlR5cGVzLkZpbGUuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmlsZV8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUZpbGUoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGlsZXIuUGx1Z2luUHJvdG8uQ29kZUdlbmVyYXRvclJlc3BvbnNlLlR5cGVzLkZpbGU+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWxlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpbGUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpbGVfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIENvZGVHZW5lcmF0b3JSZXNwb25zZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db21waWxlci5QbHVnaW5Qcm90by5QbHVnaW4uRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisNCisgICNlbmRyZWdpb24NCisNCit9DQorDQorI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4vUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IuY3MgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL1ByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTBkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL1ByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yLmNzCkBAIC0wLDAgKzEsMTQwIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbg0KK3sNCisgICAgLy8gVE9ETyhqb25za2VldCk6IFJlZmFjdG9yIHRoaXMuIFRoZXJlJ3MgbG9hZHMgb2YgY29tbW9uIGNvZGUgaGVyZS4NCisgICAgaW50ZXJuYWwgY2xhc3MgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IgOiBGaWVsZEdlbmVyYXRvckJhc2UsIElGaWVsZFNvdXJjZUdlbmVyYXRvcg0KKyAgICB7DQorICAgICAgICBpbnRlcm5hbCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciwgaW50IGZpZWxkT3JkaW5hbCkNCisgICAgICAgICAgICA6IGJhc2UoZGVzY3JpcHRvciwgZmllbGRPcmRpbmFsKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVNZW1iZXJzKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInByaXZhdGUgYm9vbCBoYXN7MH07IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwcml2YXRlIHswfSB7MX1fezJ9OyIsIFR5cGVOYW1lLCBOYW1lLCBIYXNEZWZhdWx0VmFsdWUgPyAiID0gIiArIERlZmF1bHRWYWx1ZSA6ICIiKTsNCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBib29sIEhhc3swfSB7eyIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBnZXQge3sgcmV0dXJuIGhhc3swfTsgfX0iLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICBBZGRQdWJsaWNNZW1iZXJBdHRyaWJ1dGVzKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHswfSB7MX0ge3siLCBUeXBlTmFtZSwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGdldCB7eyByZXR1cm4gezB9XzsgfX0iLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFkZERlcHJlY2F0ZWRGbGFnKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIGJvb2wgSGFzezB9IHt7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGdldCB7eyByZXR1cm4gcmVzdWx0Lmhhc3swfTsgfX0iLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICBBZGRQdWJsaWNNZW1iZXJBdHRyaWJ1dGVzKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHswfSB7MX0ge3siLCBUeXBlTmFtZSwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGdldCB7eyByZXR1cm4gcmVzdWx0LnswfTsgfX0iLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgc2V0IHt7IFNldHswfSh2YWx1ZSk7IH19IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgQWRkUHVibGljTWVtYmVyQXR0cmlidXRlcyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBCdWlsZGVyIFNldHswfSh7MX0gdmFsdWUpIHt7IiwgUHJvcGVydHlOYW1lLCBUeXBlTmFtZSk7DQorICAgICAgICAgICAgQWRkTnVsbENoZWNrKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBQcmVwYXJlQnVpbGRlcigpOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmVzdWx0Lmhhc3swfSA9IHRydWU7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdC57MH1fID0gdmFsdWU7IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gdGhpczsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgQWRkRGVwcmVjYXRlZEZsYWcod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgQnVpbGRlciBDbGVhcnswfSgpIHt7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIFByZXBhcmVCdWlsZGVyKCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXN1bHQuaGFzezB9ID0gZmFsc2U7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdC57MH1fID0gezF9OyIsIE5hbWUsIERlZmF1bHRWYWx1ZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gdGhpczsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlmIChvdGhlci5IYXN7MH0pIHt7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHswfSA9IG90aGVyLnswfTsiLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZSBmb3IgcHJpbWl0aXZlIHR5cGVzDQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInJlc3VsdC5oYXN7MH0gPSBpbnB1dC5SZWFkezF9KHJlZiByZXN1bHQuezJ9Xyk7IiwgUHJvcGVydHlOYW1lLCBDYXBpdGFsaXplZFR5cGVOYW1lLCBOYW1lKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYgKGhhc3swfSkge3siLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgb3V0cHV0LldyaXRlezB9KHsxfSwgZmllbGRfbmFtZXNbezN9XSwgezJ9KTsiLCBDYXBpdGFsaXplZFR5cGVOYW1lLCBOdW1iZXIsIFByb3BlcnR5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkT3JkaW5hbCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYgKGhhc3swfSkge3siLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZXswfVNpemUoezF9LCB7Mn0pOyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXBpdGFsaXplZFR5cGVOYW1lLCBOdW1iZXIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVIYXNoKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlmIChoYXN7MH0pIGhhc2ggXj0gezF9Xy5HZXRIYXNoQ29kZSgpOyIsIFByb3BlcnR5TmFtZSwgTmFtZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUVxdWFscyhUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpZiAoaGFzezB9ICE9IG90aGVyLmhhc3swfSB8fCAoaGFzezB9ICYmICF7MX1fLkVxdWFscyhvdGhlci57MX1fKSkpIHJldHVybiBmYWxzZTsiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlOYW1lLCBOYW1lKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG9TdHJpbmcoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiUHJpbnRGaWVsZChcInswfVwiLCBoYXN7MX0sIHsyfV8sIHdyaXRlcik7IiwgRGVzY3JpcHRvci5OYW1lLCBQcm9wZXJ0eU5hbWUsIE5hbWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4vUHJvZ3JhbS5jcyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTFkMzJlCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsMTA1IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBpbGVyLlBsdWdpblByb3RvOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3RvczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbg0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gRW50cnkgcG9pbnQgZm9yIHRoZSBQcm90b2NvbCBCdWZmZXJzIGdlbmVyYXRvci4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgaW50ZXJuYWwgY2xhc3MgUHJvZ3JhbQ0KKyAgICB7DQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgaW50IE1haW4oc3RyaW5nW10gYXJncykNCisgICAgICAgIHsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIEhhY2sgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcncyBpbml0aWFsaXplZA0KKyAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG9GaWxlLkRlc2NyaXB0b3IuVG9TdHJpbmcoKTsNCisgICAgICAgICAgICAgICAgR2VuZXJhdG9yT3B0aW9ucyBvcHRpb25zID0gbmV3IEdlbmVyYXRvck9wdGlvbnMge0FyZ3VtZW50cyA9IGFyZ3N9Ow0KKw0KKyAgICAgICAgICAgICAgICBJTGlzdDxzdHJpbmc+IHZhbGlkYXRpb25GYWlsdXJlczsNCisgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLlRyeVZhbGlkYXRlKG91dCB2YWxpZGF0aW9uRmFpbHVyZXMpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IGdvdCB0aGUgbWVzc2FnZS1idWlsZGluZyBsb2dpYyBpbiB0aGUgZXhjZXB0aW9uLi4uDQorICAgICAgICAgICAgICAgICAgICBJbnZhbGlkT3B0aW9uc0V4Y2VwdGlvbiBleGNlcHRpb24gPSBuZXcgSW52YWxpZE9wdGlvbnNFeGNlcHRpb24odmFsaWRhdGlvbkZhaWx1cmVzKTsNCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Y2VwdGlvbi5NZXNzYWdlKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gbmV3IENvZGVHZW5lcmF0b3JSZXF1ZXN0LkJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGlucHV0RmlsZSBpbiBvcHRpb25zLklucHV0RmlsZXMpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgICAgICAgICAgICAgIENTaGFycE9wdGlvbnMuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gaW5wdXRTdHJlYW0gPSBGaWxlLk9wZW5SZWFkKGlucHV0RmlsZSkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVTZXQgPSBGaWxlRGVzY3JpcHRvclNldC5QYXJzZUZyb20oaW5wdXRTdHJlYW0sIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZmlsZVByb3RvIGluIGZpbGVTZXQuRmlsZUxpc3QpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LkFkZEZpbGVUb0dlbmVyYXRlKGZpbGVQcm90by5OYW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5BZGRQcm90b0ZpbGUoZmlsZVByb3RvKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgR2VuZXJhdG9yIGdlbmVyYXRvciA9IEdlbmVyYXRvci5DcmVhdGVHZW5lcmF0b3Iob3B0aW9ucyk7DQorICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IG5ldyBDb2RlR2VuZXJhdG9yUmVzcG9uc2UuQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgICBnZW5lcmF0b3IuR2VuZXJhdGUocmVxdWVzdC5CdWlsZCgpLCByZXNwb25zZSk7DQorICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5IYXNFcnJvcikNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihyZXNwb25zZS5FcnJvcik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZpbGUgaW4gcmVzcG9uc2UuRmlsZUxpc3QpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KGZpbGUuTmFtZSwgZmlsZS5Db250ZW50KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIkVycm9yOiB7MH0iLCBlLk1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgiRGV0YWlsZWQgZXhjZXB0aW9uIGluZm9ybWF0aW9uOiB7MH0iLCBlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4vUHJvZ3JhbVByZXByb2Nlc3MuY3MgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL1Byb2dyYW1QcmVwcm9jZXNzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0M2UxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL1Byb2dyYW1QcmVwcm9jZXNzLmNzCkBAIC0wLDAgKzEsMjc2IEBACit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW4NCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFByZXByb2Nlc3NlcyBhbnkgaW5wdXQgZmlsZXMgd2l0aCBhbiBleHRlbnNpb24gb2YgJy5wcm90bycgYnkgcnVubmluZyBwcm90b2MuZXhlLiAgSWYgYXJndW1lbnRzDQorICAgIC8vLyBhcmUgc3VwcGxpZWQgd2l0aCAnLS0nIHByZWZpeCB0aGV5IGFyZSBwcm92aWRlZCB0byBwcm90b2MuZXhlLCBvdGhlcndpc2UgdGhleSBhcmUgYXNzdW1lZCB0bw0KKyAgICAvLy8gYmUgdXNlZCBmb3IgUHJvdG9HZW4uZXhlIHdoaWNoIGlzIHJ1biBvbiB0aGUgcmVzdWx0aW5nIG91dHB1dCBwcm90byBidWZmZXIuICBJZiB0aGUgb3B0aW9uDQorICAgIC8vLyAtLWRlc2NyaXB0b3Jfc2V0X291dD0gaXMgc3BlY2lmaWVkIHRoZSBwcm90byBidWZmZXIgZmlsZSBpcyBrZXB0LCBvdGhlcndpc2UgaXQgd2lsbCBiZSByZW1vdmVkDQorICAgIC8vLyBhZnRlciBjb2RlIGdlbmVyYXRpb24uDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtUHJlcHJvY2Vzcw0KKyAgICB7DQorICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBQcm90b2NFeGVjdXRhYmxlID0gInByb3RvYy5leGUiOw0KKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgUHJvdG9jRGlyZWN0b3J5QXJnID0gIi0tcHJvdG9jX2Rpcj0iOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IE1haW4oc3RyaW5nW10gYXJncykNCisgICAgICAgIHsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBFbnZpcm9ubWVudC5FeGl0Q29kZSA9IFJ1bihhcmdzKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKGV4KTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEVudmlyb25tZW50LkV4aXRDb2RlID0gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBSdW4ocGFyYW1zIHN0cmluZ1tdIGFyZ3MpDQorICAgICAgICB7DQorICAgICAgICAgICAgYm9vbCBkZWxldGVGaWxlID0gZmFsc2U7DQorICAgICAgICAgICAgc3RyaW5nIHRlbXBGaWxlID0gbnVsbDsNCisgICAgICAgICAgICBpbnQgcmVzdWx0Ow0KKyAgICAgICAgICAgIGJvb2wgZG9IZWxwID0gYXJncy5MZW5ndGggPT0gMDsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIExpc3Q8c3RyaW5nPiBwcm90b2NBcmdzID0gbmV3IExpc3Q8c3RyaW5nPigpOw0KKyAgICAgICAgICAgICAgICBMaXN0PHN0cmluZz4gcHJvdG9HZW5BcmdzID0gbmV3IExpc3Q8c3RyaW5nPigpOw0KKw0KKyAgICAgICAgICAgICAgICBzdHJpbmcgcHJvdG9jRmlsZSA9IEd1ZXNzUHJvdG9jRmlsZShhcmdzKTsNCisNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGFyZyBpbiBhcmdzKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBkb0hlbHAgfD0gU3RyaW5nQ29tcGFyZXIuT3JkaW5hbElnbm9yZUNhc2UuRXF1YWxzKGFyZywgIi8/Iik7DQorICAgICAgICAgICAgICAgICAgICBkb0hlbHAgfD0gU3RyaW5nQ29tcGFyZXIuT3JkaW5hbElnbm9yZUNhc2UuRXF1YWxzKGFyZywgIi9oZWxwIik7DQorICAgICAgICAgICAgICAgICAgICBkb0hlbHAgfD0gU3RyaW5nQ29tcGFyZXIuT3JkaW5hbElnbm9yZUNhc2UuRXF1YWxzKGFyZywgIi0/Iik7DQorICAgICAgICAgICAgICAgICAgICBkb0hlbHAgfD0gU3RyaW5nQ29tcGFyZXIuT3JkaW5hbElnbm9yZUNhc2UuRXF1YWxzKGFyZywgIi1oZWxwIik7DQorDQorICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLlN0YXJ0c1dpdGgoIi0tZGVzY3JpcHRvcl9zZXRfb3V0PSIpKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBGaWxlID0gYXJnLlN1YnN0cmluZygiLS1kZXNjcmlwdG9yX3NldF9vdXQ9Ii5MZW5ndGgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvR2VuQXJncy5BZGQodGVtcEZpbGUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIGlmIChkb0hlbHApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7DQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUFJPVE9DLmV4ZTogVXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMgdGhhdCBiZWdpbiB3aXRoICctLSc6Iik7DQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgUnVuUHJvdG9jKHByb3RvY0ZpbGUsICItLWhlbHAiKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoZXguTWVzc2FnZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsNCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJQUk9UT0dFTi5leGU6IFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgdXNlZCB0byBzcGVjaWZ5IGRlZmF1bHRzIGZvciBjb2RlIGdlbmVyYXRpb24uIik7DQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbS5NYWluKG5ldyBzdHJpbmdbMF0pOw0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsNCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUaGUgZm9sbG93aW5nIG9wdGlvbiBlbmFibGVzIFBST1RPR0VOLmV4ZSB0byBmaW5kIFBST1RPQy5leGUiKTsNCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ7MH08ZGlyZWN0b3J5IGNvbnRhaW5pbmcgcHJvdG9jLmV4ZT4iLCBQcm90b2NEaXJlY3RvcnlBcmcpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgc3RyaW5nIHBhdGhSb290ID0gRW52aXJvbm1lbnQuQ3VycmVudERpcmVjdG9yeTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaChzdHJpbmcgYXJnIGluIGFyZ3MpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChhcmcuU3RhcnRzV2l0aCgiLS1wcm90b19wYXRoPSIsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhSb290ID0gYXJnLlN1YnN0cmluZygxMyk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGFyZyBpbiBhcmdzKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLlN0YXJ0c1dpdGgoUHJvdG9jRGlyZWN0b3J5QXJnKSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGVkIGVhcmxpZXINCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChhcmcuU3RhcnRzV2l0aCgiLS0iKSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NBcmdzLkFkZChhcmcpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKEZpbGUuRXhpc3RzKGFyZykgfHwgRmlsZS5FeGlzdHMoUGF0aC5Db21iaW5lKHBhdGhSb290LCBhcmcpKSkgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbXBhcmVyLk9yZGluYWxJZ25vcmVDYXNlLkVxdWFscygiLnByb3RvIiwgUGF0aC5HZXRFeHRlbnNpb24oYXJnKSkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBGaWxlID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEZpbGUgPSBQYXRoLkdldFRlbXBGaWxlTmFtZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NBcmdzLkFkZChTdHJpbmcuRm9ybWF0KCItLWRlc2NyaXB0b3Jfc2V0X291dD17MH0iLCB0ZW1wRmlsZSkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b0dlbkFyZ3MuQWRkKHRlbXBGaWxlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHBhdGhhcmcgPSBhcmc7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGaWxlLkV4aXN0cyhwYXRoYXJnKSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhhcmcgPSBQYXRoLkNvbWJpbmUocGF0aFJvb3QsIGFyZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY0FyZ3MuQWRkKHBhdGhhcmcpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvR2VuQXJncy5BZGQoYXJnKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBpZiAodGVtcEZpbGUgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUnVuUHJvdG9jKHByb3RvY0ZpbGUsIHByb3RvY0FyZ3MuVG9BcnJheSgpKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gMCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFByb2dyYW0uTWFpbihwcm90b0dlbkFyZ3MuVG9BcnJheSgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZmluYWxseQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGRlbGV0ZUZpbGUgJiYgdGVtcEZpbGUgIT0gbnVsbCAmJiBGaWxlLkV4aXN0cyh0ZW1wRmlsZSkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEZpbGUuRGVsZXRlKHRlbXBGaWxlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRyaWVzIHRvIHdvcmsgb3V0IHdoZXJlIHByb3RvYyBpcyBiYXNlZCBvbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLCB0aGUgY3VycmVudA0KKyAgICAgICAgLy8vIGRpcmVjdG9yeSwgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHByb3RvZ2VuLCBhbmQgdGhlIHBhdGguDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBwYXRoIHRvIHByb3RvYy5leGUsIG9yIG51bGwgaWYgaXQgY2FuJ3QgYmUgZm91bmQuPC9yZXR1cm5zPg0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEd1ZXNzUHJvdG9jRmlsZShwYXJhbXMgc3RyaW5nW10gYXJncykNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBXaHkgb2ggd2h5IGlzIHRoaXMgbm90IGluIFN5c3RlbS5JTy5QYXRoIG9yIEVudmlyb25tZW50Li4uPw0KKyAgICAgICAgICAgIExpc3Q8c3RyaW5nPiBzZWFyY2hQYXRoID0gbmV3IExpc3Q8c3RyaW5nPigpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBhcmcgaW4gYXJncykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChhcmcuU3RhcnRzV2l0aCgiLS1wcm90b2NfZGlyPSIpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBzZWFyY2hQYXRoLkFkZChhcmcuU3Vic3RyaW5nKFByb3RvY0RpcmVjdG9yeUFyZy5MZW5ndGgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzZWFyY2hQYXRoLkFkZChFbnZpcm9ubWVudC5DdXJyZW50RGlyZWN0b3J5KTsNCisgICAgICAgICAgICBzZWFyY2hQYXRoLkFkZChBcHBEb21haW4uQ3VycmVudERvbWFpbi5CYXNlRGlyZWN0b3J5KTsNCisgICAgICAgICAgICBzZWFyY2hQYXRoLkFkZFJhbmdlKChFbnZpcm9ubWVudC5HZXRFbnZpcm9ubWVudFZhcmlhYmxlKCJQQVRIIikgPz8gU3RyaW5nLkVtcHR5KS5TcGxpdChQYXRoLlBhdGhTZXBhcmF0b3IpKTsNCisNCisgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgcGF0aCBpbiBzZWFyY2hQYXRoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3RyaW5nIGV4ZUZpbGUgPSBQYXRoLkNvbWJpbmUocGF0aCwgUHJvdG9jRXhlY3V0YWJsZSk7DQorICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhleGVGaWxlKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZUZpbGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgUnVuUHJvdG9jKHN0cmluZyBleGVGaWxlLCBwYXJhbXMgc3RyaW5nW10gYXJncykNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZXhlRmlsZSA9PSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gbG9jYXRlICIgKyBQcm90b2NFeGVjdXRhYmxlICsNCisgICAgICAgICAgICAgICAgICAgICIgbWFrZSBzdXJlIGl0IGlzIGluIHRoZSBQQVRILCBjd2QsIG9yIGV4ZSBkaXIsIG9yIHVzZSAtLXByb3RvY19kaXI9Li4uIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIFByb2Nlc3NTdGFydEluZm8gcHNpID0gbmV3IFByb2Nlc3NTdGFydEluZm8oZXhlRmlsZSk7DQorICAgICAgICAgICAgcHNpLkFyZ3VtZW50cyA9IEVzY2FwZUFyZ3VtZW50cyhhcmdzKTsNCisgICAgICAgICAgICBwc2kuUmVkaXJlY3RTdGFuZGFyZEVycm9yID0gdHJ1ZTsNCisgICAgICAgICAgICBwc2kuUmVkaXJlY3RTdGFuZGFyZElucHV0ID0gZmFsc2U7DQorICAgICAgICAgICAgcHNpLlJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgPSB0cnVlOw0KKyAgICAgICAgICAgIHBzaS5FcnJvckRpYWxvZyA9IGZhbHNlOw0KKyAgICAgICAgICAgIHBzaS5DcmVhdGVOb1dpbmRvdyA9IHRydWU7DQorICAgICAgICAgICAgcHNpLlVzZVNoZWxsRXhlY3V0ZSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHBzaS5Xb3JraW5nRGlyZWN0b3J5ID0gRW52aXJvbm1lbnQuQ3VycmVudERpcmVjdG9yeTsNCisNCisgICAgICAgICAgICBQcm9jZXNzIHByb2Nlc3MgPSBQcm9jZXNzLlN0YXJ0KHBzaSk7DQorICAgICAgICAgICAgaWYgKHByb2Nlc3MgPT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwcm9jZXNzLldhaXRGb3JFeGl0KCk7DQorDQorICAgICAgICAgICAgc3RyaW5nIHRtcCA9IHByb2Nlc3MuU3RhbmRhcmRPdXRwdXQuUmVhZFRvRW5kKCk7DQorICAgICAgICAgICAgaWYgKHRtcC5UcmltKCkuTGVuZ3RoID4gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSh0bXApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0bXAgPSBwcm9jZXNzLlN0YW5kYXJkRXJyb3IuUmVhZFRvRW5kKCk7DQorICAgICAgICAgICAgaWYgKHRtcC5UcmltKCkuTGVuZ3RoID4gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgcHJvdG9jIG91dHB1dCB3aXRoIHNvbWV0aGluZyBtb3JlIGFtZW5hYmxlIHRvIFZpc3VhbCBTdHVkaW8uDQorICAgICAgICAgICAgICAgIHZhciByZWdleE1zdnMgPSBuZXcgUmVnZXgoQCIoLiopXCgoXGQrKVwpLiogY29sdW1uPShcZCspXHMqOlxzKiguKikiKTsNCisgICAgICAgICAgICAgICAgdG1wID0gcmVnZXhNc3ZzLlJlcGxhY2UodG1wLCAiJDEoJDIsJDMpOiBlcnJvciBDUzk5OTk6ICQ0Iik7DQorICAgICAgICAgICAgICAgIHZhciByZWdleEdjYyA9IG5ldyBSZWdleChAIiguKik6KFxkKyk6KFxkKyk6XHMqKC4qKSIpOw0KKyAgICAgICAgICAgICAgICB0bXAgPSByZWdleEdjYy5SZXBsYWNlKHRtcCwgIiQxKCQyLCQzKTogZXJyb3IgQ1M5OTk5OiAkNCIpOw0KKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSh0bXApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5FeGl0Q29kZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBRdW90ZXMgYWxsIGFyZ3VtZW50cyB0aGF0IGNvbnRhaW4gd2hpdGVzcGFjZSwgb3IgYmVnaW4gd2l0aCBhIHF1b3RlIGFuZCByZXR1cm5zIGEgc2luZ2xlDQorICAgICAgICAvLy8gYXJndW1lbnQgc3RyaW5nIGZvciB1c2Ugd2l0aCBQcm9jZXNzLlN0YXJ0KCkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPmh0dHA6Ly9jc2hhcnB0ZXN0Lm5ldC8/cD01Mjk8L3JlbWFya3M+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFyZ3MiPkEgbGlzdCBvZiBzdHJpbmdzIGZvciBhcmd1bWVudHMsIG1heSBub3QgY29udGFpbiBudWxsLCAnXDAnLCAnXHInLCBvciAnXG4nPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgY29tYmluZWQgbGlzdCBvZiBlc2NhcGVkL3F1b3RlZCBzdHJpbmdzPC9yZXR1cm5zPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+UmFpc2VkIHdoZW4gb25lIG9mIHRoZSBhcmd1bWVudHMgaXMgbnVsbDwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iU3lzdGVtLkFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiI+UmFpc2VkIGlmIGFuIGFyZ3VtZW50IGNvbnRhaW5zICdcMCcsICdccicsIG9yICdcbic8L2V4Y2VwdGlvbj4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEVzY2FwZUFyZ3VtZW50cyhwYXJhbXMgc3RyaW5nW10gYXJncykNCisgICAgICAgIHsNCisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQorICAgICAgICAgICAgUmVnZXggaW52YWxpZENoYXIgPSBuZXcgUmVnZXgoIltceDAwXHgwYVx4MGRdIik7Ly8gIHRoZXNlIGNhbiBub3QgYmUgZXNjYXBlZA0KKyAgICAgICAgICAgIFJlZ2V4IG5lZWRzUXVvdGVzID0gbmV3IFJlZ2V4KEAiXHN8IiIiKTsvLyAgICAgICAgICBjb250YWlucyB3aGl0ZXNwYWNlIG9yIHR3byBxdW90ZSBjaGFyYWN0ZXJzDQorICAgICAgICAgICAgUmVnZXggZXNjYXBlUXVvdGUgPSBuZXcgUmVnZXgoQCIoXFwqKSgiInwkKSIpOy8vICAgIG9uZSBvciBtb3JlICdcJyBmb2xsb3dlZCB3aXRoIGEgcXVvdGUgb3IgZW5kIG9mIHN0cmluZw0KKyAgICAgICAgICAgIGZvciAoaW50IGNhcmcgPSAwOyBhcmdzICE9IG51bGwgJiYgY2FyZyA8IGFyZ3MuTGVuZ3RoOyBjYXJnKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoYXJnc1tjYXJnXSA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJhcmdzWyIgKyBjYXJnICsgIl0iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoaW52YWxpZENoYXIuSXNNYXRjaChhcmdzW2NhcmddKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiYXJnc1siICsgY2FyZyArICJdIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKGFyZ3NbY2FyZ10gPT0gU3RyaW5nLkVtcHR5KQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMuQXBwZW5kKCJcIlwiIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIW5lZWRzUXVvdGVzLklzTWF0Y2goYXJnc1tjYXJnXSkpIHsgYXJndW1lbnRzLkFwcGVuZChhcmdzW2NhcmddKTsgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5BcHBlbmQoJyInKTsNCisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5BcHBlbmQoZXNjYXBlUXVvdGUuUmVwbGFjZShhcmdzW2NhcmddLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLkdyb3Vwc1sxXS5WYWx1ZSArIG0uR3JvdXBzWzFdLlZhbHVlICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobS5Hcm91cHNbMl0uVmFsdWUgPT0gIlwiIiA/ICJcXFwiIiA6ICIiKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7DQorICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMuQXBwZW5kKCciJyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKGNhcmcgKyAxIDwgYXJncy5MZW5ndGgpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5BcHBlbmQoJyAnKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLlRvU3RyaW5nKCk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b0dlbi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1ODk0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSwyOSBAQAordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOw0KKw0KKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgDQorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24NCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuDQorDQorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJQcm90b0dlbiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiUHJvdG9HZW4iKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMDgiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildDQorDQorLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoNCisvLw0KKy8vICAgICAgTWFqb3IgVmVyc2lvbg0KKy8vICAgICAgTWlub3IgVmVyc2lvbiANCisvLyAgICAgIEJ1aWxkIE51bWJlcg0KKy8vICAgICAgUmV2aXNpb24NCisvLw0KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzIA0KKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6DQorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjIuNC4xLjU1NSIpXQ0KKw0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIyLjQuMS41NTUiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjIuNC4xLjU1NSIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4vUHJvdG9HZW4uY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9Qcm90b0dlbi5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlNDRhZQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vUHJvdG9HZW4uY3Nwcm9qCkBAIC0wLDAgKzEsOTggQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQzNTwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPnsyNTBBREUzNC04MkZELTRCQUUtODZENS05ODVGQkU1ODlDNEF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW48L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+UHJvdG9HZW48L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPFN0YXJ0dXBPYmplY3Q+R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbi5Qcm9ncmFtUHJlcHJvY2VzczwvU3RhcnR1cE9iamVjdD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDM1XERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yVXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRW51bUZpZWxkR2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbnVtR2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25HZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkR2VuZXJhdG9yQmFzZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUZpZWxkU291cmNlR2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJU291cmNlR2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlRmllbGRHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlBsdWdpblByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW1QcmVwcm9jZXNzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZpY2VHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRvck9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkhlbHBlcnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkludmFsaWRPcHRpb25zRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9ncmFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmljZUludGVyZmFjZUdlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU291cmNlR2VuZXJhdG9yQmFzZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU291cmNlR2VuZXJhdG9ycy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW1icmVsbGFDbGFzc0dlbmVyYXRvci5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJhcHAuY29uZmlnIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b0dlbi9Qcm90b2NHZW5Dcy5jcyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vUHJvdG9jR2VuQ3MuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyNjQyMAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vUHJvdG9jR2VuQ3MuY3MKQEAgLTAsMCArMSw3NiBAQAordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Db21waWxlci5QbHVnaW5Qcm90bzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3M7DQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KKw0KKy8vIFVzYWdlIGV4YW1wbGU6DQorLy8gICBwcm90b2MuZXhlDQorLy8gICAgIC0tcGx1Z2luPXBhdGhcdG9ccHJvdG9jLWdlbi1jcy5leGUNCisvLyAgICAgLS1jc19vdXQ9Ii1nZW5lcmF0ZWRfY29kZV9hdHRyaWJ1dGVzPXRydWUgdW1icmVsbGFfbmFtZXNwYWNlPVR1dG9yaWFsUHJvdG8gOi4iDQorLy8gICAgIC0tcHJvdG9fcGF0aD0uXHByb3Rvc1wNCisvLyAgICAgcHJvdG9zXHR1dG9yaWFsXGFkZHJlc3Nib29rLnByb3RvDQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW4NCit7DQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvdG9jR2VuQ3MNCisgICAgew0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgUnVuKENvZGVHZW5lcmF0b3JSZXF1ZXN0IHJlcXVlc3QsIENvZGVHZW5lcmF0b3JSZXNwb25zZS5CdWlsZGVyIHJlc3BvbnNlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhciBhcmd1bWVudHMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7DQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiByZXF1ZXN0LlBhcmFtZXRlci5TcGxpdCgnICcpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFyIHRpbW1lZEFyZyA9IChhcmcgPz8gIiIpLlRyaW0oKTsNCisgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh0aW1tZWRBcmcpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMuQWRkKHRpbW1lZEFyZyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgLy8gQWRkaW5nIGZha2UgaW5wdXQgZmlsZSB0byBtYWtlIFRyeVZhbGlkYXRlIGhhcHB5Lg0KKyAgICAgICAgICAgIGFyZ3VtZW50cy5BZGQoU3lzdGVtLlJlZmxlY3Rpb24uQXNzZW1ibHkuR2V0RXhlY3V0aW5nQXNzZW1ibHkoKS5Mb2NhdGlvbik7DQorDQorICAgICAgICAgICAgR2VuZXJhdG9yT3B0aW9ucyBvcHRpb25zID0gbmV3IEdlbmVyYXRvck9wdGlvbnMNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFyZ3VtZW50cyA9IGFyZ3VtZW50cw0KKyAgICAgICAgICAgIH07DQorICAgICAgICAgICAgSUxpc3Q8c3RyaW5nPiB2YWxpZGF0aW9uRmFpbHVyZXM7DQorICAgICAgICAgICAgaWYgKCFvcHRpb25zLlRyeVZhbGlkYXRlKG91dCB2YWxpZGF0aW9uRmFpbHVyZXMpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmVzcG9uc2UuRXJyb3IgKz0gbmV3IEludmFsaWRPcHRpb25zRXhjZXB0aW9uKHZhbGlkYXRpb25GYWlsdXJlcykuTWVzc2FnZTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBHZW5lcmF0b3IgZ2VuZXJhdG9yID0gR2VuZXJhdG9yLkNyZWF0ZUdlbmVyYXRvcihvcHRpb25zKTsNCisgICAgICAgICAgICBnZW5lcmF0b3IuR2VuZXJhdGUocmVxdWVzdCwgcmVzcG9uc2UpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIEhhY2sgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcncyBpbml0aWFsaXplZA0KKyAgICAgICAgICAgIERlc2NyaXB0b3JQcm90b0ZpbGUuRGVzY3JpcHRvci5Ub1N0cmluZygpOw0KKyAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgICAgICBDU2hhcnBPcHRpb25zLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhleHRlbnNpb25SZWdpc3RyeSk7DQorDQorICAgICAgICAgICAgQ29kZUdlbmVyYXRvclJlcXVlc3QgcmVxdWVzdDsNCisgICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBuZXcgQ29kZUdlbmVyYXRvclJlc3BvbnNlLkJ1aWxkZXIoKTsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgaW5wdXQgPSBDb25zb2xlLk9wZW5TdGFuZGFyZElucHV0KCkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBDb2RlR2VuZXJhdG9yUmVxdWVzdC5QYXJzZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBSdW4ocmVxdWVzdCwgcmVzcG9uc2UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXNwb25zZS5FcnJvciArPSBlLlRvU3RyaW5nKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHVzaW5nICh2YXIgb3V0cHV0ID0gQ29uc29sZS5PcGVuU3RhbmRhcmRPdXRwdXQoKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJlc3BvbnNlLkJ1aWxkKCkuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgICAgICAgICBvdXRwdXQuRmx1c2goKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b0dlbi9SZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5ZjE3YgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IuY3MKQEAgLTAsMCArMSwyMTIgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvR2VuDQorew0KKyAgICBpbnRlcm5hbCBjbGFzcyBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvciA6IEZpZWxkR2VuZXJhdG9yQmFzZSwgSUZpZWxkU291cmNlR2VuZXJhdG9yDQorICAgIHsNCisgICAgICAgIGludGVybmFsIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBpbnQgZmllbGRPcmRpbmFsKQ0KKyAgICAgICAgICAgIDogYmFzZShkZXNjcmlwdG9yLCBmaWVsZE9yZGluYWwpDQorICAgICAgICB7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuSXNQYWNrZWQgJiYgT3B0aW1pemVTcGVlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInByaXZhdGUgaW50IHswfU1lbW9pemVkU2VyaWFsaXplZFNpemU7IiwgTmFtZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8ezB9PiB7MX1fID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHswfT4oKTsiLCBUeXBlTmFtZSwgTmFtZSk7DQorICAgICAgICAgICAgQWRkRGVwcmVjYXRlZEZsYWcod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgc2NnOjpJTGlzdDx7MH0+IHsxfUxpc3Qge3siLCBUeXBlTmFtZSwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGdldCB7eyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHswfV8pOyB9fSIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisNCisgICAgICAgICAgICAvLyBUT0RPKGpvbnNrZWV0KTogUmVkdW5kYW50IEFQSSBjYWxscz8gUG9zc2libHkgLSBpbmNsdWRlIGZvciBwb3J0YWJpbGl0eSB0aG91Z2guIE1heWJlIGNyZWF0ZSBhbiBvcHRpb24uDQorICAgICAgICAgICAgQWRkRGVwcmVjYXRlZEZsYWcod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgaW50IHswfUNvdW50IHt7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGdldCB7eyByZXR1cm4gezB9Xy5Db3VudDsgfX0iLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorDQorICAgICAgICAgICAgQWRkRGVwcmVjYXRlZEZsYWcod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgezB9IEdldHsxfShpbnQgaW5kZXgpIHt7IiwgVHlwZU5hbWUsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gezB9X1tpbmRleF07IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBOb3RlOiAgV2UgY2FuIHJldHVybiB0aGUgb3JpZ2luYWwgbGlzdCBoZXJlLCBiZWNhdXNlIHdlIG1ha2UgaXQgdW5tb2RpZmlhYmxlIHdoZW4gd2UgYnVpbGQNCisgICAgICAgICAgICAvLyBXZSByZXR1cm4gaXQgdmlhIElQb3BzaWNsZUxpc3Qgc28gdGhhdCBjb2xsZWN0aW9uIGluaXRpYWxpemVycyB3b3JrIG1vcmUgcGxlYXNhbnRseS4NCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8ezB9PiB7MX1MaXN0IHt7IiwgVHlwZU5hbWUsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBnZXQge3sgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuezB9XzsgfX0iLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgQWRkRGVwcmVjYXRlZEZsYWcod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgaW50IHswfUNvdW50IHt7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGdldCB7eyByZXR1cm4gcmVzdWx0LnswfUNvdW50OyB9fSIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIEFkZERlcHJlY2F0ZWRGbGFnKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHswfSBHZXR7MX0oaW50IGluZGV4KSB7eyIsIFR5cGVOYW1lLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuIHJlc3VsdC5HZXR7MH0oaW5kZXgpOyIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIEFkZERlcHJlY2F0ZWRGbGFnKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIEJ1aWxkZXIgU2V0ezB9KGludCBpbmRleCwgezF9IHZhbHVlKSB7eyIsIFByb3BlcnR5TmFtZSwgVHlwZU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgUHJlcGFyZUJ1aWxkZXIoKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdC57MH1fW2luZGV4XSA9IHZhbHVlOyIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuIHRoaXM7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIEFkZERlcHJlY2F0ZWRGbGFnKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIEJ1aWxkZXIgQWRkezB9KHsxfSB2YWx1ZSkge3siLCBQcm9wZXJ0eU5hbWUsIFR5cGVOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIFByZXBhcmVCdWlsZGVyKCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXN1bHQuezB9Xy5BZGQodmFsdWUpOyIsIE5hbWUsIFR5cGVOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybiB0aGlzOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlezB9KHNjZzo6SUVudW1lcmFibGU8ezF9PiB2YWx1ZXMpIHt7IiwgUHJvcGVydHlOYW1lLCBUeXBlTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBQcmVwYXJlQnVpbGRlcigpOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmVzdWx0LnswfV8uQWRkKHZhbHVlcyk7IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gdGhpczsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgQWRkRGVwcmVjYXRlZEZsYWcod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgQnVpbGRlciBDbGVhcnswfSgpIHt7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIFByZXBhcmVCdWlsZGVyKCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXN1bHQuezB9Xy5DbGVhcigpOyIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuIHRoaXM7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpZiAob3RoZXIuezB9Xy5Db3VudCAhPSAwKSB7eyIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmVzdWx0LnswfV8uQWRkKG90aGVyLnswfV8pOyIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInswfV8uTWFrZVJlYWRPbmx5KCk7IiwgTmFtZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInNjZzo6SUNvbGxlY3Rpb248b2JqZWN0PiB1bmtub3duSXRlbXM7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaW5wdXQuUmVhZEVudW1BcnJheTx7MH0+KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnsxfV8sIG91dCB1bmtub3duSXRlbXMpOyIsIFR5cGVOYW1lLCBOYW1lKTsNCisgICAgICAgICAgICBpZiAoIVVzZUxpdGVSdW50aW1lKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYgKHVua25vd25JdGVtcyAhPSBudWxsKSB7Iik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgeyIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOyIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIH0iKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBmb3JlYWNoIChvYmplY3QgcmF3VmFsdWUgaW4gdW5rbm93bkl0ZW1zKSIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgaWYgKHJhd1ZhbHVlIGlzIGludCkiKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICAgICAgdW5rbm93bkZpZWxkcy5NZXJnZVZhcmludEZpZWxkKHswfSwgKHVsb25nKShpbnQpcmF3VmFsdWUpOyIsIE51bWJlcik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlmICh7MH1fLkNvdW50ID4gMCkge3siLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuSXNQYWNrZWQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKA0KKyAgICAgICAgICAgICAgICAgICAgIm91dHB1dC5Xcml0ZVBhY2tlZEVudW1BcnJheSh7MH0sIGZpZWxkX25hbWVzW3syfV0sIHsxfU1lbW9pemVkU2VyaWFsaXplZFNpemUsIHsxfV8pOyIsIE51bWJlciwgTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIEZpZWxkT3JkaW5hbCwgRGVzY3JpcHRvci5GaWVsZFR5cGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJvdXRwdXQuV3JpdGVFbnVtQXJyYXkoezB9LCBmaWVsZF9uYW1lc1t7Mn1dLCB7MX1fKTsiLCBOdW1iZXIsIE5hbWUsIEZpZWxkT3JkaW5hbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yLkZpZWxkVHlwZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgieyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpbnQgZGF0YVNpemUgPSAwOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlmICh7MH1fLkNvdW50ID4gMCkge3siLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiZm9yZWFjaCAoezB9IGVsZW1lbnQgaW4gezF9Xykge3siLCBUeXBlTmFtZSwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplTm9UYWcoKGludCkgZWxlbWVudCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInNpemUgKz0gZGF0YVNpemU7Iik7DQorICAgICAgICAgICAgaW50IHRhZ1NpemUgPSBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVGFnU2l6ZShEZXNjcmlwdG9yLkZpZWxkTnVtYmVyKTsNCisgICAgICAgICAgICBpZiAoRGVzY3JpcHRvci5Jc1BhY2tlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInNpemUgKz0gezB9OyIsIHRhZ1NpemUpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlUmF3VmFyaW50MzJTaXplKCh1aW50KSBkYXRhU2l6ZSk7Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInNpemUgKz0gezB9ICogezF9Xy5Db3VudDsiLCB0YWdTaXplLCBOYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgLy8gY2FjaGUgdGhlIGRhdGEgc2l6ZSBmb3IgcGFja2VkIGZpZWxkcy4NCisgICAgICAgICAgICBpZiAoRGVzY3JpcHRvci5Jc1BhY2tlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInswfU1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsiLCBOYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUhhc2goVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiZm9yZWFjaCh7MH0gaSBpbiB7MX1fKSIsIFR5cGVOYW1lLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOyIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVFcXVhbHMoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYoezB9Xy5Db3VudCAhPSBvdGhlci57MH1fLkNvdW50KSByZXR1cm4gZmFsc2U7IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiZm9yKGludCBpeD0wOyBpeCA8IHswfV8uQ291bnQ7IGl4KyspIiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBpZighezB9X1tpeF0uRXF1YWxzKG90aGVyLnswfV9baXhdKSkgcmV0dXJuIGZhbHNlOyIsIE5hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUb1N0cmluZyhUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJQcmludEZpZWxkKFwiezB9XCIsIHsxfV8sIHdyaXRlcik7IiwgRGVzY3JpcHRvci5OYW1lLCBOYW1lKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvR2VuL1JlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yLmNzIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9SZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWEwMTQzCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9SZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvci5jcwpAQCAtMCwwICsxLDE4NCBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW4NCit7DQorICAgIGludGVybmFsIGNsYXNzIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yIDogRmllbGRHZW5lcmF0b3JCYXNlLCBJRmllbGRTb3VyY2VHZW5lcmF0b3INCisgICAgew0KKyAgICAgICAgaW50ZXJuYWwgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGludCBmaWVsZE9yZGluYWwpDQorICAgICAgICAgICAgOiBiYXNlKGRlc2NyaXB0b3IsIGZpZWxkT3JkaW5hbCkNCisgICAgICAgIHsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEdlbmVyYXRlTWVtYmVycyhUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHswfT4gezF9XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx7MH0+KCk7IiwgVHlwZU5hbWUsIE5hbWUpOw0KKyAgICAgICAgICAgIEFkZERlcHJlY2F0ZWRGbGFnKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHNjZzo6SUxpc3Q8ezB9PiB7MX1MaXN0IHt7IiwgVHlwZU5hbWUsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBnZXQge3sgcmV0dXJuIHswfV87IH19IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKw0KKyAgICAgICAgICAgIC8vIFRPRE8oam9uc2tlZXQpOiBSZWR1bmRhbnQgQVBJIGNhbGxzPyBQb3NzaWJseSAtIGluY2x1ZGUgZm9yIHBvcnRhYmlsaXR5IHRob3VnaC4gTWF5YmUgY3JlYXRlIGFuIG9wdGlvbi4NCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBpbnQgezB9Q291bnQge3siLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgZ2V0IHt7IHJldHVybiB7MH1fLkNvdW50OyB9fSIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisNCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyB7MH0gR2V0ezF9KGludCBpbmRleCkge3siLCBUeXBlTmFtZSwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybiB7MH1fW2luZGV4XTsiLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIE5vdGU6ICBXZSBjYW4gcmV0dXJuIHRoZSBvcmlnaW5hbCBsaXN0IGhlcmUsIGJlY2F1c2Ugd2UgbWFrZSBpdCB1bm1vZGlmaWFibGUgd2hlbiB3ZSBidWlsZA0KKyAgICAgICAgICAgIC8vIFdlIHJldHVybiBpdCB2aWEgSVBvcHNpY2xlTGlzdCBzbyB0aGF0IGNvbGxlY3Rpb24gaW5pdGlhbGl6ZXJzIHdvcmsgbW9yZSBwbGVhc2FudGx5Lg0KKyAgICAgICAgICAgIEFkZERlcHJlY2F0ZWRGbGFnKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx7MH0+IHsxfUxpc3Qge3siLCBUeXBlTmFtZSwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGdldCB7eyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS57MH1fOyB9fSIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBpbnQgezB9Q291bnQge3siLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgZ2V0IHt7IHJldHVybiByZXN1bHQuezB9Q291bnQ7IH19IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgQWRkRGVwcmVjYXRlZEZsYWcod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgezB9IEdldHsxfShpbnQgaW5kZXgpIHt7IiwgVHlwZU5hbWUsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gcmVzdWx0LkdldHswfShpbmRleCk7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgQWRkRGVwcmVjYXRlZEZsYWcod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgQnVpbGRlciBTZXR7MH0oaW50IGluZGV4LCB7MX0gdmFsdWUpIHt7IiwgUHJvcGVydHlOYW1lLCBUeXBlTmFtZSk7DQorICAgICAgICAgICAgQWRkTnVsbENoZWNrKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBQcmVwYXJlQnVpbGRlcigpOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmVzdWx0LnswfV9baW5kZXhdID0gdmFsdWU7IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gdGhpczsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgLy8gRXh0cmEgb3ZlcmxvYWQgZm9yIGJ1aWxkZXIgKGp1c3Qgb24gbWVzc2FnZXMpDQorICAgICAgICAgICAgQWRkRGVwcmVjYXRlZEZsYWcod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgQnVpbGRlciBTZXR7MH0oaW50IGluZGV4LCB7MX0uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHt7IiwgUHJvcGVydHlOYW1lLCBUeXBlTmFtZSk7DQorICAgICAgICAgICAgQWRkTnVsbENoZWNrKHdyaXRlciwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgUHJlcGFyZUJ1aWxkZXIoKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdC57MH1fW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOyIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuIHRoaXM7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIEFkZERlcHJlY2F0ZWRGbGFnKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIEJ1aWxkZXIgQWRkezB9KHsxfSB2YWx1ZSkge3siLCBQcm9wZXJ0eU5hbWUsIFR5cGVOYW1lKTsNCisgICAgICAgICAgICBBZGROdWxsQ2hlY2sod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIFByZXBhcmVCdWlsZGVyKCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXN1bHQuezB9Xy5BZGQodmFsdWUpOyIsIE5hbWUsIFR5cGVOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybiB0aGlzOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICAvLyBFeHRyYSBvdmVybG9hZCBmb3IgYnVpbGRlciAoanVzdCBvbiBtZXNzYWdlcykNCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBCdWlsZGVyIEFkZHswfSh7MX0uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHt7IiwgUHJvcGVydHlOYW1lLCBUeXBlTmFtZSk7DQorICAgICAgICAgICAgQWRkTnVsbENoZWNrKHdyaXRlciwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgUHJlcGFyZUJ1aWxkZXIoKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdC57MH1fLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gdGhpczsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgQWRkRGVwcmVjYXRlZEZsYWcod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgQnVpbGRlciBBZGRSYW5nZXswfShzY2c6OklFbnVtZXJhYmxlPHsxfT4gdmFsdWVzKSB7eyIsIFByb3BlcnR5TmFtZSwgVHlwZU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgUHJlcGFyZUJ1aWxkZXIoKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdC57MH1fLkFkZCh2YWx1ZXMpOyIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuIHRoaXM7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIEFkZERlcHJlY2F0ZWRGbGFnKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIEJ1aWxkZXIgQ2xlYXJ7MH0oKSB7eyIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBQcmVwYXJlQnVpbGRlcigpOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmVzdWx0LnswfV8uQ2xlYXIoKTsiLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybiB0aGlzOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYgKG90aGVyLnswfV8uQ291bnQgIT0gMCkge3siLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdC57MH1fLkFkZChvdGhlci57MH1fKTsiLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ7MH1fLk1ha2VSZWFkT25seSgpOyIsIE5hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKA0KKyAgICAgICAgICAgICAgICAiaW5wdXQuUmVhZHswfUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnsxfV8sIHsyfS5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsiLA0KKyAgICAgICAgICAgICAgICBNZXNzYWdlT3JHcm91cCwgTmFtZSwgVHlwZU5hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpZiAoezB9Xy5Db3VudCA+IDApIHt7IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIm91dHB1dC5Xcml0ZXswfUFycmF5KHsxfSwgZmllbGRfbmFtZXNbezN9XSwgezJ9Xyk7IiwgTWVzc2FnZU9yR3JvdXAsIE51bWJlciwgTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkT3JkaW5hbCwgRGVzY3JpcHRvci5GaWVsZFR5cGUpOw0KKyAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiZm9yZWFjaCAoezB9IGVsZW1lbnQgaW4gezF9TGlzdCkge3siLCBUeXBlTmFtZSwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGV7MH1TaXplKHsxfSwgZWxlbWVudCk7IiwgTWVzc2FnZU9yR3JvdXAsIE51bWJlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVIYXNoKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImZvcmVhY2goezB9IGkgaW4gezF9XykiLCBUeXBlTmFtZSwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBoYXNoIF49IGkuR2V0SGFzaENvZGUoKTsiKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRXF1YWxzKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlmKHswfV8uQ291bnQgIT0gb3RoZXIuezB9Xy5Db3VudCkgcmV0dXJuIGZhbHNlOyIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImZvcihpbnQgaXg9MDsgaXggPCB7MH1fLkNvdW50OyBpeCsrKSIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgaWYoIXswfV9baXhdLkVxdWFscyhvdGhlci57MH1fW2l4XSkpIHJldHVybiBmYWxzZTsiLCBOYW1lKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG9TdHJpbmcoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiUHJpbnRGaWVsZChcInswfVwiLCB7MX1fLCB3cml0ZXIpOyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yLkZpZWxkVHlwZSA9PSBGaWVsZFR5cGUuR3JvdXAgPyBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlLk5hbWUgOiBEZXNjcmlwdG9yLk5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvR2VuL1JlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IuY3MgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL1JlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5NWYzYgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvci5jcwpAQCAtMCwwICsxLDIwNyBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW4NCit7DQorICAgIGludGVybmFsIGNsYXNzIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IgOiBGaWVsZEdlbmVyYXRvckJhc2UsIElGaWVsZFNvdXJjZUdlbmVyYXRvcg0KKyAgICB7DQorICAgICAgICBpbnRlcm5hbCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBpbnQgZmllbGRPcmRpbmFsKQ0KKyAgICAgICAgICAgIDogYmFzZShkZXNjcmlwdG9yLCBmaWVsZE9yZGluYWwpDQorICAgICAgICB7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuSXNQYWNrZWQgJiYgT3B0aW1pemVTcGVlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInByaXZhdGUgaW50IHswfU1lbW9pemVkU2VyaWFsaXplZFNpemU7IiwgTmFtZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8ezB9PiB7MX1fID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHswfT4oKTsiLCBUeXBlTmFtZSwgTmFtZSk7DQorICAgICAgICAgICAgQWRkUHVibGljTWVtYmVyQXR0cmlidXRlcyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBzY2c6OklMaXN0PHswfT4gezF9TGlzdCB7eyIsIFR5cGVOYW1lLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgZ2V0IHt7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoezB9Xyk7IH19IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKw0KKyAgICAgICAgICAgIC8vIFRPRE8oam9uc2tlZXQpOiBSZWR1bmRhbnQgQVBJIGNhbGxzPyBQb3NzaWJseSAtIGluY2x1ZGUgZm9yIHBvcnRhYmlsaXR5IHRob3VnaC4gTWF5YmUgY3JlYXRlIGFuIG9wdGlvbi4NCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBpbnQgezB9Q291bnQge3siLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgZ2V0IHt7IHJldHVybiB7MH1fLkNvdW50OyB9fSIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisNCisgICAgICAgICAgICBBZGRQdWJsaWNNZW1iZXJBdHRyaWJ1dGVzKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHswfSBHZXR7MX0oaW50IGluZGV4KSB7eyIsIFR5cGVOYW1lLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuIHswfV9baW5kZXhdOyIsIE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gTm90ZTogIFdlIGNhbiByZXR1cm4gdGhlIG9yaWdpbmFsIGxpc3QgaGVyZSwgYmVjYXVzZSB3ZSBtYWtlIGl0IHVubW9kaWZpYWJsZSB3aGVuIHdlIGJ1aWxkDQorICAgICAgICAgICAgLy8gV2UgcmV0dXJuIGl0IHZpYSBJUG9wc2ljbGVMaXN0IHNvIHRoYXQgY29sbGVjdGlvbiBpbml0aWFsaXplcnMgd29yayBtb3JlIHBsZWFzYW50bHkuDQorICAgICAgICAgICAgQWRkUHVibGljTWVtYmVyQXR0cmlidXRlcyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8ezB9PiB7MX1MaXN0IHt7IiwgVHlwZU5hbWUsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBnZXQge3sgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuezB9XzsgfX0iLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgQWRkRGVwcmVjYXRlZEZsYWcod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgaW50IHswfUNvdW50IHt7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGdldCB7eyByZXR1cm4gcmVzdWx0LnswfUNvdW50OyB9fSIsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIEFkZFB1YmxpY01lbWJlckF0dHJpYnV0ZXMod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgezB9IEdldHsxfShpbnQgaW5kZXgpIHt7IiwgVHlwZU5hbWUsIFByb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gcmVzdWx0LkdldHswfShpbmRleCk7IiwgUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgQWRkUHVibGljTWVtYmVyQXR0cmlidXRlcyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBCdWlsZGVyIFNldHswfShpbnQgaW5kZXgsIHsxfSB2YWx1ZSkge3siLCBQcm9wZXJ0eU5hbWUsIFR5cGVOYW1lKTsNCisgICAgICAgICAgICBBZGROdWxsQ2hlY2sod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIFByZXBhcmVCdWlsZGVyKCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXN1bHQuezB9X1tpbmRleF0gPSB2YWx1ZTsiLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybiB0aGlzOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICBBZGRQdWJsaWNNZW1iZXJBdHRyaWJ1dGVzKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIEJ1aWxkZXIgQWRkezB9KHsxfSB2YWx1ZSkge3siLCBQcm9wZXJ0eU5hbWUsIFR5cGVOYW1lKTsNCisgICAgICAgICAgICBBZGROdWxsQ2hlY2sod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIFByZXBhcmVCdWlsZGVyKCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXN1bHQuezB9Xy5BZGQodmFsdWUpOyIsIE5hbWUsIFR5cGVOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybiB0aGlzOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICBBZGRQdWJsaWNNZW1iZXJBdHRyaWJ1dGVzKHdyaXRlcik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIEJ1aWxkZXIgQWRkUmFuZ2V7MH0oc2NnOjpJRW51bWVyYWJsZTx7MX0+IHZhbHVlcykge3siLCBQcm9wZXJ0eU5hbWUsIFR5cGVOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIFByZXBhcmVCdWlsZGVyKCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXN1bHQuezB9Xy5BZGQodmFsdWVzKTsiLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybiB0aGlzOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICBBZGREZXByZWNhdGVkRmxhZyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBCdWlsZGVyIENsZWFyezB9KCkge3siLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgUHJlcGFyZUJ1aWxkZXIoKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJlc3VsdC57MH1fLkNsZWFyKCk7IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gdGhpczsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlmIChvdGhlci57MH1fLkNvdW50ICE9IDApIHt7IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXN1bHQuezB9Xy5BZGQob3RoZXIuezB9Xyk7IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9Xy5NYWtlUmVhZE9ubHkoKTsiLCBOYW1lKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaW5wdXQuUmVhZHswfUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnsxfV8pOyIsIENhcGl0YWxpemVkVHlwZU5hbWUsIE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yLkZpZWxkVHlwZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlmICh7MH1fLkNvdW50ID4gMCkge3siLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuSXNQYWNrZWQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJvdXRwdXQuV3JpdGVQYWNrZWR7MH1BcnJheSh7MX0sIGZpZWxkX25hbWVzW3szfV0sIHsyfU1lbW9pemVkU2VyaWFsaXplZFNpemUsIHsyfV8pOyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwaXRhbGl6ZWRUeXBlTmFtZSwgTnVtYmVyLCBOYW1lLCBGaWVsZE9yZGluYWwsIERlc2NyaXB0b3IuRmllbGRUeXBlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgib3V0cHV0LldyaXRlezB9QXJyYXkoezF9LCBmaWVsZF9uYW1lc1t7M31dLCB7Mn1fKTsiLCBDYXBpdGFsaXplZFR5cGVOYW1lLCBOdW1iZXIsIE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRPcmRpbmFsLCBEZXNjcmlwdG9yLkZpZWxkVHlwZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgieyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpbnQgZGF0YVNpemUgPSAwOyIpOw0KKyAgICAgICAgICAgIGlmIChGaXhlZFNpemUgPT0gLTEpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJmb3JlYWNoICh7MH0gZWxlbWVudCBpbiB7MX1MaXN0KSB7eyIsIFR5cGVOYW1lLCBQcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlezB9U2l6ZU5vVGFnKGVsZW1lbnQpOyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwaXRhbGl6ZWRUeXBlTmFtZSwgTnVtYmVyKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJkYXRhU2l6ZSA9IHswfSAqIHsxfV8uQ291bnQ7IiwgRml4ZWRTaXplLCBOYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgic2l6ZSArPSBkYXRhU2l6ZTsiKTsNCisgICAgICAgICAgICBpbnQgdGFnU2l6ZSA9IENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVUYWdTaXplKERlc2NyaXB0b3IuRmllbGROdW1iZXIpOw0KKyAgICAgICAgICAgIGlmIChEZXNjcmlwdG9yLklzUGFja2VkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYgKHswfV8uQ291bnQgIT0gMCkge3siLCBOYW1lKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBzaXplICs9IHswfSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOyIsIHRhZ1NpemUpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInNpemUgKz0gezB9ICogezF9Xy5Db3VudDsiLCB0YWdTaXplLCBOYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgLy8gY2FjaGUgdGhlIGRhdGEgc2l6ZSBmb3IgcGFja2VkIGZpZWxkcy4NCisgICAgICAgICAgICBpZiAoRGVzY3JpcHRvci5Jc1BhY2tlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInswfU1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsiLCBOYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUhhc2goVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiZm9yZWFjaCh7MH0gaSBpbiB7MX1fKSIsIFR5cGVOYW1lLCBOYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOyIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVFcXVhbHMoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiaWYoezB9Xy5Db3VudCAhPSBvdGhlci57MH1fLkNvdW50KSByZXR1cm4gZmFsc2U7IiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiZm9yKGludCBpeD0wOyBpeCA8IHswfV8uQ291bnQ7IGl4KyspIiwgTmFtZSk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBpZighezB9X1tpeF0uRXF1YWxzKG90aGVyLnswfV9baXhdKSkgcmV0dXJuIGZhbHNlOyIsIE5hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUb1N0cmluZyhUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJQcmludEZpZWxkKFwiezB9XCIsIHsxfV8sIHdyaXRlcik7IiwgRGVzY3JpcHRvci5OYW1lLCBOYW1lKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvR2VuL1NlcnZpY2VHZW5lcmF0b3IuY3MgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL1NlcnZpY2VHZW5lcmF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiOWViMgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vU2VydmljZUdlbmVyYXRvci5jcwpAQCAtMCwwICsxLDE5MCBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW4NCit7DQorICAgIGludGVybmFsIGNsYXNzIEdlbmVyaWNTZXJ2aWNlR2VuZXJhdG9yIDogU291cmNlR2VuZXJhdG9yQmFzZTxTZXJ2aWNlRGVzY3JpcHRvcj4sIElTb3VyY2VHZW5lcmF0b3INCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSBlbnVtIFJlcXVlc3RPclJlc3BvbnNlDQorICAgICAgICB7DQorICAgICAgICAgICAgUmVxdWVzdCwNCisgICAgICAgICAgICBSZXNwb25zZQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgR2VuZXJpY1NlcnZpY2VHZW5lcmF0b3IoU2VydmljZURlc2NyaXB0b3IgZGVzY3JpcHRvcikNCisgICAgICAgICAgICA6IGJhc2UoZGVzY3JpcHRvcikNCisgICAgICAgIHsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEdlbmVyYXRlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIltnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldIik7DQorICAgICAgICAgICAgV3JpdGVHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInswfSBhYnN0cmFjdCBjbGFzcyB7MX0gOiBwYjo6SVNlcnZpY2Uge3siLCBDbGFzc0FjY2Vzc0xldmVsLCBEZXNjcmlwdG9yLk5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisNCisgICAgICAgICAgICBmb3JlYWNoIChNZXRob2REZXNjcmlwdG9yIG1ldGhvZCBpbiBEZXNjcmlwdG9yLk1ldGhvZHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ7MH0gYWJzdHJhY3Qgdm9pZCB7MX0oIiwgQ2xhc3NBY2Nlc3NMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lSGVscGVycy5VbmRlcnNjb3Jlc1RvUGFzY2FsQ2FzZShtZXRob2QuTmFtZSkpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgcGI6OklScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsIik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICB7MH0gcmVxdWVzdCwiLCBHZXRDbGFzc05hbWUobWV0aG9kLklucHV0VHlwZSkpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgZ2xvYmFsOjpTeXN0ZW0uQWN0aW9uPHswfT4gZG9uZSk7IiwgR2V0Q2xhc3NOYW1lKG1ldGhvZC5PdXRwdXRUeXBlKSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vIEdlbmVyYXRlIERlc2NyaXB0b3IgYW5kIERlc2NyaXB0b3JGb3JUeXBlLg0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ7MH0gc3RhdGljIHBiZDo6U2VydmljZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7eyIsIENsYXNzQWNjZXNzTGV2ZWwpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgZ2V0IHt7IHJldHVybiB7MH0uRGVzY3JpcHRvci5TZXJ2aWNlc1t7MX1dOyB9fSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yVXRpbC5HZXRRdWFsaWZpZWRVbWJyZWxsYUNsYXNzTmFtZShEZXNjcmlwdG9yLkZpbGUuQ1NoYXJwT3B0aW9ucyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yLkluZGV4KTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHBiZDo6U2VydmljZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgeyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorDQorICAgICAgICAgICAgR2VuZXJhdGVDYWxsTWV0aG9kKHdyaXRlcik7DQorICAgICAgICAgICAgR2VuZXJhdGVHZXRQcm90b3R5cGUoUmVxdWVzdE9yUmVzcG9uc2UuUmVxdWVzdCwgd3JpdGVyKTsNCisgICAgICAgICAgICBHZW5lcmF0ZUdldFByb3RvdHlwZShSZXF1ZXN0T3JSZXNwb25zZS5SZXNwb25zZSwgd3JpdGVyKTsNCisgICAgICAgICAgICBHZW5lcmF0ZVN0dWIod3JpdGVyKTsNCisNCisgICAgICAgICAgICB3cml0ZXIuT3V0ZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgdm9pZCBHZW5lcmF0ZUNhbGxNZXRob2QoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyB2b2lkIENhbGxNZXRob2QoIik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICAgIHBiZDo6TWV0aG9kRGVzY3JpcHRvciBtZXRob2QsIik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICAgIHBiOjpJUnBjQ29udHJvbGxlciBjb250cm9sbGVyLCIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICBwYjo6SU1lc3NhZ2UgcmVxdWVzdCwiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgZ2xvYmFsOjpTeXN0ZW0uQWN0aW9uPHBiOjpJTWVzc2FnZT4gZG9uZSkgeyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJpZiAobWV0aG9kLlNlcnZpY2UgIT0gRGVzY3JpcHRvcikgeyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgdGhyb3cgbmV3IGdsb2JhbDo6U3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uKCIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICAgIFwiU2VydmljZS5DYWxsTWV0aG9kKCkgZ2l2ZW4gbWV0aG9kIGRlc2NyaXB0b3IgZm9yIHdyb25nIHNlcnZpY2UgdHlwZS5cIik7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInN3aXRjaChtZXRob2QuSW5kZXgpIHsiKTsNCisgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorICAgICAgICAgICAgZm9yZWFjaCAoTWV0aG9kRGVzY3JpcHRvciBtZXRob2QgaW4gRGVzY3JpcHRvci5NZXRob2RzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiY2FzZSB7MH06IiwgbWV0aG9kLkluZGV4KTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICB0aGlzLnswfShjb250cm9sbGVyLCAoezF9KSByZXF1ZXN0LCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZUhlbHBlcnMuVW5kZXJzY29yZXNUb1Bhc2NhbENhc2UobWV0aG9kLk5hbWUpLCBHZXRDbGFzc05hbWUobWV0aG9kLklucHV0VHlwZSkpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgICBwYjo6UnBjVXRpbC5TcGVjaWFsaXplQ2FsbGJhY2s8ezB9PigiLCBHZXRDbGFzc05hbWUobWV0aG9kLk91dHB1dFR5cGUpKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICAgICAgZG9uZSkpOyIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHJldHVybjsiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiZGVmYXVsdDoiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHRocm93IG5ldyBnbG9iYWw6OlN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKFwiQ2FuJ3QgZ2V0IGhlcmUuXCIpOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgdm9pZCBHZW5lcmF0ZUdldFByb3RvdHlwZShSZXF1ZXN0T3JSZXNwb25zZSB3aGljaCwgVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHBiOjpJTWVzc2FnZSBHZXR7MH1Qcm90b3R5cGUocGJkOjpNZXRob2REZXNjcmlwdG9yIG1ldGhvZCkge3siLCB3aGljaCk7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImlmIChtZXRob2QuU2VydmljZSAhPSBEZXNjcmlwdG9yKSB7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICB0aHJvdyBuZXcgZ2xvYmFsOjpTeXN0ZW0uQXJndW1lbnRFeGNlcHRpb24oIik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICAgICAgXCJTZXJ2aWNlLkdldHswfVByb3RvdHlwZSgpIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yIGZvciB3cm9uZyBzZXJ2aWNlIHR5cGUuXCIpOyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInN3aXRjaChtZXRob2QuSW5kZXgpIHsiKTsNCisgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorDQorICAgICAgICAgICAgZm9yZWFjaCAoTWV0aG9kRGVzY3JpcHRvciBtZXRob2QgaW4gRGVzY3JpcHRvci5NZXRob2RzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiY2FzZSB7MH06IiwgbWV0aG9kLkluZGV4KTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gezB9LkRlZmF1bHRJbnN0YW5jZTsiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENsYXNzTmFtZSh3aGljaCA9PSBSZXF1ZXN0T3JSZXNwb25zZS5SZXF1ZXN0ID8gbWV0aG9kLklucHV0VHlwZSA6IG1ldGhvZC5PdXRwdXRUeXBlKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImRlZmF1bHQ6Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICB0aHJvdyBuZXcgZ2xvYmFsOjpTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbihcIkNhbid0IGdldCBoZXJlLlwiKTsiKTsNCisgICAgICAgICAgICB3cml0ZXIuT3V0ZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICB3cml0ZXIuT3V0ZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHZvaWQgR2VuZXJhdGVTdHViKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBzdGF0aWMgU3R1YiBDcmVhdGVTdHViKHBiOjpJUnBjQ2hhbm5lbCBjaGFubmVsKSB7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICByZXR1cm4gbmV3IFN0dWIoY2hhbm5lbCk7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXSIpOw0KKyAgICAgICAgICAgIFdyaXRlR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMod3JpdGVyKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ7MH0gY2xhc3MgU3R1YiA6IHsxfSB7eyIsIENsYXNzQWNjZXNzTGV2ZWwsIEdldENsYXNzTmFtZShEZXNjcmlwdG9yKSk7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImludGVybmFsIFN0dWIocGI6OklScGNDaGFubmVsIGNoYW5uZWwpIHsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwcml2YXRlIHJlYWRvbmx5IHBiOjpJUnBjQ2hhbm5lbCBjaGFubmVsOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgcGI6OklScGNDaGFubmVsIENoYW5uZWwgeyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgZ2V0IHsgcmV0dXJuIGNoYW5uZWw7IH0iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorDQorICAgICAgICAgICAgZm9yZWFjaCAoTWV0aG9kRGVzY3JpcHRvciBtZXRob2QgaW4gRGVzY3JpcHRvci5NZXRob2RzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ7MH0gb3ZlcnJpZGUgdm9pZCB7MX0oIiwgQ2xhc3NBY2Nlc3NMZXZlbCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZUhlbHBlcnMuVW5kZXJzY29yZXNUb1Bhc2NhbENhc2UobWV0aG9kLk5hbWUpKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICAgIHBiOjpJUnBjQ29udHJvbGxlciBjb250cm9sbGVyLCIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgezB9IHJlcXVlc3QsIiwgR2V0Q2xhc3NOYW1lKG1ldGhvZC5JbnB1dFR5cGUpKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICAgIGdsb2JhbDo6U3lzdGVtLkFjdGlvbjx7MH0+IGRvbmUpIHt7IiwgR2V0Q2xhc3NOYW1lKG1ldGhvZC5PdXRwdXRUeXBlKSk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiY2hhbm5lbC5DYWxsTWV0aG9kKERlc2NyaXB0b3IuTWV0aG9kc1t7MH1dLCIsIG1ldGhvZC5JbmRleCk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICBjb250cm9sbGVyLCByZXF1ZXN0LCB7MH0uRGVmYXVsdEluc3RhbmNlLCIsIEdldENsYXNzTmFtZShtZXRob2QuT3V0cHV0VHlwZSkpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgcGI6OlJwY1V0aWwuR2VuZXJhbGl6ZUNhbGxiYWNrPHswfSwgezB9LkJ1aWxkZXI+KGRvbmUsIHswfS5EZWZhdWx0SW5zdGFuY2UpKTsiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENsYXNzTmFtZShtZXRob2QuT3V0cHV0VHlwZSkpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuT3V0ZGVudCgpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4vU2VydmljZUludGVyZmFjZUdlbmVyYXRvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vU2VydmljZUludGVyZmFjZUdlbmVyYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWUzZDNkCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9TZXJ2aWNlSW50ZXJmYWNlR2VuZXJhdG9yLmNzCkBAIC0wLDAgKzEsMzAwIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3RvczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvR2VuDQorew0KKyAgICBpbnRlcm5hbCBjbGFzcyBTZXJ2aWNlR2VuZXJhdG9yIDogU291cmNlR2VuZXJhdG9yQmFzZTxTZXJ2aWNlRGVzY3JpcHRvcj4sIElTb3VyY2VHZW5lcmF0b3INCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBDU2hhcnBTZXJ2aWNlVHlwZSBzdmNUeXBlOw0KKyAgICAgICAgcHJpdmF0ZSBJU291cmNlR2VuZXJhdG9yIF9nZW5lcmF0b3I7DQorDQorICAgICAgICBpbnRlcm5hbCBTZXJ2aWNlR2VuZXJhdG9yKFNlcnZpY2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpDQorICAgICAgICAgICAgOiBiYXNlKGRlc2NyaXB0b3IpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3ZjVHlwZSA9IGRlc2NyaXB0b3IuRmlsZS5DU2hhcnBPcHRpb25zLlNlcnZpY2VHZW5lcmF0b3JUeXBlOw0KKyAgICAgICAgICAgIHN3aXRjaCAoc3ZjVHlwZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGNhc2UgQ1NoYXJwU2VydmljZVR5cGUuTk9ORToNCisgICAgICAgICAgICAgICAgICAgIF9nZW5lcmF0b3IgPSBuZXcgTm9TZXJ2aWNlc0dlbmVyYXRvcihkZXNjcmlwdG9yKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIENTaGFycFNlcnZpY2VUeXBlLkdFTkVSSUM6DQorICAgICAgICAgICAgICAgICAgICBfZ2VuZXJhdG9yID0gbmV3IEdlbmVyaWNTZXJ2aWNlR2VuZXJhdG9yKGRlc2NyaXB0b3IpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgQ1NoYXJwU2VydmljZVR5cGUuSU5URVJGQUNFOg0KKyAgICAgICAgICAgICAgICAgICAgX2dlbmVyYXRvciA9IG5ldyBTZXJ2aWNlSW50ZXJmYWNlR2VuZXJhdG9yKGRlc2NyaXB0b3IpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgQ1NoYXJwU2VydmljZVR5cGUuSVJQQ0RJU1BBVENIOg0KKyAgICAgICAgICAgICAgICAgICAgX2dlbmVyYXRvciA9IG5ldyBScGNTZXJ2aWNlR2VuZXJhdG9yKGRlc2NyaXB0b3IpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oIlVua25vd24gU2VydmljZUdlbmVyYXRvclR5cGUgPSAiICsgc3ZjVHlwZS5Ub1N0cmluZygpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZShUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBfZ2VuZXJhdG9yLkdlbmVyYXRlKHdyaXRlcik7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIGNsYXNzIE5vU2VydmljZXNHZW5lcmF0b3IgOiBTb3VyY2VHZW5lcmF0b3JCYXNlPFNlcnZpY2VEZXNjcmlwdG9yPiwgSVNvdXJjZUdlbmVyYXRvcg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHB1YmxpYyBOb1NlcnZpY2VzR2VuZXJhdG9yKFNlcnZpY2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpDQorICAgICAgICAgICAgICAgIDogYmFzZShkZXNjcmlwdG9yKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZShUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIi8qIik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiogU2VydmljZSBnZW5lcmF0aW9uIGlzIG5vdyBkaXNhYmxlZCBieSBkZWZhdWx0LCB1c2UgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gZW5hYmxlOiIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIqIG9wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLnNlcnZpY2VfZ2VuZXJhdG9yX3R5cGUgPSBHRU5FUklDOyIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIqLyIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgY2xhc3MgU2VydmljZUludGVyZmFjZUdlbmVyYXRvciA6IFNvdXJjZUdlbmVyYXRvckJhc2U8U2VydmljZURlc2NyaXB0b3I+LCBJU291cmNlR2VuZXJhdG9yDQorICAgICAgICB7DQorICAgICAgICAgICAgcHVibGljIFNlcnZpY2VJbnRlcmZhY2VHZW5lcmF0b3IoU2VydmljZURlc2NyaXB0b3IgZGVzY3JpcHRvcikNCisgICAgICAgICAgICAgICAgOiBiYXNlKGRlc2NyaXB0b3IpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEdlbmVyYXRlKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ1NoYXJwU2VydmljZU9wdGlvbnMgb3B0aW9ucyA9IERlc2NyaXB0b3IuT3B0aW9ucy5HZXRFeHRlbnNpb24oQ1NoYXJwT3B0aW9ucy5Dc2hhcnBTZXJ2aWNlT3B0aW9ucyk7DQorICAgICAgICAgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5IYXNJbnRlcmZhY2VJZCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiW2dsb2JhbDo6U3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkd1aWRBdHRyaWJ1dGUoXCJ7MH1cIildIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEd1aWQob3B0aW9ucy5JbnRlcmZhY2VJZCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIFdyaXRlR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMod3JpdGVyKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9IHBhcnRpYWwgaW50ZXJmYWNlIEl7MX0ge3siLCBDbGFzc0FjY2Vzc0xldmVsLCBEZXNjcmlwdG9yLk5hbWUpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorDQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKE1ldGhvZERlc2NyaXB0b3IgbWV0aG9kIGluIERlc2NyaXB0b3IuTWV0aG9kcykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgQ1NoYXJwTWV0aG9kT3B0aW9ucyBtdGggPSBtZXRob2QuT3B0aW9ucy5HZXRFeHRlbnNpb24oQ1NoYXJwT3B0aW9ucy5Dc2hhcnBNZXRob2RPcHRpb25zKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChtdGguSGFzRGlzcGF0Y2hJZCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJbZ2xvYmFsOjpTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuRGlzcElkKHswfSldIiwgbXRoLkRpc3BhdGNoSWQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9IHsxfSh7Mn0gezN9KTsiLCBHZXRDbGFzc05hbWUobWV0aG9kLk91dHB1dFR5cGUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lSGVscGVycy5VbmRlcnNjb3Jlc1RvUGFzY2FsQ2FzZShtZXRob2QuTmFtZSksIEdldENsYXNzTmFtZShtZXRob2QuSW5wdXRUeXBlKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZUhlbHBlcnMuVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShtZXRob2QuSW5wdXRUeXBlLk5hbWUpKTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuT3V0ZGVudCgpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBScGNTZXJ2aWNlR2VuZXJhdG9yIDogU2VydmljZUludGVyZmFjZUdlbmVyYXRvcg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHB1YmxpYyBScGNTZXJ2aWNlR2VuZXJhdG9yKFNlcnZpY2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpDQorICAgICAgICAgICAgICAgIDogYmFzZShkZXNjcmlwdG9yKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgR2VuZXJhdGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBiYXNlLkdlbmVyYXRlKHdyaXRlcik7DQorDQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisNCisgICAgICAgICAgICAgICAgLy8gQ0xJRU5UIFByb3h5DQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChEZXNjcmlwdG9yLkZpbGUuQ1NoYXJwT3B0aW9ucy5DbHNDb21wbGlhbmNlKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIltnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXSIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0iKTsNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMod3JpdGVyKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInswfSBwYXJ0aWFsIGNsYXNzIHsxfSA6IEl7MX0sIHBiOjpJUnBjRGlzcGF0Y2gsIGdsb2JhbDo6U3lzdGVtLklEaXNwb3NhYmxlIHt7IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NBY2Nlc3NMZXZlbCwgRGVzY3JpcHRvci5OYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInByaXZhdGUgcmVhZG9ubHkgYm9vbCBkaXNwb3NlOyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHJpdmF0ZSByZWFkb25seSBwYjo6SVJwY0Rpc3BhdGNoIGRpc3BhdGNoOyIpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHswfShwYjo6SVJwY0Rpc3BhdGNoIGRpc3BhdGNoKSA6IHRoaXMoZGlzcGF0Y2gsIHRydWUpIHt7IiwgRGVzY3JpcHRvci5OYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyB7MH0ocGI6OklScGNEaXNwYXRjaCBkaXNwYXRjaCwgYm9vbCBkaXNwb3NlKSB7eyIsIERlc2NyaXB0b3IuTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh0aGlzLmRpc3BhdGNoID0gZGlzcGF0Y2gsIFwiZGlzcGF0Y2hcIik7Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHRoaXMuZGlzcG9zZSA9IGRpc3Bvc2UgJiYgZGlzcGF0Y2ggaXMgZ2xvYmFsOjpTeXN0ZW0uSURpc3Bvc2FibGU7Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorDQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgdm9pZCBEaXNwb3NlKCkgeyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBpZiAoZGlzcG9zZSkgKChnbG9iYWw6OlN5c3RlbS5JRGlzcG9zYWJsZSlkaXNwYXRjaCkuRGlzcG9zZSgpOyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgNCisgICAgICAgICAgICAgICAgICAgICAgICAiVE1lc3NhZ2UgcGI6OklScGNEaXNwYXRjaC5DYWxsTWV0aG9kPFRNZXNzYWdlLCBUQnVpbGRlcj4oc3RyaW5nIG1ldGhvZCwgcGI6OklNZXNzYWdlTGl0ZSByZXF1ZXN0LCBwYjo6SUJ1aWxkZXJMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gcmVzcG9uc2UpIHsiKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcmV0dXJuIGRpc3BhdGNoLkNhbGxNZXRob2QobWV0aG9kLCByZXF1ZXN0LCByZXNwb25zZSk7Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorDQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChNZXRob2REZXNjcmlwdG9yIG1ldGhvZCBpbiBEZXNjcmlwdG9yLk1ldGhvZHMpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHswfSB7MX0oezJ9IHszfSkge3siLCBHZXRDbGFzc05hbWUobWV0aG9kLk91dHB1dFR5cGUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZUhlbHBlcnMuVW5kZXJzY29yZXNUb1Bhc2NhbENhc2UobWV0aG9kLk5hbWUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q2xhc3NOYW1lKG1ldGhvZC5JbnB1dFR5cGUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZUhlbHBlcnMuVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShtZXRob2QuSW5wdXRUeXBlLk5hbWUpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICByZXR1cm4gZGlzcGF0Y2guQ2FsbE1ldGhvZChcInswfVwiLCB7MX0sIHsyfS5DcmVhdGVCdWlsZGVyKCkpOyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVIZWxwZXJzLlVuZGVyc2NvcmVzVG9DYW1lbENhc2UobWV0aG9kLklucHV0VHlwZS5OYW1lKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENsYXNzTmFtZShtZXRob2QuT3V0cHV0VHlwZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIC8vIFNFUlZFUiAtIERJU1BBVENIDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChEZXNjcmlwdG9yLkZpbGUuQ1NoYXJwT3B0aW9ucy5DbHNDb21wbGlhbmNlKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIltnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXSIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0iKTsNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMod3JpdGVyKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBwYXJ0aWFsIGNsYXNzIERpc3BhdGNoIDogcGI6OklScGNEaXNwYXRjaCwgZ2xvYmFsOjpTeXN0ZW0uSURpc3Bvc2FibGUgeyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHJpdmF0ZSByZWFkb25seSBib29sIGRpc3Bvc2U7Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwcml2YXRlIHJlYWRvbmx5IEl7MH0gaW1wbGVtZW50YXRpb247IiwgRGVzY3JpcHRvci5OYW1lKTsNCisNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBEaXNwYXRjaChJezB9IGltcGxlbWVudGF0aW9uKSA6IHRoaXMoaW1wbGVtZW50YXRpb24sIHRydWUpIHt7IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvci5OYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBEaXNwYXRjaChJezB9IGltcGxlbWVudGF0aW9uLCBib29sIGRpc3Bvc2UpIHt7IiwgRGVzY3JpcHRvci5OYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHRoaXMuaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvbiwgXCJpbXBsZW1lbnRhdGlvblwiKTsiKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgdGhpcy5kaXNwb3NlID0gZGlzcG9zZSAmJiBpbXBsZW1lbnRhdGlvbiBpcyBnbG9iYWw6OlN5c3RlbS5JRGlzcG9zYWJsZTsiKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyB2b2lkIERpc3Bvc2UoKSB7Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIGlmIChkaXNwb3NlKSAoKGdsb2JhbDo6U3lzdGVtLklEaXNwb3NhYmxlKWltcGxlbWVudGF0aW9uKS5EaXNwb3NlKCk7Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorDQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJwdWJsaWMgVE1lc3NhZ2UgQ2FsbE1ldGhvZDxUTWVzc2FnZSwgVEJ1aWxkZXI+KHN0cmluZyBtZXRob2ROYW1lLCBwYjo6SU1lc3NhZ2VMaXRlIHJlcXVlc3QsIHBiOjpJQnVpbGRlckxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiByZXNwb25zZSkiKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgd2hlcmUgVE1lc3NhZ2UgOiBwYjo6SU1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4iKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgd2hlcmUgVEJ1aWxkZXIgOiBwYjo6SUJ1aWxkZXJMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4geyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgic3dpdGNoKG1ldGhvZE5hbWUpIHsiKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisNCisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKE1ldGhvZERlc2NyaXB0b3IgbWV0aG9kIGluIERlc2NyaXB0b3IuTWV0aG9kcykNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FzZSBcInswfVwiOiByZXR1cm4gcmVzcG9uc2UuTWVyZ2VGcm9tKGltcGxlbWVudGF0aW9uLnsxfSgoezJ9KXJlcXVlc3QpKS5CdWlsZCgpOyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5OYW1lLCBOYW1lSGVscGVycy5VbmRlcnNjb3Jlc1RvUGFzY2FsQ2FzZShtZXRob2QuTmFtZSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENsYXNzTmFtZShtZXRob2QuSW5wdXRUeXBlKSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJkZWZhdWx0OiB0aHJvdyBwYjo6VGhyb3dIZWxwZXIuQ3JlYXRlTWlzc2luZ01ldGhvZCh0eXBlb2YoSXswfSksIG1ldGhvZE5hbWUpOyIsIERlc2NyaXB0b3IuTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuT3V0ZGVudCgpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOyAvL2VuZCBzd2l0Y2gNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7IC8vZW5kIGludm9rZQ0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsgLy9lbmQgc2VydmVyDQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgLy8gU0VSVkVSIC0gU1RVQg0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoRGVzY3JpcHRvci5GaWxlLkNTaGFycE9wdGlvbnMuQ2xzQ29tcGxpYW5jZSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0iKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIltnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldIik7DQorICAgICAgICAgICAgICAgICAgICBXcml0ZUdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzKHdyaXRlcik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJwdWJsaWMgcGFydGlhbCBjbGFzcyBTZXJ2ZXJTdHViIDogcGI6OklScGNTZXJ2ZXJTdHViLCBnbG9iYWw6OlN5c3RlbS5JRGlzcG9zYWJsZSB7Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwcml2YXRlIHJlYWRvbmx5IGJvb2wgZGlzcG9zZTsiKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInByaXZhdGUgcmVhZG9ubHkgcGI6OklScGNEaXNwYXRjaCBpbXBsZW1lbnRhdGlvbjsiLCBEZXNjcmlwdG9yLk5hbWUpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIFNlcnZlclN0dWIoSXswfSBpbXBsZW1lbnRhdGlvbikgOiB0aGlzKGltcGxlbWVudGF0aW9uLCB0cnVlKSB7eyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IuTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJwdWJsaWMgU2VydmVyU3R1YihJezB9IGltcGxlbWVudGF0aW9uLCBib29sIGRpc3Bvc2UpIDogdGhpcyhuZXcgRGlzcGF0Y2goaW1wbGVtZW50YXRpb24sIGRpc3Bvc2UpLCBkaXNwb3NlKSB7eyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvci5OYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBTZXJ2ZXJTdHViKHBiOjpJUnBjRGlzcGF0Y2ggaW1wbGVtZW50YXRpb24pIDogdGhpcyhpbXBsZW1lbnRhdGlvbiwgdHJ1ZSkgeyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIFNlcnZlclN0dWIocGI6OklScGNEaXNwYXRjaCBpbXBsZW1lbnRhdGlvbiwgYm9vbCBkaXNwb3NlKSB7Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh0aGlzLmltcGxlbWVudGF0aW9uID0gaW1wbGVtZW50YXRpb24sIFwiaW1wbGVtZW50YXRpb25cIik7Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgIHRoaXMuZGlzcG9zZSA9IGRpc3Bvc2UgJiYgaW1wbGVtZW50YXRpb24gaXMgZ2xvYmFsOjpTeXN0ZW0uSURpc3Bvc2FibGU7Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorDQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwdWJsaWMgdm9pZCBEaXNwb3NlKCkgeyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICBpZiAoZGlzcG9zZSkgKChnbG9iYWw6OlN5c3RlbS5JRGlzcG9zYWJsZSlpbXBsZW1lbnRhdGlvbikuRGlzcG9zZSgpOyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgNCisgICAgICAgICAgICAgICAgICAgICAgICAicHVibGljIHBiOjpJTWVzc2FnZUxpdGUgQ2FsbE1ldGhvZChzdHJpbmcgbWV0aG9kTmFtZSwgcGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHt7IiwNCisgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yLk5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgic3dpdGNoKG1ldGhvZE5hbWUpIHsiKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisNCisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKE1ldGhvZERlc2NyaXB0b3IgbWV0aG9kIGluIERlc2NyaXB0b3IuTWV0aG9kcykNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FzZSBcInswfVwiOiByZXR1cm4gaW1wbGVtZW50YXRpb24uQ2FsbE1ldGhvZChtZXRob2ROYW1lLCB7MX0uUGFyc2VGcm9tKGlucHV0LCByZWdpc3RyeSksIHsyfS5DcmVhdGVCdWlsZGVyKCkpOyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5OYW1lLCBHZXRDbGFzc05hbWUobWV0aG9kLklucHV0VHlwZSksIEdldENsYXNzTmFtZShtZXRob2QuT3V0cHV0VHlwZSkpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiZGVmYXVsdDogdGhyb3cgcGI6OlRocm93SGVscGVyLkNyZWF0ZU1pc3NpbmdNZXRob2QodHlwZW9mKEl7MH0pLCBtZXRob2ROYW1lKTsiLCBEZXNjcmlwdG9yLk5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsgLy9lbmQgc3dpdGNoDQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuT3V0ZGVudCgpOw0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOyAvL2VuZCBpbnZva2UNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7IC8vZW5kIHNlcnZlcg0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b0dlbi9Tb3VyY2VHZW5lcmF0b3JCYXNlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9Tb3VyY2VHZW5lcmF0b3JCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNWM2ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL1NvdXJjZUdlbmVyYXRvckJhc2UuY3MKQEAgLTAsMCArMSwxNjcgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3M7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbg0KK3sNCisgICAgaW50ZXJuYWwgYWJzdHJhY3QgY2xhc3MgU291cmNlR2VuZXJhdG9yQmFzZTxUPiB3aGVyZSBUIDogSURlc2NyaXB0b3INCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUIGRlc2NyaXB0b3I7DQorDQorICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYm9vbCBPcHRpbWl6ZVNwZWVkOw0KKyAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGJvb2wgT3B0aW1pemVTaXplOw0KKyAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGJvb2wgVXNlTGl0ZVJ1bnRpbWU7DQorICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RyaW5nIFJ1bnRpbWVTdWZmaXg7DQorDQorICAgICAgICBwcm90ZWN0ZWQgU291cmNlR2VuZXJhdG9yQmFzZShUIGRlc2NyaXB0b3IpDQorICAgICAgICB7DQorICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsNCisNCisgICAgICAgICAgICBPcHRpbWl6ZVNpemUgPSBkZXNjcmlwdG9yLkZpbGUuT3B0aW9ucy5PcHRpbWl6ZUZvciA9PQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVPcHRpb25zLlR5cGVzLk9wdGltaXplTW9kZS5DT0RFX1NJWkU7DQorICAgICAgICAgICAgT3B0aW1pemVTcGVlZCA9IGRlc2NyaXB0b3IuRmlsZS5PcHRpb25zLk9wdGltaXplRm9yID09DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVPcHRpb25zLlR5cGVzLk9wdGltaXplTW9kZS5TUEVFRDsNCisgICAgICAgICAgICBVc2VMaXRlUnVudGltZSA9IGRlc2NyaXB0b3IuRmlsZS5PcHRpb25zLk9wdGltaXplRm9yID09DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlT3B0aW9ucy5UeXBlcy5PcHRpbWl6ZU1vZGUuTElURV9SVU5USU1FOw0KKyAgICAgICAgICAgIC8vTGl0ZSBydW50aW1lIHVzZXMgT3B0aW1pemVTcGVlZCBjb2RlIGJyYW5jaGVzDQorICAgICAgICAgICAgT3B0aW1pemVTcGVlZCB8PSBVc2VMaXRlUnVudGltZTsNCisgICAgICAgICAgICBSdW50aW1lU3VmZml4ID0gVXNlTGl0ZVJ1bnRpbWUgPyAiTGl0ZSIgOiAiIjsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCBUIERlc2NyaXB0b3INCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBHZXRDbGFzc05hbWUoSURlc2NyaXB0b3IgZGVzY3JpcHRvcikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gVG9DU2hhcnBOYW1lKGRlc2NyaXB0b3IuRnVsbE5hbWUsIGRlc2NyaXB0b3IuRmlsZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLyBHcm91cHMgYXJlIGhhY2t5OiAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGlzIGp1c3QgdGhlIGxvd2VyLWNhc2VkIG5hbWUNCisgICAgICAgIC8vIG9mIHRoZSBncm91cCB0eXBlLiAgSW4gQyMsIHRob3VnaCwgd2Ugd291bGQgbGlrZSB0byByZXRhaW4gdGhlIG9yaWdpbmFsDQorICAgICAgICAvLyBjYXBpdGFsaXphdGlvbiBvZiB0aGUgdHlwZSBuYW1lLg0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBHZXRGaWVsZE5hbWUoRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuRmllbGRUeXBlID09IEZpZWxkVHlwZS5Hcm91cCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yLk1lc3NhZ2VUeXBlLk5hbWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yLk5hbWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBHZXRGaWVsZENvbnN0YW50TmFtZShGaWVsZERlc2NyaXB0b3IgZmllbGQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIGZpZWxkLkNTaGFycE9wdGlvbnMuUHJvcGVydHlOYW1lICsgIkZpZWxkTnVtYmVyIjsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBUb0NTaGFycE5hbWUoc3RyaW5nIG5hbWUsIEZpbGVEZXNjcmlwdG9yIGZpbGUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHJlc3VsdCA9IGZpbGUuQ1NoYXJwT3B0aW9ucy5OYW1lc3BhY2U7DQorICAgICAgICAgICAgaWYgKGZpbGUuQ1NoYXJwT3B0aW9ucy5OZXN0Q2xhc3NlcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gIiIpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiLiI7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGZpbGUuQ1NoYXJwT3B0aW9ucy5VbWJyZWxsYUNsYXNzbmFtZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAiIikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLic7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHN0cmluZyBjbGFzc25hbWU7DQorICAgICAgICAgICAgaWYgKGZpbGUuUGFja2FnZSA9PSAiIikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9IG5hbWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIFN0cmlwIHRoZSBwcm90byBwYWNrYWdlIGZyb20gZnVsbF9uYW1lIHNpbmNlIHdlJ3ZlIHJlcGxhY2VkIGl0IHdpdGgNCisgICAgICAgICAgICAgICAgLy8gdGhlIEMjIG5hbWVzcGFjZS4NCisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gbmFtZS5TdWJzdHJpbmcoZmlsZS5QYWNrYWdlLkxlbmd0aCArIDEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHQgKz0gY2xhc3NuYW1lLlJlcGxhY2UoIi4iLCAiLlR5cGVzLiIpOw0KKyAgICAgICAgICAgIHJldHVybiAiZ2xvYmFsOjoiICsgcmVzdWx0Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBDbGFzc0FjY2Vzc0xldmVsDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3IuRmlsZS5DU2hhcnBPcHRpb25zLlB1YmxpY0NsYXNzZXMgPyAicHVibGljIiA6ICJpbnRlcm5hbCI7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCB2b2lkIFdyaXRlR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuRmlsZS5DU2hhcnBPcHRpb25zLkdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiW2dsb2JhbDo6U3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlcy5Db21waWxlckdlbmVyYXRlZEF0dHJpYnV0ZSgpXSIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJbZ2xvYmFsOjpTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlQXR0cmlidXRlKFwiezB9XCIsIFwiezF9XCIpXSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VHlwZSgpLkFzc2VtYmx5LkdldE5hbWUoKS5OYW1lLCBHZXRUeXBlKCkuQXNzZW1ibHkuR2V0TmFtZSgpLlZlcnNpb24pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCB2b2lkIFdyaXRlQ2hpbGRyZW48VENoaWxkPihUZXh0R2VuZXJhdG9yIHdyaXRlciwgc3RyaW5nIHJlZ2lvbiwgSUVudW1lcmFibGU8VENoaWxkPiBjaGlsZHJlbikNCisgICAgICAgICAgICB3aGVyZSBUQ2hpbGQgOiBJRGVzY3JpcHRvcg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIENvcHkgdGhlIHNldCBvZiBjaGlsZHJlbjsgbWFrZXMgYWNjZXNzIGVhc2llcg0KKyAgICAgICAgICAgIExpc3Q8VENoaWxkPiBjb3B5ID0gbmV3IExpc3Q8VENoaWxkPihjaGlsZHJlbik7DQorICAgICAgICAgICAgaWYgKGNvcHkuQ291bnQgPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHJlZ2lvbiAhPSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiI3JlZ2lvbiB7MH0iLCByZWdpb24pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3JlYWNoIChUQ2hpbGQgY2hpbGQgaW4gY2hpbGRyZW4pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBTb3VyY2VHZW5lcmF0b3JzLkNyZWF0ZUdlbmVyYXRvcihjaGlsZCkuR2VuZXJhdGUod3JpdGVyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHJlZ2lvbiAhPSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiI2VuZHJlZ2lvbiIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4vU291cmNlR2VuZXJhdG9ycy5jcyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vU291cmNlR2VuZXJhdG9ycy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODQ1OGYwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9Tb3VyY2VHZW5lcmF0b3JzLmNzCkBAIC0wLDAgKzEsODcgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbg0KK3sNCisgICAgcHVibGljIGRlbGVnYXRlIFRSZXN1bHQgRnVuYzxULCBUUmVzdWx0PihUIGFyZyk7DQorDQorICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBTb3VyY2VHZW5lcmF0b3JzDQorICAgIHsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERpY3Rpb25hcnk8VHlwZSwgRnVuYzxJRGVzY3JpcHRvciwgSVNvdXJjZUdlbmVyYXRvcj4+IEdlbmVyYXRvckZhY3RvcmllcyA9DQorICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8VHlwZSwgRnVuYzxJRGVzY3JpcHRvciwgSVNvdXJjZUdlbmVyYXRvcj4+DQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHt0eXBlb2YoRmlsZURlc2NyaXB0b3IpLCBkZXNjcmlwdG9yID0+IG5ldyBVbWJyZWxsYUNsYXNzR2VuZXJhdG9yKChGaWxlRGVzY3JpcHRvcikgZGVzY3JpcHRvcil9LA0KKyAgICAgICAgICAgICAgICAgICAge3R5cGVvZihFbnVtRGVzY3JpcHRvciksIGRlc2NyaXB0b3IgPT4gbmV3IEVudW1HZW5lcmF0b3IoKEVudW1EZXNjcmlwdG9yKSBkZXNjcmlwdG9yKX0sDQorICAgICAgICAgICAgICAgICAgICB7dHlwZW9mKFNlcnZpY2VEZXNjcmlwdG9yKSwgZGVzY3JpcHRvciA9PiBuZXcgU2VydmljZUdlbmVyYXRvcigoU2VydmljZURlc2NyaXB0b3IpIGRlc2NyaXB0b3IpfSwNCisgICAgICAgICAgICAgICAgICAgIHt0eXBlb2YoTWVzc2FnZURlc2NyaXB0b3IpLCBkZXNjcmlwdG9yID0+IG5ldyBNZXNzYWdlR2VuZXJhdG9yKChNZXNzYWdlRGVzY3JpcHRvcikgZGVzY3JpcHRvcil9LA0KKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG90aGVyIGZpZWxkcywgd2UgaGF2ZSBJRmllbGRTb3VyY2VHZW5lcmF0b3JzLg0KKyAgICAgICAgICAgICAgICAgICAge3R5cGVvZihGaWVsZERlc2NyaXB0b3IpLCBkZXNjcmlwdG9yID0+IG5ldyBFeHRlbnNpb25HZW5lcmF0b3IoKEZpZWxkRGVzY3JpcHRvcikgZGVzY3JpcHRvcil9DQorICAgICAgICAgICAgICAgIH07DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIElGaWVsZFNvdXJjZUdlbmVyYXRvciBDcmVhdGVGaWVsZEdlbmVyYXRvcihGaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBmaWVsZE9yZGluYWwpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5NYXBwZWRUeXBlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgY2FzZSBNYXBwZWRUeXBlLk1lc3NhZ2U6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQuSXNSZXBlYXRlZA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChJRmllbGRTb3VyY2VHZW5lcmF0b3IpIG5ldyBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihmaWVsZCwgZmllbGRPcmRpbmFsKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBNZXNzYWdlRmllbGRHZW5lcmF0b3IoZmllbGQsIGZpZWxkT3JkaW5hbCk7DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5FbnVtOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLklzUmVwZWF0ZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoSUZpZWxkU291cmNlR2VuZXJhdG9yKSBuZXcgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IoZmllbGQsIGZpZWxkT3JkaW5hbCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgRW51bUZpZWxkR2VuZXJhdG9yKGZpZWxkLCBmaWVsZE9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLklzUmVwZWF0ZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoSUZpZWxkU291cmNlR2VuZXJhdG9yKSBuZXcgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihmaWVsZCwgZmllbGRPcmRpbmFsKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihmaWVsZCwgZmllbGRPcmRpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIElTb3VyY2VHZW5lcmF0b3IgQ3JlYXRlR2VuZXJhdG9yPFQ+KFQgZGVzY3JpcHRvcikgd2hlcmUgVCA6IElEZXNjcmlwdG9yDQorICAgICAgICB7DQorICAgICAgICAgICAgRnVuYzxJRGVzY3JpcHRvciwgSVNvdXJjZUdlbmVyYXRvcj4gZmFjdG9yeTsNCisgICAgICAgICAgICBpZiAoIUdlbmVyYXRvckZhY3Rvcmllcy5UcnlHZXRWYWx1ZSh0eXBlb2YoVCksIG91dCBmYWN0b3J5KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiTm8gZ2VuZXJhdG9yIHJlZ2lzdGVyZWQgZm9yICIgKyB0eXBlb2YoVCkuTmFtZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBmYWN0b3J5KGRlc2NyaXB0b3IpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9HZW4vVW1icmVsbGFDbGFzc0dlbmVyYXRvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9HZW4vVW1icmVsbGFDbGFzc0dlbmVyYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODNiMmRiCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9VbWJyZWxsYUNsYXNzR2VuZXJhdG9yLmNzCkBAIC0wLDAgKzEsMjk0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW4NCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEdlbmVyYXRvciBmb3IgdGhlIGNsYXNzIGRlc2NyaWJpbmcgdGhlIC5wcm90byBmaWxlIGluIGdlbmVyYWwsDQorICAgIC8vLyBjb250YWluaW5nIHRoaW5ncyBsaWtlIHRoZSBtZXNzYWdlIGRlc2NyaXB0b3IuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIGludGVybmFsIHNlYWxlZCBjbGFzcyBVbWJyZWxsYUNsYXNzR2VuZXJhdG9yIDogU291cmNlR2VuZXJhdG9yQmFzZTxGaWxlRGVzY3JpcHRvcj4sIElTb3VyY2VHZW5lcmF0b3INCisgICAgew0KKyAgICAgICAgaW50ZXJuYWwgVW1icmVsbGFDbGFzc0dlbmVyYXRvcihGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yKQ0KKyAgICAgICAgICAgIDogYmFzZShkZXNjcmlwdG9yKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gUmVjdXJzaXZlbHkgc2VhcmNoZXMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIGFueSBleHRlbnNpb25zLg0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBVc2VzRXh0ZW5zaW9ucyhJTWVzc2FnZSBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIFdlIGNvbnNlcnZhdGl2ZWx5IGFzc3VtZSB0aGF0IHVua25vd24gZmllbGRzIGFyZSBleHRlbnNpb25zLg0KKyAgICAgICAgICAgIGlmIChtZXNzYWdlLlVua25vd25GaWVsZHMuRmllbGREaWN0aW9uYXJ5LkNvdW50ID4gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBmb3JlYWNoIChLZXlWYWx1ZVBhaXI8RmllbGREZXNjcmlwdG9yLCBvYmplY3Q+IGtleVZhbHVlIGluIG1lc3NhZ2UuQWxsRmllbGRzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0ga2V5VmFsdWUuS2V5Ow0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNFeHRlbnNpb24pDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5NYXBwZWRUeXBlID09IE1hcHBlZFR5cGUuTWVzc2FnZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzUmVwZWF0ZWQpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoSU1lc3NhZ2Ugc3ViTWVzc2FnZSBpbiAoSUVudW1lcmFibGUpIGtleVZhbHVlLlZhbHVlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFVzZXNFeHRlbnNpb25zKHN1Yk1lc3NhZ2UpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVXNlc0V4dGVuc2lvbnMoKElNZXNzYWdlKSBrZXlWYWx1ZS5WYWx1ZSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGUoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVJbnRyb2R1Y3Rpb24od3JpdGVyKTsNCisgICAgICAgICAgICBXcml0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbih3cml0ZXIpOw0KKyAgICAgICAgICAgIFdyaXRlQ2hpbGRyZW4od3JpdGVyLCAiRXh0ZW5zaW9ucyIsIERlc2NyaXB0b3IuRXh0ZW5zaW9ucyk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiI3JlZ2lvbiBTdGF0aWMgdmFyaWFibGVzIik7DQorICAgICAgICAgICAgZm9yZWFjaCAoTWVzc2FnZURlc2NyaXB0b3IgbWVzc2FnZSBpbiBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdlR2VuZXJhdG9yKG1lc3NhZ2UpLkdlbmVyYXRlU3RhdGljVmFyaWFibGVzKHdyaXRlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiNlbmRyZWdpb24iKTsNCisgICAgICAgICAgICBpZiAoIVVzZUxpdGVSdW50aW1lKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVEZXNjcmlwdG9yKHdyaXRlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlTGl0ZUV4dGVuc2lvbnMod3JpdGVyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgLy8gVGhlIGNsYXNzIGRlY2xhcmF0aW9uIGVpdGhlciBnZXRzIGNsb3NlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGNoaWxkcmVuIGFyZSB3cml0dGVuLg0KKyAgICAgICAgICAgIGlmICghRGVzY3JpcHRvci5DU2hhcnBPcHRpb25zLk5lc3RDbGFzc2VzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKw0KKyAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgbmFtZXNwYWNlIGFyb3VuZCB0aGUgdW1icmVsbGEgY2xhc3MgaWYgZGVmaW5lZA0KKyAgICAgICAgICAgICAgICBpZiAoIURlc2NyaXB0b3IuQ1NoYXJwT3B0aW9ucy5OZXN0Q2xhc3NlcyAmJiBEZXNjcmlwdG9yLkNTaGFycE9wdGlvbnMuVW1icmVsbGFOYW1lc3BhY2UgIT0gIiIpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgV3JpdGVDaGlsZHJlbih3cml0ZXIsICJFbnVtcyIsIERlc2NyaXB0b3IuRW51bVR5cGVzKTsNCisgICAgICAgICAgICBXcml0ZUNoaWxkcmVuKHdyaXRlciwgIk1lc3NhZ2VzIiwgRGVzY3JpcHRvci5NZXNzYWdlVHlwZXMpOw0KKyAgICAgICAgICAgIFdyaXRlQ2hpbGRyZW4od3JpdGVyLCAiU2VydmljZXMiLCBEZXNjcmlwdG9yLlNlcnZpY2VzKTsNCisgICAgICAgICAgICBpZiAoRGVzY3JpcHRvci5DU2hhcnBPcHRpb25zLk5lc3RDbGFzc2VzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoRGVzY3JpcHRvci5DU2hhcnBPcHRpb25zLk5hbWVzcGFjZSAhPSAiIikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn0iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUiKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUludHJvZHVjdGlvbihUZXh0R2VuZXJhdG9yIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIvLyBHZW5lcmF0ZWQgYnkgezB9LiAgRE8gTk9UIEVESVQhIiwgdGhpcy5HZXRUeXBlKCkuQXNzZW1ibHkuRnVsbE5hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjEiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIjcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlIik7DQorDQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInVzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInVzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgidXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsiKTsNCisNCisgICAgICAgICAgICBpZiAoRGVzY3JpcHRvci5DU2hhcnBPcHRpb25zLk5hbWVzcGFjZSAhPSAiIikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIm5hbWVzcGFjZSB7MH0ge3siLCBEZXNjcmlwdG9yLkNTaGFycE9wdGlvbnMuTmFtZXNwYWNlKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIC8vIEFkZCB0aGUgbmFtZXNwYWNlIGFyb3VuZCB0aGUgdW1icmVsbGEgY2xhc3MgaWYgZGVmaW5lZA0KKyAgICAgICAgICAgIGlmICghRGVzY3JpcHRvci5DU2hhcnBPcHRpb25zLk5lc3RDbGFzc2VzICYmIERlc2NyaXB0b3IuQ1NoYXJwT3B0aW9ucy5VbWJyZWxsYU5hbWVzcGFjZSAhPSAiIikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIm5hbWVzcGFjZSB7MH0ge3siLCBEZXNjcmlwdG9yLkNTaGFycE9wdGlvbnMuVW1icmVsbGFOYW1lc3BhY2UpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuSW5kZW50KCk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuQ1NoYXJwT3B0aW9ucy5Db2RlQ29udHJhY3RzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkNvbnRyYWN0cy5Db250cmFjdFZlcmlmaWNhdGlvbkF0dHJpYnV0ZShmYWxzZSldIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIltnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldIik7DQorICAgICAgICAgICAgV3JpdGVHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyh3cml0ZXIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInswfSBzdGF0aWMgcGFydGlhbCBjbGFzcyB7MX0ge3siLCBDbGFzc0FjY2Vzc0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvci5DU2hhcnBPcHRpb25zLlVtYnJlbGxhQ2xhc3NuYW1lKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiNyZWdpb24gRXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbiIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3RlckFsbEV4dGVuc2lvbnMocGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Iik7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBleHRlbnNpb24gaW4gRGVzY3JpcHRvci5FeHRlbnNpb25zKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbmV3IEV4dGVuc2lvbkdlbmVyYXRvcihleHRlbnNpb24pLkdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZSh3cml0ZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3JlYWNoIChNZXNzYWdlRGVzY3JpcHRvciBtZXNzYWdlIGluIERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VHZW5lcmF0b3IobWVzc2FnZSkuR2VuZXJhdGVFeHRlbnNpb25SZWdpc3RyYXRpb25Db2RlKHdyaXRlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiNlbmRyZWdpb24iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZURlc2NyaXB0b3IoVGV4dEdlbmVyYXRvciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiI3JlZ2lvbiBEZXNjcmlwdG9yIik7DQorDQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHVibGljIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3IgeyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3I7IH0iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicHJpdmF0ZSBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJzdGF0aWMgezB9KCkge3siLCBEZXNjcmlwdG9yLkNTaGFycE9wdGlvbnMuVW1icmVsbGFDbGFzc25hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJieXRlW10gZGVzY3JpcHRvckRhdGEgPSBnbG9iYWw6OlN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoIik7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJzdHJpbmcuQ29uY2F0KCIpOw0KKyAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisgICAgICAgICAgICAvLyBUT0RPKGpvbnNrZWV0KTogQ29uc2lkZXIgYSBDIy1lc2NhcGluZyBmb3JtYXQgaGVyZSBpbnN0ZWFkIG9mIGp1c3QgQmFzZTY0Lg0KKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IERlc2NyaXB0b3IuUHJvdG8uVG9CeXRlQXJyYXkoKTsNCisgICAgICAgICAgICBzdHJpbmcgYmFzZTY0ID0gQ29udmVydC5Ub0Jhc2U2NFN0cmluZyhieXRlcyk7DQorDQorICAgICAgICAgICAgd2hpbGUgKGJhc2U2NC5MZW5ndGggPiA2MCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIlwiezB9XCIsICIsIGJhc2U2NC5TdWJzdHJpbmcoMCwgNjApKTsNCisgICAgICAgICAgICAgICAgYmFzZTY0ID0gYmFzZTY0LlN1YnN0cmluZyg2MCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiXCJ7MH1cIikpOyIsIGJhc2U2NCk7DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuT3V0ZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoDQorICAgICAgICAgICAgICAgICJwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyIGFzc2lnbmVyID0gZGVsZWdhdGUocGJkOjpGaWxlRGVzY3JpcHRvciByb290KSB7Iik7DQorICAgICAgICAgICAgd3JpdGVyLkluZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImRlc2NyaXB0b3IgPSByb290OyIpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKE1lc3NhZ2VEZXNjcmlwdG9yIG1lc3NhZ2UgaW4gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZUdlbmVyYXRvcihtZXNzYWdlKS5HZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKHdyaXRlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBleHRlbnNpb24gaW4gRGVzY3JpcHRvci5FeHRlbnNpb25zKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbmV3IEV4dGVuc2lvbkdlbmVyYXRvcihleHRlbnNpb24pLkdlbmVyYXRlU3RhdGljVmFyaWFibGVJbml0aWFsaXplcnMod3JpdGVyKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKFVzZXNFeHRlbnNpb25zKERlc2NyaXB0b3IuUHJvdG8pKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gTXVzdCBjb25zdHJ1Y3QgYW4gRXh0ZW5zaW9uUmVnaXN0cnkgY29udGFpbmluZyBhbGwgcG9zc2libGUgZXh0ZW5zaW9ucw0KKyAgICAgICAgICAgICAgICAvLyBhbmQgcmV0dXJuIGl0Lg0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsiKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsiKTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoRmlsZURlc2NyaXB0b3IgZGVwZW5kZW5jeSBpbiBEZXNjcmlwdG9yLkRlcGVuZGVuY2llcykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9LlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclV0aWwuR2V0RnVsbFVtYnJlbGxhQ2xhc3NOYW1lKGRlcGVuZGVuY3kpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJyZXR1cm4gcmVnaXN0cnk7Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInJldHVybiBudWxsOyIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3cml0ZXIuT3V0ZGVudCgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIn07Iik7DQorDQorICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisgICAgICAgICAgICAvLyBJbnZva2UgaW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKCkgdG8gYnVpbGQgdGhlIGZpbGUuDQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgicGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oZGVzY3JpcHRvckRhdGEsIik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiICAgIG5ldyBwYmQ6OkZpbGVEZXNjcmlwdG9yW10geyIpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEZpbGVEZXNjcmlwdG9yIGRlcGVuZGVuY3kgaW4gRGVzY3JpcHRvci5EZXBlbmRlbmNpZXMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgezB9LkRlc2NyaXB0b3IsICIsIERlc2NyaXB0b3JVdGlsLkdldEZ1bGxVbWJyZWxsYUNsYXNzTmFtZShkZXBlbmRlbmN5KSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiAgICB9LCBhc3NpZ25lcik7Iik7DQorICAgICAgICAgICAgd3JpdGVyLk91dGRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiI2VuZHJlZ2lvbiIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUxpdGVFeHRlbnNpb25zKFRleHRHZW5lcmF0b3Igd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiNyZWdpb24gRXh0ZW5zaW9ucyIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoImludGVybmFsIHN0YXRpYyByZWFkb25seSBvYmplY3QgRGVzY3JpcHRvcjsiKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJzdGF0aWMgezB9KCkge3siLCBEZXNjcmlwdG9yLkNTaGFycE9wdGlvbnMuVW1icmVsbGFDbGFzc25hbWUpOw0KKyAgICAgICAgICAgIHdyaXRlci5JbmRlbnQoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJEZXNjcmlwdG9yID0gbnVsbDsiKTsNCisNCisgICAgICAgICAgICBmb3JlYWNoIChNZXNzYWdlRGVzY3JpcHRvciBtZXNzYWdlIGluIERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VHZW5lcmF0b3IobWVzc2FnZSkuR2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycyh3cml0ZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3JlYWNoIChGaWVsZERlc2NyaXB0b3IgZXh0ZW5zaW9uIGluIERlc2NyaXB0b3IuRXh0ZW5zaW9ucykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIG5ldyBFeHRlbnNpb25HZW5lcmF0b3IoZXh0ZW5zaW9uKS5HZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKHdyaXRlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdyaXRlci5PdXRkZW50KCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIiNlbmRyZWdpb24iKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b0dlbi9hcHAuY29uZmlnIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9hcHAuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YjMyNGIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvR2VuL2FwcC5jb25maWcKQEAgLTAsMCArMSw3IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4NCis8Y29uZmlndXJhdGlvbj4NCisgIDxzdGFydHVwIHVzZUxlZ2FjeVYyUnVudGltZUFjdGl2YXRpb25Qb2xpY3k9InRydWUiPg0KKyAgICA8c3VwcG9ydGVkUnVudGltZSB2ZXJzaW9uPSJ2Mi4wLjUwNzI3IiAvPg0KKyAgICA8c3VwcG9ydGVkUnVudGltZSB2ZXJzaW9uPSJ2NC4wIiBza3U9Ii5ORVRGcmFtZXdvcmssVmVyc2lvbj12NC4wLFByb2ZpbGU9Q2xpZW50IiAvPg0KKyAgPC9zdGFydHVwPg0KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvR2VuL3Byb3RvYy1nZW4tY3MuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9wcm90b2MtZ2VuLWNzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGM4OGNjCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b0dlbi9wcm90b2MtZ2VuLWNzLmNzcHJvagpAQCAtMCwwICsxLDEwMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q0xJRU5UUFJPRklMRTwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPk5FVDM1PC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+ezI1MEFERTM0LTgyRkQtNEJBRS04NkQ1LTk4NUZCRTU4OUM0Qn08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVycy5Qcm90b0dlbjwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5wcm90b2MtZ2VuLWNzPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxTdGFydHVwT2JqZWN0Pkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9HZW4uUHJvdG9jR2VuQ3M8L1N0YXJ0dXBPYmplY3Q+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMzVcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMzVcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDM1XFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvclV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkVudW1GaWVsZEdlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRW51bUdlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uR2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEdlbmVyYXRvckJhc2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklGaWVsZFNvdXJjZUdlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVNvdXJjZUdlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZUZpZWxkR2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlR2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQbHVnaW5Qcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NHZW5Dcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2aWNlR2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0b3JPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIZWxwZXJzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJbnZhbGlkT3B0aW9uc0V4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZpY2VJbnRlcmZhY2VHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNvdXJjZUdlbmVyYXRvckJhc2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNvdXJjZUdlbmVyYXRvcnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlVtYnJlbGxhQ2xhc3NHZW5lcmF0b3IuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXFByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezIzMTM5MWFmLTQ0OWMtNGEzOS05ODZjLWFkN2YyNzBmNDc1MH08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb248L05hbWU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJhcHAuY29uZmlnIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b011bmdlL1Byb2dyYW0uY3MgYi9jc2hhcnAvc3JjL1Byb3RvTXVuZ2UvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2RjMzUwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b011bmdlL1Byb2dyYW0uY3MKQEAgLTAsMCArMSwzMDUgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlByb3RvTXVuZ2UNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFV0aWxpdHkgY29uc29sZSBhcHBsaWNhdGlvbiB3aGljaCB0YWtlcyBhIG1lc3NhZ2UgZGVzY3JpcHRvciBhbmQgYSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UsDQorICAgIC8vLyBhbmQgcHJvZHVjZXMgYSBuZXcgbWVzc2FnZSB3aXRoIHNpbWlsYXIgYnV0IHJhbmRvbSBkYXRhLiBUaGUgZGF0YSBpcyB0aGUgc2FtZSBsZW5ndGgNCisgICAgLy8vIGFzIHRoZSBvcmlnaW5hbCwgYnV0IHdpdGggcmFuZG9tIHZhbHVlcyB3aXRoaW4gYXBwcm9wcmlhdGUgYmFuZHMuIChGb3IgaW5zdGFuY2UsIGEgY29tcHJlc3NlZA0KKyAgICAvLy8gaW50ZWdlciBpbiB0aGUgcmFuZ2UgMC0xMjcgd2lsbCBlbmQgdXAgYXMgYW5vdGhlciBpbnRlZ2VyIGluIHRoZSBzYW1lIHJhbmdlLCB0byBrZWVwIHRoZSBsZW5ndGgNCisgICAgLy8vIHRoZSBzYW1lLikNCisgICAgLy8vIFRPRE8oam9uc2tlZXQpOiBQb3RlbnRpYWxseSByZWZhY3RvciB0byB1c2UgYW4gaW5zdGFuY2UgaW5zdGVhZCwgbWFraW5nIGl0IHNpbXBsZXIgdG8NCisgICAgLy8vIGJlIHRocmVhZC1zYWZlIGZvciBleHRlcm5hbCB1c2UuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgUHJvZ3JhbQ0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSYW5kb20gcm5nID0gbmV3IFJhbmRvbSgpOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IE1haW4oc3RyaW5nW10gYXJncykNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggIT0gMykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJVc2FnZTogUHJvdG9NdW5nZSA8ZGVzY3JpcHRvciB0eXBlIG5hbWU+IDxpbnB1dCBkYXRhPiA8b3V0cHV0IGZpbGU+Iik7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKA0KKyAgICAgICAgICAgICAgICAgICAgIlRoZSBkZXNjcmlwdG9yIHR5cGUgbmFtZSBpcyB0aGUgZnVsbHktcXVhbGlmaWVkIG1lc3NhZ2UgbmFtZSwgaW5jbHVkaW5nIGFzc2VtYmx5LiIpOw0KKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgNCisgICAgICAgICAgICAgICAgICAgICIoQXQgYSBmdXR1cmUgZGF0ZSBpdCBtYXkgYmUgcG9zc2libGUgdG8gZG8gdGhpcyB3aXRob3V0IGJ1aWxkaW5nIHRoZSAuTkVUIGFzc2VtYmx5IGF0IGFsbC4pIik7DQorICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBJTWVzc2FnZSBkZWZhdWx0TWVzc2FnZTsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlID0gTWVzc2FnZVV0aWwuR2V0RGVmYXVsdE1lc3NhZ2UoYXJnc1swXSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoZS5NZXNzYWdlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgSUJ1aWxkZXIgYnVpbGRlciA9IGRlZmF1bHRNZXNzYWdlLldlYWtDcmVhdGVCdWlsZGVyRm9yVHlwZSgpOw0KKyAgICAgICAgICAgICAgICBieXRlW10gaW5wdXREYXRhID0gRmlsZS5SZWFkQWxsQnl0ZXMoYXJnc1sxXSk7DQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuV2Vha01lcmdlRnJvbShCeXRlU3RyaW5nLkNvcHlGcm9tKGlucHV0RGF0YSkpOw0KKyAgICAgICAgICAgICAgICBJTWVzc2FnZSBvcmlnaW5hbCA9IGJ1aWxkZXIuV2Vha0J1aWxkKCk7DQorICAgICAgICAgICAgICAgIElNZXNzYWdlIG11bmdlZCA9IE11bmdlKG9yaWdpbmFsKTsNCisgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsLlNlcmlhbGl6ZWRTaXplICE9IG11bmdlZC5TZXJpYWxpemVkU2l6ZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiU2VyaWFsaXplZCBzaXplcyBkb24ndCBtYXRjaCIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxCeXRlcyhhcmdzWzJdLCBtdW5nZWQuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgiRXJyb3I6IHswfSIsIGUuTWVzc2FnZSk7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCk7DQorICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJEZXRhaWxlZCBleGNlcHRpb24gaW5mb3JtYXRpb246IHswfSIsIGUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTXVuZ2VzIGEgbWVzc2FnZSByZWN1cnNpdmVseS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJldHVybnM+QSBuZXcgbWVzc2FnZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBvcmlnaW5hbCBtZXNzYWdlLA0KKyAgICAgICAgLy8vIGJ1dCBtdW5nZWQgc28gdGhhdCBhbGwgdGhlIGRhdGEgaXMgZGVzZW5zaXRpc2VkLjwvcmV0dXJucz4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIElNZXNzYWdlIE11bmdlKElNZXNzYWdlIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgSUJ1aWxkZXIgYnVpbGRlciA9IG1lc3NhZ2UuV2Vha0NyZWF0ZUJ1aWxkZXJGb3JUeXBlKCk7DQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhaXIgaW4gbWVzc2FnZS5BbGxGaWVsZHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAocGFpci5LZXkuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IHNpbmdsZVZhbHVlIGluIChJRW51bWVyYWJsZSkgcGFpci5WYWx1ZSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLldlYWtBZGRSZXBlYXRlZEZpZWxkKHBhaXIuS2V5LCBDaGVja2VkTXVuZ2VWYWx1ZShwYWlyLktleSwgc2luZ2xlVmFsdWUpKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXJbcGFpci5LZXldID0gQ2hlY2tlZE11bmdlVmFsdWUocGFpci5LZXksIHBhaXIuVmFsdWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIElNZXNzYWdlIG11bmdlZCA9IGJ1aWxkZXIuV2Vha0J1aWxkKCk7DQorICAgICAgICAgICAgaWYgKG1lc3NhZ2UuU2VyaWFsaXplZFNpemUgIT0gbXVuZ2VkLlNlcmlhbGl6ZWRTaXplKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlN1YiBtZXNzYWdlIHNpemVzOiB7MH0vezF9IiwgbWVzc2FnZS5TZXJpYWxpemVkU2l6ZSwgbXVuZ2VkLlNlcmlhbGl6ZWRTaXplKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIG11bmdlZDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBNdW5nZXMgYSBzaW5nbGUgdmFsdWUgYW5kIGNoZWNrcyB0aGF0IHRoZSBsZW5ndGggZW5kcyB1cCB0aGUgc2FtZSBhcyBpdCB3YXMgYmVmb3JlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBDaGVja2VkTXVuZ2VWYWx1ZShGaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yLCBvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50IGN1cnJlbnRTaXplID0gQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZpZWxkU2l6ZShmaWVsZERlc2NyaXB0b3IuRmllbGRUeXBlLCBmaWVsZERlc2NyaXB0b3IuRmllbGROdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7DQorICAgICAgICAgICAgb2JqZWN0IG11bmdlZFZhbHVlID0gTXVuZ2VWYWx1ZShmaWVsZERlc2NyaXB0b3IsIHZhbHVlKTsNCisgICAgICAgICAgICBpbnQgbXVuZ2VkU2l6ZSA9IENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGaWVsZFNpemUoZmllbGREZXNjcmlwdG9yLkZpZWxkVHlwZSwgZmllbGREZXNjcmlwdG9yLkZpZWxkTnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdW5nZWRWYWx1ZSk7DQorICAgICAgICAgICAgLy8gRXhjZXB0aW9ucyBsb2cgbW9yZSBlYXNpbHkgdGhhbiBhc3NlcnRpb25zDQorICAgICAgICAgICAgaWYgKGN1cnJlbnRTaXplICE9IG11bmdlZFNpemUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJNdW5nZWQgdmFsdWUgaGFkIHdyb25nIHNpemUuIEZpZWxkIHR5cGU6ICIgKyBmaWVsZERlc2NyaXB0b3IuRmllbGRUeXBlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOyBvbGQgdmFsdWU6ICIgKyB2YWx1ZSArICI7IG5ldyB2YWx1ZTogIiArIG11bmdlZFZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIG11bmdlZFZhbHVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE11bmdlcyBhIHNpbmdsZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkIGRlc2NyaXB0b3IuIChpLmUuIGlmIHRoZSBmaWVsZCBpcw0KKyAgICAgICAgLy8vIGFjdHVhbGx5IGEgcmVwZWF0ZWQgaW50LCB0aGlzIG1ldGhvZCByZWNlaXZlcyBhIHNpbmdsZSBpbnQgdmFsdWUgdG8gbXVuZ2UsIGFuZA0KKyAgICAgICAgLy8vIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcykuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IE11bmdlVmFsdWUoRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvciwgb2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN3aXRjaCAoZmllbGREZXNjcmlwdG9yLkZpZWxkVHlwZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQ2NDoNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuSW50NjQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGxvbmcpIE11bmdlVmFyaW50NjQoKHVsb25nKSAobG9uZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50NjQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTXVuZ2VWYXJpbnQ2NCgodWxvbmcpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ludDMyOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQpIE11bmdlVmFyaW50MzIoKHVpbnQpIChpbnQpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuSW50MzI6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTXVuZ2VJbnQzMigoaW50KSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNdW5nZVZhcmludDMyKCh1aW50KSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkRvdWJsZToNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBybmcuTmV4dERvdWJsZSgpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GbG9hdDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmxvYXQpIHJuZy5OZXh0RG91YmxlKCk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkNjQ6DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVs4XTsNCisgICAgICAgICAgICAgICAgICAgICAgICBybmcuTmV4dEJ5dGVzKGRhdGEpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9VSW50NjQoZGF0YSwgMCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVs0XTsNCisgICAgICAgICAgICAgICAgICAgICAgICBybmcuTmV4dEJ5dGVzKGRhdGEpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9VSW50MzIoZGF0YSwgMCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkJvb2w6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm5nLk5leHQoMikgPT0gMTsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU3RyaW5nOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE11bmdlU3RyaW5nKChzdHJpbmcpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuR3JvdXA6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLk1lc3NhZ2U6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTXVuZ2UoKElNZXNzYWdlKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkJ5dGVzOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE11bmdlQnl0ZVN0cmluZygoQnl0ZVN0cmluZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TRml4ZWQ2NDoNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzhdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJuZy5OZXh0Qnl0ZXMoZGF0YSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5Ub0ludDY0KGRhdGEsIDApOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TRml4ZWQzMjoNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzRdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJuZy5OZXh0Qnl0ZXMoZGF0YSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5Ub0ludDMyKGRhdGEsIDApOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5FbnVtOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE11bmdlRW51bShmaWVsZERlc2NyaXB0b3IsIChFbnVtVmFsdWVEZXNjcmlwdG9yKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGpvbnNrZWV0KTogRGlmZmVyZW50IGV4Y2VwdGlvbj8NCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBmaWVsZCBkZXNjcmlwdG9yIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IE11bmdlU3RyaW5nKHN0cmluZyBvcmlnaW5hbCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoIChjaGFyIGMgaW4gb3JpZ2luYWwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoYyA+IDEyNykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBoYW5kbGUgbm9uLWFzY2lpIHlldCIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW29yaWdpbmFsLkxlbmd0aF07DQorICAgICAgICAgICAgLy8gQ29udmVydCB0byBwdXJlIEFTQ0lJIC0gbm8gY29udHJvbCBjaGFyYWN0ZXJzLg0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhcnMuTGVuZ3RoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjaGFyc1tpXSA9IChjaGFyKSBybmcuTmV4dCgzMiwgMTI3KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBzdHJpbmcoY2hhcnMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEludDMyIGZpZWxkcyBhcmUgc2xpZ2h0bHkgc3RyYW5nZSAtIHdlIG5lZWQgdG8ga2VlcCB0aGUgc2lnbiB0aGUgc2FtZSB3YXkgaXQgaXM6DQorICAgICAgICAvLy8gbmVnYXRpdmUgbnVtYmVycyBjYW4gbXVuZ2UgdG8gYW55IG90aGVyIG5lZ2F0aXZlIG51bWJlciAoaXQnbGwgYWx3YXlzIHRha2UNCisgICAgICAgIC8vLyAxMCBieXRlcykgYnV0IHBvc2l0aXZlIG51bWJlcnMgaGF2ZSB0byBzdGF5IHBvc2l0aXZlLCBzbyB3ZSBjYW4ndCB1c2UgdGhlDQorICAgICAgICAvLy8gZnVsbCByYW5nZSBvZiAzMiBiaXRzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBNdW5nZUludDMyKGludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAodmFsdWUgPCAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHJuZy5OZXh0KGludC5NaW5WYWx1ZSwgMCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGludCBsZW5ndGggPSBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlUmF3VmFyaW50MzJTaXplKCh1aW50KSB2YWx1ZSk7DQorICAgICAgICAgICAgdWludCBtaW4gPSBsZW5ndGggPT0gMSA/IDAgOiAxVSA8PCAoKGxlbmd0aCAtIDEpKjcpOw0KKyAgICAgICAgICAgIHVpbnQgbWF4ID0gbGVuZ3RoID09IDUgPyBpbnQuTWF4VmFsdWUgOiAoMVUgPDwgKGxlbmd0aCo3KSkgLSAxOw0KKyAgICAgICAgICAgIHJldHVybiAoaW50KSBOZXh0UmFuZG9tVUludDY0KG1pbiwgbWF4KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHVpbnQgTXVuZ2VWYXJpbnQzMih1aW50IG9yaWdpbmFsKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGludCBsZW5ndGggPSBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlUmF3VmFyaW50MzJTaXplKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB1aW50IG1pbiA9IGxlbmd0aCA9PSAxID8gMCA6IDFVIDw8ICgobGVuZ3RoIC0gMSkqNyk7DQorICAgICAgICAgICAgdWludCBtYXggPSBsZW5ndGggPT0gNSA/IHVpbnQuTWF4VmFsdWUgOiAoMVUgPDwgKGxlbmd0aCo3KSkgLSAxOw0KKyAgICAgICAgICAgIHJldHVybiAodWludCkgTmV4dFJhbmRvbVVJbnQ2NChtaW4sIG1heCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyB1bG9uZyBNdW5nZVZhcmludDY0KHVsb25nIG9yaWdpbmFsKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGludCBsZW5ndGggPSBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlUmF3VmFyaW50NjRTaXplKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB1bG9uZyBtaW4gPSBsZW5ndGggPT0gMSA/IDAgOiAxVUwgPDwgKChsZW5ndGggLSAxKSo3KTsNCisgICAgICAgICAgICB1bG9uZyBtYXggPSBsZW5ndGggPT0gMTAgPyB1bG9uZy5NYXhWYWx1ZSA6ICgxVUwgPDwgKGxlbmd0aCo3KSkgLSAxOw0KKyAgICAgICAgICAgIHJldHVybiBOZXh0UmFuZG9tVUludDY0KG1pbiwgbWF4KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIGEgcmFuZG9tIG51bWJlciBpbiB0aGUgcmFuZ2UgW21pbiwgbWF4XSAoYm90aCBpbmNsdXNpdmUpLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gICAgDQorICAgICAgICBwcml2YXRlIHN0YXRpYyB1bG9uZyBOZXh0UmFuZG9tVUludDY0KHVsb25nIG1pbiwgdWxvbmcgbWF4KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChtaW4gPiBtYXgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIm1pbiBtdXN0IGJlIDw9IG1heDsgbWluPSIgKyBtaW4gKyAiOyBtYXggPSAiICsgbWF4KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdWxvbmcgcmFuZ2UgPSBtYXggLSBtaW47DQorICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBhY3R1YWxseSB0ZXJyaWJseSBnb29kIGF0IHZlcnkgbGFyZ2UgcmFuZ2VzIC0gYnV0IGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBmb3IgdGhlIHNha2UNCisgICAgICAgICAgICAvLyBvZiB0aGlzIHByb2dyYW0uDQorICAgICAgICAgICAgcmV0dXJuIG1pbiArICh1bG9uZykgKHJhbmdlKnJuZy5OZXh0RG91YmxlKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IE11bmdlRW51bShGaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yLCBFbnVtVmFsdWVEZXNjcmlwdG9yIG9yaWdpbmFsKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIEZpbmQgYWxsIHRoZSB2YWx1ZXMgd2hpY2ggZ2V0IGVuY29kZWQgdG8gdGhlIHNhbWUgc2l6ZSBhcyB0aGUgY3VycmVudCB2YWx1ZSwgYW5kIHBpY2sgb25lIGF0IHJhbmRvbQ0KKyAgICAgICAgICAgIGludCBvcmlnaW5hbFNpemUgPSBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlUmF3VmFyaW50MzJTaXplKCh1aW50KSBvcmlnaW5hbC5OdW1iZXIpOw0KKyAgICAgICAgICAgIExpc3Q8RW51bVZhbHVlRGVzY3JpcHRvcj4gc2FtZVNpemVWYWx1ZXMgPSBuZXcgTGlzdDxFbnVtVmFsdWVEZXNjcmlwdG9yPigpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEVudW1WYWx1ZURlc2NyaXB0b3IgY2FuZGlkYXRlIGluIGZpZWxkRGVzY3JpcHRvci5FbnVtVHlwZS5WYWx1ZXMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZSgodWludCkgY2FuZGlkYXRlLk51bWJlcikgPT0gb3JpZ2luYWxTaXplKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBzYW1lU2l6ZVZhbHVlcy5BZGQoY2FuZGlkYXRlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gc2FtZVNpemVWYWx1ZXNbcm5nLk5leHQoc2FtZVNpemVWYWx1ZXMuQ291bnQpXTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBNdW5nZUJ5dGVTdHJpbmcoQnl0ZVN0cmluZyBieXRlU3RyaW5nKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbYnl0ZVN0cmluZy5MZW5ndGhdOw0KKyAgICAgICAgICAgIHJuZy5OZXh0Qnl0ZXMoZGF0YSk7DQorICAgICAgICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcuQ29weUZyb20oZGF0YSk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b011bmdlL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvY3NoYXJwL3NyYy9Qcm90b011bmdlL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ODI3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvTXVuZ2UvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSwzMCBAQAordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQorDQorLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyANCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbg0KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4NCisNCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlByb3RvTXVuZ2UiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlByb3RvTXVuZ2UiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMDgiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildDQorDQorLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoNCisvLw0KKy8vICAgICAgTWFqb3IgVmVyc2lvbg0KKy8vICAgICAgTWlub3IgVmVyc2lvbiANCisvLyAgICAgIEJ1aWxkIE51bWJlcg0KKy8vICAgICAgUmV2aXNpb24NCisvLw0KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzIA0KKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6DQorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjIuNC4xLjU1NSIpXQ0KKw0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIyLjQuMS41NTUiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjIuNC4xLjU1NSIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9NdW5nZS9Qcm90b011bmdlLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9NdW5nZS9Qcm90b011bmdlLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWUxYTlhCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b011bmdlL1Byb3RvTXVuZ2UuY3Nwcm9qCkBAIC0wLDAgKzEsNjUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQzNTwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns4RjA5QUY3Mi0zMzI3LTRGQTctQkMwOS0wNzBCODAyMjFBQjl9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9NdW5nZTwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Qcm90b011bmdlPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDM1XERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvZ3JhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnM8L05hbWU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vQWJzdHJhY3RSZWFkZXIuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0Fic3RyYWN0UmVhZGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOThkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0Fic3RyYWN0UmVhZGVyLmNzCkBAIC0wLDAgKzEsNjg4IEBACit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCisvL0Rpc2FibGUgQ1MzMDExOiBvbmx5IENMUy1jb21wbGlhbnQgbWVtYmVycyBjYW4gYmUgYWJzdHJhY3QNCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAzMDExDQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbg0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gUHJvdmlkZXMgYSBiYXNlLWNsYXNzIHRoYXQgcHJvdmlkZXMgc29tZSBiYXNpYyBmdW5jdGlvbmFsaXR5IGZvciBoYW5kbGluZyB0eXBlIGRpc3BhdGNoaW5nDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlYWRlciA6IElDb2RlZElucHV0U3RyZWFtDQorICAgIHsNCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERlZmF1bHRNYXhEZXB0aCA9IDY0Ow0KKyAgICAgICAgcHJpdmF0ZSBpbnQgX2RlcHRoOw0KKyAgICAgICAgDQorICAgICAgICAvLy8gPHN1bW1hcnk+IENvbnN0cnVjdHMgYSBuZXcgcmVhZGVyIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBBYnN0cmFjdFJlYWRlcigpIHsgTWF4RGVwdGggPSBEZWZhdWx0TWF4RGVwdGg7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4gR2V0cyBvciBzZXRzIHRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCBhbGxvd2VkIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBpbnQgTWF4RGVwdGggeyBnZXQ7IHNldDsgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE1lcmdlcyB0aGUgY29udGVudHMgb2Ygc3RyZWFtIGludG8gdGhlIHByb3ZpZGVkIG1lc3NhZ2UgYnVpbGRlcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBUQnVpbGRlciBNZXJnZTxUQnVpbGRlcj4oVEJ1aWxkZXIgYnVpbGRlcikgd2hlcmUgVEJ1aWxkZXIgOiBJQnVpbGRlckxpdGUNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2UoYnVpbGRlciwgRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE1lcmdlcyB0aGUgY29udGVudHMgb2Ygc3RyZWFtIGludG8gdGhlIHByb3ZpZGVkIG1lc3NhZ2UgYnVpbGRlcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUQnVpbGRlciBNZXJnZTxUQnVpbGRlcj4oVEJ1aWxkZXIgYnVpbGRlciwgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpDQorICAgICAgICAgICAgd2hlcmUgVEJ1aWxkZXIgOiBJQnVpbGRlckxpdGU7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUGVla3MgYXQgdGhlIG5leHQgZmllbGQgaW4gdGhlIGlucHV0IHN0cmVhbSBhbmQgcmV0dXJucyB3aGF0IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+DQorICAgICAgICAvLy8gVGhpcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGhvdXQgYWN0dWFsbHkgcmVhZGluZyB0aGUgZmllbGQuICBPbmx5IGFmdGVyIHRoZSBmaWVsZA0KKyAgICAgICAgLy8vIGlzIGVpdGhlciByZWFkLCBvciBza2lwcGVkLCBzaG91bGQgUGVla05leHQgcmV0dXJuIGEgZGlmZmVyZW50IHZhbHVlLg0KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4NCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sIFBlZWtOZXh0KG91dCBzdHJpbmcgZmllbGQpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENhdXNlcyB0aGUgcmVhZGVyIHRvIHNraXAgcGFzdCB0aGlzIGZpZWxkDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgU2tpcCgpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgQm9vbGVhbiBmcm9tIHRoZSBpbnB1dA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sIFJlYWQocmVmIGJvb2wgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgSW50MzIgZnJvbSB0aGUgaW5wdXQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbCBSZWFkKHJlZiBpbnQgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgVUludDMyIGZyb20gdGhlIGlucHV0DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbCBSZWFkKHJlZiB1aW50IHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgaXQgd2FzIGFibGUgdG8gcmVhZCBhIEludDY0IGZyb20gdGhlIGlucHV0DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2wgUmVhZChyZWYgbG9uZyB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0IHdhcyBhYmxlIHRvIHJlYWQgYSBVSW50NjQgZnJvbSB0aGUgaW5wdXQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sIFJlYWQocmVmIHVsb25nIHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgaXQgd2FzIGFibGUgdG8gcmVhZCBhIFNpbmdsZSBmcm9tIHRoZSBpbnB1dA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sIFJlYWQocmVmIGZsb2F0IHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgaXQgd2FzIGFibGUgdG8gcmVhZCBhIERvdWJsZSBmcm9tIHRoZSBpbnB1dA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sIFJlYWQocmVmIGRvdWJsZSB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0IHdhcyBhYmxlIHRvIHJlYWQgYSBTdHJpbmcgZnJvbSB0aGUgaW5wdXQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbCBSZWFkKHJlZiBzdHJpbmcgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgQnl0ZVN0cmluZyBmcm9tIHRoZSBpbnB1dA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sIFJlYWQocmVmIEJ5dGVTdHJpbmcgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgc2luZ2xlIHZhbHVlIGludG8gdGhlIHZhbHVlIHJlZmVyZW5jZS4gIFRoZSB2YWx1ZQ0KKyAgICAgICAgLy8vIHN0b3JlZCBtYXkgYmUgb2YgdHlwZSBTeXN0ZW0uU3RyaW5nLCBTeXN0ZW0uSW50MzIsIG9yIGFuIElFbnVtTGl0ZSBmcm9tIHRoZSBJRW51bUxpdGVNYXAuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2wgUmVhZEVudW0ocmVmIG9iamVjdCB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTWVyZ2VzIHRoZSBpbnB1dCBzdHJlYW0gaW50byB0aGUgcHJvdmlkZWQgSUJ1aWxkZXJMaXRlIA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sIFJlYWRNZXNzYWdlKElCdWlsZGVyTGl0ZSBidWlsZGVyLCBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSk7DQorICAgICAgICANCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyB0aGUgcm9vdC1tZXNzYWdlIHByZWFtYmxlIHNwZWNpZmljIHRvIHRoaXMgZm9ybWF0dGVyDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZE1lc3NhZ2VTdGFydCgpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIHRoZSByb290LW1lc3NhZ2UgY2xvc2Ugc3BlY2lmaWMgdG8gdGhpcyBmb3JtYXR0ZXINCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkTWVzc2FnZUVuZCgpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE1lcmdlcyB0aGUgaW5wdXQgc3RyZWFtIGludG8gdGhlIHByb3ZpZGVkIElCdWlsZGVyTGl0ZSANCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIFJlYWRHcm91cChJQnVpbGRlckxpdGUgdmFsdWUsIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBSZWFkTWVzc2FnZSh2YWx1ZSwgcmVnaXN0cnkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEN1cnNvcnMgdGhyb3VnaCB0aGUgYXJyYXkgZWxlbWVudHMgYW5kIHN0b3BzIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgSUVudW1lcmFibGU8c3RyaW5nPiBGb3JlYWNoQXJyYXlJdGVtKHN0cmluZyBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgbmV4dCA9IGZpZWxkOw0KKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIG5leHQ7DQorDQorICAgICAgICAgICAgICAgIGlmICghUGVla05leHQob3V0IG5leHQpIHx8IG5leHQgIT0gZmllbGQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGFuIGFycmF5IG9mIFQgbWVzc2FnZXMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIFJlYWRNZXNzYWdlQXJyYXk8VD4oc3RyaW5nIGZpZWxkLCBJQ29sbGVjdGlvbjxUPiBpdGVtcywgSU1lc3NhZ2VMaXRlIG1lc3NhZ2VUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBuZXh0IGluIEZvcmVhY2hBcnJheUl0ZW0oZmllbGQpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgSUJ1aWxkZXJMaXRlIGJ1aWxkZXIgPSBtZXNzYWdlVHlwZS5XZWFrQ3JlYXRlQnVpbGRlckZvclR5cGUoKTsNCisgICAgICAgICAgICAgICAgaWYgKFJlYWRNZXNzYWdlKGJ1aWxkZXIsIHJlZ2lzdHJ5KSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaXRlbXMuQWRkKChUKSBidWlsZGVyLldlYWtCdWlsZCgpKTsNCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgfD0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gc3VjY2VzczsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBhbiBhcnJheSBvZiBUIG1lc3NhZ2VzIGFzIGEgcHJvdG8tYnVmZmVyIGdyb3VwDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBSZWFkR3JvdXBBcnJheTxUPihzdHJpbmcgZmllbGQsIElDb2xsZWN0aW9uPFQ+IGl0ZW1zLCBJTWVzc2FnZUxpdGUgbWVzc2FnZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBuZXh0IGluIEZvcmVhY2hBcnJheUl0ZW0oZmllbGQpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgSUJ1aWxkZXJMaXRlIGJ1aWxkZXIgPSBtZXNzYWdlVHlwZS5XZWFrQ3JlYXRlQnVpbGRlckZvclR5cGUoKTsNCisgICAgICAgICAgICAgICAgaWYgKFJlYWRHcm91cChidWlsZGVyLCByZWdpc3RyeSkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGl0ZW1zLkFkZCgoVCkgYnVpbGRlci5XZWFrQnVpbGQoKSk7DQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzIHw9IHRydWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYW4gYXJyYXkgb2YgU3lzdGVtLkVudW0gdHlwZSBUIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGNvbGxlY3Rpb24NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIFJlYWRFbnVtQXJyYXkoc3RyaW5nIGZpZWxkLCBJQ29sbGVjdGlvbjxvYmplY3Q+IGl0ZW1zKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBuZXh0IGluIEZvcmVhY2hBcnJheUl0ZW0oZmllbGQpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgb2JqZWN0IHRlbXAgPSBudWxsOw0KKyAgICAgICAgICAgICAgICBpZiAoUmVhZEVudW0ocmVmIHRlbXApKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpdGVtcy5BZGQodGVtcCk7DQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzIHw9IHRydWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYW4gYXJyYXkgb2YgVCwgd2hlcmUgVCBpcyBhIHByaW1pdGl2ZSB0eXBlIGRlZmluZWQgYnkgRmllbGRUeXBlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBSZWFkQXJyYXk8VD4oRmllbGRUeXBlIHR5cGUsIHN0cmluZyBmaWVsZCwgSUNvbGxlY3Rpb248VD4gaXRlbXMpDQorICAgICAgICB7DQorICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7DQorICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIG5leHQgaW4gRm9yZWFjaEFycmF5SXRlbShmaWVsZCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBvYmplY3QgdGVtcCA9IG51bGw7DQorICAgICAgICAgICAgICAgIGlmIChSZWFkRmllbGQodHlwZSwgcmVmIHRlbXApKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpdGVtcy5BZGQoKFQpIHRlbXApOw0KKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyB8PSB0cnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgc2luZ2xlIHByaW1pdGl2ZSB2YWx1ZSBvZiBGaWVsZFR5cGUgaW50byB0aGUgdmFsdWUgcmVmZXJlbmNlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBSZWFkRmllbGQoRmllbGRUeXBlIHR5cGUsIHJlZiBvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3dpdGNoICh0eXBlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuQm9vbDoNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRlbXAgPSBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZChyZWYgdGVtcCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRlbXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkludDY0Og0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TSW50NjQ6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNGaXhlZDY0Og0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGVtcCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWQocmVmIHRlbXApKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0ZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50NjQ6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkNjQ6DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdWxvbmcgdGVtcCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWQocmVmIHRlbXApKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0ZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQzMjoNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ludDMyOg0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TRml4ZWQzMjoNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGVtcCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWQocmVmIHRlbXApKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0ZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50MzI6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdWludCB0ZW1wID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZChyZWYgdGVtcCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRlbXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZsb2F0Og0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRlbXAgPSBmbG9hdC5OYU47DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWQocmVmIHRlbXApKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0ZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Eb3VibGU6DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRlbXAgPSBmbG9hdC5OYU47DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWQocmVmIHRlbXApKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0ZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TdHJpbmc6DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRlbXAgPSBudWxsOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWFkKHJlZiB0ZW1wKSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGVtcDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuQnl0ZXM6DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyB0ZW1wID0gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZChyZWYgdGVtcCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRlbXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgICNyZWdpb24gSUNvZGVkSW5wdXRTdHJlYW0gTWVtYmVycw0KKw0KKyAgICAgICAgYm9vbCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkVGFnKG91dCB1aW50IGZpZWxkVGFnLCBvdXQgc3RyaW5nIGZpZWxkTmFtZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmaWVsZFRhZyA9IDA7DQorICAgICAgICAgICAgaWYgKFBlZWtOZXh0KG91dCBmaWVsZE5hbWUpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGJvb2wgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZERvdWJsZShyZWYgZG91YmxlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBSZWFkKHJlZiB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBib29sIElDb2RlZElucHV0U3RyZWFtLlJlYWRGbG9hdChyZWYgZmxvYXQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIFJlYWQocmVmIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGJvb2wgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZFVJbnQ2NChyZWYgdWxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIFJlYWQocmVmIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGJvb2wgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZEludDY0KHJlZiBsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBSZWFkKHJlZiB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBib29sIElDb2RlZElucHV0U3RyZWFtLlJlYWRJbnQzMihyZWYgaW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBSZWFkKHJlZiB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBib29sIElDb2RlZElucHV0U3RyZWFtLlJlYWRGaXhlZDY0KHJlZiB1bG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gUmVhZChyZWYgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgYm9vbCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkRml4ZWQzMihyZWYgdWludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gUmVhZChyZWYgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgYm9vbCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkQm9vbChyZWYgYm9vbCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gUmVhZChyZWYgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgYm9vbCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkU3RyaW5nKHJlZiBzdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIFJlYWQocmVmIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZEdyb3VwKGludCBmaWVsZE51bWJlciwgSUJ1aWxkZXJMaXRlIGJ1aWxkZXIsIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChfZGVwdGgrKyA+IE1heERlcHRoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlY3Vyc2lvbkxpbWl0RXhjZWVkZWRFeGNlcHRpb24oKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgUmVhZEdyb3VwKGJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICBfZGVwdGgtLTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZFVua25vd25Hcm91cChpbnQgZmllbGROdW1iZXIsIElCdWlsZGVyTGl0ZSBidWlsZGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZE1lc3NhZ2UoSUJ1aWxkZXJMaXRlIGJ1aWxkZXIsIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChfZGVwdGgrKyA+IE1heERlcHRoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlY3Vyc2lvbkxpbWl0RXhjZWVkZWRFeGNlcHRpb24oKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgUmVhZE1lc3NhZ2UoYnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgIF9kZXB0aC0tOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgYm9vbCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkQnl0ZXMocmVmIEJ5dGVTdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIFJlYWQocmVmIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGJvb2wgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZFVJbnQzMihyZWYgdWludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gUmVhZChyZWYgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgYm9vbCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkRW51bShyZWYgSUVudW1MaXRlIHZhbHVlLCBvdXQgb2JqZWN0IHVua25vd24sIElFbnVtTGl0ZU1hcCBtYXBwaW5nKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhbHVlID0gbnVsbDsNCisgICAgICAgICAgICB1bmtub3duID0gbnVsbDsNCisgICAgICAgICAgICBpZiAoUmVhZEVudW0ocmVmIHVua25vd24pKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd24gaXMgaW50KQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1hcHBpbmcuRmluZFZhbHVlQnlOdW1iZXIoKGludCkgdW5rbm93bik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZSBpZiAodW5rbm93biBpcyBzdHJpbmcpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbWFwcGluZy5GaW5kVmFsdWVCeU5hbWUoKHN0cmluZykgdW5rbm93bik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGJvb2wgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZEVudW08VD4ocmVmIFQgdmFsdWUsIG91dCBvYmplY3QgcmF3VmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmF3VmFsdWUgPSBudWxsOw0KKyAgICAgICAgICAgIGlmIChSZWFkRW51bShyZWYgcmF3VmFsdWUpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKCFFbnVtUGFyc2VyPFQ+LlRyeUNvbnZlcnQocmF3VmFsdWUsIHJlZiB2YWx1ZSkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZGVmYXVsdChUKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgYm9vbCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkU0ZpeGVkMzIocmVmIGludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gUmVhZChyZWYgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgYm9vbCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkU0ZpeGVkNjQocmVmIGxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIFJlYWQocmVmIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGJvb2wgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZFNJbnQzMihyZWYgaW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBSZWFkKHJlZiB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBib29sIElDb2RlZElucHV0U3RyZWFtLlJlYWRTSW50NjQocmVmIGxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIFJlYWQocmVmIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZFByaW1pdGl2ZUFycmF5KEZpZWxkVHlwZSBmaWVsZFR5cGUsIHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ29sbGVjdGlvbjxvYmplY3Q+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgUmVhZEFycmF5KGZpZWxkVHlwZSwgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZEVudW1BcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxJRW51bUxpdGU+IGxpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IElDb2xsZWN0aW9uPG9iamVjdD4gdW5rbm93biwgSUVudW1MaXRlTWFwIG1hcHBpbmcpDQorICAgICAgICB7DQorICAgICAgICAgICAgdW5rbm93biA9IG51bGw7DQorICAgICAgICAgICAgTGlzdDxvYmplY3Q+IGFycmF5ID0gbmV3IExpc3Q8b2JqZWN0PigpOw0KKyAgICAgICAgICAgIGlmIChSZWFkRW51bUFycmF5KGZpZWxkTmFtZSwgYXJyYXkpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IHJhd1ZhbHVlIGluIGFycmF5KQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBJRW51bUxpdGUgaXRlbSA9IG51bGw7DQorICAgICAgICAgICAgICAgICAgICBpZiAocmF3VmFsdWUgaXMgaW50KQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBtYXBwaW5nLkZpbmRWYWx1ZUJ5TnVtYmVyKChpbnQpIHJhd1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhd1ZhbHVlIGlzIHN0cmluZykNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gbWFwcGluZy5GaW5kVmFsdWVCeU5hbWUoKHN0cmluZykgcmF3VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZChpdGVtKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5rbm93biA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biA9IG5ldyBMaXN0PG9iamVjdD4oKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bi5BZGQocmF3VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkRW51bUFycmF5PFQ+KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPFQ+IGxpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IElDb2xsZWN0aW9uPG9iamVjdD4gdW5rbm93bikNCisgICAgICAgIHsNCisgICAgICAgICAgICB1bmtub3duID0gbnVsbDsNCisgICAgICAgICAgICBMaXN0PG9iamVjdD4gYXJyYXkgPSBuZXcgTGlzdDxvYmplY3Q+KCk7DQorICAgICAgICAgICAgaWYgKFJlYWRFbnVtQXJyYXkoZmllbGROYW1lLCBhcnJheSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgcmF3VmFsdWUgaW4gYXJyYXkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFQgdmFsID0gZGVmYXVsdChUKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChFbnVtUGFyc2VyPFQ+LlRyeUNvbnZlcnQocmF3VmFsdWUsIHJlZiB2YWwpKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKHZhbCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVua25vd24gPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24gPSBuZXcgTGlzdDxvYmplY3Q+KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24uQWRkKHJhd1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZE1lc3NhZ2VBcnJheTxUPih1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxUPiBsaXN0LCBUIG1lc3NhZ2VUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChfZGVwdGgrKyA+IE1heERlcHRoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlY3Vyc2lvbkxpbWl0RXhjZWVkZWRFeGNlcHRpb24oKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgUmVhZE1lc3NhZ2VBcnJheShmaWVsZE5hbWUsIGxpc3QsIG1lc3NhZ2VUeXBlLCByZWdpc3RyeSk7DQorICAgICAgICAgICAgX2RlcHRoLS07DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZElucHV0U3RyZWFtLlJlYWRHcm91cEFycmF5PFQ+KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPFQ+IGxpc3QsIFQgbWVzc2FnZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChfZGVwdGgrKyA+IE1heERlcHRoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlY3Vyc2lvbkxpbWl0RXhjZWVkZWRFeGNlcHRpb24oKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgUmVhZEdyb3VwQXJyYXkoZmllbGROYW1lLCBsaXN0LCBtZXNzYWdlVHlwZSwgcmVnaXN0cnkpOw0KKyAgICAgICAgICAgIF9kZXB0aC0tOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgYm9vbCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkUHJpbWl0aXZlRmllbGQoRmllbGRUeXBlIGZpZWxkVHlwZSwgcmVmIG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gUmVhZEZpZWxkKGZpZWxkVHlwZSwgcmVmIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGJvb2wgSUNvZGVkSW5wdXRTdHJlYW0uSXNBdEVuZA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3RyaW5nIG5leHQ7DQorICAgICAgICAgICAgICAgIHJldHVybiBQZWVrTmV4dChvdXQgbmV4dCkgPT0gZmFsc2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgYm9vbCBJQ29kZWRJbnB1dFN0cmVhbS5Ta2lwRmllbGQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFNraXAoKTsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZFN0cmluZ0FycmF5KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPHN0cmluZz4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBSZWFkQXJyYXkoRmllbGRUeXBlLlN0cmluZywgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZEJ5dGVzQXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248Qnl0ZVN0cmluZz4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBSZWFkQXJyYXkoRmllbGRUeXBlLkJ5dGVzLCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkQm9vbEFycmF5KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPGJvb2w+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgUmVhZEFycmF5KEZpZWxkVHlwZS5Cb29sLCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkSW50MzJBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxpbnQ+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgUmVhZEFycmF5KEZpZWxkVHlwZS5JbnQzMiwgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZFNJbnQzMkFycmF5KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPGludD4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBSZWFkQXJyYXkoRmllbGRUeXBlLlNJbnQzMiwgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZFVJbnQzMkFycmF5KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPHVpbnQ+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgUmVhZEFycmF5KEZpZWxkVHlwZS5VSW50MzIsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZElucHV0U3RyZWFtLlJlYWRGaXhlZDMyQXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248dWludD4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBSZWFkQXJyYXkoRmllbGRUeXBlLkZpeGVkMzIsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZElucHV0U3RyZWFtLlJlYWRTRml4ZWQzMkFycmF5KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPGludD4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBSZWFkQXJyYXkoRmllbGRUeXBlLlNGaXhlZDMyLCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkSW50NjRBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxsb25nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFJlYWRBcnJheShGaWVsZFR5cGUuSW50NjQsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZElucHV0U3RyZWFtLlJlYWRTSW50NjRBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxsb25nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFJlYWRBcnJheShGaWVsZFR5cGUuU0ludDY0LCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkVUludDY0QXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248dWxvbmc+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgUmVhZEFycmF5KEZpZWxkVHlwZS5VSW50NjQsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZElucHV0U3RyZWFtLlJlYWRGaXhlZDY0QXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248dWxvbmc+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgUmVhZEFycmF5KEZpZWxkVHlwZS5GaXhlZDY0LCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRJbnB1dFN0cmVhbS5SZWFkU0ZpeGVkNjRBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxsb25nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFJlYWRBcnJheShGaWVsZFR5cGUuU0ZpeGVkNjQsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZElucHV0U3RyZWFtLlJlYWREb3VibGVBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxkb3VibGU+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgUmVhZEFycmF5KEZpZWxkVHlwZS5Eb3VibGUsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZElucHV0U3RyZWFtLlJlYWRGbG9hdEFycmF5KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPGZsb2F0PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFJlYWRBcnJheShGaWVsZFR5cGUuRmxvYXQsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9BYnN0cmFjdFRleHRSZWFkZXIuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0Fic3RyYWN0VGV4dFJlYWRlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDBhNTYwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9BYnN0cmFjdFRleHRSZWFkZXIuY3MKQEAgLTAsMCArMSwxNzcgQEAKK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsNCit1c2luZyBTeXN0ZW0uWG1sOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24NCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFByb3ZpZGVzIGEgYmFzZSBjbGFzcyBmb3IgdGV4dC1wYXJzaW5nIHJlYWRlcnMNCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGV4dFJlYWRlciA6IEFic3RyYWN0UmVhZGVyDQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4gQ29uc3RydWN0cyBhIG5ldyByZWFkZXIgPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIEFic3RyYWN0VGV4dFJlYWRlcigpIHsgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGEgdHlwZWQgZmllbGQgYXMgYSBzdHJpbmcNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbCBSZWFkQXNUZXh0KHJlZiBzdHJpbmcgdGV4dFZhbHVlLCBUeXBlIHR5cGUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgU3RyaW5nIGZyb20gdGhlIGlucHV0DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGJvb2wgUmVhZChyZWYgc3RyaW5nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gbnVsbDsNCisgICAgICAgICAgICBpZiAoUmVhZEFzVGV4dChyZWYgdGV4dCwgdHlwZW9mKHN0cmluZykpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFsdWUgPSB0ZXh0Ow0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgQm9vbGVhbiBmcm9tIHRoZSBpbnB1dA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFJlYWQocmVmIGJvb2wgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBudWxsOw0KKyAgICAgICAgICAgIGlmIChSZWFkQXNUZXh0KHJlZiB0ZXh0LCB0eXBlb2YoYm9vbCkpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFsdWUgPSBYbWxDb252ZXJ0LlRvQm9vbGVhbih0ZXh0KTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgaXQgd2FzIGFibGUgdG8gcmVhZCBhIEludDMyIGZyb20gdGhlIGlucHV0DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGJvb2wgUmVhZChyZWYgaW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gbnVsbDsNCisgICAgICAgICAgICBpZiAoUmVhZEFzVGV4dChyZWYgdGV4dCwgdHlwZW9mKGludCkpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFsdWUgPSBYbWxDb252ZXJ0LlRvSW50MzIodGV4dCk7DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0IHdhcyBhYmxlIHRvIHJlYWQgYSBVSW50MzIgZnJvbSB0aGUgaW5wdXQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFJlYWQocmVmIHVpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBudWxsOw0KKyAgICAgICAgICAgIGlmIChSZWFkQXNUZXh0KHJlZiB0ZXh0LCB0eXBlb2YodWludCkpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFsdWUgPSBYbWxDb252ZXJ0LlRvVUludDMyKHRleHQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgSW50NjQgZnJvbSB0aGUgaW5wdXQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBSZWFkKHJlZiBsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gbnVsbDsNCisgICAgICAgICAgICBpZiAoUmVhZEFzVGV4dChyZWYgdGV4dCwgdHlwZW9mKGxvbmcpKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhbHVlID0gWG1sQ29udmVydC5Ub0ludDY0KHRleHQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgVUludDY0IGZyb20gdGhlIGlucHV0DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBSZWFkKHJlZiB1bG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IG51bGw7DQorICAgICAgICAgICAgaWYgKFJlYWRBc1RleHQocmVmIHRleHQsIHR5cGVvZih1bG9uZykpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFsdWUgPSBYbWxDb252ZXJ0LlRvVUludDY0KHRleHQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgU2luZ2xlIGZyb20gdGhlIGlucHV0DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGJvb2wgUmVhZChyZWYgZmxvYXQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBudWxsOw0KKyAgICAgICAgICAgIGlmIChSZWFkQXNUZXh0KHJlZiB0ZXh0LCB0eXBlb2YoZmxvYXQpKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhbHVlID0gWG1sQ29udmVydC5Ub1NpbmdsZSh0ZXh0KTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgaXQgd2FzIGFibGUgdG8gcmVhZCBhIERvdWJsZSBmcm9tIHRoZSBpbnB1dA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFJlYWQocmVmIGRvdWJsZSB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IG51bGw7DQorICAgICAgICAgICAgaWYgKFJlYWRBc1RleHQocmVmIHRleHQsIHR5cGVvZihkb3VibGUpKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhbHVlID0gWG1sQ29udmVydC5Ub0RvdWJsZSh0ZXh0KTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQcm92aWRlcyBkZWNvZGluZyBvZiBieXRlcyByZWFkIGZyb20gdGhlIGlucHV0IHN0cmVhbQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIEJ5dGVTdHJpbmcgRGVjb2RlQnl0ZXMoc3RyaW5nIGJ5dGVzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBCeXRlU3RyaW5nLkZyb21CYXNlNjQoYnl0ZXMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgQnl0ZVN0cmluZyBmcm9tIHRoZSBpbnB1dA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFJlYWQocmVmIEJ5dGVTdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBudWxsOw0KKyAgICAgICAgICAgIGlmIChSZWFkQXNUZXh0KHJlZiB0ZXh0LCB0eXBlb2YoQnl0ZVN0cmluZykpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFsdWUgPSBEZWNvZGVCeXRlcyh0ZXh0KTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWYgaXQgd2FzIGFibGUgdG8gcmVhZCBhIHNpbmdsZSB2YWx1ZSBpbnRvIHRoZSB2YWx1ZSByZWZlcmVuY2UuICBUaGUgdmFsdWUNCisgICAgICAgIC8vLyBzdG9yZWQgbWF5IGJlIG9mIHR5cGUgU3lzdGVtLlN0cmluZywgU3lzdGVtLkludDMyLCBvciBhbiBJRW51bUxpdGUgZnJvbSB0aGUgSUVudW1MaXRlTWFwLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFJlYWRFbnVtKHJlZiBvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBudWxsOw0KKyAgICAgICAgICAgIGlmIChSZWFkQXNUZXh0KHJlZiB0ZXh0LCB0eXBlb2YoRW51bSkpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW50IG51bWJlcjsNCisgICAgICAgICAgICAgICAgaWYgKEZyYW1ld29ya1BvcnRhYmlsaXR5LlRyeVBhcnNlSW50MzIodGV4dCwgTnVtYmVyU3R5bGVzLkludGVnZXIsIEZyYW1ld29ya1BvcnRhYmlsaXR5LkludmFyaWFudEN1bHR1cmUsIG91dCBudW1iZXIpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bWJlcjsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHZhbHVlID0gdGV4dDsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0Fic3RyYWN0VGV4dFdyaXRlci5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vQWJzdHJhY3RUZXh0V3JpdGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzc4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0Fic3RyYWN0VGV4dFdyaXRlci5jcwpAQCAtMCwwICsxLDEwNiBAQAordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5YbWw7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbg0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gUHJvdmlkZXMgYSBiYXNlIGNsYXNzIGZvciB0ZXh0IHdyaXRlcnMNCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGV4dFdyaXRlciA6IEFic3RyYWN0V3JpdGVyDQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBFbmNvZGVzIHJhdyBieXRlcyB0byBiZSB3cml0dGVuIHRvIHRoZSBzdHJlYW0NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBzdHJpbmcgRW5jb2RlQnl0ZXMoQnl0ZVN0cmluZyBieXRlcykNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gYnl0ZXMuVG9CYXNlNjQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSB0eXBlZCBmaWVsZCBhcyBhIHRleHQgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBXcml0ZUFzVGV4dChzdHJpbmcgZmllbGQsIHN0cmluZyB0ZXh0VmFsdWUsIG9iamVjdCB0eXBlZFZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBTdHJpbmcgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZShzdHJpbmcgZmllbGQsIHN0cmluZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZUFzVGV4dChmaWVsZCwgdmFsdWUsIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBCb29sZWFuIHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgV3JpdGUoc3RyaW5nIGZpZWxkLCBib29sIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXNUZXh0KGZpZWxkLCBYbWxDb252ZXJ0LlRvU3RyaW5nKHZhbHVlKSwgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIEludDMyIHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgV3JpdGUoc3RyaW5nIGZpZWxkLCBpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBc1RleHQoZmllbGQsIFhtbENvbnZlcnQuVG9TdHJpbmcodmFsdWUpLCB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgVUludDMyIHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZShzdHJpbmcgZmllbGQsIHVpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBc1RleHQoZmllbGQsIFhtbENvbnZlcnQuVG9TdHJpbmcodmFsdWUpLCB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgSW50NjQgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZShzdHJpbmcgZmllbGQsIGxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBc1RleHQoZmllbGQsIFhtbENvbnZlcnQuVG9TdHJpbmcodmFsdWUpLCB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgVUludDY0IHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZShzdHJpbmcgZmllbGQsIHVsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXNUZXh0KGZpZWxkLCBYbWxDb252ZXJ0LlRvU3RyaW5nKHZhbHVlKSwgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIFNpbmdsZSB2YWx1ZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFdyaXRlKHN0cmluZyBmaWVsZCwgZmxvYXQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBc1RleHQoZmllbGQsIFhtbENvbnZlcnQuVG9TdHJpbmcodmFsdWUpLCB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgRG91YmxlIHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgV3JpdGUoc3RyaW5nIGZpZWxkLCBkb3VibGUgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBc1RleHQoZmllbGQsIFhtbENvbnZlcnQuVG9TdHJpbmcodmFsdWUpLCB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgc2V0IG9mIGJ5dGVzDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgV3JpdGUoc3RyaW5nIGZpZWxkLCBCeXRlU3RyaW5nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXNUZXh0KGZpZWxkLCBFbmNvZGVCeXRlcyh2YWx1ZSksIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBTeXN0ZW0uRW51bSBieSB0aGUgbnVtZXJpYyBhbmQgdGV4dHVhbCB2YWx1ZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFdyaXRlRW51bShzdHJpbmcgZmllbGQsIGludCBudW1iZXIsIHN0cmluZyBuYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXNUZXh0KGZpZWxkLCBuYW1lLCBudW1iZXIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vQWJzdHJhY3RXcml0ZXIuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0Fic3RyYWN0V3JpdGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzZiODgKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0Fic3RyYWN0V3JpdGVyLmNzCkBAIC0wLDAgKzEsNTA3IEBACit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorLy9EaXNhYmxlIENTMzAxMTogb25seSBDTFMtY29tcGxpYW50IG1lbWJlcnMgY2FuIGJlIGFic3RyYWN0DQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMzAxMQ0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24NCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFByb3ZpZGVzIGEgYmFzZSBjbGFzcyBmb3Igd3JpdGVycyB0aGF0IHBlcmZvcm1zIHNvbWUgYmFzaWMgdHlwZSBkaXNwYXRjaGluZw0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXcml0ZXIgOiBJQ29kZWRPdXRwdXRTdHJlYW0NCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbXBsZXRlcyBhbnkgcGVuZGluZyB3cml0ZSBvcGVyYXRpb25zDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBGbHVzaCgpDQorICAgICAgICB7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIHRoZSBtZXNzYWdlIHRvIHRoZSB0aGUgZm9ybWF0dGVkIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1lc3NhZ2UoSU1lc3NhZ2VMaXRlIG1lc3NhZ2UpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFVzZWQgdG8gd3JpdGUgYW55IG5lc3Nhcnkgcm9vdC1tZXNzYWdlIHByZWFtYmxlLiBBZnRlciB0aGlzIGNhbGwgeW91IGNhbiBjYWxsIA0KKyAgICAgICAgLy8vIElNZXNzYWdlTGl0ZS5NZXJnZVRvKC4uLikgYW5kIGNvbXBsZXRlIHRoZSBtZXNzYWdlIHdpdGggYSBjYWxsIHRvIFdyaXRlTWVzc2FnZUVuZCgpLg0KKyAgICAgICAgLy8vIFRoZXNlIHRocmVlIGNhbGxzIGFyZSBpZGVudGljYWwgdG8ganVzdCBjYWxsaW5nIFdyaXRlTWVzc2FnZShtZXNzYWdlKTsNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPGV4YW1wbGU+DQorICAgICAgICAvLy8gQWJzdHJhY3RXcml0ZXIgd3JpdGVyOw0KKyAgICAgICAgLy8vIHdyaXRlci5Xcml0ZU1lc3NhZ2VTdGFydCgpOw0KKyAgICAgICAgLy8vIG1lc3NhZ2UuV3JpdGVUbyh3cml0ZXIpOw0KKyAgICAgICAgLy8vIHdyaXRlci5Xcml0ZU1lc3NhZ2VFbmQoKTsNCisgICAgICAgIC8vLyAvLyAuLi4gb3IsIGJ1dCBub3QgYm90aCAuLi4NCisgICAgICAgIC8vLyB3cml0ZXIuV3JpdGVNZXNzYWdlKG1lc3NhZ2UpOw0KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4NCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWVzc2FnZVN0YXJ0KCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVXNlZCB0byBjb21wbGV0ZSBhIHJvb3QtbWVzc2FnZSBwcmV2aW91c2x5IHN0YXJ0ZWQgd2l0aCBhIGNhbGwgdG8gV3JpdGVNZXNzYWdlU3RhcnQoKQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWVzc2FnZUVuZCgpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIEJvb2xlYW4gdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBXcml0ZShzdHJpbmcgZmllbGQsIEJvb2xlYW4gdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIEludDMyIHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgV3JpdGUoc3RyaW5nIGZpZWxkLCBJbnQzMiB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgVUludDMyIHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBXcml0ZShzdHJpbmcgZmllbGQsIFVJbnQzMiB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgSW50NjQgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBXcml0ZShzdHJpbmcgZmllbGQsIEludDY0IHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBVSW50NjQgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIFdyaXRlKHN0cmluZyBmaWVsZCwgVUludDY0IHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBTaW5nbGUgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBXcml0ZShzdHJpbmcgZmllbGQsIFNpbmdsZSB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgRG91YmxlIHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgV3JpdGUoc3RyaW5nIGZpZWxkLCBEb3VibGUgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIFN0cmluZyB2YWx1ZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIFdyaXRlKHN0cmluZyBmaWVsZCwgU3RyaW5nIHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBzZXQgb2YgYnl0ZXMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBXcml0ZShzdHJpbmcgZmllbGQsIEJ5dGVTdHJpbmcgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIG1lc3NhZ2Ugb3IgZ3JvdXAgYXMgYSBmaWVsZA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIFdyaXRlTWVzc2FnZU9yR3JvdXAoc3RyaW5nIGZpZWxkLCBJTWVzc2FnZUxpdGUgbWVzc2FnZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgU3lzdGVtLkVudW0gYnkgdGhlIG51bWVyaWMgYW5kIHRleHR1YWwgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBXcml0ZUVudW0oc3RyaW5nIGZpZWxkLCBpbnQgbnVtYmVyLCBzdHJpbmcgbmFtZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgZmllbGQgb2YgdGhlIHR5cGUgZGV0ZXJtaW5lZCBieSBmaWVsZC5GaWVsZFR5cGUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIFdyaXRlRmllbGQoRmllbGRUeXBlIGZpZWxkVHlwZSwgc3RyaW5nIGZpZWxkLCBvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Cb29sOg0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGUoZmllbGQsIChib29sKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuSW50NjQ6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQ2NDoNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkNjQ6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZShmaWVsZCwgKGxvbmcpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50NjQ6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkNjQ6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZShmaWVsZCwgKHVsb25nKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuSW50MzI6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQzMjoNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZShmaWVsZCwgKGludCkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQzMjoNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRml4ZWQzMjoNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlKGZpZWxkLCAodWludCkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZsb2F0Og0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGUoZmllbGQsIChmbG9hdCkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkRvdWJsZToNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlKGZpZWxkLCAoZG91YmxlKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU3RyaW5nOg0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGUoZmllbGQsIChzdHJpbmcpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5CeXRlczoNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlKGZpZWxkLCAoQnl0ZVN0cmluZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkdyb3VwOg0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVNZXNzYWdlT3JHcm91cChmaWVsZCwgKElNZXNzYWdlTGl0ZSkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLk1lc3NhZ2U6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZU1lc3NhZ2VPckdyb3VwKGZpZWxkLCAoSU1lc3NhZ2VMaXRlKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRW51bToNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaXMgSUVudW1MaXRlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVFbnVtKGZpZWxkLCAoKElFbnVtTGl0ZSkgdmFsdWUpLk51bWJlciwgKChJRW51bUxpdGUpIHZhbHVlKS5OYW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaXMgSUNvbnZlcnRpYmxlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVFbnVtKGZpZWxkLCAoKElDb252ZXJ0aWJsZSl2YWx1ZSkuVG9JbnQzMihGcmFtZXdvcmtQb3J0YWJpbGl0eS5JbnZhcmlhbnRDdWx0dXJlKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSUNvbnZlcnRpYmxlKXZhbHVlKS5Ub1N0cmluZyhGcmFtZXdvcmtQb3J0YWJpbGl0eS5JbnZhcmlhbnRDdWx0dXJlKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiRXhwZWN0ZWQgYW4gRW51bSB0eXBlIGZvciBmaWVsZCAiICsgZmllbGQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhbiBhcnJheSBvZiBmaWVsZCB2YWx1ZXMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIFdyaXRlQXJyYXkoRmllbGRUeXBlIGZpZWxkVHlwZSwgc3RyaW5nIGZpZWxkLCBJRW51bWVyYWJsZSBpdGVtcykNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoIChvYmplY3Qgb2JqIGluIGl0ZW1zKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVGaWVsZChmaWVsZFR5cGUsIGZpZWxkLCBvYmopOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBudW1lcmljIHVua25vd24gZmllbGQgb2Ygd2lyZSB0eXBlOiBGaXhlZDMyLCBGaXhlZDY0LCBvciBWYXJpYW50DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIFdyaXRlVW5rbm93bihXaXJlRm9ybWF0LldpcmVUeXBlIHdpcmVUeXBlLCBpbnQgZmllbGROdW1iZXIsIHVsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhbiB1bmtub3duIGZpZWxkLCBFeHBlY3QgV2lyZVR5cGUgb2YgR3JvdXBTdGFydCBvciBMZW5ndGhQcmVmaXgNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgV3JpdGVVbmtub3duKFdpcmVGb3JtYXQuV2lyZVR5cGUgd2lyZVR5cGUsIGludCBmaWVsZE51bWJlciwgQnl0ZVN0cmluZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgIH0NCisNCisgICAgICAgICNyZWdpb24gSUNvZGVkT3V0cHV0U3RyZWFtIE1lbWJlcnMNCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlVW5rbm93bkdyb3VwKGludCBmaWVsZE51bWJlciwgSU1lc3NhZ2VMaXRlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVVbmtub3duQnl0ZXMoaW50IGZpZWxkTnVtYmVyLCBCeXRlU3RyaW5nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVVbmtub3duRmllbGQoaW50IGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlIHR5cGUsIHVsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVNZXNzYWdlU2V0RXh0ZW5zaW9uKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSU1lc3NhZ2VMaXRlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVNZXNzYWdlU2V0RXh0ZW5zaW9uKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgQnl0ZVN0cmluZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlRmllbGQoRmllbGRUeXBlIGZpZWxkVHlwZSwgaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVGaWVsZChmaWVsZFR5cGUsIGZpZWxkTmFtZSwgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVEb3VibGUoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBkb3VibGUgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGUoZmllbGROYW1lLCB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZUZsb2F0KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgZmxvYXQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGUoZmllbGROYW1lLCB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZVVJbnQ2NChpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIHVsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlKGZpZWxkTmFtZSwgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVJbnQ2NChpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGUoZmllbGROYW1lLCB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZUludDMyKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlKGZpZWxkTmFtZSwgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVGaXhlZDY0KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgdWxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGUoZmllbGROYW1lLCB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZUZpeGVkMzIoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCB1aW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlKGZpZWxkTmFtZSwgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVCb29sKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgYm9vbCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZShmaWVsZE5hbWUsIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlU3RyaW5nKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgc3RyaW5nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlKGZpZWxkTmFtZSwgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVHcm91cChpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElNZXNzYWdlTGl0ZSB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZU1lc3NhZ2VPckdyb3VwKGZpZWxkTmFtZSwgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVNZXNzYWdlKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSU1lc3NhZ2VMaXRlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlTWVzc2FnZU9yR3JvdXAoZmllbGROYW1lLCB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZUJ5dGVzKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgQnl0ZVN0cmluZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZShmaWVsZE5hbWUsIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlVUludDMyKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgdWludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZShmaWVsZE5hbWUsIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlRW51bShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCB2YWx1ZSwgb2JqZWN0IHJhd1ZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlRW51bShmaWVsZE5hbWUsIHZhbHVlLCByYXdWYWx1ZS5Ub1N0cmluZygpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlU0ZpeGVkMzIoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGUoZmllbGROYW1lLCB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZVNGaXhlZDY0KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgbG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZShmaWVsZE5hbWUsIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlU0ludDMyKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlKGZpZWxkTmFtZSwgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVTSW50NjQoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlKGZpZWxkTmFtZSwgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVBcnJheShGaWVsZFR5cGUgZmllbGRUeXBlLCBpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlIGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBcnJheShmaWVsZFR5cGUsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZUdyb3VwQXJyYXk8VD4oaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxUPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXJyYXkoRmllbGRUeXBlLkdyb3VwLCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVNZXNzYWdlQXJyYXk8VD4oaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxUPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXJyYXkoRmllbGRUeXBlLk1lc3NhZ2UsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZVN0cmluZ0FycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGU8c3RyaW5nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXJyYXkoRmllbGRUeXBlLlN0cmluZywgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlQnl0ZXNBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPEJ5dGVTdHJpbmc+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBcnJheShGaWVsZFR5cGUuQnl0ZXMsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZUJvb2xBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPGJvb2w+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBcnJheShGaWVsZFR5cGUuQm9vbCwgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlSW50MzJBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPGludD4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZUFycmF5KEZpZWxkVHlwZS5JbnQzMiwgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlU0ludDMyQXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxpbnQ+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBcnJheShGaWVsZFR5cGUuU0ludDMyLCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVVSW50MzJBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPHVpbnQ+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBcnJheShGaWVsZFR5cGUuVUludDMyLCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVGaXhlZDMyQXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTx1aW50PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXJyYXkoRmllbGRUeXBlLkZpeGVkMzIsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZVNGaXhlZDMyQXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxpbnQ+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBcnJheShGaWVsZFR5cGUuU0ZpeGVkMzIsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZUludDY0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxsb25nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXJyYXkoRmllbGRUeXBlLkludDY0LCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVTSW50NjRBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPGxvbmc+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBcnJheShGaWVsZFR5cGUuU0ludDY0LCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVVSW50NjRBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPHVsb25nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXJyYXkoRmllbGRUeXBlLlVJbnQ2NCwgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlRml4ZWQ2NEFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGU8dWxvbmc+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBcnJheShGaWVsZFR5cGUuRml4ZWQ2NCwgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlU0ZpeGVkNjRBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPGxvbmc+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBcnJheShGaWVsZFR5cGUuU0ZpeGVkNjQsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZURvdWJsZUFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGU8ZG91YmxlPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXJyYXkoRmllbGRUeXBlLkRvdWJsZSwgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlRmxvYXRBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPGZsb2F0PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXJyYXkoRmllbGRUeXBlLkZsb2F0LCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVFbnVtQXJyYXk8VD4oaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxUPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXJyYXkoRmllbGRUeXBlLkVudW0sIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZVBhY2tlZEFycmF5KEZpZWxkVHlwZSBmaWVsZFR5cGUsIGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGUgbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZUFycmF5KGZpZWxkVHlwZSwgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlUGFja2VkQm9vbEFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IGNvbXB1dGVkU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlPGJvb2w+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVBcnJheShGaWVsZFR5cGUuQm9vbCwgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlUGFja2VkSW50MzJBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjb21wdXRlZFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8aW50PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXJyYXkoRmllbGRUeXBlLkludDMyLCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVQYWNrZWRTSW50MzJBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjb21wdXRlZFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlPGludD4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZUFycmF5KEZpZWxkVHlwZS5TSW50MzIsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZVBhY2tlZFVJbnQzMkFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IGNvbXB1dGVkU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8dWludD4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZUFycmF5KEZpZWxkVHlwZS5VSW50MzIsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZVBhY2tlZEZpeGVkMzJBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjb21wdXRlZFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTx1aW50PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXJyYXkoRmllbGRUeXBlLkZpeGVkMzIsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZVBhY2tlZFNGaXhlZDMyQXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY29tcHV0ZWRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlPGludD4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZUFycmF5KEZpZWxkVHlwZS5TRml4ZWQzMiwgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlUGFja2VkSW50NjRBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjb21wdXRlZFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8bG9uZz4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZUFycmF5KEZpZWxkVHlwZS5JbnQ2NCwgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlUGFja2VkU0ludDY0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY29tcHV0ZWRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTxsb25nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXJyYXkoRmllbGRUeXBlLlNJbnQ2NCwgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlUGFja2VkVUludDY0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY29tcHV0ZWRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTx1bG9uZz4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZUFycmF5KEZpZWxkVHlwZS5VSW50NjQsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZVBhY2tlZEZpeGVkNjRBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjb21wdXRlZFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTx1bG9uZz4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZUFycmF5KEZpZWxkVHlwZS5GaXhlZDY0LCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVQYWNrZWRTRml4ZWQ2NEFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IGNvbXB1dGVkU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTxsb25nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXJyYXkoRmllbGRUeXBlLlNGaXhlZDY0LCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVQYWNrZWREb3VibGVBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjb21wdXRlZFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlPGRvdWJsZT4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZUFycmF5KEZpZWxkVHlwZS5Eb3VibGUsIGZpZWxkTmFtZSwgbGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZVBhY2tlZEZsb2F0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY29tcHV0ZWRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlPGZsb2F0PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlQXJyYXkoRmllbGRUeXBlLkZsb2F0LCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdm9pZCBJQ29kZWRPdXRwdXRTdHJlYW0uV3JpdGVQYWNrZWRFbnVtQXJyYXk8VD4oaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY29tcHV0ZWRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8VD4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZUFycmF5KEZpZWxkVHlwZS5FbnVtLCBmaWVsZE5hbWUsIGxpc3QpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vRGljdGlvbmFyeVJlYWRlci5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vRGljdGlvbmFyeVJlYWRlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDYwNTIzCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9EaWN0aW9uYXJ5UmVhZGVyLmNzCkBAIC0wLDAgKzEsMjY3IEBACit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBBbGxvd3MgcmVhZGluZyBtZXNzYWdlcyBmcm9tIGEgbmFtZS92YWx1ZSBkaWN0aW9uYXJ5DQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBjbGFzcyBEaWN0aW9uYXJ5UmVhZGVyIDogQWJzdHJhY3RSZWFkZXINCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJRW51bWVyYXRvcjxLZXlWYWx1ZVBhaXI8c3RyaW5nLCBvYmplY3Q+PiBfaW5wdXQ7DQorICAgICAgICBwcml2YXRlIGJvb2wgX3JlYWR5Ow0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBkaWN0aW9uYXJ5IHJlYWRlciBmcm9tIGFuIGVudW1lcmF0aW9uIG9mIEtleVZhbHVlUGFpciBkYXRhLCBsaWtlIGFuIElEaWN0aW9uYXJ5DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIERpY3Rpb25hcnlSZWFkZXIoSUVudW1lcmFibGU8S2V5VmFsdWVQYWlyPHN0cmluZywgb2JqZWN0Pj4gaW5wdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgX2lucHV0ID0gaW5wdXQuR2V0RW51bWVyYXRvcigpOw0KKyAgICAgICAgICAgIF9yZWFkeSA9IF9pbnB1dC5Nb3ZlTmV4dCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE5vLW9wDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VTdGFydCgpDQorICAgICAgICB7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBOby1vcA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNZXNzYWdlRW5kKCkNCisgICAgICAgIHsgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE1lcmdlcyB0aGUgY29udGVudHMgb2Ygc3RyZWFtIGludG8gdGhlIHByb3ZpZGVkIG1lc3NhZ2UgYnVpbGRlcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUQnVpbGRlciBNZXJnZTxUQnVpbGRlcj4oVEJ1aWxkZXIgYnVpbGRlciwgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgYnVpbGRlci5XZWFrTWVyZ2VGcm9tKHRoaXMsIHJlZ2lzdHJ5KTsNCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQZWVrcyBhdCB0aGUgbmV4dCBmaWVsZCBpbiB0aGUgaW5wdXQgc3RyZWFtIGFuZCByZXR1cm5zIHdoYXQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz4NCisgICAgICAgIC8vLyBUaGlzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aG91dCBhY3R1YWxseSByZWFkaW5nIHRoZSBmaWVsZC4gIE9ubHkgYWZ0ZXIgdGhlIGZpZWxkDQorICAgICAgICAvLy8gaXMgZWl0aGVyIHJlYWQsIG9yIHNraXBwZWQsIHNob3VsZCBQZWVrTmV4dCByZXR1cm4gYSBkaWZmZXJlbnQgdmFsdWUuDQorICAgICAgICAvLy8gPC9yZW1hcmtzPg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGJvb2wgUGVla05leHQob3V0IHN0cmluZyBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmaWVsZCA9IF9yZWFkeSA/IF9pbnB1dC5DdXJyZW50LktleSA6IG51bGw7DQorICAgICAgICAgICAgcmV0dXJuIF9yZWFkeTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDYXVzZXMgdGhlIHJlYWRlciB0byBza2lwIHBhc3QgdGhpcyBmaWVsZA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFNraXAoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIF9yZWFkeSA9IF9pbnB1dC5Nb3ZlTmV4dCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBib29sIEdldFZhbHVlPFQ+KHJlZiBUIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICghX3JlYWR5KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBvYmplY3Qgb2JqID0gX2lucHV0LkN1cnJlbnQuVmFsdWU7DQorICAgICAgICAgICAgaWYgKG9iaiBpcyBUKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFsdWUgPSAoVCkgb2JqOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiBpcyBJQ29udmVydGlibGUpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoVClDb252ZXJ0LkNoYW5nZVR5cGUob2JqLCB0eXBlb2YoVCksIEZyYW1ld29ya1BvcnRhYmlsaXR5LkludmFyaWFudEN1bHR1cmUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKFQpIG9iajsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXRjaA0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBfcmVhZHkgPSBfaW5wdXQuTW92ZU5leHQoKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBfcmVhZHkgPSBfaW5wdXQuTW92ZU5leHQoKTsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgaXQgd2FzIGFibGUgdG8gcmVhZCBhIEJvb2xlYW4gZnJvbSB0aGUgaW5wdXQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBSZWFkKHJlZiBib29sIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBHZXRWYWx1ZShyZWYgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgSW50MzIgZnJvbSB0aGUgaW5wdXQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBSZWFkKHJlZiBpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEdldFZhbHVlKHJlZiB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0IHdhcyBhYmxlIHRvIHJlYWQgYSBVSW50MzIgZnJvbSB0aGUgaW5wdXQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFJlYWQocmVmIHVpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEdldFZhbHVlKHJlZiB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0IHdhcyBhYmxlIHRvIHJlYWQgYSBJbnQ2NCBmcm9tIHRoZSBpbnB1dA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFJlYWQocmVmIGxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEdldFZhbHVlKHJlZiB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0IHdhcyBhYmxlIHRvIHJlYWQgYSBVSW50NjQgZnJvbSB0aGUgaW5wdXQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFJlYWQocmVmIHVsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBHZXRWYWx1ZShyZWYgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgU2luZ2xlIGZyb20gdGhlIGlucHV0DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGJvb2wgUmVhZChyZWYgZmxvYXQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEdldFZhbHVlKHJlZiB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0IHdhcyBhYmxlIHRvIHJlYWQgYSBEb3VibGUgZnJvbSB0aGUgaW5wdXQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBSZWFkKHJlZiBkb3VibGUgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEdldFZhbHVlKHJlZiB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0IHdhcyBhYmxlIHRvIHJlYWQgYSBTdHJpbmcgZnJvbSB0aGUgaW5wdXQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBSZWFkKHJlZiBzdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEdldFZhbHVlKHJlZiB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0IHdhcyBhYmxlIHRvIHJlYWQgYSBCeXRlU3RyaW5nIGZyb20gdGhlIGlucHV0DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGJvb2wgUmVhZChyZWYgQnl0ZVN0cmluZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBieXRlW10gcmF3Ynl0ZXMgPSBudWxsOw0KKyAgICAgICAgICAgIGlmIChHZXRWYWx1ZShyZWYgcmF3Ynl0ZXMpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFsdWUgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKHJhd2J5dGVzKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWYgaXQgd2FzIGFibGUgdG8gcmVhZCBhIHNpbmdsZSB2YWx1ZSBpbnRvIHRoZSB2YWx1ZSByZWZlcmVuY2UuICBUaGUgdmFsdWUNCisgICAgICAgIC8vLyBzdG9yZWQgbWF5IGJlIG9mIHR5cGUgU3lzdGVtLlN0cmluZywgU3lzdGVtLkludDMyLCBvciBhbiBJRW51bUxpdGUgZnJvbSB0aGUgSUVudW1MaXRlTWFwLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFJlYWRFbnVtKHJlZiBvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEdldFZhbHVlKHJlZiB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTWVyZ2VzIHRoZSBpbnB1dCBzdHJlYW0gaW50byB0aGUgcHJvdmlkZWQgSUJ1aWxkZXJMaXRlIA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFJlYWRNZXNzYWdlKElCdWlsZGVyTGl0ZSBidWlsZGVyLCBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gdmFsdWVzID0gbnVsbDsNCisgICAgICAgICAgICBpZiAoR2V0VmFsdWUocmVmIHZhbHVlcykpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBuZXcgRGljdGlvbmFyeVJlYWRlcih2YWx1ZXMpLk1lcmdlKGJ1aWxkZXIsIHJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIFJlYWRBcnJheTxUPihGaWVsZFR5cGUgdHlwZSwgc3RyaW5nIGZpZWxkLCBJQ29sbGVjdGlvbjxUPiBpdGVtcykNCisgICAgICAgIHsNCisgICAgICAgICAgICBvYmplY3RbXSBhcnJheSA9IG51bGw7DQorICAgICAgICAgICAgaWYgKEdldFZhbHVlKHJlZiBhcnJheSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAodHlwZW9mKFQpID09IHR5cGVvZihCeXRlU3RyaW5nKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgSUNvbGxlY3Rpb248Qnl0ZVN0cmluZz4gb3V0cHV0ID0gKElDb2xsZWN0aW9uPEJ5dGVTdHJpbmc+KSBpdGVtczsNCisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKGJ5dGVbXSBpdGVtIGluIGFycmF5KQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5BZGQoQnl0ZVN0cmluZy5Db3B5RnJvbShpdGVtKSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChUIGl0ZW0gaW4gYXJyYXkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuQWRkKGl0ZW0pOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBSZWFkRW51bUFycmF5KHN0cmluZyBmaWVsZCwgSUNvbGxlY3Rpb248b2JqZWN0PiBpdGVtcykNCisgICAgICAgIHsNCisgICAgICAgICAgICBvYmplY3RbXSBhcnJheSA9IG51bGw7DQorICAgICAgICAgICAgaWYgKEdldFZhbHVlKHJlZiBhcnJheSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgaXRlbSBpbiBhcnJheSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaXRlbXMuQWRkKGl0ZW0pOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBSZWFkTWVzc2FnZUFycmF5PFQ+KHN0cmluZyBmaWVsZCwgSUNvbGxlY3Rpb248VD4gaXRlbXMsIElNZXNzYWdlTGl0ZSBtZXNzYWdlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgb2JqZWN0W10gYXJyYXkgPSBudWxsOw0KKyAgICAgICAgICAgIGlmIChHZXRWYWx1ZShyZWYgYXJyYXkpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoSURpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+IGl0ZW0gaW4gYXJyYXkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIElCdWlsZGVyTGl0ZSBidWlsZGVyID0gbWVzc2FnZVR5cGUuV2Vha0NyZWF0ZUJ1aWxkZXJGb3JUeXBlKCk7DQorICAgICAgICAgICAgICAgICAgICBuZXcgRGljdGlvbmFyeVJlYWRlcihpdGVtKS5NZXJnZShidWlsZGVyKTsNCisgICAgICAgICAgICAgICAgICAgIGl0ZW1zLkFkZCgoVCkgYnVpbGRlci5XZWFrQnVpbGQoKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIFJlYWRHcm91cEFycmF5PFQ+KHN0cmluZyBmaWVsZCwgSUNvbGxlY3Rpb248VD4gaXRlbXMsIElNZXNzYWdlTGl0ZSBtZXNzYWdlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBSZWFkTWVzc2FnZUFycmF5KGZpZWxkLCBpdGVtcywgbWVzc2FnZVR5cGUsIHJlZ2lzdHJ5KTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0RpY3Rpb25hcnlXcml0ZXIuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0RpY3Rpb25hcnlXcml0ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4MjMzMAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vRGljdGlvbmFyeVdyaXRlci5jcwpAQCAtMCwwICsxLDIwMiBAQAordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24NCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEFsbG93cyB3cml0aW5nIG1lc3NhZ2VzIHRvIGEgbmFtZS92YWx1ZSBkaWN0aW9uYXJ5DQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBjbGFzcyBEaWN0aW9uYXJ5V3JpdGVyIDogQWJzdHJhY3RXcml0ZXINCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gX291dHB1dDsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgd3JpdGVyIHVzaW5nIGEgbmV3IGRpY3Rpb25hcnkNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgRGljdGlvbmFyeVdyaXRlcigpDQorICAgICAgICAgICAgOiB0aGlzKG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PihTdHJpbmdDb21wYXJlci5PcmRpbmFsKSkNCisgICAgICAgIHsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgd3JpdGVyIHVzaW5nIGFuIGV4aXN0aW5nIGRpY3Rpb25hcnkNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgRGljdGlvbmFyeVdyaXRlcihJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gb3V0cHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRocm93SGVscGVyLlRocm93SWZOdWxsKG91dHB1dCwgIm91dHB1dCIpOw0KKyAgICAgICAgICAgIF9vdXRwdXQgPSBvdXRwdXQ7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyB0aGUgZGljdGlvbmFyeSBpbnN0YW5jZSBmb3IgYSBjaGlsZCBtZXNzYWdlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIERpY3Rpb25hcnlXcml0ZXIgQ3JlYXRlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IERpY3Rpb25hcnlXcml0ZXIoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBY2Nlc3NlcyB0aGUgZGljdGlvbmFyeSB0aGF0IGlzIGJhY2tpbmcgdGhpcyB3cml0ZXINCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+IFRvRGljdGlvbmFyeSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIF9vdXRwdXQ7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIHRoZSBtZXNzYWdlIHRvIHRoZSB0aGUgZm9ybWF0dGVkIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2UoSU1lc3NhZ2VMaXRlIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgbWVzc2FnZS5Xcml0ZVRvKHRoaXMpOw0KKyAgICAgICAgfQ0KKw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE5vLW9wDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlU3RhcnQoKQ0KKyAgICAgICAgeyB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTm8tb3ANCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKQ0KKyAgICAgICAgeyB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgQm9vbGVhbiB2YWx1ZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFdyaXRlKHN0cmluZyBmaWVsZCwgYm9vbCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfb3V0cHV0W2ZpZWxkXSA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIEludDMyIHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgV3JpdGUoc3RyaW5nIGZpZWxkLCBpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgX291dHB1dFtmaWVsZF0gPSB2YWx1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBVSW50MzIgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFdyaXRlKHN0cmluZyBmaWVsZCwgdWludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfb3V0cHV0W2ZpZWxkXSA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIEludDY0IHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgV3JpdGUoc3RyaW5nIGZpZWxkLCBsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIF9vdXRwdXRbZmllbGRdID0gdmFsdWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgVUludDY0IHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZShzdHJpbmcgZmllbGQsIHVsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIF9vdXRwdXRbZmllbGRdID0gdmFsdWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgU2luZ2xlIHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgV3JpdGUoc3RyaW5nIGZpZWxkLCBmbG9hdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfb3V0cHV0W2ZpZWxkXSA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIERvdWJsZSB2YWx1ZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFdyaXRlKHN0cmluZyBmaWVsZCwgZG91YmxlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIF9vdXRwdXRbZmllbGRdID0gdmFsdWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgU3RyaW5nIHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgV3JpdGUoc3RyaW5nIGZpZWxkLCBzdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgX291dHB1dFtmaWVsZF0gPSB2YWx1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBzZXQgb2YgYnl0ZXMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZShzdHJpbmcgZmllbGQsIEJ5dGVTdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgX291dHB1dFtmaWVsZF0gPSB2YWx1ZS5Ub0J5dGVBcnJheSgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIG1lc3NhZ2Ugb3IgZ3JvdXAgYXMgYSBmaWVsZA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZU9yR3JvdXAoc3RyaW5nIGZpZWxkLCBJTWVzc2FnZUxpdGUgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBEaWN0aW9uYXJ5V3JpdGVyIHdyaXRlciA9IENyZWF0ZSgpOw0KKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZU1lc3NhZ2UobWVzc2FnZSk7DQorDQorICAgICAgICAgICAgX291dHB1dFtmaWVsZF0gPSB3cml0ZXIuVG9EaWN0aW9uYXJ5KCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgU3lzdGVtLkVudW0gYnkgdGhlIG51bWVyaWMgYW5kIHRleHR1YWwgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZUVudW0oc3RyaW5nIGZpZWxkLCBpbnQgbnVtYmVyLCBzdHJpbmcgbmFtZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfb3V0cHV0W2ZpZWxkXSA9IG51bWJlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYW4gYXJyYXkgb2YgZmllbGQgdmFsdWVzDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgV3JpdGVBcnJheShGaWVsZFR5cGUgZmllbGRUeXBlLCBzdHJpbmcgZmllbGQsIElFbnVtZXJhYmxlIGl0ZW1zKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIExpc3Q8b2JqZWN0PiBvYmplY3RzID0gbmV3IExpc3Q8b2JqZWN0PigpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCBvIGluIGl0ZW1zKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkdyb3VwOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuTWVzc2FnZToNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpY3Rpb25hcnlXcml0ZXIgd3JpdGVyID0gQ3JlYXRlKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZU1lc3NhZ2UoKElNZXNzYWdlTGl0ZSkgbyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuQWRkKHdyaXRlci5Ub0RpY3Rpb25hcnkoKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuQnl0ZXM6DQorICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5BZGQoKChCeXRlU3RyaW5nKSBvKS5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkVudW06DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gaXMgSUVudW1MaXRlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5BZGQoKChJRW51bUxpdGUpIG8pLk51bWJlcik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuQWRkKChpbnQpIG8pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5BZGQobyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgX291dHB1dFtmaWVsZF0gPSBvYmplY3RzLlRvQXJyYXkoKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0V4dGVuc2lvbnMuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0V4dGVuc2lvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlZjBhOQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vRXh0ZW5zaW9ucy5jcwpAQCAtMCwwICsxLDIxMyBAQAor77u/dXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uWG1sOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uSHR0cDsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gRXh0ZW5zaW9uIG1ldGhvZHMgZm9yIHVzaW5nIHNlcmlhbGl6ZXJzIG9uIGluc3RhbmNlcyBvZiBJTWVzc2FnZUxpdGUvSUJ1aWxkZXJMaXRlDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXh0ZW5zaW9ucw0KKyAgICB7DQorICAgICAgICAjcmVnaW9uIElNZXNzYWdlTGl0ZSBFeHRlbnNpb24NCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIEpTT04gdGV4dC4gIFRoaXMgaXMgYSB0cml2aWFsIHdyYXBwZXINCisgICAgICAgIC8vLyBhcm91bmQgU2VyaWFsaXphdGlvbi5Kc29uRm9ybWF0V3JpdGVyLldyaXRlTWVzc2FnZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBUb0pzb24oDQorI2lmICFOT0VYVEVOU0lPTlMNCisgICAgICAgICAgICB0aGlzDQorI2VuZGlmDQorICAgICAgICAgICAgSU1lc3NhZ2VMaXRlIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgSnNvbkZvcm1hdFdyaXRlciB3ID0gSnNvbkZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIHcuV3JpdGVNZXNzYWdlKG1lc3NhZ2UpOw0KKyAgICAgICAgICAgIHJldHVybiB3LlRvU3RyaW5nKCk7DQorICAgICAgICB9DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBYTUwgdGV4dC4gIFRoaXMgaXMgYSB0cml2aWFsIHdyYXBwZXINCisgICAgICAgIC8vLyBhcm91bmQgU2VyaWFsaXphdGlvbi5YbWxGb3JtYXRXcml0ZXIuV3JpdGVNZXNzYWdlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFRvWG1sKA0KKyNpZiAhTk9FWFRFTlNJT05TDQorICAgICAgICAgICAgdGhpcw0KKyNlbmRpZg0KKyAgICAgICAgICAgIElNZXNzYWdlTGl0ZSBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciB3ID0gbmV3IFN0cmluZ1dyaXRlcihuZXcgU3RyaW5nQnVpbGRlcig0MDk2KSk7DQorICAgICAgICAgICAgWG1sRm9ybWF0V3JpdGVyLkNyZWF0ZUluc3RhbmNlKHcpLldyaXRlTWVzc2FnZShtZXNzYWdlKTsNCisgICAgICAgICAgICByZXR1cm4gdy5Ub1N0cmluZygpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gWE1MIHRleHQgdXNpbmcgdGhlIGVsZW1lbnQgbmFtZSBwcm92aWRlZC4NCisgICAgICAgIC8vLyBUaGlzIGlzIGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCBTZXJpYWxpemF0aW9uLlhtbEZvcm1hdFdyaXRlci5Xcml0ZU1lc3NhZ2UuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgVG9YbWwoDQorI2lmICFOT0VYVEVOU0lPTlMNCisgICAgICAgICAgICB0aGlzDQorI2VuZGlmDQorICAgICAgICAgICAgSU1lc3NhZ2VMaXRlIG1lc3NhZ2UsIHN0cmluZyByb290RWxlbWVudE5hbWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHcgPSBuZXcgU3RyaW5nV3JpdGVyKG5ldyBTdHJpbmdCdWlsZGVyKDQwOTYpKTsNCisgICAgICAgICAgICBYbWxGb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2UodykuV3JpdGVNZXNzYWdlKHJvb3RFbGVtZW50TmFtZSwgbWVzc2FnZSk7DQorICAgICAgICAgICAgcmV0dXJuIHcuVG9TdHJpbmcoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgdGhlIG1lc3NhZ2UgaW5zdGFuY2UgdG8gdGhlIHN0cmVhbSB1c2luZyB0aGUgY29udGVudCB0eXBlIHByb3ZpZGVkDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5BbiBpbnN0YW5jZSBvZiBhIG1lc3NhZ2U8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvcHRpb25zIj5PcHRpb25zIHNwZWNpZmljIHRvIHdyaXRpbmcgdGhpcyBtZXNzYWdlIGFuZC9vciBjb250ZW50IHR5cGU8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb250ZW50VHlwZSI+VGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCB0byBiZSB3cml0dGVuPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0Ij5UaGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBtZXNzYWdlIHRvPC9wYXJhbT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBXcml0ZVRvKA0KKyNpZiAhTk9FWFRFTlNJT05TDQorICAgICAgICAgICAgdGhpcw0KKyNlbmRpZg0KKyAgICAgICAgICAgIElNZXNzYWdlTGl0ZSBtZXNzYWdlLCBNZXNzYWdlRm9ybWF0T3B0aW9ucyBvcHRpb25zLCBzdHJpbmcgY29udGVudFR5cGUsIFN0cmVhbSBvdXRwdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgSUNvZGVkT3V0cHV0U3RyZWFtIGNvZGVkT3V0cHV0ID0gTWVzc2FnZUZvcm1hdEZhY3RvcnkuQ3JlYXRlT3V0cHV0U3RyZWFtKG9wdGlvbnMsIGNvbnRlbnRUeXBlLCBvdXRwdXQpOw0KKw0KKyAgICAgICAgICAgIC8vIE91dHB1dCB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZSBwcmVhbWJsZQ0KKyAgICAgICAgICAgIGNvZGVkT3V0cHV0LldyaXRlTWVzc2FnZVN0YXJ0KCk7DQorDQorICAgICAgICAgICAgLy8gV3JpdGUgdGhlIG1lc3NhZ2UgY29udGVudCB0byB0aGUgb3V0cHV0DQorICAgICAgICAgICAgbWVzc2FnZS5Xcml0ZVRvKGNvZGVkT3V0cHV0KTsNCisNCisgICAgICAgICAgICAvLyBXcml0ZSB0aGUgY2xvc2luZyBtZXNzYWdlIGZyYWdtZW50DQorICAgICAgICAgICAgY29kZWRPdXRwdXQuV3JpdGVNZXNzYWdlRW5kKCk7DQorICAgICAgICAgICAgY29kZWRPdXRwdXQuRmx1c2goKTsNCisgICAgICAgIH0NCisNCisgICAgICAgICNlbmRyZWdpb24NCisgICAgICAgICNyZWdpb24gSUJ1aWxkZXJMaXRlIEV4dGVuc2lvbnMNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBNZXJnZXMgYSBKU09OIG9iamVjdCBpbnRvIHRoaXMgYnVpbGRlciBhbmQgcmV0dXJucw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVEJ1aWxkZXIgTWVyZ2VGcm9tSnNvbjxUQnVpbGRlcj4oDQorI2lmICFOT0VYVEVOU0lPTlMNCisgICAgICAgICAgICB0aGlzDQorI2VuZGlmDQorICAgICAgICAgICAgVEJ1aWxkZXIgYnVpbGRlciwgc3RyaW5nIGpzb25UZXh0KSB3aGVyZSBUQnVpbGRlciA6IElCdWlsZGVyTGl0ZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBKc29uRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKGpzb25UZXh0KQ0KKyAgICAgICAgICAgICAgICAuTWVyZ2UoYnVpbGRlcik7DQorICAgICAgICB9DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTWVyZ2VzIGEgSlNPTiBvYmplY3QgaW50byB0aGlzIGJ1aWxkZXIgYW5kIHJldHVybnMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIFRCdWlsZGVyIE1lcmdlRnJvbUpzb248VEJ1aWxkZXI+KA0KKyNpZiAhTk9FWFRFTlNJT05TDQorICAgICAgICAgICAgdGhpcw0KKyNlbmRpZg0KKyAgICAgICAgICAgIFRCdWlsZGVyIGJ1aWxkZXIsIFRleHRSZWFkZXIgcmVhZGVyKSB3aGVyZSBUQnVpbGRlciA6IElCdWlsZGVyTGl0ZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb21Kc29uKGJ1aWxkZXIsIHJlYWRlciwgRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE1lcmdlcyBhIEpTT04gb2JqZWN0IGludG8gdGhpcyBidWlsZGVyIHVzaW5nIHRoZSBleHRlbnNpb25zIHByb3ZpZGVkIGFuZCByZXR1cm5zDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBUQnVpbGRlciBNZXJnZUZyb21Kc29uPFRCdWlsZGVyPigNCisjaWYgIU5PRVhURU5TSU9OUw0KKyAgICAgICAgICAgIHRoaXMNCisjZW5kaWYNCisgICAgICAgICAgICBUQnVpbGRlciBidWlsZGVyLCBUZXh0UmVhZGVyIHJlYWRlciwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHdoZXJlIFRCdWlsZGVyIDogSUJ1aWxkZXJMaXRlDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEpzb25Gb3JtYXRSZWFkZXIuQ3JlYXRlSW5zdGFuY2UocmVhZGVyKQ0KKyAgICAgICAgICAgICAgICAuTWVyZ2UoYnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE1lcmdlcyBhbiBYTUwgb2JqZWN0IGludG8gdGhpcyBidWlsZGVyIGFuZCByZXR1cm5zDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBUQnVpbGRlciBNZXJnZUZyb21YbWw8VEJ1aWxkZXI+KA0KKyNpZiAhTk9FWFRFTlNJT05TDQorICAgICAgICAgICAgdGhpcw0KKyNlbmRpZg0KKyAgICAgICAgICAgIFRCdWlsZGVyIGJ1aWxkZXIsIFhtbFJlYWRlciByZWFkZXIpIHdoZXJlIFRCdWlsZGVyIDogSUJ1aWxkZXJMaXRlDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbVhtbChidWlsZGVyLCBYbWxGb3JtYXRSZWFkZXIuRGVmYXVsdFJvb3RFbGVtZW50TmFtZSwgcmVhZGVyLCBFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTWVyZ2VzIGFuIFhNTCBvYmplY3QgaW50byB0aGlzIGJ1aWxkZXIgYW5kIHJldHVybnMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIFRCdWlsZGVyIE1lcmdlRnJvbVhtbDxUQnVpbGRlcj4oDQorI2lmICFOT0VYVEVOU0lPTlMNCisgICAgICAgICAgICB0aGlzDQorI2VuZGlmDQorICAgICAgICAgICAgVEJ1aWxkZXIgYnVpbGRlciwgc3RyaW5nIHJvb3RFbGVtZW50TmFtZSwgWG1sUmVhZGVyIHJlYWRlcikgd2hlcmUgVEJ1aWxkZXIgOiBJQnVpbGRlckxpdGUNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tWG1sKGJ1aWxkZXIsIHJvb3RFbGVtZW50TmFtZSwgcmVhZGVyLCBFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTWVyZ2VzIGFuIFhNTCBvYmplY3QgaW50byB0aGlzIGJ1aWxkZXIgdXNpbmcgdGhlIGV4dGVuc2lvbnMgcHJvdmlkZWQgYW5kIHJldHVybnMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIFRCdWlsZGVyIE1lcmdlRnJvbVhtbDxUQnVpbGRlcj4oDQorI2lmICFOT0VYVEVOU0lPTlMNCisgICAgICAgICAgICB0aGlzDQorI2VuZGlmDQorICAgICAgICAgICAgVEJ1aWxkZXIgYnVpbGRlciwgc3RyaW5nIHJvb3RFbGVtZW50TmFtZSwgWG1sUmVhZGVyIHJlYWRlciwNCisgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgd2hlcmUgVEJ1aWxkZXIgOiBJQnVpbGRlckxpdGUNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gWG1sRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKHJlYWRlcikNCisgICAgICAgICAgICAgICAgLk1lcmdlKHJvb3RFbGVtZW50TmFtZSwgYnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE1lcmdlcyB0aGUgbWVzc2FnZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gYmFzZWQgb24gdGhlIGNvbnRlbnRUeXBlIHByb3ZpZGVkDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVEJ1aWxkZXIiPkEgdHlwZSBkZXJpdmVkIGZyb20gSUJ1aWxkZXJMaXRlPC90eXBlcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1aWxkZXIiPkFuIGluc3RhbmNlIG9mIGEgbWVzc2FnZSBidWlsZGVyPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3B0aW9ucyI+T3B0aW9ucyBzcGVjaWZpYyB0byByZWFkaW5nIHRoaXMgbWVzc2FnZSBhbmQvb3IgY29udGVudCB0eXBlPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGVudFR5cGUiPlRoZSBtaW1lIHR5cGUgb2YgdGhlIGlucHV0IHN0cmVhbSBjb250ZW50PC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXQiPlRoZSBzdHJlYW0gdG8gcmVhZCB0aGUgbWVzc2FnZSBmcm9tPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgc2FtZSBidWlsZGVyIGluc3RhbmNlIHRoYXQgd2FzIHN1cHBsaWVkIGluIHRoZSBidWlsZGVyIHBhcmFtZXRlcjwvcmV0dXJucz4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVEJ1aWxkZXIgTWVyZ2VGcm9tPFRCdWlsZGVyPigNCisjaWYgIU5PRVhURU5TSU9OUw0KKyAgICAgICAgICAgIHRoaXMNCisjZW5kaWYNCisgICAgICAgICAgICBUQnVpbGRlciBidWlsZGVyLCBNZXNzYWdlRm9ybWF0T3B0aW9ucyBvcHRpb25zLCBzdHJpbmcgY29udGVudFR5cGUsIFN0cmVhbSBpbnB1dCkgd2hlcmUgVEJ1aWxkZXIgOiBJQnVpbGRlckxpdGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBJQ29kZWRJbnB1dFN0cmVhbSBjb2RlZElucHV0ID0gTWVzc2FnZUZvcm1hdEZhY3RvcnkuQ3JlYXRlSW5wdXRTdHJlYW0ob3B0aW9ucywgY29udGVudFR5cGUsIGlucHV0KTsNCisgICAgICAgICAgICBjb2RlZElucHV0LlJlYWRNZXNzYWdlU3RhcnQoKTsNCisgICAgICAgICAgICBidWlsZGVyLldlYWtNZXJnZUZyb20oY29kZWRJbnB1dCwgb3B0aW9ucy5FeHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgY29kZWRJbnB1dC5SZWFkTWVzc2FnZUVuZCgpOw0KKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICAgICAgI3JlZ2lvbiBJUnBjU2VydmVyU3R1YiBFeHRlbnNpb25zDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVXNlZCB0byBpbXBsZW1lbnQgYSBzZXJ2aWNlIGVuZHBvaW50IG9uIGFuIEhUVFAgc2VydmVyLiAgVGhpcyB3b3JrcyB3aXRoIHNlcnZpY2VzIGdlbmVyYXRlZCB3aXRoIHRoZQ0KKyAgICAgICAgLy8vIHNlcnZpY2VfZ2VuZXJhdG9yX3R5cGUgb3B0aW9uIHNldCB0byBJUlBDRElTUEFUQ0guDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdHViIj5UaGUgc2VydmljZSBleGVjdXRpb24gc3R1YjwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1ldGhvZE5hbWUiPlRoZSBuYW1lIG9mIHRoZSBtZXRob2QgYmVpbmcgaW52b2tlZDwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9wdGlvbnMiPm9wdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGZvcm1hdCByZWFkZXIvd3JpdGVyPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGVudFR5cGUiPlRoZSBtaW1lIHR5cGUgZm9yIHRoZSBpbnB1dCBzdHJlYW08L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dCI+VGhlIGlucHV0IHN0cmVhbTwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJlc3BvbnNlVHlwZSI+VGhlIG1pbWUgdHlwZSBmb3IgdGhlIG91dHB1dCBzdHJlYW08L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdXRwdXQiPlRoZSBvdXRwdXQgc3RyZWFtPC9wYXJhbT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBIdHRwQ2FsbE1ldGhvZCgNCisjaWYgIU5PRVhURU5TSU9OUw0KKyAgICAgICAgICAgIHRoaXMNCisjZW5kaWYNCisgICAgICAgICAgICBJUnBjU2VydmVyU3R1YiBzdHViLCBzdHJpbmcgbWV0aG9kTmFtZSwgTWVzc2FnZUZvcm1hdE9wdGlvbnMgb3B0aW9ucywNCisgICAgICAgICAgICBzdHJpbmcgY29udGVudFR5cGUsIFN0cmVhbSBpbnB1dCwgc3RyaW5nIHJlc3BvbnNlVHlwZSwgU3RyZWFtIG91dHB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJQ29kZWRJbnB1dFN0cmVhbSBjb2RlZElucHV0ID0gTWVzc2FnZUZvcm1hdEZhY3RvcnkuQ3JlYXRlSW5wdXRTdHJlYW0ob3B0aW9ucywgY29udGVudFR5cGUsIGlucHV0KTsNCisgICAgICAgICAgICBjb2RlZElucHV0LlJlYWRNZXNzYWdlU3RhcnQoKTsNCisgICAgICAgICAgICBJTWVzc2FnZUxpdGUgcmVzcG9uc2UgPSBzdHViLkNhbGxNZXRob2QobWV0aG9kTmFtZSwgY29kZWRJbnB1dCwgb3B0aW9ucy5FeHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgY29kZWRJbnB1dC5SZWFkTWVzc2FnZUVuZCgpOw0KKyAgICAgICAgICAgIFdyaXRlVG8ocmVzcG9uc2UsIG9wdGlvbnMsIHJlc3BvbnNlVHlwZSwgb3V0cHV0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgICNlbmRyZWdpb24NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0h0dHAvRm9ybVVybEVuY29kZWRSZWFkZXIuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0h0dHAvRm9ybVVybEVuY29kZWRSZWFkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4ZDc2YQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vSHR0cC9Gb3JtVXJsRW5jb2RlZFJlYWRlci5jcwpAQCAtMCwwICsxLDE2MiBAQAordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLkh0dHANCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEFsbG93cyByZWFkaW5nIG1lc3NhZ2VzIGZyb20gYSBuYW1lL3ZhbHVlIGRpY3Rpb25hcnkNCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIGNsYXNzIEZvcm1VcmxFbmNvZGVkUmVhZGVyIDogQWJzdHJhY3RUZXh0UmVhZGVyDQorICAgIHsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVGV4dFJlYWRlciBfaW5wdXQ7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBfZmllbGROYW1lLCBfZmllbGRWYWx1ZTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBfcmVhZHk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIGRpY3Rpb25hcnkgcmVhZGVyIGZyb20gYW4gZW51bWVyYXRpb24gb2YgS2V5VmFsdWVQYWlyIGRhdGEsIGxpa2UgYW4gSURpY3Rpb25hcnkNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBGb3JtVXJsRW5jb2RlZFJlYWRlcihUZXh0UmVhZGVyIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIF9pbnB1dCA9IGlucHV0Ow0KKyAgICAgICAgICAgIGludCBjaCA9IGlucHV0LlBlZWsoKTsNCisgICAgICAgICAgICBpZiAoY2ggPT0gJz8nKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW5wdXQuUmVhZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBfcmVhZHkgPSBSZWFkTmV4dCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI3JlZ2lvbiBDcmVhdGVJbnN0YW5jZSBvdmVybG9hZHMNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgRm9ybVVybEVuY29kZWRSZWFkZXIgdG8gcGFyc2UgZm9ybSBkYXRhLCBvciB1cmwgcXVlcnkgdGV4dCBpbnRvIGEgbWVzc2FnZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvcm1VcmxFbmNvZGVkUmVhZGVyIENyZWF0ZUluc3RhbmNlKFN0cmVhbSBzdHJlYW0pDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtVXJsRW5jb2RlZFJlYWRlcihuZXcgU3RyZWFtUmVhZGVyKHN0cmVhbSwgRW5jb2RpbmcuVVRGOCwgZmFsc2UpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgRm9ybVVybEVuY29kZWRSZWFkZXIgdG8gcGFyc2UgZm9ybSBkYXRhLCBvciB1cmwgcXVlcnkgdGV4dCBpbnRvIGEgbWVzc2FnZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvcm1VcmxFbmNvZGVkUmVhZGVyIENyZWF0ZUluc3RhbmNlKGJ5dGVbXSBieXRlcykNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1VcmxFbmNvZGVkUmVhZGVyKG5ldyBTdHJlYW1SZWFkZXIobmV3IE1lbW9yeVN0cmVhbShieXRlcywgZmFsc2UpLCBFbmNvZGluZy5VVEY4LCBmYWxzZSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYSBGb3JtVXJsRW5jb2RlZFJlYWRlciB0byBwYXJzZSBmb3JtIGRhdGEsIG9yIHVybCBxdWVyeSB0ZXh0IGludG8gYSBtZXNzYWdlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRm9ybVVybEVuY29kZWRSZWFkZXIgQ3JlYXRlSW5zdGFuY2Uoc3RyaW5nIHRleHQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtVXJsRW5jb2RlZFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHRleHQpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgRm9ybVVybEVuY29kZWRSZWFkZXIgdG8gcGFyc2UgZm9ybSBkYXRhLCBvciB1cmwgcXVlcnkgdGV4dCBpbnRvIGEgbWVzc2FnZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvcm1VcmxFbmNvZGVkUmVhZGVyIENyZWF0ZUluc3RhbmNlKFRleHRSZWFkZXIgaW5wdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtVXJsRW5jb2RlZFJlYWRlcihpbnB1dCk7DQorICAgICAgICB9DQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICBwcml2YXRlIGJvb2wgUmVhZE5leHQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgZmllbGQgPSBuZXcgU3RyaW5nQnVpbGRlcigzMik7DQorICAgICAgICAgICAgU3RyaW5nQnVpbGRlciB2YWx1ZSA9IG5ldyBTdHJpbmdCdWlsZGVyKDY0KTsNCisgICAgICAgICAgICBpbnQgY2g7DQorICAgICAgICAgICAgd2hpbGUgKC0xICE9IChjaCA9IF9pbnB1dC5SZWFkKCkpICYmIGNoICE9ICc9JyAmJiBjaCAhPSAnJicpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBmaWVsZC5BcHBlbmQoKGNoYXIpY2gpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAoY2ggIT0gLTEgJiYgY2ggIT0gJyYnKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd2hpbGUgKC0xICE9IChjaCA9IF9pbnB1dC5SZWFkKCkpICYmIGNoICE9ICcmJykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUuQXBwZW5kKChjaGFyKWNoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBfZmllbGROYW1lID0gZmllbGQuVG9TdHJpbmcoKTsNCisgICAgICAgICAgICBfZmllbGRWYWx1ZSA9IFVyaS5VbmVzY2FwZURhdGFTdHJpbmcodmFsdWUuUmVwbGFjZSgnKycsICcgJykuVG9TdHJpbmcoKSk7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgcmV0dXJuICFTdHJpbmcuSXNOdWxsT3JFbXB0eShfZmllbGROYW1lKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBOby1vcA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNZXNzYWdlU3RhcnQoKQ0KKyAgICAgICAgeyB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTm8tb3ANCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWVzc2FnZUVuZCgpDQorICAgICAgICB7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBNZXJnZXMgdGhlIGNvbnRlbnRzIG9mIHN0cmVhbSBpbnRvIHRoZSBwcm92aWRlZCBtZXNzYWdlIGJ1aWxkZXINCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVEJ1aWxkZXIgTWVyZ2U8VEJ1aWxkZXI+KFRCdWlsZGVyIGJ1aWxkZXIsIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJ1aWxkZXIuV2Vha01lcmdlRnJvbSh0aGlzLCByZWdpc3RyeSk7DQorICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2F1c2VzIHRoZSByZWFkZXIgdG8gc2tpcCBwYXN0IHRoaXMgZmllbGQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBTa2lwKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfcmVhZHkgPSBSZWFkTmV4dCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBlZWtzIGF0IHRoZSBuZXh0IGZpZWxkIGluIHRoZSBpbnB1dCBzdHJlYW0gYW5kIHJldHVybnMgd2hhdCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPg0KKyAgICAgICAgLy8vIFRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRob3V0IGFjdHVhbGx5IHJlYWRpbmcgdGhlIGZpZWxkLiAgT25seSBhZnRlciB0aGUgZmllbGQNCisgICAgICAgIC8vLyBpcyBlaXRoZXIgcmVhZCwgb3Igc2tpcHBlZCwgc2hvdWxkIFBlZWtOZXh0IHJldHVybiBhIGRpZmZlcmVudCB2YWx1ZS4NCisgICAgICAgIC8vLyA8L3JlbWFya3M+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBQZWVrTmV4dChvdXQgc3RyaW5nIGZpZWxkKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZpZWxkID0gX3JlYWR5ID8gX2ZpZWxkTmFtZSA6IG51bGw7DQorICAgICAgICAgICAgcmV0dXJuIGZpZWxkICE9IG51bGw7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0IHdhcyBhYmxlIHRvIHJlYWQgYSBTdHJpbmcgZnJvbSB0aGUgaW5wdXQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBSZWFkQXNUZXh0KHJlZiBzdHJpbmcgdmFsdWUsIFR5cGUgdHlwZUluZm8pDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKF9yZWFkeSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhbHVlID0gX2ZpZWxkVmFsdWU7DQorICAgICAgICAgICAgICAgIF9yZWFkeSA9IFJlYWROZXh0KCk7DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSXQncyB1bmxpa2VseSB0aGlzIHdpbGwgd29yayBmb3IgYW55dGhpbmcgYnV0IHRleHQgZGF0YSBhcyBieXRlcyBVVEY4IGFyZSB0cmFuc2Zvcm1lZCB0byB0ZXh0IGFuZCBiYWNrIHRvIGJ5dGVzDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ5dGVTdHJpbmcgRGVjb2RlQnl0ZXMoc3RyaW5nIGJ5dGVzKQ0KKyAgICAgICAgeyByZXR1cm4gQnl0ZVN0cmluZy5Db3B5RnJvbVV0ZjgoYnl0ZXMpOyB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTm90IFN1cHBvcnRlZA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIFJlYWRHcm91cChJQnVpbGRlckxpdGUgdmFsdWUsIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgeyB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBOb3QgU3VwcG9ydGVkDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGJvb2wgUmVhZE1lc3NhZ2UoSUJ1aWxkZXJMaXRlIGJ1aWxkZXIsIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgeyB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7IH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0h0dHAvTWVzc2FnZUZvcm1hdEZhY3RvcnkuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0h0dHAvTWVzc2FnZUZvcm1hdEZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwYWY2NAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vSHR0cC9NZXNzYWdlRm9ybWF0RmFjdG9yeS5jcwpAQCAtMCwwICsxLDExMiBAQAordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uWG1sOw0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uSHR0cA0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gRXh0ZW5zaW9ucyBhbmQgaGVscGVycyB0byBhYnN0cmFjdCB0aGUgcmVhZGluZy93cml0aW5nIG9mIG1lc3NhZ2VzIGJ5IGEgY2xpZW50LXNwZWNpZmllZCBjb250ZW50IHR5cGUuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVzc2FnZUZvcm1hdEZhY3RvcnkNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYW4gSUNvZGVkSW5wdXRTdHJlYW0gZnJvbSB0aGUgaW5wdXQgc3RyZWFtIGJhc2VkIG9uIHRoZSBjb250ZW50VHlwZSBwcm92aWRlZA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3B0aW9ucyI+T3B0aW9ucyBzcGVjaWZpYyB0byByZWFkaW5nIHRoaXMgbWVzc2FnZSBhbmQvb3IgY29udGVudCB0eXBlPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGVudFR5cGUiPlRoZSBtaW1lIHR5cGUgb2YgdGhlIGlucHV0IHN0cmVhbSBjb250ZW50PC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXQiPlRoZSBzdHJlYW0gdG8gcmVhZCB0aGUgbWVzc2FnZSBmcm9tPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgSUNvZGVkSW5wdXRTdHJlYW0gdGhhdCBjYW4gYmUgZ2l2ZW4gdG8gdGhlIElCdWlsZGVyLk1lcmdlRnJvbSguLi4pIG1ldGhvZDwvcmV0dXJucz4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUNvZGVkSW5wdXRTdHJlYW0gQ3JlYXRlSW5wdXRTdHJlYW0oTWVzc2FnZUZvcm1hdE9wdGlvbnMgb3B0aW9ucywgc3RyaW5nIGNvbnRlbnRUeXBlLCBTdHJlYW0gaW5wdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgSUNvZGVkSW5wdXRTdHJlYW0gY29kZWRJbnB1dCA9IENvbnRlbnRUeXBlVG9JbnB1dFN0cmVhbShjb250ZW50VHlwZSwgb3B0aW9ucywgaW5wdXQpOw0KKw0KKyAgICAgICAgICAgIGlmIChjb2RlZElucHV0IGlzIFhtbEZvcm1hdFJlYWRlcikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFhtbEZvcm1hdFJlYWRlciByZWFkZXIgPSAoWG1sRm9ybWF0UmVhZGVyKWNvZGVkSW5wdXQ7DQorICAgICAgICAgICAgICAgIHJlYWRlci5Sb290RWxlbWVudE5hbWUgPSBvcHRpb25zLlhtbFJlYWRlclJvb3RFbGVtZW50TmFtZTsNCisgICAgICAgICAgICAgICAgcmVhZGVyLk9wdGlvbnMgPSBvcHRpb25zLlhtbFJlYWRlck9wdGlvbnM7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHJldHVybiBjb2RlZElucHV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIHRoZSBtZXNzYWdlIGluc3RhbmNlIHRvIHRoZSBzdHJlYW0gdXNpbmcgdGhlIGNvbnRlbnQgdHlwZSBwcm92aWRlZA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3B0aW9ucyI+T3B0aW9ucyBzcGVjaWZpYyB0byB3cml0aW5nIHRoaXMgbWVzc2FnZSBhbmQvb3IgY29udGVudCB0eXBlPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGVudFR5cGUiPlRoZSBtaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQgdG8gYmUgd3JpdHRlbjwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im91dHB1dCI+VGhlIHN0cmVhbSB0byB3cml0ZSB0aGUgbWVzc2FnZSB0bzwvcGFyYW0+DQorICAgICAgICAvLy8gPHJlbWFya3M+IElmIHlvdSBkbyBub3QgZGlzcG9zZSBvZiBJQ29kZWRPdXRwdXRTdHJlYW0gc29tZSBmb3JtYXRzIG1heSB5aWVsZCBpbmNvbXBsZXRlIG91dHB1dCA8L3JlbWFya3M+DQorICAgICAgICBwdWJsaWMgc3RhdGljIElDb2RlZE91dHB1dFN0cmVhbSBDcmVhdGVPdXRwdXRTdHJlYW0oTWVzc2FnZUZvcm1hdE9wdGlvbnMgb3B0aW9ucywgc3RyaW5nIGNvbnRlbnRUeXBlLCBTdHJlYW0gb3V0cHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIElDb2RlZE91dHB1dFN0cmVhbSBjb2RlZE91dHB1dCA9IENvbnRlbnRUeXBlVG9PdXRwdXRTdHJlYW0oY29udGVudFR5cGUsIG9wdGlvbnMsIG91dHB1dCk7DQorDQorICAgICAgICAgICAgaWYgKGNvZGVkT3V0cHV0IGlzIEpzb25Gb3JtYXRXcml0ZXIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBKc29uRm9ybWF0V3JpdGVyIHdyaXRlciA9IChKc29uRm9ybWF0V3JpdGVyKWNvZGVkT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5Gb3JtYXR0ZWRPdXRwdXQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Gb3JtYXR0ZWQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIGlmIChjb2RlZE91dHB1dCBpcyBYbWxGb3JtYXRXcml0ZXIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBYbWxGb3JtYXRXcml0ZXIgd3JpdGVyID0gKFhtbEZvcm1hdFdyaXRlciljb2RlZE91dHB1dDsNCisgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuRm9ybWF0dGVkT3V0cHV0KQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBYbWxXcml0ZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBYbWxXcml0ZXJTZXR0aW5ncygpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDaGFyYWN0ZXJzID0gZmFsc2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3TGluZUhhbmRsaW5nID0gTmV3TGluZUhhbmRsaW5nLkVudGl0aXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9taXRYbWxEZWNsYXJhdGlvbiA9IHRydWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmcgPSBuZXcgVVRGOEVuY29kaW5nKGZhbHNlKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRlbnQgPSB0cnVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGVudENoYXJzID0gIiAgICAiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCisgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGtub3cgaG93IGVsc2UgdG8gY2hhbmdlIHhtbCB3cml0ZXIgb3B0aW9ucz8NCisgICAgICAgICAgICAgICAgICAgIGNvZGVkT3V0cHV0ID0gd3JpdGVyID0gWG1sRm9ybWF0V3JpdGVyLkNyZWF0ZUluc3RhbmNlKFhtbFdyaXRlci5DcmVhdGUob3V0cHV0LCBzZXR0aW5ncykpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHdyaXRlci5Sb290RWxlbWVudE5hbWUgPSBvcHRpb25zLlhtbFdyaXRlclJvb3RFbGVtZW50TmFtZTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLk9wdGlvbnMgPSBvcHRpb25zLlhtbFdyaXRlck9wdGlvbnM7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHJldHVybiBjb2RlZE91dHB1dDsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIElDb2RlZElucHV0U3RyZWFtIENvbnRlbnRUeXBlVG9JbnB1dFN0cmVhbShzdHJpbmcgY29udGVudFR5cGUsIE1lc3NhZ2VGb3JtYXRPcHRpb25zIG9wdGlvbnMsIFN0cmVhbSBpbnB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBjb250ZW50VHlwZSA9IChjb250ZW50VHlwZSA/PyBTdHJpbmcuRW1wdHkpLlNwbGl0KCc7JylbMF0uVHJpbSgpOw0KKw0KKyAgICAgICAgICAgIENvZGVkSW5wdXRCdWlsZGVyIGZhY3Rvcnk7DQorICAgICAgICAgICAgaWYoIW9wdGlvbnMuTWltZUlucHV0VHlwZXNSZWFkT25seS5UcnlHZXRWYWx1ZShjb250ZW50VHlwZSwgb3V0IGZhY3RvcnkpIHx8IGZhY3RvcnkgPT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmKFN0cmluZy5Jc051bGxPckVtcHR5KG9wdGlvbnMuRGVmYXVsdENvbnRlbnRUeXBlKSB8fA0KKyAgICAgICAgICAgICAgICAgICAgIW9wdGlvbnMuTWltZUlucHV0VHlwZXNSZWFkT25seS5UcnlHZXRWYWx1ZShvcHRpb25zLkRlZmF1bHRDb250ZW50VHlwZSwgb3V0IGZhY3RvcnkpIHx8IGZhY3RvcnkgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiY29udGVudFR5cGUiKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeShpbnB1dCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBJQ29kZWRPdXRwdXRTdHJlYW0gQ29udGVudFR5cGVUb091dHB1dFN0cmVhbShzdHJpbmcgY29udGVudFR5cGUsIE1lc3NhZ2VGb3JtYXRPcHRpb25zIG9wdGlvbnMsIFN0cmVhbSBvdXRwdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgY29udGVudFR5cGUgPSAoY29udGVudFR5cGUgPz8gU3RyaW5nLkVtcHR5KS5TcGxpdCgnOycpWzBdLlRyaW0oKTsNCisNCisgICAgICAgICAgICBDb2RlZE91dHB1dEJ1aWxkZXIgZmFjdG9yeTsNCisgICAgICAgICAgICBpZiAoIW9wdGlvbnMuTWltZU91dHB1dFR5cGVzUmVhZE9ubHkuVHJ5R2V0VmFsdWUoY29udGVudFR5cGUsIG91dCBmYWN0b3J5KSB8fCBmYWN0b3J5ID09IG51bGwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkob3B0aW9ucy5EZWZhdWx0Q29udGVudFR5cGUpIHx8DQorICAgICAgICAgICAgICAgICAgICAhb3B0aW9ucy5NaW1lT3V0cHV0VHlwZXNSZWFkT25seS5UcnlHZXRWYWx1ZShvcHRpb25zLkRlZmF1bHRDb250ZW50VHlwZSwgb3V0IGZhY3RvcnkpIHx8IGZhY3RvcnkgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiY29udGVudFR5cGUiKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeShvdXRwdXQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vSHR0cC9NZXNzYWdlRm9ybWF0T3B0aW9ucy5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vSHR0cC9NZXNzYWdlRm9ybWF0T3B0aW9ucy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDgwZTUwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9IdHRwL01lc3NhZ2VGb3JtYXRPcHRpb25zLmNzCkBAIC0wLDAgKzEsMTc2IEBACit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLklPOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5IdHRwDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBBIGRlbGVnYXRlIHVzZWQgdG8gc3BlY2lmeSBhIG1ldGhvZCB0aGF0IGNvbnN0cnVjdHMgYW4gSUNvZGVkSW5wdXRTdHJlYW0gZnJvbSBhIC5ORVQgU3RyZWFtLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgZGVsZWdhdGUgSUNvZGVkSW5wdXRTdHJlYW0gQ29kZWRJbnB1dEJ1aWxkZXIoU3RyZWFtIHN0cmVhbSk7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEEgZGVsZWdhdGUgdXNlZCB0byBzcGVjaWZ5IGEgbWV0aG9kIHRoYXQgY29uc3RydWN0cyBhbiBJQ29kZWRPdXRwdXRTdHJlYW0gZnJvbSBhIC5ORVQgU3RyZWFtLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgZGVsZWdhdGUgSUNvZGVkT3V0cHV0U3RyZWFtIENvZGVkT3V0cHV0QnVpbGRlcihTdHJlYW0gc3RyZWFtKTsNCisNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gRGVmaW5lcyBjb250cm9sIGluZm9ybWF0aW9uIGZvciB0aGUgdmFyaW91cyBmb3JtYXR0aW5nIHVzZWQgd2l0aCBIVFRQIHNlcnZpY2VzDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBjbGFzcyBNZXNzYWdlRm9ybWF0T3B0aW9ucw0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+VGhlIG1pbWUgdHlwZSBmb3IgeG1sIGNvbnRlbnQ8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+T3RoZXIgdmFsaWQgeG1sIG1pbWUgdHlwZXMgaW5jbHVkZTogYXBwbGljYXRpb24vYmluYXJ5LCBhcHBsaWNhdGlvbi94LXByb3RvYnVmPC9yZW1hcmtzPg0KKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBDb250ZW50VHlwZVByb3RvQnVmZmVyID0gImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUucHJvdG9idWYiOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PlRoZSBtaW1lIHR5cGUgZm9yIHhtbCBjb250ZW50PC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPk90aGVyIHZhbGlkIHhtbCBtaW1lIHR5cGVzIGluY2x1ZGU6IHRleHQveG1sPC9yZW1hcmtzPg0KKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBDb250ZW50VHlwZVhtbCA9ICJhcHBsaWNhdGlvbi94bWwiOw0KKyAgICAgICAgDQorICAgICAgICAvLy8gPHN1bW1hcnk+VGhlIG1pbWUgdHlwZSBmb3IganNvbiBjb250ZW50PC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPg0KKyAgICAgICAgLy8vIE90aGVyIHZhbGlkIGpzb24gbWltZSB0eXBlcyBpbmNsdWRlOiBhcHBsaWNhdGlvbi9qc29uLCBhcHBsaWNhdGlvbi94LWpzb24sIA0KKyAgICAgICAgLy8vIGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCwgdGV4dC9qYXZhc2NyaXB0LCB0ZXh0L3gtamF2YXNjcmlwdCwgdGV4dC94LWpzb24sIHRleHQvanNvbg0KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4NCisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgQ29udGVudFR5cGVKc29uID0gImFwcGxpY2F0aW9uL2pzb24iOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PlRoZSBtaW1lIHR5cGUgZm9yIHF1ZXJ5IHN0cmluZ3MgYW5kIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCBjb250ZW50PC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPlRoaXMgbWltZSB0eXBlIGlzIGlucHV0LW9ubHk8L3JlbWFya3M+DQorICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIENvbnRlbnRGb3JtVXJsRW5jb2RlZCA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIERlZmF1bHQgbWltZS10eXBlIGhhbmRsaW5nIGZvciBpbnB1dA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElEaWN0aW9uYXJ5PHN0cmluZywgQ29kZWRJbnB1dEJ1aWxkZXI+IE1pbWVJbnB1dERlZmF1bHRzID0NCisgICAgICAgICAgICBuZXcgUmVhZE9ubHlEaWN0aW9uYXJ5PHN0cmluZywgQ29kZWRJbnB1dEJ1aWxkZXI+KA0KKyAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgQ29kZWRJbnB1dEJ1aWxkZXI+KFN0cmluZ0NvbXBhcmVyLk9yZGluYWxJZ25vcmVDYXNlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB7ImFwcGxpY2F0aW9uL2pzb24iLCBKc29uRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlfSwNCisgICAgICAgICAgICAgICAgICAgIHsiYXBwbGljYXRpb24veC1qc29uIiwgSnNvbkZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZX0sDQorICAgICAgICAgICAgICAgICAgICB7ImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsIEpzb25Gb3JtYXRSZWFkZXIuQ3JlYXRlSW5zdGFuY2V9LA0KKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0L2phdmFzY3JpcHQiLCBKc29uRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlfSwNCisgICAgICAgICAgICAgICAgICAgIHsidGV4dC94LWphdmFzY3JpcHQiLCBKc29uRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlfSwNCisgICAgICAgICAgICAgICAgICAgIHsidGV4dC94LWpzb24iLCBKc29uRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlfSwNCisgICAgICAgICAgICAgICAgICAgIHsidGV4dC9qc29uIiwgSnNvbkZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZX0sDQorICAgICAgICAgICAgICAgICAgICB7InRleHQveG1sIiwgWG1sRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlfSwNCisgICAgICAgICAgICAgICAgICAgIHsiYXBwbGljYXRpb24veG1sIiwgWG1sRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlfSwNCisgICAgICAgICAgICAgICAgICAgIHsiYXBwbGljYXRpb24vYmluYXJ5IiwgQ29kZWRJbnB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZX0sDQorICAgICAgICAgICAgICAgICAgICB7ImFwcGxpY2F0aW9uL3gtcHJvdG9idWYiLCBDb2RlZElucHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlfSwNCisgICAgICAgICAgICAgICAgICAgIHsiYXBwbGljYXRpb24vdm5kLmdvb2dsZS5wcm90b2J1ZiIsIENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2V9LA0KKyAgICAgICAgICAgICAgICAgICAgeyJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLCBGb3JtVXJsRW5jb2RlZFJlYWRlci5DcmVhdGVJbnN0YW5jZX0sDQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICApOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIERlZmF1bHQgbWltZS10eXBlIGhhbmRsaW5nIGZvciBvdXRwdXQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJRGljdGlvbmFyeTxzdHJpbmcsIENvZGVkT3V0cHV0QnVpbGRlcj4gTWltZU91dHB1dERlZmF1bHRzID0NCisgICAgICAgICAgICBuZXcgUmVhZE9ubHlEaWN0aW9uYXJ5PHN0cmluZywgQ29kZWRPdXRwdXRCdWlsZGVyPigNCisgICAgICAgICAgICBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIENvZGVkT3V0cHV0QnVpbGRlcj4oU3RyaW5nQ29tcGFyZXIuT3JkaW5hbElnbm9yZUNhc2UpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHsiYXBwbGljYXRpb24vanNvbiIsIEpzb25Gb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2V9LA0KKyAgICAgICAgICAgICAgICAgICAgeyJhcHBsaWNhdGlvbi94LWpzb24iLCBKc29uRm9ybWF0V3JpdGVyLkNyZWF0ZUluc3RhbmNlfSwNCisgICAgICAgICAgICAgICAgICAgIHsiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IiwgSnNvbkZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZX0sDQorICAgICAgICAgICAgICAgICAgICB7InRleHQvamF2YXNjcmlwdCIsIEpzb25Gb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2V9LA0KKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0L3gtamF2YXNjcmlwdCIsIEpzb25Gb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2V9LA0KKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0L3gtanNvbiIsIEpzb25Gb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2V9LA0KKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0L2pzb24iLCBKc29uRm9ybWF0V3JpdGVyLkNyZWF0ZUluc3RhbmNlfSwNCisgICAgICAgICAgICAgICAgICAgIHsidGV4dC94bWwiLCBYbWxGb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2V9LA0KKyAgICAgICAgICAgICAgICAgICAgeyJhcHBsaWNhdGlvbi94bWwiLCBYbWxGb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2V9LA0KKyAgICAgICAgICAgICAgICAgICAgeyJhcHBsaWNhdGlvbi9iaW5hcnkiLCBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZX0sDQorICAgICAgICAgICAgICAgICAgICB7ImFwcGxpY2F0aW9uL3gtcHJvdG9idWYiLCBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZX0sDQorICAgICAgICAgICAgICAgICAgICB7ImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUucHJvdG9idWYiLCBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZX0sDQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICApOw0KKw0KKw0KKw0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgX2RlZmF1bHRDb250ZW50VHlwZTsNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIF94bWxSZWFkZXJSb290RWxlbWVudE5hbWU7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBfeG1sV3JpdGVyUm9vdEVsZW1lbnROYW1lOw0KKyAgICAgICAgcHJpdmF0ZSBFeHRlbnNpb25SZWdpc3RyeSBfZXh0ZW5zaW9uUmVnaXN0cnk7DQorICAgICAgICBwcml2YXRlIERpY3Rpb25hcnk8c3RyaW5nLCBDb2RlZElucHV0QnVpbGRlcj4gX21pbWVJbnB1dFR5cGVzOw0KKyAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PHN0cmluZywgQ29kZWRPdXRwdXRCdWlsZGVyPiBfbWltZU91dHB1dFR5cGVzOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PiBQcm92aWRlcyBhY2Nlc3MgdG8gbW9kaWZ5IHRoZSBtaW1lLXR5cGUgaW5wdXQgc3RyZWFtIGNvbnN0cnVjdGlvbiA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8c3RyaW5nLCBDb2RlZElucHV0QnVpbGRlcj4gTWltZUlucHV0VHlwZXMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBfbWltZUlucHV0VHlwZXMgPz8NCisgICAgICAgICAgICAgICAgICAgIChfbWltZUlucHV0VHlwZXMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIENvZGVkSW5wdXRCdWlsZGVyPigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWltZUlucHV0RGVmYXVsdHMsIFN0cmluZ0NvbXBhcmVyLk9yZGluYWxJZ25vcmVDYXNlKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PiBQcm92aWRlcyBhY2Nlc3MgdG8gbW9kaWZ5IHRoZSBtaW1lLXR5cGUgaW5wdXQgc3RyZWFtIGNvbnN0cnVjdGlvbiA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8c3RyaW5nLCBDb2RlZE91dHB1dEJ1aWxkZXI+IE1pbWVPdXRwdXRUeXBlcw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIF9taW1lT3V0cHV0VHlwZXMgPz8NCisgICAgICAgICAgICAgICAgICAgIChfbWltZU91dHB1dFR5cGVzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBDb2RlZE91dHB1dEJ1aWxkZXI+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW1lT3V0cHV0RGVmYXVsdHMsIFN0cmluZ0NvbXBhcmVyLk9yZGluYWxJZ25vcmVDYXNlKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgSURpY3Rpb25hcnk8c3RyaW5nLCBDb2RlZElucHV0QnVpbGRlcj4gTWltZUlucHV0VHlwZXNSZWFkT25seQ0KKyAgICAgICAgeyBnZXQgeyByZXR1cm4gX21pbWVJbnB1dFR5cGVzID8/IE1pbWVJbnB1dERlZmF1bHRzOyB9IH0NCisNCisgICAgICAgIGludGVybmFsIElEaWN0aW9uYXJ5PHN0cmluZywgQ29kZWRPdXRwdXRCdWlsZGVyPiBNaW1lT3V0cHV0VHlwZXNSZWFkT25seQ0KKyAgICAgICAgeyBnZXQgeyByZXR1cm4gX21pbWVPdXRwdXRUeXBlcyA/PyBNaW1lT3V0cHV0RGVmYXVsdHM7IH0gfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZSB0byB1c2UgaWYgdGhlIGlucHV0IHR5cGUgaXMgbnVsbCBvciBlbXB0eS4gIElmIHRoaXMNCisgICAgICAgIC8vLyB2YWx1ZSBpcyBub3Qgc3VwcGxpZWQgYW4gQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RyaW5nIERlZmF1bHRDb250ZW50VHlwZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfZGVmYXVsdENvbnRlbnRUeXBlID8/IFN0cmluZy5FbXB0eTsgfQ0KKyAgICAgICAgICAgIHNldCB7IF9kZWZhdWx0Q29udGVudFR5cGUgPSB2YWx1ZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBleHRlbnNpb24gcmVnaXN0cnkgdG8gdXNlIHdoZW4gcmVhZGluZyBtZXNzYWdlcw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBFeHRlbnNpb25SZWdpc3RyeSBFeHRlbnNpb25SZWdpc3RyeQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfZXh0ZW5zaW9uUmVnaXN0cnkgPz8gRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHk7IH0NCisgICAgICAgICAgICBzZXQgeyBfZXh0ZW5zaW9uUmVnaXN0cnkgPSB2YWx1ZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBuYW1lIG9mIHRoZSB4bWwgcm9vdCBlbGVtZW50IHdoZW4gcmVhZGluZyBtZXNzYWdlcw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgWG1sUmVhZGVyUm9vdEVsZW1lbnROYW1lDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF94bWxSZWFkZXJSb290RWxlbWVudE5hbWUgPz8gWG1sRm9ybWF0UmVhZGVyLkRlZmF1bHRSb290RWxlbWVudE5hbWU7IH0NCisgICAgICAgICAgICBzZXQgeyBfeG1sUmVhZGVyUm9vdEVsZW1lbnROYW1lID0gdmFsdWU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBYbWwgcmVhZGVyIG9wdGlvbnMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgWG1sUmVhZGVyT3B0aW9ucyBYbWxSZWFkZXJPcHRpb25zIHsgZ2V0OyBzZXQ7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUcnVlIHRvIHVzZSBmb3JtYXR0ZWQgb3V0cHV0IGluY2x1ZGluZyBuZXctbGluZXMgYW5kIGRlZmF1bHQgaW5kZW50YXRpb24NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgYm9vbCBGb3JtYXR0ZWRPdXRwdXQgeyBnZXQ7IHNldDsgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBuYW1lIG9mIHRoZSB4bWwgcm9vdCBlbGVtZW50IHdoZW4gd3JpdGluZyBtZXNzYWdlcw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgWG1sV3JpdGVyUm9vdEVsZW1lbnROYW1lDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF94bWxXcml0ZXJSb290RWxlbWVudE5hbWUgPz8gWG1sRm9ybWF0V3JpdGVyLkRlZmF1bHRSb290RWxlbWVudE5hbWU7IH0NCisgICAgICAgICAgICBzZXQgeyBfeG1sV3JpdGVyUm9vdEVsZW1lbnROYW1lID0gdmFsdWU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBYbWwgd3JpdGVyIG9wdGlvbnMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgWG1sV3JpdGVyT3B0aW9ucyBYbWxXcml0ZXJPcHRpb25zIHsgZ2V0OyBzZXQ7IH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0pzb25Gb3JtYXRSZWFkZXIuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0pzb25Gb3JtYXRSZWFkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzMTk2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vSnNvbkZvcm1hdFJlYWRlci5jcwpAQCAtMCwwICsxLDI2MiBAQAordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uWG1sOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24NCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEpzb25Gb3JtYXRSZWFkZXIgaXMgdXNlZCB0byBwYXJzZSBKc29uIGludG8gYSBtZXNzYWdlIG9yIGFuIGFycmF5IG9mIG1lc3NhZ2VzDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBjbGFzcyBKc29uRm9ybWF0UmVhZGVyIDogQWJzdHJhY3RUZXh0UmVhZGVyDQorICAgIHsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSnNvbkN1cnNvciBfaW5wdXQ7DQorICAgICAgICAvLyBUaGUgZXhwZWN0ZWQgdG9rZW4gdGhhdCBlbmRzIHRoZSBjdXJyZW50IGl0ZW0sIGVpdGhlciAnXScgb3IgJ30nDQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFN0YWNrPGludD4gX3N0b3BDaGFyOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBlbnVtIFJlYWRlclN0YXRlDQorICAgICAgICB7DQorICAgICAgICAgICAgU3RhcnQsDQorICAgICAgICAgICAgQmVnaW5WYWx1ZSwNCisgICAgICAgICAgICBFbmRWYWx1ZSwNCisgICAgICAgICAgICBCZWdpbk9iamVjdCwNCisgICAgICAgICAgICBCZWdpbkFycmF5DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0cmluZyBfY3VycmVudDsNCisgICAgICAgIHByaXZhdGUgUmVhZGVyU3RhdGUgX3N0YXRlOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYSBKc29uRm9ybWF0UmVhZGVyIHRvIHBhcnNlIEpzb24gaW50byBhIG1lc3NhZ2UsIHRoaXMgbWV0aG9kIGRvZXMgbm90IHVzZSB0ZXh0IGVuY29kaW5nLCBhbGwgYnl0ZXMgTVVTVA0KKyAgICAgICAgLy8vIHJlcHJlc2VudCBBU0NJSSBjaGFyYWN0ZXIgdmFsdWVzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSnNvbkZvcm1hdFJlYWRlciBDcmVhdGVJbnN0YW5jZShTdHJlYW0gc3RyZWFtKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgSnNvbkZvcm1hdFJlYWRlcihKc29uQ3Vyc29yLkNyZWF0ZUluc3RhbmNlKHN0cmVhbSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYSBKc29uRm9ybWF0UmVhZGVyIHRvIHBhcnNlIEpzb24gaW50byBhIG1lc3NhZ2UsIHRoaXMgbWV0aG9kIGRvZXMgbm90IHVzZSB0ZXh0IGVuY29kaW5nLCBhbGwgYnl0ZXMgTVVTVA0KKyAgICAgICAgLy8vIHJlcHJlc2VudCBBU0NJSSBjaGFyYWN0ZXIgdmFsdWVzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSnNvbkZvcm1hdFJlYWRlciBDcmVhdGVJbnN0YW5jZShieXRlW10gYnl0ZXMpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBKc29uRm9ybWF0UmVhZGVyKEpzb25DdXJzb3IuQ3JlYXRlSW5zdGFuY2UoYnl0ZXMpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgSnNvbkZvcm1hdFJlYWRlciB0byBwYXJzZSBKc29uIGludG8gYSBtZXNzYWdlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBKc29uRm9ybWF0UmVhZGVyIENyZWF0ZUluc3RhbmNlKHN0cmluZyBqc29uVGV4dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IEpzb25Gb3JtYXRSZWFkZXIoSnNvbkN1cnNvci5DcmVhdGVJbnN0YW5jZShqc29uVGV4dCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYSBKc29uRm9ybWF0UmVhZGVyIHRvIHBhcnNlIEpzb24gaW50byBhIG1lc3NhZ2UNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEpzb25Gb3JtYXRSZWFkZXIgQ3JlYXRlSW5zdGFuY2UoVGV4dFJlYWRlciBpbnB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IEpzb25Gb3JtYXRSZWFkZXIoSnNvbkN1cnNvci5DcmVhdGVJbnN0YW5jZShpbnB1dCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYSBKc29uRm9ybWF0UmVhZGVyIHRvIHBhcnNlIEpzb24gaW50byBhIG1lc3NhZ2UNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnRlcm5hbCBKc29uRm9ybWF0UmVhZGVyKEpzb25DdXJzb3IgaW5wdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgX2lucHV0ID0gaW5wdXQ7DQorICAgICAgICAgICAgX3N0b3BDaGFyID0gbmV3IFN0YWNrPGludD4oKTsNCisgICAgICAgICAgICBfc3RvcENoYXIuUHVzaCgtMSk7DQorICAgICAgICAgICAgX3N0YXRlID0gUmVhZGVyU3RhdGUuU3RhcnQ7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29uc3RydWN0cyBhIEpzb25Gb3JtYXRSZWFkZXIgdG8gcGFyc2UgSnNvbiBpbnRvIGEgbWVzc2FnZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBKc29uRm9ybWF0UmVhZGVyKFRleHRSZWFkZXIgaW5wdXQpDQorICAgICAgICAgICAgOiB0aGlzKEpzb25DdXJzb3IuQ3JlYXRlSW5zdGFuY2UoaW5wdXQpKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVhZGVyIGlzIGN1cnJlbnRseSBvbiBhbiBhcnJheSBlbGVtZW50DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGJvb2wgSXNBcnJheU1lc3NhZ2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2lucHV0Lk5leHRDaGFyID09ICdbJzsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgYW4gZW51bWVyYXRvciB0aGF0IGlzIHVzZWQgdG8gY3Vyc29yIG92ZXIgYW4gYXJyYXkgb2YgbWVzc2FnZXMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+DQorICAgICAgICAvLy8gVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCB3aGVuIHJlY2VpdmluZyBhbiBhcnJheSBvZiBtZXNzYWdlcyByYXRoZXIgdGhhbiBhIHNpbmdsZSByb290IG1lc3NhZ2UNCisgICAgICAgIC8vLyA8L3JlbWFya3M+DQorICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8SnNvbkZvcm1hdFJlYWRlcj4gRW51bWVyYXRlQXJyYXkoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBpZ25vcmVkIGluIEZvcmVhY2hBcnJheUl0ZW0oX2N1cnJlbnQpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIHRoZSByb290LW1lc3NhZ2UgcHJlYW1ibGUgc3BlY2lmaWMgdG8gdGhpcyBmb3JtYXR0ZXINCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWVzc2FnZVN0YXJ0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfaW5wdXQuQ29uc3VtZSgneycpOw0KKyAgICAgICAgICAgIF9zdG9wQ2hhci5QdXNoKCd9Jyk7DQorDQorICAgICAgICAgICAgX3N0YXRlID0gUmVhZGVyU3RhdGUuQmVnaW5PYmplY3Q7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgdGhlIHJvb3QtbWVzc2FnZSBjbG9zZSBzcGVjaWZpYyB0byB0aGlzIGZvcm1hdHRlcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNZXNzYWdlRW5kKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfaW5wdXQuQ29uc3VtZSgoY2hhcilfc3RvcENoYXIuUG9wKCkpOw0KKyAgICAgICAgICAgIF9zdGF0ZSA9IFJlYWRlclN0YXRlLkVuZFZhbHVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE1lcmdlcyB0aGUgY29udGVudHMgb2Ygc3RyZWFtIGludG8gdGhlIHByb3ZpZGVkIG1lc3NhZ2UgYnVpbGRlcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUQnVpbGRlciBNZXJnZTxUQnVpbGRlcj4oVEJ1aWxkZXIgYnVpbGRlciwgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgUmVhZE1lc3NhZ2VTdGFydCgpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuV2Vha01lcmdlRnJvbSh0aGlzLCByZWdpc3RyeSk7DQorICAgICAgICAgICAgUmVhZE1lc3NhZ2VFbmQoKTsNCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDYXVzZXMgdGhlIHJlYWRlciB0byBza2lwIHBhc3QgdGhpcyBmaWVsZA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFNraXAoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIG9iamVjdCB0ZW1wOw0KKyAgICAgICAgICAgIF9pbnB1dC5SZWFkVmFyaWFudChvdXQgdGVtcCk7DQorICAgICAgICAgICAgX3N0YXRlID0gUmVhZGVyU3RhdGUuRW5kVmFsdWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUGVla3MgYXQgdGhlIG5leHQgZmllbGQgaW4gdGhlIGlucHV0IHN0cmVhbSBhbmQgcmV0dXJucyB3aGF0IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+DQorICAgICAgICAvLy8gVGhpcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGhvdXQgYWN0dWFsbHkgcmVhZGluZyB0aGUgZmllbGQuICBPbmx5IGFmdGVyIHRoZSBmaWVsZA0KKyAgICAgICAgLy8vIGlzIGVpdGhlciByZWFkLCBvciBza2lwcGVkLCBzaG91bGQgUGVla05leHQgcmV0dXJuIGEgZGlmZmVyZW50IHZhbHVlLg0KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFBlZWtOZXh0KG91dCBzdHJpbmcgZmllbGQpDQorICAgICAgICB7DQorICAgICAgICAgICAgZmllbGQgPSBfY3VycmVudDsNCisgICAgICAgICAgICBpZiAoX3N0YXRlID09IFJlYWRlclN0YXRlLkJlZ2luVmFsdWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaW50IG5leHQgPSBfaW5wdXQuTmV4dENoYXI7DQorICAgICAgICAgICAgaWYgKG5leHQgPT0gX3N0b3BDaGFyLlBlZWsoKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgX2lucHV0LkFzc2VydChuZXh0ICE9IC0xLCAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4iKTsNCisNCisgICAgICAgICAgICAvL25vdCBzdXJlIGFib3V0IHRoaXMgeWV0LCBpdCB3aWxsIGFsbG93IHssICJhIjp0cnVlIH0NCisgICAgICAgICAgICBpZiAoX3N0YXRlID09IFJlYWRlclN0YXRlLkVuZFZhbHVlICYmICFfaW5wdXQuVHJ5Q29uc3VtZSgnLCcpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBmaWVsZCA9IF9jdXJyZW50ID0gX2lucHV0LlJlYWRTdHJpbmcoKTsNCisgICAgICAgICAgICBfaW5wdXQuQ29uc3VtZSgnOicpOw0KKyAgICAgICAgICAgIF9zdGF0ZSA9IFJlYWRlclN0YXRlLkJlZ2luVmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0IHdhcyBhYmxlIHRvIHJlYWQgYSBTdHJpbmcgZnJvbSB0aGUgaW5wdXQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBSZWFkQXNUZXh0KHJlZiBzdHJpbmcgdmFsdWUsIFR5cGUgdHlwZUluZm8pDQorICAgICAgICB7DQorICAgICAgICAgICAgb2JqZWN0IHRlbXA7DQorICAgICAgICAgICAgSnNvbkN1cnNvci5Kc1R5cGUgdHlwZSA9IF9pbnB1dC5SZWFkVmFyaWFudChvdXQgdGVtcCk7DQorICAgICAgICAgICAgX3N0YXRlID0gUmVhZGVyU3RhdGUuRW5kVmFsdWU7DQorDQorICAgICAgICAgICAgX2lucHV0LkFzc2VydCh0eXBlICE9IEpzb25DdXJzb3IuSnNUeXBlLkFycmF5ICYmIHR5cGUgIT0gSnNvbkN1cnNvci5Kc1R5cGUuT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuY291bnRlcmVkIHswfSB3aGlsZSBleHBlY3RpbmcgezF9IiwgdHlwZSwgdHlwZUluZm8pOw0KKyAgICAgICAgICAgIGlmICh0eXBlID09IEpzb25DdXJzb3IuSnNUeXBlLk51bGwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh0eXBlID09IEpzb25DdXJzb3IuSnNUeXBlLlRydWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICIxIjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBKc29uQ3Vyc29yLkpzVHlwZS5GYWxzZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhbHVlID0gIjAiOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRlbXAgYXMgc3RyaW5nOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvL2V4cG9uZW50IHJlcHJlc2VudGF0aW9uIG9mIGludGVnZXIgbnVtYmVyOg0KKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGUgPT0gSnNvbkN1cnNvci5Kc1R5cGUuTnVtYmVyICYmDQorICAgICAgICAgICAgICAgICh0eXBlSW5mbyAhPSB0eXBlb2YoZG91YmxlKSAmJiB0eXBlSW5mbyAhPSB0eXBlb2YoZmxvYXQpKSAmJg0KKyAgICAgICAgICAgICAgICB2YWx1ZS5JbmRleE9mKCJlIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkgPiAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFsdWUgPSBYbWxDb252ZXJ0LlRvU3RyaW5nKChsb25nKSBNYXRoLlJvdW5kKFhtbENvbnZlcnQuVG9Eb3VibGUodmFsdWUpLCAwKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgQnl0ZVN0cmluZyBmcm9tIHRoZSBpbnB1dA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFJlYWQocmVmIEJ5dGVTdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIGJ5dGVzID0gbnVsbDsNCisgICAgICAgICAgICBpZiAoUmVhZChyZWYgYnl0ZXMpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFsdWUgPSBCeXRlU3RyaW5nLkZyb21CYXNlNjQoYnl0ZXMpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEN1cnNvcnMgdGhyb3VnaCB0aGUgYXJyYXkgZWxlbWVudHMgYW5kIHN0b3BzIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIElFbnVtZXJhYmxlPHN0cmluZz4gRm9yZWFjaEFycmF5SXRlbShzdHJpbmcgZmllbGQpDQorICAgICAgICB7DQorICAgICAgICAgICAgX2lucHV0LkNvbnN1bWUoJ1snKTsNCisgICAgICAgICAgICBfc3RvcENoYXIuUHVzaCgnXScpOw0KKyAgICAgICAgICAgIF9zdGF0ZSA9IFJlYWRlclN0YXRlLkJlZ2luQXJyYXk7DQorICAgICAgICAgICAgd2hpbGUgKF9pbnB1dC5OZXh0Q2hhciAhPSAnXScpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBfY3VycmVudCA9IGZpZWxkOw0KKyAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gZmllbGQ7DQorICAgICAgICAgICAgICAgIGlmICghX2lucHV0LlRyeUNvbnN1bWUoJywnKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgX2lucHV0LkNvbnN1bWUoKGNoYXIpIF9zdG9wQ2hhci5Qb3AoKSk7DQorICAgICAgICAgICAgX3N0YXRlID0gUmVhZGVyU3RhdGUuRW5kVmFsdWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTWVyZ2VzIHRoZSBpbnB1dCBzdHJlYW0gaW50byB0aGUgcHJvdmlkZWQgSUJ1aWxkZXJMaXRlIA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFJlYWRNZXNzYWdlKElCdWlsZGVyTGl0ZSBidWlsZGVyLCBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBNZXJnZShidWlsZGVyLCByZWdpc3RyeSk7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Kc29uRm9ybWF0V3JpdGVyLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Kc29uRm9ybWF0V3JpdGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTA0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL0pzb25Gb3JtYXRXcml0ZXIuY3MKQEAgLTAsMCArMSw1NDEgQEAKK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgU3lzdGVtLklPOw0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbg0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gSnNvbkZvcm1hdFdyaXRlciBpcyBhIC5ORVQgMi4wIGZyaWVuZGx5IGpzb24gZm9ybWF0dGVyIGZvciBwcm90byBidWZmZXIgbWVzc2FnZXMuICBGb3IgLk5FVCAzLjUNCisgICAgLy8vIHlvdSBtYXkgYWxzbyB1c2UgdGhlIFhtbEZvcm1hdFdyaXRlciB3aXRoIGFuIFhtbFdyaXRlciBjcmVhdGVkIGJ5IHRoZQ0KKyAgICAvLy8gPHNlZSBjcmVmPSJTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkpzb24uSnNvblJlYWRlcldyaXRlckZhY3RvcnkiPkpzb25SZWFkZXJXcml0ZXJGYWN0b3J5PC9zZWU+Lg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnNvbkZvcm1hdFdyaXRlciA6IEFic3RyYWN0VGV4dFdyaXRlcg0KKyAgICB7DQorICAgICAgICAjcmVnaW9uIGJ1ZmZlcmluZyBpbXBsZW1lbnRhdGlvbnMNCisNCisgICAgICAgIHByaXZhdGUgY2xhc3MgSnNvblRleHRXcml0ZXIgOiBKc29uRm9ybWF0V3JpdGVyDQorICAgICAgICB7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjaGFyW10gX2J1ZmZlcjsNCisgICAgICAgICAgICBwcml2YXRlIFRleHRXcml0ZXIgX291dHB1dDsNCisgICAgICAgICAgICBwcml2YXRlIGludCBfYnVmZmVyUG9zOw0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBKc29uVGV4dFdyaXRlcihUZXh0V3JpdGVyIG91dHB1dCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF9idWZmZXIgPSBuZXcgY2hhcls0MDk2XTsNCisgICAgICAgICAgICAgICAgX2J1ZmZlclBvcyA9IDA7DQorICAgICAgICAgICAgICAgIF9vdXRwdXQgPSBvdXRwdXQ7DQorICAgICAgICAgICAgICAgIF9jb3VudGVyLkFkZCgwKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBvdXRwdXQgb2YgVGV4dFdyaXRlci5Ub1N0cmluZygpIHdoZXJlIFRleHRXcml0ZXIgaXMgdGhlIGN0b3IgYXJndW1lbnQuDQorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEZsdXNoKCk7DQorDQorICAgICAgICAgICAgICAgIGlmIChfb3V0cHV0ICE9IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfb3V0cHV0LlRvU3RyaW5nKCk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoX2J1ZmZlciwgMCwgX2J1ZmZlclBvcyk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFdyaXRlVG9PdXRwdXQoY2hhcltdIGNoYXJzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKF9idWZmZXJQb3MgKyBsZW4gPj0gX2J1ZmZlci5MZW5ndGgpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChfb3V0cHV0ID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgX291dHB1dCA9IG5ldyBTdHJpbmdXcml0ZXIobmV3IFN0cmluZ0J1aWxkZXIoX2J1ZmZlci5MZW5ndGgqMiArIGxlbikpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRmx1c2goKTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgX2J1ZmZlci5MZW5ndGgpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMTIpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0b3AgPSBvZmZzZXQgKyBsZW47DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IHN0b3A7IGkrKykNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9idWZmZXJbX2J1ZmZlclBvcysrXSA9IGNoYXJzW2ldOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIuQmxvY2tDb3B5KGNoYXJzLCBvZmZzZXQgPDwgMSwgX2J1ZmZlciwgX2J1ZmZlclBvcyA8PCAxLCBsZW4gPDwgMSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgX2J1ZmZlclBvcyArPSBsZW47DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBfb3V0cHV0LldyaXRlKGNoYXJzLCBvZmZzZXQsIGxlbik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgV3JpdGVUb091dHB1dChjaGFyIGNoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKF9idWZmZXJQb3MgPj0gX2J1ZmZlci5MZW5ndGgpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChfb3V0cHV0ID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgX291dHB1dCA9IG5ldyBTdHJpbmdXcml0ZXIobmV3IFN0cmluZ0J1aWxkZXIoX2J1ZmZlci5MZW5ndGggKiAyKSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBGbHVzaCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIF9idWZmZXJbX2J1ZmZlclBvcysrXSA9IGNoOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoX2J1ZmZlclBvcyA+IDAgJiYgX291dHB1dCAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBfb3V0cHV0LldyaXRlKF9idWZmZXIsIDAsIF9idWZmZXJQb3MpOw0KKyAgICAgICAgICAgICAgICAgICAgX2J1ZmZlclBvcyA9IDA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYmFzZS5GbHVzaCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgY2xhc3MgSnNvblN0cmVhbVdyaXRlciA6IEpzb25Gb3JtYXRXcml0ZXINCisgICAgICAgIHsNCisgICAgICAgICAgICBzdGF0aWMgcmVhZG9ubHkgRW5jb2RpbmcgRW5jb2RpbmcgPSBuZXcgVVRGOEVuY29kaW5nKGZhbHNlKTsNCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBfYnVmZmVyOw0KKyAgICAgICAgICAgIHByaXZhdGUgU3RyZWFtIF9vdXRwdXQ7DQorICAgICAgICAgICAgcHJpdmF0ZSBpbnQgX2J1ZmZlclBvczsNCisNCisgICAgICAgICAgICBwdWJsaWMgSnNvblN0cmVhbVdyaXRlcihTdHJlYW0gb3V0cHV0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgX2J1ZmZlciA9IG5ldyBieXRlWzgxOTJdOw0KKyAgICAgICAgICAgICAgICBfYnVmZmVyUG9zID0gMDsNCisgICAgICAgICAgICAgICAgX291dHB1dCA9IG91dHB1dDsNCisgICAgICAgICAgICAgICAgX2NvdW50ZXIuQWRkKDApOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvT3V0cHV0KGNoYXJbXSBjaGFycywgaW50IG9mZnNldCwgaW50IGxlbikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChfYnVmZmVyUG9zICsgbGVuID49IF9idWZmZXIuTGVuZ3RoKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBGbHVzaCgpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIGlmIChsZW4gPCBfYnVmZmVyLkxlbmd0aCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAxMikNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcCA9IG9mZnNldCArIGxlbjsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgc3RvcDsgaSsrKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2J1ZmZlcltfYnVmZmVyUG9zKytdID0gKGJ5dGUpIGNoYXJzW2ldOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBfYnVmZmVyUG9zICs9IEVuY29kaW5nLkdldEJ5dGVzKGNoYXJzLCBvZmZzZXQsIGxlbiwgX2J1ZmZlciwgX2J1ZmZlclBvcyk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBieXRlW10gdGVtcCA9IEVuY29kaW5nLkdldEJ5dGVzKGNoYXJzLCBvZmZzZXQsIGxlbik7DQorICAgICAgICAgICAgICAgICAgICBfb3V0cHV0LldyaXRlKHRlbXAsIDAsIHRlbXAuTGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvT3V0cHV0KGNoYXIgY2gpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoX2J1ZmZlclBvcyA+PSBfYnVmZmVyLkxlbmd0aCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgRmx1c2goKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBfYnVmZmVyW19idWZmZXJQb3MrK10gPSAoYnl0ZSkgY2g7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChfYnVmZmVyUG9zID4gMCAmJiBfb3V0cHV0ICE9IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXQuV3JpdGUoX2J1ZmZlciwgMCwgX2J1ZmZlclBvcyk7DQorICAgICAgICAgICAgICAgICAgICBfYnVmZmVyUG9zID0gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBiYXNlLkZsdXNoKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgLy9UcmFja3MgdGhlIHdyaXRlciBkZXB0aCBhbmQgdGhlIGFycmF5IGVsZW1lbnQgY291bnQgYXQgdGhhdCBkZXB0aC4NCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTGlzdDxpbnQ+IF9jb3VudGVyOw0KKyAgICAgICAgLy9UcnVlIGlmIHRoZSB0b3AtbGV2ZWwgb2YgdGhlIHdyaXRlciBpcyBhbiBhcnJheSBhcyBvcHBvc2VkIHRvIGEgc2luZ2xlIG1lc3NhZ2UuDQorICAgICAgICBwcml2YXRlIGJvb2wgX2lzQXJyYXk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29uc3RydWN0cyBhIEpzb25Gb3JtYXRXcml0ZXIsIHVzZSB0aGUgVG9TdHJpbmcoKSBtZW1iZXIgdG8gZXh0cmFjdCB0aGUgZmluYWwgSnNvbiBvbiBjb21wbGV0aW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBKc29uRm9ybWF0V3JpdGVyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfY291bnRlciA9IG5ldyBMaXN0PGludD4oKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgSnNvbkZvcm1hdFdyaXRlciwgdXNlIFRvU3RyaW5nKCkgdG8gZXh0cmFjdCB0aGUgZmluYWwgb3V0cHV0DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBKc29uRm9ybWF0V3JpdGVyIENyZWF0ZUluc3RhbmNlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IEpzb25UZXh0V3JpdGVyKG51bGwpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYSBKc29uRm9ybWF0V3JpdGVyIHRvIG91dHB1dCB0byB0aGUgZ2l2ZW4gdGV4dCB3cml0ZXINCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEpzb25Gb3JtYXRXcml0ZXIgQ3JlYXRlSW5zdGFuY2UoVGV4dFdyaXRlciBvdXRwdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBKc29uVGV4dFdyaXRlcihvdXRwdXQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYSBKc29uRm9ybWF0V3JpdGVyIHRvIG91dHB1dCB0byB0aGUgZ2l2ZW4gc3RyZWFtDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBKc29uRm9ybWF0V3JpdGVyIENyZWF0ZUluc3RhbmNlKFN0cmVhbSBvdXRwdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBKc29uU3RyZWFtV3JpdGVyKG91dHB1dCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+IFdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCB2b2lkIFdyaXRlVG9PdXRwdXQoc3RyaW5nIGZvcm1hdCwgcGFyYW1zIG9iamVjdFtdIGFyZ3MpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVUb091dHB1dChTdHJpbmcuRm9ybWF0KGZvcm1hdCwgYXJncykpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PiBXcml0ZSB0byB0aGUgb3V0cHV0IHN0cmVhbSA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBXcml0ZVRvT3V0cHV0KHN0cmluZyB0ZXh0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlVG9PdXRwdXQodGV4dC5Ub0NoYXJBcnJheSgpLCAwLCB0ZXh0Lkxlbmd0aCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+IFdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIFdyaXRlVG9PdXRwdXQoY2hhciBjaCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+IFdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIFdyaXRlVG9PdXRwdXQoY2hhcltdIGNoYXJzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4gU2V0cyB0aGUgb3V0cHV0IGZvcm1hdHRpbmcgdG8gdXNlIEVudmlyb25tZW50Lk5ld0xpbmUgd2l0aCA0LWNoYXJhY3RlciBpbmRlbnRpb25zIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBKc29uRm9ybWF0V3JpdGVyIEZvcm1hdHRlZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgTmV3TGluZSA9IEZyYW1ld29ya1BvcnRhYmlsaXR5Lk5ld0xpbmU7DQorICAgICAgICAgICAgSW5kZW50ID0gIiAgICAiOw0KKyAgICAgICAgICAgIFdoaXRlc3BhY2UgPSAiICI7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+IEdldHMgb3Igc2V0cyB0aGUgY2hhcmFjdGVycyB0byB1c2UgZm9yIHRoZSBuZXctbGluZSwgZGVmYXVsdCA9IGVtcHR5IDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmV3TGluZSB7IGdldDsgc2V0OyB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+IEdldHMgb3Igc2V0cyB0aGUgdGV4dCB0byB1c2UgZm9yIGluZGVudGluZywgZGVmYXVsdCA9IGVtcHR5IDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgSW5kZW50IHsgZ2V0OyBzZXQ7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4gR2V0cyBvciBzZXRzIHRoZSB3aGl0ZXNwYWNlIHRvIHVzZSB0byBzZXBhcmF0ZSB0aGUgdGV4dCwgZGVmYXVsdCA9IGVtcHR5IDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgV2hpdGVzcGFjZSB7IGdldDsgc2V0OyB9DQorDQorICAgICAgICBwcml2YXRlIHZvaWQgU2VwZXJhdG9yKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoX2NvdW50ZXIuQ291bnQgPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJNaXNtYXRjaGVkIG9wZW4vY2xvc2UgaW4gSnNvbiB3cml0ZXIuIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGludCBpbmRleCA9IF9jb3VudGVyLkNvdW50IC0gMTsNCisgICAgICAgICAgICBpZiAoX2NvdW50ZXJbaW5kZXhdID4gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlVG9PdXRwdXQoJywnKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgV3JpdGVMaW5lKFN0cmluZy5FbXB0eSk7DQorICAgICAgICAgICAgX2NvdW50ZXJbaW5kZXhdID0gX2NvdW50ZXJbaW5kZXhdICsgMTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUxpbmUoc3RyaW5nIGNvbnRlbnQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCFTdHJpbmcuSXNOdWxsT3JFbXB0eShOZXdMaW5lKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlVG9PdXRwdXQoTmV3TGluZSk7DQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgX2NvdW50ZXIuQ291bnQ7IGkrKykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVUb091dHB1dChJbmRlbnQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFTdHJpbmcuSXNOdWxsT3JFbXB0eShXaGl0ZXNwYWNlKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlVG9PdXRwdXQoV2hpdGVzcGFjZSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIFdyaXRlVG9PdXRwdXQoY29udGVudCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVOYW1lKHN0cmluZyBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBTZXBlcmF0b3IoKTsNCisgICAgICAgICAgICBpZiAoIVN0cmluZy5Jc051bGxPckVtcHR5KGZpZWxkKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlVG9PdXRwdXQoJyInKTsNCisgICAgICAgICAgICAgICAgV3JpdGVUb091dHB1dChmaWVsZCk7DQorICAgICAgICAgICAgICAgIFdyaXRlVG9PdXRwdXQoJyInKTsNCisgICAgICAgICAgICAgICAgV3JpdGVUb091dHB1dCgnOicpOw0KKyAgICAgICAgICAgICAgICBpZiAoIVN0cmluZy5Jc051bGxPckVtcHR5KFdoaXRlc3BhY2UpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBXcml0ZVRvT3V0cHV0KFdoaXRlc3BhY2UpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEVuY29kZVRleHQoc3RyaW5nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGNoYXJbXSB0ZXh0ID0gdmFsdWUuVG9DaGFyQXJyYXkoKTsNCisgICAgICAgICAgICBpbnQgbGVuID0gdGV4dC5MZW5ndGg7DQorICAgICAgICAgICAgaW50IHBvcyA9IDA7DQorDQorICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGxlbikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGludCBuZXh0ID0gcG9zOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCA8IGxlbiAmJiB0ZXh0W25leHRdID49IDMyICYmIHRleHRbbmV4dF0gPCAxMjcgJiYgdGV4dFtuZXh0XSAhPSAnXFwnICYmIHRleHRbbmV4dF0gIT0gJy8nICYmDQorICAgICAgICAgICAgICAgICAgICAgICB0ZXh0W25leHRdICE9ICciJykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgbmV4dCsrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIFdyaXRlVG9PdXRwdXQodGV4dCwgcG9zLCBuZXh0IC0gcG9zKTsNCisgICAgICAgICAgICAgICAgaWYgKG5leHQgPCBsZW4pDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGV4dFtuZXh0XSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICciJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVUb091dHB1dChAIlwiIiIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlVG9PdXRwdXQoQCJcXCIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vZGQgYXQgYmVzdCB0byBlc2NhcGUgJy8nLCBtb3N0IEpzb24gaW1wbGVtZW50YXRpb25zIGRvbid0LCBidXQgaXQgaXMgZGVmaW5lZCBpbiB0aGUgcmZjLTQ2MjcNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVUb091dHB1dChAIlwvIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xiJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVUb091dHB1dChAIlxiIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xmJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVUb091dHB1dChAIlxmIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVUb091dHB1dChAIlxuIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVUb091dHB1dChAIlxyIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVUb091dHB1dChAIlx0Iik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlVG9PdXRwdXQoQCJcdXswOng0fSIsIChpbnQpIHRleHRbbmV4dF0pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIG5leHQrKzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwb3MgPSBuZXh0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBTdHJpbmcgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZUFzVGV4dChzdHJpbmcgZmllbGQsIHN0cmluZyB0ZXh0VmFsdWUsIG9iamVjdCB0eXBlZFZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlTmFtZShmaWVsZCk7DQorICAgICAgICAgICAgaWYgKHR5cGVkVmFsdWUgaXMgYm9vbCB8fCB0eXBlZFZhbHVlIGlzIGludCB8fCB0eXBlZFZhbHVlIGlzIHVpbnQgfHwgdHlwZWRWYWx1ZSBpcyBsb25nIHx8DQorICAgICAgICAgICAgICAgIHR5cGVkVmFsdWUgaXMgdWxvbmcgfHwgdHlwZWRWYWx1ZSBpcyBkb3VibGUgfHwgdHlwZWRWYWx1ZSBpcyBmbG9hdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlVG9PdXRwdXQodGV4dFZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVUb091dHB1dCgnIicpOw0KKyAgICAgICAgICAgICAgICBpZiAodHlwZWRWYWx1ZSBpcyBzdHJpbmcpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEVuY29kZVRleHQodGV4dFZhbHVlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlVG9PdXRwdXQodGV4dFZhbHVlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBXcml0ZVRvT3V0cHV0KCciJyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIERvdWJsZSB2YWx1ZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFdyaXRlKHN0cmluZyBmaWVsZCwgZG91YmxlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChkb3VibGUuSXNOYU4odmFsdWUpIHx8IGRvdWJsZS5Jc05lZ2F0aXZlSW5maW5pdHkodmFsdWUpIHx8IGRvdWJsZS5Jc1Bvc2l0aXZlSW5maW5pdHkodmFsdWUpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgTmFOLCBJbmZpbml0eSwgb3IgLUluZmluaXR5Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJhc2UuV3JpdGUoZmllbGQsIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBTaW5nbGUgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZShzdHJpbmcgZmllbGQsIGZsb2F0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChmbG9hdC5Jc05hTih2YWx1ZSkgfHwgZmxvYXQuSXNOZWdhdGl2ZUluZmluaXR5KHZhbHVlKSB8fCBmbG9hdC5Jc1Bvc2l0aXZlSW5maW5pdHkodmFsdWUpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgTmFOLCBJbmZpbml0eSwgb3IgLUluZmluaXR5Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJhc2UuV3JpdGUoZmllbGQsIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIFRyZWF0IGVudW0gYXMgc3RyaW5nDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZUVudW0oc3RyaW5nIGZpZWxkLCBpbnQgbnVtYmVyLCBzdHJpbmcgbmFtZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZShmaWVsZCwgbmFtZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGFuIGFycmF5IG9mIGZpZWxkIHZhbHVlcw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFdyaXRlQXJyYXkoRmllbGRUeXBlIHR5cGUsIHN0cmluZyBmaWVsZCwgSUVudW1lcmFibGUgaXRlbXMpDQorICAgICAgICB7DQorICAgICAgICAgICAgSUVudW1lcmF0b3IgZW51bWVyYXRvciA9IGl0ZW1zLkdldEVudW1lcmF0b3IoKTsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmICghZW51bWVyYXRvci5Nb3ZlTmV4dCgpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZmluYWxseQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGVudW1lcmF0b3IgaXMgSURpc3Bvc2FibGUpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpIGVudW1lcmF0b3IpLkRpc3Bvc2UoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBXcml0ZU5hbWUoZmllbGQpOw0KKyAgICAgICAgICAgIFdyaXRlVG9PdXRwdXQoIlsiKTsNCisgICAgICAgICAgICBfY291bnRlci5BZGQoMCk7DQorDQorICAgICAgICAgICAgYmFzZS5Xcml0ZUFycmF5KHR5cGUsIFN0cmluZy5FbXB0eSwgaXRlbXMpOw0KKw0KKyAgICAgICAgICAgIF9jb3VudGVyLlJlbW92ZUF0KF9jb3VudGVyLkNvdW50IC0gMSk7DQorICAgICAgICAgICAgV3JpdGVMaW5lKCJdIik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgbWVzc2FnZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZU9yR3JvdXAoc3RyaW5nIGZpZWxkLCBJTWVzc2FnZUxpdGUgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZU5hbWUoZmllbGQpOw0KKyAgICAgICAgICAgIFdyaXRlTWVzc2FnZShtZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgdGhlIG1lc3NhZ2UgdG8gdGhlIHRoZSBmb3JtYXR0ZWQgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZShJTWVzc2FnZUxpdGUgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZU1lc3NhZ2VTdGFydCgpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV3JpdGVUbyh0aGlzKTsNCisgICAgICAgICAgICBXcml0ZU1lc3NhZ2VFbmQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVc2VkIHRvIHdyaXRlIHRoZSByb290LW1lc3NhZ2UgcHJlYW1ibGUsIGluIGpzb24gdGhpcyBpcyB0aGUgbGVmdC1jdXJseSBicmFjZSAneycuDQorICAgICAgICAvLy8gQWZ0ZXIgdGhpcyBjYWxsIHlvdSBjYW4gY2FsbCBJTWVzc2FnZUxpdGUuTWVyZ2VUbyguLi4pIGFuZCBjb21wbGV0ZSB0aGUgbWVzc2FnZSB3aXRoDQorICAgICAgICAvLy8gYSBjYWxsIHRvIFdyaXRlTWVzc2FnZUVuZCgpLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZVN0YXJ0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoX2lzQXJyYXkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBTZXBlcmF0b3IoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgV3JpdGVUb091dHB1dCgieyIpOw0KKyAgICAgICAgICAgIF9jb3VudGVyLkFkZCgwKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVc2VkIHRvIGNvbXBsZXRlIGEgcm9vdC1tZXNzYWdlIHByZXZpb3VzbHkgc3RhcnRlZCB3aXRoIGEgY2FsbCB0byBXcml0ZU1lc3NhZ2VTdGFydCgpDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlRW5kKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfY291bnRlci5SZW1vdmVBdChfY291bnRlci5Db3VudCAtIDEpOw0KKyAgICAgICAgICAgIFdyaXRlTGluZSgifSIpOw0KKyAgICAgICAgICAgIEZsdXNoKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVXNlZCBpbiBzdHJlYW1pbmcgYXJyYXlzIG9mIG9iamVjdHMgdG8gdGhlIHdyaXRlcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8ZXhhbXBsZT4NCisgICAgICAgIC8vLyA8Y29kZT4NCisgICAgICAgIC8vLyB1c2luZyh3cml0ZXIuU3RhcnRBcnJheSgpKQ0KKyAgICAgICAgLy8vICAgICBmb3JlYWNoKElNZXNzYWdlTGl0ZSBtIGluIG1lc3NhZ2VzKQ0KKyAgICAgICAgLy8vICAgICAgICAgd3JpdGVyLldyaXRlTWVzc2FnZShtKTsNCisgICAgICAgIC8vLyA8L2NvZGU+DQorICAgICAgICAvLy8gPC9leGFtcGxlPg0KKyAgICAgICAgcHVibGljIHNlYWxlZCBjbGFzcyBKc29uQXJyYXkgOiBJRGlzcG9zYWJsZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHByaXZhdGUgSnNvbkZvcm1hdFdyaXRlciBfd3JpdGVyOw0KKw0KKyAgICAgICAgICAgIGludGVybmFsIEpzb25BcnJheShKc29uRm9ybWF0V3JpdGVyIHdyaXRlcikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF93cml0ZXIgPSB3cml0ZXI7DQorICAgICAgICAgICAgICAgIF93cml0ZXIuV3JpdGVUb091dHB1dCgiWyIpOw0KKyAgICAgICAgICAgICAgICBfd3JpdGVyLl9jb3VudGVyLkFkZCgwKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIC8vLyBDYXVzZXMgdGhlIGVuZCBvZiB0aGUgYXJyYXkgY2hhcmFjdGVyIHRvIGJlIHdyaXR0ZW4uDQorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgRW5kQXJyYXkoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKF93cml0ZXIgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgX3dyaXRlci5fY291bnRlci5SZW1vdmVBdChfd3JpdGVyLl9jb3VudGVyLkNvdW50IC0gMSk7DQorICAgICAgICAgICAgICAgICAgICBfd3JpdGVyLldyaXRlTGluZSgiXSIpOw0KKyAgICAgICAgICAgICAgICAgICAgX3dyaXRlci5GbHVzaCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIF93cml0ZXIgPSBudWxsOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICB2b2lkIElEaXNwb3NhYmxlLkRpc3Bvc2UoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRW5kQXJyYXkoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVXNlZCB0byB3cml0ZSBhbiBhcnJheSBvZiBtZXNzYWdlcyBhcyB0aGUgb3V0cHV0IHJhdGhlciB0aGFuIGEgc2luZ2xlIG1lc3NhZ2UuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxleGFtcGxlPg0KKyAgICAgICAgLy8vIDxjb2RlPg0KKyAgICAgICAgLy8vIHVzaW5nKHdyaXRlci5TdGFydEFycmF5KCkpDQorICAgICAgICAvLy8gICAgIGZvcmVhY2goSU1lc3NhZ2VMaXRlIG0gaW4gbWVzc2FnZXMpDQorICAgICAgICAvLy8gICAgICAgICB3cml0ZXIuV3JpdGVNZXNzYWdlKG0pOw0KKyAgICAgICAgLy8vIDwvY29kZT4NCisgICAgICAgIC8vLyA8L2V4YW1wbGU+DQorICAgICAgICBwdWJsaWMgSnNvbkFycmF5IFN0YXJ0QXJyYXkoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChfaXNBcnJheSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFNlcGVyYXRvcigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBfaXNBcnJheSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBKc29uQXJyYXkodGhpcyk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Kc29uVGV4dEN1cnNvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vSnNvblRleHRDdXJzb3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljNDVhZgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vSnNvblRleHRDdXJzb3IuY3MKQEAgLTAsMCArMSw0NDIgQEAKK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7DQordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247DQordXNpbmcgU3lzdGVtLklPOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24NCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEpTb24gVG9rZW5pemVyIHVzZWQgYnkgSnNvbkZvcm1hdFJlYWRlcg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBpbnRlcm5hbCBhYnN0cmFjdCBjbGFzcyBKc29uQ3Vyc29yDQorICAgIHsNCisgICAgICAgIHB1YmxpYyBlbnVtIEpzVHlwZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFN0cmluZywNCisgICAgICAgICAgICBOdW1iZXIsDQorICAgICAgICAgICAgT2JqZWN0LA0KKyAgICAgICAgICAgIEFycmF5LA0KKyAgICAgICAgICAgIFRydWUsDQorICAgICAgICAgICAgRmFsc2UsDQorICAgICAgICAgICAgTnVsbA0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI3JlZ2lvbiBCdWZmZXJpbmcgaW1wbGVtZW50YXRpb25zDQorDQorICAgICAgICBwcml2YXRlIGNsYXNzIEpzb25TdHJlYW1DdXJzb3IgOiBKc29uQ3Vyc29yDQorICAgICAgICB7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gX2J1ZmZlcjsNCisgICAgICAgICAgICBwcml2YXRlIGludCBfYnVmZmVyUG9zOw0KKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3RyZWFtIF9pbnB1dDsNCisNCisgICAgICAgICAgICBwdWJsaWMgSnNvblN0cmVhbUN1cnNvcihTdHJlYW0gaW5wdXQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBfaW5wdXQgPSBpbnB1dDsNCisgICAgICAgICAgICAgICAgX25leHQgPSBfaW5wdXQuUmVhZEJ5dGUoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIEpzb25TdHJlYW1DdXJzb3IoYnl0ZVtdIGlucHV0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgX2lucHV0ID0gbnVsbDsNCisgICAgICAgICAgICAgICAgX2J1ZmZlciA9IGlucHV0Ow0KKyAgICAgICAgICAgICAgICBfbmV4dCA9IF9idWZmZXJbX2J1ZmZlclBvc107DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBpbnQgUGVlaygpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoX2lucHV0ICE9IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbmV4dDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfYnVmZmVyUG9zIDwgX2J1ZmZlci5MZW5ndGgpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYnVmZmVyW19idWZmZXJQb3NdOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBpbnQgUmVhZCgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoX2lucHV0ICE9IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBfbmV4dDsNCisgICAgICAgICAgICAgICAgICAgIF9uZXh0ID0gX2lucHV0LlJlYWRCeXRlKCk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9idWZmZXJQb3MgPCBfYnVmZmVyLkxlbmd0aCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9idWZmZXJbX2J1ZmZlclBvcysrXTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgY2xhc3MgSnNvblRleHRDdXJzb3IgOiBKc29uQ3Vyc29yDQorICAgICAgICB7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjaGFyW10gX2J1ZmZlcjsNCisgICAgICAgICAgICBwcml2YXRlIGludCBfYnVmZmVyUG9zOw0KKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVGV4dFJlYWRlciBfaW5wdXQ7DQorDQorICAgICAgICAgICAgcHVibGljIEpzb25UZXh0Q3Vyc29yKGNoYXJbXSBpbnB1dCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF9pbnB1dCA9IG51bGw7DQorICAgICAgICAgICAgICAgIF9idWZmZXIgPSBpbnB1dDsNCisgICAgICAgICAgICAgICAgX2J1ZmZlclBvcyA9IDA7DQorICAgICAgICAgICAgICAgIF9uZXh0ID0gUGVlaygpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgSnNvblRleHRDdXJzb3IoVGV4dFJlYWRlciBpbnB1dCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF9pbnB1dCA9IGlucHV0Ow0KKyAgICAgICAgICAgICAgICBfbmV4dCA9IFBlZWsoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGludCBQZWVrKCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChfaW5wdXQgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9pbnB1dC5QZWVrKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX2J1ZmZlclBvcyA8IF9idWZmZXIuTGVuZ3RoKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2J1ZmZlcltfYnVmZmVyUG9zXTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgaW50IFJlYWQoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKF9pbnB1dCAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2lucHV0LlJlYWQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfYnVmZmVyUG9zIDwgX2J1ZmZlci5MZW5ndGgpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYnVmZmVyW19idWZmZXJQb3MrK107DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICBwcm90ZWN0ZWQgaW50IF9uZXh0Ow0KKyAgICAgICAgcHJpdmF0ZSBpbnQgX2xpbmVObywgX2xpbmVQb3M7DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIEpzb25DdXJzb3IgQ3JlYXRlSW5zdGFuY2UoYnl0ZVtdIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgSnNvblN0cmVhbUN1cnNvcihpbnB1dCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIEpzb25DdXJzb3IgQ3JlYXRlSW5zdGFuY2UoU3RyZWFtIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgSnNvblN0cmVhbUN1cnNvcihpbnB1dCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIEpzb25DdXJzb3IgQ3JlYXRlSW5zdGFuY2Uoc3RyaW5nIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgSnNvblRleHRDdXJzb3IoaW5wdXQuVG9DaGFyQXJyYXkoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIEpzb25DdXJzb3IgQ3JlYXRlSW5zdGFuY2UoVGV4dFJlYWRlciBpbnB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IEpzb25UZXh0Q3Vyc29yKGlucHV0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCBKc29uQ3Vyc29yKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfbGluZU5vID0gMTsNCisgICAgICAgICAgICBfbGluZVBvcyA9IDA7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+UmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgd2l0aG91dCBhY3R1YWxseSAncmVhZGluZycgaXQ8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IFBlZWsoKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT5SZWFkcyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0PC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBSZWFkKCk7DQorDQorICAgICAgICBwdWJsaWMgQ2hhciBOZXh0Q2hhcg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgU2tpcFdoaXRlc3BhY2UoKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIChjaGFyKSBfbmV4dDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAjcmVnaW9uIEFzc2VydCguLi4pDQorDQorICAgICAgICBbRGVidWdnZXJOb25Vc2VyQ29kZV0NCisgICAgICAgIHByaXZhdGUgc3RyaW5nIENoYXJEaXNwbGF5KGludCBjaCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gY2ggPT0gLTENCisgICAgICAgICAgICAgICAgICAgICAgID8gIkVPRiINCisgICAgICAgICAgICAgICAgICAgICAgIDogKGNoID4gMzIgJiYgY2ggPCAxMjcpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFN0cmluZy5Gb3JtYXQoIid7MH0nIiwgKGNoYXIpIGNoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcuRm9ybWF0KCInXFx1ezA6eDR9JyIsIGNoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtEZWJ1Z2dlck5vblVzZXJDb2RlXQ0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFzc2VydChib29sIGNvbmQsIGNoYXIgZXhwZWN0ZWQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCFjb25kKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5Gb3JtYXQoRnJhbWV3b3JrUG9ydGFiaWxpdHkuSW52YXJpYW50Q3VsdHVyZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIih7MH06ezF9KSBlcnJvcjogVW5leHBlY3RlZCB0b2tlbiB7Mn0sIGV4cGVjdGVkOiB7M30uIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xpbmVObywgX2xpbmVQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJEaXNwbGF5KF9uZXh0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhckRpc3BsYXkoZXhwZWN0ZWQpDQorICAgICAgICAgICAgICAgICAgICAgICAgKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW0RlYnVnZ2VyTm9uVXNlckNvZGVdDQorICAgICAgICBwdWJsaWMgdm9pZCBBc3NlcnQoYm9vbCBjb25kLCBzdHJpbmcgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoIWNvbmQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLkZvcm1hdChGcmFtZXdvcmtQb3J0YWJpbGl0eS5JbnZhcmlhbnRDdWx0dXJlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHswfSx7MX0pIGVycm9yOiB7Mn0iLCBfbGluZU5vLCBfbGluZVBvcywgbWVzc2FnZSkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtEZWJ1Z2dlck5vblVzZXJDb2RlXQ0KKyAgICAgICAgcHVibGljIHZvaWQgQXNzZXJ0KGJvb2wgY29uZCwgc3RyaW5nIGZvcm1hdCwgcGFyYW1zIG9iamVjdFtdIGFyZ3MpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCFjb25kKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCAmJiBhcmdzLkxlbmd0aCA+IDApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IFN0cmluZy5Gb3JtYXQoZm9ybWF0LCBhcmdzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLkZvcm1hdChGcmFtZXdvcmtQb3J0YWJpbGl0eS5JbnZhcmlhbnRDdWx0dXJlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHswfSx7MX0pIGVycm9yOiB7Mn0iLCBfbGluZU5vLCBfbGluZVBvcywgZm9ybWF0KSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgcHJpdmF0ZSBjaGFyIFJlYWRDaGFyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgY2ggPSBSZWFkKCk7DQorICAgICAgICAgICAgQXNzZXJ0KGNoICE9IC0xLCAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4iKTsNCisgICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF9saW5lTm8rKzsNCisgICAgICAgICAgICAgICAgX2xpbmVQb3MgPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIGlmIChjaCAhPSAnXHInKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgX2xpbmVQb3MrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgX25leHQgPSBQZWVrKCk7DQorICAgICAgICAgICAgcmV0dXJuIChjaGFyKSBjaDsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIENvbnN1bWUoY2hhciBjaCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnQoVHJ5Q29uc3VtZShjaCksIGNoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBib29sIFRyeUNvbnN1bWUoY2hhciBjaCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBTa2lwV2hpdGVzcGFjZSgpOw0KKyAgICAgICAgICAgIGlmIChfbmV4dCA9PSBjaCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFJlYWRDaGFyKCk7DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBDb25zdW1lKHN0cmluZyBzZXF1ZW5jZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBTa2lwV2hpdGVzcGFjZSgpOw0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKGNoYXIgY2ggaW4gc2VxdWVuY2UpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBBc3NlcnQoY2ggPT0gUmVhZENoYXIoKSwgIkV4cGVjdGVkIHRva2VuICd7MH0nLiIsIHNlcXVlbmNlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBTa2lwV2hpdGVzcGFjZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50IGNobmV4dCA9IF9uZXh0Ow0KKyAgICAgICAgICAgIHdoaWxlIChjaG5leHQgIT0gLTEpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoIUNoYXIuSXNXaGl0ZVNwYWNlKChjaGFyKSBjaG5leHQpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBSZWFkQ2hhcigpOw0KKyAgICAgICAgICAgICAgICBjaG5leHQgPSBfbmV4dDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RyaW5nIFJlYWRTdHJpbmcoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFNraXBXaGl0ZXNwYWNlKCk7DQorICAgICAgICAgICAgQ29uc3VtZSgnIicpOw0KKyAgICAgICAgICAgIExpc3Q8Q2hhcj4gc2IgPSBuZXcgTGlzdDxjaGFyPigxMDApOw0KKyAgICAgICAgICAgIHdoaWxlIChfbmV4dCAhPSAnIicpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoX25leHQgPT0gJ1xcJykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgQ29uc3VtZSgnXFwnKTsgLy9za2lwIHRoZSBlc2NhcGUNCisgICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBSZWFkQ2hhcigpOw0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQWRkKCdcYicpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQWRkKCdcZicpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQWRkKCdcbicpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQWRkKCdccicpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQWRkKCdcdCcpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGhleCA9IG5ldyBzdHJpbmcobmV3IGNoYXJbXSB7UmVhZENoYXIoKSwgUmVhZENoYXIoKSwgUmVhZENoYXIoKSwgUmVhZENoYXIoKX0pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZXdvcmtQb3J0YWJpbGl0eS5UcnlQYXJzZUludDMyKGhleCwgTnVtYmVyU3R5bGVzLkFsbG93SGV4U3BlY2lmaWVyLCBGcmFtZXdvcmtQb3J0YWJpbGl0eS5JbnZhcmlhbnRDdWx0dXJlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgcmVzdWx0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYSA0LWNoYXJhY3RlciBoZXggc3BlY2lmaWVyLiIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQWRkKChjaGFyKSByZXN1bHQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BZGQoY2gpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEFzc2VydChfbmV4dCAhPSAnXG4nICYmIF9uZXh0ICE9ICdccicgJiYgX25leHQgIT0gJ1xmJyAmJiBfbmV4dCAhPSAtMSwgJyInKTsNCisgICAgICAgICAgICAgICAgICAgIHNiLkFkZChSZWFkQ2hhcigpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDb25zdW1lKCciJyk7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoc2IuVG9BcnJheSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdHJpbmcgUmVhZE51bWJlcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgU2tpcFdoaXRlc3BhY2UoKTsNCisgICAgICAgICAgICBMaXN0PENoYXI+IHNiID0gbmV3IExpc3Q8Y2hhcj4oMjQpOw0KKyAgICAgICAgICAgIGlmIChfbmV4dCA9PSAnLScpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBzYi5BZGQoUmVhZENoYXIoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEFzc2VydChfbmV4dCA+PSAnMCcgJiYgX25leHQgPD0gJzknLCAiRXhwZWN0ZWQgYSBudW1lcmljIHR5cGUuIik7DQorICAgICAgICAgICAgd2hpbGUgKChfbmV4dCA+PSAnMCcgJiYgX25leHQgPD0gJzknKSB8fCBfbmV4dCA9PSAnLicpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBzYi5BZGQoUmVhZENoYXIoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChfbmV4dCA9PSAnZScgfHwgX25leHQgPT0gJ0UnKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc2IuQWRkKFJlYWRDaGFyKCkpOw0KKyAgICAgICAgICAgICAgICBpZiAoX25leHQgPT0gJy0nIHx8IF9uZXh0ID09ICcrJykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgc2IuQWRkKFJlYWRDaGFyKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEFzc2VydChfbmV4dCA+PSAnMCcgJiYgX25leHQgPD0gJzknLCAiRXhwZWN0ZWQgYSBudW1lcmljIHR5cGUuIik7DQorICAgICAgICAgICAgICAgIHdoaWxlIChfbmV4dCA+PSAnMCcgJiYgX25leHQgPD0gJzknKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBzYi5BZGQoUmVhZENoYXIoKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoc2IuVG9BcnJheSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBKc1R5cGUgUmVhZFZhcmlhbnQob3V0IG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBTa2lwV2hpdGVzcGFjZSgpOw0KKyAgICAgICAgICAgIHN3aXRjaCAoX25leHQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjYXNlICduJzoNCisgICAgICAgICAgICAgICAgICAgIENvbnN1bWUoIm51bGwiKTsNCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBKc1R5cGUuTnVsbDsNCisgICAgICAgICAgICAgICAgY2FzZSAndCc6DQorICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCJ0cnVlIik7DQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRydWU7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSnNUeXBlLlRydWU7DQorICAgICAgICAgICAgICAgIGNhc2UgJ2YnOg0KKyAgICAgICAgICAgICAgICAgICAgQ29uc3VtZSgiZmFsc2UiKTsNCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSnNUeXBlLkZhbHNlOw0KKyAgICAgICAgICAgICAgICBjYXNlICciJzoNCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gUmVhZFN0cmluZygpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpzVHlwZS5TdHJpbmc7DQorICAgICAgICAgICAgICAgIGNhc2UgJ3snOg0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnN1bWUoJ3snKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTmV4dENoYXIgIT0gJ30nKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZFN0cmluZygpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCc6Jyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCB0bXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRWYXJpYW50KG91dCB0bXApOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVRyeUNvbnN1bWUoJywnKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3VtZSgnfScpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSnNUeXBlLk9iamVjdDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAnWyc6DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3VtZSgnWycpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8b2JqZWN0PiB2YWx1ZXMgPSBuZXcgTGlzdDxvYmplY3Q+KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKE5leHRDaGFyICE9ICddJykNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCB0bXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRWYXJpYW50KG91dCB0bXApOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuQWRkKHRtcCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVHJ5Q29uc3VtZSgnLCcpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCddJyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXMuVG9BcnJheSgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKc1R5cGUuQXJyYXk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICBpZiAoKF9uZXh0ID49ICcwJyAmJiBfbmV4dCA8PSAnOScpIHx8IF9uZXh0ID09ICctJykNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFJlYWROdW1iZXIoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSnNUeXBlLk51bWJlcjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIEFzc2VydChmYWxzZSwgIkV4cGVjdGVkIGEgdmFsdWUuIik7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDIwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNjcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsNCisNCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIA0KKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uDQorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5Lg0KKw0KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiUHJvdG9jb2xCdWZmZXJzIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJQcm90b2NvbEJ1ZmZlcnMiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMDgiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildDQorDQorLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoNCisvLw0KKy8vICAgICAgTWFqb3IgVmVyc2lvbg0KKy8vICAgICAgTWlub3IgVmVyc2lvbiANCisvLyAgICAgIEJ1aWxkIE51bWJlcg0KKy8vICAgICAgUmV2aXNpb24NCisvLw0KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzIA0KKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6DQorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjIuNC4xLjU1NSIpXQ0KKw0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIyLjQuMS41NTUiKV0NCisNCisjaWYgIU5PRklMRVZFUlNJT04NCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjIuNC4xLjU1NSIpXQ0KKyNlbmRpZg0KKw0KK1thc3NlbWJseTogQ0xTQ29tcGxpYW50KHRydWUpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uQ0YyMC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLkNGMjAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MzllYzYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLkNGMjAuY3Nwcm9qCkBAIC0wLDAgKzEsMTA0IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q09NUEFDVF9GUkFNRVdPUks8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5DRjIwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+ezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb248L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djIuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+ezRENjI4QjVCLTJGQkMtNEFBNi04QzE2LTE5NzI0MkFFQjg4NH07e0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxQbGF0Zm9ybUZhbWlseU5hbWU+U21hcnRwaG9uZTwvUGxhdGZvcm1GYW1pbHlOYW1lPg0KKyAgICA8UGxhdGZvcm1JRD5mMjdkYTMyOS0zMjY5LTQxOTEtOThlMC1jODdkM2Q3ZjFkYjk8L1BsYXRmb3JtSUQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cQ0YyMFxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXENGMjBcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT0ZJTEVWRVJTSU9OO05PRVhURU5TSU9OUzwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cQ0YyMFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcQ0YyMFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9GSUxFVkVSU0lPTjtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgQ29uZGl0aW9uPSInJChUYXJnZXRGcmFtZXdvcmtWZXJzaW9uKScgIT0gJ3YyLjAnIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiPg0KKyAgICAgIDxMaW5rPkZyYW1ld29ya1BvcnRhYmlsaXR5LmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcRm9ybVVybEVuY29kZWRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdEZhY3RvcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdE9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RUZXh0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFRleHRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uVGV4dEN1cnNvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVjdXJzaW9uTGltaXRFeGNlZWRlZC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxGb3JtYXRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFJlYWRlck9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFdyaXRlck9wdGlvbnMuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuQ0YyMC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgICA8UHJpdmF0ZT5GYWxzZTwvUHJpdmF0ZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5Db21wYWN0RnJhbWV3b3JrLkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8VmlzdWFsU3R1ZGlvPg0KKyAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9IntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9Ij4NCisgICAgICAgIDxIb3N0aW5nUHJvY2VzcyBkaXNhYmxlPSIxIiAvPg0KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4NCisgICAgPC9WaXN1YWxTdHVkaW8+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5DRjM1LmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uQ0YzNS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJmMzgxZgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uQ0YzNS5jc3Byb2oKQEAgLTAsMCArMSwxMDQgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DT01QQUNUX0ZSQU1FV09SSzwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPkNGMzU8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57NEQ2MjhCNUItMkZCQy00QUE2LThDMTYtMTk3MjQyQUVCODg0fTt7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFBsYXRmb3JtRmFtaWx5TmFtZT5TbWFydHBob25lPC9QbGF0Zm9ybUZhbWlseU5hbWU+DQorICAgIDxQbGF0Zm9ybUlEPmYyN2RhMzI5LTMyNjktNDE5MS05OGUwLWM4N2QzZDdmMWRiOTwvUGxhdGZvcm1JRD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxDRjM1XERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcQ0YzNVxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PRklMRVZFUlNJT048L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXENGMzVcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXENGMzVcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PRklMRVZFUlNJT048L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXEZyYW1ld29ya1BvcnRhYmlsaXR5LmNzIj4NCisgICAgICA8TGluaz5GcmFtZXdvcmtQb3J0YWJpbGl0eS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXEZvcm1VcmxFbmNvZGVkUmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXE1lc3NhZ2VGb3JtYXRGYWN0b3J5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXE1lc3NhZ2VGb3JtYXRPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0VGV4dFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RUZXh0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGljdGlvbmFyeVJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGljdGlvbmFyeVdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvbkZvcm1hdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvbkZvcm1hdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvblRleHRDdXJzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbEZvcm1hdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sRm9ybWF0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxSZWFkZXJPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxXcml0ZXJPcHRpb25zLmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzLkNGMzUuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnM8L05hbWU+DQorICAgICAgPFByaXZhdGU+RmFsc2U8L1ByaXZhdGU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ29tcGFjdEZyYW1ld29yay5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSI+DQorICAgICAgICA8SG9zdGluZ1Byb2Nlc3MgZGlzYWJsZT0iMSIgLz4NCisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+DQorICAgIDwvVmlzdWFsU3R1ZGlvPg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uTkVUMjAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5ORVQyMC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlYWI3OQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uTkVUMjAuY3Nwcm9qCkBAIC0wLDAgKzEsOTIgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DTElFTlRQUk9GSUxFPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+TkVUMjA8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52Mi4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDIwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMjBcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQyMFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMjBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PRVhURU5TSU9OUzwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgQ29uZGl0aW9uPSInJChUYXJnZXRGcmFtZXdvcmtWZXJzaW9uKScgIT0gJ3YyLjAnIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiPg0KKyAgICAgIDxMaW5rPkZyYW1ld29ya1BvcnRhYmlsaXR5LmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcRm9ybVVybEVuY29kZWRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdEZhY3RvcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdE9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RUZXh0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFRleHRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uVGV4dEN1cnNvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVjdXJzaW9uTGltaXRFeGNlZWRlZC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxGb3JtYXRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFJlYWRlck9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFdyaXRlck9wdGlvbnMuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuTkVUMjAuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnM8L05hbWU+DQorICAgICAgPFByaXZhdGU+RmFsc2U8L1ByaXZhdGU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uTkVUMzUuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5ORVQzNS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlZDYwZAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uTkVUMzUuY3Nwcm9qCkBAIC0wLDAgKzEsOTIgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DTElFTlRQUk9GSUxFPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+TkVUMzU8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xGcmFtZXdvcmtQb3J0YWJpbGl0eS5jcyI+DQorICAgICAgPExpbms+RnJhbWV3b3JrUG9ydGFiaWxpdHkuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxGb3JtVXJsRW5jb2RlZFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxNZXNzYWdlRm9ybWF0RmFjdG9yeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxNZXNzYWdlRm9ybWF0T3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFRleHRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0VGV4dFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRpY3Rpb25hcnlSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRpY3Rpb25hcnlXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Gb3JtYXRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Gb3JtYXRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25UZXh0Q3Vyc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWN1cnNpb25MaW1pdEV4Y2VlZGVkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxGb3JtYXRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbEZvcm1hdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sUmVhZGVyT3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sV3JpdGVyT3B0aW9ucy5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5ORVQzNS5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgICA8UHJpdmF0ZT5GYWxzZTwvUHJpdmF0ZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5ORVQ0MC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLk5FVDQwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGI3NmEwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5ORVQ0MC5jc3Byb2oKQEAgLTAsMCArMSw5MiBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQ0MDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPnsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb248L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUNDBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQ0MFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUNDBcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDQwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXEZyYW1ld29ya1BvcnRhYmlsaXR5LmNzIj4NCisgICAgICA8TGluaz5GcmFtZXdvcmtQb3J0YWJpbGl0eS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXEZvcm1VcmxFbmNvZGVkUmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXE1lc3NhZ2VGb3JtYXRGYWN0b3J5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXE1lc3NhZ2VGb3JtYXRPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0VGV4dFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RUZXh0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGljdGlvbmFyeVJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGljdGlvbmFyeVdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvbkZvcm1hdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvbkZvcm1hdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvblRleHRDdXJzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbEZvcm1hdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sRm9ybWF0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxSZWFkZXJPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxXcml0ZXJPcHRpb25zLmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzLk5FVDQwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzPC9OYW1lPg0KKyAgICAgIDxQcml2YXRlPkZhbHNlPC9Qcml2YXRlPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLlBMNDAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5QTDQwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGY4Nzc0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5QTDQwLmNzcHJvagpAQCAtMCwwICsxLDk1IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiB4bWxuczpjcz0idXJuOnNjaGVtYXMtY3NoYXJwLXByb2plY3Q6dGVtcGxhdGUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5QT1JUQUJMRV9MSUJSQVJZPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+UEw0MDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPnsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb248L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbj4xMC4wPC9NaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbj4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+ezc4NkM4MzBGLTA3QTEtNDA4Qi1CRDdGLTZFRTA0ODA5RDZEQn07e0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlPlByb2ZpbGUxPC9UYXJnZXRGcmFtZXdvcmtQcm9maWxlPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFBMNDBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxQTDQwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cUEw0MFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcUEw0MFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiPg0KKyAgICAgIDxMaW5rPkZyYW1ld29ya1BvcnRhYmlsaXR5LmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcRm9ybVVybEVuY29kZWRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdEZhY3RvcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdE9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RUZXh0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFRleHRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uVGV4dEN1cnNvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVjdXJzaW9uTGltaXRFeGNlZWRlZC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxGb3JtYXRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFJlYWRlck9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFdyaXRlck9wdGlvbnMuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuUEw0MC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgICA8UHJpdmF0ZT5GYWxzZTwvUHJpdmF0ZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoMzIpXE1pY3Jvc29mdFxQb3J0YWJsZVwkKFRhcmdldEZyYW1ld29ya1ZlcnNpb24pXE1pY3Jvc29mdC5Qb3J0YWJsZS5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uU0wyMC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLlNMMjAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YzRjMDkKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLlNMMjAuY3Nwcm9qCkBAIC0wLDAgKzEsMTA3IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiB4bWxuczpjcz0idXJuOnNjaGVtYXMtY3NoYXJwLXByb2plY3Q6dGVtcGxhdGUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5TSUxWRVJMSUdIVDwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPlNMMjA8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52Mi4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfTt7ZmFlMDRlYzAtMzAxZi0xMWQzLWJmNGItMDBjMDRmNzllZmJjfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFNpbHZlcmxpZ2h0QXBwbGljYXRpb24+ZmFsc2U8L1NpbHZlcmxpZ2h0QXBwbGljYXRpb24+DQorICAgIDxWYWxpZGF0ZVhhbWw+ZmFsc2U8L1ZhbGlkYXRlWGFtbD4NCisgICAgPFRocm93RXJyb3JzSW5WYWxpZGF0aW9uPmZhbHNlPC9UaHJvd0Vycm9yc0luVmFsaWRhdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDIwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0wyMFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFNMMjBcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXFNMMjBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgQ29uZGl0aW9uPSInJChUYXJnZXRGcmFtZXdvcmtWZXJzaW9uKScgIT0gJ3YyLjAnIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiPg0KKyAgICAgIDxMaW5rPkZyYW1ld29ya1BvcnRhYmlsaXR5LmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcRm9ybVVybEVuY29kZWRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdEZhY3RvcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdE9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RUZXh0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFRleHRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uVGV4dEN1cnNvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVjdXJzaW9uTGltaXRFeGNlZWRlZC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxGb3JtYXRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFJlYWRlck9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFdyaXRlck9wdGlvbnMuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuU0wyMC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgICA8UHJpdmF0ZT5GYWxzZTwvUHJpdmF0ZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoMzIpXE1pY3Jvc29mdFxTaWx2ZXJsaWdodFx2Mi4wXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfSI+DQorICAgICAgICA8U2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICAgICAgPFN0YXJ0QWN0aW9uPk9mZmxpbmVBcHBsaWNhdGlvbjwvU3RhcnRBY3Rpb24+DQorICAgICAgICA8L1NpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLlNMMzAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5TTDMwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzZjNDkzCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5TTDMwLmNzcHJvagpAQCAtMCwwICsxLDEwNyBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyIgeG1sbnM6Y3M9InVybjpzY2hlbWFzLWNzaGFycC1wcm9qZWN0OnRlbXBsYXRlIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+U0lMVkVSTElHSFQ8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5TTDMwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+ezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb248L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+e0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn07e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxTaWx2ZXJsaWdodEFwcGxpY2F0aW9uPmZhbHNlPC9TaWx2ZXJsaWdodEFwcGxpY2F0aW9uPg0KKyAgICA8VmFsaWRhdGVYYW1sPmZhbHNlPC9WYWxpZGF0ZVhhbWw+DQorICAgIDxUaHJvd0Vycm9yc0luVmFsaWRhdGlvbj5mYWxzZTwvVGhyb3dFcnJvcnNJblZhbGlkYXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cU0wzMFxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXFNMMzBcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFNMMzBcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXFNMMzBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiPg0KKyAgICAgIDxMaW5rPkZyYW1ld29ya1BvcnRhYmlsaXR5LmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcRm9ybVVybEVuY29kZWRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdEZhY3RvcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdE9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RUZXh0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFRleHRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uVGV4dEN1cnNvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVjdXJzaW9uTGltaXRFeGNlZWRlZC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxGb3JtYXRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFJlYWRlck9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFdyaXRlck9wdGlvbnMuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuU0wzMC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgICA8UHJpdmF0ZT5GYWxzZTwvUHJpdmF0ZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoMzIpXE1pY3Jvc29mdFxTaWx2ZXJsaWdodFx2My4wXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfSI+DQorICAgICAgICA8U2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICAgICAgPFN0YXJ0QWN0aW9uPk9mZmxpbmVBcHBsaWNhdGlvbjwvU3RhcnRBY3Rpb24+DQorICAgICAgICA8L1NpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLlNMNDAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5TTDQwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzY3NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5TTDQwLmNzcHJvagpAQCAtMCwwICsxLDEwOCBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyIgeG1sbnM6Y3M9InVybjpzY2hlbWFzLWNzaGFycC1wcm9qZWN0OnRlbXBsYXRlIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+U0lMVkVSTElHSFQ8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5TTDQwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+ezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb248L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+e0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn07e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxTaWx2ZXJsaWdodEFwcGxpY2F0aW9uPmZhbHNlPC9TaWx2ZXJsaWdodEFwcGxpY2F0aW9uPg0KKyAgICA8VmFsaWRhdGVYYW1sPmZhbHNlPC9WYWxpZGF0ZVhhbWw+DQorICAgIDxUaHJvd0Vycm9yc0luVmFsaWRhdGlvbj5mYWxzZTwvVGhyb3dFcnJvcnNJblZhbGlkYXRpb24+DQorICAgIDxTaWx2ZXJsaWdodFZlcnNpb24+djQuMDwvU2lsdmVybGlnaHRWZXJzaW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFNMNDBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDQwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDQwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDQwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXEZyYW1ld29ya1BvcnRhYmlsaXR5LmNzIj4NCisgICAgICA8TGluaz5GcmFtZXdvcmtQb3J0YWJpbGl0eS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXEZvcm1VcmxFbmNvZGVkUmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXE1lc3NhZ2VGb3JtYXRGYWN0b3J5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXE1lc3NhZ2VGb3JtYXRPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0VGV4dFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RUZXh0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGljdGlvbmFyeVJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGljdGlvbmFyeVdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvbkZvcm1hdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvbkZvcm1hdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvblRleHRDdXJzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbEZvcm1hdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sRm9ybWF0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxSZWFkZXJPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxXcml0ZXJPcHRpb25zLmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzLlNMNDAuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnM8L05hbWU+DQorICAgICAgPFByaXZhdGU+RmFsc2U8L1ByaXZhdGU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcU2lsdmVybGlnaHRcJChTaWx2ZXJsaWdodFZlcnNpb24pXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfSI+DQorICAgICAgICA8U2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICAgICAgPFN0YXJ0QWN0aW9uPk9mZmxpbmVBcHBsaWNhdGlvbjwvU3RhcnRBY3Rpb24+DQorICAgICAgICA8L1NpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjcyOGIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLmNzcHJvagpAQCAtMCwwICsxLDkzIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DTElFTlRQUk9GSUxFPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+TkVUMzU8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIENvbmRpdGlvbj0iJyQoVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbiknICE9ICd2Mi4wJyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXEZyYW1ld29ya1BvcnRhYmlsaXR5LmNzIj4NCisgICAgICA8TGluaz5GcmFtZXdvcmtQb3J0YWJpbGl0eS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXEZvcm1VcmxFbmNvZGVkUmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXE1lc3NhZ2VGb3JtYXRGYWN0b3J5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXE1lc3NhZ2VGb3JtYXRPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0VGV4dFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RUZXh0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGljdGlvbmFyeVJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGljdGlvbmFyeVdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvbkZvcm1hdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvbkZvcm1hdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvblRleHRDdXJzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbEZvcm1hdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sRm9ybWF0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxSZWFkZXJPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxXcml0ZXJPcHRpb25zLmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzPC9OYW1lPg0KKyAgICAgIDxQcml2YXRlPkZhbHNlPC9Qcml2YXRlPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5DRjIwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLkNGMjAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODJkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5DRjIwLmNzcHJvagpAQCAtMCwwICsxLDEwNCBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNPTVBBQ1RfRlJBTUVXT1JLPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+Q0YyMDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb248L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbjwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52Mi4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57NEQ2MjhCNUItMkZCQy00QUE2LThDMTYtMTk3MjQyQUVCODg0fTt7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFBsYXRmb3JtRmFtaWx5TmFtZT5TbWFydHBob25lPC9QbGF0Zm9ybUZhbWlseU5hbWU+DQorICAgIDxQbGF0Zm9ybUlEPmYyN2RhMzI5LTMyNjktNDE5MS05OGUwLWM4N2QzZDdmMWRiOTwvUGxhdGZvcm1JRD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxDRjIwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcQ0YyMFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9GSUxFVkVSU0lPTjtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXENGMjBcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXENGMjBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9GSUxFVkVSU0lPTjtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgQ29uZGl0aW9uPSInJChUYXJnZXRGcmFtZXdvcmtWZXJzaW9uKScgIT0gJ3YyLjAnIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiPg0KKyAgICAgIDxMaW5rPkZyYW1ld29ya1BvcnRhYmlsaXR5LmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcRm9ybVVybEVuY29kZWRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdEZhY3RvcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdE9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RUZXh0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFRleHRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uVGV4dEN1cnNvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVjdXJzaW9uTGltaXRFeGNlZWRlZC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxGb3JtYXRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFJlYWRlck9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFdyaXRlck9wdGlvbnMuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnNMaXRlLkNGMjAuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9OYW1lPg0KKyAgICAgIDxQcml2YXRlPkZhbHNlPC9Qcml2YXRlPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNvbXBhY3RGcmFtZXdvcmsuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iPg0KKyAgICAgICAgPEhvc3RpbmdQcm9jZXNzIGRpc2FibGU9IjEiIC8+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5DRjM1LmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLkNGMzUuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ODkzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5DRjM1LmNzcHJvagpAQCAtMCwwICsxLDEwNCBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNPTVBBQ1RfRlJBTUVXT1JLPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+Q0YzNTwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb248L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbjwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57NEQ2MjhCNUItMkZCQy00QUE2LThDMTYtMTk3MjQyQUVCODg0fTt7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFBsYXRmb3JtRmFtaWx5TmFtZT5TbWFydHBob25lPC9QbGF0Zm9ybUZhbWlseU5hbWU+DQorICAgIDxQbGF0Zm9ybUlEPmYyN2RhMzI5LTMyNjktNDE5MS05OGUwLWM4N2QzZDdmMWRiOTwvUGxhdGZvcm1JRD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxDRjM1XERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcQ0YzNVxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9GSUxFVkVSU0lPTjwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cQ0YzNVxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcQ0YzNVxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0xJVEU7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT0ZJTEVWRVJTSU9OPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xGcmFtZXdvcmtQb3J0YWJpbGl0eS5jcyI+DQorICAgICAgPExpbms+RnJhbWV3b3JrUG9ydGFiaWxpdHkuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxGb3JtVXJsRW5jb2RlZFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxNZXNzYWdlRm9ybWF0RmFjdG9yeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxNZXNzYWdlRm9ybWF0T3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFRleHRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0VGV4dFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRpY3Rpb25hcnlSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRpY3Rpb25hcnlXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Gb3JtYXRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Gb3JtYXRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25UZXh0Q3Vyc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWN1cnNpb25MaW1pdEV4Y2VlZGVkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxGb3JtYXRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbEZvcm1hdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sUmVhZGVyT3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sV3JpdGVyT3B0aW9ucy5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVyc0xpdGUuQ0YzNS5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyc0xpdGU8L05hbWU+DQorICAgICAgPFByaXZhdGU+RmFsc2U8L1ByaXZhdGU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ29tcGFjdEZyYW1ld29yay5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSI+DQorICAgICAgICA8SG9zdGluZ1Byb2Nlc3MgZGlzYWJsZT0iMSIgLz4NCisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+DQorICAgIDwvVmlzdWFsU3R1ZGlvPg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLk5FVDIwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLk5FVDIwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTE0NWFiCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24uTkVUMjAuY3Nwcm9qCkBAIC0wLDAgKzEsOTIgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DTElFTlRQUk9GSUxFPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+TkVUMjA8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb248L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djIuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQyMFxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDIwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFO0xJVEU7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQyMFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMjBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiBDb25kaXRpb249IickKFRhcmdldEZyYW1ld29ya1ZlcnNpb24pJyAhPSAndjIuMCciIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xGcmFtZXdvcmtQb3J0YWJpbGl0eS5jcyI+DQorICAgICAgPExpbms+RnJhbWV3b3JrUG9ydGFiaWxpdHkuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxGb3JtVXJsRW5jb2RlZFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxNZXNzYWdlRm9ybWF0RmFjdG9yeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxNZXNzYWdlRm9ybWF0T3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFRleHRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0VGV4dFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRpY3Rpb25hcnlSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRpY3Rpb25hcnlXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Gb3JtYXRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Gb3JtYXRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25UZXh0Q3Vyc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWN1cnNpb25MaW1pdEV4Y2VlZGVkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxGb3JtYXRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbEZvcm1hdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sUmVhZGVyT3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sV3JpdGVyT3B0aW9ucy5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVyc0xpdGUuTkVUMjAuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9OYW1lPg0KKyAgICAgIDxQcml2YXRlPkZhbHNlPC9Qcml2YXRlPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5ORVQzNS5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5ORVQzNS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkNzQ0YwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLk5FVDM1LmNzcHJvagpAQCAtMCwwICsxLDkyIEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q0xJRU5UUFJPRklMRTwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPk5FVDM1PC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMzVcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xGcmFtZXdvcmtQb3J0YWJpbGl0eS5jcyI+DQorICAgICAgPExpbms+RnJhbWV3b3JrUG9ydGFiaWxpdHkuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxGb3JtVXJsRW5jb2RlZFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxNZXNzYWdlRm9ybWF0RmFjdG9yeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxNZXNzYWdlRm9ybWF0T3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFRleHRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0VGV4dFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRpY3Rpb25hcnlSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRpY3Rpb25hcnlXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Gb3JtYXRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Gb3JtYXRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25UZXh0Q3Vyc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWN1cnNpb25MaW1pdEV4Y2VlZGVkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxGb3JtYXRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbEZvcm1hdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sUmVhZGVyT3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sV3JpdGVyT3B0aW9ucy5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVyc0xpdGUuTkVUMzUuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9OYW1lPg0KKyAgICAgIDxQcml2YXRlPkZhbHNlPC9Qcml2YXRlPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5ORVQ0MC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5ORVQ0MC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI1NGZkZgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLk5FVDQwLmNzcHJvagpAQCAtMCwwICsxLDkyIEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q0xJRU5UUFJPRklMRTwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPk5FVDQwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUNDBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQ0MFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQ0MFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUNDBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xGcmFtZXdvcmtQb3J0YWJpbGl0eS5jcyI+DQorICAgICAgPExpbms+RnJhbWV3b3JrUG9ydGFiaWxpdHkuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxGb3JtVXJsRW5jb2RlZFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxNZXNzYWdlRm9ybWF0RmFjdG9yeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxNZXNzYWdlRm9ybWF0T3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFRleHRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0VGV4dFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRpY3Rpb25hcnlSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRpY3Rpb25hcnlXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Gb3JtYXRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Gb3JtYXRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25UZXh0Q3Vyc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWN1cnNpb25MaW1pdEV4Y2VlZGVkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxGb3JtYXRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbEZvcm1hdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sUmVhZGVyT3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sV3JpdGVyT3B0aW9ucy5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVyc0xpdGUuTkVUNDAuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9OYW1lPg0KKyAgICAgIDxQcml2YXRlPkZhbHNlPC9Qcml2YXRlPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5QTDQwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLlBMNDAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZmJiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5QTDQwLmNzcHJvagpAQCAtMCwwICsxLDk1IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiB4bWxuczpjcz0idXJuOnNjaGVtYXMtY3NoYXJwLXByb2plY3Q6dGVtcGxhdGUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5QT1JUQUJMRV9MSUJSQVJZPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+UEw0MDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb248L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbjwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgICA8TWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24+MTAuMDwvTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPns3ODZDODMwRi0wN0ExLTQwOEItQkQ3Ri02RUUwNDgwOUQ2REJ9O3tGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT5Qcm9maWxlMTwvVGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxQTDQwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcUEw0MFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cUEw0MFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcUEw0MFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0xJVEU7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xGcmFtZXdvcmtQb3J0YWJpbGl0eS5jcyI+DQorICAgICAgPExpbms+RnJhbWV3b3JrUG9ydGFiaWxpdHkuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxGb3JtVXJsRW5jb2RlZFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxNZXNzYWdlRm9ybWF0RmFjdG9yeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSHR0cFxNZXNzYWdlRm9ybWF0T3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFRleHRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0VGV4dFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRpY3Rpb25hcnlSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRpY3Rpb25hcnlXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Gb3JtYXRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Gb3JtYXRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25UZXh0Q3Vyc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWN1cnNpb25MaW1pdEV4Y2VlZGVkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxGb3JtYXRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbEZvcm1hdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sUmVhZGVyT3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sV3JpdGVyT3B0aW9ucy5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVyc0xpdGUuUEw0MC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyc0xpdGU8L05hbWU+DQorICAgICAgPFByaXZhdGU+RmFsc2U8L1ByaXZhdGU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcUG9ydGFibGVcJChUYXJnZXRGcmFtZXdvcmtWZXJzaW9uKVxNaWNyb3NvZnQuUG9ydGFibGUuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5TTDIwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLlNMMjAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODkxMDcKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5TTDIwLmNzcHJvagpAQCAtMCwwICsxLDEwNyBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyIgeG1sbnM6Y3M9InVybjpzY2hlbWFzLWNzaGFycC1wcm9qZWN0OnRlbXBsYXRlIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+U0lMVkVSTElHSFQ8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5TTDIwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYyLjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9O3tmYWUwNGVjMC0zMDFmLTExZDMtYmY0Yi0wMGMwNGY3OWVmYmN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8U2lsdmVybGlnaHRBcHBsaWNhdGlvbj5mYWxzZTwvU2lsdmVybGlnaHRBcHBsaWNhdGlvbj4NCisgICAgPFZhbGlkYXRlWGFtbD5mYWxzZTwvVmFsaWRhdGVYYW1sPg0KKyAgICA8VGhyb3dFcnJvcnNJblZhbGlkYXRpb24+ZmFsc2U8L1Rocm93RXJyb3JzSW5WYWxpZGF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFNMMjBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDIwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFO0xJVEU7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q7Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDIwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDIwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7TElURTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgQ29uZGl0aW9uPSInJChUYXJnZXRGcmFtZXdvcmtWZXJzaW9uKScgIT0gJ3YyLjAnIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiPg0KKyAgICAgIDxMaW5rPkZyYW1ld29ya1BvcnRhYmlsaXR5LmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcRm9ybVVybEVuY29kZWRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdEZhY3RvcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdE9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RUZXh0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFRleHRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uVGV4dEN1cnNvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVjdXJzaW9uTGltaXRFeGNlZWRlZC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxGb3JtYXRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFJlYWRlck9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFdyaXRlck9wdGlvbnMuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnNMaXRlLlNMMjAuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9OYW1lPg0KKyAgICAgIDxQcml2YXRlPkZhbHNlPC9Qcml2YXRlPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0XHYyLjBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8VmlzdWFsU3R1ZGlvPg0KKyAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9IntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9Ij4NCisgICAgICAgIDxTaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgICAgICA8U3RhcnRBY3Rpb24+T2ZmbGluZUFwcGxpY2F0aW9uPC9TdGFydEFjdGlvbj4NCisgICAgICAgIDwvU2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+DQorICAgIDwvVmlzdWFsU3R1ZGlvPg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLlNMMzAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24uU0wzMC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzYWMxMgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLlNMMzAuY3Nwcm9qCkBAIC0wLDAgKzEsMTA3IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiB4bWxuczpjcz0idXJuOnNjaGVtYXMtY3NoYXJwLXByb2plY3Q6dGVtcGxhdGUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5TSUxWRVJMSUdIVDwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPlNMMzA8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb248L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+e0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn07e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxTaWx2ZXJsaWdodEFwcGxpY2F0aW9uPmZhbHNlPC9TaWx2ZXJsaWdodEFwcGxpY2F0aW9uPg0KKyAgICA8VmFsaWRhdGVYYW1sPmZhbHNlPC9WYWxpZGF0ZVhhbWw+DQorICAgIDxUaHJvd0Vycm9yc0luVmFsaWRhdGlvbj5mYWxzZTwvVGhyb3dFcnJvcnNJblZhbGlkYXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cU0wzMFxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXFNMMzBcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7TElURTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cU0wzMFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0wzMFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0xJVEU7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXEZyYW1ld29ya1BvcnRhYmlsaXR5LmNzIj4NCisgICAgICA8TGluaz5GcmFtZXdvcmtQb3J0YWJpbGl0eS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXEZvcm1VcmxFbmNvZGVkUmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXE1lc3NhZ2VGb3JtYXRGYWN0b3J5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXE1lc3NhZ2VGb3JtYXRPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0VGV4dFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RUZXh0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGljdGlvbmFyeVJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGljdGlvbmFyeVdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvbkZvcm1hdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvbkZvcm1hdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvblRleHRDdXJzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbEZvcm1hdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sRm9ybWF0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxSZWFkZXJPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxXcml0ZXJPcHRpb25zLmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzTGl0ZS5TTDMwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzTGl0ZTwvTmFtZT4NCisgICAgICA8UHJpdmF0ZT5GYWxzZTwvUHJpdmF0ZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoMzIpXE1pY3Jvc29mdFxTaWx2ZXJsaWdodFx2My4wXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfSI+DQorICAgICAgICA8U2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICAgICAgPFN0YXJ0QWN0aW9uPk9mZmxpbmVBcHBsaWNhdGlvbjwvU3RhcnRBY3Rpb24+DQorICAgICAgICA8L1NpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5TTDQwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLlNMNDAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMzQxNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5TTDQwLmNzcHJvagpAQCAtMCwwICsxLDEwOCBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyIgeG1sbnM6Y3M9InVybjpzY2hlbWFzLWNzaGFycC1wcm9qZWN0OnRlbXBsYXRlIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+U0lMVkVSTElHSFQ8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5TTDQwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9O3tmYWUwNGVjMC0zMDFmLTExZDMtYmY0Yi0wMGMwNGY3OWVmYmN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8U2lsdmVybGlnaHRBcHBsaWNhdGlvbj5mYWxzZTwvU2lsdmVybGlnaHRBcHBsaWNhdGlvbj4NCisgICAgPFZhbGlkYXRlWGFtbD5mYWxzZTwvVmFsaWRhdGVYYW1sPg0KKyAgICA8VGhyb3dFcnJvcnNJblZhbGlkYXRpb24+ZmFsc2U8L1Rocm93RXJyb3JzSW5WYWxpZGF0aW9uPg0KKyAgICA8U2lsdmVybGlnaHRWZXJzaW9uPnY0LjA8L1NpbHZlcmxpZ2h0VmVyc2lvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDQwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0w0MFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDQwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDQwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7TElURTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiPg0KKyAgICAgIDxMaW5rPkZyYW1ld29ya1BvcnRhYmlsaXR5LmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcRm9ybVVybEVuY29kZWRSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdEZhY3RvcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ikh0dHBcTWVzc2FnZUZvcm1hdE9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RUZXh0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFRleHRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uRm9ybWF0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uVGV4dEN1cnNvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVjdXJzaW9uTGltaXRFeGNlZWRlZC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sRm9ybWF0UmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxGb3JtYXRXcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFJlYWRlck9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbFdyaXRlck9wdGlvbnMuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnNMaXRlLlNMNDAuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9OYW1lPg0KKyAgICAgIDxQcml2YXRlPkZhbHNlPC9Qcml2YXRlPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0XCQoU2lsdmVybGlnaHRWZXJzaW9uKVxNaWNyb3NvZnQuU2lsdmVybGlnaHQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn0iPg0KKyAgICAgICAgPFNpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgICAgIDxTdGFydEFjdGlvbj5PZmZsaW5lQXBwbGljYXRpb248L1N0YXJ0QWN0aW9uPg0KKyAgICAgICAgPC9TaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4NCisgICAgPC9WaXN1YWxTdHVkaW8+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24uY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24uY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNzU0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1Byb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5jc3Byb2oKQEAgLTAsMCArMSw5MyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q0xJRU5UUFJPRklMRTwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPk5FVDM1PC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMzVcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIENvbmRpdGlvbj0iJyQoVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbiknICE9ICd2Mi4wJyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXEZyYW1ld29ya1BvcnRhYmlsaXR5LmNzIj4NCisgICAgICA8TGluaz5GcmFtZXdvcmtQb3J0YWJpbGl0eS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXEZvcm1VcmxFbmNvZGVkUmVhZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXE1lc3NhZ2VGb3JtYXRGYWN0b3J5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJIdHRwXE1lc3NhZ2VGb3JtYXRPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RSZWFkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0VGV4dFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RUZXh0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGljdGlvbmFyeVJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGljdGlvbmFyeVdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvbkZvcm1hdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvbkZvcm1hdFdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvblRleHRDdXJzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbEZvcm1hdFJlYWRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sRm9ybWF0V3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxSZWFkZXJPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxXcml0ZXJPcHRpb25zLmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzTGl0ZS5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyc0xpdGU8L05hbWU+DQorICAgICAgPFByaXZhdGU+RmFsc2U8L1ByaXZhdGU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUmVjdXJzaW9uTGltaXRFeGNlZWRlZC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vUmVjdXJzaW9uTGltaXRFeGNlZWRlZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGU3MmJhCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9SZWN1cnNpb25MaW1pdEV4Y2VlZGVkLmNzCkBAIC0wLDAgKzEsMTggQEAKK++7v3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBUaGUgZXhjZXB0aW9uIHJhaXNlZCB3aGVuIGEgcmVjdXJzaW9uIGxpbWl0IGlzIHJlYWNoZWQgd2hpbGUgcGFyc2luZyBpbnB1dC4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBSZWN1cnNpb25MaW1pdEV4Y2VlZGVkRXhjZXB0aW9uIDogRm9ybWF0RXhjZXB0aW9uDQorICAgIHsNCisgICAgICAgIGNvbnN0IHN0cmluZyBtZXNzYWdlID0gIlBvc3NpYmxlIG1hbGljaW91cyBtZXNzYWdlIGhhZCB0b28gbWFueSBsZXZlbHMgb2YgbmVzdGluZy4iOw0KKyAgICAgICAgDQorICAgICAgICBpbnRlcm5hbCBSZWN1cnNpb25MaW1pdEV4Y2VlZGVkRXhjZXB0aW9uKCkgOiBiYXNlKG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9YbWxGb3JtYXRSZWFkZXIuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1htbEZvcm1hdFJlYWRlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGYxMTFkCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9YbWxGb3JtYXRSZWFkZXIuY3MKQEAgLTAsMCArMSwzMzggQEAKK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlhtbDsNCit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbg0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gUGFyc2VzIGEgcHJvdG8gYnVmZmVyIGZyb20gYW4gWE1MIGRvY3VtZW50IG9yIGZyYWdtZW50LiAgLk5FVCAzLjUgdXNlcnMgbWF5IGFsc28NCisgICAgLy8vIHVzZSB0aGlzIGNsYXNzIHRvIHByb2Nlc3MgSnNvbiBieSBzZXR0aW5nIHRoZSBvcHRpb25zIHRvIHN1cHBvcnQgSnNvbiBhbmQgcHJvdmlkaW5nDQorICAgIC8vLyBhbiBYbWxSZWFkZXIgb2J0YWluZWQgZnJvbSA8c2VlIGNyZWY9IlN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uSnNvbi5Kc29uUmVhZGVyV3JpdGVyRmFjdG9yeSIvPi4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIGNsYXNzIFhtbEZvcm1hdFJlYWRlciA6IEFic3RyYWN0VGV4dFJlYWRlcg0KKyAgICB7DQorICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIERlZmF1bHRSb290RWxlbWVudE5hbWUgPSBYbWxGb3JtYXRXcml0ZXIuRGVmYXVsdFJvb3RFbGVtZW50TmFtZTsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWG1sUmVhZGVyIF9pbnB1dDsNCisgICAgICAgIC8vIFRyYWNrcyB0aGUgbWVzc2FnZSBlbGVtZW50IGZvciBlYWNoIG5lc3RlZCBtZXNzYWdlIHJlYWQNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3RhY2s8RWxlbWVudFN0YWNrRW50cnk+IF9lbGVtZW50czsNCisgICAgICAgIC8vIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBmb3IgUmVhZE1lc3NhZ2VTdGFydA0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgX3Jvb3RFbGVtZW50TmFtZTsNCisNCisgICAgICAgIHByaXZhdGUgc3RydWN0IEVsZW1lbnRTdGFja0VudHJ5DQorICAgICAgICB7DQorICAgICAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0cmluZyBMb2NhbE5hbWU7DQorICAgICAgICAgICAgcHVibGljIHJlYWRvbmx5IGludCBEZXB0aDsNCisgICAgICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYm9vbCBJc0VtcHR5Ow0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBFbGVtZW50U3RhY2tFbnRyeShzdHJpbmcgbG9jYWxOYW1lLCBpbnQgZGVwdGgsIGJvb2wgaXNFbXB0eSkgOiB0aGlzKCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIExvY2FsTmFtZSA9IGxvY2FsTmFtZTsNCisgICAgICAgICAgICAgICAgSXNFbXB0eSA9IGlzRW1wdHk7DQorICAgICAgICAgICAgICAgIERlcHRoID0gZGVwdGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWG1sUmVhZGVyU2V0dGluZ3MgRGVmYXVsdFNldHRpbmdzDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFJlYWRlclNldHRpbmdzKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7Q2hlY2tDaGFyYWN0ZXJzID0gZmFsc2UsIElnbm9yZUNvbW1lbnRzID0gdHJ1ZSwgSWdub3JlUHJvY2Vzc2luZ0luc3RydWN0aW9ucyA9IHRydWV9Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBYbWxGb3JtYXRSZWFkZXIgdXNpbmcgdGhlIHN0cmVhbSBwcm92aWRlZCBhcyB0aGUgeG1sDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGb3JtYXRSZWFkZXIgQ3JlYXRlSW5zdGFuY2UoYnl0ZVtdIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRm9ybWF0UmVhZGVyKFhtbFJlYWRlci5DcmVhdGUobmV3IE1lbW9yeVN0cmVhbShpbnB1dCwgZmFsc2UpLCBEZWZhdWx0U2V0dGluZ3MpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBYbWxGb3JtYXRSZWFkZXIgdXNpbmcgdGhlIHN0cmVhbSBwcm92aWRlZCBhcyB0aGUgeG1sDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGb3JtYXRSZWFkZXIgQ3JlYXRlSW5zdGFuY2UoU3RyZWFtIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRm9ybWF0UmVhZGVyKFhtbFJlYWRlci5DcmVhdGUoaW5wdXQsIERlZmF1bHRTZXR0aW5ncykpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIFhtbEZvcm1hdFJlYWRlciB1c2luZyB0aGUgc3RyaW5nIHByb3ZpZGVkIGFzIHRoZSB4bWwgdG8gYmUgcmVhZA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRm9ybWF0UmVhZGVyIENyZWF0ZUluc3RhbmNlKFN0cmluZyBpbnB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEZvcm1hdFJlYWRlcihYbWxSZWFkZXIuQ3JlYXRlKG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpLCBEZWZhdWx0U2V0dGluZ3MpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBYbWxGb3JtYXRSZWFkZXIgdXNpbmcgdGhlIHhtbCBpbiB0aGUgVGV4dFJlYWRlcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRm9ybWF0UmVhZGVyIENyZWF0ZUluc3RhbmNlKFRleHRSZWFkZXIgaW5wdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxGb3JtYXRSZWFkZXIoWG1sUmVhZGVyLkNyZWF0ZShpbnB1dCwgRGVmYXVsdFNldHRpbmdzKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgWG1sRm9ybWF0UmVhZGVyIHdpdGggdGhlIFhtbFJlYWRlcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRm9ybWF0UmVhZGVyIENyZWF0ZUluc3RhbmNlKFhtbFJlYWRlciBpbnB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEZvcm1hdFJlYWRlcihpbnB1dCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgWG1sRm9ybWF0UmVhZGVyIHdpdGggdGhlIFhtbFJlYWRlciBhbmQgb3B0aW9ucw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBYbWxGb3JtYXRSZWFkZXIoWG1sUmVhZGVyIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIF9pbnB1dCA9IGlucHV0Ow0KKyAgICAgICAgICAgIF9yb290RWxlbWVudE5hbWUgPSBEZWZhdWx0Um9vdEVsZW1lbnROYW1lOw0KKyAgICAgICAgICAgIF9lbGVtZW50cyA9IG5ldyBTdGFjazxFbGVtZW50U3RhY2tFbnRyeT4oKTsNCisgICAgICAgICAgICBPcHRpb25zID0gWG1sUmVhZGVyT3B0aW9ucy5Ob25lOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEdldHMgb3Igc2V0cyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiByZWFkaW5nIHRoZSB4bWwNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgWG1sUmVhZGVyT3B0aW9ucyBPcHRpb25zIHsgZ2V0OyBzZXQ7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXRzIHRoZSBvcHRpb25zIHRvIHVzZSB3aGlsZSBnZW5lcmF0aW5nIHRoZSBYTUwNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgWG1sRm9ybWF0UmVhZGVyIFNldE9wdGlvbnMoWG1sUmVhZGVyT3B0aW9ucyBvcHRpb25zKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE9wdGlvbnMgPSBvcHRpb25zOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEdldHMgb3Igc2V0cyB0aGUgZGVmYXVsdCBlbGVtZW50IG5hbWUgdG8gdXNlIHdoZW4gdXNpbmcgdGhlIE1lcmdlJmx0O1RCdWlsZGVyPigpDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0cmluZyBSb290RWxlbWVudE5hbWUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3Jvb3RFbGVtZW50TmFtZTsgfQ0KKyAgICAgICAgICAgIHNldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJSb290RWxlbWVudE5hbWUiKTsNCisgICAgICAgICAgICAgICAgX3Jvb3RFbGVtZW50TmFtZSA9IHZhbHVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtEZWJ1Z2dlck5vblVzZXJDb2RlXQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBc3NlcnQoYm9vbCBjb25kKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICghY29uZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgdGhlIHJvb3QtbWVzc2FnZSBwcmVhbWJsZSBzcGVjaWZpYyB0byB0aGlzIGZvcm1hdHRlcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNZXNzYWdlU3RhcnQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFJlYWRNZXNzYWdlU3RhcnQoX3Jvb3RFbGVtZW50TmFtZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgdGhlIHJvb3QtbWVzc2FnZSBwcmVhbWJsZSBzcGVjaWZpYyB0byB0aGlzIGZvcm1hdHRlcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRNZXNzYWdlU3RhcnQoc3RyaW5nIGVsZW1lbnQpDQorICAgICAgICB7DQorICAgICAgICAgICAgd2hpbGUgKCFfaW5wdXQuSXNTdGFydEVsZW1lbnQoKSAmJiBfaW5wdXQuUmVhZCgpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEFzc2VydChfaW5wdXQuSXNTdGFydEVsZW1lbnQoKSAmJiBfaW5wdXQuTG9jYWxOYW1lID09IGVsZW1lbnQpOw0KKyAgICAgICAgICAgIF9lbGVtZW50cy5QdXNoKG5ldyBFbGVtZW50U3RhY2tFbnRyeShlbGVtZW50LCBfaW5wdXQuRGVwdGgsIF9pbnB1dC5Jc0VtcHR5RWxlbWVudCkpOw0KKyAgICAgICAgICAgIF9pbnB1dC5SZWFkKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgdGhlIHJvb3QtbWVzc2FnZSBjbG9zZSBzcGVjaWZpYyB0byB0aGlzIGZvcm1hdHRlciwgTVVTVCBiZSBjYWxsZWQNCisgICAgICAgIC8vLyBvbiB0aGUgcmVhZGVyIG9idGFpbmVkIGZyb20gUmVhZE1lc3NhZ2VTdGFydChzdHJpbmcgZWxlbWVudCkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VFbmQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydChfZWxlbWVudHMuQ291bnQgPiAwKTsNCisNCisgICAgICAgICAgICBFbGVtZW50U3RhY2tFbnRyeSBzdG9wID0gX2VsZW1lbnRzLlBlZWsoKTsNCisgICAgICAgICAgICB3aGlsZSAoX2lucHV0Lk5vZGVUeXBlICE9IFhtbE5vZGVUeXBlLkVuZEVsZW1lbnQgJiYgX2lucHV0Lk5vZGVUeXBlICE9IFhtbE5vZGVUeXBlLkVsZW1lbnQNCisgICAgICAgICAgICAgICAgICAgJiYgX2lucHV0LkRlcHRoID4gc3RvcC5EZXB0aCAmJiBfaW5wdXQuUmVhZCgpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmICghc3RvcC5Jc0VtcHR5KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQXNzZXJ0KF9pbnB1dC5Ob2RlVHlwZSA9PSBYbWxOb2RlVHlwZS5FbmRFbGVtZW50DQorICAgICAgICAgICAgICAgICAgICAgICAmJiBfaW5wdXQuTG9jYWxOYW1lID09IHN0b3AuTG9jYWxOYW1lDQorICAgICAgICAgICAgICAgICAgICAgICAmJiBfaW5wdXQuRGVwdGggPT0gc3RvcC5EZXB0aCk7DQorDQorICAgICAgICAgICAgICAgIF9pbnB1dC5SZWFkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIF9lbGVtZW50cy5Qb3AoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBNZXJnZSB0aGUgcHJvdmlkZWQgYnVpbGRlciBhcyBhbiBlbGVtZW50IG5hbWVkIDxzZWUgY3JlZj0iUm9vdEVsZW1lbnROYW1lIi8+IGluIHRoZSBjdXJyZW50IGNvbnRleHQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVEJ1aWxkZXIgTWVyZ2U8VEJ1aWxkZXI+KFRCdWlsZGVyIGJ1aWxkZXIsIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZShfcm9vdEVsZW1lbnROYW1lLCBidWlsZGVyLCByZWdpc3RyeSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTWVyZ2UgdGhlIHByb3ZpZGVkIGJ1aWxkZXIgYXMgYW4gZWxlbWVudCBvZiB0aGUgY3VycmVudCBjb250ZXh0DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIFRCdWlsZGVyIE1lcmdlPFRCdWlsZGVyPihzdHJpbmcgZWxlbWVudCwgVEJ1aWxkZXIgYnVpbGRlcikgd2hlcmUgVEJ1aWxkZXIgOiBJQnVpbGRlckxpdGUNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2UoZWxlbWVudCwgYnVpbGRlciwgRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE1lcmdlIHRoZSBwcm92aWRlZCBidWlsZGVyIGFzIGFuIGVsZW1lbnQgb2YgdGhlIGN1cnJlbnQgY29udGV4dA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBUQnVpbGRlciBNZXJnZTxUQnVpbGRlcj4oc3RyaW5nIGVsZW1lbnQsIFRCdWlsZGVyIGJ1aWxkZXIsIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgICAgIHdoZXJlIFRCdWlsZGVyIDogSUJ1aWxkZXJMaXRlDQorICAgICAgICB7DQorICAgICAgICAgICAgUmVhZE1lc3NhZ2VTdGFydChlbGVtZW50KTsNCisgICAgICAgICAgICBidWlsZGVyLldlYWtNZXJnZUZyb20odGhpcywgcmVnaXN0cnkpOw0KKyAgICAgICAgICAgIFJlYWRNZXNzYWdlRW5kKCk7DQorICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUGVla3MgYXQgdGhlIG5leHQgZmllbGQgaW4gdGhlIGlucHV0IHN0cmVhbSBhbmQgcmV0dXJucyB3aGF0IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+DQorICAgICAgICAvLy8gVGhpcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGhvdXQgYWN0dWFsbHkgcmVhZGluZyB0aGUgZmllbGQuICBPbmx5IGFmdGVyIHRoZSBmaWVsZA0KKyAgICAgICAgLy8vIGlzIGVpdGhlciByZWFkLCBvciBza2lwcGVkLCBzaG91bGQgUGVla05leHQgcmV0dXJuIGEgZGlmZmVyZW50IHZhbHVlLg0KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFBlZWtOZXh0KG91dCBzdHJpbmcgZmllbGQpDQorICAgICAgICB7DQorICAgICAgICAgICAgRWxlbWVudFN0YWNrRW50cnkgc3RvcE5vZGU7DQorICAgICAgICAgICAgaWYgKF9lbGVtZW50cy5Db3VudCA9PSAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3RvcE5vZGUgPSBuZXcgRWxlbWVudFN0YWNrRW50cnkobnVsbCwgX2lucHV0LkRlcHRoIC0gMSwgZmFsc2UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBzdG9wTm9kZSA9IF9lbGVtZW50cy5QZWVrKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmICghc3RvcE5vZGUuSXNFbXB0eSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdoaWxlICghX2lucHV0LklzU3RhcnRFbGVtZW50KCkgJiYgX2lucHV0LkRlcHRoID4gc3RvcE5vZGUuRGVwdGggJiYgX2lucHV0LlJlYWQoKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgaWYgKF9pbnB1dC5Jc1N0YXJ0RWxlbWVudCgpICYmIF9pbnB1dC5EZXB0aCA+IHN0b3BOb2RlLkRlcHRoKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IF9pbnB1dC5Mb2NhbE5hbWU7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmaWVsZCA9IG51bGw7DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENhdXNlcyB0aGUgcmVhZGVyIHRvIHNraXAgcGFzdCB0aGlzIGZpZWxkDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgU2tpcCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKF9pbnB1dC5Jc1N0YXJ0RWxlbWVudCgpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKCFfaW5wdXQuSXNFbXB0eUVsZW1lbnQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGludCBkZXB0aCA9IF9pbnB1dC5EZXB0aDsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChfaW5wdXQuRGVwdGggPj0gZGVwdGggJiYgX2lucHV0Lk5vZGVUeXBlICE9IFhtbE5vZGVUeXBlLkVuZEVsZW1lbnQpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0KF9pbnB1dC5SZWFkKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIF9pbnB1dC5SZWFkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgc2luZ2xlIHZhbHVlIGludG8gdGhlIHZhbHVlIHJlZmVyZW5jZS4gIFRoZSB2YWx1ZQ0KKyAgICAgICAgLy8vIHN0b3JlZCBtYXkgYmUgb2YgdHlwZSBTeXN0ZW0uU3RyaW5nLCBTeXN0ZW0uSW50MzIsIG9yIGFuIElFbnVtTGl0ZSBmcm9tIHRoZSBJRW51bUxpdGVNYXAuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGJvb2wgUmVhZEVudW0ocmVmIG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgbnVtYmVyOw0KKyAgICAgICAgICAgIHN0cmluZyB0ZW1wOw0KKyAgICAgICAgICAgIGlmIChudWxsICE9ICh0ZW1wID0gX2lucHV0LkdldEF0dHJpYnV0ZSgidmFsdWUiKSkgJiYgRnJhbWV3b3JrUG9ydGFiaWxpdHkuVHJ5UGFyc2VJbnQzMih0ZW1wLCBvdXQgbnVtYmVyKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFNraXAoKTsNCisgICAgICAgICAgICAgICAgdmFsdWUgPSBudW1iZXI7DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gYmFzZS5SZWFkRW51bShyZWYgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byByZWFkIGEgU3RyaW5nIGZyb20gdGhlIGlucHV0DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGJvb2wgUmVhZEFzVGV4dChyZWYgc3RyaW5nIHZhbHVlLCBUeXBlIHR5cGUpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0KF9pbnB1dC5Ob2RlVHlwZSA9PSBYbWxOb2RlVHlwZS5FbGVtZW50KTsNCisgICAgICAgICAgICB2YWx1ZSA9IF9pbnB1dC5SZWFkRWxlbWVudENvbnRlbnRBc1N0cmluZygpOw0KKw0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE1lcmdlcyB0aGUgaW5wdXQgc3RyZWFtIGludG8gdGhlIHByb3ZpZGVkIElCdWlsZGVyTGl0ZSANCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBSZWFkTWVzc2FnZShJQnVpbGRlckxpdGUgYnVpbGRlciwgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0KF9pbnB1dC5Jc1N0YXJ0RWxlbWVudCgpKTsNCisgICAgICAgICAgICBSZWFkTWVzc2FnZVN0YXJ0KF9pbnB1dC5Mb2NhbE5hbWUpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuV2Vha01lcmdlRnJvbSh0aGlzLCByZWdpc3RyeSk7DQorICAgICAgICAgICAgUmVhZE1lc3NhZ2VFbmQoKTsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgSUVudW1lcmFibGU8c3RyaW5nPiBOb25OZXN0ZWRBcnJheUl0ZW1zKHN0cmluZyBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gYmFzZS5Gb3JlYWNoQXJyYXlJdGVtKGZpZWxkKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDdXJzb3JzIHRocm91Z2ggdGhlIGFycmF5IGVsZW1lbnRzIGFuZCBzdG9wcyBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBJRW51bWVyYWJsZTxzdHJpbmc+IEZvcmVhY2hBcnJheUl0ZW0oc3RyaW5nIGZpZWxkKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJvb2wgaXNOZXN0ZWQgPSAoT3B0aW9ucyAmIFhtbFJlYWRlck9wdGlvbnMuUmVhZE5lc3RlZEFycmF5cykgIT0gMDsNCisNCisgICAgICAgICAgICBpZiAoIWlzTmVzdGVkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGl0ZW0gaW4gTm9uTmVzdGVkQXJyYXlJdGVtcyhmaWVsZCkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBpdGVtOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHN0cmluZyBmb3VuZDsNCisgICAgICAgICAgICAgICAgUmVhZE1lc3NhZ2VTdGFydChmaWVsZCk7DQorICAgICAgICAgICAgICAgIGlmIChQZWVrTmV4dChvdXQgZm91bmQpICYmIGZvdW5kID09ICJpdGVtIikNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGl0ZW0gaW4gTm9uTmVzdGVkQXJyYXlJdGVtcygiaXRlbSIpKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBpdGVtOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIFJlYWRNZXNzYWdlRW5kKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vWG1sRm9ybWF0V3JpdGVyLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9YbWxGb3JtYXRXcml0ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkMjc1NgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vWG1sRm9ybWF0V3JpdGVyLmNzCkBAIC0wLDAgKzEsMjgwIEBACit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCit1c2luZyBTeXN0ZW0uWG1sOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbg0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gV3JpdGVzIGEgcHJvdG8gYnVmZmVyIHRvIGFuIFhNTCBkb2N1bWVudCBvciBmcmFnbWVudC4gIC5ORVQgMy41IHVzZXJzIG1heSBhbHNvDQorICAgIC8vLyB1c2UgdGhpcyBjbGFzcyB0byBwcm9kdWNlIEpzb24gYnkgc2V0dGluZyB0aGUgb3B0aW9ucyB0byBzdXBwb3J0IEpzb24gYW5kIHByb3ZpZGluZw0KKyAgICAvLy8gYW4gWG1sV3JpdGVyIG9idGFpbmVkIGZyb20gPHNlZSBjcmVmPSJTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkpzb24uSnNvblJlYWRlcldyaXRlckZhY3RvcnkiLz4uDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBjbGFzcyBYbWxGb3JtYXRXcml0ZXIgOiBBYnN0cmFjdFRleHRXcml0ZXINCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRW5jb2RpbmcgRGVmYXVsdEVuY29kaW5nID0gbmV3IFVURjhFbmNvZGluZyhmYWxzZSk7DQorICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIERlZmF1bHRSb290RWxlbWVudE5hbWUgPSAicm9vdCI7DQorDQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFhtbFdyaXRlciBfb3V0cHV0Ow0KKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIHVzZWQgZm9yIFdyaXRlTWVzc2FnZVN0YXJ0DQorICAgICAgICBwcml2YXRlIHN0cmluZyBfcm9vdEVsZW1lbnROYW1lOw0KKyAgICAgICAgLy8gVXNlZCB0byBhc3NlcnQgbWF0Y2hpbmcgV3JpdGVNZXNzYWdlU3RhcnQvV3JpdGVNZXNzYWdlRW5kIGNhbGxzDQorICAgICAgICBwcml2YXRlIGludCBfbWVzc2FnZU9wZW5Db3VudDsNCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhtbFdyaXRlclNldHRpbmdzIERlZmF1bHRTZXR0aW5ncyhFbmNvZGluZyBlbmNvZGluZykNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFdyaXRlclNldHRpbmdzKCkNCisgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0NoYXJhY3RlcnMgPSBmYWxzZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdMaW5lSGFuZGxpbmcgPSBOZXdMaW5lSGFuZGxpbmcuRW50aXRpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgT21pdFhtbERlY2xhcmF0aW9uID0gdHJ1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZyA9IGVuY29kaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgfTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBYbWxGb3JtYXRXcml0ZXIgdG8gd3JpdGUgdG8gdGhlIGdpdmVuIFRleHRXcml0ZXINCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZvcm1hdFdyaXRlciBDcmVhdGVJbnN0YW5jZShUZXh0V3JpdGVyIG91dHB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEZvcm1hdFdyaXRlcihYbWxXcml0ZXIuQ3JlYXRlKG91dHB1dCwgRGVmYXVsdFNldHRpbmdzKG91dHB1dC5FbmNvZGluZykpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBYbWxGb3JtYXRXcml0ZXIgdG8gd3JpdGUgdG8gdGhlIGdpdmVuIHN0cmVhbQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRm9ybWF0V3JpdGVyIENyZWF0ZUluc3RhbmNlKFN0cmVhbSBvdXRwdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxGb3JtYXRXcml0ZXIoWG1sV3JpdGVyLkNyZWF0ZShvdXRwdXQsIERlZmF1bHRTZXR0aW5ncyhEZWZhdWx0RW5jb2RpbmcpKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgWG1sRm9ybWF0V3JpdGVyIHRvIHdyaXRlIHRvIHRoZSBnaXZlbiBzdHJlYW0NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZvcm1hdFdyaXRlciBDcmVhdGVJbnN0YW5jZShTdHJlYW0gb3V0cHV0LCBFbmNvZGluZyBlbmNvZGluZykNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEZvcm1hdFdyaXRlcihYbWxXcml0ZXIuQ3JlYXRlKG91dHB1dCwgRGVmYXVsdFNldHRpbmdzKGVuY29kaW5nKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIFhtbEZvcm1hdFdyaXRlciB0byB3cml0ZSB0byB0aGUgZ2l2ZW4gWG1sV3JpdGVyDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGb3JtYXRXcml0ZXIgQ3JlYXRlSW5zdGFuY2UoWG1sV3JpdGVyIG91dHB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEZvcm1hdFdyaXRlcihvdXRwdXQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJvdGVjdGVkIFhtbEZvcm1hdFdyaXRlcihYbWxXcml0ZXIgb3V0cHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIF9vdXRwdXQgPSBvdXRwdXQ7DQorICAgICAgICAgICAgX21lc3NhZ2VPcGVuQ291bnQgPSAwOw0KKyAgICAgICAgICAgIF9yb290RWxlbWVudE5hbWUgPSBEZWZhdWx0Um9vdEVsZW1lbnROYW1lOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEdldHMgb3Igc2V0cyB0aGUgZGVmYXVsdCBlbGVtZW50IG5hbWUgdG8gdXNlIHdoZW4gdXNpbmcgdGhlIE1lcmdlJmx0O1RCdWlsZGVyPigpDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0cmluZyBSb290RWxlbWVudE5hbWUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3Jvb3RFbGVtZW50TmFtZTsgfQ0KKyAgICAgICAgICAgIHNldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJSb290RWxlbWVudE5hbWUiKTsNCisgICAgICAgICAgICAgICAgX3Jvb3RFbGVtZW50TmFtZSA9IHZhbHVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzIG9yIHNldHMgdGhlIG9wdGlvbnMgdG8gdXNlIHdoaWxlIGdlbmVyYXRpbmcgdGhlIFhNTA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBYbWxXcml0ZXJPcHRpb25zIE9wdGlvbnMgeyBnZXQ7IHNldDsgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNldHMgdGhlIG9wdGlvbnMgdG8gdXNlIHdoaWxlIGdlbmVyYXRpbmcgdGhlIFhNTA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBYbWxGb3JtYXRXcml0ZXIgU2V0T3B0aW9ucyhYbWxXcml0ZXJPcHRpb25zIG9wdGlvbnMpDQorICAgICAgICB7DQorICAgICAgICAgICAgT3B0aW9ucyA9IG9wdGlvbnM7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIGJvb2wgVGVzdE9wdGlvbihYbWxXcml0ZXJPcHRpb25zIG9wdGlvbikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gKE9wdGlvbnMgJiBvcHRpb24pICE9IDA7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcGxldGVzIGFueSBwZW5kaW5nIHdyaXRlIG9wZXJhdGlvbnMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgX291dHB1dC5GbHVzaCgpOw0KKyAgICAgICAgICAgIGJhc2UuRmx1c2goKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVc2VkIHRvIHdyaXRlIHRoZSByb290LW1lc3NhZ2UgcHJlYW1ibGUsIGluIHhtbCB0aGlzIGlzIG9wZW4gZWxlbWVudCBmb3IgUm9vdEVsZW1lbnROYW1lLA0KKyAgICAgICAgLy8vIGJ5IGRlZmF1bHQgIiZsdDtyb290Jmd0OyIuIEFmdGVyIHRoaXMgY2FsbCB5b3UgY2FuIGNhbGwgSU1lc3NhZ2VMaXRlLk1lcmdlVG8oLi4uKSBhbmQgDQorICAgICAgICAvLy8gY29tcGxldGUgdGhlIG1lc3NhZ2Ugd2l0aCBhIGNhbGwgdG8gV3JpdGVNZXNzYWdlRW5kKCkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlU3RhcnQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlTWVzc2FnZVN0YXJ0KF9yb290RWxlbWVudE5hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFVzZWQgdG8gd3JpdGUgdGhlIHJvb3QtbWVzc2FnZSBwcmVhbWJsZSwgaW4geG1sIHRoaXMgaXMgb3BlbiBlbGVtZW50IGZvciBlbGVtZW50TmFtZS4gDQorICAgICAgICAvLy8gQWZ0ZXIgdGhpcyBjYWxsIHlvdSBjYW4gY2FsbCBJTWVzc2FnZUxpdGUuTWVyZ2VUbyguLi4pIGFuZCAgY29tcGxldGUgdGhlIG1lc3NhZ2Ugd2l0aCANCisgICAgICAgIC8vLyBhIGNhbGwgdG8gV3JpdGVNZXNzYWdlRW5kKCkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVNZXNzYWdlU3RhcnQoc3RyaW5nIGVsZW1lbnROYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChUZXN0T3B0aW9uKFhtbFdyaXRlck9wdGlvbnMuT3V0cHV0SnNvblR5cGVzKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF9vdXRwdXQuV3JpdGVTdGFydEVsZW1lbnQoInJvb3QiKTsgLy8ganNvbiByZXF1aXJlcyB0aGlzIGlzIHRoZSByb290LWVsZW1lbnQNCisgICAgICAgICAgICAgICAgX291dHB1dC5Xcml0ZUF0dHJpYnV0ZVN0cmluZygidHlwZSIsICJvYmplY3QiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgX291dHB1dC5Xcml0ZVN0YXJ0RWxlbWVudChlbGVtZW50TmFtZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIF9tZXNzYWdlT3BlbkNvdW50Kys7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVXNlZCB0byBjb21wbGV0ZSBhIHJvb3QtbWVzc2FnZSBwcmV2aW91c2x5IHN0YXJ0ZWQgd2l0aCBhIGNhbGwgdG8gV3JpdGVNZXNzYWdlU3RhcnQoKQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUVuZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKF9tZXNzYWdlT3BlbkNvdW50IDw9IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBfb3V0cHV0LldyaXRlRW5kRWxlbWVudCgpOw0KKyAgICAgICAgICAgIF9vdXRwdXQuRmx1c2goKTsNCisgICAgICAgICAgICBfbWVzc2FnZU9wZW5Db3VudC0tOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIG1lc3NhZ2UgYXMgYW4gZWxlbWVudCB1c2luZyB0aGUgbmFtZSBkZWZpbmVkIGluIDxzZWUgY3JlZj0iUm9vdEVsZW1lbnROYW1lIi8+DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlKElNZXNzYWdlTGl0ZSBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlTWVzc2FnZShfcm9vdEVsZW1lbnROYW1lLCBtZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBtZXNzYWdlIGFzIGFuIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlTWVzc2FnZShzdHJpbmcgZWxlbWVudE5hbWUsIElNZXNzYWdlTGl0ZSBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlTWVzc2FnZVN0YXJ0KGVsZW1lbnROYW1lKTsNCisgICAgICAgICAgICBtZXNzYWdlLldyaXRlVG8odGhpcyk7DQorICAgICAgICAgICAgV3JpdGVNZXNzYWdlRW5kKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgbWVzc2FnZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZU9yR3JvdXAoc3RyaW5nIGZpZWxkLCBJTWVzc2FnZUxpdGUgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfb3V0cHV0LldyaXRlU3RhcnRFbGVtZW50KGZpZWxkKTsNCisNCisgICAgICAgICAgICBpZiAoVGVzdE9wdGlvbihYbWxXcml0ZXJPcHRpb25zLk91dHB1dEpzb25UeXBlcykpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBfb3V0cHV0LldyaXRlQXR0cmlidXRlU3RyaW5nKCJ0eXBlIiwgIm9iamVjdCIpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBtZXNzYWdlLldyaXRlVG8odGhpcyk7DQorICAgICAgICAgICAgX291dHB1dC5Xcml0ZUVuZEVsZW1lbnQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBTdHJpbmcgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZUFzVGV4dChzdHJpbmcgZmllbGQsIHN0cmluZyB0ZXh0VmFsdWUsIG9iamVjdCB0eXBlZFZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIF9vdXRwdXQuV3JpdGVTdGFydEVsZW1lbnQoZmllbGQpOw0KKw0KKyAgICAgICAgICAgIGlmIChUZXN0T3B0aW9uKFhtbFdyaXRlck9wdGlvbnMuT3V0cHV0SnNvblR5cGVzKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmICh0eXBlZFZhbHVlIGlzIGludCB8fCB0eXBlZFZhbHVlIGlzIHVpbnQgfHwgdHlwZWRWYWx1ZSBpcyBsb25nIHx8IHR5cGVkVmFsdWUgaXMgdWxvbmcgfHwNCisgICAgICAgICAgICAgICAgICAgIHR5cGVkVmFsdWUgaXMgZG91YmxlIHx8IHR5cGVkVmFsdWUgaXMgZmxvYXQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXQuV3JpdGVBdHRyaWJ1dGVTdHJpbmcoInR5cGUiLCAibnVtYmVyIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZWRWYWx1ZSBpcyBib29sKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBfb3V0cHV0LldyaXRlQXR0cmlidXRlU3RyaW5nKCJ0eXBlIiwgImJvb2xlYW4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBfb3V0cHV0LldyaXRlU3RyaW5nKHRleHRWYWx1ZSk7DQorDQorICAgICAgICAgICAgLy9FbXB0eSBzdHJpbmdzIHNob3VsZCBub3QgYmUgd3JpdHRlbiBhcyBlbXB0eSBlbGVtZW50cyAnPGl0ZW0vPicsIHJhdGhlciBhcyAnPGl0ZW0+PC9pdGVtPicNCisgICAgICAgICAgICBpZiAoX291dHB1dC5Xcml0ZVN0YXRlID09IFdyaXRlU3RhdGUuRWxlbWVudCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF9vdXRwdXQuV3JpdGVSYXcoIiIpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBfb3V0cHV0LldyaXRlRW5kRWxlbWVudCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhbiBhcnJheSBvZiBmaWVsZCB2YWx1ZXMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZUFycmF5KEZpZWxkVHlwZSBmaWVsZFR5cGUsIHN0cmluZyBmaWVsZCwgSUVudW1lcmFibGUgaXRlbXMpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy9zZWUgaWYgaXQncyBlbXB0eQ0KKyAgICAgICAgICAgIElFbnVtZXJhdG9yIGVpdGVtcyA9IGl0ZW1zLkdldEVudW1lcmF0b3IoKTsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmICghZWl0ZW1zLk1vdmVOZXh0KCkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmaW5hbGx5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoZWl0ZW1zIGlzIElEaXNwb3NhYmxlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKSBlaXRlbXMpLkRpc3Bvc2UoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAoVGVzdE9wdGlvbihYbWxXcml0ZXJPcHRpb25zLk91dHB1dE5lc3RlZEFycmF5cyB8IFhtbFdyaXRlck9wdGlvbnMuT3V0cHV0SnNvblR5cGVzKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF9vdXRwdXQuV3JpdGVTdGFydEVsZW1lbnQoZmllbGQpOw0KKyAgICAgICAgICAgICAgICBpZiAoVGVzdE9wdGlvbihYbWxXcml0ZXJPcHRpb25zLk91dHB1dEpzb25UeXBlcykpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXQuV3JpdGVBdHRyaWJ1dGVTdHJpbmcoInR5cGUiLCAiYXJyYXkiKTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBiYXNlLldyaXRlQXJyYXkoZmllbGRUeXBlLCAiaXRlbSIsIGl0ZW1zKTsNCisgICAgICAgICAgICAgICAgX291dHB1dC5Xcml0ZUVuZEVsZW1lbnQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYmFzZS5Xcml0ZUFycmF5KGZpZWxkVHlwZSwgZmllbGQsIGl0ZW1zKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgU3lzdGVtLkVudW0gYnkgdGhlIG51bWVyaWMgYW5kIHRleHR1YWwgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBXcml0ZUVudW0oc3RyaW5nIGZpZWxkLCBpbnQgbnVtYmVyLCBzdHJpbmcgbmFtZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfb3V0cHV0LldyaXRlU3RhcnRFbGVtZW50KGZpZWxkKTsNCisNCisgICAgICAgICAgICBpZiAoIVRlc3RPcHRpb24oWG1sV3JpdGVyT3B0aW9ucy5PdXRwdXRKc29uVHlwZXMpICYmIFRlc3RPcHRpb24oWG1sV3JpdGVyT3B0aW9ucy5PdXRwdXRFbnVtVmFsdWVzKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF9vdXRwdXQuV3JpdGVBdHRyaWJ1dGVTdHJpbmcoInZhbHVlIiwgWG1sQ29udmVydC5Ub1N0cmluZyhudW1iZXIpKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgX291dHB1dC5Xcml0ZVN0cmluZyhuYW1lKTsNCisgICAgICAgICAgICBfb3V0cHV0LldyaXRlRW5kRWxlbWVudCgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vWG1sUmVhZGVyT3B0aW9ucy5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vWG1sUmVhZGVyT3B0aW9ucy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2VjYTFkCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi9YbWxSZWFkZXJPcHRpb25zLmNzCkBAIC0wLDAgKzEsMTcgQEAKK3VzaW5nIFN5c3RlbTsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBPcHRpb25zIGF2YWlsYWJsZSBmb3IgdGhlIHhtbCByZWFkZXIgb3V0cHV0DQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIFtGbGFnc10NCisgICAgcHVibGljIGVudW0gWG1sUmVhZGVyT3B0aW9ucw0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+IFNpbXBsZSB4bWwgZm9ybWF0dGluZyB3aXRoIG5vIGF0dHJpYnV0ZXMgPC9zdW1tYXJ5Pg0KKyAgICAgICAgTm9uZSwNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4gUmVxdWlyZXMgdGhhdCBhcnJheXMgaXRlbXMgYXJlIG5lc3RlZCBpbiBhbiAmbHQ7aXRlbT4gZWxlbWVudCA8L3N1bW1hcnk+DQorICAgICAgICBSZWFkTmVzdGVkQXJyYXlzID0gMSwNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1htbFdyaXRlck9wdGlvbnMuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uL1htbFdyaXRlck9wdGlvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q3NDBlZQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24vWG1sV3JpdGVyT3B0aW9ucy5jcwpAQCAtMCwwICsxLDI0IEBACit1c2luZyBTeXN0ZW07DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbg0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gT3B0aW9ucyBhdmFpbGFibGUgZm9yIHRoZSB4bWwgd3JpdGVyIG91dHB1dA0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBbRmxhZ3NdDQorICAgIHB1YmxpYyBlbnVtIFhtbFdyaXRlck9wdGlvbnMNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PiBTaW1wbGUgeG1sIGZvcm1hdHRpbmcgd2l0aCBubyBhdHRyaWJ1dGVzIDwvc3VtbWFyeT4NCisgICAgICAgIE5vbmUsDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+IFdyaXRlcyB0aGUgJ3ZhbHVlJyBhdHRyaWJ1dGUgb24gYWxsIGVudW1lcmF0aW9ucyB3aXRoIHRoZSBudW1lcmljIGlkZW50aWZpZXIgPC9zdW1tYXJ5Pg0KKyAgICAgICAgT3V0cHV0RW51bVZhbHVlcyA9IDB4MSwNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4gRW1iZWRzIGFycmF5IGl0ZW1zIGludG8gY2hpbGQgJmx0O2l0ZW0+IGVsZW1lbnRzIDwvc3VtbWFyeT4NCisgICAgICAgIE91dHB1dE5lc3RlZEFycmF5cyA9IDB4NCwNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4gT3V0cHV0cyB0aGUgJ3R5cGUnIGF0dHJpYnV0ZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSA8c2VlIGNyZWY9IlN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uSnNvbi5Kc29uUmVhZGVyV3JpdGVyRmFjdG9yeSI+SnNvblJlYWRlcldyaXRlckZhY3Rvcnk8L3NlZT4gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPiBUaGlzIG9wdGlvbiBtdXN0LCBieSBuZXNzZXNzaXR5LCBhbHNvIGVuYWJsZSBOZXN0ZWRBcnJheUl0ZW1zIDwvcmVtYXJrcz4NCisgICAgICAgIE91dHB1dEpzb25UeXBlcyA9IDB4OCwNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0Fic3RyYWN0TWVzc2FnZVRlc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0Fic3RyYWN0TWVzc2FnZVRlc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3OTNhZQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQWJzdHJhY3RNZXNzYWdlVGVzdC5jcwpAQCAtMCwwICsxLDUyMSBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3M7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIFtUZXN0Q2xhc3NdDQorICAgIHB1YmxpYyBjbGFzcyBBYnN0cmFjdE1lc3NhZ2VUZXN0DQorICAgIHsNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgbWVzc2FnZSA9DQorICAgICAgICAgICAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoVGVzdFV0aWwuR2V0QWxsU2V0KCkpKS5DbGVhcigpLkJ1aWxkKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Q2xlYXIoKFRlc3RBbGxUeXBlcykgbWVzc2FnZS5XcmFwcGVkTWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIENvcHkoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgbWVzc2FnZSA9DQorICAgICAgICAgICAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKSkuTWVyZ2VGcm9tKFRlc3RVdGlsLkdldEFsbFNldCgpKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFsbEZpZWxkc1NldCgoVGVzdEFsbFR5cGVzKSBtZXNzYWdlLldyYXBwZWRNZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlQW5kQnVpbGQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFNlcmlhbGl6ZWRTaXplKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLkdldEFsbFNldCgpOw0KKyAgICAgICAgICAgIElNZXNzYWdlIGFic3RyYWN0TWVzc2FnZSA9IG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyKFRlc3RVdGlsLkdldEFsbFNldCgpKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZS5TZXJpYWxpemVkU2l6ZSwgYWJzdHJhY3RNZXNzYWdlLlNlcmlhbGl6ZWRTaXplKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgU2VyaWFsaXphdGlvbigpDQorICAgICAgICB7DQorICAgICAgICAgICAgSU1lc3NhZ2UgYWJzdHJhY3RNZXNzYWdlID0gbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIoVGVzdFV0aWwuR2V0QWxsU2V0KCkpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFsbEZpZWxkc1NldChUZXN0QWxsVHlwZXMuUGFyc2VGcm9tKGFic3RyYWN0TWVzc2FnZS5Ub0J5dGVTdHJpbmcoKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0VXRpbC5HZXRBbGxTZXQoKS5Ub0J5dGVTdHJpbmcoKSwgYWJzdHJhY3RNZXNzYWdlLlRvQnl0ZVN0cmluZygpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUGFyc2luZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgSUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKSk7DQorICAgICAgICAgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBtZXNzYWdlID0NCisgICAgICAgICAgICAgICAgKEFic3RyYWN0TWVzc2FnZVdyYXBwZXIpIGJ1aWxkZXIuV2Vha01lcmdlRnJvbShUZXN0VXRpbC5HZXRBbGxTZXQoKS5Ub0J5dGVTdHJpbmcoKSkuV2Vha0J1aWxkKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QWxsRmllbGRzU2V0KChUZXN0QWxsVHlwZXMpIG1lc3NhZ2UuV3JhcHBlZE1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQYWNrZWRTZXJpYWxpemF0aW9uKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJTWVzc2FnZSBhYnN0cmFjdE1lc3NhZ2UgPSBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcihUZXN0VXRpbC5HZXRQYWNrZWRTZXQoKSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0UGFja2VkRmllbGRzU2V0KFRlc3RQYWNrZWRUeXBlcy5QYXJzZUZyb20oYWJzdHJhY3RNZXNzYWdlLlRvQnl0ZVN0cmluZygpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RVdGlsLkdldFBhY2tlZFNldCgpLlRvQnl0ZVN0cmluZygpLCBhYnN0cmFjdE1lc3NhZ2UuVG9CeXRlU3RyaW5nKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQYWNrZWRQYXJzaW5nKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdFBhY2tlZFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKSk7DQorICAgICAgICAgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBtZXNzYWdlID0gYnVpbGRlci5NZXJnZUZyb20oVGVzdFV0aWwuR2V0UGFja2VkU2V0KCkuVG9CeXRlU3RyaW5nKCkpLkJ1aWxkKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0UGFja2VkRmllbGRzU2V0KChUZXN0UGFja2VkVHlwZXMpbWVzc2FnZS5XcmFwcGVkTWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFVucGFja2VkUGFyc2luZ09mUGFja2VkSW5wdXQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IFRlc3RVdGlsLkdldFBhY2tlZFNldCgpLlRvQnl0ZUFycmF5KCk7DQorICAgICAgICAgICAgVGVzdFVucGFja2VkVHlwZXMgbWVzc2FnZSA9IFRlc3RVbnBhY2tlZFR5cGVzLlBhcnNlRnJvbShieXRlcyk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0VW5wYWNrZWRGaWVsZHNTZXQobWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFBhY2tlZFBhcnNpbmdPZlVucGFja2VkSW5wdXQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IFRlc3RVbnBhY2tlZFR5cGVzLlBhcnNlRnJvbShUZXN0VXRpbC5HZXRQYWNrZWRTZXQoKS5Ub0J5dGVBcnJheSgpKS5Ub0J5dGVBcnJheSgpOw0KKyAgICAgICAgICAgIFRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlID0gVGVzdFBhY2tlZFR5cGVzLlBhcnNlRnJvbShieXRlcyk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0UGFja2VkRmllbGRzU2V0KG1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBVbnBhY2tlZFBhcnNpbmdPZlBhY2tlZElucHV0RXh0ZW5zaW9ucygpDQorICAgICAgICB7DQorICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gVGVzdFV0aWwuR2V0UGFja2VkU2V0KCkuVG9CeXRlQXJyYXkoKTsNCisgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICAgICAgVW5pdFRlc3RQcm90b0ZpbGUuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgICAgICBVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgICAgIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgbWVzc2FnZSA9IFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMuUGFyc2VGcm9tKGJ5dGVzLCByZWdpc3RyeSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0VW5wYWNrZWRFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQYWNrZWRQYXJzaW5nT2ZVbnBhY2tlZElucHV0RXh0ZW5zaW9ucygpDQorICAgICAgICB7DQorICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gVGVzdFVucGFja2VkVHlwZXMuUGFyc2VGcm9tKFRlc3RVdGlsLkdldFBhY2tlZFNldCgpLlRvQnl0ZUFycmF5KCkpLlRvQnl0ZUFycmF5KCk7DQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFVuaXRUZXN0UHJvdG9GaWxlLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICAgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnMgbWVzc2FnZSA9IFRlc3RQYWNrZWRFeHRlbnNpb25zLlBhcnNlRnJvbShieXRlcywgcmVnaXN0cnkpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydFBhY2tlZEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIE9wdGltaXplZEZvclNpemUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIFdlJ3JlIG1vc3RseSBvbmx5IENoZWNraW5nIHRoYXQgdGhpcyBjbGFzcyB3YXMgY29tcGlsZWQgc3VjY2Vzc2Z1bGx5Lg0KKyAgICAgICAgICAgIFRlc3RPcHRpbWl6ZWRGb3JTaXplIG1lc3NhZ2UgPSBUZXN0T3B0aW1pemVkRm9yU2l6ZS5DcmVhdGVCdWlsZGVyKCkuU2V0SSgxKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UgPSBUZXN0T3B0aW1pemVkRm9yU2l6ZS5QYXJzZUZyb20obWVzc2FnZS5Ub0J5dGVTdHJpbmcoKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuU2VyaWFsaXplZFNpemUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisgICAgICAgIC8vIFRlc3RzIGZvciBpc0luaXRpYWxpemVkKCkuDQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0UmVxdWlyZWQgVGVzdFJlcXVpcmVkVW5pbml0aWFsaXplZCA9IFRlc3RSZXF1aXJlZC5EZWZhdWx0SW5zdGFuY2U7DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0UmVxdWlyZWQgVGVzdFJlcXVpcmVkSW5pdGlhbGl6ZWQgPQ0KKyAgICAgICAgICAgIFRlc3RSZXF1aXJlZC5DcmVhdGVCdWlsZGVyKCkuU2V0QSgxKS5TZXRCKDIpLlNldEMoMykuQnVpbGQoKTsNCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgSXNJbml0aWFsaXplZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFJlcXVpcmVkLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RSZXF1aXJlZC5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyIGFic3RyYWN0QnVpbGRlciA9IG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoYnVpbGRlcik7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYWJzdHJhY3RCdWlsZGVyLklzSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuQSA9IDE7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYWJzdHJhY3RCdWlsZGVyLklzSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuQiA9IDE7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYWJzdHJhY3RCdWlsZGVyLklzSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuQyA9IDE7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhYnN0cmFjdEJ1aWxkZXIuSXNJbml0aWFsaXplZCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEZvcmVpZ25Jc0luaXRpYWxpemVkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0UmVxdWlyZWRGb3JlaWduLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RSZXF1aXJlZEZvcmVpZ24uQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBhYnN0cmFjdEJ1aWxkZXIgPSBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyKGJ1aWxkZXIpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoYWJzdHJhY3RCdWlsZGVyLklzSW5pdGlhbGl6ZWQpOw0KKw0KKyAgICAgICAgICAgIGJ1aWxkZXIuU2V0T3B0aW9uYWxNZXNzYWdlKFRlc3RSZXF1aXJlZFVuaW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGFic3RyYWN0QnVpbGRlci5Jc0luaXRpYWxpemVkKTsNCisNCisgICAgICAgICAgICBidWlsZGVyLlNldE9wdGlvbmFsTWVzc2FnZShUZXN0UmVxdWlyZWRJbml0aWFsaXplZCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhYnN0cmFjdEJ1aWxkZXIuSXNJbml0aWFsaXplZCk7DQorDQorICAgICAgICAgICAgYnVpbGRlci5BZGRSZXBlYXRlZE1lc3NhZ2UoVGVzdFJlcXVpcmVkVW5pbml0aWFsaXplZCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYWJzdHJhY3RCdWlsZGVyLklzSW5pdGlhbGl6ZWQpOw0KKw0KKyAgICAgICAgICAgIGJ1aWxkZXIuU2V0UmVwZWF0ZWRNZXNzYWdlKDAsIFRlc3RSZXF1aXJlZEluaXRpYWxpemVkKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGFic3RyYWN0QnVpbGRlci5Jc0luaXRpYWxpemVkKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorICAgICAgICAvLyBUZXN0cyBmb3IgbWVyZ2VGcm9tDQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0QWxsVHlwZXMgTWVyZ2VTb3VyY2UgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgLlNldE9wdGlvbmFsSW50MzIoMSkNCisgICAgICAgICAgICAuU2V0T3B0aW9uYWxTdHJpbmcoImZvbyIpDQorICAgICAgICAgICAgLlNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKQ0KKyAgICAgICAgICAgIC5BZGRSZXBlYXRlZFN0cmluZygiYmFyIikNCisgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RBbGxUeXBlcyBNZXJnZURlc3QgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgLlNldE9wdGlvbmFsSW50NjQoMikNCisgICAgICAgICAgICAuU2V0T3B0aW9uYWxTdHJpbmcoImJheiIpDQorICAgICAgICAgICAgLlNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEMoMykuQnVpbGQoKSkNCisgICAgICAgICAgICAuQWRkUmVwZWF0ZWRTdHJpbmcoInF1eCIpDQorICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBNZXJnZVJlc3VsdFRleHQgPSAib3B0aW9uYWxfaW50MzI6IDFcbiIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsX2ludDY0OiAyXG4iICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25hbF9zdHJpbmc6IFwiZm9vXCJcbiIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSB7XG4iICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGM6IDNcbiIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJxdXhcIlxuIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcImJhclwiXG4iOw0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgcmVzdWx0ID0gKEFic3RyYWN0TWVzc2FnZVdyYXBwZXIpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyKFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKE1lcmdlRGVzdCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk1lcmdlRnJvbShNZXJnZVNvdXJjZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoTWVyZ2VSZXN1bHRUZXh0LCByZXN1bHQuVG9TdHJpbmcoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAgICAgICAgLy8gVGVzdHMgZm9yIGVxdWFscyBhbmQgaGFzaENvZGUNCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRXF1YWxzQW5kSGFzaENvZGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBhID0gVGVzdFV0aWwuR2V0QWxsU2V0KCk7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIGIgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpLkJ1aWxkKCk7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIGMgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcihiKS5BZGRSZXBlYXRlZFN0cmluZygieCIpLkJ1aWxkKCk7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIGQgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcihjKS5BZGRSZXBlYXRlZFN0cmluZygieSIpLkJ1aWxkKCk7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMgZSA9IFRlc3RVdGlsLkdldEFsbEV4dGVuc2lvbnNTZXQoKTsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucyBmID0gVGVzdEFsbEV4dGVuc2lvbnMuQ3JlYXRlQnVpbGRlcihlKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDk5OSkuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBDaGVja0VxdWFsc0lzQ29uc2lzdGVudChhKTsNCisgICAgICAgICAgICBDaGVja0VxdWFsc0lzQ29uc2lzdGVudChiKTsNCisgICAgICAgICAgICBDaGVja0VxdWFsc0lzQ29uc2lzdGVudChjKTsNCisgICAgICAgICAgICBDaGVja0VxdWFsc0lzQ29uc2lzdGVudChkKTsNCisgICAgICAgICAgICBDaGVja0VxdWFsc0lzQ29uc2lzdGVudChlKTsNCisgICAgICAgICAgICBDaGVja0VxdWFsc0lzQ29uc2lzdGVudChmKTsNCisNCisgICAgICAgICAgICBDaGVja05vdEVxdWFsKGEsIGIpOw0KKyAgICAgICAgICAgIENoZWNrTm90RXF1YWwoYSwgYyk7DQorICAgICAgICAgICAgQ2hlY2tOb3RFcXVhbChhLCBkKTsNCisgICAgICAgICAgICBDaGVja05vdEVxdWFsKGEsIGUpOw0KKyAgICAgICAgICAgIENoZWNrTm90RXF1YWwoYSwgZik7DQorDQorICAgICAgICAgICAgQ2hlY2tOb3RFcXVhbChiLCBjKTsNCisgICAgICAgICAgICBDaGVja05vdEVxdWFsKGIsIGQpOw0KKyAgICAgICAgICAgIENoZWNrTm90RXF1YWwoYiwgZSk7DQorICAgICAgICAgICAgQ2hlY2tOb3RFcXVhbChiLCBmKTsNCisNCisgICAgICAgICAgICBDaGVja05vdEVxdWFsKGMsIGQpOw0KKyAgICAgICAgICAgIENoZWNrTm90RXF1YWwoYywgZSk7DQorICAgICAgICAgICAgQ2hlY2tOb3RFcXVhbChjLCBmKTsNCisNCisgICAgICAgICAgICBDaGVja05vdEVxdWFsKGQsIGUpOw0KKyAgICAgICAgICAgIENoZWNrTm90RXF1YWwoZCwgZik7DQorDQorICAgICAgICAgICAgQ2hlY2tOb3RFcXVhbChlLCBmKTsNCisNCisgICAgICAgICAgICAvLyBEZXNlcmlhbGl6aW5nIGludG8gdGhlIFRlc3RFbXB0eU1lc3NhZ2Ugc3VjaCB0aGF0IGV2ZXJ5IGZpZWxkIGlzIGFuIFVua25vd25GaWVsZFNldC5GaWVsZA0KKyAgICAgICAgICAgIFRlc3RFbXB0eU1lc3NhZ2UgZVVua25vd25GaWVsZHMgPSBUZXN0RW1wdHlNZXNzYWdlLlBhcnNlRnJvbShlLlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgICAgIFRlc3RFbXB0eU1lc3NhZ2UgZlVua25vd25GaWVsZHMgPSBUZXN0RW1wdHlNZXNzYWdlLlBhcnNlRnJvbShmLlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgICAgIENoZWNrTm90RXF1YWwoZVVua25vd25GaWVsZHMsIGZVbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICBDaGVja0VxdWFsc0lzQ29uc2lzdGVudChlVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgQ2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoZlVua25vd25GaWVsZHMpOw0KKw0KKyAgICAgICAgICAgIC8vIFN1YnNlcWVudCByZWNvbnN0aXR1dGlvbnMgc2hvdWxkIGJlIGlkZW50aWNhbA0KKyAgICAgICAgICAgIFRlc3RFbXB0eU1lc3NhZ2UgZVVua25vd25GaWVsZHMyID0gVGVzdEVtcHR5TWVzc2FnZS5QYXJzZUZyb20oZS5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgICAgICBDaGVja0VxdWFsc0lzQ29uc2lzdGVudChlVW5rbm93bkZpZWxkcywgZVVua25vd25GaWVsZHMyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHByb3RvcyBhcmUgZXF1YWwgYW5kIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2RlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoSU1lc3NhZ2UgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBPYmplY3Qgc2hvdWxkIGJlIGVxdWFsIHRvIGl0c2VsZi4NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZSwgbWVzc2FnZSk7DQorDQorICAgICAgICAgICAgLy8gT2JqZWN0IHNob3VsZCBiZSBlcXVhbCB0byBhIGR5bmFtaWMgY29weSBvZiBpdHNlbGYuDQorICAgICAgICAgICAgRHluYW1pY01lc3NhZ2UgZHluYW1pYyA9IER5bmFtaWNNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIobWVzc2FnZSkuQnVpbGQoKTsNCisgICAgICAgICAgICBDaGVja0VxdWFsc0lzQ29uc2lzdGVudChtZXNzYWdlLCBkeW5hbWljKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHByb3RvcyBhcmUgZXF1YWwgYW5kIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2RlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoSU1lc3NhZ2UgbWVzc2FnZTEsIElNZXNzYWdlIG1lc3NhZ2UyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlMSwgbWVzc2FnZTIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlMiwgbWVzc2FnZTEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlMi5HZXRIYXNoQ29kZSgpLCBtZXNzYWdlMS5HZXRIYXNoQ29kZSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHByb3RvcyBhcmUgbm90IGVxdWFsIGFuZCBoYXZlIGRpZmZlcmVudCBoYXNoIGNvZGVzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz4NCisgICAgICAgIC8vLyBJdCdzIHZhbGlkIGZvciBub24tZXF1YWwgb2JqZWN0cyB0byBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZSwgc28NCisgICAgICAgIC8vLyB0aGlzIHRlc3QgaXMgc3RyaWN0ZXIgdGhhbiBpdCBuZWVkcyB0byBiZS4gSG93ZXZlciwgdGhpcyBzaG91bGQgaGFwcGVuDQorICAgICAgICAvLy8gcmVsYXRpdmVseSByYXJlbHkuIChJZiB0aGlzIHRlc3QgZmFpbHMsIGl0J3MgcHJvYmFibHkgc3RpbGwgZHVlIHRvIGEgYnVnLikNCisgICAgICAgIC8vLyA8L3JlbWFya3M+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENoZWNrTm90RXF1YWwoSU1lc3NhZ2UgbTEsIElNZXNzYWdlIG0yKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFN0cmluZyBlcXVhbHNFcnJvciA9IHN0cmluZy5Gb3JtYXQoInswfSBzaG91bGQgbm90IGJlIGVxdWFsIHRvIHsxfSIsIG0xLCBtMik7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobTEuRXF1YWxzKG0yKSwgZXF1YWxzRXJyb3IpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG0yLkVxdWFscyhtMSksIGVxdWFsc0Vycm9yKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtMS5HZXRIYXNoQ29kZSgpID09IG0yLkdldEhhc2hDb2RlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgiezB9IHNob3VsZCBoYXZlIGEgZGlmZmVyZW50IGhhc2ggY29kZSBmcm9tIHsxfSIsIG0xLCBtMikpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlIGFuZCB3cmFwcyBzb21lIG90aGVyIG1lc3NhZ2Ugb2JqZWN0LiAgVGhlIG1ldGhvZHMNCisgICAgICAgIC8vLyBvZiB0aGUgTWVzc2FnZSBpbnRlcmZhY2Ugd2hpY2ggYXJlbid0IGV4cGxpY2l0bHkgaW1wbGVtZW50ZWQgYnkNCisgICAgICAgIC8vLyBBYnN0cmFjdE1lc3NhZ2UgYXJlIGZvcndhcmRlZCB0byB0aGUgd3JhcHBlZCBvYmplY3QuICBUaGlzIGFsbG93cyB1cyB0bw0KKyAgICAgICAgLy8vIHRlc3QgdGhhdCBBYnN0cmFjdE1lc3NhZ2UncyBpbXBsZW1lbnRhdGlvbnMgd29yayBldmVuIGlmIHRoZSB3cmFwcGVkDQorICAgICAgICAvLy8gb2JqZWN0IGRvZXMgbm90IHVzZSB0aGVtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgY2xhc3MgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciA6IEFic3RyYWN0TWVzc2FnZTxBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLCBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXI+DQorICAgICAgICB7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJTWVzc2FnZSB3cmFwcGVkTWVzc2FnZTsNCisNCisgICAgICAgICAgICBwdWJsaWMgSU1lc3NhZ2UgV3JhcHBlZE1lc3NhZ2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiB3cmFwcGVkTWVzc2FnZTsgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcihJTWVzc2FnZSB3cmFwcGVkTWVzc2FnZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZE1lc3NhZ2UgPSB3cmFwcGVkTWVzc2FnZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIE1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gd3JhcHBlZE1lc3NhZ2UuRGVzY3JpcHRvckZvclR5cGU7IH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyKHdyYXBwZWRNZXNzYWdlLldlYWtEZWZhdWx0SW5zdGFuY2VGb3JUeXBlKTsgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSURpY3Rpb25hcnk8RmllbGREZXNjcmlwdG9yLCBvYmplY3Q+IEFsbEZpZWxkcw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHdyYXBwZWRNZXNzYWdlLkFsbEZpZWxkczsgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBIYXNGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZE1lc3NhZ2UuSGFzRmllbGQoZmllbGQpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IHRoaXNbRmllbGREZXNjcmlwdG9yIGZpZWxkXQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHdyYXBwZWRNZXNzYWdlW2ZpZWxkXTsgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IHRoaXNbRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXhdDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gd3JhcHBlZE1lc3NhZ2VbZmllbGQsIGluZGV4XTsgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldFJlcGVhdGVkRmllbGRDb3VudChGaWVsZERlc2NyaXB0b3IgZmllbGQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZE1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIFVua25vd25GaWVsZFNldCBVbmtub3duRmllbGRzDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gd3JhcHBlZE1lc3NhZ2UuVW5rbm93bkZpZWxkczsgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIod3JhcHBlZE1lc3NhZ2UuV2Vha0NyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHdyYXBwZWRNZXNzYWdlLldlYWtUb0J1aWxkZXIoKSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGludGVybmFsIGNsYXNzIEJ1aWxkZXIgOiBBYnN0cmFjdEJ1aWxkZXI8QWJzdHJhY3RNZXNzYWdlV3JhcHBlciwgQnVpbGRlcj4NCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUJ1aWxkZXIgd3JhcHBlZEJ1aWxkZXI7DQorDQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihJQnVpbGRlciB3cmFwcGVkQnVpbGRlcikNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkQnVpbGRlciA9IHdyYXBwZWRCdWlsZGVyOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIG90aGVyKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB3cmFwcGVkQnVpbGRlci5XZWFrTWVyZ2VGcm9tKG90aGVyLndyYXBwZWRNZXNzYWdlKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHdyYXBwZWRCdWlsZGVyLklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSURpY3Rpb25hcnk8RmllbGREZXNjcmlwdG9yLCBvYmplY3Q+IEFsbEZpZWxkcw0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gd3JhcHBlZEJ1aWxkZXIuQWxsRmllbGRzOyB9DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCB0aGlzW0ZpZWxkRGVzY3JpcHRvciBmaWVsZF0NCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHdyYXBwZWRCdWlsZGVyW2ZpZWxkXTsgfQ0KKyAgICAgICAgICAgICAgICAgICAgc2V0IHsgd3JhcHBlZEJ1aWxkZXJbZmllbGRdID0gdmFsdWU7IH0NCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgTWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHdyYXBwZWRCdWlsZGVyLkRlc2NyaXB0b3JGb3JUeXBlOyB9DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRSZXBlYXRlZEZpZWxkQ291bnQoRmllbGREZXNjcmlwdG9yIGZpZWxkKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZEJ1aWxkZXIuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IHRoaXNbRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXhdDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiB3cmFwcGVkQnVpbGRlcltmaWVsZCwgaW5kZXhdOyB9DQorICAgICAgICAgICAgICAgICAgICBzZXQgeyB3cmFwcGVkQnVpbGRlcltmaWVsZCwgaW5kZXhdID0gdmFsdWU7IH0NCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBIYXNGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkQnVpbGRlci5IYXNGaWVsZChmaWVsZCk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIFVua25vd25GaWVsZFNldCBVbmtub3duRmllbGRzDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiB3cmFwcGVkQnVpbGRlci5Vbmtub3duRmllbGRzOyB9DQorICAgICAgICAgICAgICAgICAgICBzZXQgeyB3cmFwcGVkQnVpbGRlci5Vbmtub3duRmllbGRzID0gdmFsdWU7IH0NCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBCdWlsZCgpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcih3cmFwcGVkQnVpbGRlci5XZWFrQnVpbGQoKSk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgQnVpbGRQYXJ0aWFsKCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyKHdyYXBwZWRCdWlsZGVyLldlYWtCdWlsZFBhcnRpYWwoKSk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIod3JhcHBlZEJ1aWxkZXIuV2Vha0Nsb25lKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIERlZmF1bHRJbnN0YW5jZUZvclR5cGUNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyKHdyYXBwZWRCdWlsZGVyLldlYWtEZWZhdWx0SW5zdGFuY2VGb3JUeXBlKTsgfQ0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB3cmFwcGVkQnVpbGRlci5XZWFrQ2xlYXJGaWVsZChmaWVsZCk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBBZGRSZXBlYXRlZEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgb2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB3cmFwcGVkQnVpbGRlci5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIElCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRCdWlsZGVyLkNyZWF0ZUJ1aWxkZXJGb3JGaWVsZChmaWVsZCk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oSU1lc3NhZ2Ugb3RoZXIpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRCdWlsZGVyLldlYWtNZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKElDb2RlZElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEJ1aWxkZXIuV2Vha01lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9BcHAueGFtbCBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQXBwLnhhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmMWYyZQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQXBwLnhhbWwKQEAgLTAsMCArMSw4IEBACivvu788QXBwbGljYXRpb24geG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2luZngvMjAwNi94YW1sL3ByZXNlbnRhdGlvbiINCisgICAgICAgICAgICAgeG1sbnM6eD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93aW5meC8yMDA2L3hhbWwiIA0KKyAgICAgICAgICAgICB4OkNsYXNzPSJQcm90b2NvbEJ1ZmZlcnMuU2lsdmVybGlnaHRUZXN0LkFwcCINCisgICAgICAgICAgICAgPg0KKyAgICA8QXBwbGljYXRpb24uUmVzb3VyY2VzPg0KKyAgICAgICAgDQorICAgIDwvQXBwbGljYXRpb24uUmVzb3VyY2VzPg0KKzwvQXBwbGljYXRpb24+DQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9BcHAueGFtbC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQXBwLnhhbWwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5ZmQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQXBwLnhhbWwuY3MKQEAgLTAsMCArMSw2MCBAQAor77u/dXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5XaW5kb3dzOw0KK3VzaW5nIE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBwdWJsaWMgcGFydGlhbCBjbGFzcyBBcHAgOiBBcHBsaWNhdGlvbg0KKyAgICB7DQorDQorICAgICAgICBwdWJsaWMgQXBwKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aGlzLlN0YXJ0dXAgKz0gdGhpcy5BcHBsaWNhdGlvbl9TdGFydHVwOw0KKyAgICAgICAgICAgIHRoaXMuRXhpdCArPSB0aGlzLkFwcGxpY2F0aW9uX0V4aXQ7DQorICAgICAgICAgICAgdGhpcy5VbmhhbmRsZWRFeGNlcHRpb24gKz0gdGhpcy5BcHBsaWNhdGlvbl9VbmhhbmRsZWRFeGNlcHRpb247DQorDQorICAgICAgICAgICAgLy9Jbml0aWFsaXplQ29tcG9uZW50KCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHZvaWQgQXBwbGljYXRpb25fU3RhcnR1cChvYmplY3Qgc2VuZGVyLCBTdGFydHVwRXZlbnRBcmdzIGUpDQorICAgICAgICB7DQorICAgICAgICAgICAgdGhpcy5Sb290VmlzdWFsID0gVW5pdFRlc3RTeXN0ZW0uQ3JlYXRlVGVzdFBhZ2UoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgdm9pZCBBcHBsaWNhdGlvbl9FeGl0KG9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBlKQ0KKyAgICAgICAgew0KKw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFwcGxpY2F0aW9uX1VuaGFuZGxlZEV4Y2VwdGlvbihvYmplY3Qgc2VuZGVyLCBBcHBsaWNhdGlvblVuaGFuZGxlZEV4Y2VwdGlvbkV2ZW50QXJncyBlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIElmIHRoZSBhcHAgaXMgcnVubmluZyBvdXRzaWRlIG9mIHRoZSBkZWJ1Z2dlciB0aGVuIHJlcG9ydCB0aGUgZXhjZXB0aW9uIHVzaW5nDQorICAgICAgICAgICAgLy8gdGhlIGJyb3dzZXIncyBleGNlcHRpb24gbWVjaGFuaXNtLiBPbiBJRSB0aGlzIHdpbGwgZGlzcGxheSBpdCBhIHllbGxvdyBhbGVydCANCisgICAgICAgICAgICAvLyBpY29uIGluIHRoZSBzdGF0dXMgYmFyIGFuZCBGaXJlZm94IHdpbGwgZGlzcGxheSBhIHNjcmlwdCBlcnJvci4NCisgICAgICAgICAgICBpZiAoIVN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlci5Jc0F0dGFjaGVkKQ0KKyAgICAgICAgICAgIHsNCisNCisgICAgICAgICAgICAgICAgLy8gTk9URTogVGhpcyB3aWxsIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBjb250aW51ZSBydW5uaW5nIGFmdGVyIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd24NCisgICAgICAgICAgICAgICAgLy8gYnV0IG5vdCBoYW5kbGVkLiANCisgICAgICAgICAgICAgICAgLy8gRm9yIHByb2R1Y3Rpb24gYXBwbGljYXRpb25zIHRoaXMgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggc29tZXRoaW5nIHRoYXQgd2lsbCANCisgICAgICAgICAgICAgICAgLy8gcmVwb3J0IHRoZSBlcnJvciB0byB0aGUgd2Vic2l0ZSBhbmQgc3RvcCB0aGUgYXBwbGljYXRpb24uDQorICAgICAgICAgICAgICAgIGUuSGFuZGxlZCA9IHRydWU7DQorICAgICAgICAgICAgICAgIERlcGxveW1lbnQuQ3VycmVudC5EaXNwYXRjaGVyLkJlZ2luSW52b2tlKA0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEV2ZW50SGFuZGxlcjxBcHBsaWNhdGlvblVuaGFuZGxlZEV4Y2VwdGlvbkV2ZW50QXJncz4oUmVwb3J0RXJyb3JUb0RPTSksIA0KKyAgICAgICAgICAgICAgICAgICAgbmV3IG9iamVjdFtdIHsgc2VuZGVyLCBlIH0gKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIHZvaWQgUmVwb3J0RXJyb3JUb0RPTShvYmplY3Qgc2VuZGVyLCBBcHBsaWNhdGlvblVuaGFuZGxlZEV4Y2VwdGlvbkV2ZW50QXJncyBlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3RyaW5nIGVycm9yTXNnID0gZS5FeGNlcHRpb25PYmplY3QuTWVzc2FnZSArIGUuRXhjZXB0aW9uT2JqZWN0LlN0YWNrVHJhY2U7DQorICAgICAgICAgICAgICAgIGVycm9yTXNnID0gZXJyb3JNc2cuUmVwbGFjZSgnIicsICdcJycpLlJlcGxhY2UoIlxyXG4iLCBAIlxuIik7DQorDQorICAgICAgICAgICAgICAgIFN5c3RlbS5XaW5kb3dzLkJyb3dzZXIuSHRtbFBhZ2UuV2luZG93LkV2YWwoInRocm93IG5ldyBFcnJvcihcIlVuaGFuZGxlZCBFcnJvciBpbiBTaWx2ZXJsaWdodCAyIEFwcGxpY2F0aW9uICIgKyBlcnJvck1zZyArICJcIik7Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0J5dGVTdHJpbmdUZXN0LmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9CeXRlU3RyaW5nVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDMzMDdhCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9CeXRlU3RyaW5nVGVzdC5jcwpAQCAtMCwwICsxLDE0OCBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIEJ5dGVTdHJpbmdUZXN0DQorICAgIHsNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRW1wdHlCeXRlU3RyaW5nSGFzWmVyb1NpemUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBCeXRlU3RyaW5nLkVtcHR5Lkxlbmd0aCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIENvcHlGcm9tU3RyaW5nV2l0aEV4cGxpY2l0RW5jb2RpbmcoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgYnMgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKCJBQiIsIEVuY29kaW5nLlVuaWNvZGUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LCBicy5MZW5ndGgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2NSwgYnNbMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBic1sxXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDY2LCBic1syXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIGJzWzNdKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgSXNFbXB0eVdoZW5FbXB0eSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShCeXRlU3RyaW5nLkNvcHlGcm9tVXRmOCgiIikuSXNFbXB0eSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIElzRW1wdHlXaGVuTm90RW1wdHkoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKEJ5dGVTdHJpbmcuQ29weUZyb21VdGY4KCJYIikuSXNFbXB0eSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIENvcHlGcm9tQnl0ZUFycmF5Q29waWVzQ29udGVudHMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbMV07DQorICAgICAgICAgICAgZGF0YVswXSA9IDEwOw0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgYnMgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKGRhdGEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMCwgYnNbMF0pOw0KKyAgICAgICAgICAgIGRhdGFbMF0gPSA1Ow0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMCwgYnNbMF0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUb0J5dGVBcnJheUNvcGllc0NvbnRlbnRzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBCeXRlU3RyaW5nIGJzID0gQnl0ZVN0cmluZy5Db3B5RnJvbVV0ZjgoIkhlbGxvIik7DQorICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBicy5Ub0J5dGVBcnJheSgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoYnl0ZSknSCcsIGRhdGFbMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoYnl0ZSknSCcsIGJzWzBdKTsNCisgICAgICAgICAgICBkYXRhWzBdID0gMDsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgZGF0YVswXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKChieXRlKSdIJywgYnNbMF0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBDb3B5RnJvbVV0ZjhVc2VzVXRmOCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQnl0ZVN0cmluZyBicyA9IEJ5dGVTdHJpbmcuQ29weUZyb21VdGY4KCJcdTIwYWMiKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgYnMuTGVuZ3RoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHhlMiwgYnNbMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgweDgyLCBic1sxXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4YWMsIGJzWzJdKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgQ29weUZyb21Qb3J0aW9uKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10gezAsIDEsIDIsIDMsIDQsIDUsIDZ9Ow0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgYnMgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKGRhdGEsIDIsIDMpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBicy5MZW5ndGgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBic1swXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIGJzWzFdKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVG9TdHJpbmdVdGY4KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBCeXRlU3RyaW5nIGJzID0gQnl0ZVN0cmluZy5Db3B5RnJvbVV0ZjgoIlx1MjBhYyIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiXHUyMGFjIiwgYnMuVG9TdHJpbmdVdGY4KCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUb1N0cmluZ1dpdGhFeHBsaWNpdEVuY29kaW5nKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBCeXRlU3RyaW5nIGJzID0gQnl0ZVN0cmluZy5Db3B5RnJvbSgiXHUyMGFjIiwgRW5jb2RpbmcuVW5pY29kZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJcdTIwYWMiLCBicy5Ub1N0cmluZyhFbmNvZGluZy5Vbmljb2RlKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEZyb21CYXNlNjRfV2l0aFRleHQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7MCwgMSwgMiwgMywgNCwgNSwgNn07DQorICAgICAgICAgICAgc3RyaW5nIGJhc2U2NCA9IENvbnZlcnQuVG9CYXNlNjRTdHJpbmcoZGF0YSk7DQorICAgICAgICAgICAgQnl0ZVN0cmluZyBicyA9IEJ5dGVTdHJpbmcuRnJvbUJhc2U2NChiYXNlNjQpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwoZGF0YSwgYnMuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEZyb21CYXNlNjRfRW1wdHkoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIE9wdGltaXphdGlvbiB3aGljaCBhbHNvIGZpeGVzIGlzc3VlIDYxLg0KKyAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKEJ5dGVTdHJpbmcuRW1wdHksIEJ5dGVTdHJpbmcuRnJvbUJhc2U2NCgiIikpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQ1NoYXJwT3B0aW9uc1Rlc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NTaGFycE9wdGlvbnNUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MmQ5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NTaGFycE9wdGlvbnNUZXN0LmNzCkBAIC0wLDAgKzEsMTI3IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIFtUZXN0Q2xhc3NdDQorICAgIHB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yVXRpbFRlc3QNCisgICAgew0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBFeHBsaWNpdE5hbWVzcGFjZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBwcm90byA9IG5ldyBGaWxlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gIngiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2UgPSAicGFjayIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyA9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3B0aW9ucy5CdWlsZGVyKCkuU2V0RXh0ZW5zaW9uKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NoYXJwT3B0aW9ucy5DU2hhcnBGaWxlT3B0aW9ucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDU2hhcnBGaWxlT3B0aW9ucy5CdWlsZGVyIHtOYW1lc3BhY2UgPSAiRm9vLkJhciJ9LkJ1aWxkKCkpLg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZCgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LkJ1aWxkKCk7DQorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IEZpbGVEZXNjcmlwdG9yLkJ1aWxkRnJvbShwcm90bywgbnVsbCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGb28uQmFyIiwgZGVzY3JpcHRvci5DU2hhcnBPcHRpb25zLk5hbWVzcGFjZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIE5vTmFtZXNwYWNlRmFsbHNCYWNrVG9QYWNrYWdlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvID0gbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG8uQnVpbGRlciB7TmFtZSA9ICJ4IiwgUGFja2FnZSA9ICJwYWNrIn0uQnVpbGQoKTsNCisgICAgICAgICAgICBGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gRmlsZURlc2NyaXB0b3IuQnVpbGRGcm9tKHByb3RvLCBudWxsKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInBhY2siLCBkZXNjcmlwdG9yLkNTaGFycE9wdGlvbnMuTmFtZXNwYWNlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgTm9OYW1lc3BhY2VPclBhY2thZ2VGYWxsc0JhY2tUb0VtcHR5U3RyaW5nKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvID0gbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG8uQnVpbGRlciB7TmFtZSA9ICJ4In0uQnVpbGQoKTsNCisgICAgICAgICAgICBGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gRmlsZURlc2NyaXB0b3IuQnVpbGRGcm9tKHByb3RvLCBudWxsKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiIsIGRlc2NyaXB0b3IuQ1NoYXJwT3B0aW9ucy5OYW1lc3BhY2UpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBFeHBsaWNpdGx5TmFtZWRGaWxlQ2xhc3MoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG8gPSBuZXcgRmlsZURlc2NyaXB0b3JQcm90by5CdWlsZGVyDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJ4IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zID0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPcHRpb25zLkJ1aWxkZXIoKS5TZXRFeHRlbnNpb24oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU2hhcnBPcHRpb25zLkNTaGFycEZpbGVPcHRpb25zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENTaGFycEZpbGVPcHRpb25zLkJ1aWxkZXIge1VtYnJlbGxhQ2xhc3NuYW1lID0gIkZvbyJ9LkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LkJ1aWxkKCk7DQorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IEZpbGVEZXNjcmlwdG9yLkJ1aWxkRnJvbShwcm90bywgbnVsbCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGb28iLCBkZXNjcmlwdG9yLkNTaGFycE9wdGlvbnMuVW1icmVsbGFDbGFzc25hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBJbXBsaWNpdEZpbGVDbGFzc1dpdGhQcm90b1N1ZmZpeCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBwcm90byA9IG5ldyBGaWxlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIge05hbWUgPSAiZm9vX2Jhci5wcm90byJ9LkJ1aWxkKCk7DQorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IEZpbGVEZXNjcmlwdG9yLkJ1aWxkRnJvbShwcm90bywgbnVsbCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGb29CYXIiLCBkZXNjcmlwdG9yLkNTaGFycE9wdGlvbnMuVW1icmVsbGFDbGFzc25hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBJbXBsaWNpdEZpbGVDbGFzc1dpdGhQcm90b0RldmVsU3VmZml4KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvID0gbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG8uQnVpbGRlciB7TmFtZSA9ICJmb29fYmFyLnByb3RvZGV2ZWwifS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBGaWxlRGVzY3JpcHRvci5CdWlsZEZyb20ocHJvdG8sIG51bGwpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiRm9vQmFyIiwgZGVzY3JpcHRvci5DU2hhcnBPcHRpb25zLlVtYnJlbGxhQ2xhc3NuYW1lKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgSW1wbGljaXRGaWxlQ2xhc3NXaXRoTm9TdWZmaXgoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG8gPSBuZXcgRmlsZURlc2NyaXB0b3JQcm90by5CdWlsZGVyIHtOYW1lID0gImZvb19iYXIifS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBGaWxlRGVzY3JpcHRvci5CdWlsZEZyb20ocHJvdG8sIG51bGwpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiRm9vQmFyIiwgZGVzY3JpcHRvci5DU2hhcnBPcHRpb25zLlVtYnJlbGxhQ2xhc3NuYW1lKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgSW1wbGljaXRGaWxlQ2xhc3NXaXRoRGlyZWN0b3J5U3RydWN0dXJlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvID0gbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG8uQnVpbGRlciB7TmFtZSA9ICJ4L3kvZm9vX2JhciJ9LkJ1aWxkKCk7DQorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IEZpbGVEZXNjcmlwdG9yLkJ1aWxkRnJvbShwcm90bywgbnVsbCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGb29CYXIiLCBkZXNjcmlwdG9yLkNTaGFycE9wdGlvbnMuVW1icmVsbGFDbGFzc25hbWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQ29kZWRJbnB1dFN0cmVhbVRlc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvZGVkSW5wdXRTdHJlYW1UZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOWQzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvZGVkSW5wdXRTdHJlYW1UZXN0LmNzCkBAIC0wLDAgKzEsNjM5IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvczsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIFtUZXN0Q2xhc3NdDQorICAgIHB1YmxpYyBjbGFzcyBDb2RlZElucHV0U3RyZWFtVGVzdA0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSGVscGVyIHRvIGNvbnN0cnVjdCBhIGJ5dGUgYXJyYXkgZnJvbSBhIGJ1bmNoIG9mIGJ5dGVzLiAgVGhlIGlucHV0cyBhcmUNCisgICAgICAgIC8vLyBhY3R1YWxseSBpbnRzIHNvIHRoYXQgSSBjYW4gdXNlIGhleCBub3RhdGlvbiBhbmQgbm90IGdldCBzdHVwaWQgZXJyb3JzDQorICAgICAgICAvLy8gYWJvdXQgcHJlY2lzaW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBCeXRlcyhwYXJhbXMgaW50W10gYnl0ZXNBc0ludHMpDQorICAgICAgICB7DQorICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYnl0ZXNBc0ludHMuTGVuZ3RoXTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzQXNJbnRzLkxlbmd0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYnl0ZXNbaV0gPSAoYnl0ZSkgYnl0ZXNBc0ludHNbaV07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBieXRlczsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIFJlYWRSYXdWYXJpbnQzMigpIGFuZCBSZWFkUmF3VmFyaW50NjQoKSBhbmQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFzc2VydFJlYWRWYXJpbnQoYnl0ZVtdIGRhdGEsIHVsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKGRhdGEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgodWludCkgdmFsdWUsIGlucHV0LlJlYWRSYXdWYXJpbnQzMigpKTsNCisNCisgICAgICAgICAgICBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoZGF0YSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHZhbHVlLCBpbnB1dC5SZWFkUmF3VmFyaW50NjQoKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShpbnB1dC5Jc0F0RW5kKTsNCisNCisgICAgICAgICAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLg0KKyAgICAgICAgICAgIGZvciAoaW50IGJ1ZmZlclNpemUgPSAxOyBidWZmZXJTaXplIDw9IDE2OyBidWZmZXJTaXplICo9IDIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UobmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShkYXRhLCBidWZmZXJTaXplKSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgodWludCkgdmFsdWUsIGlucHV0LlJlYWRSYXdWYXJpbnQzMigpKTsNCisNCisgICAgICAgICAgICAgICAgaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKG5ldyBTbWFsbEJsb2NrSW5wdXRTdHJlYW0oZGF0YSwgYnVmZmVyU2l6ZSkpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodmFsdWUsIGlucHV0LlJlYWRSYXdWYXJpbnQ2NCgpKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShpbnB1dC5Jc0F0RW5kKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8gVHJ5IHJlYWRpbmcgZGlyZWN0bHkgZnJvbSBhIE1lbW9yeVN0cmVhbS4gV2Ugd2FudCB0byB2ZXJpZnkgdGhhdCBpdA0KKyAgICAgICAgICAgIC8vIGRvZXNuJ3QgcmVhZCBwYXN0IHRoZSBlbmQgb2YgdGhlIGlucHV0LCBzbyB3cml0ZSBhbiBleHRyYSBieXRlIC0gdGhpcw0KKyAgICAgICAgICAgIC8vIGxldHMgdXMgdGVzdCB0aGUgcG9zaXRpb24gYXQgdGhlIGVuZC4NCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbWVtb3J5U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKyAgICAgICAgICAgIG1lbW9yeVN0cmVhbS5Xcml0ZShkYXRhLCAwLCBkYXRhLkxlbmd0aCk7DQorICAgICAgICAgICAgbWVtb3J5U3RyZWFtLldyaXRlQnl0ZSgwKTsNCisgICAgICAgICAgICBtZW1vcnlTdHJlYW0uUG9zaXRpb24gPSAwOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgodWludCkgdmFsdWUsIENvZGVkSW5wdXRTdHJlYW0uUmVhZFJhd1ZhcmludDMyKG1lbW9yeVN0cmVhbSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRhLkxlbmd0aCwgbWVtb3J5U3RyZWFtLlBvc2l0aW9uKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIFJlYWRSYXdWYXJpbnQzMigpIGFuZCBSZWFkUmF3VmFyaW50NjQoKSBhbmQNCisgICAgICAgIC8vLyBleHBlY3RzIHRoZW0gdG8gZmFpbCB3aXRoIGFuIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB3aG9zZQ0KKyAgICAgICAgLy8vIGRlc2NyaXB0aW9uIG1hdGNoZXMgdGhlIGdpdmVuIG9uZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFzc2VydFJlYWRWYXJpbnRGYWlsdXJlKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBleHBlY3RlZCwgYnl0ZVtdIGRhdGEpDQorICAgICAgICB7DQorICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoZGF0YSk7DQorICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpbnB1dC5SZWFkUmF3VmFyaW50MzIoKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZC5NZXNzYWdlLCBlLk1lc3NhZ2UpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoZGF0YSk7DQorICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpbnB1dC5SZWFkUmF3VmFyaW50NjQoKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZC5NZXNzYWdlLCBlLk1lc3NhZ2UpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZ2V0IHRoZSBzYW1lIGVycm9yIHdoZW4gcmVhZGluZyBkaXJlY3RseSBmcm9tIGEgU3RyZWFtLg0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5SZWFkUmF3VmFyaW50MzIobmV3IE1lbW9yeVN0cmVhbShkYXRhKSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5GYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQuTWVzc2FnZSwgZS5NZXNzYWdlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRWYXJpbnQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydFJlYWRWYXJpbnQoQnl0ZXMoMHgwMCksIDApOw0KKyAgICAgICAgICAgIEFzc2VydFJlYWRWYXJpbnQoQnl0ZXMoMHgwMSksIDEpOw0KKyAgICAgICAgICAgIEFzc2VydFJlYWRWYXJpbnQoQnl0ZXMoMHg3ZiksIDEyNyk7DQorICAgICAgICAgICAgLy8gMTQ4ODINCisgICAgICAgICAgICBBc3NlcnRSZWFkVmFyaW50KEJ5dGVzKDB4YTIsIDB4NzQpLCAoMHgyMiA8PCAwKSB8ICgweDc0IDw8IDcpKTsNCisgICAgICAgICAgICAvLyAyOTYxNDg4ODMwDQorICAgICAgICAgICAgQXNzZXJ0UmVhZFZhcmludChCeXRlcygweGJlLCAweGY3LCAweDkyLCAweDg0LCAweDBiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNlIDw8IDApIHwgKDB4NzcgPDwgNykgfCAoMHgxMiA8PCAxNCkgfCAoMHgwNCA8PCAyMSkgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MGJMIDw8IDI4KSk7DQorDQorICAgICAgICAgICAgLy8gNjQtYml0DQorICAgICAgICAgICAgLy8gNzI1NjQ1NjEyNg0KKyAgICAgICAgICAgIEFzc2VydFJlYWRWYXJpbnQoQnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgxYiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFiTCA8PCAyOCkpOw0KKyAgICAgICAgICAgIC8vIDQxMjU2MjAyNTgwNzE4MzM2DQorICAgICAgICAgICAgQXNzZXJ0UmVhZFZhcmludChCeXRlcygweDgwLCAweGU2LCAweGViLCAweDljLCAweGMzLCAweGM5LCAweGE0LCAweDQ5KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwIDw8IDApIHwgKDB4NjYgPDwgNykgfCAoMHg2YiA8PCAxNCkgfCAoMHgxYyA8PCAyMSkgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDNMIDw8IDI4KSB8ICgweDQ5TCA8PCAzNSkgfCAoMHgyNEwgPDwgNDIpIHwgKDB4NDlMIDw8IDQ5KSk7DQorICAgICAgICAgICAgLy8gMTE5NjQzNzgzMzA5Nzg3MzUxMzENCisgICAgICAgICAgICBBc3NlcnRSZWFkVmFyaW50KEJ5dGVzKDB4OWIsIDB4YTgsIDB4ZjksIDB4YzIsIDB4YmIsIDB4ZDYsIDB4ODAsIDB4ODUsIDB4YTYsIDB4MDEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MWIgPDwgMCkgfCAoMHgyOCA8PCA3KSB8ICgweDc5IDw8IDE0KSB8ICgweDQyIDw8IDIxKSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzYlVMIDw8IDI4KSB8ICgweDU2VUwgPDwgMzUpIHwgKDB4MDBVTCA8PCA0MikgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDVVTCA8PCA0OSkgfCAoMHgyNlVMIDw8IDU2KSB8ICgweDAxVUwgPDwgNjMpKTsNCisNCisgICAgICAgICAgICAvLyBGYWlsdXJlcw0KKyAgICAgICAgICAgIEFzc2VydFJlYWRWYXJpbnRGYWlsdXJlKA0KKyAgICAgICAgICAgICAgICBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uTWFsZm9ybWVkVmFyaW50KCksDQorICAgICAgICAgICAgICAgIEJ5dGVzKDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsDQorICAgICAgICAgICAgICAgICAgICAgIDB4MDApKTsNCisgICAgICAgICAgICBBc3NlcnRSZWFkVmFyaW50RmFpbHVyZSgNCisgICAgICAgICAgICAgICAgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLlRydW5jYXRlZE1lc3NhZ2UoKSwNCisgICAgICAgICAgICAgICAgQnl0ZXMoMHg4MCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBhcnNlcyB0aGUgZ2l2ZW4gYnl0ZXMgdXNpbmcgUmVhZFJhd0xpdHRsZUVuZGlhbjMyKCkgYW5kIGNoZWNrcw0KKyAgICAgICAgLy8vIHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFzc2VydFJlYWRMaXR0bGVFbmRpYW4zMihieXRlW10gZGF0YSwgdWludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShkYXRhKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodmFsdWUsIGlucHV0LlJlYWRSYXdMaXR0bGVFbmRpYW4zMigpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGlucHV0LklzQXRFbmQpOw0KKw0KKyAgICAgICAgICAgIC8vIFRyeSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMuDQorICAgICAgICAgICAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDw9IDE2OyBibG9ja1NpemUgKj0gMikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZSgNCisgICAgICAgICAgICAgICAgICAgIG5ldyBTbWFsbEJsb2NrSW5wdXRTdHJlYW0oZGF0YSwgYmxvY2tTaXplKSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh2YWx1ZSwgaW5wdXQuUmVhZFJhd0xpdHRsZUVuZGlhbjMyKCkpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGlucHV0LklzQXRFbmQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIFJlYWRSYXdMaXR0bGVFbmRpYW42NCgpIGFuZCBjaGVja3MNCisgICAgICAgIC8vLyB0aGF0IHRoZSByZXN1bHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmFsdWUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBc3NlcnRSZWFkTGl0dGxlRW5kaWFuNjQoYnl0ZVtdIGRhdGEsIHVsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKGRhdGEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh2YWx1ZSwgaW5wdXQuUmVhZFJhd0xpdHRsZUVuZGlhbjY0KCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaW5wdXQuSXNBdEVuZCk7DQorDQorICAgICAgICAgICAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4NCisgICAgICAgICAgICBmb3IgKGludCBibG9ja1NpemUgPSAxOyBibG9ja1NpemUgPD0gMTY7IGJsb2NrU2l6ZSAqPSAyKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKA0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShkYXRhLCBibG9ja1NpemUpKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHZhbHVlLCBpbnB1dC5SZWFkUmF3TGl0dGxlRW5kaWFuNjQoKSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaW5wdXQuSXNBdEVuZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkTGl0dGxlRW5kaWFuKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnRSZWFkTGl0dGxlRW5kaWFuMzIoQnl0ZXMoMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiksIDB4MTIzNDU2NzgpOw0KKyAgICAgICAgICAgIEFzc2VydFJlYWRMaXR0bGVFbmRpYW4zMihCeXRlcygweGYwLCAweGRlLCAweGJjLCAweDlhKSwgMHg5YWJjZGVmMCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0UmVhZExpdHRsZUVuZGlhbjY0KEJ5dGVzKDB4ZjAsIDB4ZGUsIDB4YmMsIDB4OWEsIDB4NzgsIDB4NTYsIDB4MzQsIDB4MTIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyMzQ1Njc4OWFiY2RlZjBMKTsNCisgICAgICAgICAgICBBc3NlcnRSZWFkTGl0dGxlRW5kaWFuNjQoDQorICAgICAgICAgICAgICAgIEJ5dGVzKDB4NzgsIDB4NTYsIDB4MzQsIDB4MTIsIDB4ZjAsIDB4ZGUsIDB4YmMsIDB4OWEpLCAweDlhYmNkZWYwMTIzNDU2NzhVTCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIERlY29kZVppZ1phZzMyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWczMigwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0xLCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzMyKDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWczMigyKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0yLCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzMyKDMpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHgzRkZGRkZGRiwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWczMigweDdGRkZGRkZFKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHVuY2hlY2tlZCgoaW50KSAweEMwMDAwMDAwKSwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWczMigweDdGRkZGRkZGKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4N0ZGRkZGRkYsIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnMzIoMHhGRkZGRkZGRSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh1bmNoZWNrZWQoKGludCkgMHg4MDAwMDAwMCksIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnMzIoMHhGRkZGRkZGRikpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEZWNvZGVaaWdaYWc2NCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnNjQoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMSwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWc2NCgxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnNjQoMikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMiwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWc2NCgzKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4MDAwMDAwMDAzRkZGRkZGRkwsIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnNjQoMHgwMDAwMDAwMDdGRkZGRkZFTCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh1bmNoZWNrZWQoKGxvbmcpIDB4RkZGRkZGRkZDMDAwMDAwMEwpLCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzY0KDB4MDAwMDAwMDA3RkZGRkZGRkwpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHgwMDAwMDAwMDdGRkZGRkZGTCwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWc2NCgweDAwMDAwMDAwRkZGRkZGRkVMKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHVuY2hlY2tlZCgobG9uZykgMHhGRkZGRkZGRjgwMDAwMDAwTCksIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnNjQoMHgwMDAwMDAwMEZGRkZGRkZGTCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgweDdGRkZGRkZGRkZGRkZGRkZMLCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzY0KDB4RkZGRkZGRkZGRkZGRkZGRUwpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodW5jaGVja2VkKChsb25nKSAweDgwMDAwMDAwMDAwMDAwMDBMKSwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWc2NCgweEZGRkZGRkZGRkZGRkZGRkZMKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRXaG9sZU1lc3NhZ2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuR2V0QWxsU2V0KCk7DQorDQorICAgICAgICAgICAgYnl0ZVtdIHJhd0J5dGVzID0gbWVzc2FnZS5Ub0J5dGVBcnJheSgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChyYXdCeXRlcy5MZW5ndGgsIG1lc3NhZ2UuU2VyaWFsaXplZFNpemUpOw0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5QYXJzZUZyb20ocmF3Qnl0ZXMpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFsbEZpZWxkc1NldChtZXNzYWdlMik7DQorDQorICAgICAgICAgICAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4NCisgICAgICAgICAgICBmb3IgKGludCBibG9ja1NpemUgPSAxOyBibG9ja1NpemUgPCAyNTY7IGJsb2NrU2l6ZSAqPSAyKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbWVzc2FnZTIgPSBUZXN0QWxsVHlwZXMuUGFyc2VGcm9tKG5ldyBTbWFsbEJsb2NrSW5wdXRTdHJlYW0ocmF3Qnl0ZXMsIGJsb2NrU2l6ZSkpOw0KKyAgICAgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZTIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgU2tpcFdob2xlTWVzc2FnZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5HZXRBbGxTZXQoKTsNCisgICAgICAgICAgICBieXRlW10gcmF3Qnl0ZXMgPSBtZXNzYWdlLlRvQnl0ZUFycmF5KCk7DQorDQorICAgICAgICAgICAgLy8gQ3JlYXRlIHR3byBwYXJhbGxlbCBpbnB1dHMuICBQYXJzZSBvbmUgYXMgdW5rbm93biBmaWVsZHMgd2hpbGUgdXNpbmcNCisgICAgICAgICAgICAvLyBza2lwRmllbGQoKSB0byBza2lwIGVhY2ggZmllbGQgb24gdGhlIG90aGVyLiAgRXhwZWN0IHRoZSBzYW1lIHRhZ3MuDQorICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dDEgPSBDb2RlZElucHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKHJhd0J5dGVzKTsNCisgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0MiA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UocmF3Qnl0ZXMpOw0KKyAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcigpOw0KKw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBuYW1lOw0KKyAgICAgICAgICAgIHdoaWxlIChpbnB1dDEuUmVhZFRhZyhvdXQgdGFnLCBvdXQgbmFtZSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB1aW50IHRhZzI7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaW5wdXQyLlJlYWRUYWcob3V0IHRhZzIsIG91dCBuYW1lKSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0YWcsIHRhZzIpOw0KKw0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlRmllbGRGcm9tKHRhZywgaW5wdXQxKTsNCisgICAgICAgICAgICAgICAgaW5wdXQyLlNraXBGaWVsZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUZXN0IHRoYXQgYSBidWcgaW4gU2tpcFJhd0J5dGVzIGhhcyBiZWVuIGZpeGVkOiBpZiB0aGUgc2tpcA0KKyAgICAgICAgLy8vIHNraXBzIGV4YWN0bHkgdXAgdG8gYSBsaW1pdCwgdGhpcyBzaG91bGQgYm5vdCBicmVhayB0aGluZ3MNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFNraXBSYXdCeXRlc0J1ZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgYnl0ZVtdIHJhd0J5dGVzID0gbmV3IGJ5dGVbXSB7MSwgMn07DQorICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UocmF3Qnl0ZXMpOw0KKw0KKyAgICAgICAgICAgIGludCBsaW1pdCA9IGlucHV0LlB1c2hMaW1pdCgxKTsNCisgICAgICAgICAgICBpbnB1dC5Ta2lwUmF3Qnl0ZXMoMSk7DQorICAgICAgICAgICAgaW5wdXQuUG9wTGltaXQobGltaXQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBpbnB1dC5SZWFkUmF3Qnl0ZSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRIdWdlQmxvYigpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSAxTUIgYmxvYi4NCisgICAgICAgICAgICBieXRlW10gYmxvYiA9IG5ldyBieXRlWzEgPDwgMjBdOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvYi5MZW5ndGg7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJsb2JbaV0gPSAoYnl0ZSkgaTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8gTWFrZSBhIG1lc3NhZ2UgY29udGFpbmluZyBpdC4NCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5TZXRBbGxGaWVsZHMoYnVpbGRlcik7DQorICAgICAgICAgICAgYnVpbGRlci5TZXRPcHRpb25hbEJ5dGVzKEJ5dGVTdHJpbmcuQ29weUZyb20oYmxvYikpOw0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSBhbmQgcGFyc2UgaXQuICBNYWtlIHN1cmUgdG8gcGFyc2UgZnJvbSBhbiBJbnB1dFN0cmVhbSwgbm90DQorICAgICAgICAgICAgLy8gZGlyZWN0bHkgZnJvbSBhIEJ5dGVTdHJpbmcsIHNvIHRoYXQgQ29kZWRJbnB1dFN0cmVhbSB1c2VzIGJ1ZmZlcmVkDQorICAgICAgICAgICAgLy8gcmVhZGluZy4NCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZTIgPSBUZXN0QWxsVHlwZXMuUGFyc2VGcm9tKG1lc3NhZ2UuVG9CeXRlU3RyaW5nKCkuQ3JlYXRlQ29kZWRJbnB1dCgpKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZS5PcHRpb25hbEJ5dGVzLCBtZXNzYWdlMi5PcHRpb25hbEJ5dGVzKTsNCisNCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgYWxsIHRoZSBvdGhlciBmaWVsZHMgd2VyZSBwYXJzZWQgY29ycmVjdGx5Lg0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMyA9IFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKG1lc3NhZ2UyKQ0KKyAgICAgICAgICAgICAgICAuU2V0T3B0aW9uYWxCeXRlcyhUZXN0VXRpbC5HZXRBbGxTZXQoKS5PcHRpb25hbEJ5dGVzKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZTMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkTWFsaWNpb3VzbHlMYXJnZUJsb2IoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsNCisgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShtcyk7DQorDQorICAgICAgICAgICAgdWludCB0YWcgPSBXaXJlRm9ybWF0Lk1ha2VUYWcoMSwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOw0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1ZhcmludDMyKHRhZyk7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlUmF3VmFyaW50MzIoMHg3RkZGRkZGRik7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlUmF3Qnl0ZXMobmV3IGJ5dGVbMzJdKTsgLy8gUGFkIHdpdGggYSBmZXcgcmFuZG9tIGJ5dGVzLg0KKyAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOw0KKyAgICAgICAgICAgIG1zLlBvc2l0aW9uID0gMDsNCisNCisgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShtcyk7DQorICAgICAgICAgICAgdWludCB0ZXN0dGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBpZ25vcmU7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShpbnB1dC5SZWFkVGFnKG91dCB0ZXN0dGFnLCBvdXQgaWdub3JlKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRhZywgdGVzdHRhZyk7DQorDQorICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBCeXRlU3RyaW5nIGJ5dGVzID0gbnVsbDsNCisgICAgICAgICAgICAgICAgaW5wdXQuUmVhZEJ5dGVzKHJlZiBieXRlcyk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5GYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gc3VjY2Vzcy4NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSBNYWtlUmVjdXJzaXZlTWVzc2FnZShpbnQgZGVwdGgpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGRlcHRoID09IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEkoNSkuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RSZWN1cnNpdmVNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgLlNldEEoTWFrZVJlY3Vyc2l2ZU1lc3NhZ2UoZGVwdGggLSAxKSkuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFzc2VydE1lc3NhZ2VEZXB0aChUZXN0UmVjdXJzaXZlTWVzc2FnZSBtZXNzYWdlLCBpbnQgZGVwdGgpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGRlcHRoID09IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0EpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNSwgbWVzc2FnZS5JKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0EpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnRNZXNzYWdlRGVwdGgobWVzc2FnZS5BLCBkZXB0aCAtIDEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgTWFsaWNpb3VzUmVjdXJzaW9uKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBCeXRlU3RyaW5nIGRhdGE2NCA9IE1ha2VSZWN1cnNpdmVNZXNzYWdlKDY0KS5Ub0J5dGVTdHJpbmcoKTsNCisgICAgICAgICAgICBCeXRlU3RyaW5nIGRhdGE2NSA9IE1ha2VSZWN1cnNpdmVNZXNzYWdlKDY1KS5Ub0J5dGVTdHJpbmcoKTsNCisNCisgICAgICAgICAgICBBc3NlcnRNZXNzYWdlRGVwdGgoVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuUGFyc2VGcm9tKGRhdGE2NCksIDY0KTsNCisNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFRlc3RSZWN1cnNpdmVNZXNzYWdlLlBhcnNlRnJvbShkYXRhNjUpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuRmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiEiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MuDQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBkYXRhNjQuQ3JlYXRlQ29kZWRJbnB1dCgpOw0KKyAgICAgICAgICAgIGlucHV0LlNldFJlY3Vyc2lvbkxpbWl0KDgpOw0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuUGFyc2VGcm9tKGlucHV0KTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBzdWNjZXNzLg0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgU2l6ZUxpbWl0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBIYXZlIHRvIHVzZSBhIFN0cmVhbSByYXRoZXIgdGhhbiBCeXRlU3RyaW5nLkNyZWF0ZUNvZGVkSW5wdXQgYXMgU2l6ZUxpbWl0IGRvZXNuJ3QNCisgICAgICAgICAgICAvLyBhcHBseSB0byB0aGUgbGF0dGVyIGNhc2UuDQorICAgICAgICAgICAgTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbShUZXN0VXRpbC5HZXRBbGxTZXQoKS5Ub0J5dGVTdHJpbmcoKS5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShtcyk7DQorICAgICAgICAgICAgaW5wdXQuU2V0U2l6ZUxpbWl0KDE2KTsNCisNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5QYXJzZUZyb20oaW5wdXQpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuRmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiEiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MuDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBSZXNldFNpemVDb3VudGVyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZSgNCisgICAgICAgICAgICAgICAgbmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShuZXcgYnl0ZVsyNTZdLCA4KSk7DQorICAgICAgICAgICAgaW5wdXQuU2V0U2l6ZUxpbWl0KDE2KTsNCisgICAgICAgICAgICBpbnB1dC5SZWFkUmF3Qnl0ZXMoMTYpOw0KKw0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW5wdXQuUmVhZFJhd0J5dGUoKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBTdWNjZXNzLg0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpbnB1dC5SZXNldFNpemVDb3VudGVyKCk7DQorICAgICAgICAgICAgaW5wdXQuUmVhZFJhd0J5dGUoKTsgLy8gTm8gZXhjZXB0aW9uIHRocm93bi4NCisNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlucHV0LlJlYWRSYXdCeXRlcygxNik7IC8vIEhpdHMgbGltaXQgYWdhaW4uDQorICAgICAgICAgICAgICAgIEFzc2VydC5GYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gU3VjY2Vzcy4NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGVzdHMgdGhhdCBpZiB3ZSByZWFkIGFuIHN0cmluZyB0aGF0IGNvbnRhaW5zIGludmFsaWQgVVRGLTgsIG5vIGV4Y2VwdGlvbg0KKyAgICAgICAgLy8vIGlzIHRocm93bi4gIEluc3RlYWQsIHRoZSBpbnZhbGlkIGJ5dGVzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBVbmljb2RlDQorICAgICAgICAvLy8gInJlcGxhY2VtZW50IGNoYXJhY3RlciIgVStGRkZELg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZEludmFsaWRVdGY4KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UobXMpOw0KKw0KKyAgICAgICAgICAgIHVpbnQgdGFnID0gV2lyZUZvcm1hdC5NYWtlVGFnKDEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdWYXJpbnQzMih0YWcpOw0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1ZhcmludDMyKDEpOw0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd0J5dGVzKG5ldyBieXRlW10gezB4ODB9KTsNCisgICAgICAgICAgICBvdXRwdXQuRmx1c2goKTsNCisgICAgICAgICAgICBtcy5Qb3NpdGlvbiA9IDA7DQorDQorICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UobXMpOw0KKw0KKyAgICAgICAgICAgIHVpbnQgdGVzdHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgaWdub3JlZDsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGlucHV0LlJlYWRUYWcob3V0IHRlc3R0YWcsIG91dCBpZ25vcmVkKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRhZywgdGVzdHRhZyk7DQorICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBudWxsOw0KKyAgICAgICAgICAgIGlucHV0LlJlYWRTdHJpbmcocmVmIHRleHQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgnXHVmZmZkJywgdGV4dFswXSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQSBzdHJlYW0gd2hpY2ggbGltaXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaXQgcmVhZHMgYXQgYSB0aW1lLg0KKyAgICAgICAgLy8vIFdlIHVzZSB0aGlzIHRvIG1ha2Ugc3VyZSB0aGF0IENvZGVkSW5wdXRTdHJlYW0gZG9lc24ndCBzY3JldyB1cCB3aGVuDQorICAgICAgICAvLy8gcmVhZGluZyBpbiBzbWFsbCBibG9ja3MuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBzZWFsZWQgY2xhc3MgU21hbGxCbG9ja0lucHV0U3RyZWFtIDogTWVtb3J5U3RyZWFtDQorICAgICAgICB7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgYmxvY2tTaXplOw0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBTbWFsbEJsb2NrSW5wdXRTdHJlYW0oYnl0ZVtdIGRhdGEsIGludCBibG9ja1NpemUpDQorICAgICAgICAgICAgICAgIDogYmFzZShkYXRhKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhpcy5ibG9ja1NpemUgPSBibG9ja1NpemU7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5SZWFkKGJ1ZmZlciwgb2Zmc2V0LCBNYXRoLk1pbihjb3VudCwgYmxvY2tTaXplKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZW51bSBUZXN0TmVnRW51bSB7IE5vbmUgPSAwLCBWYWx1ZSA9IC0yIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE5lZ2F0aXZlRW51bSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMTBdIHsgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSB9Ow0KKyAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKGJ5dGVzKTsNCisgICAgICAgICAgICBvYmplY3QgdW5rOw0KKyAgICAgICAgICAgIFRlc3ROZWdFbnVtIHZhbCA9IFRlc3ROZWdFbnVtLk5vbmU7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShpbnB1dC5SZWFkRW51bShyZWYgdmFsLCBvdXQgdW5rKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShpbnB1dC5Jc0F0RW5kKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdE5lZ0VudW0uVmFsdWUsIHZhbCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3ROZWdhdGl2ZUVudW1QYWNrZWRBcnJheSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50IGFycmF5U2l6ZSA9IDEgKyAoMTAgKiA1KTsNCisgICAgICAgICAgICBpbnQgbXNnU2l6ZSA9IDEgKyAxICsgYXJyYXlTaXplOw0KKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW21zZ1NpemVdOw0KKyAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKGJ5dGVzKTsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRJbnQzMkFycmF5KDgsICIiLCBhcnJheVNpemUsIG5ldyBpbnRbXSB7IDAsIC0xLCAtMiwgLTMsIC00LCAtNSB9KTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgb3V0cHV0LlNwYWNlTGVmdCk7DQorDQorICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoYnl0ZXMpOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBuYW1lOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgbmFtZSkpOw0KKw0KKyAgICAgICAgICAgIExpc3Q8VGVzdE5lZ0VudW0+IHZhbHVlcyA9IG5ldyBMaXN0PFRlc3ROZWdFbnVtPigpOw0KKyAgICAgICAgICAgIElDb2xsZWN0aW9uPG9iamVjdD4gdW5rOw0KKyAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXkodGFnLCBuYW1lLCB2YWx1ZXMsIG91dCB1bmspOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCB2YWx1ZXMuQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0TmVnRW51bS5Ob25lLCB2YWx1ZXNbMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0TmVnRW51bS5WYWx1ZSwgdmFsdWVzWzFdKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHVuayk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQsIHVuay5Db3VudCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3ROZWdhdGl2ZUVudW1BcnJheSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50IGFycmF5U2l6ZSA9IDEgKyAxICsgKDExICogNSk7DQorICAgICAgICAgICAgaW50IG1zZ1NpemUgPSBhcnJheVNpemU7DQorICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbXNnU2l6ZV07DQorICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoYnl0ZXMpOw0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyQXJyYXkoOCwgIiIsIG5ldyBpbnRbXSB7IDAsIC0xLCAtMiwgLTMsIC00LCAtNSB9KTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgb3V0cHV0LlNwYWNlTGVmdCk7DQorDQorICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoYnl0ZXMpOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBuYW1lOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgbmFtZSkpOw0KKw0KKyAgICAgICAgICAgIExpc3Q8VGVzdE5lZ0VudW0+IHZhbHVlcyA9IG5ldyBMaXN0PFRlc3ROZWdFbnVtPigpOw0KKyAgICAgICAgICAgIElDb2xsZWN0aW9uPG9iamVjdD4gdW5rOw0KKyAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXkodGFnLCBuYW1lLCB2YWx1ZXMsIG91dCB1bmspOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCB2YWx1ZXMuQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0TmVnRW51bS5Ob25lLCB2YWx1ZXNbMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0TmVnRW51bS5WYWx1ZSwgdmFsdWVzWzFdKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHVuayk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQsIHVuay5Db3VudCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvL0lzc3VlIDcxOglDb2RlZElucHV0U3RyZWFtLlJlYWRCeXRlcyBnbyB0byBzbG93IHBhdGggdW5uZWNlc3NhcmlseQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0U2xvd1BhdGhBdm9pZGFuY2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHVzaW5nICh2YXIgbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShtcyk7DQorICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZUZpZWxkKEZpZWxkVHlwZS5CeXRlcywgMSwgImJ5dGVzIiwgQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVsxMDBdKSk7DQorICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZUZpZWxkKEZpZWxkVHlwZS5CeXRlcywgMiwgImJ5dGVzIiwgQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVsxMDBdKSk7DQorICAgICAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOw0KKw0KKyAgICAgICAgICAgICAgICBtcy5Qb3NpdGlvbiA9IDA7DQorICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKG1zLCBuZXcgYnl0ZVttcy5MZW5ndGggLyAyXSk7DQorDQorICAgICAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgICAgICBzdHJpbmcgaWdub3JlOw0KKyAgICAgICAgICAgICAgICBCeXRlU3RyaW5nIHZhbHVlOw0KKw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGlnbm9yZSkpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgV2lyZUZvcm1hdC5HZXRUYWdGaWVsZE51bWJlcih0YWcpKTsNCisgICAgICAgICAgICAgICAgdmFsdWUgPSBCeXRlU3RyaW5nLkVtcHR5Ow0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGlucHV0LlJlYWRCeXRlcyhyZWYgdmFsdWUpICYmIHZhbHVlLkxlbmd0aCA9PSAxMDApOw0KKw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGlnbm9yZSkpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgV2lyZUZvcm1hdC5HZXRUYWdGaWVsZE51bWJlcih0YWcpKTsNCisgICAgICAgICAgICAgICAgdmFsdWUgPSBCeXRlU3RyaW5nLkVtcHR5Ow0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGlucHV0LlJlYWRCeXRlcyhyZWYgdmFsdWUpICYmIHZhbHVlLkxlbmd0aCA9PSAxMDApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvZGVkT3V0cHV0U3RyZWFtVGVzdC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQ29kZWRPdXRwdXRTdHJlYW1UZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNGU5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvZGVkT3V0cHV0U3RyZWFtVGVzdC5jcwpAQCAtMCwwICsxLDQ3MiBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zOw0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW1UZXN0DQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgdGhlIGdpdmVuIHZhbHVlIHVzaW5nIFdyaXRlUmF3VmFyaW50MzIoKSBhbmQgV3JpdGVSYXdWYXJpbnQ2NCgpIGFuZA0KKyAgICAgICAgLy8vIGNoZWNrcyB0aGF0IHRoZSByZXN1bHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gYnl0ZXMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFzc2VydFdyaXRlVmFyaW50KGJ5dGVbXSBkYXRhLCB1bG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBPbmx5IGRvIDMyLWJpdCB3cml0ZSBpZiB0aGUgdmFsdWUgZml0cyBpbiAzMiBiaXRzLg0KKyAgICAgICAgICAgIGlmICgodmFsdWUgPj4gMzIpID09IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBNZW1vcnlTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKyAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShyYXdPdXRwdXQpOw0KKyAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdWYXJpbnQzMigodWludCkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBvdXRwdXQuRmx1c2goKTsNCisgICAgICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChkYXRhLCByYXdPdXRwdXQuVG9BcnJheSgpKTsNCisgICAgICAgICAgICAgICAgLy8gQWxzbyB0cnkgY29tcHV0aW5nIHNpemUuDQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRhLkxlbmd0aCwgQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZSgodWludCkgdmFsdWUpKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBNZW1vcnlTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKyAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShyYXdPdXRwdXQpOw0KKyAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdWYXJpbnQ2NCh2YWx1ZSk7DQorICAgICAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOw0KKyAgICAgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKGRhdGEsIHJhd091dHB1dC5Ub0FycmF5KCkpOw0KKw0KKyAgICAgICAgICAgICAgICAvLyBBbHNvIHRyeSBjb21wdXRpbmcgc2l6ZS4NCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGRhdGEuTGVuZ3RoLCBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlUmF3VmFyaW50NjRTaXplKHZhbHVlKSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vIFRyeSBkaWZmZXJlbnQgYnVmZmVyIHNpemVzLg0KKyAgICAgICAgICAgIGZvciAoaW50IGJ1ZmZlclNpemUgPSAxOyBidWZmZXJTaXplIDw9IDE2OyBidWZmZXJTaXplICo9IDIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBPbmx5IGRvIDMyLWJpdCB3cml0ZSBpZiB0aGUgdmFsdWUgZml0cyBpbiAzMiBiaXRzLg0KKyAgICAgICAgICAgICAgICBpZiAoKHZhbHVlID4+IDMyKSA9PSAwKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBNZW1vcnlTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKyAgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0NCisgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShyYXdPdXRwdXQsIGJ1ZmZlclNpemUpOw0KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlUmF3VmFyaW50MzIoKHVpbnQpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOw0KKyAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChkYXRhLCByYXdPdXRwdXQuVG9BcnJheSgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBNZW1vcnlTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKyAgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UocmF3T3V0cHV0LCBidWZmZXJTaXplKTsNCisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1ZhcmludDY0KHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOw0KKyAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChkYXRhLCByYXdPdXRwdXQuVG9BcnJheSgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUZXN0cyBXcml0ZVJhd1ZhcmludDMyKCkgYW5kIFdyaXRlUmF3VmFyaW50NjQoKQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVWYXJpbnQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydFdyaXRlVmFyaW50KG5ldyBieXRlW10gezB4MDB9LCAwKTsNCisgICAgICAgICAgICBBc3NlcnRXcml0ZVZhcmludChuZXcgYnl0ZVtdIHsweDAxfSwgMSk7DQorICAgICAgICAgICAgQXNzZXJ0V3JpdGVWYXJpbnQobmV3IGJ5dGVbXSB7MHg3Zn0sIDEyNyk7DQorICAgICAgICAgICAgLy8gMTQ4ODINCisgICAgICAgICAgICBBc3NlcnRXcml0ZVZhcmludChuZXcgYnl0ZVtdIHsweGEyLCAweDc0fSwgKDB4MjIgPDwgMCkgfCAoMHg3NCA8PCA3KSk7DQorICAgICAgICAgICAgLy8gMjk2MTQ4ODgzMA0KKyAgICAgICAgICAgIEFzc2VydFdyaXRlVmFyaW50KG5ldyBieXRlW10gezB4YmUsIDB4ZjcsIDB4OTIsIDB4ODQsIDB4MGJ9LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNlIDw8IDApIHwgKDB4NzcgPDwgNykgfCAoMHgxMiA8PCAxNCkgfCAoMHgwNCA8PCAyMSkgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDBiTCA8PCAyOCkpOw0KKw0KKyAgICAgICAgICAgIC8vIDY0LWJpdA0KKyAgICAgICAgICAgIC8vIDcyNTY0NTYxMjYNCisgICAgICAgICAgICBBc3NlcnRXcml0ZVZhcmludChuZXcgYnl0ZVtdIHsweGJlLCAweGY3LCAweDkyLCAweDg0LCAweDFifSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxYkwgPDwgMjgpKTsNCisgICAgICAgICAgICAvLyA0MTI1NjIwMjU4MDcxODMzNg0KKyAgICAgICAgICAgIEFzc2VydFdyaXRlVmFyaW50KA0KKyAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdIHsweDgwLCAweGU2LCAweGViLCAweDljLCAweGMzLCAweGM5LCAweGE0LCAweDQ5fSwNCisgICAgICAgICAgICAgICAgKDB4MDAgPDwgMCkgfCAoMHg2NiA8PCA3KSB8ICgweDZiIDw8IDE0KSB8ICgweDFjIDw8IDIxKSB8DQorICAgICAgICAgICAgICAgICgweDQzVUwgPDwgMjgpIHwgKDB4NDlMIDw8IDM1KSB8ICgweDI0VUwgPDwgNDIpIHwgKDB4NDlVTCA8PCA0OSkpOw0KKyAgICAgICAgICAgIC8vIDExOTY0Mzc4MzMwOTc4NzM1MTMxDQorICAgICAgICAgICAgQXNzZXJ0V3JpdGVWYXJpbnQoDQorICAgICAgICAgICAgICAgIG5ldyBieXRlW10gezB4OWIsIDB4YTgsIDB4ZjksIDB4YzIsIDB4YmIsIDB4ZDYsIDB4ODAsIDB4ODUsIDB4YTYsIDB4MDF9LA0KKyAgICAgICAgICAgICAgICB1bmNoZWNrZWQoKHVsb25nKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDFiIDw8IDApIHwgKDB4MjggPDwgNykgfCAoMHg3OSA8PCAxNCkgfCAoMHg0MiA8PCAyMSkgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNiTCA8PCAyOCkgfCAoMHg1NkwgPDwgMzUpIHwgKDB4MDBMIDw8IDQyKSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDVMIDw8IDQ5KSB8ICgweDI2TCA8PCA1NikgfCAoMHgwMUwgPDwgNjMpKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBhcnNlcyB0aGUgZ2l2ZW4gYnl0ZXMgdXNpbmcgV3JpdGVSYXdMaXR0bGVFbmRpYW4zMigpIGFuZCBjaGVja3MNCisgICAgICAgIC8vLyB0aGF0IHRoZSByZXN1bHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmFsdWUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjMyKGJ5dGVbXSBkYXRhLCB1aW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSByYXdPdXRwdXQgPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UocmF3T3V0cHV0KTsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdMaXR0bGVFbmRpYW4zMih2YWx1ZSk7DQorICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChkYXRhLCByYXdPdXRwdXQuVG9BcnJheSgpKTsNCisNCisgICAgICAgICAgICAvLyBUcnkgZGlmZmVyZW50IGJ1ZmZlciBzaXplcy4NCisgICAgICAgICAgICBmb3IgKGludCBidWZmZXJTaXplID0gMTsgYnVmZmVyU2l6ZSA8PSAxNjsgYnVmZmVyU2l6ZSAqPSAyKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmF3T3V0cHV0ID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShyYXdPdXRwdXQsIGJ1ZmZlclNpemUpOw0KKyAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdMaXR0bGVFbmRpYW4zMih2YWx1ZSk7DQorICAgICAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOw0KKyAgICAgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKGRhdGEsIHJhd091dHB1dC5Ub0FycmF5KCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIFdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoKSBhbmQgY2hlY2tzDQorICAgICAgICAvLy8gdGhhdCB0aGUgcmVzdWx0IG1hdGNoZXMgdGhlIGdpdmVuIHZhbHVlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW42NChieXRlW10gZGF0YSwgdWxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgTWVtb3J5U3RyZWFtIHJhd091dHB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsNCisgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShyYXdPdXRwdXQpOw0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd0xpdHRsZUVuZGlhbjY0KHZhbHVlKTsNCisgICAgICAgICAgICBvdXRwdXQuRmx1c2goKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKGRhdGEsIHJhd091dHB1dC5Ub0FycmF5KCkpOw0KKw0KKyAgICAgICAgICAgIC8vIFRyeSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMuDQorICAgICAgICAgICAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDw9IDE2OyBibG9ja1NpemUgKj0gMikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJhd091dHB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsNCisgICAgICAgICAgICAgICAgb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UocmF3T3V0cHV0LCBibG9ja1NpemUpOw0KKyAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdMaXR0bGVFbmRpYW42NCh2YWx1ZSk7DQorICAgICAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOw0KKyAgICAgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKGRhdGEsIHJhd091dHB1dC5Ub0FycmF5KCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUZXN0cyB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKCkgYW5kIHdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoKS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlTGl0dGxlRW5kaWFuKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjMyKG5ldyBieXRlW10gezB4NzgsIDB4NTYsIDB4MzQsIDB4MTJ9LCAweDEyMzQ1Njc4KTsNCisgICAgICAgICAgICBBc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjMyKG5ldyBieXRlW10gezB4ZjAsIDB4ZGUsIDB4YmMsIDB4OWF9LCAweDlhYmNkZWYwKTsNCisNCisgICAgICAgICAgICBBc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjY0KA0KKyAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdIHsweGYwLCAweGRlLCAweGJjLCAweDlhLCAweDc4LCAweDU2LCAweDM0LCAweDEyfSwNCisgICAgICAgICAgICAgICAgMHgxMjM0NTY3ODlhYmNkZWYwTCk7DQorICAgICAgICAgICAgQXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW42NCgNCisgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7MHg3OCwgMHg1NiwgMHgzNCwgMHgxMiwgMHhmMCwgMHhkZSwgMHhiYywgMHg5YX0sDQorICAgICAgICAgICAgICAgIDB4OWFiY2RlZjAxMjM0NTY3OFVMKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVXaG9sZU1lc3NhZ2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuR2V0QWxsU2V0KCk7DQorDQorICAgICAgICAgICAgYnl0ZVtdIHJhd0J5dGVzID0gbWVzc2FnZS5Ub0J5dGVBcnJheSgpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEVxdWFsQnl0ZXMoVGVzdFV0aWwuR29sZGVuTWVzc2FnZS5Ub0J5dGVBcnJheSgpLCByYXdCeXRlcyk7DQorDQorICAgICAgICAgICAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4NCisgICAgICAgICAgICBmb3IgKGludCBibG9ja1NpemUgPSAxOyBibG9ja1NpemUgPCAyNTY7IGJsb2NrU2l6ZSAqPSAyKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgTWVtb3J5U3RyZWFtIHJhd091dHB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsNCisgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0NCisgICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKHJhd091dHB1dCwgYmxvY2tTaXplKTsNCisgICAgICAgICAgICAgICAgbWVzc2FnZS5Xcml0ZVRvKG91dHB1dCk7DQorICAgICAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOw0KKyAgICAgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRFcXVhbEJ5dGVzKHJhd0J5dGVzLCByYXdPdXRwdXQuVG9BcnJheSgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGVzdHMgd3JpdGluZyBhIHdob2xlIG1lc3NhZ2Ugd2l0aCBldmVyeSBwYWNrZWQgZmllbGQgdHlwZS4gRW5zdXJlcyB0aGUNCisgICAgICAgIC8vLyB3aXJlIGZvcm1hdCBvZiBwYWNrZWQgZmllbGRzIGlzIGNvbXBhdGlibGUgd2l0aCBDKysuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVdob2xlUGFja2VkRmllbGRzTWVzc2FnZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5HZXRQYWNrZWRTZXQoKTsNCisNCisgICAgICAgICAgICBieXRlW10gcmF3Qnl0ZXMgPSBtZXNzYWdlLlRvQnl0ZUFycmF5KCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0RXF1YWxCeXRlcyhUZXN0VXRpbC5HZXRHb2xkZW5QYWNrZWRGaWVsZHNNZXNzYWdlKCkuVG9CeXRlQXJyYXkoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd0J5dGVzKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRW5jb2RlWmlnWmFnMzIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwdSwgQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnMzIoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxdSwgQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnMzIoLTEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMnUsIENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzMyKDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM3UsIENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzMyKC0yKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4N0ZGRkZGRkV1LCBDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWczMigweDNGRkZGRkZGKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4N0ZGRkZGRkZ1LCBDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWczMih1bmNoZWNrZWQoKGludCkgMHhDMDAwMDAwMCkpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHhGRkZGRkZGRXUsIENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzMyKDB4N0ZGRkZGRkYpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHhGRkZGRkZGRnUsIENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzMyKHVuY2hlY2tlZCgoaW50KSAweDgwMDAwMDAwKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBFbmNvZGVaaWdaYWc2NCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB1LCBDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWc2NCgwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDF1LCBDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWc2NCgtMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgydSwgQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnNjQoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzdSwgQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnNjQoLTIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHgwMDAwMDAwMDdGRkZGRkZFdUwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KHVuY2hlY2tlZCgobG9uZykgMHgwMDAwMDAwMDNGRkZGRkZGVUwpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4MDAwMDAwMDA3RkZGRkZGRnVMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWc2NCh1bmNoZWNrZWQoKGxvbmcpIDB4RkZGRkZGRkZDMDAwMDAwMFVMKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgweDAwMDAwMDAwRkZGRkZGRkV1TCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnNjQodW5jaGVja2VkKChsb25nKSAweDAwMDAwMDAwN0ZGRkZGRkZVTCkpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHgwMDAwMDAwMEZGRkZGRkZGdUwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KHVuY2hlY2tlZCgobG9uZykgMHhGRkZGRkZGRjgwMDAwMDAwVUwpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4RkZGRkZGRkZGRkZGRkZGRUwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KHVuY2hlY2tlZCgobG9uZykgMHg3RkZGRkZGRkZGRkZGRkZGVUwpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4RkZGRkZGRkZGRkZGRkZGRkwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KHVuY2hlY2tlZCgobG9uZykgMHg4MDAwMDAwMDAwMDAwMDAwVUwpKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJvdW5kVHJpcFppZ1phZzMyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBTb21lIGVhc2llci10by12ZXJpZnkgcm91bmQtdHJpcCB0ZXN0cy4gIFRoZSBpbnB1dHMgKG90aGVyIHRoYW4gMCwgMSwgLTEpDQorICAgICAgICAgICAgLy8gd2VyZSBjaG9zZW4gc2VtaS1yYW5kb21seSB2aWEga2V5Ym9hcmQgYmFzaGluZy4NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWczMihDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWczMigwKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzMyKENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzMyKDEpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0xLCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzMyKENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzMyKC0xKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNDkyNywgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWczMihDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWczMigxNDkyNykpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTM2MTIsIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnMzIoQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnMzIoLTM2MTIpKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJvdW5kVHJpcFppZ1phZzY0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWc2NChDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWc2NCgwKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzY0KENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KDEpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0xLCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzY0KENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KC0xKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNDkyNywgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWc2NChDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWc2NCgxNDkyNykpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTM2MTIsIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnNjQoQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnNjQoLTM2MTIpKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDg1NjkxMjMwNDgwMTQxNkwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnNjQoQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnNjQoODU2OTEyMzA0ODAxNDE2TCkpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTc1MTIzOTA1NDM5NTcxMjU2TCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWc2NChDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWc2NCgtNzUxMjM5MDU0Mzk1NzEyNTZMKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TmVnYXRpdmVFbnVtTm9UYWcoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMCwgQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKC0yKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwLCBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemVOb1RhZygtMikpOw0KKw0KKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzEwXTsNCisgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShieXRlcyk7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlRW51bU5vVGFnKC0yKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgb3V0cHV0LlNwYWNlTGVmdCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGRS1GRi1GRi1GRi1GRi1GRi1GRi1GRi1GRi0wMSIsIEJpdENvbnZlcnRlci5Ub1N0cmluZyhieXRlcykpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TmVnYXRpdmVFbnVtV2l0aFRhZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDExLCBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDgsIC0yKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDExLCBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoOCwgLTIpKTsNCisNCisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsxMV07DQorICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoYnl0ZXMpOw0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUVudW0oOCwgIiIsIC0yLCAtMik7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG91dHB1dC5TcGFjZUxlZnQpOw0KKyAgICAgICAgICAgIC8vZnlpLCAweDQwID09IDB4MDggPDwgMyArIDAsIGZpZWxkIG51bSArIHdpcmUgZm9ybWF0IHNoaWZ0DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI0MC1GRS1GRi1GRi1GRi1GRi1GRi1GRi1GRi1GRi0wMSIsIEJpdENvbnZlcnRlci5Ub1N0cmluZyhieXRlcykpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TmVnYXRpdmVFbnVtQXJyYXlQYWNrZWQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGludCBhcnJheVNpemUgPSAxICsgKDEwICogNSk7DQorICAgICAgICAgICAgaW50IG1zZ1NpemUgPSAxICsgMSArIGFycmF5U2l6ZTsNCisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVttc2dTaXplXTsNCisgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShieXRlcyk7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkRW51bUFycmF5KDgsICIiLCBhcnJheVNpemUsIG5ldyBpbnRbXSB7IDAsIC0xLCAtMiwgLTMsIC00LCAtNSB9KTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgb3V0cHV0LlNwYWNlTGVmdCk7DQorDQorICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoYnl0ZXMpOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBuYW1lOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgbmFtZSkpOw0KKw0KKyAgICAgICAgICAgIExpc3Q8aW50PiB2YWx1ZXMgPSBuZXcgTGlzdDxpbnQ+KCk7DQorICAgICAgICAgICAgaW5wdXQuUmVhZEludDMyQXJyYXkodGFnLCBuYW1lLCB2YWx1ZXMpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2LCB2YWx1ZXMuQ291bnQpOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpID4gLTY7IGktLSkNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGksIHZhbHVlc1tNYXRoLkFicyhpKV0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TmVnYXRpdmVFbnVtQXJyYXkoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGludCBhcnJheVNpemUgPSAxICsgMSArICgxMSAqIDUpOw0KKyAgICAgICAgICAgIGludCBtc2dTaXplID0gYXJyYXlTaXplOw0KKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW21zZ1NpemVdOw0KKyAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKGJ5dGVzKTsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVFbnVtQXJyYXkoOCwgIiIsIG5ldyBpbnRbXSB7IDAsIC0xLCAtMiwgLTMsIC00LCAtNSB9KTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgb3V0cHV0LlNwYWNlTGVmdCk7DQorDQorICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoYnl0ZXMpOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBuYW1lOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgbmFtZSkpOw0KKw0KKyAgICAgICAgICAgIExpc3Q8aW50PiB2YWx1ZXMgPSBuZXcgTGlzdDxpbnQ+KCk7DQorICAgICAgICAgICAgaW5wdXQuUmVhZEludDMyQXJyYXkodGFnLCBuYW1lLCB2YWx1ZXMpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2LCB2YWx1ZXMuQ291bnQpOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpID4gLTY7IGktLSkNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGksIHZhbHVlc1tNYXRoLkFicyhpKV0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0Q29kZWRJbnB1dE91dHB1dFBvc2l0aW9uKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBieXRlW10gY29udGVudCA9IG5ldyBieXRlWzExMF07DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50Lkxlbmd0aDsgaSsrKQ0KKyAgICAgICAgICAgICAgICBjb250ZW50W2ldID0gKGJ5dGUpaTsNCisNCisgICAgICAgICAgICBieXRlW10gY2hpbGQgPSBuZXcgYnl0ZVsxMjBdOw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbShjaGlsZCk7DQorICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtIGNvdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShtcywgMjApOw0KKyAgICAgICAgICAgICAgICAvLyBGaWVsZCAxMTogbnVtZXJpYyB2YWx1ZTogNTAwDQorICAgICAgICAgICAgICAgIGNvdXQuV3JpdGVUYWcoMTEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGNvdXQuUG9zaXRpb24pOw0KKyAgICAgICAgICAgICAgICBjb3V0LldyaXRlSW50MzJOb1RhZyg1MDApOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgY291dC5Qb3NpdGlvbik7DQorICAgICAgICAgICAgICAgIC8vRmllbGQgMTI6IGxlbmd0aCBkZWxpbWl0ZWQgMTIwIGJ5dGVzDQorICAgICAgICAgICAgICAgIGNvdXQuV3JpdGVUYWcoMTIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQsIGNvdXQuUG9zaXRpb24pOw0KKyAgICAgICAgICAgICAgICBjb3V0LldyaXRlQnl0ZXNOb1RhZyhCeXRlU3RyaW5nLkNvcHlGcm9tKGNvbnRlbnQpKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDExNSwgY291dC5Qb3NpdGlvbik7DQorICAgICAgICAgICAgICAgIC8vIEZpZWxkIDEzOiBmaXhlZCBudW1lcmljIHZhbHVlOiA1MDENCisgICAgICAgICAgICAgICAgY291dC5Xcml0ZVRhZygxMywgV2lyZUZvcm1hdC5XaXJlVHlwZS5GaXhlZDMyKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDExNiwgY291dC5Qb3NpdGlvbik7DQorICAgICAgICAgICAgICAgIGNvdXQuV3JpdGVTRml4ZWQzMk5vVGFnKDUwMSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjAsIGNvdXQuUG9zaXRpb24pOw0KKyAgICAgICAgICAgICAgICBjb3V0LkZsdXNoKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzEzMF07DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBjb3V0ID0gQ29kZWRPdXRwdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoYnl0ZXMpOw0KKyAgICAgICAgICAgICAgICAvLyBGaWVsZCAxOiBudW1lcmljIHZhbHVlOiA1MDANCisgICAgICAgICAgICAgICAgY291dC5Xcml0ZVRhZygxLCBXaXJlRm9ybWF0LldpcmVUeXBlLlZhcmludCk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBjb3V0LlBvc2l0aW9uKTsNCisgICAgICAgICAgICAgICAgY291dC5Xcml0ZUludDMyTm9UYWcoNTAwKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIGNvdXQuUG9zaXRpb24pOw0KKyAgICAgICAgICAgICAgICAvL0ZpZWxkIDI6IGxlbmd0aCBkZWxpbWl0ZWQgMTIwIGJ5dGVzDQorICAgICAgICAgICAgICAgIGNvdXQuV3JpdGVUYWcoMiwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNCwgY291dC5Qb3NpdGlvbik7DQorICAgICAgICAgICAgICAgIGNvdXQuV3JpdGVCeXRlc05vVGFnKEJ5dGVTdHJpbmcuQ29weUZyb20oY2hpbGQpKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyNSwgY291dC5Qb3NpdGlvbik7DQorICAgICAgICAgICAgICAgIC8vIEZpZWxkIDM6IGZpeGVkIG51bWVyaWMgdmFsdWU6IDUwMA0KKyAgICAgICAgICAgICAgICBjb3V0LldyaXRlVGFnKDMsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQzMik7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjYsIGNvdXQuUG9zaXRpb24pOw0KKyAgICAgICAgICAgICAgICBjb3V0LldyaXRlU0ZpeGVkMzJOb1RhZyg1MDEpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTMwLCBjb3V0LlBvc2l0aW9uKTsNCisgICAgICAgICAgICAgICAgY291dC5GbHVzaCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICAvL05vdyB0ZXN0IElucHV0IHN0cmVhbToNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gY2luID0gQ29kZWRJbnB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShuZXcgTWVtb3J5U3RyZWFtKGJ5dGVzKSwgbmV3IGJ5dGVbNTBdKTsNCisgICAgICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgICAgIGludCBpbnRWYWx1ZSA9IDA7DQorICAgICAgICAgICAgICAgIHN0cmluZyBpZ25vcmU7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBjaW4uUG9zaXRpb24pOw0KKyAgICAgICAgICAgICAgICAvLyBGaWVsZCAxOg0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGNpbi5SZWFkVGFnKG91dCB0YWcsIG91dCBpZ25vcmUpICYmIHRhZyA+PiAzID09IDEpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgY2luLlBvc2l0aW9uKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjaW4uUmVhZEludDMyKHJlZiBpbnRWYWx1ZSkgJiYgaW50VmFsdWUgPT0gNTAwKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIGNpbi5Qb3NpdGlvbik7DQorICAgICAgICAgICAgICAgIC8vRmllbGQgMjoNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjaW4uUmVhZFRhZyhvdXQgdGFnLCBvdXQgaWdub3JlKSAmJiB0YWcgPj4gMyA9PSAyKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQsIGNpbi5Qb3NpdGlvbik7DQorICAgICAgICAgICAgICAgIHVpbnQgY2hpbGRsZW4gPSBjaW4uUmVhZFJhd1ZhcmludDMyKCk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjB1LCBjaGlsZGxlbik7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1LCBjaW4uUG9zaXRpb24pOw0KKyAgICAgICAgICAgICAgICBpbnQgb2xkbGltaXQgPSBjaW4uUHVzaExpbWl0KChpbnQpY2hpbGRsZW4pOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNSwgY2luLlBvc2l0aW9uKTsNCisgICAgICAgICAgICAgICAgLy8gTm93IHdlIGFyZSByZWFkaW5nIGNoaWxkIG1lc3NhZ2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gRmllbGQgMTE6IG51bWVyaWMgdmFsdWU6IDUwMA0KKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjaW4uUmVhZFRhZyhvdXQgdGFnLCBvdXQgaWdub3JlKSAmJiB0YWcgPj4gMyA9PSAxMSk7DQorICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNiwgY2luLlBvc2l0aW9uKTsNCisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoY2luLlJlYWRJbnQzMihyZWYgaW50VmFsdWUpICYmIGludFZhbHVlID09IDUwMCk7DQorICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoOCwgY2luLlBvc2l0aW9uKTsNCisgICAgICAgICAgICAgICAgICAgIC8vRmllbGQgMTI6IGxlbmd0aCBkZWxpbWl0ZWQgMTIwIGJ5dGVzDQorICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGNpbi5SZWFkVGFnKG91dCB0YWcsIG91dCBpZ25vcmUpICYmIHRhZyA+PiAzID09IDEyKTsNCisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg5LCBjaW4uUG9zaXRpb24pOw0KKyAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyBic3RyID0gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoY2luLlJlYWRCeXRlcyhyZWYgYnN0cikgJiYgYnN0ci5MZW5ndGggPT0gMTEwICYmIGJzdHIuVG9CeXRlQXJyYXkoKVsxMDldID09IDEwOSk7DQorICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIwLCBjaW4uUG9zaXRpb24pOw0KKyAgICAgICAgICAgICAgICAgICAgLy8gRmllbGQgMTM6IGZpeGVkIG51bWVyaWMgdmFsdWU6IDUwMQ0KKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjaW4uUmVhZFRhZyhvdXQgdGFnLCBvdXQgaWdub3JlKSAmJiB0YWcgPj4gMyA9PSAxMyk7DQorICAgICAgICAgICAgICAgICAgICAvLyBST0sgLSBQcmV2aW91c2x5IGJyb2tlbiBoZXJlLCB0aGlzIHJldHVybmVkIDEyNiBmYWlsaW5nIHRvIGFjY291bnQgZm9yIGJ1ZmZlclNpemVBZnRlckxpbWl0DQorICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIxLCBjaW4uUG9zaXRpb24pOw0KKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjaW4uUmVhZFNGaXhlZDMyKHJlZiBpbnRWYWx1ZSkgJiYgaW50VmFsdWUgPT0gNTAxKTsNCisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjUsIGNpbi5Qb3NpdGlvbik7DQorICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGNpbi5Jc0F0RW5kKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjaW4uUG9wTGltaXQob2xkbGltaXQpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTI1LCBjaW4uUG9zaXRpb24pOw0KKyAgICAgICAgICAgICAgICAvLyBGaWVsZCAzOiBmaXhlZCBudW1lcmljIHZhbHVlOiA1MDENCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjaW4uUmVhZFRhZyhvdXQgdGFnLCBvdXQgaWdub3JlKSAmJiB0YWcgPj4gMyA9PSAzKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyNiwgY2luLlBvc2l0aW9uKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjaW4uUmVhZFNGaXhlZDMyKHJlZiBpbnRWYWx1ZSkgJiYgaW50VmFsdWUgPT0gNTAxKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEzMCwgY2luLlBvc2l0aW9uKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjaW4uSXNBdEVuZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQ29sbGVjdGlvbnMvUG9wc2ljbGVMaXN0VGVzdC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQ29sbGVjdGlvbnMvUG9wc2ljbGVMaXN0VGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmNlNjBkCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Db2xsZWN0aW9ucy9Qb3BzaWNsZUxpc3RUZXN0LmNzCkBAIC0wLDAgKzEsMTUzIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zDQorew0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgUG9wc2ljbGVMaXN0VGVzdA0KKyAgICB7DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIE11dGF0aW5nT3BlcmF0aW9uc09uRnJvemVuTGlzdCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgUG9wc2ljbGVMaXN0PHN0cmluZz4gbGlzdCA9IG5ldyBQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICAgICAgICAgIGxpc3QuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Tm90U3VwcG9ydGVkKCgpID0+IGxpc3QuQWRkKCIiKSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Tm90U3VwcG9ydGVkKCgpID0+IGxpc3QuQ2xlYXIoKSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Tm90U3VwcG9ydGVkKCgpID0+IGxpc3QuSW5zZXJ0KDAsICIiKSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Tm90U3VwcG9ydGVkKCgpID0+IGxpc3QuUmVtb3ZlKCIiKSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Tm90U3VwcG9ydGVkKCgpID0+IGxpc3QuUmVtb3ZlQXQoMCkpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydE5vdFN1cHBvcnRlZCgoKSA9PiBsaXN0LkFkZChuZXdbXSB7ICIiLCAiIiB9KSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIE5vbk11dGF0aW5nT3BlcmF0aW9uc09uRnJvemVuTGlzdCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgUG9wc2ljbGVMaXN0PHN0cmluZz4gbGlzdCA9IG5ldyBQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICAgICAgICAgIGxpc3QuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobGlzdC5Db250YWlucygiIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBsaXN0LkNvdW50KTsNCisgICAgICAgICAgICBsaXN0LkNvcHlUbyhuZXcgc3RyaW5nWzVdLCAwKTsNCisgICAgICAgICAgICBsaXN0LkdldEVudW1lcmF0b3IoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTEsIGxpc3QuSW5kZXhPZigiIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobGlzdC5Jc1JlYWRPbmx5KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgTXV0YXRpbmdPcGVyYXRpb25zT25GbHVpZExpc3QoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFBvcHNpY2xlTGlzdDxzdHJpbmc+IGxpc3QgPSBuZXcgUG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgICAgICAgICBsaXN0LkFkZCgiIik7DQorICAgICAgICAgICAgbGlzdC5DbGVhcigpOw0KKyAgICAgICAgICAgIGxpc3QuSW5zZXJ0KDAsICIiKTsNCisgICAgICAgICAgICBsaXN0LlJlbW92ZSgiIik7DQorICAgICAgICAgICAgbGlzdC5BZGQoIngiKTsgLy8gSnVzdCB0byBtYWtlIHRoZSBuZXh0IGNhbGwgdmFsaWQNCisgICAgICAgICAgICBsaXN0LlJlbW92ZUF0KDApOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBOb25NdXRhdGluZ09wZXJhdGlvbnNPbkZsdWlkTGlzdCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgUG9wc2ljbGVMaXN0PHN0cmluZz4gbGlzdCA9IG5ldyBQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGxpc3QuQ29udGFpbnMoIiIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbGlzdC5Db3VudCk7DQorICAgICAgICAgICAgbGlzdC5Db3B5VG8obmV3IHN0cmluZ1s1XSwgMCk7DQorICAgICAgICAgICAgbGlzdC5HZXRFbnVtZXJhdG9yKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0xLCBsaXN0LkluZGV4T2YoIiIpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShsaXN0LklzUmVhZE9ubHkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEb2VzTm90QWRkTnVsbEVudW1lcmFibGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFBvcHNpY2xlTGlzdDxzdHJpbmc+IGxpc3QgPSBuZXcgUG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGxpc3QuQWRkKChJRW51bWVyYWJsZTxzdHJpbmc+KW51bGwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoQXJndW1lbnROdWxsRXhjZXB0aW9uKQ0KKyAgICAgICAgICAgIHsgcmV0dXJuOyB9DQorDQorICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIkxpc3Qgc2hvdWxkIG5vdCBhbGxvdyBudWxscy4iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRG9lc05vdEFkZFJhbmdlV2l0aE51bGwoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFBvcHNpY2xlTGlzdDxzdHJpbmc+IGxpc3QgPSBuZXcgUG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGxpc3QuQWRkKG5ld1tdIHsgImEiLCAiYiIsIG51bGwgfSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChBcmd1bWVudE51bGxFeGNlcHRpb24pDQorICAgICAgICAgICAgeyByZXR1cm47IH0NCisNCisgICAgICAgICAgICBBc3NlcnQuRmFpbCgiTGlzdCBzaG91bGQgbm90IGFsbG93IG51bGxzLiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEb2VzTm90QWRkTnVsbCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgUG9wc2ljbGVMaXN0PHN0cmluZz4gbGlzdCA9IG5ldyBQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbGlzdC5BZGQoKHN0cmluZyludWxsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikNCisgICAgICAgICAgICB7IHJldHVybjsgfQ0KKw0KKyAgICAgICAgICAgIEFzc2VydC5GYWlsKCJMaXN0IHNob3VsZCBub3QgYWxsb3cgbnVsbHMuIik7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIERvZXNOb3RTZXROdWxsKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBQb3BzaWNsZUxpc3Q8c3RyaW5nPiBsaXN0ID0gbmV3IFBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgICAgICAgICAgbGlzdC5BZGQoImEiKTsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBudWxsOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoQXJndW1lbnROdWxsRXhjZXB0aW9uKQ0KKyAgICAgICAgICAgIHsgcmV0dXJuOyB9DQorDQorICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIkxpc3Qgc2hvdWxkIG5vdCBhbGxvdyBudWxscy4iKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvbXBhdGliaWxpdHkvQmluYXJ5Q29tcGF0aWJpbGl0eVRlc3RzLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Db21wYXRpYmlsaXR5L0JpbmFyeUNvbXBhdGliaWxpdHlUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzA3ZjhlCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Db21wYXRpYmlsaXR5L0JpbmFyeUNvbXBhdGliaWxpdHlUZXN0cy5jcwpAQCAtMCwwICsxLDIwIEBACivvu791c2luZyBTeXN0ZW07DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGF0aWJpbGl0eQ0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIEJpbmFyeUNvbXBhdGliaWxpdHlUZXN0cyA6IENvbXBhdGliaWxpdHlUZXN0cw0KKyAgICB7DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb2JqZWN0IFNlcmlhbGl6ZU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPihUTWVzc2FnZSBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJ5dGVbXSBicmVzdWx0ID0gbWVzc2FnZS5Ub0J5dGVBcnJheSgpOw0KKyAgICAgICAgICAgIHJldHVybiBDb252ZXJ0LlRvQmFzZTY0U3RyaW5nKGJyZXN1bHQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRCdWlsZGVyIERlc2VyaWFsaXplTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+KG9iamVjdCBtZXNzYWdlLCBUQnVpbGRlciBidWlsZGVyLCBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5NZXJnZUZyb20oKGJ5dGVbXSlDb252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoKHN0cmluZyltZXNzYWdlKSwgcmVnaXN0cnkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQ29tcGF0aWJpbGl0eS9Db21wYXRpYmlsaXR5VGVzdHMuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvbXBhdGliaWxpdHkvQ29tcGF0aWJpbGl0eVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMTg5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvbXBhdGliaWxpdHkvQ29tcGF0aWJpbGl0eVRlc3RzLmNzCkBAIC0wLDAgKzEsMjI3IEBACivvu791c2luZyBTeXN0ZW07DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zOw0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KKw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbXBhdGliaWxpdHkNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFRoaXMgYWJzdHJhY3QgYmFzZSBpbXBsZW1lbnRzIHNldmVyYWwgdGVzdHMgdG8gZW5zdXJlIHRoYXQgd2VsbC1rbm93biBtZXNzYWdlcyBjYW4gYmUgd3JpdHRlbg0KKyAgICAvLy8gYW5kIHJlYWQgdG8vZnJvbSB2YXJpb3VzIGZvcm1hdHMgd2l0aG91dCBsb29zaW5nIGRhdGEuICBJbXBsZW1lbnRhdGlvbnMgb3ZlcmxvYWQgdGhlIHR3byBzZXJhaWxpemF0aW9uDQorICAgIC8vLyBtZXRob2RzIHRvIHByb3ZpZGUgdGhlIHRlc3RzIHdpdGggdGhlIG1lYW5zIHRvIHJlYWQgYW5kIHdyaXRlIGZvciBhIGdpdmVuIGZvcm1hdC4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBhdGliaWxpdHlUZXN0cw0KKyAgICB7DQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgb2JqZWN0IFNlcmlhbGl6ZU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPihUTWVzc2FnZSBtZXNzYWdlKQ0KKyAgICAgICAgICAgIHdoZXJlIFRNZXNzYWdlIDogSU1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgICAgICB3aGVyZSBUQnVpbGRlciA6IElCdWlsZGVyTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+Ow0KKw0KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFRCdWlsZGVyIERlc2VyaWFsaXplTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+KG9iamVjdCBtZXNzYWdlLCBUQnVpbGRlciBidWlsZGVyLCBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkNCisgICAgICAgICAgICB3aGVyZSBUTWVzc2FnZSA6IElNZXNzYWdlTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgICAgICAgICAgd2hlcmUgVEJ1aWxkZXIgOiBJQnVpbGRlckxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPjsNCisNCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgQXNzZXJ0T3V0cHV0RXF1YWxzKG9iamVjdCBsaHMsIG9iamVjdCByaHMpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsPG9iamVjdD4obGhzLCByaHMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJvdW5kVHJpcFdpdGhFbXB0eUNoaWxkTWVzc2FnZVNpemUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFNpemVNZXNzYWdlMSBtc2cgPSBTaXplTWVzc2FnZTEuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRGaWVsZDEwMCgxMDApDQorICAgICAgICAgICAgICAgIC5TZXRGaWVsZDE1KFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgYnl0ZVtdIGNvbnRlbnRzID0gbXNnLlRvQnl0ZUFycmF5KCk7DQorICAgICAgICAgICAgb2JqZWN0IGNvbnRlbnQgPSBTZXJpYWxpemVNZXNzYWdlPFNpemVNZXNzYWdlMSwgU2l6ZU1lc3NhZ2UxLkJ1aWxkZXI+KG1zZyk7DQorDQorICAgICAgICAgICAgU2l6ZU1lc3NhZ2UxIGNvcHkgPSBEZXNlcmlhbGl6ZU1lc3NhZ2U8U2l6ZU1lc3NhZ2UxLCBTaXplTWVzc2FnZTEuQnVpbGRlcj4oY29udGVudCwgU2l6ZU1lc3NhZ2UxLkNyZWF0ZUJ1aWxkZXIoKSwgRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpLkJ1aWxkUGFydGlhbCgpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtc2csIGNvcHkpOw0KKyAgICAgICAgICAgIEFzc2VydE91dHB1dEVxdWFscyhjb250ZW50LCBTZXJpYWxpemVNZXNzYWdlPFNpemVNZXNzYWdlMSwgU2l6ZU1lc3NhZ2UxLkJ1aWxkZXI+KGNvcHkpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQ29udmVydC5Ub0Jhc2U2NFN0cmluZyhjb250ZW50cyksIENvbnZlcnQuVG9CYXNlNjRTdHJpbmcoY29weS5Ub0J5dGVBcnJheSgpKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUm91bmRUcmlwV2l0aEVtcHR5Q2hpbGRNZXNzYWdlU3BlZWQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFNwZWVkTWVzc2FnZTEgbXNnID0gU3BlZWRNZXNzYWdlMS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldEZpZWxkMTAwKDEwMCkNCisgICAgICAgICAgICAgICAgLlNldEZpZWxkMTUoU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgYnl0ZVtdIGNvbnRlbnRzID0gbXNnLlRvQnl0ZUFycmF5KCk7DQorICAgICAgICAgICAgb2JqZWN0IGNvbnRlbnQgPSBTZXJpYWxpemVNZXNzYWdlPFNwZWVkTWVzc2FnZTEsIFNwZWVkTWVzc2FnZTEuQnVpbGRlcj4obXNnKTsNCisNCisgICAgICAgICAgICBTcGVlZE1lc3NhZ2UxIGNvcHkgPSBEZXNlcmlhbGl6ZU1lc3NhZ2U8U3BlZWRNZXNzYWdlMSwgU3BlZWRNZXNzYWdlMS5CdWlsZGVyPihjb250ZW50LCBTcGVlZE1lc3NhZ2UxLkNyZWF0ZUJ1aWxkZXIoKSwgRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpLkJ1aWxkUGFydGlhbCgpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtc2csIGNvcHkpOw0KKyAgICAgICAgICAgIEFzc2VydE91dHB1dEVxdWFscyhjb250ZW50LCBTZXJpYWxpemVNZXNzYWdlPFNwZWVkTWVzc2FnZTEsIFNwZWVkTWVzc2FnZTEuQnVpbGRlcj4oY29weSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChDb252ZXJ0LlRvQmFzZTY0U3RyaW5nKGNvbnRlbnRzKSwgQ29udmVydC5Ub0Jhc2U2NFN0cmluZyhjb3B5LlRvQnl0ZUFycmF5KCkpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSb3VuZFRyaXBNZXNzYWdlMU9wdGltaXplU2l6ZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgU2l6ZU1lc3NhZ2UxIG1zZyA9IFNpemVNZXNzYWdlMS5DcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKFRlc3RSZXNvdXJjZXMuZ29vZ2xlX21lc3NhZ2UxKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIG9iamVjdCBjb250ZW50ID0gU2VyaWFsaXplTWVzc2FnZTxTaXplTWVzc2FnZTEsIFNpemVNZXNzYWdlMS5CdWlsZGVyPihtc2cpOw0KKw0KKyAgICAgICAgICAgIFNpemVNZXNzYWdlMSBjb3B5ID0gRGVzZXJpYWxpemVNZXNzYWdlPFNpemVNZXNzYWdlMSwgU2l6ZU1lc3NhZ2UxLkJ1aWxkZXI+KGNvbnRlbnQsIFNpemVNZXNzYWdlMS5DcmVhdGVCdWlsZGVyKCksIEV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KS5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtc2csIGNvcHkpOw0KKyAgICAgICAgICAgIEFzc2VydE91dHB1dEVxdWFscyhjb250ZW50LCBTZXJpYWxpemVNZXNzYWdlPFNpemVNZXNzYWdlMSwgU2l6ZU1lc3NhZ2UxLkJ1aWxkZXI+KGNvcHkpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQ29udmVydC5Ub0Jhc2U2NFN0cmluZyhUZXN0UmVzb3VyY2VzLmdvb2dsZV9tZXNzYWdlMSksIENvbnZlcnQuVG9CYXNlNjRTdHJpbmcoY29weS5Ub0J5dGVBcnJheSgpKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUm91bmRUcmlwTWVzc2FnZTJPcHRpbWl6ZVNpemUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFNpemVNZXNzYWdlMiBtc2cgPSBTaXplTWVzc2FnZTIuQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShUZXN0UmVzb3VyY2VzLmdvb2dsZV9tZXNzYWdlMikuQnVpbGQoKTsNCisgICAgICAgICAgICBvYmplY3QgY29udGVudCA9IFNlcmlhbGl6ZU1lc3NhZ2U8U2l6ZU1lc3NhZ2UyLCBTaXplTWVzc2FnZTIuQnVpbGRlcj4obXNnKTsNCisNCisgICAgICAgICAgICBTaXplTWVzc2FnZTIgY29weSA9IERlc2VyaWFsaXplTWVzc2FnZTxTaXplTWVzc2FnZTIsIFNpemVNZXNzYWdlMi5CdWlsZGVyPihjb250ZW50LCBTaXplTWVzc2FnZTIuQ3JlYXRlQnVpbGRlcigpLCBFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSkuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobXNnLCBjb3B5KTsNCisgICAgICAgICAgICBBc3NlcnRPdXRwdXRFcXVhbHMoY29udGVudCwgU2VyaWFsaXplTWVzc2FnZTxTaXplTWVzc2FnZTIsIFNpemVNZXNzYWdlMi5CdWlsZGVyPihjb3B5KSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKENvbnZlcnQuVG9CYXNlNjRTdHJpbmcoVGVzdFJlc291cmNlcy5nb29nbGVfbWVzc2FnZTIpLCBDb252ZXJ0LlRvQmFzZTY0U3RyaW5nKGNvcHkuVG9CeXRlQXJyYXkoKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJvdW5kVHJpcE1lc3NhZ2UxT3B0aW1pemVTcGVlZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgU3BlZWRNZXNzYWdlMSBtc2cgPSBTcGVlZE1lc3NhZ2UxLkNyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oVGVzdFJlc291cmNlcy5nb29nbGVfbWVzc2FnZTEpLkJ1aWxkKCk7DQorICAgICAgICAgICAgb2JqZWN0IGNvbnRlbnQgPSBTZXJpYWxpemVNZXNzYWdlPFNwZWVkTWVzc2FnZTEsIFNwZWVkTWVzc2FnZTEuQnVpbGRlcj4obXNnKTsNCisNCisgICAgICAgICAgICBTcGVlZE1lc3NhZ2UxIGNvcHkgPSBEZXNlcmlhbGl6ZU1lc3NhZ2U8U3BlZWRNZXNzYWdlMSwgU3BlZWRNZXNzYWdlMS5CdWlsZGVyPihjb250ZW50LCBTcGVlZE1lc3NhZ2UxLkNyZWF0ZUJ1aWxkZXIoKSwgRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1zZywgY29weSk7DQorICAgICAgICAgICAgQXNzZXJ0T3V0cHV0RXF1YWxzKGNvbnRlbnQsIFNlcmlhbGl6ZU1lc3NhZ2U8U3BlZWRNZXNzYWdlMSwgU3BlZWRNZXNzYWdlMS5CdWlsZGVyPihjb3B5KSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKENvbnZlcnQuVG9CYXNlNjRTdHJpbmcoVGVzdFJlc291cmNlcy5nb29nbGVfbWVzc2FnZTEpLCBDb252ZXJ0LlRvQmFzZTY0U3RyaW5nKGNvcHkuVG9CeXRlQXJyYXkoKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJvdW5kVHJpcE1lc3NhZ2UyT3B0aW1pemVTcGVlZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgU3BlZWRNZXNzYWdlMiBtc2cgPSBTcGVlZE1lc3NhZ2UyLkNyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oVGVzdFJlc291cmNlcy5nb29nbGVfbWVzc2FnZTIpLkJ1aWxkKCk7DQorICAgICAgICAgICAgb2JqZWN0IGNvbnRlbnQgPSBTZXJpYWxpemVNZXNzYWdlPFNwZWVkTWVzc2FnZTIsIFNwZWVkTWVzc2FnZTIuQnVpbGRlcj4obXNnKTsNCisNCisgICAgICAgICAgICBTcGVlZE1lc3NhZ2UyIGNvcHkgPSBEZXNlcmlhbGl6ZU1lc3NhZ2U8U3BlZWRNZXNzYWdlMiwgU3BlZWRNZXNzYWdlMi5CdWlsZGVyPihjb250ZW50LCBTcGVlZE1lc3NhZ2UyLkNyZWF0ZUJ1aWxkZXIoKSwgRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1zZywgY29weSk7DQorICAgICAgICAgICAgQXNzZXJ0T3V0cHV0RXF1YWxzKGNvbnRlbnQsIFNlcmlhbGl6ZU1lc3NhZ2U8U3BlZWRNZXNzYWdlMiwgU3BlZWRNZXNzYWdlMi5CdWlsZGVyPihjb3B5KSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKENvbnZlcnQuVG9CYXNlNjRTdHJpbmcoVGVzdFJlc291cmNlcy5nb29nbGVfbWVzc2FnZTIpLCBDb252ZXJ0LlRvQmFzZTY0U3RyaW5nKGNvcHkuVG9CeXRlQXJyYXkoKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI3JlZ2lvbiBUZXN0IG1lc3NhZ2UgYnVpbGRlcnMNCisNCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgQWRkQWxsVHlwZXMoVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5TZXRPcHRpb25hbEludDMyKDEwMDEpDQorICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbEludDY0KDEwMDEpDQorICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbFVpbnQzMigxMDAxKQ0KKyAgICAgICAgICAgICAgICAuU2V0T3B0aW9uYWxVaW50NjQoMTAwMSkNCisgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsU2ludDMyKC0xMDAxKQ0KKyAgICAgICAgICAgICAgICAuU2V0T3B0aW9uYWxTaW50NjQoLTEwMDEpDQorICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbEZpeGVkMzIoMTAwMSkNCisgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsRml4ZWQ2NCgxMDAxKQ0KKyAgICAgICAgICAgICAgICAuU2V0T3B0aW9uYWxTZml4ZWQzMigtMTAwMSkNCisgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsU2ZpeGVkNjQoLTEwMDEpDQorICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbEZsb2F0KDEwMDEuMTAwMWYpDQorICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbERvdWJsZSgxMDAxLjEwMDEpDQorICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbEJvb2wodHJ1ZSkNCisgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsU3RyaW5nKCJ0aGlzIGlzIGEgc3RyaW5nIHZhbHVlIikNCisgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsQnl0ZXMoQnl0ZVN0cmluZy5Db3B5RnJvbVV0ZjgoInRoaXMgaXMgYW4gYXJyYXkgb2YgYnl0ZXMiKSkNCisgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsR3JvdXAobmV3IFRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwLkJ1aWxkZXIoKS5TZXRBKDEwMDEpKQ0KKyAgICAgICAgICAgICAgICAuU2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKG5ldyBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyKCkuU2V0QmIoMTAwMSkpDQorICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uRk9PKQ0KKyAgICAgICAgICAgIDsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgQWRkUmVwZWF0ZWRUeXBlcyhUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyLCBpbnQgc2l6ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvL3JlcGVhdGVkIHZhbHVlcw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KKyAgICAgICAgICAgICAgICBidWlsZGVyLkFkZFJlcGVhdGVkSW50MzIoMTAwMSArIGkpDQorICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZEludDY0KDEwMDEpDQorICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZFVpbnQzMigxMDAxKQ0KKyAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWRVaW50NjQoMTAwMSkNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkU2ludDMyKC0xMDAxKQ0KKyAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWRTaW50NjQoLTEwMDEpDQorICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZEZpeGVkMzIoMTAwMSkNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkRml4ZWQ2NCgxMDAxKQ0KKyAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWRTZml4ZWQzMigtMTAwMSkNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkU2ZpeGVkNjQoLTEwMDEpDQorICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZEZsb2F0KDEwMDEuMTAwMWYpDQorICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZERvdWJsZSgxMDAxLjEwMDEpDQorICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZEJvb2wodHJ1ZSkNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkU3RyaW5nKCJ0aGlzIGlzIGEgc3RyaW5nIHZhbHVlIikNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkQnl0ZXMoQnl0ZVN0cmluZy5Db3B5RnJvbVV0ZjgoInRoaXMgaXMgYW4gYXJyYXkgb2YgYnl0ZXMiKSkNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkR3JvdXAobmV3IFRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwLkJ1aWxkZXIoKS5TZXRBKDEwMDEpKQ0KKyAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKG5ldyBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyKCkuU2V0QmIoMTAwMSkpDQorICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uRk9PKQ0KKyAgICAgICAgICAgIDsNCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXIgQWRkUGFja2VkVHlwZXMoVGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXIgYnVpbGRlciwgaW50IHNpemUpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yKGludCBpPTA7IGkgPCBzaXplOyBpKysgKQ0KKyAgICAgICAgICAgICAgICBidWlsZGVyLkFkZFBhY2tlZEludDMyKDEwMDEpDQorICAgICAgICAgICAgICAgIC5BZGRQYWNrZWRJbnQ2NCgxMDAxKQ0KKyAgICAgICAgICAgICAgICAuQWRkUGFja2VkVWludDMyKDEwMDEpDQorICAgICAgICAgICAgICAgIC5BZGRQYWNrZWRVaW50NjQoMTAwMSkNCisgICAgICAgICAgICAgICAgLkFkZFBhY2tlZFNpbnQzMigtMTAwMSkNCisgICAgICAgICAgICAgICAgLkFkZFBhY2tlZFNpbnQ2NCgtMTAwMSkNCisgICAgICAgICAgICAgICAgLkFkZFBhY2tlZEZpeGVkMzIoMTAwMSkNCisgICAgICAgICAgICAgICAgLkFkZFBhY2tlZEZpeGVkNjQoMTAwMSkNCisgICAgICAgICAgICAgICAgLkFkZFBhY2tlZFNmaXhlZDMyKC0xMDAxKQ0KKyAgICAgICAgICAgICAgICAuQWRkUGFja2VkU2ZpeGVkNjQoLTEwMDEpDQorICAgICAgICAgICAgICAgIC5BZGRQYWNrZWRGbG9hdCgxMDAxLjEwMDFmKQ0KKyAgICAgICAgICAgICAgICAuQWRkUGFja2VkRG91YmxlKDEwMDEuMTAwMSkNCisgICAgICAgICAgICAgICAgLkFkZFBhY2tlZEJvb2wodHJ1ZSkNCisgICAgICAgICAgICAgICAgLkFkZFBhY2tlZEVudW0oRm9yZWlnbkVudW0uRk9SRUlHTl9GT08pDQorICAgICAgICAgICAgOw0KKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0Um91bmRUcmlwQWxsVHlwZXMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtc2cgPSBBZGRBbGxUeXBlcyhuZXcgVGVzdEFsbFR5cGVzLkJ1aWxkZXIoKSkuQnVpbGQoKTsNCisgICAgICAgICAgICBvYmplY3QgY29udGVudCA9IFNlcmlhbGl6ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlcj4obXNnKTsNCisNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgY29weSA9IERlc2VyaWFsaXplTWVzc2FnZTxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyPihjb250ZW50LCBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpLCBFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSkuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobXNnLCBjb3B5KTsNCisgICAgICAgICAgICBBc3NlcnRPdXRwdXRFcXVhbHMoY29udGVudCwgU2VyaWFsaXplTWVzc2FnZTxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyPihjb3B5KSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKENvbnZlcnQuVG9CYXNlNjRTdHJpbmcobXNnLlRvQnl0ZUFycmF5KCkpLCBDb252ZXJ0LlRvQmFzZTY0U3RyaW5nKGNvcHkuVG9CeXRlQXJyYXkoKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0Um91bmRUcmlwUmVwZWF0ZWRUeXBlcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIG1zZyA9IEFkZFJlcGVhdGVkVHlwZXMobmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyKCksIDUpLkJ1aWxkKCk7DQorICAgICAgICAgICAgb2JqZWN0IGNvbnRlbnQgPSBTZXJpYWxpemVNZXNzYWdlPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXI+KG1zZyk7DQorDQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIGNvcHkgPSBEZXNlcmlhbGl6ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlcj4oY29udGVudCwgVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKSwgRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1zZywgY29weSk7DQorICAgICAgICAgICAgQXNzZXJ0T3V0cHV0RXF1YWxzKGNvbnRlbnQsIFNlcmlhbGl6ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlcj4oY29weSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChDb252ZXJ0LlRvQmFzZTY0U3RyaW5nKG1zZy5Ub0J5dGVBcnJheSgpKSwgQ29udmVydC5Ub0Jhc2U2NFN0cmluZyhjb3B5LlRvQnl0ZUFycmF5KCkpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFJvdW5kVHJpcFBhY2tlZFR5cGVzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0UGFja2VkVHlwZXMgbXNnID0gQWRkUGFja2VkVHlwZXMobmV3IFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyKCksIDUpLkJ1aWxkKCk7DQorICAgICAgICAgICAgb2JqZWN0IGNvbnRlbnQgPSBTZXJpYWxpemVNZXNzYWdlPFRlc3RQYWNrZWRUeXBlcywgVGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXI+KG1zZyk7DQorDQorICAgICAgICAgICAgVGVzdFBhY2tlZFR5cGVzIGNvcHkgPSBEZXNlcmlhbGl6ZU1lc3NhZ2U8VGVzdFBhY2tlZFR5cGVzLCBUZXN0UGFja2VkVHlwZXMuQnVpbGRlcj4oY29udGVudCwgVGVzdFBhY2tlZFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKSwgRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1zZywgY29weSk7DQorICAgICAgICAgICAgQXNzZXJ0T3V0cHV0RXF1YWxzKGNvbnRlbnQsIFNlcmlhbGl6ZU1lc3NhZ2U8VGVzdFBhY2tlZFR5cGVzLCBUZXN0UGFja2VkVHlwZXMuQnVpbGRlcj4oY29weSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChDb252ZXJ0LlRvQmFzZTY0U3RyaW5nKG1zZy5Ub0J5dGVBcnJheSgpKSwgQ29udmVydC5Ub0Jhc2U2NFN0cmluZyhjb3B5LlRvQnl0ZUFycmF5KCkpKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvbXBhdGliaWxpdHkvRGljdGlvbmFyeUNvbXBhdGliaWxpdHlUZXN0cy5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQ29tcGF0aWJpbGl0eS9EaWN0aW9uYXJ5Q29tcGF0aWJpbGl0eVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMDM3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvbXBhdGliaWxpdHkvRGljdGlvbmFyeUNvbXBhdGliaWxpdHlUZXN0cy5jcwpAQCAtMCwwICsxLDM3IEBACit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgU3lzdGVtLklPOw0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Db21wYXRpYmlsaXR5DQorew0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgRGljdGlvbmFyeUNvbXBhdGliaWxpdHlUZXN0cyA6IENvbXBhdGliaWxpdHlUZXN0cw0KKyAgICB7DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb2JqZWN0IFNlcmlhbGl6ZU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPihUTWVzc2FnZSBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIERpY3Rpb25hcnlXcml0ZXIgd3JpdGVyID0gbmV3IERpY3Rpb25hcnlXcml0ZXIoKTsNCisgICAgICAgICAgICB3cml0ZXIuV3JpdGVNZXNzYWdlKG1lc3NhZ2UpOw0KKyAgICAgICAgICAgIHJldHVybiB3cml0ZXIuVG9EaWN0aW9uYXJ5KCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVEJ1aWxkZXIgRGVzZXJpYWxpemVNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4ob2JqZWN0IG1lc3NhZ2UsIFRCdWlsZGVyIGJ1aWxkZXIsIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5UmVhZGVyKChJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4pbWVzc2FnZSkuTWVyZ2UoYnVpbGRlcik7DQorICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7DQorICAgICAgICB9DQorDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBBc3NlcnRPdXRwdXRFcXVhbHMob2JqZWN0IGxocywgb2JqZWN0IHJocykNCisgICAgICAgIHsNCisgICAgICAgICAgICBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gbGVmdCA9IChJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4pbGhzOw0KKyAgICAgICAgICAgIElEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PiByaWdodCA9IChJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4pcmhzOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgNCisgICAgICAgICAgICAgICAgU3RyaW5nLkpvaW4oIiwiLCBuZXcgTGlzdDxzdHJpbmc+KGxlZnQuS2V5cykuVG9BcnJheSgpKSwNCisgICAgICAgICAgICAgICAgU3RyaW5nLkpvaW4oIiwiLCBuZXcgTGlzdDxzdHJpbmc+KHJpZ2h0LktleXMpLlRvQXJyYXkoKSkNCisgICAgICAgICAgICApOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQ29tcGF0aWJpbGl0eS9Kc29uQ29tcGF0aWJpbGl0eVRlc3RzLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Db21wYXRpYmlsaXR5L0pzb25Db21wYXRpYmlsaXR5VGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2MDMxMAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQ29tcGF0aWJpbGl0eS9Kc29uQ29tcGF0aWJpbGl0eVRlc3RzLmNzCkBAIC0wLDAgKzEsNDQgQEAKK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb247DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGF0aWJpbGl0eQ0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIEpzb25Db21wYXRpYmlsaXR5VGVzdHMgOiBDb21wYXRpYmlsaXR5VGVzdHMNCisgICAgew0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIG9iamVjdCBTZXJpYWxpemVNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4oVE1lc3NhZ2UgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQorICAgICAgICAgICAgSnNvbkZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZShzdykNCisgICAgICAgICAgICAgICAgLldyaXRlTWVzc2FnZShtZXNzYWdlKTsNCisgICAgICAgICAgICByZXR1cm4gc3cuVG9TdHJpbmcoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUQnVpbGRlciBEZXNlcmlhbGl6ZU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPihvYmplY3QgbWVzc2FnZSwgVEJ1aWxkZXIgYnVpbGRlciwgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgSnNvbkZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZSgoc3RyaW5nKW1lc3NhZ2UpLk1lcmdlKGJ1aWxkZXIpOw0KKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIFtUZXN0Q2xhc3NdDQorICAgIHB1YmxpYyBjbGFzcyBKc29uQ29tcGF0aWJpbGl0eUZvcm1hdHRlZFRlc3RzIDogQ29tcGF0aWJpbGl0eVRlc3RzDQorICAgIHsNCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBvYmplY3QgU2VyaWFsaXplTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+KFRNZXNzYWdlIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KKyAgICAgICAgICAgIEpzb25Gb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2Uoc3cpDQorICAgICAgICAgICAgICAgIC5Gb3JtYXR0ZWQoKQ0KKyAgICAgICAgICAgICAgICAuV3JpdGVNZXNzYWdlKG1lc3NhZ2UpOw0KKyAgICAgICAgICAgIHJldHVybiBzdy5Ub1N0cmluZygpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRCdWlsZGVyIERlc2VyaWFsaXplTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+KG9iamVjdCBtZXNzYWdlLCBUQnVpbGRlciBidWlsZGVyLCBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBKc29uRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKChzdHJpbmcpbWVzc2FnZSkuTWVyZ2UoYnVpbGRlcik7DQorICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Db21wYXRpYmlsaXR5L1Rlc3RSZXNvdXJjZXMuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvbXBhdGliaWxpdHkvVGVzdFJlc291cmNlcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2NlNTg4Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Db21wYXRpYmlsaXR5L1Rlc3RSZXNvdXJjZXMuY3MKQEAgLTAsMCArMSw0MiBAQAor77u/dXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Db21wYXRpYmlsaXR5DQorew0KKyAgICBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlcw0KKyAgICB7DQorICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnb29nbGVfbWVzc2FnZTENCisgICAgICAgIHsgDQorICAgICAgICAgICAgZ2V0IA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgU3RyZWFtIHJlc291cmNlID0gdHlwZW9mKFRlc3RSZXNvdXJjZXMpLkFzc2VtYmx5LkdldE1hbmlmZXN0UmVzb3VyY2VTdHJlYW0oDQorICAgICAgICAgICAgICAgICAgICB0eXBlb2YoVGVzdFJlc291cmNlcykuTmFtZXNwYWNlICsgIi5nb29nbGVfbWVzc2FnZTEuZGF0Iik7DQorDQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVzb3VyY2UsICJVbmFibGUgdG8gdGhlIGxvY2F0ZSByZXNvdXJjZTogZ29vZ2xlX21lc3NhZ2UxIik7DQorDQorICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW3Jlc291cmNlLkxlbmd0aF07DQorICAgICAgICAgICAgICAgIGludCBhbXRSZWFkID0gcmVzb3VyY2UuUmVhZChieXRlcywgMCwgYnl0ZXMuTGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGJ5dGVzLkxlbmd0aCwgYW10UmVhZCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBieXRlczsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnb29nbGVfbWVzc2FnZTINCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFN0cmVhbSByZXNvdXJjZSA9IHR5cGVvZihUZXN0UmVzb3VyY2VzKS5Bc3NlbWJseS5HZXRNYW5pZmVzdFJlc291cmNlU3RyZWFtKA0KKyAgICAgICAgICAgICAgICAgICAgdHlwZW9mKFRlc3RSZXNvdXJjZXMpLk5hbWVzcGFjZSArICIuZ29vZ2xlX21lc3NhZ2UyLmRhdCIpOw0KKw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc291cmNlLCAiVW5hYmxlIHRvIHRoZSBsb2NhdGUgcmVzb3VyY2U6IGdvb2dsZV9tZXNzYWdlMiIpOw0KKw0KKyAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtyZXNvdXJjZS5MZW5ndGhdOw0KKyAgICAgICAgICAgICAgICBpbnQgYW10UmVhZCA9IHJlc291cmNlLlJlYWQoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChieXRlcy5MZW5ndGgsIGFtdFJlYWQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQ29tcGF0aWJpbGl0eS9UZXh0Q29tcGF0aWJpbGl0eVRlc3RzLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Db21wYXRpYmlsaXR5L1RleHRDb21wYXRpYmlsaXR5VGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJlYWFkZgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQ29tcGF0aWJpbGl0eS9UZXh0Q29tcGF0aWJpbGl0eVRlc3RzLmNzCkBAIC0wLDAgKzEsMzYgQEAKK3VzaW5nIFN5c3RlbS5Db21wb25lbnRNb2RlbDsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGF0aWJpbGl0eQ0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIFRleHRDb21wYXRpYmlsaXR5VGVzdHMgOiBDb21wYXRpYmlsaXR5VGVzdHMNCisgICAgew0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIG9iamVjdCBTZXJpYWxpemVNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4oVE1lc3NhZ2UgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBTdHJpbmdXcml0ZXIgdGV4dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCisgICAgICAgICAgICBtZXNzYWdlLlByaW50VG8odGV4dCk7DQorICAgICAgICAgICAgcmV0dXJuIHRleHQuVG9TdHJpbmcoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUQnVpbGRlciBEZXNlcmlhbGl6ZU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPihvYmplY3QgbWVzc2FnZSwgVEJ1aWxkZXIgYnVpbGRlciwgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGV4dEZvcm1hdC5NZXJnZShuZXcgU3RyaW5nUmVhZGVyKChzdHJpbmcpbWVzc2FnZSksIHJlZ2lzdHJ5LCAoSUJ1aWxkZXIpYnVpbGRlcik7DQorICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7DQorICAgICAgICB9DQorICAgICAgICAvL1RoaXMgdGVzdCBjYW4gdGFrZSBhIHZlcnkgbG9uZyB0aW1lIHRvIHJ1bi4NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUm91bmRUcmlwTWVzc2FnZTJPcHRpbWl6ZVNpemUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vYmFzZS5Sb3VuZFRyaXBNZXNzYWdlMk9wdGltaXplU2l6ZSgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy9UaGlzIHRlc3QgY2FuIHRha2UgYSB2ZXJ5IGxvbmcgdGltZSB0byBydW4uDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJvdW5kVHJpcE1lc3NhZ2UyT3B0aW1pemVTcGVlZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy9iYXNlLlJvdW5kVHJpcE1lc3NhZ2UyT3B0aW1pemVTcGVlZCgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQ29tcGF0aWJpbGl0eS9YbWxDb21wYXRpYmlsaXR5VGVzdHMuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvbXBhdGliaWxpdHkvWG1sQ29tcGF0aWJpbGl0eVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjE0NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvbXBhdGliaWxpdHkvWG1sQ29tcGF0aWJpbGl0eVRlc3RzLmNzCkBAIC0wLDAgKzEsNDYgQEAKK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uWG1sOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3M7DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29tcGF0aWJpbGl0eQ0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIFhtbENvbXBhdGliaWxpdHlUZXN0cyA6IENvbXBhdGliaWxpdHlUZXN0cw0KKyAgICB7DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb2JqZWN0IFNlcmlhbGl6ZU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPihUTWVzc2FnZSBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciB0ZXh0ID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KKyAgICAgICAgICAgIFhtbEZvcm1hdFdyaXRlciB3cml0ZXIgPSBYbWxGb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2UodGV4dCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTWVzc2FnZSgicm9vdCIsIG1lc3NhZ2UpOw0KKyAgICAgICAgICAgIHJldHVybiB0ZXh0LlRvU3RyaW5nKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVEJ1aWxkZXIgRGVzZXJpYWxpemVNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4ob2JqZWN0IG1lc3NhZ2UsIFRCdWlsZGVyIGJ1aWxkZXIsIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFhtbEZvcm1hdFJlYWRlciByZWFkZXIgPSBYbWxGb3JtYXRSZWFkZXIuQ3JlYXRlSW5zdGFuY2UoKHN0cmluZyltZXNzYWdlKTsNCisgICAgICAgICAgICByZXR1cm4gcmVhZGVyLk1lcmdlKCJyb290IiwgYnVpbGRlciwgcmVnaXN0cnkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIFtUZXN0Q2xhc3NdDQorICAgIHB1YmxpYyBjbGFzcyBYbWxDb21wYXRpYmlsaXR5Rm9ybWF0dGVkVGVzdHMgOiBDb21wYXRpYmlsaXR5VGVzdHMNCisgICAgew0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIG9iamVjdCBTZXJpYWxpemVNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4oVE1lc3NhZ2UgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBTdHJpbmdXcml0ZXIgdGV4dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCisgICAgICAgICAgICBYbWxXcml0ZXIgeHd0ciA9IFhtbFdyaXRlci5DcmVhdGUodGV4dCwgbmV3IFhtbFdyaXRlclNldHRpbmdzIHsgSW5kZW50ID0gdHJ1ZSwgSW5kZW50Q2hhcnMgPSAiICAiIH0pOw0KKw0KKyAgICAgICAgICAgIFhtbEZvcm1hdFdyaXRlciB3cml0ZXIgPSBYbWxGb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2UoeHd0cikuU2V0T3B0aW9ucyhYbWxXcml0ZXJPcHRpb25zLk91dHB1dE5lc3RlZEFycmF5cyk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTWVzc2FnZSgicm9vdCIsIG1lc3NhZ2UpOw0KKyAgICAgICAgICAgIHJldHVybiB0ZXh0LlRvU3RyaW5nKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVEJ1aWxkZXIgRGVzZXJpYWxpemVNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4ob2JqZWN0IG1lc3NhZ2UsIFRCdWlsZGVyIGJ1aWxkZXIsIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFhtbEZvcm1hdFJlYWRlciByZWFkZXIgPSBYbWxGb3JtYXRSZWFkZXIuQ3JlYXRlSW5zdGFuY2UoKHN0cmluZyltZXNzYWdlKS5TZXRPcHRpb25zKFhtbFJlYWRlck9wdGlvbnMuUmVhZE5lc3RlZEFycmF5cyk7DQorICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5NZXJnZSgicm9vdCIsIGJ1aWxkZXIsIHJlZ2lzdHJ5KTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvbXBhdGliaWxpdHkvZ29vZ2xlX21lc3NhZ2UxLmRhdCBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQ29tcGF0aWJpbGl0eS9nb29nbGVfbWVzc2FnZTEuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGYwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvbXBhdGliaWxpdHkvZ29vZ2xlX21lc3NhZ2UxLmRhdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvbXBhdGliaWxpdHkvZ29vZ2xlX21lc3NhZ2UyLmRhdCBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvQ29tcGF0aWJpbGl0eS9nb29nbGVfbWVzc2FnZTIuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YzA5NDQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0NvbXBhdGliaWxpdHkvZ29vZ2xlX21lc3NhZ2UyLmRhdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0RlcHJlY2F0ZWRNZW1iZXJUZXN0LmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9EZXByZWNhdGVkTWVtYmVyVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTAxZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9EZXByZWNhdGVkTWVtYmVyVGVzdC5jcwpAQCAtMCwwICsxLDEwMiBAQAor77u/dXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOw0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KK3VzaW5nIFVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgRGVwcmVjYXRlZE1lbWJlclRlc3QNCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBc3NlcnRJc0RlcHJlY2F0ZWQoTWVtYmVySW5mbyBtZW1iZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChtZW1iZXIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVtYmVyLklzRGVmaW5lZCh0eXBlb2YoT2Jzb2xldGVBdHRyaWJ1dGUpLCBmYWxzZSksICJNZW1iZXIgbm90IG9ic29sZXRlOiAiICsgbWVtYmVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdERlcHJlYXRlZFByaW1pdGl2ZVZhbHVlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlKS5HZXRQcm9wZXJ0eSgiSGFzUHJpbWl0aXZlVmFsdWUiKSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZSkuR2V0UHJvcGVydHkoIlByaW1pdGl2ZVZhbHVlIikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcikuR2V0UHJvcGVydHkoIkhhc1ByaW1pdGl2ZVZhbHVlIikpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcikuR2V0UHJvcGVydHkoIlByaW1pdGl2ZVZhbHVlIikpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcikuR2V0TWV0aG9kKCJDbGVhclByaW1pdGl2ZVZhbHVlIikpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcikuR2V0TWV0aG9kKCJTZXRQcmltaXRpdmVWYWx1ZSIpKTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdERlcHJlYXRlZFByaW1pdGl2ZUFycmF5KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlKS5HZXRQcm9wZXJ0eSgiUHJpbWl0aXZlQXJyYXlMaXN0IikpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UpLkdldFByb3BlcnR5KCJQcmltaXRpdmVBcnJheUNvdW50IikpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UpLkdldE1ldGhvZCgiR2V0UHJpbWl0aXZlQXJyYXkiKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyKS5HZXRQcm9wZXJ0eSgiUHJpbWl0aXZlQXJyYXlMaXN0IikpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcikuR2V0UHJvcGVydHkoIlByaW1pdGl2ZUFycmF5Q291bnQiKSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyKS5HZXRNZXRob2QoIkdldFByaW1pdGl2ZUFycmF5IikpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcikuR2V0TWV0aG9kKCJTZXRQcmltaXRpdmVBcnJheSIpKTsNCisgICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlLkJ1aWxkZXIpLkdldE1ldGhvZCgiQWRkUHJpbWl0aXZlQXJyYXkiKSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyKS5HZXRNZXRob2QoIkFkZFJhbmdlUHJpbWl0aXZlQXJyYXkiKSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyKS5HZXRNZXRob2QoIkNsZWFyUHJpbWl0aXZlQXJyYXkiKSk7DQorICAgICAgICB9DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3REZXByZWF0ZWRNZXNzYWdlVmFsdWUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UpLkdldFByb3BlcnR5KCJIYXNNZXNzYWdlVmFsdWUiKSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZSkuR2V0UHJvcGVydHkoIk1lc3NhZ2VWYWx1ZSIpKTsNCisNCisgICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlLkJ1aWxkZXIpLkdldFByb3BlcnR5KCJIYXNNZXNzYWdlVmFsdWUiKSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyKS5HZXRQcm9wZXJ0eSgiTWVzc2FnZVZhbHVlIikpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcikuR2V0TWV0aG9kKCJNZXJnZU1lc3NhZ2VWYWx1ZSIpKTsNCisgICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlLkJ1aWxkZXIpLkdldE1ldGhvZCgiQ2xlYXJNZXNzYWdlVmFsdWUiKSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyKS5HZXRNZXRob2QoIlNldE1lc3NhZ2VWYWx1ZSIsIG5ld1tdIHsgdHlwZW9mKERlcHJlY2F0ZWRDaGlsZCkgfSkpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcikuR2V0TWV0aG9kKCJTZXRNZXNzYWdlVmFsdWUiLCBuZXdbXSB7IHR5cGVvZihEZXByZWNhdGVkQ2hpbGQuQnVpbGRlcikgfSkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0RGVwcmVhdGVkTWVzc2FnZUFycmF5KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlKS5HZXRQcm9wZXJ0eSgiTWVzc2FnZUFycmF5TGlzdCIpKTsNCisgICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlKS5HZXRQcm9wZXJ0eSgiTWVzc2FnZUFycmF5Q291bnQiKSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZSkuR2V0TWV0aG9kKCJHZXRNZXNzYWdlQXJyYXkiKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyKS5HZXRQcm9wZXJ0eSgiTWVzc2FnZUFycmF5TGlzdCIpKTsNCisgICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlLkJ1aWxkZXIpLkdldFByb3BlcnR5KCJNZXNzYWdlQXJyYXlDb3VudCIpKTsNCisgICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlLkJ1aWxkZXIpLkdldE1ldGhvZCgiR2V0TWVzc2FnZUFycmF5IikpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcikuR2V0TWV0aG9kKCJTZXRNZXNzYWdlQXJyYXkiLCBuZXdbXSB7IHR5cGVvZihpbnQpLCB0eXBlb2YoRGVwcmVjYXRlZENoaWxkKSB9KSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyKS5HZXRNZXRob2QoIlNldE1lc3NhZ2VBcnJheSIsIG5ld1tdIHsgdHlwZW9mKGludCksIHR5cGVvZihEZXByZWNhdGVkQ2hpbGQuQnVpbGRlcikgfSkpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcikuR2V0TWV0aG9kKCJBZGRNZXNzYWdlQXJyYXkiLCBuZXdbXSB7IHR5cGVvZihEZXByZWNhdGVkQ2hpbGQpIH0pKTsNCisgICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlLkJ1aWxkZXIpLkdldE1ldGhvZCgiQWRkTWVzc2FnZUFycmF5IiwgbmV3W10geyB0eXBlb2YoRGVwcmVjYXRlZENoaWxkLkJ1aWxkZXIpIH0pKTsNCisgICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlLkJ1aWxkZXIpLkdldE1ldGhvZCgiQWRkUmFuZ2VNZXNzYWdlQXJyYXkiKSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyKS5HZXRNZXRob2QoIkNsZWFyTWVzc2FnZUFycmF5IikpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0RGVwcmVhdGVkRW51bVZhbHVlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlKS5HZXRQcm9wZXJ0eSgiSGFzRW51bVZhbHVlIikpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UpLkdldFByb3BlcnR5KCJFbnVtVmFsdWUiKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyKS5HZXRQcm9wZXJ0eSgiSGFzRW51bVZhbHVlIikpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcikuR2V0UHJvcGVydHkoIkVudW1WYWx1ZSIpKTsNCisgICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlLkJ1aWxkZXIpLkdldE1ldGhvZCgiQ2xlYXJFbnVtVmFsdWUiKSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyKS5HZXRNZXRob2QoIlNldEVudW1WYWx1ZSIpKTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdERlcHJlYXRlZEVudW1BcnJheSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZSkuR2V0UHJvcGVydHkoIkVudW1BcnJheUxpc3QiKSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZSkuR2V0UHJvcGVydHkoIkVudW1BcnJheUNvdW50IikpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UpLkdldE1ldGhvZCgiR2V0RW51bUFycmF5IikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcikuR2V0UHJvcGVydHkoIkVudW1BcnJheUxpc3QiKSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyKS5HZXRQcm9wZXJ0eSgiRW51bUFycmF5Q291bnQiKSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyKS5HZXRNZXRob2QoIkdldEVudW1BcnJheSIpKTsNCisgICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlLkJ1aWxkZXIpLkdldE1ldGhvZCgiU2V0RW51bUFycmF5IikpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcikuR2V0TWV0aG9kKCJBZGRFbnVtQXJyYXkiKSk7DQorICAgICAgICAgICAgQXNzZXJ0SXNEZXByZWNhdGVkKHR5cGVvZihEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyKS5HZXRNZXRob2QoIkFkZFJhbmdlRW51bUFycmF5IikpOw0KKyAgICAgICAgICAgIEFzc2VydElzRGVwcmVjYXRlZCh0eXBlb2YoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcikuR2V0TWV0aG9kKCJDbGVhckVudW1BcnJheSIpKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0Rlc2NyaXB0b3JzL01lc3NhZ2VEZXNjcmlwdG9yVGVzdC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvRGVzY3JpcHRvcnMvTWVzc2FnZURlc2NyaXB0b3JUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MDMzZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0Rlc2NyaXB0b3JzL01lc3NhZ2VEZXNjcmlwdG9yVGVzdC5jcwpAQCAtMCwwICsxLDcyIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzDQorew0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgTWVzc2FnZURlc2NyaXB0b3JUZXN0DQorICAgIHsNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRmluZFByb3BlcnR5V2l0aERlZmF1bHROYW1lKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShPcHRpb25zTWVzc2FnZS5EZXNjcmlwdG9yLkZpbmRGaWVsZEJ5TnVtYmVyKE9wdGlvbnNNZXNzYWdlLk5vcm1hbEZpZWxkTnVtYmVyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zTWVzc2FnZS5EZXNjcmlwdG9yLkZpbmRGaWVsZEJ5UHJvcGVydHlOYW1lKCJOb3JtYWwiKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEZpbmRQcm9wZXJ0eVdpdGhBdXRvTW9kaWZpZWROYW1lKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShPcHRpb25zTWVzc2FnZS5EZXNjcmlwdG9yLkZpbmRGaWVsZEJ5TnVtYmVyKE9wdGlvbnNNZXNzYWdlLk9wdGlvbnNNZXNzYWdlX0ZpZWxkTnVtYmVyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zTWVzc2FnZS5EZXNjcmlwdG9yLkZpbmRGaWVsZEJ5UHJvcGVydHlOYW1lKCJPcHRpb25zTWVzc2FnZV8iKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEZpbmRQcm9wZXJ0eVdpdGhDdXN0b21pemVkTmFtZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUoT3B0aW9uc01lc3NhZ2UuRGVzY3JpcHRvci5GaW5kRmllbGRCeU51bWJlcihPcHRpb25zTWVzc2FnZS5DdXN0b21OYW1lRmllbGROdW1iZXIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnNNZXNzYWdlLkRlc2NyaXB0b3IuRmluZEZpZWxkQnlQcm9wZXJ0eU5hbWUoIkN1c3RvbU5hbWUiKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEZpbmRQcm9wZXJ0eVdpdGhJbnZhbGlkTmFtZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChPcHRpb25zTWVzc2FnZS5EZXNjcmlwdG9yLkZpbmRGaWVsZEJ5UHJvcGVydHlOYW1lKCJCb2d1cyIpKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0Rlc2NyaXB0b3JzVGVzdC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvRGVzY3JpcHRvcnNUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTBjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0Rlc2NyaXB0b3JzVGVzdC5jcwpAQCAtMCwwICsxLDM1MCBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zOw0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBUZXN0cyBmb3IgZGVzY3JpcHRvcnMuIChOb3QgaW4gaXRzIG93biBuYW1lc3BhY2Ugb3IgYnJva2VuIHVwIGludG8gaW5kaXZpZHVhbCBjbGFzc2VzIGFzIHRoZQ0KKyAgICAvLy8gc2l6ZSBkb2Vzbid0IHdhcnJhbnQgaXQuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGlzIG1ha2VzIG1lIGZlZWwgYSBiaXQgZGlydHkuLi4pDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIFtUZXN0Q2xhc3NdDQorICAgIHB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yc1Rlc3QNCisgICAgew0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBGaWxlRGVzY3JpcHRvcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmlsZSA9IFVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3I7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iLCBmaWxlLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgicHJvdG9idWZfdW5pdHRlc3QiLCBmaWxlLlBhY2thZ2UpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVW5pdHRlc3RQcm90byIsIGZpbGUuT3B0aW9ucy5KYXZhT3V0ZXJDbGFzc25hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIiwgZmlsZS5Qcm90by5OYW1lKTsNCisNCisvLyBUT0RPKGpvbnNrZWV0KTogRWl0aGVyIGNoYW5nZSB0byBleHBlY3QgMiBkZXBlbmRlbmNpZXMsIG9yIGRvbid0IGVtaXQgdGhlbS4NCisvLyAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBmaWxlLkRlcGVuZGVuY2llcy5Db3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIGZpbGUuRGVwZW5kZW5jaWVzWzFdKTsNCisNCisgICAgICAgICAgICBNZXNzYWdlRGVzY3JpcHRvciBtZXNzYWdlVHlwZSA9IFRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlVHlwZSwgZmlsZS5NZXNzYWdlVHlwZXNbMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlVHlwZSwgZmlsZS5GaW5kVHlwZUJ5TmFtZTxNZXNzYWdlRGVzY3JpcHRvcj4oIlRlc3RBbGxUeXBlcyIpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKGZpbGUuRmluZFR5cGVCeU5hbWU8TWVzc2FnZURlc2NyaXB0b3I+KCJOb1N1Y2hUeXBlIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoZmlsZS5GaW5kVHlwZUJ5TmFtZTxNZXNzYWdlRGVzY3JpcHRvcj4oInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIpKTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUuTWVzc2FnZVR5cGVzLkNvdW50OyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoaSwgZmlsZS5NZXNzYWdlVHlwZXNbaV0uSW5kZXgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZmlsZS5FbnVtVHlwZXNbMF0sIGZpbGUuRmluZFR5cGVCeU5hbWU8RW51bURlc2NyaXB0b3I+KCJGb3JlaWduRW51bSIpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKGZpbGUuRmluZFR5cGVCeU5hbWU8RW51bURlc2NyaXB0b3I+KCJOb1N1Y2hUeXBlIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoZmlsZS5GaW5kVHlwZUJ5TmFtZTxFbnVtRGVzY3JpcHRvcj4oInByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBVbml0VGVzdEltcG9ydFByb3RvRmlsZS5EZXNjcmlwdG9yLkVudW1UeXBlcy5Db3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJJbXBvcnRFbnVtIiwgVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuRGVzY3JpcHRvci5FbnVtVHlwZXNbMF0uTmFtZSk7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLkVudW1UeXBlcy5Db3VudDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGksIGZpbGUuRW51bVR5cGVzW2ldLkluZGV4KTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgU2VydmljZURlc2NyaXB0b3Igc2VydmljZSA9IFRlc3RHZW5lcmljU2VydmljZS5EZXNjcmlwdG9yOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChzZXJ2aWNlLCBVbml0VGVzdEdlbmVyaWNTZXJ2aWNlcy5EZXNjcmlwdG9yLlNlcnZpY2VzWzBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoc2VydmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdFRlc3RHZW5lcmljU2VydmljZXMuRGVzY3JpcHRvci5GaW5kVHlwZUJ5TmFtZTxTZXJ2aWNlRGVzY3JpcHRvcj4oIlRlc3RHZW5lcmljU2VydmljZSIpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKFVuaXRUZXN0R2VuZXJpY1NlcnZpY2VzLkRlc2NyaXB0b3IuRmluZFR5cGVCeU5hbWU8U2VydmljZURlc2NyaXB0b3I+KCJOb1N1Y2hUeXBlIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoDQorICAgICAgICAgICAgICAgIFVuaXRUZXN0R2VuZXJpY1NlcnZpY2VzLkRlc2NyaXB0b3IuRmluZFR5cGVCeU5hbWU8U2VydmljZURlc2NyaXB0b3I+KA0KKyAgICAgICAgICAgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RHZW5lcmljU2VydmljZSIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuRGVzY3JpcHRvci5TZXJ2aWNlcy5Db3VudCk7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLlNlcnZpY2VzLkNvdW50OyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoaSwgZmlsZS5TZXJ2aWNlc1tpXS5JbmRleCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBleHRlbnNpb24gPSBVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uLkRlc2NyaXB0b3I7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4dGVuc2lvbiwgZmlsZS5FeHRlbnNpb25zWzBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXh0ZW5zaW9uLCBmaWxlLkZpbmRUeXBlQnlOYW1lPEZpZWxkRGVzY3JpcHRvcj4oIm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiIpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKGZpbGUuRmluZFR5cGVCeU5hbWU8RmllbGREZXNjcmlwdG9yPigibm9fc3VjaF9leHQiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChmaWxlLkZpbmRUeXBlQnlOYW1lPEZpZWxkRGVzY3JpcHRvcj4oInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zLkNvdW50KTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUuRXh0ZW5zaW9ucy5Db3VudDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGksIGZpbGUuRXh0ZW5zaW9uc1tpXS5JbmRleCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBNZXNzYWdlRGVzY3JpcHRvcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgTWVzc2FnZURlc2NyaXB0b3IgbWVzc2FnZVR5cGUgPSBUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcjsNCisgICAgICAgICAgICBNZXNzYWdlRGVzY3JpcHRvciBuZXN0ZWRUeXBlID0gVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVzY3JpcHRvcjsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlRlc3RBbGxUeXBlcyIsIG1lc3NhZ2VUeXBlLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIiwgbWVzc2FnZVR5cGUuRnVsbE5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChVbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBtZXNzYWdlVHlwZS5GaWxlKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKG1lc3NhZ2VUeXBlLkNvbnRhaW5pbmdUeXBlKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRGVzY3JpcHRvclByb3Rvcy5NZXNzYWdlT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2UsIG1lc3NhZ2VUeXBlLk9wdGlvbnMpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGVzdEFsbFR5cGVzIiwgbWVzc2FnZVR5cGUuUHJvdG8uTmFtZSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJOZXN0ZWRNZXNzYWdlIiwgbmVzdGVkVHlwZS5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlIiwgbmVzdGVkVHlwZS5GdWxsTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG5lc3RlZFR5cGUuRmlsZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2VUeXBlLCBuZXN0ZWRUeXBlLkNvbnRhaW5pbmdUeXBlKTsNCisNCisgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBtZXNzYWdlVHlwZS5GaWVsZHNbMF07DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJvcHRpb25hbF9pbnQzMiIsIGZpZWxkLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmaWVsZCwgbWVzc2FnZVR5cGUuRmluZERlc2NyaXB0b3I8RmllbGREZXNjcmlwdG9yPigib3B0aW9uYWxfaW50MzIiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtZXNzYWdlVHlwZS5GaW5kRGVzY3JpcHRvcjxGaWVsZERlc2NyaXB0b3I+KCJub19zdWNoX2ZpZWxkIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmaWVsZCwgbWVzc2FnZVR5cGUuRmluZEZpZWxkQnlOdW1iZXIoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwobWVzc2FnZVR5cGUuRmluZEZpZWxkQnlOdW1iZXIoNTcxMjgzKSk7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlVHlwZS5GaWVsZHMuQ291bnQ7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChpLCBtZXNzYWdlVHlwZS5GaWVsZHNbaV0uSW5kZXgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmVzdGVkVHlwZSwgbWVzc2FnZVR5cGUuTmVzdGVkVHlwZXNbMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXN0ZWRUeXBlLCBtZXNzYWdlVHlwZS5GaW5kRGVzY3JpcHRvcjxNZXNzYWdlRGVzY3JpcHRvcj4oIk5lc3RlZE1lc3NhZ2UiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtZXNzYWdlVHlwZS5GaW5kRGVzY3JpcHRvcjxNZXNzYWdlRGVzY3JpcHRvcj4oIk5vU3VjaFR5cGUiKSk7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlVHlwZS5OZXN0ZWRUeXBlcy5Db3VudDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGksIG1lc3NhZ2VUeXBlLk5lc3RlZFR5cGVzW2ldLkluZGV4KTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2VUeXBlLkVudW1UeXBlc1swXSwgbWVzc2FnZVR5cGUuRmluZERlc2NyaXB0b3I8RW51bURlc2NyaXB0b3I+KCJOZXN0ZWRFbnVtIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwobWVzc2FnZVR5cGUuRmluZERlc2NyaXB0b3I8RW51bURlc2NyaXB0b3I+KCJOb1N1Y2hUeXBlIikpOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZVR5cGUuRW51bVR5cGVzLkNvdW50OyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoaSwgbWVzc2FnZVR5cGUuRW51bVR5cGVzW2ldLkluZGV4KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEZpZWxkRGVzY3JpcHRvcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgTWVzc2FnZURlc2NyaXB0b3IgbWVzc2FnZVR5cGUgPSBUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcjsNCisgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IgcHJpbWl0aXZlRmllbGQgPSBtZXNzYWdlVHlwZS5GaW5kRGVzY3JpcHRvcjxGaWVsZERlc2NyaXB0b3I+KCJvcHRpb25hbF9pbnQzMiIpOw0KKyAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBlbnVtRmllbGQgPSBtZXNzYWdlVHlwZS5GaW5kRGVzY3JpcHRvcjxGaWVsZERlc2NyaXB0b3I+KCJvcHRpb25hbF9uZXN0ZWRfZW51bSIpOw0KKyAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBtZXNzYWdlRmllbGQgPSBtZXNzYWdlVHlwZS5GaW5kRGVzY3JpcHRvcjxGaWVsZERlc2NyaXB0b3I+KCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKTsNCisgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IgY29yZEZpZWxkID0gbWVzc2FnZVR5cGUuRmluZERlc2NyaXB0b3I8RmllbGREZXNjcmlwdG9yPigib3B0aW9uYWxfY29yZCIpOw0KKyAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBleHRlbnNpb24gPSBVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uLkRlc2NyaXB0b3I7DQorICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIG5lc3RlZEV4dGVuc2lvbiA9IFRlc3RSZXF1aXJlZC5TaW5nbGUuRGVzY3JpcHRvcjsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIm9wdGlvbmFsX2ludDMyIiwgcHJpbWl0aXZlRmllbGQuTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMub3B0aW9uYWxfaW50MzIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmVGaWVsZC5GdWxsTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHByaW1pdGl2ZUZpZWxkLkZpZWxkTnVtYmVyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZVR5cGUsIHByaW1pdGl2ZUZpZWxkLkNvbnRhaW5pbmdUeXBlKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgcHJpbWl0aXZlRmllbGQuRmlsZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEZpZWxkVHlwZS5JbnQzMiwgcHJpbWl0aXZlRmllbGQuRmllbGRUeXBlKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoTWFwcGVkVHlwZS5JbnQzMiwgcHJpbWl0aXZlRmllbGQuTWFwcGVkVHlwZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKERlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLkRlZmF1bHRJbnN0YW5jZSwgcHJpbWl0aXZlRmllbGQuT3B0aW9ucyk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocHJpbWl0aXZlRmllbGQuSXNFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgib3B0aW9uYWxfaW50MzIiLCBwcmltaXRpdmVGaWVsZC5Qcm90by5OYW1lKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiwgZW51bUZpZWxkLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGaWVsZFR5cGUuRW51bSwgZW51bUZpZWxkLkZpZWxkVHlwZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKE1hcHBlZFR5cGUuRW51bSwgZW51bUZpZWxkLk1hcHBlZFR5cGUpOw0KKyAgICAgICAgICAgIC8vIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5EZXNjcmlwdG9yLCBlbnVtRmllbGQuRW51bVR5cGUpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIiwgbWVzc2FnZUZpZWxkLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGaWVsZFR5cGUuTWVzc2FnZSwgbWVzc2FnZUZpZWxkLkZpZWxkVHlwZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKE1hcHBlZFR5cGUuTWVzc2FnZSwgbWVzc2FnZUZpZWxkLk1hcHBlZFR5cGUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduTWVzc2FnZS5EZXNjcmlwdG9yLCBtZXNzYWdlRmllbGQuTWVzc2FnZVR5cGUpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgib3B0aW9uYWxfY29yZCIsIGNvcmRGaWVsZC5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRmllbGRUeXBlLlN0cmluZywgY29yZEZpZWxkLkZpZWxkVHlwZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKE1hcHBlZFR5cGUuU3RyaW5nLCBjb3JkRmllbGQuTWFwcGVkVHlwZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKERlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLlR5cGVzLkNUeXBlLkNPUkQsIGNvcmRGaWVsZC5PcHRpb25zLkN0eXBlKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiIsIGV4dGVuc2lvbi5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiIsIGV4dGVuc2lvbi5GdWxsTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGV4dGVuc2lvbi5GaWVsZE51bWJlcik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxFeHRlbnNpb25zLkRlc2NyaXB0b3IsIGV4dGVuc2lvbi5Db250YWluaW5nVHlwZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIGV4dGVuc2lvbi5GaWxlKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRmllbGRUeXBlLkludDMyLCBleHRlbnNpb24uRmllbGRUeXBlKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoTWFwcGVkVHlwZS5JbnQzMiwgZXh0ZW5zaW9uLk1hcHBlZFR5cGUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChEZXNjcmlwdG9yUHJvdG9zLkZpZWxkT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5PcHRpb25zKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGV4dGVuc2lvbi5Jc0V4dGVuc2lvbik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG51bGwsIGV4dGVuc2lvbi5FeHRlbnNpb25TY29wZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJvcHRpb25hbF9pbnQzMl9leHRlbnNpb24iLCBleHRlbnNpb24uUHJvdG8uTmFtZSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJzaW5nbGUiLCBuZXN0ZWRFeHRlbnNpb24uTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQuc2luZ2xlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkRXh0ZW5zaW9uLkZ1bGxOYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdFJlcXVpcmVkLkRlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZEV4dGVuc2lvbi5FeHRlbnNpb25TY29wZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEZpZWxkRGVzY3JpcHRvckxhYmVsKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IgcmVxdWlyZWRGaWVsZCA9DQorICAgICAgICAgICAgICAgIFRlc3RSZXF1aXJlZC5EZXNjcmlwdG9yLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oImEiKTsNCisgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3Igb3B0aW9uYWxGaWVsZCA9DQorICAgICAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oIm9wdGlvbmFsX2ludDMyIik7DQorICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIHJlcGVhdGVkRmllbGQgPQ0KKyAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXMuRGVzY3JpcHRvci5GaW5kRGVzY3JpcHRvcjxGaWVsZERlc2NyaXB0b3I+KCJyZXBlYXRlZF9pbnQzMiIpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVxdWlyZWRGaWVsZC5Jc1JlcXVpcmVkKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXF1aXJlZEZpZWxkLklzUmVwZWF0ZWQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG9wdGlvbmFsRmllbGQuSXNSZXF1aXJlZCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2Uob3B0aW9uYWxGaWVsZC5Jc1JlcGVhdGVkKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXBlYXRlZEZpZWxkLklzUmVxdWlyZWQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVwZWF0ZWRGaWVsZC5Jc1JlcGVhdGVkKTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRmllbGREZXNjcmlwdG9yRGVmYXVsdCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgTWVzc2FnZURlc2NyaXB0b3IgZCA9IFRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGQuRmluZERlc2NyaXB0b3I8RmllbGREZXNjcmlwdG9yPigib3B0aW9uYWxfaW50MzIiKS5IYXNEZWZhdWx0VmFsdWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbDxvYmplY3Q+KDAsIGQuRmluZERlc2NyaXB0b3I8RmllbGREZXNjcmlwdG9yPigib3B0aW9uYWxfaW50MzIiKS5EZWZhdWx0VmFsdWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoZC5GaW5kRGVzY3JpcHRvcjxGaWVsZERlc2NyaXB0b3I+KCJkZWZhdWx0X2ludDMyIikuSGFzRGVmYXVsdFZhbHVlKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWw8b2JqZWN0Pig0MSwgZC5GaW5kRGVzY3JpcHRvcjxGaWVsZERlc2NyaXB0b3I+KCJkZWZhdWx0X2ludDMyIikuRGVmYXVsdFZhbHVlKTsNCisNCisgICAgICAgICAgICBkID0gVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkRlc2NyaXB0b3I7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsPG9iamVjdD4oVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkRlZmF1bHRJbnN0YW5jZS5Fc2NhcGVkQnl0ZXMsDQorICAgICAgICAgICAgICAgIGQuRmluZERlc2NyaXB0b3I8RmllbGREZXNjcmlwdG9yPigiZXNjYXBlZF9ieXRlcyIpLkRlZmF1bHRWYWx1ZSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsPG9iamVjdD4odWludC5NYXhWYWx1ZSwgZC5GaW5kRGVzY3JpcHRvcjxGaWVsZERlc2NyaXB0b3I+KCJsYXJnZV91aW50MzIiKS5EZWZhdWx0VmFsdWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbDxvYmplY3Q+KHVsb25nLk1heFZhbHVlLCBkLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oImxhcmdlX3VpbnQ2NCIpLkRlZmF1bHRWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEVudW1EZXNjcmlwdG9yKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBOb3RlOiB0aGlzIHRlc3QgaXMgYSBiaXQgZGlmZmVyZW50IHRvIHRoZSBKYXZhIHZlcnNpb24gYmVjYXVzZSB0aGVyZSdzIG5vIHN0YXRpYyB3YXkgb2YgZ2V0dGluZyB0byB0aGUgZGVzY3JpcHRvcg0KKyAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yIGVudW1UeXBlID0gVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5GaW5kVHlwZUJ5TmFtZTxFbnVtRGVzY3JpcHRvcj4oIkZvcmVpZ25FbnVtIik7DQorICAgICAgICAgICAgRW51bURlc2NyaXB0b3IgbmVzdGVkVHlwZSA9IFRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yLkZpbmREZXNjcmlwdG9yPEVudW1EZXNjcmlwdG9yPigiTmVzdGVkRW51bSIpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiRm9yZWlnbkVudW0iLCBlbnVtVHlwZS5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtIiwgZW51bVR5cGUuRnVsbE5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChVbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBlbnVtVHlwZS5GaWxlKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKGVudW1UeXBlLkNvbnRhaW5pbmdUeXBlKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRGVzY3JpcHRvclByb3Rvcy5FbnVtT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1UeXBlLk9wdGlvbnMpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiTmVzdGVkRW51bSIsIG5lc3RlZFR5cGUuTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFR5cGUuRnVsbE5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChVbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBuZXN0ZWRUeXBlLkZpbGUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuRGVzY3JpcHRvciwgbmVzdGVkVHlwZS5Db250YWluaW5nVHlwZSk7DQorDQorICAgICAgICAgICAgRW51bVZhbHVlRGVzY3JpcHRvciB2YWx1ZSA9IGVudW1UeXBlLkZpbmRWYWx1ZUJ5TmFtZSgiRk9SRUlHTl9GT08iKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodmFsdWUsIGVudW1UeXBlLlZhbHVlc1swXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGT1JFSUdOX0ZPTyIsIHZhbHVlLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LCB2YWx1ZS5OdW1iZXIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoaW50KSBGb3JlaWduRW51bS5GT1JFSUdOX0ZPTywgdmFsdWUuTnVtYmVyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodmFsdWUsIGVudW1UeXBlLkZpbmRWYWx1ZUJ5TnVtYmVyKDQpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKGVudW1UeXBlLkZpbmRWYWx1ZUJ5TmFtZSgiTk9fU1VDSF9WQUxVRSIpKTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1UeXBlLlZhbHVlcy5Db3VudDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGksIGVudW1UeXBlLlZhbHVlc1tpXS5JbmRleCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgU2VydmljZURlc2NyaXB0b3Igc2VydmljZSA9IFRlc3RHZW5lcmljU2VydmljZS5EZXNjcmlwdG9yOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGVzdEdlbmVyaWNTZXJ2aWNlIiwgc2VydmljZS5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RHZW5lcmljU2VydmljZSIsIHNlcnZpY2UuRnVsbE5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChVbml0VGVzdEdlbmVyaWNTZXJ2aWNlcy5EZXNjcmlwdG9yLCBzZXJ2aWNlLkZpbGUpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBzZXJ2aWNlLk1ldGhvZHMuQ291bnQpOw0KKw0KKyAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0b3IgZm9vTWV0aG9kID0gc2VydmljZS5NZXRob2RzWzBdOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiRm9vIiwgZm9vTWV0aG9kLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb29SZXF1ZXN0LkRlc2NyaXB0b3IsIGZvb01ldGhvZC5JbnB1dFR5cGUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb29SZXNwb25zZS5EZXNjcmlwdG9yLCBmb29NZXRob2QuT3V0cHV0VHlwZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZvb01ldGhvZCwgc2VydmljZS5GaW5kTWV0aG9kQnlOYW1lKCJGb28iKSk7DQorDQorICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRvciBiYXJNZXRob2QgPSBzZXJ2aWNlLk1ldGhvZHNbMV07DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJCYXIiLCBiYXJNZXRob2QuTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEJhclJlcXVlc3QuRGVzY3JpcHRvciwgYmFyTWV0aG9kLklucHV0VHlwZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEJhclJlc3BvbnNlLkRlc2NyaXB0b3IsIGJhck1ldGhvZC5PdXRwdXRUeXBlKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYmFyTWV0aG9kLCBzZXJ2aWNlLkZpbmRNZXRob2RCeU5hbWUoIkJhciIpKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHNlcnZpY2UuRmluZE1ldGhvZEJ5TmFtZSgiTm9TdWNoTWV0aG9kIikpOw0KKw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZS5NZXRob2RzLkNvdW50OyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoaSwgc2VydmljZS5NZXRob2RzW2ldLkluZGV4KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEN1c3RvbU9wdGlvbnMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE1lc3NhZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zLkRlc2NyaXB0b3I7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShkZXNjcmlwdG9yLk9wdGlvbnMuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5NZXNzYWdlT3B0MSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtNTYsIGRlc2NyaXB0b3IuT3B0aW9ucy5HZXRFeHRlbnNpb24oVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLk1lc3NhZ2VPcHQxKSk7DQorDQorDQorICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZGVzY3JpcHRvci5GaW5kRmllbGRCeU5hbWUoImZpZWxkMSIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoZmllbGQpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoZmllbGQuT3B0aW9ucy5IYXNFeHRlbnNpb24oVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkZpZWxkT3B0MSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg4NzY1NDMyMTA5dUwsIGZpZWxkLk9wdGlvbnMuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5GaWVsZE9wdDEpKTsNCisNCisgICAgICAgICAgICAvLyBUT0RPOiBXcml0ZSBvdXQgZW51bSBkZXNjcmlwdG9ycw0KKyAgICAgICAgICAgIC8qDQorICAgICAgRW51bURlc2NyaXB0b3IgZW51bVR5cGUgPSBUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zLlR5cGVzLg0KKyAgICAgICAgVW5pdHRlc3RDdXN0b21PcHRpb25zLlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMuQW5FbnVtLmdldERlc2NyaXB0b3IoKTsNCisNCisgICAgICBBc3NlcnQuSXNUcnVlKA0KKyAgICAgICAgZW51bVR5cGUuZ2V0T3B0aW9ucygpLmhhc0V4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuZW51bU9wdDEpKTsNCisgICAgICBBc3NlcnQuQXJlRXF1YWwoSW50ZWdlci52YWx1ZU9mKC03ODkpLA0KKyAgICAgICAgZW51bVR5cGUuZ2V0T3B0aW9ucygpLmdldEV4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuZW51bU9wdDEpKTsNCisgICAgICAgICovDQorDQorICAgICAgICAgICAgU2VydmljZURlc2NyaXB0b3Igc2VydmljZSA9IFRlc3RHZW5lcmljU2VydmljZVdpdGhDdXN0b21PcHRpb25zLkRlc2NyaXB0b3I7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShzZXJ2aWNlLk9wdGlvbnMuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5TZXJ2aWNlT3B0MSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtOTg3NjU0MzIxMEwsIHNlcnZpY2UuT3B0aW9ucy5HZXRFeHRlbnNpb24oVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLlNlcnZpY2VPcHQxKSk7DQorDQorICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRvciBtZXRob2QgPSBzZXJ2aWNlLkZpbmRNZXRob2RCeU5hbWUoIkZvbyIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwobWV0aG9kKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1ldGhvZC5PcHRpb25zLkhhc0V4dGVuc2lvbihVbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuTWV0aG9kT3B0MSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChNZXRob2RPcHQxLk1FVEhPRE9QVDFfVkFMMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLk9wdGlvbnMuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5NZXRob2RPcHQxKSk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9EeW5hbWljTWVzc2FnZVRlc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0R5bmFtaWNNZXNzYWdlVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjUxNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9EeW5hbWljTWVzc2FnZVRlc3QuY3MKQEAgLTAsMCArMSwyMzcgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zOw0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgRHluYW1pY01lc3NhZ2VUZXN0DQorICAgIHsNCisgICAgICAgIHByaXZhdGUgUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uVGVzdGVyOw0KKyAgICAgICAgcHJpdmF0ZSBSZWZsZWN0aW9uVGVzdGVyIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyOw0KKyAgICAgICAgcHJpdmF0ZSBSZWZsZWN0aW9uVGVzdGVyIHBhY2tlZFJlZmxlY3Rpb25UZXN0ZXI7DQorDQorICAgICAgICBbVGVzdEluaXRpYWxpemVdDQorICAgICAgICBwdWJsaWMgdm9pZCBTZXRVcCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmVmbGVjdGlvblRlc3RlciA9IFJlZmxlY3Rpb25UZXN0ZXIuQ3JlYXRlVGVzdEFsbFR5cGVzSW5zdGFuY2UoKTsNCisgICAgICAgICAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3RlciA9IFJlZmxlY3Rpb25UZXN0ZXIuQ3JlYXRlVGVzdEFsbEV4dGVuc2lvbnNJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIHBhY2tlZFJlZmxlY3Rpb25UZXN0ZXIgPSBSZWZsZWN0aW9uVGVzdGVyLkNyZWF0ZVRlc3RQYWNrZWRUeXBlc0luc3RhbmNlKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIER5bmFtaWNNZXNzYWdlQWNjZXNzb3JzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJQnVpbGRlciBidWlsZGVyID0gRHluYW1pY01lc3NhZ2UuQ3JlYXRlQnVpbGRlcihUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcik7DQorICAgICAgICAgICAgcmVmbGVjdGlvblRlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOw0KKyAgICAgICAgICAgIElNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLldlYWtCdWlsZCgpOw0KKyAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRG91YmxlQnVpbGRFcnJvcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgRHluYW1pY01lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0gRHluYW1pY01lc3NhZ2UuQ3JlYXRlQnVpbGRlcihUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcik7DQorICAgICAgICAgICAgYnVpbGRlci5CdWlsZCgpOw0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYnVpbGRlci5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuRmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbi4iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBTdWNjZXNzLg0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRHluYW1pY01lc3NhZ2VTZXR0ZXJzUmVqZWN0TnVsbCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgSUJ1aWxkZXIgYnVpbGRlciA9IER5bmFtaWNNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IpOw0KKyAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0UmVmbGVjdGlvblNldHRlcnNSZWplY3ROdWxsKGJ1aWxkZXIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEeW5hbWljTWVzc2FnZUV4dGVuc2lvbkFjY2Vzc29ycygpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBleHRlbnNpdmVseSB0ZXN0IER5bmFtaWNNZXNzYWdlJ3MgaGFuZGxpbmcgb2YNCisgICAgICAgICAgICAvLyBleHRlbnNpb25zIGJlY2F1c2UsIGZyYW5rbHksIGl0IGRvZXNuJ3QgZG8gYW55dGhpbmcgc3BlY2lhbCB3aXRoIHRoZW0uDQorICAgICAgICAgICAgLy8gSXQgdHJlYXRzIHRoZW0ganVzdCBsaWtlIGFueSBvdGhlciBmaWVsZHMuDQorICAgICAgICAgICAgSUJ1aWxkZXIgYnVpbGRlciA9IER5bmFtaWNNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoVGVzdEFsbEV4dGVuc2lvbnMuRGVzY3JpcHRvcik7DQorICAgICAgICAgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsNCisgICAgICAgICAgICBJTWVzc2FnZSBtZXNzYWdlID0gYnVpbGRlci5XZWFrQnVpbGQoKTsNCisgICAgICAgICAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5Bc3NlcnRBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEeW5hbWljTWVzc2FnZUV4dGVuc2lvblNldHRlcnNSZWplY3ROdWxsKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJQnVpbGRlciBidWlsZGVyID0gRHluYW1pY01lc3NhZ2UuQ3JlYXRlQnVpbGRlcihUZXN0QWxsRXh0ZW5zaW9ucy5EZXNjcmlwdG9yKTsNCisgICAgICAgICAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5Bc3NlcnRSZWZsZWN0aW9uU2V0dGVyc1JlamVjdE51bGwoYnVpbGRlcik7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIER5bmFtaWNNZXNzYWdlUmVwZWF0ZWRTZXR0ZXJzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJQnVpbGRlciBidWlsZGVyID0gRHluYW1pY01lc3NhZ2UuQ3JlYXRlQnVpbGRlcihUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcik7DQorICAgICAgICAgICAgcmVmbGVjdGlvblRlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOw0KKyAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuTW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOw0KKyAgICAgICAgICAgIElNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLldlYWtCdWlsZCgpOw0KKyAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZFZpYVJlZmxlY3Rpb24obWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIER5bmFtaWNNZXNzYWdlUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgSUJ1aWxkZXIgYnVpbGRlciA9IER5bmFtaWNNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IpOw0KKyAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0UmVmbGVjdGlvblJlcGVhdGVkU2V0dGVyc1JlamVjdE51bGwoYnVpbGRlcik7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIER5bmFtaWNNZXNzYWdlRGVmYXVsdHMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0Q2xlYXJWaWFSZWZsZWN0aW9uKER5bmFtaWNNZXNzYWdlLkdldERlZmF1bHRJbnN0YW5jZShUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcikpOw0KKyAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0Q2xlYXJWaWFSZWZsZWN0aW9uKER5bmFtaWNNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IpLkJ1aWxkKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEeW5hbWljTWVzc2FnZVNlcmlhbGl6ZWRTaXplKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLkdldEFsbFNldCgpOw0KKw0KKyAgICAgICAgICAgIElCdWlsZGVyIGR5bmFtaWNCdWlsZGVyID0gRHluYW1pY01lc3NhZ2UuQ3JlYXRlQnVpbGRlcihUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcik7DQorICAgICAgICAgICAgcmVmbGVjdGlvblRlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGR5bmFtaWNCdWlsZGVyKTsNCisgICAgICAgICAgICBJTWVzc2FnZSBkeW5hbWljTWVzc2FnZSA9IGR5bmFtaWNCdWlsZGVyLldlYWtCdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLlNlcmlhbGl6ZWRTaXplLCBkeW5hbWljTWVzc2FnZS5TZXJpYWxpemVkU2l6ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIER5bmFtaWNNZXNzYWdlU2VyaWFsaXphdGlvbigpDQorICAgICAgICB7DQorICAgICAgICAgICAgSUJ1aWxkZXIgYnVpbGRlciA9IER5bmFtaWNNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IpOw0KKyAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsNCisgICAgICAgICAgICBJTWVzc2FnZSBtZXNzYWdlID0gYnVpbGRlci5XZWFrQnVpbGQoKTsNCisNCisgICAgICAgICAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS5Ub0J5dGVTdHJpbmcoKTsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZTIgPSBUZXN0QWxsVHlwZXMuUGFyc2VGcm9tKHJhd0J5dGVzKTsNCisNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZTIpOw0KKw0KKyAgICAgICAgICAgIC8vIEluIGZhY3QsIHRoZSBzZXJpYWxpemVkIGZvcm1zIHNob3VsZCBiZSBleGFjdGx5IHRoZSBzYW1lLCBieXRlLWZvci1ieXRlLg0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0VXRpbC5HZXRBbGxTZXQoKS5Ub0J5dGVTdHJpbmcoKSwgcmF3Qnl0ZXMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEeW5hbWljTWVzc2FnZVBhcnNpbmcoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLlNldEFsbEZpZWxkcyhidWlsZGVyKTsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS5Ub0J5dGVTdHJpbmcoKTsNCisNCisgICAgICAgICAgICBJTWVzc2FnZSBtZXNzYWdlMiA9IER5bmFtaWNNZXNzYWdlLlBhcnNlRnJvbShUZXN0QWxsVHlwZXMuRGVzY3JpcHRvciwgcmF3Qnl0ZXMpOw0KKyAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlMik7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIER5bmFtaWNNZXNzYWdlUGFja2VkU2VyaWFsaXphdGlvbigpDQorICAgICAgICB7DQorICAgICAgICAgICAgSUJ1aWxkZXIgYnVpbGRlciA9IER5bmFtaWNNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoVGVzdFBhY2tlZFR5cGVzLkRlc2NyaXB0b3IpOw0KKyAgICAgICAgICAgIHBhY2tlZFJlZmxlY3Rpb25UZXN0ZXIuU2V0UGFja2VkRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsNCisgICAgICAgICAgICBJTWVzc2FnZSBtZXNzYWdlID0gYnVpbGRlci5XZWFrQnVpbGQoKTsNCisNCisgICAgICAgICAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS5Ub0J5dGVTdHJpbmcoKTsNCisgICAgICAgICAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZTIgPSBUZXN0UGFja2VkVHlwZXMuUGFyc2VGcm9tKHJhd0J5dGVzKTsNCisNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRQYWNrZWRGaWVsZHNTZXQobWVzc2FnZTIpOw0KKw0KKyAgICAgICAgICAgIC8vIEluIGZhY3QsIHRoZSBzZXJpYWxpemVkIGZvcm1zIHNob3VsZCBiZSBleGFjdGx5IHRoZSBzYW1lLCBieXRlLWZvci1ieXRlLg0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0VXRpbC5HZXRQYWNrZWRTZXQoKS5Ub0J5dGVTdHJpbmcoKSwgcmF3Qnl0ZXMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY01lc3NhZ2VQYWNrZWRQYXJzaW5nKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0UGFja2VkVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdFBhY2tlZFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5TZXRQYWNrZWRGaWVsZHMoYnVpbGRlcik7DQorICAgICAgICAgICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UuVG9CeXRlU3RyaW5nKCk7DQorDQorICAgICAgICAgICAgSU1lc3NhZ2UgbWVzc2FnZTIgPSBEeW5hbWljTWVzc2FnZS5QYXJzZUZyb20oVGVzdFBhY2tlZFR5cGVzLkRlc2NyaXB0b3IsIHJhd0J5dGVzKTsNCisgICAgICAgICAgICBwYWNrZWRSZWZsZWN0aW9uVGVzdGVyLkFzc2VydFBhY2tlZEZpZWxkc1NldFZpYVJlZmxlY3Rpb24obWVzc2FnZTIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEeW5hbWljTWVzc2FnZUNvcHkoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLlNldEFsbEZpZWxkcyhidWlsZGVyKTsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBEeW5hbWljTWVzc2FnZSBjb3B5ID0gRHluYW1pY01lc3NhZ2UuQ3JlYXRlQnVpbGRlcihtZXNzYWdlKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihjb3B5KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVG9CdWlsZGVyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBEeW5hbWljTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPQ0KKyAgICAgICAgICAgICAgICBEeW5hbWljTWVzc2FnZS5DcmVhdGVCdWlsZGVyKFRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yKTsNCisgICAgICAgICAgICByZWZsZWN0aW9uVGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7DQorICAgICAgICAgICAgaW50IHVua25vd25GaWVsZE51bSA9IDk7DQorICAgICAgICAgICAgdWxvbmcgdW5rbm93bkZpZWxkVmFsID0gOTA7DQorICAgICAgICAgICAgYnVpbGRlci5TZXRVbmtub3duRmllbGRzKFVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRGaWVsZCh1bmtub3duRmllbGROdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkLkNyZWF0ZUJ1aWxkZXIoKS5BZGRWYXJpbnQodW5rbm93bkZpZWxkVmFsKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIER5bmFtaWNNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgRHluYW1pY01lc3NhZ2UgZGVyaXZlZCA9IG1lc3NhZ2UuVG9CdWlsZGVyKCkuQnVpbGQoKTsNCisgICAgICAgICAgICByZWZsZWN0aW9uVGVzdGVyLkFzc2VydEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oZGVyaXZlZCk7DQorDQorICAgICAgICAgICAgSUxpc3Q8dWxvbmc+IHZhbHVlcyA9IGRlcml2ZWQuVW5rbm93bkZpZWxkcy5GaWVsZERpY3Rpb25hcnlbdW5rbm93bkZpZWxkTnVtXS5WYXJpbnRMaXN0Ow0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCB2YWx1ZXMuQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh1bmtub3duRmllbGRWYWwsIHZhbHVlc1swXSk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9FeHRlbmRhYmxlTWVzc2FnZVRlc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0V4dGVuZGFibGVNZXNzYWdlVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGYzN2MzCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9FeHRlbmRhYmxlTWVzc2FnZVRlc3QuY3MKQEAgLTAsMCArMSwyMDIgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVyczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3M7DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIFtUZXN0Q2xhc3NdDQorICAgIHB1YmxpYyBjbGFzcyBFeHRlbmRhYmxlTWVzc2FnZVRlc3QNCisgICAgew0KKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRXh0ZW5zaW9uV3JpdGVySW52YWxpZEV4dGVuc2lvbigpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnMuQ3JlYXRlQnVpbGRlcigpW1VuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24uRGVzY3JpcHRvcl0gPQ0KKyAgICAgICAgICAgICAgICBGb3JlaWduTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEV4dGVuc2lvbldyaXRlclRlc3QoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRCb29sRXh0ZW5zaW9uLCB0cnVlKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRCeXRlc0V4dGVuc2lvbiwgQnl0ZVN0cmluZy5Db3B5RnJvbVV0ZjgoIjEyMyIpKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRDb3JkRXh0ZW5zaW9uLCAiMTIzIikNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0RG91YmxlRXh0ZW5zaW9uLCAxMjMpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZpeGVkMzJFeHRlbnNpb24sIDEyM3UpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZpeGVkNjRFeHRlbnNpb24sIDEyM3UpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZsb2F0RXh0ZW5zaW9uLCAxMjMpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCBGb3JlaWduRW51bS5GT1JFSUdOX0JBWikNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbiwgSW1wb3J0RW51bS5JTVBPUlRfQkFaKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRJbnQzMkV4dGVuc2lvbiwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRJbnQ2NEV4dGVuc2lvbiwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uLCBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5GT08pDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uLCAxMjMpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uLCAxMjMpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNpbnQzMkV4dGVuc2lvbiwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTaW50NjRFeHRlbnNpb24sIDEyMykNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U3RyaW5nRXh0ZW5zaW9uLCAiMTIzIikNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb24sICIxMjMiKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRVaW50MzJFeHRlbnNpb24sIDEyM3UpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFVpbnQ2NEV4dGVuc2lvbiwgMTIzdSkNCisgICAgICAgICAgICAgICAgLy9PcHRpb25hbA0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQm9vbEV4dGVuc2lvbiwgdHJ1ZSkNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEJ5dGVzRXh0ZW5zaW9uLCBCeXRlU3RyaW5nLkNvcHlGcm9tVXRmOCgiMTIzIikpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxDb3JkRXh0ZW5zaW9uLCAiMTIzIikNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbERvdWJsZUV4dGVuc2lvbiwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbiwgMTIzdSkNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZpeGVkNjRFeHRlbnNpb24sIDEyM3UpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGbG9hdEV4dGVuc2lvbiwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb24sIEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbiwgSW1wb3J0RW51bS5JTVBPUlRfQkFaKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24sIDEyMykNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEludDY0RXh0ZW5zaW9uLCAxMjMpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uLCBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5GT08pDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbiwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb24sIDEyMykNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFNpbnQzMkV4dGVuc2lvbiwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uLCAxMjMpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdFeHRlbnNpb24sICIxMjMiKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24sICIxMjMiKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsVWludDMyRXh0ZW5zaW9uLCAxMjN1KQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsVWludDY0RXh0ZW5zaW9uLCAxMjN1KQ0KKyAgICAgICAgICAgICAgICAvL1JlcGVhdGVkDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRCb29sRXh0ZW5zaW9uLCB0cnVlKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQnl0ZXNFeHRlbnNpb24sIEJ5dGVTdHJpbmcuQ29weUZyb21VdGY4KCIxMjMiKSkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZENvcmRFeHRlbnNpb24sICIxMjMiKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uLCAxMjMpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uLCAxMjN1KQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiwgMTIzdSkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZsb2F0RXh0ZW5zaW9uLCAxMjMpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uLCBJbXBvcnRFbnVtLklNUE9SVF9CQVopDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW50NjRFeHRlbnNpb24sIDEyMykNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24sIFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZPTykNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uLCAxMjMpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uLCAxMjMpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTaW50NjRFeHRlbnNpb24sIDEyMykNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiwgIjEyMyIpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgIjEyMyIpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRVaW50MzJFeHRlbnNpb24sIDEyM3UpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRVaW50NjRFeHRlbnNpb24sIDEyM3UpDQorICAgICAgICAgICAgICAgIDsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtc2cgPSBidWlsZGVyLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFVuaXRUZXN0UHJvdG9GaWxlLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorDQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBjb3B5QnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLkNyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20obXNnLlRvQnl0ZUFycmF5KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnkpOw0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zIGNvcHkgPSBjb3B5QnVpbGRlci5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwobXNnLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRCb29sRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEJ5dGVTdHJpbmcuQ29weUZyb21VdGY4KCIxMjMiKSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEJ5dGVzRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMjMiLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Q29yZEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHREb3VibGVFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzdSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZpeGVkMzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzdSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZpeGVkNjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0RmxvYXRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChJbXBvcnRFbnVtLklNUE9SVF9CQVosIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEludDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZPTywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNpbnQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTIzIiwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFN0cmluZ0V4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTIzIiwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyM3UsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRVaW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzdSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFVpbnQ2NEV4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0cnVlLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEJvb2xFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQnl0ZVN0cmluZy5Db3B5RnJvbVV0ZjgoIjEyMyIpLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEJ5dGVzRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMjMiLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbENvcmRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbERvdWJsZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjN1LCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZpeGVkMzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzdSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGbG9hdEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduRW51bS5GT1JFSUdOX0JBWiwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChJbXBvcnRFbnVtLklNUE9SVF9CQVosIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEludDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZPTywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFNpbnQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMjMiLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFN0cmluZ0V4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTIzIiwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjN1LCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFVpbnQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjN1LCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFVpbnQ2NEV4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0cnVlLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEJvb2xFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQnl0ZVN0cmluZy5Db3B5RnJvbVV0ZjgoIjEyMyIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMjMiLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZENvcmRFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjN1LCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzdSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduRW51bS5GT1JFSUdOX0JBWiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChJbXBvcnRFbnVtLklNUE9SVF9CQVosIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEludDY0RXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZPTywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMjMiLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTIzIiwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjN1LCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjN1LCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvR2VuZXJhdGVkQnVpbGRlclRlc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0dlbmVyYXRlZEJ1aWxkZXJUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkY2IxYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0dlbmVyYXRlZEJ1aWxkZXJUZXN0LmNzCkBAIC0wLDAgKzEsMTI1IEBACivvu791c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgU3lzdGVtLlRleHQ7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zOw0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgR2VuZXJhdGVkQnVpbGRlclRlc3QNCisgICAgew0KKyAgICAgICAgY2xhc3MgT25lVGltZUVudW1lcmF0b3I8VD4gOiBJRW51bWVyYWJsZTxUPg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJlYWRvbmx5IFQgX2l0ZW07DQorICAgICAgICAgICAgYm9vbCBfZW51bWVyYXRlZDsNCisgICAgICAgICAgICBwdWJsaWMgT25lVGltZUVudW1lcmF0b3IoVCBpdGVtKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgX2l0ZW0gPSBpdGVtOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3I8VD4gR2V0RW51bWVyYXRvcigpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShfZW51bWVyYXRlZCwgIlRoZSBjb2xsZWN0aW9uIHswfSBoYXMgYWxyZWFkeSBiZWVuIGVudW1lcmF0ZWQiLCBHZXRUeXBlKCkpOw0KKyAgICAgICAgICAgICAgICBfZW51bWVyYXRlZCA9IHRydWU7DQorICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBfaXRlbTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkNCisgICAgICAgICAgICB7IHJldHVybiBHZXRFbnVtZXJhdG9yKCk7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRG9lc05vdEVudW1lcmF0ZVR3aWNlRm9yTWVzc2FnZUxpc3QoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGIgPSBuZXcgVGVzdEFsbFR5cGVzLkJ1aWxkZXIoKTsNCisgICAgICAgICAgICBiLkFkZFJhbmdlUmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgNCisgICAgICAgICAgICAgICAgbmV3IE9uZVRpbWVFbnVtZXJhdG9yPEZvcmVpZ25NZXNzYWdlPigNCisgICAgICAgICAgICAgICAgICAgIEZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEb2VzTm90RW51bWVyYXRlVHdpY2VGb3JQcmltaXRpdmVMaXN0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBiID0gbmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyKCk7DQorICAgICAgICAgICAgYi5BZGRSYW5nZVJlcGVhdGVkSW50MzIobmV3IE9uZVRpbWVFbnVtZXJhdG9yPGludD4oMSkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEb2VzTm90RW51bWVyYXRlVHdpY2VGb3JTdHJpbmdMaXN0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBiID0gbmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyKCk7DQorICAgICAgICAgICAgYi5BZGRSYW5nZVJlcGVhdGVkU3RyaW5nKG5ldyBPbmVUaW1lRW51bWVyYXRvcjxzdHJpbmc+KCJ0ZXN0IikpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEb2VzTm90RW51bWVyYXRlVHdpY2VGb3JFbnVtTGlzdCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYiA9IG5ldyBUZXN0QWxsVHlwZXMuQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGIuQWRkUmFuZ2VSZXBlYXRlZEZvcmVpZ25FbnVtKG5ldyBPbmVUaW1lRW51bWVyYXRvcjxGb3JlaWduRW51bT4oRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgZGVsZWdhdGUgdm9pZCBUZXN0TWV0aG9kKCk7DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFzc2VydFRocm93czxUPihUZXN0TWV0aG9kIG1ldGhvZCkgd2hlcmUgVCA6IEV4Y2VwdGlvbg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbWV0aG9kKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXJyb3IpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaXMgVCkNCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgdGhyb3c7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEFzc2VydC5GYWlsKCJFeHBlY3RlZCBleGNlcHRpb24gb2YgdHlwZSAiICsgdHlwZW9mKFQpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRG9lc05vdEFkZE51bGxUb01lc3NhZ2VMaXN0QnlBZGRSYW5nZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYiA9IG5ldyBUZXN0QWxsVHlwZXMuQnVpbGRlcigpOw0KKyAgICAgICAgICAgIEFzc2VydFRocm93czxBcmd1bWVudE51bGxFeGNlcHRpb24+KA0KKyAgICAgICAgICAgICAgICAoKSA9PiBiLkFkZFJhbmdlUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShuZXcgRm9yZWlnbk1lc3NhZ2VbXSB7IG51bGwgfSkNCisgICAgICAgICAgICAgICAgICAgICk7DQorICAgICAgICB9DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIERvZXNOb3RBZGROdWxsVG9NZXNzYWdlTGlzdEJ5QWRkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBiID0gbmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyKCk7DQorICAgICAgICAgICAgQXNzZXJ0VGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oDQorICAgICAgICAgICAgICAgICgpID0+IGIuQWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgoRm9yZWlnbk1lc3NhZ2UpbnVsbCkNCisgICAgICAgICAgICAgICAgICAgICk7DQorICAgICAgICB9DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIERvZXNOb3RBZGROdWxsVG9NZXNzYWdlTGlzdEJ5U2V0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBiID0gbmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyKCk7DQorICAgICAgICAgICAgYi5BZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSk7DQorICAgICAgICAgICAgQXNzZXJ0VGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oDQorICAgICAgICAgICAgICAgICgpID0+IGIuU2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgwLCAoRm9yZWlnbk1lc3NhZ2UpbnVsbCkNCisgICAgICAgICAgICAgICAgICAgICk7DQorICAgICAgICB9DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIERvZXNOb3RBZGROdWxsVG9TdHJpbmdMaXN0QnlBZGRSYW5nZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYiA9IG5ldyBUZXN0QWxsVHlwZXMuQnVpbGRlcigpOw0KKyAgICAgICAgICAgIEFzc2VydFRocm93czxBcmd1bWVudE51bGxFeGNlcHRpb24+KA0KKyAgICAgICAgICAgICAgICAoKSA9PiBiLkFkZFJhbmdlUmVwZWF0ZWRTdHJpbmcobmV3IFN0cmluZ1tdIHsgbnVsbCB9KQ0KKyAgICAgICAgICAgICAgICAgICAgKTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRG9lc05vdEFkZE51bGxUb1N0cmluZ0xpc3RCeUFkZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYiA9IG5ldyBUZXN0QWxsVHlwZXMuQnVpbGRlcigpOw0KKyAgICAgICAgICAgIEFzc2VydFRocm93czxBcmd1bWVudE51bGxFeGNlcHRpb24+KA0KKyAgICAgICAgICAgICAgICAoKSA9PiBiLkFkZFJlcGVhdGVkU3RyaW5nKG51bGwpDQorICAgICAgICAgICAgICAgICAgICApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEb2VzTm90QWRkTnVsbFRvU3RyaW5nTGlzdEJ5U2V0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBiID0gbmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyKCk7DQorICAgICAgICAgICAgYi5BZGRSZXBlYXRlZFN0cmluZygib25lIik7DQorICAgICAgICAgICAgQXNzZXJ0VGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oDQorICAgICAgICAgICAgICAgICgpID0+IGIuU2V0UmVwZWF0ZWRTdHJpbmcoMCwgbnVsbCkNCisgICAgICAgICAgICAgICAgICAgICk7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9HZW5lcmF0ZWRNZXNzYWdlVGVzdC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvR2VuZXJhdGVkTWVzc2FnZVRlc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA0ZmIzOQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvR2VuZXJhdGVkTWVzc2FnZVRlc3QuY3MKQEAgLTAsMCArMSw1MzIgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3M7DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIFtUZXN0Q2xhc3NdDQorICAgIHB1YmxpYyBjbGFzcyBHZW5lcmF0ZWRNZXNzYWdlVGVzdA0KKyAgICB7DQorICAgICAgICBwcml2YXRlIFJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvblRlc3RlcjsNCisgICAgICAgIHByaXZhdGUgUmVmbGVjdGlvblRlc3RlciBleHRlbnNpb25zUmVmbGVjdGlvblRlc3RlcjsNCisNCisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0NCisgICAgICAgIHB1YmxpYyB2b2lkIFNldFVwKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZWZsZWN0aW9uVGVzdGVyID0gUmVmbGVjdGlvblRlc3Rlci5DcmVhdGVUZXN0QWxsVHlwZXNJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyID0gUmVmbGVjdGlvblRlc3Rlci5DcmVhdGVUZXN0QWxsRXh0ZW5zaW9uc0luc3RhbmNlKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlcGVhdGVkQWRkUHJpbWl0aXZlQmVmb3JlQnVpbGQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyIHtSZXBlYXRlZEludDMyTGlzdCA9IHsxLCAyLCAzfX0uQnVpbGQoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRFcXVhbChuZXcgaW50W10gezEsIDIsIDN9LCBtZXNzYWdlLlJlcGVhdGVkSW50MzJMaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgQWRkUHJpbWl0aXZlRmFpbHNBZnRlckJ1aWxkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gbmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyKCk7DQorICAgICAgICAgICAgSUxpc3Q8aW50PiBsaXN0ID0gYnVpbGRlci5SZXBlYXRlZEludDMyTGlzdDsNCisgICAgICAgICAgICBsaXN0LkFkZCgxKTsgLy8gRmluZQ0KKyAgICAgICAgICAgIGJ1aWxkZXIuQnVpbGQoKTsNCisNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGxpc3QuQWRkKDIpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuRmFpbCgiTGlzdCBzaG91bGQgYmUgZnJvemVuIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChOb3RTdXBwb3J0ZWRFeGNlcHRpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZA0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUmVwZWF0ZWRBZGRNZXNzYWdlQmVmb3JlQnVpbGQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZE5lc3RlZE1lc3NhZ2VMaXN0ID0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuZXcgVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlciB7QmIgPSAxMH0uQnVpbGQoKX0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG1lc3NhZ2UuUmVwZWF0ZWROZXN0ZWRNZXNzYWdlQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMCwgbWVzc2FnZS5SZXBlYXRlZE5lc3RlZE1lc3NhZ2VMaXN0WzBdLkJiKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgQWRkTWVzc2FnZUZhaWxzQWZ0ZXJCdWlsZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBUZXN0QWxsVHlwZXMuQnVpbGRlcigpOw0KKyAgICAgICAgICAgIElMaXN0PFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPiBsaXN0ID0gYnVpbGRlci5SZXBlYXRlZE5lc3RlZE1lc3NhZ2VMaXN0Ow0KKyAgICAgICAgICAgIGJ1aWxkZXIuQnVpbGQoKTsNCisNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGxpc3QuQWRkKG5ldyBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyIHtCYiA9IDEwfS5CdWlsZCgpKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIkxpc3Qgc2hvdWxkIGJlIGZyb3plbiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoTm90U3VwcG9ydGVkRXhjZXB0aW9uKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIERlZmF1bHRJbnN0YW5jZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUoVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZSwgVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZS5EZWZhdWx0SW5zdGFuY2VGb3JUeXBlKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShUZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlLCBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpLkRlZmF1bHRJbnN0YW5jZUZvclR5cGUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBBY2Nlc3NvcnMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLlNldEFsbEZpZWxkcyhidWlsZGVyKTsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuQnVpbGQoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHRlcnNSZWplY3ROdWxsKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBcmd1bWVudE51bGxFeGNlcHRpb24oKCkgPT4gYnVpbGRlci5TZXRPcHRpb25hbFN0cmluZyhudWxsKSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QXJndW1lbnROdWxsRXhjZXB0aW9uKCgpID0+IGJ1aWxkZXIuU2V0T3B0aW9uYWxCeXRlcyhudWxsKSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QXJndW1lbnROdWxsRXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAoKSA9PiBidWlsZGVyLlNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgoVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UpIG51bGwpKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBcmd1bWVudE51bGxFeGNlcHRpb24oDQorICAgICAgICAgICAgICAgICgpID0+IGJ1aWxkZXIuU2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKChUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyKSBudWxsKSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QXJndW1lbnROdWxsRXhjZXB0aW9uKCgpID0+IGJ1aWxkZXIuQWRkUmVwZWF0ZWRTdHJpbmcobnVsbCkpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigoKSA9PiBidWlsZGVyLkFkZFJlcGVhdGVkQnl0ZXMobnVsbCkpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgKCkgPT4gYnVpbGRlci5BZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlKSBudWxsKSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QXJndW1lbnROdWxsRXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAoKSA9PiBidWlsZGVyLkFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgoVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlcikgbnVsbCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBSZXBlYXRlZFNldHRlcnMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLlNldEFsbEZpZWxkcyhidWlsZGVyKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Nb2RpZnlSZXBlYXRlZEZpZWxkcyhidWlsZGVyKTsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuQnVpbGQoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkKG1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBSZXBlYXRlZEFwcGVuZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKCk7DQorDQorICAgICAgICAgICAgYnVpbGRlci5BZGRSYW5nZVJlcGVhdGVkSW50MzIobmV3IGludFtdIHsxLCAyLCAzLCA0fSk7DQorICAgICAgICAgICAgYnVpbGRlci5BZGRSYW5nZVJlcGVhdGVkRm9yZWlnbkVudW0oKG5ldyBGb3JlaWduRW51bVtdIHtGb3JlaWduRW51bS5GT1JFSUdOX0JBWn0pKTsNCisNCisgICAgICAgICAgICBGb3JlaWduTWVzc2FnZSBmb3JlaWduTWVzc2FnZSA9IEZvcmVpZ25NZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRDKDEyKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuQWRkUmFuZ2VSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKG5ldyBGb3JlaWduTWVzc2FnZVtdIHtmb3JlaWduTWVzc2FnZX0pOw0KKw0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5CdWlsZCgpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEVxdWFsKG1lc3NhZ2UuUmVwZWF0ZWRJbnQzMkxpc3QsIG5ldyBpbnRbXSB7MSwgMiwgMywgNH0pOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEVxdWFsKG1lc3NhZ2UuUmVwZWF0ZWRGb3JlaWduRW51bUxpc3QsIG5ldyBGb3JlaWduRW51bVtdIHtGb3JlaWduRW51bS5GT1JFSUdOX0JBWn0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBtZXNzYWdlLlJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyLCBtZXNzYWdlLkdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuQyk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlcGVhdGVkQXBwZW5kUmVqZWN0c051bGwoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpOw0KKw0KKyAgICAgICAgICAgIEZvcmVpZ25NZXNzYWdlIGZvcmVpZ25NZXNzYWdlID0gRm9yZWlnbk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEMoMTIpLkJ1aWxkKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QXJndW1lbnROdWxsRXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAoKSA9PiBidWlsZGVyLkFkZFJhbmdlUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShuZXdbXSB7Zm9yZWlnbk1lc3NhZ2UsIG51bGx9KSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QXJndW1lbnROdWxsRXhjZXB0aW9uKCgpID0+IGJ1aWxkZXIuQWRkUmFuZ2VSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKG51bGwpKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBcmd1bWVudE51bGxFeGNlcHRpb24oKCkgPT4gYnVpbGRlci5BZGRSYW5nZVJlcGVhdGVkRm9yZWlnbkVudW0obnVsbCkpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigoKSA9PiBidWlsZGVyLkFkZFJhbmdlUmVwZWF0ZWRTdHJpbmcobmV3W10geyJvbmUiLCBudWxsfSkpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgKCkgPT4gYnVpbGRlci5BZGRSYW5nZVJlcGVhdGVkQnl0ZXMobmV3W10ge1Rlc3RVdGlsLlRvQnl0ZXMoIm9uZSIpLCBudWxsfSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR0aW5nRm9yZWlnbk1lc3NhZ2VVc2luZ0J1aWxkZXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAvLyBQYXNzIGJ1aWxkZXIgZm9yIGZvcmVpZ24gbWVzc2FnZSBpbnN0YW5jZS4NCisgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEMoMTIzKSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIGV4cGVjdGVkTWVzc2FnZSA9IFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGV4cGVjdGVkIHZlcnNpb24gcGFzc2luZyBmb3JlaWduIG1lc3NhZ2UgaW5zdGFuY2UgZXhwbGljaXRseS4NCisgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEMoMTIzKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRNZXNzYWdlLCBtZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dGluZ1JlcGVhdGVkRm9yZWlnbk1lc3NhZ2VVc2luZ0J1aWxkZXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAvLyBQYXNzIGJ1aWxkZXIgZm9yIGZvcmVpZ24gbWVzc2FnZSBpbnN0YW5jZS4NCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEMoNDU2KSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIGV4cGVjdGVkTWVzc2FnZSA9IFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGV4cGVjdGVkIHZlcnNpb24gcGFzc2luZyBmb3JlaWduIG1lc3NhZ2UgaW5zdGFuY2UgZXhwbGljaXRseS4NCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEMoNDU2KS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRNZXNzYWdlLCBtZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dGluZ1JlcGVhdGVkVmFsdWVzVXNpbmdSYW5nZUluQ29sbGVjdGlvbkluaXRpYWxpemVyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnRbXSB2YWx1ZXMgPSB7MSwgMiwgM307DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzLkJ1aWxkZXINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkU2ludDMyTGlzdCA9IHt2YWx1ZXN9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoTGlzdHMuRXF1YWxzKHZhbHVlcywgbWVzc2FnZS5SZXBlYXRlZFNpbnQzMkxpc3QpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dGluZ1JlcGVhdGVkVmFsdWVzVXNpbmdJbmRpdmlkdWFsVmFsdWVzSW5Db2xsZWN0aW9uSW5pdGlhbGl6ZXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZFNpbnQzMkxpc3QgPSB7NiwgN30NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShMaXN0cy5FcXVhbHMobmV3IGludFtdIHs2LCA3fSwgbWVzc2FnZS5SZXBlYXRlZFNpbnQzMkxpc3QpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRGVmYXVsdHMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydENsZWFyKFRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2UpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydENsZWFyKFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKCkuQnVpbGQoKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJcdTEyMzQiLCBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuRGVmYXVsdEluc3RhbmNlLlV0ZjhTdHJpbmcpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWZsZWN0aW9uR2V0dGVycygpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuU2V0QWxsRmllbGRzKGJ1aWxkZXIpOw0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5CdWlsZCgpOw0KKyAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUmVmbGVjdGlvblNldHRlcnMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuQnVpbGQoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlZmxlY3Rpb25DbGVhcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVmbGVjdGlvblRlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOw0KKyAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuQ2xlYXJBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOw0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5CdWlsZCgpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydENsZWFyKG1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWZsZWN0aW9uU2V0dGVyc1JlamVjdE51bGwoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0UmVmbGVjdGlvblNldHRlcnNSZWplY3ROdWxsKGJ1aWxkZXIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZWZsZWN0aW9uVGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7DQorICAgICAgICAgICAgcmVmbGVjdGlvblRlc3Rlci5Nb2RpZnlSZXBlYXRlZEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLkJ1aWxkKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZChtZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFJlZmxlY3Rpb25SZXBlYXRlZFNldHRlcnNSZWplY3ROdWxsKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZWZsZWN0aW9uVGVzdGVyLkFzc2VydFJlZmxlY3Rpb25SZXBlYXRlZFNldHRlcnNSZWplY3ROdWxsKGJ1aWxkZXIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWZsZWN0aW9uRGVmYXVsdHMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RVdGlsLlRlc3RJbk11bHRpcGxlQ3VsdHVyZXMoKCkgPT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0Q2xlYXJWaWFSZWZsZWN0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0Q2xlYXJWaWFSZWZsZWN0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKS5CdWlsZCgpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorICAgICAgICAvLyBFeHRlbnNpb25zLg0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBFeHRlbnNpb25BY2Nlc3NvcnMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5TZXRBbGxFeHRlbnNpb25zKGJ1aWxkZXIpOw0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPSBidWlsZGVyLkJ1aWxkKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRXh0ZW5zaW9uUmVwZWF0ZWRTZXR0ZXJzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuU2V0QWxsRXh0ZW5zaW9ucyhidWlsZGVyKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Nb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoYnVpbGRlcik7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSA9IGJ1aWxkZXIuQnVpbGQoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZChtZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRXh0ZW5zaW9uRGVmYXVsdHMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEV4dGVuc2lvbnNDbGVhcihUZXN0QWxsRXh0ZW5zaW9ucy5EZWZhdWx0SW5zdGFuY2UpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEV4dGVuc2lvbnNDbGVhcihUZXN0QWxsRXh0ZW5zaW9ucy5DcmVhdGVCdWlsZGVyKCkuQnVpbGQoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEV4dGVuc2lvblJlZmxlY3Rpb25HZXR0ZXJzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuU2V0QWxsRXh0ZW5zaW9ucyhidWlsZGVyKTsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0gYnVpbGRlci5CdWlsZCgpOw0KKyAgICAgICAgICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLkFzc2VydEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24obWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEV4dGVuc2lvblJlZmxlY3Rpb25TZXR0ZXJzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0gYnVpbGRlci5CdWlsZCgpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEV4dGVuc2lvblJlZmxlY3Rpb25TZXR0ZXJzUmVqZWN0TnVsbCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLkFzc2VydFJlZmxlY3Rpb25TZXR0ZXJzUmVqZWN0TnVsbChidWlsZGVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRXh0ZW5zaW9uUmVmbGVjdGlvblJlcGVhdGVkU2V0dGVycygpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7DQorICAgICAgICAgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuTW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOw0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPSBidWlsZGVyLkJ1aWxkKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQobWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEV4dGVuc2lvblJlZmxlY3Rpb25SZXBlYXRlZFNldHRlcnNSZWplY3ROdWxsKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0UmVmbGVjdGlvblJlcGVhdGVkU2V0dGVyc1JlamVjdE51bGwoYnVpbGRlcik7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEV4dGVuc2lvblJlZmxlY3Rpb25EZWZhdWx0cygpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFV0aWwuVGVzdEluTXVsdGlwbGVDdWx0dXJlcygoKSA9Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0Q2xlYXJWaWFSZWZsZWN0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMuRGVmYXVsdEluc3RhbmNlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuQXNzZXJ0Q2xlYXJWaWFSZWZsZWN0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMuQ3JlYXRlQnVpbGRlcigpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhckV4dGVuc2lvbigpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gQ2xlYXJFeHRlbnNpb24oKSBpcyBub3QgYWN0dWFsbHkgdXNlZCBpbiBUZXN0VXRpbCwgc28gdHJ5IGl0IG1hbnVhbGx5Lg0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKFRlc3RBbGxFeHRlbnNpb25zLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24sIDEpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5DbGVhckV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgVGVzdEFsbEV4dGVuc2lvbnMuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDEpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ2xlYXJFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEV4dGVuc2lvbk1lcmdlRnJvbSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMgb3JpZ2luYWwgPSBUZXN0QWxsRXh0ZW5zaW9ucy5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uLCAxKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lcmdlZCA9DQorICAgICAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zLkNyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20ob3JpZ2luYWwpLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgobWVyZ2VkLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCAoaW50KSBtZXJnZWQuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8qIFJlbW92ZWQgbXVsdGlwbGUgZmlsZXMgb3B0aW9uIGZvciB0aGUgbW9tZW50DQorICAgIFtUZXN0TWV0aG9kXQ0KKyAgICBwdWJsaWMgdm9pZCBNdWx0aXBsZUZpbGVzT3B0aW9uKCkgew0KKyAgICAgIC8vIFdlIG1vc3RseSBqdXN0IHdhbnQgdG8gY2hlY2sgdGhhdCB0aGluZ3MgY29tcGlsZS4NCisgICAgICBNZXNzYWdlV2l0aE5vT3V0ZXIgbWVzc2FnZSA9IE1lc3NhZ2VXaXRoTm9PdXRlci5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgLlNldE5lc3RlZChNZXNzYWdlV2l0aE5vT3V0ZXIuVHlwZXMuTmVzdGVkTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0SSgxKSkNCisgICAgICAgICAgLkFkZEZvcmVpZ24oVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKS5TZXRPcHRpb25hbEludDMyKDEpKQ0KKyAgICAgICAgICAuU2V0TmVzdGVkRW51bShNZXNzYWdlV2l0aE5vT3V0ZXIuVHlwZXMuTmVzdGVkRW51bS5CQVopDQorICAgICAgICAgIC5TZXRGb3JlaWduRW51bShFbnVtV2l0aE5vT3V0ZXIuQkFSKQ0KKyAgICAgICAgICAuQnVpbGQoKTsNCisgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZSwgTWVzc2FnZVdpdGhOb091dGVyLlBhcnNlRnJvbShtZXNzYWdlLlRvQnl0ZVN0cmluZygpKSk7DQorDQorICAgICAgQXNzZXJ0LkFyZUVxdWFsKE11bHRpRmlsZVByb3RvLkRlc2NyaXB0b3IsIE1lc3NhZ2VXaXRoTm9PdXRlci5EZXNjcmlwdG9yLkZpbGUpOw0KKw0KKyAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IE1lc3NhZ2VXaXRoTm9PdXRlci5EZXNjcmlwdG9yLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oImZvcmVpZ25fZW51bSIpOw0KKyAgICAgIEFzc2VydC5BcmVFcXVhbChNdWx0aUZpbGVQcm90by5EZXNjcmlwdG9yLkZpbmRUeXBlQnlOYW1lPEVudW1EZXNjcmlwdG9yPigiRW51bVdpdGhOb091dGVyIikNCisgICAgICAgIC5GaW5kVmFsdWVCeU51bWJlcigoaW50KUVudW1XaXRoTm9PdXRlci5CQVIpLCBtZXNzYWdlW2ZpZWxkXSk7DQorDQorICAgICAgQXNzZXJ0LkFyZUVxdWFsKE11bHRpRmlsZVByb3RvLkRlc2NyaXB0b3IsIFNlcnZpY2VXaXRoTm9PdXRlci5EZXNjcmlwdG9yLkZpbGUpOw0KKw0KKyAgICAgIEFzc2VydC5Jc0ZhbHNlKFRlc3RBbGxFeHRlbnNpb25zLkRlZmF1bHRJbnN0YW5jZS5IYXNFeHRlbnNpb24oTXVsdGlGaWxlUHJvdG8uRXh0ZW5zaW9uV2l0aE91dGVyKSk7DQorICAgIH0qLw0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBPcHRpb25hbEZpZWxkV2l0aFJlcXVpcmVkU3ViZmllbGRzT3B0aW1pemVkRm9yU2l6ZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSBtZXNzYWdlID0gVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZS5EZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLklzSW5pdGlhbGl6ZWQpOw0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2UgPSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLkNyZWF0ZUJ1aWxkZXIoKS5TZXRPKA0KKyAgICAgICAgICAgICAgICBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplLkNyZWF0ZUJ1aWxkZXIoKS5CdWlsZFBhcnRpYWwoKQ0KKyAgICAgICAgICAgICAgICApLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSXNJbml0aWFsaXplZCk7DQorDQorICAgICAgICAgICAgbWVzc2FnZSA9IFRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUuQ3JlYXRlQnVpbGRlcigpLlNldE8oDQorICAgICAgICAgICAgICAgIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUuQ3JlYXRlQnVpbGRlcigpLlNldFgoNSkuQnVpbGRQYXJ0aWFsKCkNCisgICAgICAgICAgICAgICAgKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSXNJbml0aWFsaXplZCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIE9wdGltaXplZEZvclNpemVNZXJnZVVzZXNBbGxGaWVsZHNGcm9tVGFyZ2V0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0T3B0aW1pemVkRm9yU2l6ZSB3aXRoRmllbGRTZXQgPSBuZXcgVGVzdE9wdGltaXplZEZvclNpemUuQnVpbGRlciB7SSA9IDEwfS5CdWlsZCgpOw0KKyAgICAgICAgICAgIFRlc3RPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBUZXN0T3B0aW1pemVkRm9yU2l6ZS5CdWlsZGVyKCk7DQorICAgICAgICAgICAgYnVpbGRlci5NZXJnZUZyb20od2l0aEZpZWxkU2V0KTsNCisgICAgICAgICAgICBUZXN0T3B0aW1pemVkRm9yU2l6ZSBidWlsdCA9IGJ1aWxkZXIuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAsIGJ1aWx0LkkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBVbmluaXRpYWxpemVkRXh0ZW5zaW9uSW5PcHRpbWl6ZWRGb3JTaXplTWFrZXNNZXNzYWdlVW5pbml0aWFsaXplZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdE9wdGltaXplZEZvclNpemUuQnVpbGRlciBidWlsZGVyID0gbmV3IFRlc3RPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXIoKTsNCisgICAgICAgICAgICBidWlsZGVyLlNldEV4dGVuc2lvbihUZXN0T3B0aW1pemVkRm9yU2l6ZS5UZXN0RXh0ZW5zaW9uMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZS5CdWlsZGVyKCkuQnVpbGRQYXJ0aWFsKCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGJ1aWxkZXIuSXNJbml0aWFsaXplZCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYnVpbGRlci5CdWlsZFBhcnRpYWwoKS5Jc0luaXRpYWxpemVkKTsNCisNCisgICAgICAgICAgICBidWlsZGVyID0gbmV3IFRlc3RPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXIoKTsNCisgICAgICAgICAgICBidWlsZGVyLlNldEV4dGVuc2lvbihUZXN0T3B0aW1pemVkRm9yU2l6ZS5UZXN0RXh0ZW5zaW9uMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZS5CdWlsZGVyIHtYID0gMTB9LkJ1aWxkUGFydGlhbCgpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGJ1aWxkZXIuSXNJbml0aWFsaXplZCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShidWlsZGVyLkJ1aWxkUGFydGlhbCgpLklzSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUb0J1aWxkZXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLlNldEFsbEZpZWxkcyhidWlsZGVyKTsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuQnVpbGQoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZS5Ub0J1aWxkZXIoKS5CdWlsZCgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRmllbGRDb25zdGFudFZhbHVlcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkJiRmllbGROdW1iZXIsIDEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuT3B0aW9uYWxJbnQzMkZpZWxkTnVtYmVyLCAxKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzLk9wdGlvbmFsR3JvdXBGaWVsZE51bWJlciwgMTYpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuT3B0aW9uYWxOZXN0ZWRNZXNzYWdlRmllbGROdW1iZXIsIDE4KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzLk9wdGlvbmFsTmVzdGVkRW51bUZpZWxkTnVtYmVyLCAyMSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5SZXBlYXRlZEludDMyRmllbGROdW1iZXIsIDMxKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXBGaWVsZE51bWJlciwgNDYpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRmllbGROdW1iZXIsIDQ4KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzLlJlcGVhdGVkTmVzdGVkRW51bUZpZWxkTnVtYmVyLCA1MSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEV4dGVuc2lvbkNvbnN0YW50VmFsdWVzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdFJlcXVpcmVkLlNpbmdsZUZpZWxkTnVtYmVyLCAxMDAwKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdFJlcXVpcmVkLk11bHRpRmllbGROdW1iZXIsIDEwMDEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIsIDEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEdyb3VwRXh0ZW5zaW9uRmllbGROdW1iZXIsIDE2KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uRmllbGROdW1iZXIsIDE4KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uRmllbGROdW1iZXIsIDIxKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyLCAzMSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkR3JvdXBFeHRlbnNpb25GaWVsZE51bWJlciwgNDYpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25GaWVsZE51bWJlciwgNDgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25GaWVsZE51bWJlciwgNTEpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBFbXB0eVBhY2tlZFZhbHVlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0UGFja2VkVHlwZXMgZW1wdHkgPSBuZXcgVGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXIoKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBlbXB0eS5TZXJpYWxpemVkU2l6ZSk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Jc3N1ZXNUZXN0LmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Jc3N1ZXNUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDAyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L0lzc3Vlc1Rlc3QuY3MKQEAgLTAsMCArMSw2NSBAQAor77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zOw0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KK3VzaW5nIFVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zOw0KKw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBUZXN0cyBmb3IgaXNzdWVzIHdoaWNoIGFyZW4ndCBlYXNpbHkgY29tcGFydG1lbnRhbGl6ZWQgaW50byBvdGhlciB1bml0IHRlc3RzLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgSXNzdWVzVGVzdA0KKyAgICB7DQorICAgICAgICAvLyBJc3N1ZSA0NQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBGaWVsZENhbGxlZEl0ZW0oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEl0ZW1GaWVsZCBtZXNzYWdlID0gbmV3IEl0ZW1GaWVsZC5CdWlsZGVyIHsgSXRlbSA9IDMgfS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IEl0ZW1GaWVsZC5EZXNjcmlwdG9yLkZpbmRGaWVsZEJ5TmFtZSgiaXRlbSIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoZmllbGQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCAoaW50KW1lc3NhZ2VbZmllbGRdKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L01lc3NhZ2VTdHJlYW1JdGVyYXRvclRlc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L01lc3NhZ2VTdHJlYW1JdGVyYXRvclRlc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMDU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvTWVzc2FnZVN0cmVhbUl0ZXJhdG9yVGVzdC5jcwpAQCAtMCwwICsxLDkxIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgU3lzdGVtLklPOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvczsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCit1c2luZyBOZXN0ZWRNZXNzYWdlID0gR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgTWVzc2FnZVN0cmVhbUl0ZXJhdG9yVGVzdA0KKyAgICB7DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRocmVlTWVzc2FnZXNJbk1lbW9yeSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgTWVtb3J5U3RyZWFtIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oTWVzc2FnZVN0cmVhbVdyaXRlclRlc3QuVGhyZWVNZXNzYWdlRGF0YSk7DQorICAgICAgICAgICAgSUVudW1lcmFibGU8TmVzdGVkTWVzc2FnZT4gaXRlcmF0b3IgPSBNZXNzYWdlU3RyZWFtSXRlcmF0b3I8TmVzdGVkTWVzc2FnZT4uRnJvbVN0cmVhbVByb3ZpZGVyKCgpID0+IHN0cmVhbSk7DQorICAgICAgICAgICAgTGlzdDxOZXN0ZWRNZXNzYWdlPiBtZXNzYWdlcyA9IG5ldyBMaXN0PE5lc3RlZE1lc3NhZ2U+KGl0ZXJhdG9yKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgbWVzc2FnZXMuQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1LCBtZXNzYWdlc1swXS5CYik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDE1MDAsIG1lc3NhZ2VzWzFdLkJiKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlc1syXS5IYXNCYik7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIE1hbnlNZXNzYWdlc1Nob3VsZE5vdFRyaWdnZXJTaXplQWxlcnQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGludCBtZXNzYWdlU2l6ZSA9IFRlc3RVdGlsLkdldEFsbFNldCgpLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICAgIC8vIEVub3VnaCBtZXNzYWdlcyB0byB0cmlnZ2VyIHRoZSBhbGVydCB1bmxlc3Mgd2UndmUgcmVzZXQgdGhlIHNpemUNCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgY3VycmVudGx5IHdlIG5lZWQgdG8gbWFrZSB0aGlzIGJpZyBlbm91Z2ggdG8gY29weSB0d28gd2hvbGUgYnVmZmVycywNCisgICAgICAgICAgICAvLyBhcyBvdGhlcndpc2Ugd2hlbiB3ZSByZWZpbGwgdGhlIGJ1ZmZlciB0aGUgc2Vjb25kIHR5cGUsIHRoZSBhbGVydCB0cmlnZ2VycyBpbnN0YW50bHkuDQorICAgICAgICAgICAgaW50IGNvcnJlY3RDb3VudCA9IChDb2RlZElucHV0U3RyZWFtLkJ1ZmZlclNpemUqMikvbWVzc2FnZVNpemUgKyAxOw0KKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgTWVzc2FnZVN0cmVhbVdyaXRlcjxUZXN0QWxsVHlwZXM+IHdyaXRlciA9IG5ldyBNZXNzYWdlU3RyZWFtV3JpdGVyPFRlc3RBbGxUeXBlcz4oc3RyZWFtKTsNCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3JyZWN0Q291bnQ7IGkrKykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKFRlc3RVdGlsLkdldEFsbFNldCgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB3cml0ZXIuRmx1c2goKTsNCisNCisgICAgICAgICAgICAgICAgc3RyZWFtLlBvc2l0aW9uID0gMDsNCisNCisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIG1lc3NhZ2UgaW4gTWVzc2FnZVN0cmVhbUl0ZXJhdG9yPFRlc3RBbGxUeXBlcz4uRnJvbVN0cmVhbVByb3ZpZGVyKCgpID0+IHN0cmVhbSkNCisgICAgICAgICAgICAgICAgICAgIC5XaXRoU2l6ZUxpbWl0KENvZGVkSW5wdXRTdHJlYW0uQnVmZmVyU2l6ZSoyKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsNCisgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFsbEZpZWxkc1NldChtZXNzYWdlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoY29ycmVjdENvdW50LCBjb3VudCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvTWVzc2FnZVN0cmVhbVdyaXRlclRlc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L01lc3NhZ2VTdHJlYW1Xcml0ZXJUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzcyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L01lc3NhZ2VTdHJlYW1Xcml0ZXJUZXN0LmNzCkBAIC0wLDAgKzEsNzkgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQordXNpbmcgTmVzdGVkTWVzc2FnZSA9IEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZTsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIE1lc3NhZ2VTdHJlYW1Xcml0ZXJUZXN0DQorICAgIHsNCisgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBieXRlW10gVGhyZWVNZXNzYWdlRGF0YSA9IG5ldyBieXRlW10NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMpIHwgMiwgMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmllbGQgMSwgMiBieXRlcyBsb25nIChmaXJzdCBtZXNzYWdlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzKSB8IDAsIDUsIC8vIEZpZWxkIDEsIHZhbHVlIDUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMykgfCAyLCAzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWVsZCAxLCAzIGJ5dGVzIGxvbmcgKHNlY29uZCBtZXNzYWdlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzKSB8IDAsICgxNTAwICYgMHg3ZikgfCAweDgwLCAxNTAwID4+IDcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpZWxkIDEsIHZhbHVlIDE1MDANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMykgfCAyLCAwLCAvLyBGaWVsZCAxLCBubyBkYXRhICh0aGlyZCBtZXNzYWdlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRocmVlTWVzc2FnZXMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE5lc3RlZE1lc3NhZ2UgbWVzc2FnZTEgPSBuZXcgTmVzdGVkTWVzc2FnZS5CdWlsZGVyIHtCYiA9IDV9LkJ1aWxkKCk7DQorICAgICAgICAgICAgTmVzdGVkTWVzc2FnZSBtZXNzYWdlMiA9IG5ldyBOZXN0ZWRNZXNzYWdlLkJ1aWxkZXIge0JiID0gMTUwMH0uQnVpbGQoKTsNCisgICAgICAgICAgICBOZXN0ZWRNZXNzYWdlIG1lc3NhZ2UzID0gbmV3IE5lc3RlZE1lc3NhZ2UuQnVpbGRlcigpLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgYnl0ZVtdIGRhdGE7DQorICAgICAgICAgICAgdXNpbmcgKE1lbW9yeVN0cmVhbSBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBNZXNzYWdlU3RyZWFtV3JpdGVyPE5lc3RlZE1lc3NhZ2U+IHdyaXRlciA9IG5ldyBNZXNzYWdlU3RyZWFtV3JpdGVyPE5lc3RlZE1lc3NhZ2U+KHN0cmVhbSk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShtZXNzYWdlMSk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShtZXNzYWdlMik7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShtZXNzYWdlMyk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5GbHVzaCgpOw0KKyAgICAgICAgICAgICAgICBkYXRhID0gc3RyZWFtLlRvQXJyYXkoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0RXF1YWxCeXRlcyhUaHJlZU1lc3NhZ2VEYXRhLCBkYXRhKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L01lc3NhZ2VUZXN0LmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9NZXNzYWdlVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmIwZmFjCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9NZXNzYWdlVGVzdC5jcwpAQCAtMCwwICsxLDM4NyBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvczsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gTWlzY2VsbGFuZW91cyB0ZXN0cyBmb3IgbWVzc2FnZSBvcGVyYXRpb25zIHRoYXQgYXBwbHkgdG8gYm90aA0KKyAgICAvLy8gZ2VuZXJhdGVkIGFuZCBkeW5hbWljIG1lc3NhZ2VzLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgTWVzc2FnZVRlc3QNCisgICAgew0KKyAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisgICAgICAgIC8vIE1lc3NhZ2UtbWVyZ2luZyB0ZXN0cy4NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RBbGxUeXBlcyBNZXJnZVNvdXJjZSA9IG5ldyBUZXN0QWxsVHlwZXMuQnVpbGRlcg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxJbnQzMiA9IDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsU3RyaW5nID0gImZvbyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgPQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uQWRkUmVwZWF0ZWRTdHJpbmcoImJhciIpLkJ1aWxkKCk7DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0QWxsVHlwZXMgTWVyZ2VEZXN0ID0gbmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsSW50NjQgPSAyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxTdHJpbmcgPSAiYmF6IiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgPQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGb3JlaWduTWVzc2FnZS5CdWlsZGVyIHtDID0gM30uQnVpbGQoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5BZGRSZXBlYXRlZFN0cmluZygicXV4IikuQnVpbGQoKTsNCisNCisgICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIE1lcmdlUmVzdWx0VGV4dCA9DQorICAgICAgICAgICAgIm9wdGlvbmFsX2ludDMyOiAxXG4iICsNCisgICAgICAgICAgICAib3B0aW9uYWxfaW50NjQ6IDJcbiIgKw0KKyAgICAgICAgICAgICJvcHRpb25hbF9zdHJpbmc6IFwiZm9vXCJcbiIgKw0KKyAgICAgICAgICAgICJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2Uge1xuIiArDQorICAgICAgICAgICAgIiAgYzogM1xuIiArDQorICAgICAgICAgICAgIn1cbiIgKw0KKyAgICAgICAgICAgICJyZXBlYXRlZF9zdHJpbmc6IFwicXV4XCJcbiIgKw0KKyAgICAgICAgICAgICJyZXBlYXRlZF9zdHJpbmc6IFwiYmFyXCJcbiI7DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIHJlc3VsdCA9IFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKE1lcmdlRGVzdCkuTWVyZ2VGcm9tKE1lcmdlU291cmNlKS5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChNZXJnZVJlc3VsdFRleHQsIHJlc3VsdC5Ub1N0cmluZygpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUZXN0IG1lcmdpbmcgYSBEeW5hbWljTWVzc2FnZSBpbnRvIGEgR2VuZXJhdGVkTWVzc2FnZS4gDQorICAgICAgICAvLy8gQXMgbG9uZyBhcyB0aGV5IGhhdmUgdGhlIHNhbWUgZGVzY3JpcHRvciwgdGhpcyBzaG91bGQgd29yaywgYnV0IGl0IGlzIGFuDQorICAgICAgICAvLy8gZW50aXJlbHkgZGlmZmVyZW50IGNvZGUgcGF0aC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbUR5bmFtaWMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyByZXN1bHQgPSAoVGVzdEFsbFR5cGVzKSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcihNZXJnZURlc3QpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuTWVyZ2VGcm9tKER5bmFtaWNNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoTWVyZ2VTb3VyY2UpLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoTWVyZ2VSZXN1bHRUZXh0LCByZXN1bHQuVG9TdHJpbmcoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGVzdCBtZXJnaW5nIHR3byBEeW5hbWljTWVzc2FnZXMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEeW5hbWljTWVyZ2VGcm9tKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBEeW5hbWljTWVzc2FnZSByZXN1bHQgPSAoRHluYW1pY01lc3NhZ2UpIER5bmFtaWNNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoTWVyZ2VEZXN0KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5NZXJnZUZyb20oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEeW5hbWljTWVzc2FnZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY01lc3NhZ2UuQ3JlYXRlQnVpbGRlcihNZXJnZVNvdXJjZSkuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoTWVyZ2VSZXN1bHRUZXh0LCByZXN1bHQuVG9TdHJpbmcoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyAgICAgICAgLy8gUmVxdWlyZWQtZmllbGQtcmVsYXRlZCB0ZXN0cy4NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RSZXF1aXJlZCBUZXN0UmVxdWlyZWRVbmluaXRpYWxpemVkID0gVGVzdFJlcXVpcmVkLkRlZmF1bHRJbnN0YW5jZTsNCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RSZXF1aXJlZCBUZXN0UmVxdWlyZWRJbml0aWFsaXplZCA9IG5ldyBUZXN0UmVxdWlyZWQuQnVpbGRlcg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSA9IDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIgPSAyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDID0gMw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uQnVpbGQoKTsNCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgSW5pdGlhbGl6YXRpb24oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RSZXF1aXJlZC5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0UmVxdWlyZWQuQ3JlYXRlQnVpbGRlcigpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGJ1aWxkZXIuSXNJbml0aWFsaXplZCk7DQorICAgICAgICAgICAgYnVpbGRlci5BID0gMTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShidWlsZGVyLklzSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuQiA9IDE7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYnVpbGRlci5Jc0luaXRpYWxpemVkKTsNCisgICAgICAgICAgICBidWlsZGVyLkMgPSAxOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoYnVpbGRlci5Jc0luaXRpYWxpemVkKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVW5pbml0aWFsaXplZEJ1aWxkZXJUb1N0cmluZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFJlcXVpcmVkLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RSZXF1aXJlZC5DcmVhdGVCdWlsZGVyKCkuU2V0QSgxKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImE6IDFcbiIsIGJ1aWxkZXIuVG9TdHJpbmcoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlcXVpcmVkRm9yZWlnbigpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFJlcXVpcmVkRm9yZWlnbi5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0UmVxdWlyZWRGb3JlaWduLkNyZWF0ZUJ1aWxkZXIoKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGJ1aWxkZXIuSXNJbml0aWFsaXplZCk7DQorDQorICAgICAgICAgICAgYnVpbGRlci5TZXRPcHRpb25hbE1lc3NhZ2UoVGVzdFJlcXVpcmVkVW5pbml0aWFsaXplZCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYnVpbGRlci5Jc0luaXRpYWxpemVkKTsNCisNCisgICAgICAgICAgICBidWlsZGVyLlNldE9wdGlvbmFsTWVzc2FnZShUZXN0UmVxdWlyZWRJbml0aWFsaXplZCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShidWlsZGVyLklzSW5pdGlhbGl6ZWQpOw0KKw0KKyAgICAgICAgICAgIGJ1aWxkZXIuQWRkUmVwZWF0ZWRNZXNzYWdlKFRlc3RSZXF1aXJlZFVuaW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGJ1aWxkZXIuSXNJbml0aWFsaXplZCk7DQorDQorICAgICAgICAgICAgYnVpbGRlci5TZXRSZXBlYXRlZE1lc3NhZ2UoMCwgVGVzdFJlcXVpcmVkSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoYnVpbGRlci5Jc0luaXRpYWxpemVkKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUmVxdWlyZWRFeHRlbnNpb24oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLkNyZWF0ZUJ1aWxkZXIoKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGJ1aWxkZXIuSXNJbml0aWFsaXplZCk7DQorDQorICAgICAgICAgICAgYnVpbGRlci5TZXRFeHRlbnNpb24oVGVzdFJlcXVpcmVkLlNpbmdsZSwgVGVzdFJlcXVpcmVkVW5pbml0aWFsaXplZCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYnVpbGRlci5Jc0luaXRpYWxpemVkKTsNCisNCisgICAgICAgICAgICBidWlsZGVyLlNldEV4dGVuc2lvbihUZXN0UmVxdWlyZWQuU2luZ2xlLCBUZXN0UmVxdWlyZWRJbml0aWFsaXplZCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShidWlsZGVyLklzSW5pdGlhbGl6ZWQpOw0KKw0KKyAgICAgICAgICAgIGJ1aWxkZXIuQWRkRXh0ZW5zaW9uKFRlc3RSZXF1aXJlZC5NdWx0aSwgVGVzdFJlcXVpcmVkVW5pbml0aWFsaXplZCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYnVpbGRlci5Jc0luaXRpYWxpemVkKTsNCisNCisgICAgICAgICAgICBidWlsZGVyLlNldEV4dGVuc2lvbihUZXN0UmVxdWlyZWQuTXVsdGksIDAsIFRlc3RSZXF1aXJlZEluaXRpYWxpemVkKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGJ1aWxkZXIuSXNJbml0aWFsaXplZCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlcXVpcmVkRHluYW1pYygpDQorICAgICAgICB7DQorICAgICAgICAgICAgTWVzc2FnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFRlc3RSZXF1aXJlZC5EZXNjcmlwdG9yOw0KKyAgICAgICAgICAgIER5bmFtaWNNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9IER5bmFtaWNNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoZGVzY3JpcHRvcik7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYnVpbGRlci5Jc0luaXRpYWxpemVkKTsNCisgICAgICAgICAgICBidWlsZGVyW2Rlc2NyaXB0b3IuRmluZERlc2NyaXB0b3I8RmllbGREZXNjcmlwdG9yPigiYSIpXSA9IDE7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYnVpbGRlci5Jc0luaXRpYWxpemVkKTsNCisgICAgICAgICAgICBidWlsZGVyW2Rlc2NyaXB0b3IuRmluZERlc2NyaXB0b3I8RmllbGREZXNjcmlwdG9yPigiYiIpXSA9IDE7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYnVpbGRlci5Jc0luaXRpYWxpemVkKTsNCisgICAgICAgICAgICBidWlsZGVyW2Rlc2NyaXB0b3IuRmluZERlc2NyaXB0b3I8RmllbGREZXNjcmlwdG9yPigiYyIpXSA9IDE7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShidWlsZGVyLklzSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBSZXF1aXJlZER5bmFtaWNGb3JlaWduKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBNZXNzYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdFJlcXVpcmVkRm9yZWlnbi5EZXNjcmlwdG9yOw0KKyAgICAgICAgICAgIER5bmFtaWNNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9IER5bmFtaWNNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoZGVzY3JpcHRvcik7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShidWlsZGVyLklzSW5pdGlhbGl6ZWQpOw0KKw0KKyAgICAgICAgICAgIGJ1aWxkZXJbZGVzY3JpcHRvci5GaW5kRGVzY3JpcHRvcjxGaWVsZERlc2NyaXB0b3I+KCJvcHRpb25hbF9tZXNzYWdlIildID0gVGVzdFJlcXVpcmVkVW5pbml0aWFsaXplZDsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShidWlsZGVyLklzSW5pdGlhbGl6ZWQpOw0KKw0KKyAgICAgICAgICAgIGJ1aWxkZXJbZGVzY3JpcHRvci5GaW5kRGVzY3JpcHRvcjxGaWVsZERlc2NyaXB0b3I+KCJvcHRpb25hbF9tZXNzYWdlIildID0gVGVzdFJlcXVpcmVkSW5pdGlhbGl6ZWQ7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShidWlsZGVyLklzSW5pdGlhbGl6ZWQpOw0KKw0KKyAgICAgICAgICAgIGJ1aWxkZXIuQWRkUmVwZWF0ZWRGaWVsZChkZXNjcmlwdG9yLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oInJlcGVhdGVkX21lc3NhZ2UiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFJlcXVpcmVkVW5pbml0aWFsaXplZCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYnVpbGRlci5Jc0luaXRpYWxpemVkKTsNCisNCisgICAgICAgICAgICBidWlsZGVyLlNldFJlcGVhdGVkRmllbGQoZGVzY3JpcHRvci5GaW5kRGVzY3JpcHRvcjxGaWVsZERlc2NyaXB0b3I+KCJyZXBlYXRlZF9tZXNzYWdlIiksIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RSZXF1aXJlZEluaXRpYWxpemVkKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGJ1aWxkZXIuSXNJbml0aWFsaXplZCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFVuaW5pdGlhbGl6ZWRFeGNlcHRpb24oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVGVzdFJlcXVpcmVkLkNyZWF0ZUJ1aWxkZXIoKS5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuRmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IGEsIGIsIGMiLCBlLk1lc3NhZ2UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgQnVpbGRQYXJ0aWFsKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBXZSdyZSBtb3N0bHkgdGVzdGluZyB0aGF0IG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQorICAgICAgICAgICAgVGVzdFJlcXVpcmVkIG1lc3NhZ2UgPSBUZXN0UmVxdWlyZWQuQ3JlYXRlQnVpbGRlcigpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSXNJbml0aWFsaXplZCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIE5lc3RlZFVuaW5pdGlhbGl6ZWRFeGNlcHRpb24oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVGVzdFJlcXVpcmVkRm9yZWlnbi5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbE1lc3NhZ2UoVGVzdFJlcXVpcmVkVW5pbml0aWFsaXplZCkNCisgICAgICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZE1lc3NhZ2UoVGVzdFJlcXVpcmVkVW5pbml0aWFsaXplZCkNCisgICAgICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZE1lc3NhZ2UoVGVzdFJlcXVpcmVkVW5pbml0aWFsaXplZCkNCisgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuRmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoDQorICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogIiArDQorICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxfbWVzc2FnZS5hLCAiICsNCisgICAgICAgICAgICAgICAgICAgICJvcHRpb25hbF9tZXNzYWdlLmIsICIgKw0KKyAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsX21lc3NhZ2UuYywgIiArDQorICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVswXS5hLCAiICsNCisgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmIsICIgKw0KKyAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYywgIiArDQorICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVsxXS5hLCAiICsNCisgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzFdLmIsICIgKw0KKyAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMV0uYyIsDQorICAgICAgICAgICAgICAgICAgICBlLk1lc3NhZ2UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgQnVpbGROZXN0ZWRQYXJ0aWFsKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBXZSdyZSBtb3N0bHkgdGVzdGluZyB0aGF0IG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQorICAgICAgICAgICAgVGVzdFJlcXVpcmVkRm9yZWlnbiBtZXNzYWdlID0NCisgICAgICAgICAgICAgICAgVGVzdFJlcXVpcmVkRm9yZWlnbi5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbE1lc3NhZ2UoVGVzdFJlcXVpcmVkVW5pbml0aWFsaXplZCkNCisgICAgICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZE1lc3NhZ2UoVGVzdFJlcXVpcmVkVW5pbml0aWFsaXplZCkNCisgICAgICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZE1lc3NhZ2UoVGVzdFJlcXVpcmVkVW5pbml0aWFsaXplZCkNCisgICAgICAgICAgICAgICAgICAgIC5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLklzSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZVVuaXRpdGlhbGl6ZWQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVGVzdFJlcXVpcmVkLlBhcnNlRnJvbShCeXRlU3RyaW5nLkVtcHR5KTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiTWVzc2FnZSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYSwgYiwgYyIsIGUuTWVzc2FnZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZU5lc3RlZFVuaXRpdGlhbGl6ZWQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgZGF0YSA9DQorICAgICAgICAgICAgICAgIFRlc3RSZXF1aXJlZEZvcmVpZ24uQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAuU2V0T3B0aW9uYWxNZXNzYWdlKFRlc3RSZXF1aXJlZFVuaW5pdGlhbGl6ZWQpDQorICAgICAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWRNZXNzYWdlKFRlc3RSZXF1aXJlZFVuaW5pdGlhbGl6ZWQpDQorICAgICAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWRNZXNzYWdlKFRlc3RSZXF1aXJlZFVuaW5pdGlhbGl6ZWQpDQorICAgICAgICAgICAgICAgICAgICAuQnVpbGRQYXJ0aWFsKCkuVG9CeXRlU3RyaW5nKCk7DQorDQorICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBUZXN0UmVxdWlyZWRGb3JlaWduLlBhcnNlRnJvbShkYXRhKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgNCisgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAiICsNCisgICAgICAgICAgICAgICAgICAgICJvcHRpb25hbF9tZXNzYWdlLmEsICIgKw0KKyAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsX21lc3NhZ2UuYiwgIiArDQorICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxfbWVzc2FnZS5jLCAiICsNCisgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmEsICIgKw0KKyAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYiwgIiArDQorICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVswXS5jLCAiICsNCisgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzFdLmEsICIgKw0KKyAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMV0uYiwgIiArDQorICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVsxXS5jIiwNCisgICAgICAgICAgICAgICAgICAgIGUuTWVzc2FnZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEeW5hbWljVW5pbml0aWFsaXplZEV4Y2VwdGlvbigpDQorICAgICAgICB7DQorICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBEeW5hbWljTWVzc2FnZS5DcmVhdGVCdWlsZGVyKFRlc3RSZXF1aXJlZC5EZXNjcmlwdG9yKS5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuRmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IGEsIGIsIGMiLCBlLk1lc3NhZ2UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRHluYW1pY0J1aWxkUGFydGlhbCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gV2UncmUgbW9zdGx5IHRlc3RpbmcgdGhhdCBubyBleGNlcHRpb24gaXMgdGhyb3duLg0KKyAgICAgICAgICAgIER5bmFtaWNNZXNzYWdlIG1lc3NhZ2UgPSBEeW5hbWljTWVzc2FnZS5DcmVhdGVCdWlsZGVyKFRlc3RSZXF1aXJlZC5EZXNjcmlwdG9yKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkluaXRpYWxpemVkKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRHluYW1pY1BhcnNlVW5pdGl0aWFsaXplZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBNZXNzYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdFJlcXVpcmVkLkRlc2NyaXB0b3I7DQorICAgICAgICAgICAgICAgIER5bmFtaWNNZXNzYWdlLlBhcnNlRnJvbShkZXNjcmlwdG9yLCBCeXRlU3RyaW5nLkVtcHR5KTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiTWVzc2FnZSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYSwgYiwgYyIsIGUuTWVzc2FnZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQYWNrZWRUeXBlc1dyaXR0ZW5EaXJlY3RseVRvU3RyZWFtKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZSA9IG5ldyBUZXN0UGFja2VkVHlwZXMuQnVpbGRlciB7UGFja2VkSW50MzJMaXN0ID0gezAsIDEsIDJ9fS5CdWlsZCgpOw0KKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorICAgICAgICAgICAgbWVzc2FnZS5Xcml0ZVRvKHN0cmVhbSk7DQorICAgICAgICAgICAgc3RyZWFtLlBvc2l0aW9uID0gMDsNCisgICAgICAgICAgICBUZXN0UGFja2VkVHlwZXMgcmVhZE1lc3NhZ2UgPSBUZXN0UGFja2VkVHlwZXMuUGFyc2VGcm9tKHN0cmVhbSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UsIHJlYWRNZXNzYWdlKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L01lc3NhZ2VVdGlsVGVzdC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvTWVzc2FnZVV0aWxUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMzNkYmIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L01lc3NhZ2VVdGlsVGVzdC5jcwpAQCAtMCwwICsxLDg3IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvczsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIE1lc3NhZ2VVdGlsVGVzdA0KKyAgICB7DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnROdWxsRXhjZXB0aW9uKSldDQorICAgICAgICBwdWJsaWMgdm9pZCBOdWxsVHlwZU5hbWUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE1lc3NhZ2VVdGlsLkdldERlZmF1bHRNZXNzYWdlKChzdHJpbmcpIG51bGwpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldDQorICAgICAgICBwdWJsaWMgdm9pZCBJbnZhbGlkVHlwZU5hbWUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE1lc3NhZ2VVdGlsLkdldERlZmF1bHRNZXNzYWdlKCJpbnZhbGlkdHlwZW5hbWUiKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVmFsaWRUeXBlTmFtZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUoVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbC5HZXREZWZhdWx0TWVzc2FnZSh0eXBlb2YoVGVzdEFsbFR5cGVzKS5Bc3NlbWJseVF1YWxpZmllZE5hbWUpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE51bGxFeGNlcHRpb24pKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIE51bGxUeXBlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBNZXNzYWdlVXRpbC5HZXREZWZhdWx0TWVzc2FnZSgoVHlwZSkgbnVsbCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRFeGNlcHRpb24pKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIE5vbk1lc3NhZ2VUeXBlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBNZXNzYWdlVXRpbC5HZXREZWZhdWx0TWVzc2FnZSh0eXBlb2Yoc3RyaW5nKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFZhbGlkVHlwZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUoVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZSwgTWVzc2FnZVV0aWwuR2V0RGVmYXVsdE1lc3NhZ2UodHlwZW9mKFRlc3RBbGxUeXBlcykpKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L05hbWVIZWxwZXJzVGVzdC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvTmFtZUhlbHBlcnNUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYWIzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L05hbWVIZWxwZXJzVGVzdC5jcwpAQCAtMCwwICsxLDgyIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIFtUZXN0Q2xhc3NdDQorICAgIHB1YmxpYyBjbGFzcyBOYW1lSGVscGVyc1Rlc3QNCisgICAgew0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBVbmRlcnNjb3Jlc1RvUGFzY2FsQ2FzZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGb29CYXIiLCBOYW1lSGVscGVycy5VbmRlcnNjb3Jlc1RvUGFzY2FsQ2FzZSgiRm9vX2JhciIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkZvb0JhciIsIE5hbWVIZWxwZXJzLlVuZGVyc2NvcmVzVG9QYXNjYWxDYXNlKCJmb29fYmFyIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiRm9vMEJhciIsIE5hbWVIZWxwZXJzLlVuZGVyc2NvcmVzVG9QYXNjYWxDYXNlKCJGb28wYmFyIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiRm9vQmFyIiwgTmFtZUhlbHBlcnMuVW5kZXJzY29yZXNUb1Bhc2NhbENhc2UoIkZvb18rX0JhciIpKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkJhciIsIE5hbWVIZWxwZXJzLlVuZGVyc2NvcmVzVG9QYXNjYWxDYXNlKCJfXytiYXIiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJCYXIiLCBOYW1lSGVscGVycy5VbmRlcnNjb3Jlc1RvUGFzY2FsQ2FzZSgiYmFyXyIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIl8wQmFyIiwgTmFtZUhlbHBlcnMuVW5kZXJzY29yZXNUb1Bhc2NhbENhc2UoIl8wYmFyIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiXzFCYXIiLCBOYW1lSGVscGVycy5VbmRlcnNjb3Jlc1RvUGFzY2FsQ2FzZSgiXzFfYmFyIikpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImZvb0JhciIsIE5hbWVIZWxwZXJzLlVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIkZvb19iYXIiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJmb29CYXIiLCBOYW1lSGVscGVycy5VbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJmb29fYmFyIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiZm9vMEJhciIsIE5hbWVIZWxwZXJzLlVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIkZvbzBiYXIiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJmb29CYXIiLCBOYW1lSGVscGVycy5VbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJGb29fK19CYXIiKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJiYXIiLCBOYW1lSGVscGVycy5VbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfXytiYXIiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJiYXIiLCBOYW1lSGVscGVycy5VbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJiYXJfIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiXzBCYXIiLCBOYW1lSGVscGVycy5VbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfMGJhciIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIl8xQmFyIiwgTmFtZUhlbHBlcnMuVW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiXzFfYmFyIikpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBTdHJpcFN1ZmZpeCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRleHQgPSAiRm9vQmFyIjsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShOYW1lSGVscGVycy5TdHJpcFN1ZmZpeChyZWYgdGV4dCwgIkZvbyIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkZvb0JhciIsIHRleHQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoTmFtZUhlbHBlcnMuU3RyaXBTdWZmaXgocmVmIHRleHQsICJCYXIiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGb28iLCB0ZXh0KTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Byb3BlcnRpZXMvQXBwTWFuaWZlc3QueG1sIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Qcm9wZXJ0aWVzL0FwcE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTU1MjMyCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Qcm9wZXJ0aWVzL0FwcE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDYgQEAKK++7vzxEZXBsb3ltZW50IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2NsaWVudC8yMDA3L2RlcGxveW1lbnQiDQorICAgICAgICB4bWxuczp4PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dpbmZ4LzIwMDYveGFtbCINCis+DQorICAgIDxEZXBsb3ltZW50LlBhcnRzPg0KKyAgICA8L0RlcGxveW1lbnQuUGFydHM+DQorPC9EZXBsb3ltZW50Pg0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTVkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsMzUgQEAKK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOw0KK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCisNCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIA0KKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uDQorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5Lg0KKw0KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiUHJvdG9jb2xCdWZmZXJzLlRlc3QiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlByb3RvY29sQnVmZmVycy5UZXN0IildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IO+/vSAgMjAwOCIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0NCisNCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOg0KKy8vDQorLy8gICAgICBNYWpvciBWZXJzaW9uDQorLy8gICAgICBNaW5vciBWZXJzaW9uIA0KKy8vICAgICAgQnVpbGQgTnVtYmVyDQorLy8gICAgICBSZXZpc2lvbg0KKy8vDQorLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMgDQorLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoNCisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMi40LjEuNTU1IildDQorDQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjIuNC4xLjU1NSIpXQ0KKw0KKy8vIFdlIGRvbid0IHJlYWxseSBuZWVkIENMU0NvbXBsaWFuY2UsIGJ1dCBpZiB0aGUgYXNzZW1ibHkgYnVpbGRzIHdpdGggbm8gd2FybmluZ3MsDQorLy8gdGhhdCBtZWFucyB0aGUgZ2VuZXJhdG9yIGlzIG9rYXkuDQorDQorW2Fzc2VtYmx5OiBDTFNDb21wbGlhbnQodHJ1ZSldClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Qcm9wZXJ0aWVzL091dE9mQnJvd3NlclNldHRpbmdzLnhtbCBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvcGVydGllcy9PdXRPZkJyb3dzZXJTZXR0aW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0ZjQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvcGVydGllcy9PdXRPZkJyb3dzZXJTZXR0aW5ncy54bWwKQEAgLTAsMCArMSw3IEBACis8T3V0T2ZCcm93c2VyU2V0dGluZ3MgU2hvcnROYW1lPSJQcm90b2NvbEJ1ZmZlcnMuVGVzdCIgRW5hYmxlR1BVQWNjZWxlcmF0aW9uPSJGYWxzZSIgU2hvd0luc3RhbGxNZW51SXRlbT0iRmFsc2UiPg0KKyAgPE91dE9mQnJvd3NlclNldHRpbmdzLkJsdXJiPlByb3RvY29sQnVmZmVycy5UZXN0PC9PdXRPZkJyb3dzZXJTZXR0aW5ncy5CbHVyYj4NCisgIDxPdXRPZkJyb3dzZXJTZXR0aW5ncy5XaW5kb3dTZXR0aW5ncz4NCisgICAgPFdpbmRvd1NldHRpbmdzIFRpdGxlPSJQcm90b2NvbEJ1ZmZlcnMuVGVzdCIgLz4NCisgIDwvT3V0T2ZCcm93c2VyU2V0dGluZ3MuV2luZG93U2V0dGluZ3M+DQorICA8T3V0T2ZCcm93c2VyU2V0dGluZ3MuSWNvbnMgLz4NCis8L091dE9mQnJvd3NlclNldHRpbmdzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvdG9jb2xCdWZmZXJzLlRlc3QuQ0YyMC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Byb3RvY29sQnVmZmVycy5UZXN0LkNGMjAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYzNlYWYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Byb3RvY29sQnVmZmVycy5UZXN0LkNGMjAuY3Nwcm9qCkBAIC0wLDAgKzEsMTkwIEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q09NUEFDVF9GUkFNRVdPUks8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5DRjIwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8RW52aXJvbm1lbnRQcm9qZWN0VHlwZT5URVNUPC9FbnZpcm9ubWVudFByb2plY3RUeXBlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0PC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYyLjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPns0RDYyOEI1Qi0yRkJDLTRBQTYtOEMxNi0xOTcyNDJBRUI4ODR9O3tGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8UGxhdGZvcm1GYW1pbHlOYW1lPlNtYXJ0cGhvbmU8L1BsYXRmb3JtRmFtaWx5TmFtZT4NCisgICAgPFBsYXRmb3JtSUQ+ZjI3ZGEzMjktMzI2OS00MTkxLTk4ZTAtYzg3ZDNkN2YxZGI5PC9QbGF0Zm9ybUlEPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXENGMjBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxDRjIwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PRklMRVZFUlNJT047Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cQ0YyMFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcQ0YyMFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PRklMRVZFUlNJT047Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibnVuaXQuZnJhbWV3b3JrIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxOVW5pdFxsaWJcbnVuaXQuZnJhbWV3b3JrLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgIT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodC5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE5Vbml0LWNvbmZpZ1xNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jcyI+DQorICAgICAgPExpbms+TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZVN0cmluZ1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW1UZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZE91dHB1dFN0cmVhbVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFBvcHNpY2xlTGlzdFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcQmluYXJ5Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XENvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxEaWN0aW9uYXJ5Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XEpzb25Db21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcVGVzdFJlc291cmNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxUZXh0Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XFhtbENvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UmVzb3VyY2VzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UnBjRm9yTWltZVR5cGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UmVhZGVyRm9yVXJsRW5jb2RlZC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ1NoYXJwT3B0aW9uc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlcHJlY2F0ZWRNZW1iZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1lc3NhZ2VEZXNjcmlwdG9yVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHluYW1pY01lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSXNzdWVzVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVN0cmVhbUl0ZXJhdG9yVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVN0cmVhbVdyaXRlclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlVXRpbFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik5hbWVIZWxwZXJzVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25UZXN0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJldXNhYmxlQnVpbGRlclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcmlhbGl6YWJsZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZpY2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0Q29ybmVyQ2FzZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RNaW1lTWVzc2FnZUZvcm1hdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RDU2hhcnBPcHRpb25zUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEVtYmVkT3B0aW1pemVGb3JQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFbXB0eVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEdlbmVyaWNTZXJ2aWNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEdvb2dsZVNpemVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RHb29nbGVTcGVlZFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RNZXNzYWdlU2V0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0Tm9HZW5lcmljU2VydmljZXNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RPcHRpbWl6ZUZvclByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFJwY0ludGVyb3AuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFJwY0dlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RXcml0ZXJGb3JtYXRKc29uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0V3JpdGVyRm9ybWF0WG1sLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXh0Rm9ybWF0VGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bkZpZWxkU2V0VGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iV2lyZUZvcm1hdFRlc3QuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXFByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLkNGMjAuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57MjMxMzkxQUYtNDQ5Qy00YTM5LTk4NkMtQUQ3RjI3MEY0NzUwfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzLkNGMjAuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnM8L05hbWU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4NCisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+DQorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+DQorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+DQorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+DQorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPg0KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+DQorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+DQorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+DQorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+DQorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4NCisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XGdvb2dsZV9tZXNzYWdlMS5kYXQiIC8+DQorICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcZ29vZ2xlX21lc3NhZ2UyLmRhdCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ29tcGFjdEZyYW1ld29yay5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSI+DQorICAgICAgICA8SG9zdGluZ1Byb2Nlc3MgZGlzYWJsZT0iMSIgLz4NCisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+DQorICAgIDwvVmlzdWFsU3R1ZGlvPg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8U3RhcnRBY3Rpb24+UHJvZ3JhbTwvU3RhcnRBY3Rpb24+DQorICAgIDxTdGFydFByb2dyYW0+JChQcm9qZWN0RGlyKS4uXC4uXGxpYlxOVW5pdFx0b29sc1xudW5pdC1jb25zb2xlLmV4ZTwvU3RhcnRQcm9ncmFtPg0KKyAgICA8U3RhcnRBcmd1bWVudHM+L25vbG9nbyAvbm9zaGFkb3cgL2xhYmVscyAvd2FpdCAkKEFzc2VtYmx5TmFtZSkuZGxsPC9TdGFydEFyZ3VtZW50cz4NCisgICAgPFN0YXJ0V29ya2luZ0RpcmVjdG9yeT4kKFByb2plY3REaXIpJChPdXRwdXRQYXRoKTwvU3RhcnRXb3JraW5nRGlyZWN0b3J5Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Byb3RvY29sQnVmZmVycy5UZXN0LkNGMzUuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC5DRjM1LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzYzNDRlCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC5DRjM1LmNzcHJvagpAQCAtMCwwICsxLDE5MSBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNPTVBBQ1RfRlJBTUVXT1JLPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+Q0YzNTwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPEVudmlyb25tZW50UHJvamVjdFR5cGU+VEVTVDwvRW52aXJvbm1lbnRQcm9qZWN0VHlwZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdDwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57NEQ2MjhCNUItMkZCQy00QUE2LThDMTYtMTk3MjQyQUVCODg0fTt7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFBsYXRmb3JtRmFtaWx5TmFtZT5TbWFydHBob25lPC9QbGF0Zm9ybUZhbWlseU5hbWU+DQorICAgIDxQbGF0Zm9ybUlEPmYyN2RhMzI5LTMyNjktNDE5MS05OGUwLWM4N2QzZDdmMWRiOTwvUGxhdGZvcm1JRD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxDRjM1XERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcQ0YzNVxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT0ZJTEVWRVJTSU9OPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cQ0YzNVxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcQ0YzNVxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PRklMRVZFUlNJT048L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJudW5pdC5mcmFtZXdvcmsiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE5Vbml0XGxpYlxudW5pdC5mcmFtZXdvcmsuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyAhPSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZywgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTlVuaXQtY29uZmlnXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzIj4NCisgICAgICA8TGluaz5NaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlU3RyaW5nVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRJbnB1dFN0cmVhbVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcUG9wc2ljbGVMaXN0VGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxCaW5hcnlDb21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcQ29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XERpY3Rpb25hcnlDb21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcSnNvbkNvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxUZXN0UmVzb3VyY2VzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XFRleHRDb21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcWG1sQ29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJpYWxpemFibGVBdHRyaWJ1dGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RSZXNvdXJjZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RScGNGb3JNaW1lVHlwZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RSZWFkZXJGb3JVcmxFbmNvZGVkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDU2hhcnBPcHRpb25zVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVwcmVjYXRlZE1lbWJlclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcTWVzc2FnZURlc2NyaXB0b3JUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEeW5hbWljTWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkQnVpbGRlclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZE1lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJc3N1ZXNUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlU3RyZWFtSXRlcmF0b3JUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlU3RyZWFtV3JpdGVyVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VVdGlsVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTmFtZUhlbHBlcnNUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVmbGVjdGlvblRlc3Rlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmV1c2FibGVCdWlsZGVyVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VyaWFsaXphYmxlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmljZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RDb3JuZXJDYXNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdE1pbWVNZXNzYWdlRm9ybWF0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdENTaGFycE9wdGlvbnNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RW1iZWRPcHRpbWl6ZUZvclByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEVtcHR5UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0R2VuZXJpY1NlcnZpY2VzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0R29vZ2xlU2l6ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEdvb2dsZVNwZWVkUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdE1lc3NhZ2VTZXRQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3ROb0dlbmVyaWNTZXJ2aWNlc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdE9wdGltaXplRm9yUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0UnBjSW50ZXJvcC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UnBjR2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0VXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFdyaXRlckZvcm1hdEpzb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RXcml0ZXJGb3JtYXRYbWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRGb3JtYXRUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmtub3duRmllbGRTZXRUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJXaXJlRm9ybWF0VGVzdC5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uQ0YzNS5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0PnsyMzEzOTFBRi00NDlDLTRhMzktOTg2Qy1BRDdGMjcwRjQ3NTB9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuQ0YzNS5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPg0KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4NCisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4NCisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPg0KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4NCisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+DQorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4NCisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPg0KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4NCisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4NCisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPg0KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcZ29vZ2xlX21lc3NhZ2UxLmRhdCIgLz4NCisgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxnb29nbGVfbWVzc2FnZTIuZGF0IiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5Db21wYWN0RnJhbWV3b3JrLkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8VmlzdWFsU3R1ZGlvPg0KKyAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9IntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9Ij4NCisgICAgICAgIDxIb3N0aW5nUHJvY2VzcyBkaXNhYmxlPSIxIiAvPg0KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4NCisgICAgPC9WaXN1YWxTdHVkaW8+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxTdGFydEFjdGlvbj5Qcm9ncmFtPC9TdGFydEFjdGlvbj4NCisgICAgPFN0YXJ0UHJvZ3JhbT4kKFByb2plY3REaXIpLi5cLi5cbGliXE5Vbml0XHRvb2xzXG51bml0LWNvbnNvbGUuZXhlPC9TdGFydFByb2dyYW0+DQorICAgIDxTdGFydEFyZ3VtZW50cz4vbm9sb2dvIC9ub3NoYWRvdyAvbGFiZWxzIC93YWl0ICQoQXNzZW1ibHlOYW1lKS5kbGw8L1N0YXJ0QXJndW1lbnRzPg0KKyAgICA8U3RhcnRXb3JraW5nRGlyZWN0b3J5PiQoUHJvamVjdERpcikkKE91dHB1dFBhdGgpPC9TdGFydFdvcmtpbmdEaXJlY3Rvcnk+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvdG9jb2xCdWZmZXJzLlRlc3QuTkVUMjAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC5ORVQyMC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA0NTNmYQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvdG9jb2xCdWZmZXJzLlRlc3QuTkVUMjAuY3Nwcm9qCkBAIC0wLDAgKzEsMTc4IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q0xJRU5UUFJPRklMRTwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPk5FVDIwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8RW52aXJvbm1lbnRQcm9qZWN0VHlwZT5URVNUPC9FbnZpcm9ubWVudFByb2plY3RUeXBlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0PC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYyLjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMjBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQyMFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMjBcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDIwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yayI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTlVuaXRcbGliXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknICE9ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodCwgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxOVW5pdC1jb25maWdcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3MiPg0KKyAgICAgIDxMaW5rPk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVTdHJpbmdUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZElucHV0U3RyZWFtVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW1UZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xQb3BzaWNsZUxpc3RUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XEJpbmFyeUNvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxDb21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcRGljdGlvbmFyeUNvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxKc29uQ29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XFRlc3RSZXNvdXJjZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcVGV4dENvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxYbWxDb21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFJlc291cmNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFJwY0Zvck1pbWVUeXBlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFJlYWRlckZvclVybEVuY29kZWQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNTaGFycE9wdGlvbnNUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXByZWNhdGVkTWVtYmVyVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xNZXNzYWdlRGVzY3JpcHRvclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkR5bmFtaWNNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRCdWlsZGVyVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkTWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Iklzc3Vlc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1JdGVyYXRvclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1Xcml0ZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVV0aWxUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJOYW1lSGVscGVyc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWZsZWN0aW9uVGVzdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZXVzYWJsZUJ1aWxkZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJpYWxpemFibGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2aWNlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdENvcm5lckNhc2VzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0TWltZU1lc3NhZ2VGb3JtYXRzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0Q1NoYXJwT3B0aW9uc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFbWJlZE9wdGltaXplRm9yUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RW1wdHlQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNJc3N1ZXNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RHZW5lcmljU2VydmljZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RHb29nbGVTaXplUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0R29vZ2xlU3BlZWRQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0TWVzc2FnZVNldFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdE5vR2VuZXJpY1NlcnZpY2VzUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0T3B0aW1pemVGb3JQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RScGNJbnRlcm9wLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RScGNHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RVdGlsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0V3JpdGVyRm9ybWF0SnNvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFdyaXRlckZvcm1hdFhtbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGV4dEZvcm1hdFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlVua25vd25GaWVsZFNldFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IldpcmVGb3JtYXRUZXN0LmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5ORVQyMC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0PnsyMzEzOTFBRi00NDlDLTRhMzktOTg2Qy1BRDdGMjcwRjQ3NTB9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuTkVUMjAuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnM8L05hbWU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4NCisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+DQorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+DQorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+DQorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+DQorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPg0KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+DQorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+DQorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+DQorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+DQorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4NCisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XGdvb2dsZV9tZXNzYWdlMS5kYXQiIC8+DQorICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcZ29vZ2xlX21lc3NhZ2UyLmRhdCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8U3RhcnRBY3Rpb24+UHJvZ3JhbTwvU3RhcnRBY3Rpb24+DQorICAgIDxTdGFydFByb2dyYW0+JChQcm9qZWN0RGlyKS4uXC4uXGxpYlxOVW5pdFx0b29sc1xudW5pdC1jb25zb2xlLmV4ZTwvU3RhcnRQcm9ncmFtPg0KKyAgICA8U3RhcnRBcmd1bWVudHM+L25vbG9nbyAvbm9zaGFkb3cgL2xhYmVscyAvd2FpdCAkKEFzc2VtYmx5TmFtZSkuZGxsPC9TdGFydEFyZ3VtZW50cz4NCisgICAgPFN0YXJ0V29ya2luZ0RpcmVjdG9yeT4kKFByb2plY3REaXIpJChPdXRwdXRQYXRoKTwvU3RhcnRXb3JraW5nRGlyZWN0b3J5Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Byb3RvY29sQnVmZmVycy5UZXN0Lk5FVDM1LmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvdG9jb2xCdWZmZXJzLlRlc3QuTkVUMzUuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjMwYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Byb3RvY29sQnVmZmVycy5UZXN0Lk5FVDM1LmNzcHJvagpAQCAtMCwwICsxLDE3OSBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQzNTwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPEVudmlyb25tZW50UHJvamVjdFR5cGU+VEVTVDwvRW52aXJvbm1lbnRQcm9qZWN0VHlwZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdDwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMzVcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDM1XFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibnVuaXQuZnJhbWV3b3JrIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxOVW5pdFxsaWJcbnVuaXQuZnJhbWV3b3JrLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgIT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodC5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE5Vbml0LWNvbmZpZ1xNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jcyI+DQorICAgICAgPExpbms+TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZVN0cmluZ1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW1UZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZE91dHB1dFN0cmVhbVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFBvcHNpY2xlTGlzdFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcQmluYXJ5Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XENvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxEaWN0aW9uYXJ5Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XEpzb25Db21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcVGVzdFJlc291cmNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxUZXh0Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XFhtbENvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UmVzb3VyY2VzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UnBjRm9yTWltZVR5cGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UmVhZGVyRm9yVXJsRW5jb2RlZC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ1NoYXJwT3B0aW9uc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlcHJlY2F0ZWRNZW1iZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1lc3NhZ2VEZXNjcmlwdG9yVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHluYW1pY01lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSXNzdWVzVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVN0cmVhbUl0ZXJhdG9yVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVN0cmVhbVdyaXRlclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlVXRpbFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik5hbWVIZWxwZXJzVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25UZXN0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJldXNhYmxlQnVpbGRlclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcmlhbGl6YWJsZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZpY2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0Q29ybmVyQ2FzZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RNaW1lTWVzc2FnZUZvcm1hdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RDU2hhcnBPcHRpb25zUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEVtYmVkT3B0aW1pemVGb3JQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFbXB0eVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEdlbmVyaWNTZXJ2aWNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEdvb2dsZVNpemVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RHb29nbGVTcGVlZFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RNZXNzYWdlU2V0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0Tm9HZW5lcmljU2VydmljZXNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RPcHRpbWl6ZUZvclByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFJwY0ludGVyb3AuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFJwY0dlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RXcml0ZXJGb3JtYXRKc29uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0V3JpdGVyRm9ybWF0WG1sLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXh0Rm9ybWF0VGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bkZpZWxkU2V0VGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iV2lyZUZvcm1hdFRlc3QuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXFByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLk5FVDM1LmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezIzMTM5MUFGLTQ0OUMtNGEzOS05ODZDLUFEN0YyNzBGNDc1MH08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb248L05hbWU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5ORVQzNS5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPg0KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4NCisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4NCisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPg0KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4NCisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+DQorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4NCisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPg0KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4NCisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4NCisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPg0KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcZ29vZ2xlX21lc3NhZ2UxLmRhdCIgLz4NCisgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxnb29nbGVfbWVzc2FnZTIuZGF0IiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxTdGFydEFjdGlvbj5Qcm9ncmFtPC9TdGFydEFjdGlvbj4NCisgICAgPFN0YXJ0UHJvZ3JhbT4kKFByb2plY3REaXIpLi5cLi5cbGliXE5Vbml0XHRvb2xzXG51bml0LWNvbnNvbGUuZXhlPC9TdGFydFByb2dyYW0+DQorICAgIDxTdGFydEFyZ3VtZW50cz4vbm9sb2dvIC9ub3NoYWRvdyAvbGFiZWxzIC93YWl0ICQoQXNzZW1ibHlOYW1lKS5kbGw8L1N0YXJ0QXJndW1lbnRzPg0KKyAgICA8U3RhcnRXb3JraW5nRGlyZWN0b3J5PiQoUHJvamVjdERpcikkKE91dHB1dFBhdGgpPC9TdGFydFdvcmtpbmdEaXJlY3Rvcnk+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvdG9jb2xCdWZmZXJzLlRlc3QuTkVUNDAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC5ORVQ0MC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlYTcyMQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvdG9jb2xCdWZmZXJzLlRlc3QuTkVUNDAuY3Nwcm9qCkBAIC0wLDAgKzEsMTc5IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q0xJRU5UUFJPRklMRTwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPk5FVDQwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8RW52aXJvbm1lbnRQcm9qZWN0VHlwZT5URVNUPC9FbnZpcm9ubWVudFByb2plY3RUeXBlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0PC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUNDBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQ0MFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQ0MFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUNDBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJudW5pdC5mcmFtZXdvcmsiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE5Vbml0XGxpYlxudW5pdC5mcmFtZXdvcmsuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyAhPSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZywgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTlVuaXQtY29uZmlnXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzIj4NCisgICAgICA8TGluaz5NaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlU3RyaW5nVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRJbnB1dFN0cmVhbVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcUG9wc2ljbGVMaXN0VGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxCaW5hcnlDb21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcQ29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XERpY3Rpb25hcnlDb21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcSnNvbkNvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxUZXN0UmVzb3VyY2VzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XFRleHRDb21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcWG1sQ29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJpYWxpemFibGVBdHRyaWJ1dGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RSZXNvdXJjZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RScGNGb3JNaW1lVHlwZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RSZWFkZXJGb3JVcmxFbmNvZGVkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDU2hhcnBPcHRpb25zVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVwcmVjYXRlZE1lbWJlclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcTWVzc2FnZURlc2NyaXB0b3JUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEeW5hbWljTWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkQnVpbGRlclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZE1lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJc3N1ZXNUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlU3RyZWFtSXRlcmF0b3JUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlU3RyZWFtV3JpdGVyVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VVdGlsVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTmFtZUhlbHBlcnNUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVmbGVjdGlvblRlc3Rlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmV1c2FibGVCdWlsZGVyVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VyaWFsaXphYmxlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmljZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RDb3JuZXJDYXNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdE1pbWVNZXNzYWdlRm9ybWF0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdENTaGFycE9wdGlvbnNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RW1iZWRPcHRpbWl6ZUZvclByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEVtcHR5UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0R2VuZXJpY1NlcnZpY2VzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0R29vZ2xlU2l6ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEdvb2dsZVNwZWVkUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdE1lc3NhZ2VTZXRQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3ROb0dlbmVyaWNTZXJ2aWNlc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdE9wdGltaXplRm9yUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0UnBjSW50ZXJvcC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UnBjR2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0VXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFdyaXRlckZvcm1hdEpzb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RXcml0ZXJGb3JtYXRYbWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRGb3JtYXRUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmtub3duRmllbGRTZXRUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJXaXJlRm9ybWF0VGVzdC5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uTkVUNDAuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57MjMxMzkxQUYtNDQ5Qy00YTM5LTk4NkMtQUQ3RjI3MEY0NzUwfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzLk5FVDQwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+DQorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+DQorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPg0KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPg0KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPg0KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4NCisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPg0KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPg0KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPg0KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+DQorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxnb29nbGVfbWVzc2FnZTEuZGF0IiAvPg0KKyAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XGdvb2dsZV9tZXNzYWdlMi5kYXQiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFN0YXJ0QWN0aW9uPlByb2dyYW08L1N0YXJ0QWN0aW9uPg0KKyAgICA8U3RhcnRQcm9ncmFtPiQoUHJvamVjdERpcikuLlwuLlxsaWJcTlVuaXRcdG9vbHNcbnVuaXQtY29uc29sZS5leGU8L1N0YXJ0UHJvZ3JhbT4NCisgICAgPFN0YXJ0QXJndW1lbnRzPi9ub2xvZ28gL25vc2hhZG93IC9sYWJlbHMgL3dhaXQgJChBc3NlbWJseU5hbWUpLmRsbDwvU3RhcnRBcmd1bWVudHM+DQorICAgIDxTdGFydFdvcmtpbmdEaXJlY3Rvcnk+JChQcm9qZWN0RGlyKSQoT3V0cHV0UGF0aCk8L1N0YXJ0V29ya2luZ0RpcmVjdG9yeT4NCisgIDwvUHJvcGVydHlHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC5QTDQwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvdG9jb2xCdWZmZXJzLlRlc3QuUEw0MC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4Y2Y5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvdG9jb2xCdWZmZXJzLlRlc3QuUEw0MC5jc3Byb2oKQEAgLTAsMCArMSwyMTMgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiIHhtbG5zOmNzPSJ1cm46c2NoZW1hcy1jc2hhcnAtcHJvamVjdDp0ZW1wbGF0ZSI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPlBPUlRBQkxFX0xJQlJBUlk8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5QTDQwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8RW52aXJvbm1lbnRQcm9qZWN0VHlwZT5URVNUPC9FbnZpcm9ubWVudFByb2plY3RUeXBlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0PC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbj4xMC4wPC9NaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbj4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+e0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn07e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlIC8+DQorICAgIDxWYWxpZGF0ZVhhbWw+ZmFsc2U8L1ZhbGlkYXRlWGFtbD4NCisgICAgPFRocm93RXJyb3JzSW5WYWxpZGF0aW9uPmZhbHNlPC9UaHJvd0Vycm9yc0luVmFsaWRhdGlvbj4NCisgICAgPFNpbHZlcmxpZ2h0QXBwbGljYXRpb24+dHJ1ZTwvU2lsdmVybGlnaHRBcHBsaWNhdGlvbj4NCisgICAgPFhhcE91dHB1dHM+dHJ1ZTwvWGFwT3V0cHV0cz4NCisgICAgPEdlbmVyYXRlU2lsdmVybGlnaHRNYW5pZmVzdD50cnVlPC9HZW5lcmF0ZVNpbHZlcmxpZ2h0TWFuaWZlc3Q+DQorICAgIDxYYXBGaWxlbmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3QueGFwPC9YYXBGaWxlbmFtZT4NCisgICAgPFNpbHZlcmxpZ2h0TWFuaWZlc3RUZW1wbGF0ZT5Qcm9wZXJ0aWVzXEFwcE1hbmlmZXN0LnhtbDwvU2lsdmVybGlnaHRNYW5pZmVzdFRlbXBsYXRlPg0KKyAgICA8U2lsdmVybGlnaHRBcHBFbnRyeT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLkFwcDwvU2lsdmVybGlnaHRBcHBFbnRyeT4NCisgICAgPFRlc3RQYWdlRmlsZU5hbWU+VGVzdFBhZ2UuaHRtbDwvVGVzdFBhZ2VGaWxlTmFtZT4NCisgICAgPENyZWF0ZVRlc3RQYWdlPnRydWU8L0NyZWF0ZVRlc3RQYWdlPg0KKyAgICA8U2lsdmVybGlnaHRWZXJzaW9uPnY0LjA8L1NpbHZlcmxpZ2h0VmVyc2lvbj4NCisgICAgPE91dE9mQnJvd3NlclNldHRpbmdzRmlsZT5Qcm9wZXJ0aWVzXE91dE9mQnJvd3NlclNldHRpbmdzLnhtbDwvT3V0T2ZCcm93c2VyU2V0dGluZ3NGaWxlPg0KKyAgICA8RW5hYmxlT3V0T2ZCcm93c2VyPnRydWU8L0VuYWJsZU91dE9mQnJvd3Nlcj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxQTDQwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcUEw0MFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cUEw0MFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcUEw0MFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldpbmRvd3MiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldpbmRvd3MuQnJvd3NlciIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yayI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTlVuaXRcbGliXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknICE9ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodCwgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxOVW5pdC1jb25maWdcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3MiPg0KKyAgICAgIDxMaW5rPk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVTdHJpbmdUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZElucHV0U3RyZWFtVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW1UZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xQb3BzaWNsZUxpc3RUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XEJpbmFyeUNvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxDb21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcRGljdGlvbmFyeUNvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxKc29uQ29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XFRlc3RSZXNvdXJjZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcVGV4dENvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxYbWxDb21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFJlc291cmNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFJwY0Zvck1pbWVUeXBlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFJlYWRlckZvclVybEVuY29kZWQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNTaGFycE9wdGlvbnNUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXByZWNhdGVkTWVtYmVyVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xNZXNzYWdlRGVzY3JpcHRvclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkR5bmFtaWNNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRCdWlsZGVyVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkTWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Iklzc3Vlc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1JdGVyYXRvclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1Xcml0ZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVV0aWxUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJOYW1lSGVscGVyc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWZsZWN0aW9uVGVzdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZXVzYWJsZUJ1aWxkZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJpYWxpemFibGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2aWNlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdENvcm5lckNhc2VzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0TWltZU1lc3NhZ2VGb3JtYXRzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0Q1NoYXJwT3B0aW9uc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFbWJlZE9wdGltaXplRm9yUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RW1wdHlQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNJc3N1ZXNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RHZW5lcmljU2VydmljZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RHb29nbGVTaXplUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0R29vZ2xlU3BlZWRQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0TWVzc2FnZVNldFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdE5vR2VuZXJpY1NlcnZpY2VzUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0T3B0aW1pemVGb3JQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RScGNJbnRlcm9wLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RScGNHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RVdGlsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0V3JpdGVyRm9ybWF0SnNvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFdyaXRlckZvcm1hdFhtbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGV4dEZvcm1hdFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlVua25vd25GaWVsZFNldFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IldpcmVGb3JtYXRUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBcHAueGFtbC5jcyI+DQorICAgICAgPERlcGVuZGVudFVwb24+QXBwLnhhbWw8L0RlcGVuZGVudFVwb24+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iUHJvcGVydGllc1xBcHBNYW5pZmVzdC54bWwiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9IlByb3BlcnRpZXNcT3V0T2ZCcm93c2VyU2V0dGluZ3MueG1sIiAvPg0KKyAgICA8QXBwbGljYXRpb25EZWZpbml0aW9uIEluY2x1ZGU9IkFwcC54YW1sIj4NCisgICAgICA8R2VuZXJhdG9yPk1TQnVpbGQ6Q29tcGlsZTwvR2VuZXJhdG9yPg0KKyAgICAgIDxTdWJUeXBlPkRlc2lnbmVyPC9TdWJUeXBlPg0KKyAgICA8L0FwcGxpY2F0aW9uRGVmaW5pdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uUEw0MC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0PnsyMzEzOTFBRi00NDlDLTRhMzktOTg2Qy1BRDdGMjcwRjQ3NTB9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuUEw0MC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPg0KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4NCisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4NCisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPg0KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4NCisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+DQorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4NCisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPg0KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4NCisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4NCisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPg0KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcZ29vZ2xlX21lc3NhZ2UxLmRhdCIgLz4NCisgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxnb29nbGVfbWVzc2FnZTIuZGF0IiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoMzIpXE1pY3Jvc29mdFxTaWx2ZXJsaWdodFwkKFNpbHZlcmxpZ2h0VmVyc2lvbilcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8VmlzdWFsU3R1ZGlvPg0KKyAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9IntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9Ij4NCisgICAgICAgIDxTaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzIC8+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFN0YXJ0QWN0aW9uPlByb2dyYW08L1N0YXJ0QWN0aW9uPg0KKyAgICA8U3RhcnRQcm9ncmFtPiQoUHJvamVjdERpcikuLlwuLlxsaWJcTlVuaXRcdG9vbHNcbnVuaXQtY29uc29sZS5leGU8L1N0YXJ0UHJvZ3JhbT4NCisgICAgPFN0YXJ0QXJndW1lbnRzPi9ub2xvZ28gL25vc2hhZG93IC9sYWJlbHMgL3dhaXQgJChBc3NlbWJseU5hbWUpLmRsbDwvU3RhcnRBcmd1bWVudHM+DQorICAgIDxTdGFydFdvcmtpbmdEaXJlY3Rvcnk+JChQcm9qZWN0RGlyKSQoT3V0cHV0UGF0aCk8L1N0YXJ0V29ya2luZ0RpcmVjdG9yeT4NCisgIDwvUHJvcGVydHlHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC5TTDIwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvdG9jb2xCdWZmZXJzLlRlc3QuU0wyMC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0ZmEyNQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvdG9jb2xCdWZmZXJzLlRlc3QuU0wyMC5jc3Byb2oKQEAgLTAsMCArMSwyMTQgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiIHhtbG5zOmNzPSJ1cm46c2NoZW1hcy1jc2hhcnAtcHJvamVjdDp0ZW1wbGF0ZSI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPlNJTFZFUkxJR0hUPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+U0wyMDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPEVudmlyb25tZW50UHJvamVjdFR5cGU+VEVTVDwvRW52aXJvbm1lbnRQcm9qZWN0VHlwZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdDwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52Mi4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfTt7ZmFlMDRlYzAtMzAxZi0xMWQzLWJmNGItMDBjMDRmNzllZmJjfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFNpbHZlcmxpZ2h0QXBwbGljYXRpb24+dHJ1ZTwvU2lsdmVybGlnaHRBcHBsaWNhdGlvbj4NCisgICAgPFZhbGlkYXRlWGFtbD5mYWxzZTwvVmFsaWRhdGVYYW1sPg0KKyAgICA8VGhyb3dFcnJvcnNJblZhbGlkYXRpb24+ZmFsc2U8L1Rocm93RXJyb3JzSW5WYWxpZGF0aW9uPg0KKyAgICA8WGFwT3V0cHV0cz50cnVlPC9YYXBPdXRwdXRzPg0KKyAgICA8R2VuZXJhdGVTaWx2ZXJsaWdodE1hbmlmZXN0PnRydWU8L0dlbmVyYXRlU2lsdmVybGlnaHRNYW5pZmVzdD4NCisgICAgPFhhcEZpbGVuYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdC54YXA8L1hhcEZpbGVuYW1lPg0KKyAgICA8U2lsdmVybGlnaHRNYW5pZmVzdFRlbXBsYXRlPlByb3BlcnRpZXNcQXBwTWFuaWZlc3QueG1sPC9TaWx2ZXJsaWdodE1hbmlmZXN0VGVtcGxhdGU+DQorICAgIDxTaWx2ZXJsaWdodEFwcEVudHJ5Pkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQXBwPC9TaWx2ZXJsaWdodEFwcEVudHJ5Pg0KKyAgICA8VGVzdFBhZ2VGaWxlTmFtZT5UZXN0UGFnZS5odG1sPC9UZXN0UGFnZUZpbGVOYW1lPg0KKyAgICA8Q3JlYXRlVGVzdFBhZ2U+dHJ1ZTwvQ3JlYXRlVGVzdFBhZ2U+DQorICAgIDxTaWx2ZXJsaWdodFZlcnNpb24+djIuMDwvU2lsdmVybGlnaHRWZXJzaW9uPg0KKyAgICA8T3V0T2ZCcm93c2VyU2V0dGluZ3NGaWxlPlByb3BlcnRpZXNcT3V0T2ZCcm93c2VyU2V0dGluZ3MueG1sPC9PdXRPZkJyb3dzZXJTZXR0aW5nc0ZpbGU+DQorICAgIDxFbmFibGVPdXRPZkJyb3dzZXI+dHJ1ZTwvRW5hYmxlT3V0T2ZCcm93c2VyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFNMMjBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDIwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDIwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDIwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUO05PRVhURU5TSU9OUzwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2luZG93cyIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2luZG93cy5Ccm93c2VyIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibnVuaXQuZnJhbWV3b3JrIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxOVW5pdFxsaWJcbnVuaXQuZnJhbWV3b3JrLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgIT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodC5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE5Vbml0LWNvbmZpZ1xNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jcyI+DQorICAgICAgPExpbms+TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZVN0cmluZ1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW1UZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZE91dHB1dFN0cmVhbVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFBvcHNpY2xlTGlzdFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcQmluYXJ5Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XENvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxEaWN0aW9uYXJ5Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XEpzb25Db21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcVGVzdFJlc291cmNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxUZXh0Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XFhtbENvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UmVzb3VyY2VzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UnBjRm9yTWltZVR5cGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UmVhZGVyRm9yVXJsRW5jb2RlZC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ1NoYXJwT3B0aW9uc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlcHJlY2F0ZWRNZW1iZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1lc3NhZ2VEZXNjcmlwdG9yVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHluYW1pY01lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSXNzdWVzVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVN0cmVhbUl0ZXJhdG9yVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVN0cmVhbVdyaXRlclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlVXRpbFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik5hbWVIZWxwZXJzVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25UZXN0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJldXNhYmxlQnVpbGRlclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcmlhbGl6YWJsZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZpY2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0Q29ybmVyQ2FzZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RNaW1lTWVzc2FnZUZvcm1hdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RDU2hhcnBPcHRpb25zUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEVtYmVkT3B0aW1pemVGb3JQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFbXB0eVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEdlbmVyaWNTZXJ2aWNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEdvb2dsZVNpemVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RHb29nbGVTcGVlZFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RNZXNzYWdlU2V0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0Tm9HZW5lcmljU2VydmljZXNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RPcHRpbWl6ZUZvclByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFJwY0ludGVyb3AuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFJwY0dlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RXcml0ZXJGb3JtYXRKc29uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0V3JpdGVyRm9ybWF0WG1sLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXh0Rm9ybWF0VGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bkZpZWxkU2V0VGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iV2lyZUZvcm1hdFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFwcC54YW1sLmNzIj4NCisgICAgICA8RGVwZW5kZW50VXBvbj5BcHAueGFtbDwvRGVwZW5kZW50VXBvbj4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFwcE1hbmlmZXN0LnhtbCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iUHJvcGVydGllc1xPdXRPZkJyb3dzZXJTZXR0aW5ncy54bWwiIC8+DQorICAgIDxBcHBsaWNhdGlvbkRlZmluaXRpb24gSW5jbHVkZT0iQXBwLnhhbWwiPg0KKyAgICAgIDxHZW5lcmF0b3I+TVNCdWlsZDpDb21waWxlPC9HZW5lcmF0b3I+DQorICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+DQorICAgIDwvQXBwbGljYXRpb25EZWZpbml0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5TTDIwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezIzMTM5MUFGLTQ0OUMtNGEzOS05ODZDLUFEN0YyNzBGNDc1MH08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb248L05hbWU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5TTDIwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+DQorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+DQorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPg0KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPg0KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPg0KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4NCisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPg0KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPg0KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPg0KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+DQorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxnb29nbGVfbWVzc2FnZTEuZGF0IiAvPg0KKyAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XGdvb2dsZV9tZXNzYWdlMi5kYXQiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0XHYyLjBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8VmlzdWFsU3R1ZGlvPg0KKyAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9IntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9Ij4NCisgICAgICAgIDxTaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgICAgICA8U3RhcnRBY3Rpb24+T2ZmbGluZUFwcGxpY2F0aW9uPC9TdGFydEFjdGlvbj4NCisgICAgICAgIDwvU2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+DQorICAgIDwvVmlzdWFsU3R1ZGlvPg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8U3RhcnRBY3Rpb24+UHJvZ3JhbTwvU3RhcnRBY3Rpb24+DQorICAgIDxTdGFydFByb2dyYW0+JChQcm9qZWN0RGlyKS4uXC4uXGxpYlxOVW5pdFx0b29sc1xudW5pdC1jb25zb2xlLmV4ZTwvU3RhcnRQcm9ncmFtPg0KKyAgICA8U3RhcnRBcmd1bWVudHM+L25vbG9nbyAvbm9zaGFkb3cgL2xhYmVscyAvd2FpdCAkKEFzc2VtYmx5TmFtZSkuZGxsPC9TdGFydEFyZ3VtZW50cz4NCisgICAgPFN0YXJ0V29ya2luZ0RpcmVjdG9yeT4kKFByb2plY3REaXIpJChPdXRwdXRQYXRoKTwvU3RhcnRXb3JraW5nRGlyZWN0b3J5Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Byb3RvY29sQnVmZmVycy5UZXN0LlNMMzAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC5TTDMwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmY2YjFhCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC5TTDMwLmNzcHJvagpAQCAtMCwwICsxLDIxNSBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyIgeG1sbnM6Y3M9InVybjpzY2hlbWFzLWNzaGFycC1wcm9qZWN0OnRlbXBsYXRlIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+U0lMVkVSTElHSFQ8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5TTDMwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8RW52aXJvbm1lbnRQcm9qZWN0VHlwZT5URVNUPC9FbnZpcm9ubWVudFByb2plY3RUeXBlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0PC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9O3tmYWUwNGVjMC0zMDFmLTExZDMtYmY0Yi0wMGMwNGY3OWVmYmN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8U2lsdmVybGlnaHRBcHBsaWNhdGlvbj50cnVlPC9TaWx2ZXJsaWdodEFwcGxpY2F0aW9uPg0KKyAgICA8VmFsaWRhdGVYYW1sPmZhbHNlPC9WYWxpZGF0ZVhhbWw+DQorICAgIDxUaHJvd0Vycm9yc0luVmFsaWRhdGlvbj5mYWxzZTwvVGhyb3dFcnJvcnNJblZhbGlkYXRpb24+DQorICAgIDxYYXBPdXRwdXRzPnRydWU8L1hhcE91dHB1dHM+DQorICAgIDxHZW5lcmF0ZVNpbHZlcmxpZ2h0TWFuaWZlc3Q+dHJ1ZTwvR2VuZXJhdGVTaWx2ZXJsaWdodE1hbmlmZXN0Pg0KKyAgICA8WGFwRmlsZW5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0LnhhcDwvWGFwRmlsZW5hbWU+DQorICAgIDxTaWx2ZXJsaWdodE1hbmlmZXN0VGVtcGxhdGU+UHJvcGVydGllc1xBcHBNYW5pZmVzdC54bWw8L1NpbHZlcmxpZ2h0TWFuaWZlc3RUZW1wbGF0ZT4NCisgICAgPFNpbHZlcmxpZ2h0QXBwRW50cnk+R29vZ2xlLlByb3RvY29sQnVmZmVycy5BcHA8L1NpbHZlcmxpZ2h0QXBwRW50cnk+DQorICAgIDxUZXN0UGFnZUZpbGVOYW1lPlRlc3RQYWdlLmh0bWw8L1Rlc3RQYWdlRmlsZU5hbWU+DQorICAgIDxDcmVhdGVUZXN0UGFnZT50cnVlPC9DcmVhdGVUZXN0UGFnZT4NCisgICAgPFNpbHZlcmxpZ2h0VmVyc2lvbj52My41PC9TaWx2ZXJsaWdodFZlcnNpb24+DQorICAgIDxPdXRPZkJyb3dzZXJTZXR0aW5nc0ZpbGU+UHJvcGVydGllc1xPdXRPZkJyb3dzZXJTZXR0aW5ncy54bWw8L091dE9mQnJvd3NlclNldHRpbmdzRmlsZT4NCisgICAgPEVuYWJsZU91dE9mQnJvd3Nlcj50cnVlPC9FbmFibGVPdXRPZkJyb3dzZXI+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cU0wzMFxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXFNMMzBcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cU0wzMFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0wzMFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2luZG93cyIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2luZG93cy5Ccm93c2VyIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibnVuaXQuZnJhbWV3b3JrIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxOVW5pdFxsaWJcbnVuaXQuZnJhbWV3b3JrLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgIT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodC5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE5Vbml0LWNvbmZpZ1xNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jcyI+DQorICAgICAgPExpbms+TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZVN0cmluZ1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW1UZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZE91dHB1dFN0cmVhbVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFBvcHNpY2xlTGlzdFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcQmluYXJ5Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XENvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxEaWN0aW9uYXJ5Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XEpzb25Db21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcVGVzdFJlc291cmNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxUZXh0Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XFhtbENvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UmVzb3VyY2VzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UnBjRm9yTWltZVR5cGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UmVhZGVyRm9yVXJsRW5jb2RlZC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ1NoYXJwT3B0aW9uc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlcHJlY2F0ZWRNZW1iZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1lc3NhZ2VEZXNjcmlwdG9yVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHluYW1pY01lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSXNzdWVzVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVN0cmVhbUl0ZXJhdG9yVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVN0cmVhbVdyaXRlclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlVXRpbFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik5hbWVIZWxwZXJzVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25UZXN0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJldXNhYmxlQnVpbGRlclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcmlhbGl6YWJsZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZpY2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0Q29ybmVyQ2FzZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RNaW1lTWVzc2FnZUZvcm1hdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RDU2hhcnBPcHRpb25zUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEVtYmVkT3B0aW1pemVGb3JQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFbXB0eVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEdlbmVyaWNTZXJ2aWNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEdvb2dsZVNpemVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RHb29nbGVTcGVlZFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RNZXNzYWdlU2V0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0Tm9HZW5lcmljU2VydmljZXNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RPcHRpbWl6ZUZvclByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFJwY0ludGVyb3AuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFJwY0dlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RXcml0ZXJGb3JtYXRKc29uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0V3JpdGVyRm9ybWF0WG1sLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXh0Rm9ybWF0VGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bkZpZWxkU2V0VGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iV2lyZUZvcm1hdFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFwcC54YW1sLmNzIj4NCisgICAgICA8RGVwZW5kZW50VXBvbj5BcHAueGFtbDwvRGVwZW5kZW50VXBvbj4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFwcE1hbmlmZXN0LnhtbCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iUHJvcGVydGllc1xPdXRPZkJyb3dzZXJTZXR0aW5ncy54bWwiIC8+DQorICAgIDxBcHBsaWNhdGlvbkRlZmluaXRpb24gSW5jbHVkZT0iQXBwLnhhbWwiPg0KKyAgICAgIDxHZW5lcmF0b3I+TVNCdWlsZDpDb21waWxlPC9HZW5lcmF0b3I+DQorICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+DQorICAgIDwvQXBwbGljYXRpb25EZWZpbml0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5TTDMwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezIzMTM5MUFGLTQ0OUMtNGEzOS05ODZDLUFEN0YyNzBGNDc1MH08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb248L05hbWU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5TTDMwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+DQorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+DQorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPg0KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPg0KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPg0KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4NCisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPg0KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPg0KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPg0KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+DQorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxnb29nbGVfbWVzc2FnZTEuZGF0IiAvPg0KKyAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XGdvb2dsZV9tZXNzYWdlMi5kYXQiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0XHYzLjBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8VmlzdWFsU3R1ZGlvPg0KKyAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9IntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9Ij4NCisgICAgICAgIDxTaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgICAgICA8U3RhcnRBY3Rpb24+T2ZmbGluZUFwcGxpY2F0aW9uPC9TdGFydEFjdGlvbj4NCisgICAgICAgIDwvU2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+DQorICAgIDwvVmlzdWFsU3R1ZGlvPg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8U3RhcnRBY3Rpb24+UHJvZ3JhbTwvU3RhcnRBY3Rpb24+DQorICAgIDxTdGFydFByb2dyYW0+JChQcm9qZWN0RGlyKS4uXC4uXGxpYlxOVW5pdFx0b29sc1xudW5pdC1jb25zb2xlLmV4ZTwvU3RhcnRQcm9ncmFtPg0KKyAgICA8U3RhcnRBcmd1bWVudHM+L25vbG9nbyAvbm9zaGFkb3cgL2xhYmVscyAvd2FpdCAkKEFzc2VtYmx5TmFtZSkuZGxsPC9TdGFydEFyZ3VtZW50cz4NCisgICAgPFN0YXJ0V29ya2luZ0RpcmVjdG9yeT4kKFByb2plY3REaXIpJChPdXRwdXRQYXRoKTwvU3RhcnRXb3JraW5nRGlyZWN0b3J5Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Byb3RvY29sQnVmZmVycy5UZXN0LlNMNDAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC5TTDQwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGUzZGMzCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC5TTDQwLmNzcHJvagpAQCAtMCwwICsxLDIxNSBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyIgeG1sbnM6Y3M9InVybjpzY2hlbWFzLWNzaGFycC1wcm9qZWN0OnRlbXBsYXRlIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+U0lMVkVSTElHSFQ8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5TTDQwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8RW52aXJvbm1lbnRQcm9qZWN0VHlwZT5URVNUPC9FbnZpcm9ubWVudFByb2plY3RUeXBlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0PC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9O3tmYWUwNGVjMC0zMDFmLTExZDMtYmY0Yi0wMGMwNGY3OWVmYmN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8U2lsdmVybGlnaHRBcHBsaWNhdGlvbj50cnVlPC9TaWx2ZXJsaWdodEFwcGxpY2F0aW9uPg0KKyAgICA8VmFsaWRhdGVYYW1sPmZhbHNlPC9WYWxpZGF0ZVhhbWw+DQorICAgIDxUaHJvd0Vycm9yc0luVmFsaWRhdGlvbj5mYWxzZTwvVGhyb3dFcnJvcnNJblZhbGlkYXRpb24+DQorICAgIDxTaWx2ZXJsaWdodFZlcnNpb24+djQuMDwvU2lsdmVybGlnaHRWZXJzaW9uPg0KKyAgICA8WGFwT3V0cHV0cz50cnVlPC9YYXBPdXRwdXRzPg0KKyAgICA8R2VuZXJhdGVTaWx2ZXJsaWdodE1hbmlmZXN0PnRydWU8L0dlbmVyYXRlU2lsdmVybGlnaHRNYW5pZmVzdD4NCisgICAgPFhhcEZpbGVuYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdC54YXA8L1hhcEZpbGVuYW1lPg0KKyAgICA8U2lsdmVybGlnaHRNYW5pZmVzdFRlbXBsYXRlPlByb3BlcnRpZXNcQXBwTWFuaWZlc3QueG1sPC9TaWx2ZXJsaWdodE1hbmlmZXN0VGVtcGxhdGU+DQorICAgIDxTaWx2ZXJsaWdodEFwcEVudHJ5Pkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQXBwPC9TaWx2ZXJsaWdodEFwcEVudHJ5Pg0KKyAgICA8VGVzdFBhZ2VGaWxlTmFtZT5UZXN0UGFnZS5odG1sPC9UZXN0UGFnZUZpbGVOYW1lPg0KKyAgICA8Q3JlYXRlVGVzdFBhZ2U+dHJ1ZTwvQ3JlYXRlVGVzdFBhZ2U+DQorICAgIDxPdXRPZkJyb3dzZXJTZXR0aW5nc0ZpbGU+UHJvcGVydGllc1xPdXRPZkJyb3dzZXJTZXR0aW5ncy54bWw8L091dE9mQnJvd3NlclNldHRpbmdzRmlsZT4NCisgICAgPEVuYWJsZU91dE9mQnJvd3Nlcj50cnVlPC9FbmFibGVPdXRPZkJyb3dzZXI+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cU0w0MFxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXFNMNDBcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cU0w0MFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0w0MFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2luZG93cyIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2luZG93cy5Ccm93c2VyIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibnVuaXQuZnJhbWV3b3JrIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxOVW5pdFxsaWJcbnVuaXQuZnJhbWV3b3JrLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgIT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodC5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE5Vbml0LWNvbmZpZ1xNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jcyI+DQorICAgICAgPExpbms+TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZVN0cmluZ1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW1UZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZE91dHB1dFN0cmVhbVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFBvcHNpY2xlTGlzdFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcQmluYXJ5Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XENvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxEaWN0aW9uYXJ5Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XEpzb25Db21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcVGVzdFJlc291cmNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxUZXh0Q29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XFhtbENvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UmVzb3VyY2VzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UnBjRm9yTWltZVR5cGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UmVhZGVyRm9yVXJsRW5jb2RlZC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ1NoYXJwT3B0aW9uc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlcHJlY2F0ZWRNZW1iZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1lc3NhZ2VEZXNjcmlwdG9yVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHluYW1pY01lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSXNzdWVzVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVN0cmVhbUl0ZXJhdG9yVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVN0cmVhbVdyaXRlclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlVXRpbFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik5hbWVIZWxwZXJzVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25UZXN0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJldXNhYmxlQnVpbGRlclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcmlhbGl6YWJsZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZpY2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0Q29ybmVyQ2FzZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RNaW1lTWVzc2FnZUZvcm1hdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RDU2hhcnBPcHRpb25zUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEVtYmVkT3B0aW1pemVGb3JQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFbXB0eVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEdlbmVyaWNTZXJ2aWNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEdvb2dsZVNpemVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RHb29nbGVTcGVlZFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RNZXNzYWdlU2V0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0Tm9HZW5lcmljU2VydmljZXNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RPcHRpbWl6ZUZvclByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFJwY0ludGVyb3AuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFJwY0dlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RXcml0ZXJGb3JtYXRKc29uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0V3JpdGVyRm9ybWF0WG1sLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXh0Rm9ybWF0VGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bkZpZWxkU2V0VGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iV2lyZUZvcm1hdFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFwcC54YW1sLmNzIj4NCisgICAgICA8RGVwZW5kZW50VXBvbj5BcHAueGFtbDwvRGVwZW5kZW50VXBvbj4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFwcE1hbmlmZXN0LnhtbCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iUHJvcGVydGllc1xPdXRPZkJyb3dzZXJTZXR0aW5ncy54bWwiIC8+DQorICAgIDxBcHBsaWNhdGlvbkRlZmluaXRpb24gSW5jbHVkZT0iQXBwLnhhbWwiPg0KKyAgICAgIDxHZW5lcmF0b3I+TVNCdWlsZDpDb21waWxlPC9HZW5lcmF0b3I+DQorICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+DQorICAgIDwvQXBwbGljYXRpb25EZWZpbml0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5TTDQwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezIzMTM5MUFGLTQ0OUMtNGEzOS05ODZDLUFEN0YyNzBGNDc1MH08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb248L05hbWU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5TTDQwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+DQorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+DQorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPg0KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPg0KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPg0KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4NCisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPg0KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPg0KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPg0KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+DQorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxnb29nbGVfbWVzc2FnZTEuZGF0IiAvPg0KKyAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XGdvb2dsZV9tZXNzYWdlMi5kYXQiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0XCQoU2lsdmVybGlnaHRWZXJzaW9uKVxNaWNyb3NvZnQuU2lsdmVybGlnaHQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn0iPg0KKyAgICAgICAgPFNpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgICAgIDxTdGFydEFjdGlvbj5PZmZsaW5lQXBwbGljYXRpb248L1N0YXJ0QWN0aW9uPg0KKyAgICAgICAgPC9TaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4NCisgICAgPC9WaXN1YWxTdHVkaW8+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxTdGFydEFjdGlvbj5Qcm9ncmFtPC9TdGFydEFjdGlvbj4NCisgICAgPFN0YXJ0UHJvZ3JhbT4kKFByb2plY3REaXIpLi5cLi5cbGliXE5Vbml0XHRvb2xzXG51bml0LWNvbnNvbGUuZXhlPC9TdGFydFByb2dyYW0+DQorICAgIDxTdGFydEFyZ3VtZW50cz4vbm9sb2dvIC9ub3NoYWRvdyAvbGFiZWxzIC93YWl0ICQoQXNzZW1ibHlOYW1lKS5kbGw8L1N0YXJ0QXJndW1lbnRzPg0KKyAgICA8U3RhcnRXb3JraW5nRGlyZWN0b3J5PiQoUHJvamVjdERpcikkKE91dHB1dFBhdGgpPC9TdGFydFdvcmtpbmdEaXJlY3Rvcnk+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvdG9jb2xCdWZmZXJzLlRlc3QuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3ZmVkYwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUHJvdG9jb2xCdWZmZXJzLlRlc3QuY3Nwcm9qCkBAIC0wLDAgKzEsMTc5IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DTElFTlRQUk9GSUxFPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+TkVUMzU8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxFbnZpcm9ubWVudFByb2plY3RUeXBlPlRFU1Q8L0Vudmlyb25tZW50UHJvamVjdFR5cGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVyczwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3Q8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDM1XERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yayI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTlVuaXRcbGliXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknICE9ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodCwgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxOVW5pdC1jb25maWdcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3MiPg0KKyAgICAgIDxMaW5rPk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVTdHJpbmdUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZElucHV0U3RyZWFtVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW1UZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xQb3BzaWNsZUxpc3RUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XEJpbmFyeUNvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxDb21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcRGljdGlvbmFyeUNvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxKc29uQ29tcGF0aWJpbGl0eVRlc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XFRlc3RSZXNvdXJjZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcVGV4dENvbXBhdGliaWxpdHlUZXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxYbWxDb21wYXRpYmlsaXR5VGVzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFJlc291cmNlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFJwY0Zvck1pbWVUeXBlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFJlYWRlckZvclVybEVuY29kZWQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNTaGFycE9wdGlvbnNUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXByZWNhdGVkTWVtYmVyVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xNZXNzYWdlRGVzY3JpcHRvclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkR5bmFtaWNNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2VUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRCdWlsZGVyVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkTWVzc2FnZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Iklzc3Vlc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1JdGVyYXRvclRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1Xcml0ZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVV0aWxUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJOYW1lSGVscGVyc1Rlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWZsZWN0aW9uVGVzdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZXVzYWJsZUJ1aWxkZXJUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJpYWxpemFibGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2aWNlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdENvcm5lckNhc2VzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0TWltZU1lc3NhZ2VGb3JtYXRzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0Q1NoYXJwT3B0aW9uc1Byb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFbWJlZE9wdGltaXplRm9yUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RW1wdHlQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNJc3N1ZXNQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RHZW5lcmljU2VydmljZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RHb29nbGVTaXplUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0R29vZ2xlU3BlZWRQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0TWVzc2FnZVNldFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdE5vR2VuZXJpY1NlcnZpY2VzUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0T3B0aW1pemVGb3JQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RScGNJbnRlcm9wLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RScGNHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RVdGlsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0V3JpdGVyRm9ybWF0SnNvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFdyaXRlckZvcm1hdFhtbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGV4dEZvcm1hdFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlVua25vd25GaWVsZFNldFRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IldpcmVGb3JtYXRUZXN0LmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0PnsyMzEzOTFBRi00NDlDLTRhMzktOTg2Qy1BRDdGMjcwRjQ3NTB9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnM8L05hbWU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4NCisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+DQorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+DQorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+DQorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+DQorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPg0KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+DQorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+DQorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+DQorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+DQorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4NCisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSJDb21wYXRpYmlsaXR5XGdvb2dsZV9tZXNzYWdlMS5kYXQiIC8+DQorICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcZ29vZ2xlX21lc3NhZ2UyLmRhdCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8U3RhcnRBY3Rpb24+UHJvZ3JhbTwvU3RhcnRBY3Rpb24+DQorICAgIDxTdGFydFByb2dyYW0+JChQcm9qZWN0RGlyKS4uXC4uXGxpYlxOVW5pdFx0b29sc1xudW5pdC1jb25zb2xlLmV4ZTwvU3RhcnRQcm9ncmFtPg0KKyAgICA8U3RhcnRBcmd1bWVudHM+L25vbG9nbyAvbm9zaGFkb3cgL2xhYmVscyAvd2FpdCAkKEFzc2VtYmx5TmFtZSkuZGxsPC9TdGFydEFyZ3VtZW50cz4NCisgICAgPFN0YXJ0V29ya2luZ0RpcmVjdG9yeT4kKFByb2plY3REaXIpJChPdXRwdXRQYXRoKTwvU3RhcnRXb3JraW5nRGlyZWN0b3J5Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1JlZmxlY3Rpb25UZXN0ZXIuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1JlZmxlY3Rpb25UZXN0ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyMGZmOAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvUmVmbGVjdGlvblRlc3Rlci5jcwpAQCAtMCwwICsxLDEwMDYgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3M7DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQorDQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgNjE4IC8vIERpc2FibGUgd2FybmluZyBhYm91dCBvYnNvbGV0ZSB1c2UgbWlzcy1tYXRjaGVkIGFzc2VydCBhcmd1bWVudHMNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gUGVyZm9ybXMgdGhlIHNhbWUgdGhpbmdzIHRoYXQgdGhlIG1ldGhvZHMgb2YgVGVzdFV0aWwgZG8sIGJ1dA0KKyAgICAvLy8gdmlhIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZS4gIFRoaXMgaXMgaXRzIG93biBjbGFzcyBiZWNhdXNlIGl0IG5lZWRzDQorICAgIC8vLyB0byBrbm93IHdoYXQgZGVzY3JpcHRvciB0byB1c2UuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIGludGVybmFsIGNsYXNzIFJlZmxlY3Rpb25UZXN0ZXINCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZXNzYWdlRGVzY3JpcHRvciBiYXNlRGVzY3JpcHRvcjsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnk7DQorDQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVEZXNjcmlwdG9yIGZpbGU7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVEZXNjcmlwdG9yIGltcG9ydEZpbGU7DQorDQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lc3NhZ2VEZXNjcmlwdG9yIG9wdGlvbmFsR3JvdXA7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lc3NhZ2VEZXNjcmlwdG9yIHJlcGVhdGVkR3JvdXA7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lc3NhZ2VEZXNjcmlwdG9yIG5lc3RlZE1lc3NhZ2U7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lc3NhZ2VEZXNjcmlwdG9yIGZvcmVpZ25NZXNzYWdlOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZXNzYWdlRGVzY3JpcHRvciBpbXBvcnRNZXNzYWdlOw0KKw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGaWVsZERlc2NyaXB0b3IgZ3JvdXBBOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGaWVsZERlc2NyaXB0b3IgcmVwZWF0ZWRHcm91cEE7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpZWxkRGVzY3JpcHRvciBuZXN0ZWRCOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGaWVsZERlc2NyaXB0b3IgZm9yZWlnbkM7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpZWxkRGVzY3JpcHRvciBpbXBvcnREOw0KKw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFbnVtRGVzY3JpcHRvciBuZXN0ZWRFbnVtOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFbnVtRGVzY3JpcHRvciBmb3JlaWduRW51bTsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRW51bURlc2NyaXB0b3IgaW1wb3J0RW51bTsNCisNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRW51bVZhbHVlRGVzY3JpcHRvciBuZXN0ZWRGb287DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEVudW1WYWx1ZURlc2NyaXB0b3IgbmVzdGVkQmFyOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFbnVtVmFsdWVEZXNjcmlwdG9yIG5lc3RlZEJhejsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRW51bVZhbHVlRGVzY3JpcHRvciBmb3JlaWduRm9vOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFbnVtVmFsdWVEZXNjcmlwdG9yIGZvcmVpZ25CYXI7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEVudW1WYWx1ZURlc2NyaXB0b3IgZm9yZWlnbkJhejsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRW51bVZhbHVlRGVzY3JpcHRvciBpbXBvcnRGb287DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEVudW1WYWx1ZURlc2NyaXB0b3IgaW1wb3J0QmFyOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFbnVtVmFsdWVEZXNjcmlwdG9yIGltcG9ydEJhejsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIHRoYXQgd2lsbCBleHBlY3QgbWVzc2FnZXMgdXNpbmcgdGhlIGdpdmVuDQorICAgICAgICAvLy8gZGVzY3JpcHRvci4gTm9ybWFsbHkgPHBhcmFtcmVmIG5hbWU9ImJhc2VEZXNjcmlwdG9yIi8+IHNob3VsZCBiZQ0KKyAgICAgICAgLy8vIGEgZGVzY3JpcHRvciBmb3IgVGVzdEFsbFR5cGVzLiBIb3dldmVyLCBpZiBleHRlbnNpb25SZWdpc3RyeSBpcyBub24tbnVsbCwNCisgICAgICAgIC8vLyB0aGVuIGJhc2VEZXNjcmlwdG9yIHNob3VsZCBiZSBmb3IgVGVzdEFsbEV4dGVuc2lvbnMgaW5zdGVhZCwgYW5kIGluc3RlYWQgb2YNCisgICAgICAgIC8vLyByZWFkaW5nIGFuZCB3cml0aW5nIG5vcm1hbCBmaWVsZHMsIHRoZSB0ZXN0ZXIgd2lsbCByZWFkIGFuZCB3cml0ZSBleHRlbnNpb25zLg0KKyAgICAgICAgLy8vIEFsbCBvZiB0aGUgVGVzdEFsbEV4dGVuc2lvbnMgZXh0ZW5zaW9ucyBtdXN0IGJlIHJlZ2lzdGVyZWQgaW4gdGhlIHJlZ2lzdHJ5Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgUmVmbGVjdGlvblRlc3RlcihNZXNzYWdlRGVzY3JpcHRvciBiYXNlRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aGlzLmJhc2VEZXNjcmlwdG9yID0gYmFzZURlc2NyaXB0b3I7DQorICAgICAgICAgICAgdGhpcy5leHRlbnNpb25SZWdpc3RyeSA9IGV4dGVuc2lvblJlZ2lzdHJ5Ow0KKw0KKyAgICAgICAgICAgIHRoaXMuZmlsZSA9IGJhc2VEZXNjcmlwdG9yLkZpbGU7DQorICAgICAgICAgICAgLy8gVE9ETyhqb25za2VldCk6IFdlJ3ZlIGdvdCAyIGRlcGVuZGVuY2llcywgbm90IDEgLSBiZWNhdXNlIG9mIHRoZSBDIyBvcHRpb25zLiBIbW0uDQorICAgICAgICAgICAgLy8gICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgZmlsZS5EZXBlbmRlbmNpZXMuQ291bnQpOw0KKyAgICAgICAgICAgIC8vIFRPRE8oam9uc2tlZXQpOiBGaW5kIGRlcGVuZGVuY3kgYnkgbmFtZSBpbnN0ZWFkIG9mIG51bWJlcj8NCisgICAgICAgICAgICB0aGlzLmltcG9ydEZpbGUgPSBmaWxlLkRlcGVuZGVuY2llc1sxXTsNCisNCisgICAgICAgICAgICBNZXNzYWdlRGVzY3JpcHRvciB0ZXN0QWxsVHlwZXM7DQorICAgICAgICAgICAgaWYgKGJhc2VEZXNjcmlwdG9yLk5hbWUgPT0gIlRlc3RBbGxUeXBlcyIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0ZXN0QWxsVHlwZXMgPSBiYXNlRGVzY3JpcHRvcjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGVzdEFsbFR5cGVzID0gZmlsZS5GaW5kVHlwZUJ5TmFtZTxNZXNzYWdlRGVzY3JpcHRvcj4oIlRlc3RBbGxUeXBlcyIpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHRlc3RBbGxUeXBlcyk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmIChleHRlbnNpb25SZWdpc3RyeSA9PSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gVXNlIHRlc3RBbGxUeXBlcywgcmF0aGVyIHRoYW4gYmFzZURlc2NyaXB0b3IsIHRvIGFsbG93DQorICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemF0aW9uIHVzaW5nIFRlc3RQYWNrZWRUeXBlcyBkZXNjcmlwdG9ycy4gVGhlc2Ugb2JqZWN0cw0KKyAgICAgICAgICAgICAgICAvLyB3b24ndCBiZSB1c2VkIGJ5IHRoZSBtZXRob2RzIGZvciBwYWNrZWQgZmllbGRzLg0KKyAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbmFsR3JvdXAgPQ0KKyAgICAgICAgICAgICAgICAgICAgdGVzdEFsbFR5cGVzLkZpbmREZXNjcmlwdG9yPE1lc3NhZ2VEZXNjcmlwdG9yPigiT3B0aW9uYWxHcm91cCIpOw0KKyAgICAgICAgICAgICAgICB0aGlzLnJlcGVhdGVkR3JvdXAgPQ0KKyAgICAgICAgICAgICAgICAgICAgdGVzdEFsbFR5cGVzLkZpbmREZXNjcmlwdG9yPE1lc3NhZ2VEZXNjcmlwdG9yPigiUmVwZWF0ZWRHcm91cCIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbmFsR3JvdXAgPQ0KKyAgICAgICAgICAgICAgICAgICAgZmlsZS5GaW5kVHlwZUJ5TmFtZTxNZXNzYWdlRGVzY3JpcHRvcj4oIk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIik7DQorICAgICAgICAgICAgICAgIHRoaXMucmVwZWF0ZWRHcm91cCA9DQorICAgICAgICAgICAgICAgICAgICBmaWxlLkZpbmRUeXBlQnlOYW1lPE1lc3NhZ2VEZXNjcmlwdG9yPigiUmVwZWF0ZWRHcm91cF9leHRlbnNpb24iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5uZXN0ZWRNZXNzYWdlID0gdGVzdEFsbFR5cGVzLkZpbmREZXNjcmlwdG9yPE1lc3NhZ2VEZXNjcmlwdG9yPigiTmVzdGVkTWVzc2FnZSIpOw0KKyAgICAgICAgICAgIHRoaXMuZm9yZWlnbk1lc3NhZ2UgPSBmaWxlLkZpbmRUeXBlQnlOYW1lPE1lc3NhZ2VEZXNjcmlwdG9yPigiRm9yZWlnbk1lc3NhZ2UiKTsNCisgICAgICAgICAgICB0aGlzLmltcG9ydE1lc3NhZ2UgPSBpbXBvcnRGaWxlLkZpbmRUeXBlQnlOYW1lPE1lc3NhZ2VEZXNjcmlwdG9yPigiSW1wb3J0TWVzc2FnZSIpOw0KKw0KKyAgICAgICAgICAgIHRoaXMubmVzdGVkRW51bSA9IHRlc3RBbGxUeXBlcy5GaW5kRGVzY3JpcHRvcjxFbnVtRGVzY3JpcHRvcj4oIk5lc3RlZEVudW0iKTsNCisgICAgICAgICAgICB0aGlzLmZvcmVpZ25FbnVtID0gZmlsZS5GaW5kVHlwZUJ5TmFtZTxFbnVtRGVzY3JpcHRvcj4oIkZvcmVpZ25FbnVtIik7DQorICAgICAgICAgICAgdGhpcy5pbXBvcnRFbnVtID0gaW1wb3J0RmlsZS5GaW5kVHlwZUJ5TmFtZTxFbnVtRGVzY3JpcHRvcj4oIkltcG9ydEVudW0iKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKG9wdGlvbmFsR3JvdXApOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVwZWF0ZWRHcm91cCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChuZXN0ZWRNZXNzYWdlKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKGZvcmVpZ25NZXNzYWdlKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKGltcG9ydE1lc3NhZ2UpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwobmVzdGVkRW51bSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChmb3JlaWduRW51bSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChpbXBvcnRFbnVtKTsNCisNCisgICAgICAgICAgICB0aGlzLm5lc3RlZEIgPSBuZXN0ZWRNZXNzYWdlLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oImJiIik7DQorICAgICAgICAgICAgdGhpcy5mb3JlaWduQyA9IGZvcmVpZ25NZXNzYWdlLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oImMiKTsNCisgICAgICAgICAgICB0aGlzLmltcG9ydEQgPSBpbXBvcnRNZXNzYWdlLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oImQiKTsNCisgICAgICAgICAgICB0aGlzLm5lc3RlZEZvbyA9IG5lc3RlZEVudW0uRmluZFZhbHVlQnlOYW1lKCJGT08iKTsNCisgICAgICAgICAgICB0aGlzLm5lc3RlZEJhciA9IG5lc3RlZEVudW0uRmluZFZhbHVlQnlOYW1lKCJCQVIiKTsNCisgICAgICAgICAgICB0aGlzLm5lc3RlZEJheiA9IG5lc3RlZEVudW0uRmluZFZhbHVlQnlOYW1lKCJCQVoiKTsNCisgICAgICAgICAgICB0aGlzLmZvcmVpZ25Gb28gPSBmb3JlaWduRW51bS5GaW5kVmFsdWVCeU5hbWUoIkZPUkVJR05fRk9PIik7DQorICAgICAgICAgICAgdGhpcy5mb3JlaWduQmFyID0gZm9yZWlnbkVudW0uRmluZFZhbHVlQnlOYW1lKCJGT1JFSUdOX0JBUiIpOw0KKyAgICAgICAgICAgIHRoaXMuZm9yZWlnbkJheiA9IGZvcmVpZ25FbnVtLkZpbmRWYWx1ZUJ5TmFtZSgiRk9SRUlHTl9CQVoiKTsNCisgICAgICAgICAgICB0aGlzLmltcG9ydEZvbyA9IGltcG9ydEVudW0uRmluZFZhbHVlQnlOYW1lKCJJTVBPUlRfRk9PIik7DQorICAgICAgICAgICAgdGhpcy5pbXBvcnRCYXIgPSBpbXBvcnRFbnVtLkZpbmRWYWx1ZUJ5TmFtZSgiSU1QT1JUX0JBUiIpOw0KKyAgICAgICAgICAgIHRoaXMuaW1wb3J0QmF6ID0gaW1wb3J0RW51bS5GaW5kVmFsdWVCeU5hbWUoIklNUE9SVF9CQVoiKTsNCisNCisgICAgICAgICAgICB0aGlzLmdyb3VwQSA9IG9wdGlvbmFsR3JvdXAuRmluZERlc2NyaXB0b3I8RmllbGREZXNjcmlwdG9yPigiYSIpOw0KKyAgICAgICAgICAgIHRoaXMucmVwZWF0ZWRHcm91cEEgPSByZXBlYXRlZEdyb3VwLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oImEiKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKGdyb3VwQSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChyZXBlYXRlZEdyb3VwQSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChuZXN0ZWRCKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKGZvcmVpZ25DKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKGltcG9ydEQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwobmVzdGVkRm9vKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKG5lc3RlZEJhcik7DQorICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChuZXN0ZWRCYXopOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoZm9yZWlnbkZvbyk7DQorICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChmb3JlaWduQmFyKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKGZvcmVpZ25CYXopOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoaW1wb3J0Rm9vKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKGltcG9ydEJhcik7DQorICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChpbXBvcnRCYXopOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENyZWF0ZXMgYW4gaW5zdGFuY2UgZm9yIHRoZSBUZXN0QWxsVHlwZXMgbWVzc2FnZSwgd2l0aCBubyBleHRlbnNpb24gcmVnaXN0cnkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZWZsZWN0aW9uVGVzdGVyIENyZWF0ZVRlc3RBbGxUeXBlc0luc3RhbmNlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IFJlZmxlY3Rpb25UZXN0ZXIoVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENyZWF0ZXMgYW4gaW5zdGFuY2UgZm9yIHRoZSBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlLCB3aXRoIGFuDQorICAgICAgICAvLy8gZXh0ZW5zaW9uIHJlZ2lzdHJ5IGZyb20gVGVzdFV0aWwuQ3JlYXRlRXh0ZW5zaW9uUmVnaXN0cnkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZWZsZWN0aW9uVGVzdGVyIENyZWF0ZVRlc3RBbGxFeHRlbnNpb25zSW5zdGFuY2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVmbGVjdGlvblRlc3RlcihUZXN0QWxsRXh0ZW5zaW9ucy5EZXNjcmlwdG9yLCBUZXN0VXRpbC5DcmVhdGVFeHRlbnNpb25SZWdpc3RyeSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDcmVhdGVzIGFuIGluc3RhbmNlIGZvciB0aGUgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UsIHdpdGggbm8gZXh0ZW5zaW9ucy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlZmxlY3Rpb25UZXN0ZXIgQ3JlYXRlVGVzdFBhY2tlZFR5cGVzSW5zdGFuY2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVmbGVjdGlvblRlc3RlcihUZXN0UGFja2VkVHlwZXMuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gU2hvcnRoYW5kIHRvIGdldCBhIEZpZWxkRGVzY3JpcHRvciBmb3IgYSBmaWVsZCBvZiB1bml0dGVzdDo6VGVzdEFsbFR5cGVzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgRmllbGREZXNjcmlwdG9yIGYoU3RyaW5nIG5hbWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIHJlc3VsdDsNCisgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uUmVnaXN0cnkgPT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJhc2VEZXNjcmlwdG9yLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4obmFtZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZpbGUuRmluZFR5cGVCeU5hbWU8RmllbGREZXNjcmlwdG9yPihuYW1lICsgIl9leHRlbnNpb24iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChyZXN1bHQpOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2FsbHMgcGFyZW50LkNyZWF0ZUJ1aWxkZXJGb3JGaWVsZCgpIG9yIHVzZXMgdGhlIGV4dGVuc2lvbiByZWdpc3RyeQ0KKyAgICAgICAgLy8vIHRvIGZpbmQgYW4gYXBwcm9wcmlhdGUgYnVpbGRlciwgZGVwZW5kaW5nIG9uIHdoYXQgdHlwZSBpcyBiZWluZyB0ZXN0ZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBJQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yRmllbGQoSUJ1aWxkZXIgcGFyZW50LCBGaWVsZERlc2NyaXB0b3IgZmllbGQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGV4dGVuc2lvblJlZ2lzdHJ5ID09IG51bGwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LkNyZWF0ZUJ1aWxkZXJGb3JGaWVsZChmaWVsZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEV4dGVuc2lvbkluZm8gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uUmVnaXN0cnlbZmllbGQuQ29udGFpbmluZ1R5cGUsIGZpZWxkLkZpZWxkTnVtYmVyXTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChleHRlbnNpb24pOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKGV4dGVuc2lvbi5EZWZhdWx0SW5zdGFuY2UpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gKElCdWlsZGVyKSBleHRlbnNpb24uRGVmYXVsdEluc3RhbmNlLldlYWtDcmVhdGVCdWlsZGVyRm9yVHlwZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXRzIGV2ZXJ5IGZpZWxkIG9mIHRoZSBtZXNzYWdlIHRvIHRoZSB2YWx1ZXMgZXhwZWN0ZWQgYnkNCisgICAgICAgIC8vLyBBc3NlcnRBbGxGaWVsZHNTZXQsIHVzaW5nIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPjwvcGFyYW0+DQorICAgICAgICBpbnRlcm5hbCB2b2lkIFNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oSUJ1aWxkZXIgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBtZXNzYWdlW2YoIm9wdGlvbmFsX2ludDMyIildID0gMTAxOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigib3B0aW9uYWxfaW50NjQiKV0gPSAxMDJMOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigib3B0aW9uYWxfdWludDMyIildID0gMTAzVTsNCisgICAgICAgICAgICBtZXNzYWdlW2YoIm9wdGlvbmFsX3VpbnQ2NCIpXSA9IDEwNFVMOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigib3B0aW9uYWxfc2ludDMyIildID0gMTA1Ow0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigib3B0aW9uYWxfc2ludDY0IildID0gMTA2TDsNCisgICAgICAgICAgICBtZXNzYWdlW2YoIm9wdGlvbmFsX2ZpeGVkMzIiKV0gPSAxMDdVOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigib3B0aW9uYWxfZml4ZWQ2NCIpXSA9IDEwOFVMOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigib3B0aW9uYWxfc2ZpeGVkMzIiKV0gPSAxMDk7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJvcHRpb25hbF9zZml4ZWQ2NCIpXSA9IDExMEw7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJvcHRpb25hbF9mbG9hdCIpXSA9IDExMUY7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJvcHRpb25hbF9kb3VibGUiKV0gPSAxMTJEOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigib3B0aW9uYWxfYm9vbCIpXSA9IHRydWU7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJvcHRpb25hbF9zdHJpbmciKV0gPSAiMTE1IjsNCisgICAgICAgICAgICBtZXNzYWdlW2YoIm9wdGlvbmFsX2J5dGVzIildID0gVGVzdFV0aWwuVG9CeXRlcygiMTE2Iik7DQorDQorICAgICAgICAgICAgbWVzc2FnZVtmKCJvcHRpb25hbGdyb3VwIildID0NCisgICAgICAgICAgICAgICAgQ3JlYXRlQnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoIm9wdGlvbmFsZ3JvdXAiKSkuU2V0RmllbGQoZ3JvdXBBLCAxMTcpLldlYWtCdWlsZCgpOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKV0gPQ0KKyAgICAgICAgICAgICAgICBDcmVhdGVCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSkuU2V0RmllbGQobmVzdGVkQiwgMTE4KS5XZWFrQnVpbGQoKTsNCisgICAgICAgICAgICBtZXNzYWdlW2YoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpXSA9DQorICAgICAgICAgICAgICAgIENyZWF0ZUJ1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkuU2V0RmllbGQoZm9yZWlnbkMsIDExOSkuV2Vha0J1aWxkKCk7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpXSA9DQorICAgICAgICAgICAgICAgIENyZWF0ZUJ1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKS5TZXRGaWVsZChpbXBvcnRELCAxMjApLldlYWtCdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigib3B0aW9uYWxfbmVzdGVkX2VudW0iKV0gPSBuZXN0ZWRCYXo7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJvcHRpb25hbF9mb3JlaWduX2VudW0iKV0gPSBmb3JlaWduQmF6Ow0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigib3B0aW9uYWxfaW1wb3J0X2VudW0iKV0gPSBpbXBvcnRCYXo7DQorDQorICAgICAgICAgICAgbWVzc2FnZVtmKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKV0gPSAiMTI0IjsNCisgICAgICAgICAgICBtZXNzYWdlW2YoIm9wdGlvbmFsX2NvcmQiKV0gPSAiMTI1IjsNCisNCisgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50MzIiKSwgMjAxKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDY0IiksIDIwMkwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDMyIiksIDIwM1UpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDY0IiksIDIwNFVMKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQzMiIpLCAyMDUpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDY0IiksIDIwNkwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQzMiIpLCAyMDdVKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkNjQiKSwgMjA4VUwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMjA5KTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDIxMEwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZmxvYXQiKSwgMjExRik7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9kb3VibGUiKSwgMjEyRCk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ib29sIiksIHRydWUpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiksICIyMTUiKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiksIFRlc3RVdGlsLlRvQnl0ZXMoIjIxNiIpKTsNCisNCisNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkZ3JvdXAiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZGdyb3VwIikpLlNldEZpZWxkKHJlcGVhdGVkR3JvdXBBLCAyMTcpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldlYWtCdWlsZCgpKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSkuU2V0RmllbGQobmVzdGVkQiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMTgpLg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYWtCdWlsZCgpKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKS5TZXRGaWVsZCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduQywgMjE5KS5XZWFrQnVpbGQoKSk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpLlNldEZpZWxkKGltcG9ydEQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwKS4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWFrQnVpbGQoKSk7DQorDQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIpLCBuZXN0ZWRCYXIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25CYXIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iKSwgaW1wb3J0QmFyKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAiMjI0Iik7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9jb3JkIiksICIyMjUiKTsNCisNCisgICAgICAgICAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuDQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQzMiIpLCAzMDEpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50NjQiKSwgMzAyTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50MzIiKSwgMzAzVSk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50NjQiKSwgMzA0VUwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDMyIiksIDMwNSk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50NjQiKSwgMzA2TCk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDMyIiksIDMwN1UpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQ2NCIpLCAzMDhVTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAzMDkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMzEwTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mbG9hdCIpLCAzMTFGKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2RvdWJsZSIpLCAzMTJEKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Jvb2wiKSwgZmFsc2UpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiksICIzMTUiKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiksIFRlc3RVdGlsLlRvQnl0ZXMoIjMxNiIpKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkZ3JvdXAiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZGdyb3VwIikpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNldEZpZWxkKHJlcGVhdGVkR3JvdXBBLCAzMTcpLldlYWtCdWlsZCgpKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2V0RmllbGQobmVzdGVkQiwgMzE4KS5XZWFrQnVpbGQoKSk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2V0RmllbGQoZm9yZWlnbkMsIDMxOSkuV2Vha0J1aWxkKCkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRGaWVsZChpbXBvcnRELCAzMjApLldlYWtCdWlsZCgpKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiksIG5lc3RlZEJheik7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwgZm9yZWlnbkJheik7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIpLCBpbXBvcnRCYXopOw0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksICIzMjQiKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2NvcmQiKSwgIjMyNSIpOw0KKw0KKyAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorICAgICAgICAgICAgbWVzc2FnZVtmKCJkZWZhdWx0X2ludDMyIildID0gNDAxOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigiZGVmYXVsdF9pbnQ2NCIpXSA9IDQwMkw7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJkZWZhdWx0X3VpbnQzMiIpXSA9IDQwM1U7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJkZWZhdWx0X3VpbnQ2NCIpXSA9IDQwNFVMOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigiZGVmYXVsdF9zaW50MzIiKV0gPSA0MDU7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJkZWZhdWx0X3NpbnQ2NCIpXSA9IDQwNkw7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJkZWZhdWx0X2ZpeGVkMzIiKV0gPSA0MDdVOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigiZGVmYXVsdF9maXhlZDY0IildID0gNDA4VUw7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJkZWZhdWx0X3NmaXhlZDMyIildID0gNDA5Ow0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigiZGVmYXVsdF9zZml4ZWQ2NCIpXSA9IDQxMEw7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJkZWZhdWx0X2Zsb2F0IildID0gNDExRjsNCisgICAgICAgICAgICBtZXNzYWdlW2YoImRlZmF1bHRfZG91YmxlIildID0gNDEyRDsNCisgICAgICAgICAgICBtZXNzYWdlW2YoImRlZmF1bHRfYm9vbCIpXSA9IGZhbHNlOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigiZGVmYXVsdF9zdHJpbmciKV0gPSAiNDE1IjsNCisgICAgICAgICAgICBtZXNzYWdlW2YoImRlZmF1bHRfYnl0ZXMiKV0gPSBUZXN0VXRpbC5Ub0J5dGVzKCI0MTYiKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlW2YoImRlZmF1bHRfbmVzdGVkX2VudW0iKV0gPSBuZXN0ZWRGb287DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpXSA9IGZvcmVpZ25Gb287DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJkZWZhdWx0X2ltcG9ydF9lbnVtIildID0gaW1wb3J0Rm9vOw0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKV0gPSAiNDI0IjsNCisgICAgICAgICAgICBtZXNzYWdlW2YoImRlZmF1bHRfY29yZCIpXSA9ICI0MjUiOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENsZWFycyBldmVyeSBmaWVsZCBvZiB0aGUgbWVzc2FnZSwgdXNpbmcgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+PC9wYXJhbT4NCisgICAgICAgIGludGVybmFsIHZvaWQgQ2xlYXJBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKElCdWlsZGVyIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoRmllbGREZXNjcmlwdG9yIGZpZWxkIGluIG1lc3NhZ2UuQWxsRmllbGRzLktleXMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLldlYWtDbGVhckZpZWxkKGZpZWxkKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTW9kaWZ5IHRoZSByZXBlYXRlZCBmaWVsZHMgb2YgdGhlIHNwZWNpZmllZCBtZXNzYWdlIHRvIGNvbnRhaW4gdGhlDQorICAgICAgICAvLy8gdmFsdWVzIGV4cGVjdGVkIGJ5IEFzc2VydFJlcGVhdGVkRmllbGRzTW9kaWZpZWQsIHVzaW5nIHRoZSBJQnVpbGRlcg0KKyAgICAgICAgLy8vIHJlZmxlY3Rpb24gaW50ZXJmYWNlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIHZvaWQgTW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKElCdWlsZGVyIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJyZXBlYXRlZF9pbnQzMiIpLCAxXSA9IDUwMTsNCisgICAgICAgICAgICBtZXNzYWdlW2YoInJlcGVhdGVkX2ludDY0IiksIDFdID0gNTAyTDsNCisgICAgICAgICAgICBtZXNzYWdlW2YoInJlcGVhdGVkX3VpbnQzMiIpLCAxXSA9IDUwM1U7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJyZXBlYXRlZF91aW50NjQiKSwgMV0gPSA1MDRVTDsNCisgICAgICAgICAgICBtZXNzYWdlW2YoInJlcGVhdGVkX3NpbnQzMiIpLCAxXSA9IDUwNTsNCisgICAgICAgICAgICBtZXNzYWdlW2YoInJlcGVhdGVkX3NpbnQ2NCIpLCAxXSA9IDUwNkw7DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJyZXBlYXRlZF9maXhlZDMyIiksIDFdID0gNTA3VTsNCisgICAgICAgICAgICBtZXNzYWdlW2YoInJlcGVhdGVkX2ZpeGVkNjQiKSwgMV0gPSA1MDhVTDsNCisgICAgICAgICAgICBtZXNzYWdlW2YoInJlcGVhdGVkX3NmaXhlZDMyIiksIDFdID0gNTA5Ow0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMV0gPSA1MTBMOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigicmVwZWF0ZWRfZmxvYXQiKSwgMV0gPSA1MTFGOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigicmVwZWF0ZWRfZG91YmxlIiksIDFdID0gNTEyRDsNCisgICAgICAgICAgICBtZXNzYWdlW2YoInJlcGVhdGVkX2Jvb2wiKSwgMV0gPSB0cnVlOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigicmVwZWF0ZWRfc3RyaW5nIiksIDFdID0gIjUxNSI7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiksIDEsIFRlc3RVdGlsLlRvQnl0ZXMoIjUxNiIpKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLlNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRncm91cCIpLCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRncm91cCIpKS5TZXRGaWVsZChyZXBlYXRlZEdyb3VwQSwgNTE3KS4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYWtCdWlsZCgpKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpLlNldEZpZWxkKG5lc3RlZEIsIDUxOCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XZWFrQnVpbGQoKSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpLCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpLlNldEZpZWxkKGZvcmVpZ25DLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxOSkuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWFrQnVpbGQoKSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpKS5TZXRGaWVsZChpbXBvcnRELCA1MjApDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2Vha0J1aWxkKCkpOw0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iKSwgMV0gPSBuZXN0ZWRGb287DQorICAgICAgICAgICAgbWVzc2FnZVtmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwgMV0gPSBmb3JlaWduRm9vOw0KKyAgICAgICAgICAgIG1lc3NhZ2VbZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iKSwgMV0gPSBpbXBvcnRGb287DQorDQorICAgICAgICAgICAgbWVzc2FnZVtmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMV0gPSAiNTI0IjsNCisgICAgICAgICAgICBtZXNzYWdlW2YoInJlcGVhdGVkX2NvcmQiKSwgMV0gPSAiNTI1IjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBc3NlcnRzIHRoYXQgYWxsIGZpZWxkcyBvZiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYXJlIHNldCB0byB0aGUgdmFsdWVzDQorICAgICAgICAvLy8gYXNzaWduZWQgYnkgU2V0QWxsRmllbGRzLCB1c2luZyB0aGUgSU1lc3NhZ2UgcmVmbGVjdGlvbiBpbnRlcmZhY2UuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgQXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihJTWVzc2FnZSBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJvcHRpb25hbF9pbnQzMiIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ludDY0IikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfdWludDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfdWludDY0IikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfc2ludDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfc2ludDY0IikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfZml4ZWQzMiIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkNjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQzMiIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsX3NmaXhlZDY0IikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfZmxvYXQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJvcHRpb25hbF9kb3VibGUiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJvcHRpb25hbF9ib29sIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfc3RyaW5nIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfYnl0ZXMiKSkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJvcHRpb25hbGdyb3VwIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoKElNZXNzYWdlKSBtZXNzYWdlW2YoIm9wdGlvbmFsZ3JvdXAiKV0pLkhhc0ZpZWxkKGdyb3VwQSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKChJTWVzc2FnZSkgbWVzc2FnZVtmKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpXSkuSGFzRmllbGQobmVzdGVkQikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKChJTWVzc2FnZSkgbWVzc2FnZVtmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKV0pLkhhc0ZpZWxkKGZvcmVpZ25DKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoKElNZXNzYWdlKSBtZXNzYWdlW2YoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIildKS5IYXNGaWVsZChpbXBvcnREKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfaW1wb3J0X2VudW0iKSkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJvcHRpb25hbF9jb3JkIikpKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAxLCBtZXNzYWdlW2YoIm9wdGlvbmFsX2ludDMyIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAyTCwgbWVzc2FnZVtmKCJvcHRpb25hbF9pbnQ2NCIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwM3UsIG1lc3NhZ2VbZigib3B0aW9uYWxfdWludDMyIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTA0VUwsIG1lc3NhZ2VbZigib3B0aW9uYWxfdWludDY0IildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTA1LCBtZXNzYWdlW2YoIm9wdGlvbmFsX3NpbnQzMiIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwNkwsIG1lc3NhZ2VbZigib3B0aW9uYWxfc2ludDY0IildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTA3VSwgbWVzc2FnZVtmKCJvcHRpb25hbF9maXhlZDMyIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTA4VUwsIG1lc3NhZ2VbZigib3B0aW9uYWxfZml4ZWQ2NCIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwOSwgbWVzc2FnZVtmKCJvcHRpb25hbF9zZml4ZWQzMiIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDExMEwsIG1lc3NhZ2VbZigib3B0aW9uYWxfc2ZpeGVkNjQiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMTFGLCBtZXNzYWdlW2YoIm9wdGlvbmFsX2Zsb2F0IildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTEyRCwgbWVzc2FnZVtmKCJvcHRpb25hbF9kb3VibGUiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0cnVlLCBtZXNzYWdlW2YoIm9wdGlvbmFsX2Jvb2wiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTE1IiwgbWVzc2FnZVtmKCJvcHRpb25hbF9zdHJpbmciKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0VXRpbC5Ub0J5dGVzKCIxMTYiKSwgbWVzc2FnZVtmKCJvcHRpb25hbF9ieXRlcyIpXSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDExNywgKChJTWVzc2FnZSkgbWVzc2FnZVtmKCJvcHRpb25hbGdyb3VwIildKVtncm91cEFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTE4LCAoKElNZXNzYWdlKSBtZXNzYWdlW2YoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIildKVtuZXN0ZWRCXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDExOSwgKChJTWVzc2FnZSkgbWVzc2FnZVtmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKV0pW2ZvcmVpZ25DXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMCwgKChJTWVzc2FnZSkgbWVzc2FnZVtmKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpXSlbaW1wb3J0RF0pOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXN0ZWRCYXosIG1lc3NhZ2VbZigib3B0aW9uYWxfbmVzdGVkX2VudW0iKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmb3JlaWduQmF6LCBtZXNzYWdlW2YoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGltcG9ydEJheiwgbWVzc2FnZVtmKCJvcHRpb25hbF9pbXBvcnRfZW51bSIpXSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMjQiLCBtZXNzYWdlW2YoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMjUiLCBtZXNzYWdlW2YoIm9wdGlvbmFsX2NvcmQiKV0pOw0KKw0KKyAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ludDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW50NjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF91aW50MzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF91aW50NjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zaW50MzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zaW50NjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9maXhlZDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZml4ZWQ2NCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NmaXhlZDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ZpeGVkNjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9mbG9hdCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2RvdWJsZSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2Jvb2wiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zdHJpbmciKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9ieXRlcyIpKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkZ3JvdXAiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIpKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2NvcmQiKSkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDEsIG1lc3NhZ2VbZigicmVwZWF0ZWRfaW50MzIiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDJMLCBtZXNzYWdlW2YoInJlcGVhdGVkX2ludDY0IiksIDBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjAzVSwgbWVzc2FnZVtmKCJyZXBlYXRlZF91aW50MzIiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDRVTCwgbWVzc2FnZVtmKCJyZXBlYXRlZF91aW50NjQiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDUsIG1lc3NhZ2VbZigicmVwZWF0ZWRfc2ludDMyIiksIDBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjA2TCwgbWVzc2FnZVtmKCJyZXBlYXRlZF9zaW50NjQiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDdVLCBtZXNzYWdlW2YoInJlcGVhdGVkX2ZpeGVkMzIiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDhVTCwgbWVzc2FnZVtmKCJyZXBlYXRlZF9maXhlZDY0IiksIDBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjA5LCBtZXNzYWdlW2YoInJlcGVhdGVkX3NmaXhlZDMyIiksIDBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjEwTCwgbWVzc2FnZVtmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIxMUYsIG1lc3NhZ2VbZigicmVwZWF0ZWRfZmxvYXQiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTJELCBtZXNzYWdlW2YoInJlcGVhdGVkX2RvdWJsZSIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsIG1lc3NhZ2VbZigicmVwZWF0ZWRfYm9vbCIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyMTUiLCBtZXNzYWdlW2YoInJlcGVhdGVkX3N0cmluZyIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RVdGlsLlRvQnl0ZXMoIjIxNiIpLCBtZXNzYWdlW2YoInJlcGVhdGVkX2J5dGVzIiksIDBdKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjE3LCAoKElNZXNzYWdlKSBtZXNzYWdlW2YoInJlcGVhdGVkZ3JvdXAiKSwgMF0pW3JlcGVhdGVkR3JvdXBBXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIxOCwgKChJTWVzc2FnZSkgbWVzc2FnZVtmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLCAwXSlbbmVzdGVkQl0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTksICgoSU1lc3NhZ2UpIG1lc3NhZ2VbZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIiksIDBdKVtmb3JlaWduQ10pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMjAsICgoSU1lc3NhZ2UpIG1lc3NhZ2VbZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwgMF0pW2ltcG9ydERdKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmVzdGVkQmFyLCBtZXNzYWdlW2YoInJlcGVhdGVkX25lc3RlZF9lbnVtIiksIDBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZm9yZWlnbkJhciwgbWVzc2FnZVtmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChpbXBvcnRCYXIsIG1lc3NhZ2VbZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iKSwgMF0pOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMjI0IiwgbWVzc2FnZVtmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMjI1IiwgbWVzc2FnZVtmKCJyZXBlYXRlZF9jb3JkIiksIDBdKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzAxLCBtZXNzYWdlW2YoInJlcGVhdGVkX2ludDMyIiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzAyTCwgbWVzc2FnZVtmKCJyZXBlYXRlZF9pbnQ2NCIpLCAxXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMwM1UsIG1lc3NhZ2VbZigicmVwZWF0ZWRfdWludDMyIiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzA0VUwsIG1lc3NhZ2VbZigicmVwZWF0ZWRfdWludDY0IiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzA1LCBtZXNzYWdlW2YoInJlcGVhdGVkX3NpbnQzMiIpLCAxXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMwNkwsIG1lc3NhZ2VbZigicmVwZWF0ZWRfc2ludDY0IiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzA3VSwgbWVzc2FnZVtmKCJyZXBlYXRlZF9maXhlZDMyIiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzA4VUwsIG1lc3NhZ2VbZigicmVwZWF0ZWRfZml4ZWQ2NCIpLCAxXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMwOSwgbWVzc2FnZVtmKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAxXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMxMEwsIG1lc3NhZ2VbZigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMTFGLCBtZXNzYWdlW2YoInJlcGVhdGVkX2Zsb2F0IiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzEyRCwgbWVzc2FnZVtmKCJyZXBlYXRlZF9kb3VibGUiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmYWxzZSwgbWVzc2FnZVtmKCJyZXBlYXRlZF9ib29sIiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjMxNSIsIG1lc3NhZ2VbZigicmVwZWF0ZWRfc3RyaW5nIiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdFV0aWwuVG9CeXRlcygiMzE2IiksIG1lc3NhZ2VbZigicmVwZWF0ZWRfYnl0ZXMiKSwgMV0pOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMTcsICgoSU1lc3NhZ2UpIG1lc3NhZ2VbZigicmVwZWF0ZWRncm91cCIpLCAxXSlbcmVwZWF0ZWRHcm91cEFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzE4LCAoKElNZXNzYWdlKSBtZXNzYWdlW2YoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDFdKVtuZXN0ZWRCXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMxOSwgKChJTWVzc2FnZSkgbWVzc2FnZVtmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMV0pW2ZvcmVpZ25DXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMyMCwgKChJTWVzc2FnZSkgbWVzc2FnZVtmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLCAxXSlbaW1wb3J0RF0pOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXN0ZWRCYXosIG1lc3NhZ2VbZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmb3JlaWduQmF6LCBtZXNzYWdlW2YoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLCAxXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGltcG9ydEJheiwgbWVzc2FnZVtmKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIpLCAxXSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIzMjQiLCBtZXNzYWdlW2YoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAxXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIzMjUiLCBtZXNzYWdlW2YoInJlcGVhdGVkX2NvcmQiKSwgMV0pOw0KKw0KKyAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKGYoImRlZmF1bHRfaW50MzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X2ludDY0IikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigiZGVmYXVsdF91aW50MzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X3VpbnQ2NCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKGYoImRlZmF1bHRfc2ludDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigiZGVmYXVsdF9zaW50NjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X2ZpeGVkMzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X2ZpeGVkNjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigiZGVmYXVsdF9zZml4ZWQ2NCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKGYoImRlZmF1bHRfZmxvYXQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X2RvdWJsZSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKGYoImRlZmF1bHRfYm9vbCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKGYoImRlZmF1bHRfc3RyaW5nIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRmllbGQoZigiZGVmYXVsdF9ieXRlcyIpKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKGYoImRlZmF1bHRfbmVzdGVkX2VudW0iKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKGYoImRlZmF1bHRfaW1wb3J0X2VudW0iKSkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X3N0cmluZ19waWVjZSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKGYoImRlZmF1bHRfY29yZCIpKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQwMSwgbWVzc2FnZVtmKCJkZWZhdWx0X2ludDMyIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDAyTCwgbWVzc2FnZVtmKCJkZWZhdWx0X2ludDY0IildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDAzVSwgbWVzc2FnZVtmKCJkZWZhdWx0X3VpbnQzMiIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQwNFVMLCBtZXNzYWdlW2YoImRlZmF1bHRfdWludDY0IildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDA1LCBtZXNzYWdlW2YoImRlZmF1bHRfc2ludDMyIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDA2TCwgbWVzc2FnZVtmKCJkZWZhdWx0X3NpbnQ2NCIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQwN1UsIG1lc3NhZ2VbZigiZGVmYXVsdF9maXhlZDMyIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDA4VUwsIG1lc3NhZ2VbZigiZGVmYXVsdF9maXhlZDY0IildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDA5LCBtZXNzYWdlW2YoImRlZmF1bHRfc2ZpeGVkMzIiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MTBMLCBtZXNzYWdlW2YoImRlZmF1bHRfc2ZpeGVkNjQiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MTFGLCBtZXNzYWdlW2YoImRlZmF1bHRfZmxvYXQiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MTJELCBtZXNzYWdlW2YoImRlZmF1bHRfZG91YmxlIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZmFsc2UsIG1lc3NhZ2VbZigiZGVmYXVsdF9ib29sIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjQxNSIsIG1lc3NhZ2VbZigiZGVmYXVsdF9zdHJpbmciKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0VXRpbC5Ub0J5dGVzKCI0MTYiKSwgbWVzc2FnZVtmKCJkZWZhdWx0X2J5dGVzIildKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmVzdGVkRm9vLCBtZXNzYWdlW2YoImRlZmF1bHRfbmVzdGVkX2VudW0iKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmb3JlaWduRm9vLCBtZXNzYWdlW2YoImRlZmF1bHRfZm9yZWlnbl9lbnVtIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoaW1wb3J0Rm9vLCBtZXNzYWdlW2YoImRlZmF1bHRfaW1wb3J0X2VudW0iKV0pOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiNDI0IiwgbWVzc2FnZVtmKCJkZWZhdWx0X3N0cmluZ19waWVjZSIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI0MjUiLCBtZXNzYWdlW2YoImRlZmF1bHRfY29yZCIpXSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQXNzZXJ0IHRoYXQgYWxsIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSBhcmUgY2xlYXJlZCwgYW5kIHRoYXQNCisgICAgICAgIC8vLyBnZXR0aW5nIHRoZSBmaWVsZHMgcmV0dXJucyB0aGVpciBkZWZhdWx0IHZhbHVlcywgdXNpbmcgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIEFzc2VydENsZWFyVmlhUmVmbGVjdGlvbihJTWVzc2FnZSBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIGhhc19ibGFoKCkgc2hvdWxkIGluaXRpYWxseSBiZSBmYWxzZSBmb3IgYWxsIG9wdGlvbmFsIGZpZWxkcy4NCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ludDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ludDY0IikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsX3VpbnQzMiIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNGaWVsZChmKCJvcHRpb25hbF91aW50NjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfc2ludDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsX3NpbnQ2NCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNGaWVsZChmKCJvcHRpb25hbF9maXhlZDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkNjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfc2ZpeGVkMzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfc2ZpeGVkNjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfZmxvYXQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfZG91YmxlIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsX2Jvb2wiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfc3RyaW5nIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsX2J5dGVzIikpKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsZ3JvdXAiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfZW51bSIpKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNGaWVsZChmKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoZigib3B0aW9uYWxfY29yZCIpKSk7DQorDQorICAgICAgICAgICAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB6ZXJvIG9yIHNvbWV0aGluZyBsaWtlIGl0Lg0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlW2YoIm9wdGlvbmFsX2ludDMyIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMEwsIG1lc3NhZ2VbZigib3B0aW9uYWxfaW50NjQiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwVSwgbWVzc2FnZVtmKCJvcHRpb25hbF91aW50MzIiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwVUwsIG1lc3NhZ2VbZigib3B0aW9uYWxfdWludDY0IildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZVtmKCJvcHRpb25hbF9zaW50MzIiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwTCwgbWVzc2FnZVtmKCJvcHRpb25hbF9zaW50NjQiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwVSwgbWVzc2FnZVtmKCJvcHRpb25hbF9maXhlZDMyIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMFVMLCBtZXNzYWdlW2YoIm9wdGlvbmFsX2ZpeGVkNjQiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlW2YoIm9wdGlvbmFsX3NmaXhlZDMyIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMEwsIG1lc3NhZ2VbZigib3B0aW9uYWxfc2ZpeGVkNjQiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwRiwgbWVzc2FnZVtmKCJvcHRpb25hbF9mbG9hdCIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDBELCBtZXNzYWdlW2YoIm9wdGlvbmFsX2RvdWJsZSIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZhbHNlLCBtZXNzYWdlW2YoIm9wdGlvbmFsX2Jvb2wiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiIiwgbWVzc2FnZVtmKCJvcHRpb25hbF9zdHJpbmciKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChCeXRlU3RyaW5nLkVtcHR5LCBtZXNzYWdlW2YoIm9wdGlvbmFsX2J5dGVzIildKTsNCisNCisgICAgICAgICAgICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4NCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoKElNZXNzYWdlKSBtZXNzYWdlW2YoIm9wdGlvbmFsZ3JvdXAiKV0pLkhhc0ZpZWxkKGdyb3VwQSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKCgoSU1lc3NhZ2UpIG1lc3NhZ2VbZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKV0pDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5IYXNGaWVsZChuZXN0ZWRCKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKChJTWVzc2FnZSkgbWVzc2FnZVtmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKV0pDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5IYXNGaWVsZChmb3JlaWduQykpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKCgoSU1lc3NhZ2UpIG1lc3NhZ2VbZigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKV0pDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5IYXNGaWVsZChpbXBvcnREKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsICgoSU1lc3NhZ2UpIG1lc3NhZ2VbZigib3B0aW9uYWxncm91cCIpXSlbZ3JvdXBBXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsICgoSU1lc3NhZ2UpIG1lc3NhZ2VbZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKV0pW25lc3RlZEJdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgKChJTWVzc2FnZSkgbWVzc2FnZVtmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKV0pW2ZvcmVpZ25DXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsICgoSU1lc3NhZ2UpIG1lc3NhZ2VbZigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKV0pW2ltcG9ydERdKTsNCisNCisgICAgICAgICAgICAvLyBFbnVtcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBlbnVtLg0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXN0ZWRGb28sIG1lc3NhZ2VbZigib3B0aW9uYWxfbmVzdGVkX2VudW0iKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmb3JlaWduRm9vLCBtZXNzYWdlW2YoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGltcG9ydEZvbywgbWVzc2FnZVtmKCJvcHRpb25hbF9pbXBvcnRfZW51bSIpXSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIiLCBtZXNzYWdlW2YoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIiLCBtZXNzYWdlW2YoIm9wdGlvbmFsX2NvcmQiKV0pOw0KKw0KKyAgICAgICAgICAgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ludDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW50NjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF91aW50MzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF91aW50NjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zaW50MzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zaW50NjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9maXhlZDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZml4ZWQ2NCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NmaXhlZDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ZpeGVkNjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9mbG9hdCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2RvdWJsZSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2Jvb2wiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zdHJpbmciKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9ieXRlcyIpKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkZ3JvdXAiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIpKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2NvcmQiKSkpOw0KKw0KKyAgICAgICAgICAgIC8vIGhhc19ibGFoKCkgc2hvdWxkIGFsc28gYmUgZmFsc2UgZm9yIGFsbCBkZWZhdWx0IGZpZWxkcy4NCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoImRlZmF1bHRfaW50MzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoZigiZGVmYXVsdF9pbnQ2NCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X3VpbnQzMiIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X3VpbnQ2NCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X3NpbnQzMiIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X3NpbnQ2NCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X2ZpeGVkMzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoZigiZGVmYXVsdF9maXhlZDY0IikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoImRlZmF1bHRfc2ZpeGVkMzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoZigiZGVmYXVsdF9zZml4ZWQ2NCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X2Zsb2F0IikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoImRlZmF1bHRfZG91YmxlIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoImRlZmF1bHRfYm9vbCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X3N0cmluZyIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X2J5dGVzIikpKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKGYoImRlZmF1bHRfbmVzdGVkX2VudW0iKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoZigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoZigiZGVmYXVsdF9pbXBvcnRfZW51bSIpKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X3N0cmluZ19waWVjZSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNGaWVsZChmKCJkZWZhdWx0X2NvcmQiKSkpOw0KKw0KKyAgICAgICAgICAgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQxLCBtZXNzYWdlW2YoImRlZmF1bHRfaW50MzIiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MkwsIG1lc3NhZ2VbZigiZGVmYXVsdF9pbnQ2NCIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQzVSwgbWVzc2FnZVtmKCJkZWZhdWx0X3VpbnQzMiIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQ0VUwsIG1lc3NhZ2VbZigiZGVmYXVsdF91aW50NjQiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtNDUsIG1lc3NhZ2VbZigiZGVmYXVsdF9zaW50MzIiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0NkwsIG1lc3NhZ2VbZigiZGVmYXVsdF9zaW50NjQiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0N1UsIG1lc3NhZ2VbZigiZGVmYXVsdF9maXhlZDMyIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDhVTCwgbWVzc2FnZVtmKCJkZWZhdWx0X2ZpeGVkNjQiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0OSwgbWVzc2FnZVtmKCJkZWZhdWx0X3NmaXhlZDMyIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTUwTCwgbWVzc2FnZVtmKCJkZWZhdWx0X3NmaXhlZDY0IildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTEuNUYsIG1lc3NhZ2VbZigiZGVmYXVsdF9mbG9hdCIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUyZTNELCBtZXNzYWdlW2YoImRlZmF1bHRfZG91YmxlIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSwgbWVzc2FnZVtmKCJkZWZhdWx0X2Jvb2wiKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaGVsbG8iLCBtZXNzYWdlW2YoImRlZmF1bHRfc3RyaW5nIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdFV0aWwuVG9CeXRlcygid29ybGQiKSwgbWVzc2FnZVtmKCJkZWZhdWx0X2J5dGVzIildKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmVzdGVkQmFyLCBtZXNzYWdlW2YoImRlZmF1bHRfbmVzdGVkX2VudW0iKV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmb3JlaWduQmFyLCBtZXNzYWdlW2YoImRlZmF1bHRfZm9yZWlnbl9lbnVtIildKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoaW1wb3J0QmFyLCBtZXNzYWdlW2YoImRlZmF1bHRfaW1wb3J0X2VudW0iKV0pOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiYWJjIiwgbWVzc2FnZVtmKCJkZWZhdWx0X3N0cmluZ19waWVjZSIpXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMjMiLCBtZXNzYWdlW2YoImRlZmF1bHRfY29yZCIpXSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisgICAgICAgIGludGVybmFsIHZvaWQgQXNzZXJ0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZFZpYVJlZmxlY3Rpb24oSU1lc3NhZ2UgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBNb2RpZnlSZXBlYXRlZEZpZWxkcyBvbmx5IHNldHMgdGhlIHNlY29uZCByZXBlYXRlZCBlbGVtZW50IG9mIGVhY2gNCisgICAgICAgICAgICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdA0KKyAgICAgICAgICAgIC8vIGVsZW1lbnQgYW5kIHNpemUgd2VyZSAqbm90KiBtb2RpZmllZC4NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW50MzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbnQ2NCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3VpbnQzMiIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3VpbnQ2NCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NpbnQzMiIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NpbnQ2NCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZpeGVkMzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9maXhlZDY0IikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2Zsb2F0IikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZG91YmxlIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfYm9vbCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3N0cmluZyIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2J5dGVzIikpKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRncm91cCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIikpKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfY29yZCIpKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwMSwgbWVzc2FnZVtmKCJyZXBlYXRlZF9pbnQzMiIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwMkwsIG1lc3NhZ2VbZigicmVwZWF0ZWRfaW50NjQiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDNVLCBtZXNzYWdlW2YoInJlcGVhdGVkX3VpbnQzMiIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwNFVMLCBtZXNzYWdlW2YoInJlcGVhdGVkX3VpbnQ2NCIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwNSwgbWVzc2FnZVtmKCJyZXBlYXRlZF9zaW50MzIiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDZMLCBtZXNzYWdlW2YoInJlcGVhdGVkX3NpbnQ2NCIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwN1UsIG1lc3NhZ2VbZigicmVwZWF0ZWRfZml4ZWQzMiIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwOFVMLCBtZXNzYWdlW2YoInJlcGVhdGVkX2ZpeGVkNjQiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDksIG1lc3NhZ2VbZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTBMLCBtZXNzYWdlW2YoInJlcGVhdGVkX3NmaXhlZDY0IiksIDBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjExRiwgbWVzc2FnZVtmKCJyZXBlYXRlZF9mbG9hdCIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIxMkQsIG1lc3NhZ2VbZigicmVwZWF0ZWRfZG91YmxlIiksIDBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSwgbWVzc2FnZVtmKCJyZXBlYXRlZF9ib29sIiksIDBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjIxNSIsIG1lc3NhZ2VbZigicmVwZWF0ZWRfc3RyaW5nIiksIDBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdFV0aWwuVG9CeXRlcygiMjE2IiksIG1lc3NhZ2VbZigicmVwZWF0ZWRfYnl0ZXMiKSwgMF0pOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTcsICgoSU1lc3NhZ2UpIG1lc3NhZ2VbZigicmVwZWF0ZWRncm91cCIpLCAwXSlbcmVwZWF0ZWRHcm91cEFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjE4LCAoKElNZXNzYWdlKSBtZXNzYWdlW2YoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDBdKVtuZXN0ZWRCXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIxOSwgKChJTWVzc2FnZSkgbWVzc2FnZVtmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMF0pW2ZvcmVpZ25DXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIyMCwgKChJTWVzc2FnZSkgbWVzc2FnZVtmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLCAwXSlbaW1wb3J0RF0pOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXN0ZWRCYXIsIG1lc3NhZ2VbZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmb3JlaWduQmFyLCBtZXNzYWdlW2YoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGltcG9ydEJhciwgbWVzc2FnZVtmKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIpLCAwXSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyMjQiLCBtZXNzYWdlW2YoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyMjUiLCBtZXNzYWdlW2YoInJlcGVhdGVkX2NvcmQiKSwgMF0pOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDEsIG1lc3NhZ2VbZigicmVwZWF0ZWRfaW50MzIiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDJMLCBtZXNzYWdlW2YoInJlcGVhdGVkX2ludDY0IiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTAzVSwgbWVzc2FnZVtmKCJyZXBlYXRlZF91aW50MzIiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDRVTCwgbWVzc2FnZVtmKCJyZXBlYXRlZF91aW50NjQiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDUsIG1lc3NhZ2VbZigicmVwZWF0ZWRfc2ludDMyIiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTA2TCwgbWVzc2FnZVtmKCJyZXBlYXRlZF9zaW50NjQiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDdVLCBtZXNzYWdlW2YoInJlcGVhdGVkX2ZpeGVkMzIiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDhVTCwgbWVzc2FnZVtmKCJyZXBlYXRlZF9maXhlZDY0IiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTA5LCBtZXNzYWdlW2YoInJlcGVhdGVkX3NmaXhlZDMyIiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTEwTCwgbWVzc2FnZVtmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAxXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUxMUYsIG1lc3NhZ2VbZigicmVwZWF0ZWRfZmxvYXQiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MTJELCBtZXNzYWdlW2YoInJlcGVhdGVkX2RvdWJsZSIpLCAxXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsIG1lc3NhZ2VbZigicmVwZWF0ZWRfYm9vbCIpLCAxXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI1MTUiLCBtZXNzYWdlW2YoInJlcGVhdGVkX3N0cmluZyIpLCAxXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RVdGlsLlRvQnl0ZXMoIjUxNiIpLCBtZXNzYWdlW2YoInJlcGVhdGVkX2J5dGVzIiksIDFdKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTE3LCAoKElNZXNzYWdlKSBtZXNzYWdlW2YoInJlcGVhdGVkZ3JvdXAiKSwgMV0pW3JlcGVhdGVkR3JvdXBBXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUxOCwgKChJTWVzc2FnZSkgbWVzc2FnZVtmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLCAxXSlbbmVzdGVkQl0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MTksICgoSU1lc3NhZ2UpIG1lc3NhZ2VbZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIiksIDFdKVtmb3JlaWduQ10pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MjAsICgoSU1lc3NhZ2UpIG1lc3NhZ2VbZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwgMV0pW2ltcG9ydERdKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmVzdGVkRm9vLCBtZXNzYWdlW2YoInJlcGVhdGVkX25lc3RlZF9lbnVtIiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZm9yZWlnbkZvbywgbWVzc2FnZVtmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChpbXBvcnRGb28sIG1lc3NhZ2VbZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iKSwgMV0pOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiNTI0IiwgbWVzc2FnZVtmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiNTI1IiwgbWVzc2FnZVtmKCJyZXBlYXRlZF9jb3JkIiksIDFdKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBWZXJpZmllcyB0aGF0IHRoZSByZWZsZWN0aW9uIHNldHRlcnMgZm9yIHRoZSBnaXZlbiBCdWlsZGVyIG9iamVjdCB0aHJvdyBhbg0KKyAgICAgICAgLy8vIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBpZiB0aGV5IGFyZSBwYXNzZWQgYSBudWxsIHZhbHVlLiANCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdm9pZCBBc3NlcnRSZWZsZWN0aW9uU2V0dGVyc1JlamVjdE51bGwoSUJ1aWxkZXIgYnVpbGRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBcmd1bWVudE51bGxFeGNlcHRpb24oKCkgPT4gYnVpbGRlcltmKCJvcHRpb25hbF9zdHJpbmciKV0gPSBudWxsKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBcmd1bWVudE51bGxFeGNlcHRpb24oKCkgPT4gYnVpbGRlcltmKCJvcHRpb25hbF9ieXRlcyIpXSA9IG51bGwpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigoKSA9PiBidWlsZGVyW2YoIm9wdGlvbmFsX25lc3RlZF9lbnVtIildID0gbnVsbCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QXJndW1lbnROdWxsRXhjZXB0aW9uKCgpID0+IGJ1aWxkZXJbZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKV0gPSBudWxsKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBcmd1bWVudE51bGxFeGNlcHRpb24oKCkgPT4gYnVpbGRlcltmKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpXSA9IG51bGwpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigoKSA9PiBidWlsZGVyLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZyIpLCBudWxsKSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QXJndW1lbnROdWxsRXhjZXB0aW9uKCgpID0+IGJ1aWxkZXIuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiKSwgbnVsbCkpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigoKSA9PiBidWlsZGVyLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiksIG51bGwpKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBcmd1bWVudE51bGxFeGNlcHRpb24oKCkgPT4gYnVpbGRlci5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLCBudWxsKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVmVyaWZpZXMgdGhhdCB0aGUgcmVmbGVjdGlvbiByZXBlYXRlZCBzZXR0ZXJzIGZvciB0aGUgZ2l2ZW4gQnVpbGRlciBvYmplY3QgdGhyb3cgYW4NCisgICAgICAgIC8vLyBBcmd1bWVudE51bGxFeGNlcHRpb24gaWYgdGhleSBhcmUgcGFzc2VkIGEgbnVsbCB2YWx1ZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdm9pZCBBc3NlcnRSZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbChJQnVpbGRlciBidWlsZGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJ1aWxkZXIuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiksICJvbmUiKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBcmd1bWVudE51bGxFeGNlcHRpb24oKCkgPT4gYnVpbGRlci5TZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZyIpLCAwLCBudWxsKSk7DQorICAgICAgICAgICAgYnVpbGRlci5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ieXRlcyIpLCBUZXN0VXRpbC5Ub0J5dGVzKCJvbmUiKSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QXJndW1lbnROdWxsRXhjZXB0aW9uKCgpID0+IGJ1aWxkZXIuU2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ieXRlcyIpLCAwLCBudWxsKSk7DQorICAgICAgICAgICAgYnVpbGRlci5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIpLCBuZXN0ZWRCYXopOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigoKSA9PiBidWlsZGVyLlNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iKSwgMCwgbnVsbCkpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyIHtCYiA9IDIxOH0uQnVpbGQoKSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QXJndW1lbnROdWxsRXhjZXB0aW9uKCgpID0+IGJ1aWxkZXIuU2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLCAwLCBudWxsKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBTZXRQYWNrZWRGaWVsZHNWaWFSZWZsZWN0aW9uKElCdWlsZGVyIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfaW50MzIiKSwgNjAxKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9pbnQ2NCIpLCA2MDJMKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF91aW50MzIiKSwgNjAzVSk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfdWludDY0IiksIDYwNFVMKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zaW50MzIiKSwgNjA1KTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zaW50NjQiKSwgNjA2TCk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZml4ZWQzMiIpLCA2MDdVKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9maXhlZDY0IiksIDYwOFVMKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zZml4ZWQzMiIpLCA2MDkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NmaXhlZDY0IiksIDYxMEwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2Zsb2F0IiksIDYxMUYpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2RvdWJsZSIpLCA2MTJEKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9ib29sIiksIHRydWUpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2VudW0iKSwgZm9yZWlnbkJhcik7DQorICAgICAgICAgICAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLg0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ludDMyIiksIDcwMSk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfaW50NjQiKSwgNzAyTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfdWludDMyIiksIDcwM1UpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3VpbnQ2NCIpLCA3MDRVTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ludDMyIiksIDcwNSk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ludDY0IiksIDcwNkwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuV2Vha0FkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ZpeGVkMzIiKSwgNzA3VSk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZml4ZWQ2NCIpLCA3MDhVTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ZpeGVkMzIiKSwgNzA5KTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zZml4ZWQ2NCIpLCA3MTBMKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9mbG9hdCIpLCA3MTFGKTsNCisgICAgICAgICAgICBtZXNzYWdlLldlYWtBZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9kb3VibGUiKSwgNzEyRCk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfYm9vbCIpLCBmYWxzZSk7DQorICAgICAgICAgICAgbWVzc2FnZS5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZW51bSIpLCBmb3JlaWduQmF6KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEFzc2VydFBhY2tlZEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oSU1lc3NhZ2UgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX2ludDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX2ludDY0IikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX3VpbnQzMiIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF91aW50NjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfc2ludDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX3NpbnQ2NCIpKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF9maXhlZDMyIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX2ZpeGVkNjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfc2ZpeGVkMzIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfc2ZpeGVkNjQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfZmxvYXQiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfZG91YmxlIikpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX2Jvb2wiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfZW51bSIpKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwMSwgbWVzc2FnZVtmKCJwYWNrZWRfaW50MzIiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MDJMLCBtZXNzYWdlW2YoInBhY2tlZF9pbnQ2NCIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwM3UsIG1lc3NhZ2VbZigicGFja2VkX3VpbnQzMiIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwNHVMLCBtZXNzYWdlW2YoInBhY2tlZF91aW50NjQiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MDUsIG1lc3NhZ2VbZigicGFja2VkX3NpbnQzMiIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwNkwsIG1lc3NhZ2VbZigicGFja2VkX3NpbnQ2NCIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwN3UsIG1lc3NhZ2VbZigicGFja2VkX2ZpeGVkMzIiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MDh1TCwgbWVzc2FnZVtmKCJwYWNrZWRfZml4ZWQ2NCIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwOSwgbWVzc2FnZVtmKCJwYWNrZWRfc2ZpeGVkMzIiKSwgMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MTBMLCBtZXNzYWdlW2YoInBhY2tlZF9zZml4ZWQ2NCIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYxMUYsIG1lc3NhZ2VbZigicGFja2VkX2Zsb2F0IiksIDBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjEyRCwgbWVzc2FnZVtmKCJwYWNrZWRfZG91YmxlIiksIDBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSwgbWVzc2FnZVtmKCJwYWNrZWRfYm9vbCIpLCAwXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZvcmVpZ25CYXIsIG1lc3NhZ2VbZigicGFja2VkX2VudW0iKSwgMF0pOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDEsIG1lc3NhZ2VbZigicGFja2VkX2ludDMyIiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzAyTCwgbWVzc2FnZVtmKCJwYWNrZWRfaW50NjQiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDN1LCBtZXNzYWdlW2YoInBhY2tlZF91aW50MzIiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDR1TCwgbWVzc2FnZVtmKCJwYWNrZWRfdWludDY0IiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzA1LCBtZXNzYWdlW2YoInBhY2tlZF9zaW50MzIiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDZMLCBtZXNzYWdlW2YoInBhY2tlZF9zaW50NjQiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDd1LCBtZXNzYWdlW2YoInBhY2tlZF9maXhlZDMyIiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzA4dUwsIG1lc3NhZ2VbZigicGFja2VkX2ZpeGVkNjQiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDksIG1lc3NhZ2VbZigicGFja2VkX3NmaXhlZDMyIiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzEwTCwgbWVzc2FnZVtmKCJwYWNrZWRfc2ZpeGVkNjQiKSwgMV0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MTFGLCBtZXNzYWdlW2YoInBhY2tlZF9mbG9hdCIpLCAxXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcxMkQsIG1lc3NhZ2VbZigicGFja2VkX2RvdWJsZSIpLCAxXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZhbHNlLCBtZXNzYWdlW2YoInBhY2tlZF9ib29sIiksIDFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZm9yZWlnbkJheiwgbWVzc2FnZVtmKCJwYWNrZWRfZW51bSIpLCAxXSk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9SZXVzYWJsZUJ1aWxkZXJUZXN0LmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9SZXVzYWJsZUJ1aWxkZXJUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2M2Y2NTcKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1JldXNhYmxlQnVpbGRlclRlc3QuY3MKQEAgLTAsMCArMSwxNzEgQEAKK++7v3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uQ29tcG9uZW50TW9kZWw7DQordXNpbmcgU3lzdGVtLlRleHQ7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3M7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uOw0KK3VzaW5nIFVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgUmV1c2FibGVCdWlsZGVyVGVzdA0KKyAgICB7DQorICAgICAgICAvL0lzc3VlIDI4OiBDaXJjdWxhciBtZXNzYWdlIGRlcGVuZGVuY2llcyByZXN1bHQgaW4gbnVsbCBkZWZhdWx0cyBmb3IgRGVmYXVsdEluc3RhbmNlDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEVuc3VyZVN0YXRpY0NpY3VsYXJSZWZlcmVuY2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE15TWVzc2FnZUFSZWZlcmVuY2VCIGFiID0gTXlNZXNzYWdlQVJlZmVyZW5jZUIuRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoYWIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoYWIuVmFsdWUpOw0KKyAgICAgICAgICAgIE15TWVzc2FnZUJSZWZlcmVuY2VBIGJhID0gTXlNZXNzYWdlQlJlZmVyZW5jZUEuRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoYmEpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoYmEuVmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TW9kaWZ5RGVmYXVsdEluc3RhbmNlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvL3ZlcmlmeSB0aGF0IHRoZSBkZWZhdWx0IGluc3RhbmNlIGhhcyBjb3JyZWN0bHkgYmVlbiBtYXJrZWQgYXMgcmVhZC1vbmx5DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHR5cGVvZihQb3BzaWNsZUxpc3Q8Ym9vbD4pLCBUZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlLlJlcGVhdGVkQm9vbExpc3QuR2V0VHlwZSgpKTsNCisgICAgICAgICAgICBQb3BzaWNsZUxpc3Q8Ym9vbD4gbGlzdCA9IChQb3BzaWNsZUxpc3Q8Ym9vbD4pVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZS5SZXBlYXRlZEJvb2xMaXN0Ow0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobGlzdC5Jc1JlYWRPbmx5KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFVubW9kaWZpZWREZWZhdWx0SW5zdGFuY2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vU2ltcGx5IGNhbGxpbmcgVG9CdWlsZGVyKCkuQnVpbGQoKSBubyBsb25nZXIgY3JlYXRlcyBhIGNvcHkgb2YgdGhlIG1lc3NhZ2UNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZS5Ub0J1aWxkZXIoKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKFJlZmVyZW5jZUVxdWFscyhUZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlLCBidWlsZGVyLkJ1aWxkKCkpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgQnVpbGRNdWx0aXBsZVdpdGhvdXRDaGFuZ2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vQ2FsbGluZyBCdWlsZCgpIG9yIEJ1aWxkUGFydGlhbCgpIGRvZXMgbm90IHJlcXVpcmUgYSBjb3B5IG9mIHRoZSBtZXNzYWdlDQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2UuVG9CdWlsZGVyKCk7DQorICAgICAgICAgICAgYnVpbGRlci5TZXREZWZhdWx0Qm9vbCh0cnVlKTsNCisNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgZmlyc3QgPSBidWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgIC8vU3RpbGwgdGhlIHNhbWUgaW5zdGFuY2U/DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShSZWZlcmVuY2VFcXVhbHMoZmlyc3QsIGJ1aWxkZXIuQnVpbGQoKSkpOw0KKyAgICAgICAgICAgIC8vU3RpbGwgdGhlIHNhbWUgaW5zdGFuY2U/DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShSZWZlcmVuY2VFcXVhbHMoZmlyc3QsIGJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCkuVG9CdWlsZGVyKCkuQnVpbGQoKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb21EZWZhdWx0SW5zdGFuY2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlLlRvQnVpbGRlcigpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoUmVmZXJlbmNlRXF1YWxzKFRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2UsIGJ1aWxkZXIuQnVpbGQoKSkpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuTWVyZ2VGcm9tKFRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2UpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoUmVmZXJlbmNlRXF1YWxzKFRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2UsIGJ1aWxkZXIuQnVpbGQoKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBCdWlsZE5ld0J1aWxkZXJJc0RlZmF1bHRJbnN0YW5jZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShSZWZlcmVuY2VFcXVhbHMoVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZSwgbmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyKCkuQnVpbGQoKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoUmVmZXJlbmNlRXF1YWxzKFRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2UsIFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKCkuQnVpbGQoKSkpOw0KKyAgICAgICAgICAgIC8vbGFzdCB0ZXN0LCBpZiB5b3UgY2xlYXIgYSBidWlsZGVyIGl0IHJldmVydHMgdG8gZGVmYXVsdCBpbnN0YW5jZQ0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoUmVmZXJlbmNlRXF1YWxzKFRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKCkuU2V0T3B0aW9uYWxCb29sKHRydWUpLkJ1aWxkKCkuVG9CdWlsZGVyKCkuQ2xlYXIoKS5CdWlsZCgpKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEJ1aWxkTW9kaWZ5QW5kUmVidWlsZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYjEgPSBuZXcgVGVzdEFsbFR5cGVzLkJ1aWxkZXIoKTsNCisgICAgICAgICAgICBiMS5TZXREZWZhdWx0SW50MzIoMSk7DQorICAgICAgICAgICAgYjEuQWRkUmVwZWF0ZWRJbnQzMigyKTsNCisgICAgICAgICAgICBiMS5TZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSk7DQorDQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIG0xID0gYjEuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBiMS5TZXREZWZhdWx0SW50MzIoNSk7DQorICAgICAgICAgICAgYjEuQWRkUmVwZWF0ZWRJbnQzMig2KTsNCisgICAgICAgICAgICBiMS5TZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKGIxLk9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UuVG9CdWlsZGVyKCkuU2V0Qyg3KSk7DQorDQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIG0yID0gYjEuQnVpbGQoKTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIntcIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZVwiOnt9LFwicmVwZWF0ZWRfaW50MzJcIjpbMl0sXCJkZWZhdWx0X2ludDMyXCI6MX0iLCBFeHRlbnNpb25zLlRvSnNvbihtMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgie1wib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlXCI6e1wiY1wiOjd9LFwicmVwZWF0ZWRfaW50MzJcIjpbMiw2XSxcImRlZmF1bHRfaW50MzJcIjo1fSIsIEV4dGVuc2lvbnMuVG9Kc29uKG0yKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIENsb25lT25DaGFuZ2VQcmltaXRpdmUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlLlRvQnVpbGRlcigpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoUmVmZXJlbmNlRXF1YWxzKFRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2UsIGJ1aWxkZXIuQnVpbGQoKSkpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuU2V0RGVmYXVsdEJvb2wodHJ1ZSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoUmVmZXJlbmNlRXF1YWxzKFRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2UsIGJ1aWxkZXIuQnVpbGQoKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBDbG9uZU9uQWRkUmVwZWF0ZWRCb29sKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZS5Ub0J1aWxkZXIoKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKFJlZmVyZW5jZUVxdWFscyhUZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlLCBidWlsZGVyLkJ1aWxkKCkpKTsNCisgICAgICAgICAgICBidWlsZGVyLkFkZFJlcGVhdGVkQm9vbCh0cnVlKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShSZWZlcmVuY2VFcXVhbHMoVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZSwgYnVpbGRlci5CdWlsZCgpKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIENsb25lT25HZXRSZXBlYXRlZEJvb2xMaXN0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZS5Ub0J1aWxkZXIoKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKFJlZmVyZW5jZUVxdWFscyhUZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlLCBidWlsZGVyLkJ1aWxkKCkpKTsNCisgICAgICAgICAgICBHQy5LZWVwQWxpdmUoYnVpbGRlci5SZXBlYXRlZEJvb2xMaXN0KTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShSZWZlcmVuY2VFcXVhbHMoVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZSwgYnVpbGRlci5CdWlsZCgpKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIENsb25lT25DaGFuZ2VNZXNzYWdlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZS5Ub0J1aWxkZXIoKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKFJlZmVyZW5jZUVxdWFscyhUZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlLCBidWlsZGVyLkJ1aWxkKCkpKTsNCisgICAgICAgICAgICBidWlsZGVyLlNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UobmV3IEZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIoKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoUmVmZXJlbmNlRXF1YWxzKFRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2UsIGJ1aWxkZXIuQnVpbGQoKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBDbG9uZU9uQ2xlYXJNZXNzYWdlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZS5Ub0J1aWxkZXIoKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKFJlZmVyZW5jZUVxdWFscyhUZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlLCBidWlsZGVyLkJ1aWxkKCkpKTsNCisgICAgICAgICAgICBidWlsZGVyLkNsZWFyT3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKFJlZmVyZW5jZUVxdWFscyhUZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlLCBidWlsZGVyLkJ1aWxkKCkpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xvbmVPbkdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZS5Ub0J1aWxkZXIoKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKFJlZmVyZW5jZUVxdWFscyhUZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlLCBidWlsZGVyLkJ1aWxkKCkpKTsNCisgICAgICAgICAgICBHQy5LZWVwQWxpdmUoYnVpbGRlci5SZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoUmVmZXJlbmNlRXF1YWxzKFRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2UsIGJ1aWxkZXIuQnVpbGQoKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBDbG9uZU9uQ2hhbmdlRW51bVZhbHVlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZS5Ub0J1aWxkZXIoKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKFJlZmVyZW5jZUVxdWFscyhUZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlLCBidWlsZGVyLkJ1aWxkKCkpKTsNCisgICAgICAgICAgICBidWlsZGVyLlNldE9wdGlvbmFsRm9yZWlnbkVudW0oRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKFJlZmVyZW5jZUVxdWFscyhUZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlLCBidWlsZGVyLkJ1aWxkKCkpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xvbmVPbkdldFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZS5Ub0J1aWxkZXIoKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKFJlZmVyZW5jZUVxdWFscyhUZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlLCBidWlsZGVyLkJ1aWxkKCkpKTsNCisgICAgICAgICAgICBHQy5LZWVwQWxpdmUoYnVpbGRlci5SZXBlYXRlZEZvcmVpZ25FbnVtTGlzdCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoUmVmZXJlbmNlRXF1YWxzKFRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2UsIGJ1aWxkZXIuQnVpbGQoKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9TZXJpYWxpemFibGVBdHRyaWJ1dGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1Mzc2MgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzCkBAIC0wLDAgKzEsMTIgQEAKK++7vyNpZiBOT1NFUklBTElaQUJMRSAmJiAhQ09NUEFDVF9GUkFNRVdPUksNCisNCituYW1lc3BhY2UgU3lzdGVtDQorew0KKyAgICBbQXR0cmlidXRlVXNhZ2UoQXR0cmlidXRlVGFyZ2V0cy5DbGFzcyldDQorICAgIHB1YmxpYyBjbGFzcyBTZXJpYWxpemFibGVBdHRyaWJ1dGUgOiBBdHRyaWJ1dGUNCisgICAgew0KKyAgICAgICAgcHVibGljIFNlcmlhbGl6YWJsZUF0dHJpYnV0ZSAoKSA6IGJhc2UoKSB7IH0NCisgICAgfQ0KK30NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1NlcmlhbGl6YWJsZVRlc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1NlcmlhbGl6YWJsZVRlc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0MDYxNAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvU2VyaWFsaXphYmxlVGVzdC5jcwpAQCAtMCwwICsxLDE3OSBAQAor77u/I2lmICFOT1NFUklBTElaQUJMRQ0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuQmluYXJ5Ow0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvczsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIFNlcmlhbGl6YWJsZVRlc3QNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEp1c3Qga2VlcCBpdCBmcm9tIGV2ZW4gY29tcGlsaW5nIGlmIHdlIHRoZXNlIG9iamVjdHMgZG9uJ3QgaW1wbGVtZW50IHRoZSBleHBlY3RlZCBpbnRlcmZhY2UuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBJU2VyaWFsaXphYmxlIENvbXBpbGVUaW1lQ2hlY2tTZXJpYWxpemFibGVNZXNzYWdlID0gVGVzdFhtbE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBJU2VyaWFsaXphYmxlIENvbXBpbGVUaW1lQ2hlY2tTZXJpYWxpemFibGVCdWlsZGVyID0gbmV3IFRlc3RYbWxNZXNzYWdlLkJ1aWxkZXIoKTsNCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFBsYWluTWVzc2FnZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UgbWVzc2FnZSA9IFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0VmFsaWQodHJ1ZSkNCisgICAgICAgICAgICAgICAgLlNldFRleHQoInRleHQiKQ0KKyAgICAgICAgICAgICAgICAuQWRkVGV4dGxpbmVzKCJhIikNCisgICAgICAgICAgICAgICAgLkFkZFRleHRsaW5lcygiYiIpDQorICAgICAgICAgICAgICAgIC5BZGRUZXh0bGluZXMoImMiKQ0KKyAgICAgICAgICAgICAgICAuU2V0TnVtYmVyKDB4MTAxMDEwMTAxMCkNCisgICAgICAgICAgICAgICAgLkFkZE51bWJlcnMoMSkNCisgICAgICAgICAgICAgICAgLkFkZE51bWJlcnMoMikNCisgICAgICAgICAgICAgICAgLkFkZE51bWJlcnMoMykNCisgICAgICAgICAgICAgICAgLlNldENoaWxkKFRlc3RYbWxDaGlsZC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRPcHRpb25zKEVudW1PcHRpb25zLk9ORSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRCaW5hcnkoQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVsxXSkpKQ0KKyAgICAgICAgICAgICAgICAuQWRkQ2hpbGRyZW4oVGVzdFhtbE1lc3NhZ2UuVHlwZXMuQ2hpbGRyZW4uQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRPcHRpb25zKEVudW1PcHRpb25zLlRXTykNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNldEJpbmFyeShCeXRlU3RyaW5nLkNvcHlGcm9tKG5ldyBieXRlWzJdKSkpDQorICAgICAgICAgICAgICAgIC5BZGRDaGlsZHJlbihUZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbi5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZE9wdGlvbnMoRW51bU9wdGlvbnMuVEhSRUUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRCaW5hcnkoQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVszXSkpKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorICAgICAgICAgICAgbmV3IEJpbmFyeUZvcm1hdHRlcigpLlNlcmlhbGl6ZShtcywgbWVzc2FnZSk7DQorDQorICAgICAgICAgICAgbXMuUG9zaXRpb24gPSAwOw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIGNvcHkgPSAoVGVzdFhtbE1lc3NhZ2UpbmV3IEJpbmFyeUZvcm1hdHRlcigpLkRlc2VyaWFsaXplKG1zKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZSwgY29weSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RNZXNzYWdlV2l0aEV4dGVuc2lvbnMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIG1lc3NhZ2UgPSBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldFZhbGlkKHRydWUpDQorICAgICAgICAgICAgICAgIC5TZXRUZXh0KCJ0ZXh0IikNCisgICAgICAgICAgICAgICAgLkFkZFRleHRsaW5lcygiYSIpDQorICAgICAgICAgICAgICAgIC5BZGRUZXh0bGluZXMoImIiKQ0KKyAgICAgICAgICAgICAgICAuQWRkVGV4dGxpbmVzKCJjIikNCisgICAgICAgICAgICAgICAgLlNldE51bWJlcigweDEwMTAxMDEwMTApDQorICAgICAgICAgICAgICAgIC5BZGROdW1iZXJzKDEpDQorICAgICAgICAgICAgICAgIC5BZGROdW1iZXJzKDIpDQorICAgICAgICAgICAgICAgIC5BZGROdW1iZXJzKDMpDQorICAgICAgICAgICAgICAgIC5TZXRDaGlsZChUZXN0WG1sQ2hpbGQuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkT3B0aW9ucyhFbnVtT3B0aW9ucy5PTkUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2V0QmluYXJ5KEJ5dGVTdHJpbmcuQ29weUZyb20obmV3IGJ5dGVbMV0pKSkNCisgICAgICAgICAgICAgICAgLkFkZENoaWxkcmVuKFRlc3RYbWxNZXNzYWdlLlR5cGVzLkNoaWxkcmVuLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkT3B0aW9ucyhFbnVtT3B0aW9ucy5UV08pDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRCaW5hcnkoQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVsyXSkpKQ0KKyAgICAgICAgICAgICAgICAuQWRkQ2hpbGRyZW4oVGVzdFhtbE1lc3NhZ2UuVHlwZXMuQ2hpbGRyZW4uQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRPcHRpb25zKEVudW1PcHRpb25zLlRIUkVFKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2V0QmluYXJ5KEJ5dGVTdHJpbmcuQ29weUZyb20obmV3IGJ5dGVbM10pKSkNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvblRleHQsICIgZXh0ZW5zaW9uIHRleHQgdmFsdWUgISAiKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uTWVzc2FnZSwgbmV3IFRlc3RYbWxFeHRlbnNpb24uQnVpbGRlcigpLlNldE51bWJlcig0MikuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvbk51bWJlciwgMTAwKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uTnVtYmVyLCAxMDEpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25OdW1iZXIsIDEwMikNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvbkVudW0sIEVudW1PcHRpb25zLk9ORSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisNCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorICAgICAgICAgICAgbmV3IEJpbmFyeUZvcm1hdHRlcigpLlNlcmlhbGl6ZShtcywgbWVzc2FnZSk7DQorDQorICAgICAgICAgICAgbXMuUG9zaXRpb24gPSAwOw0KKyAgICAgICAgICAgIC8veW91IG5lZWQgdG8gcHJvdmlkZSB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5IGFzIGNvbnRleHQgdG8gdGhlIHNlcmlhbGl6ZXINCisgICAgICAgICAgICBCaW5hcnlGb3JtYXR0ZXIgYmZmID0gbmV3IEJpbmFyeUZvcm1hdHRlcihudWxsLCBuZXcgU3RyZWFtaW5nQ29udGV4dChTdHJlYW1pbmdDb250ZXh0U3RhdGVzLkFsbCwgcmVnaXN0cnkpKTsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBjb3B5ID0gKFRlc3RYbWxNZXNzYWdlKWJmZi5EZXNlcmlhbGl6ZShtcyk7DQorDQorICAgICAgICAgICAgLy8gQW5kIGFsbCBleHRlbnNpb25zIHdpbGwgYmUgZGVmaW5lZC4NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZSwgY29weSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQbGFpbkJ1aWxkZXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0VmFsaWQodHJ1ZSkNCisgICAgICAgICAgICAgICAgLlNldFRleHQoInRleHQiKQ0KKyAgICAgICAgICAgICAgICAuQWRkVGV4dGxpbmVzKCJhIikNCisgICAgICAgICAgICAgICAgLkFkZFRleHRsaW5lcygiYiIpDQorICAgICAgICAgICAgICAgIC5BZGRUZXh0bGluZXMoImMiKQ0KKyAgICAgICAgICAgICAgICAuU2V0TnVtYmVyKDB4MTAxMDEwMTAxMCkNCisgICAgICAgICAgICAgICAgLkFkZE51bWJlcnMoMSkNCisgICAgICAgICAgICAgICAgLkFkZE51bWJlcnMoMikNCisgICAgICAgICAgICAgICAgLkFkZE51bWJlcnMoMykNCisgICAgICAgICAgICAgICAgLlNldENoaWxkKFRlc3RYbWxDaGlsZC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRPcHRpb25zKEVudW1PcHRpb25zLk9ORSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRCaW5hcnkoQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVsxXSkpKQ0KKyAgICAgICAgICAgICAgICAuQWRkQ2hpbGRyZW4oVGVzdFhtbE1lc3NhZ2UuVHlwZXMuQ2hpbGRyZW4uQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRPcHRpb25zKEVudW1PcHRpb25zLlRXTykNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNldEJpbmFyeShCeXRlU3RyaW5nLkNvcHlGcm9tKG5ldyBieXRlWzJdKSkpDQorICAgICAgICAgICAgICAgIC5BZGRDaGlsZHJlbihUZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbi5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZE9wdGlvbnMoRW51bU9wdGlvbnMuVEhSRUUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRCaW5hcnkoQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVszXSkpKQ0KKyAgICAgICAgICAgICAgICA7DQorDQorICAgICAgICAgICAgTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKyAgICAgICAgICAgIG5ldyBCaW5hcnlGb3JtYXR0ZXIoKS5TZXJpYWxpemUobXMsIGJ1aWxkZXIpOw0KKw0KKyAgICAgICAgICAgIG1zLlBvc2l0aW9uID0gMDsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZS5CdWlsZGVyIGNvcHkgPSAoVGVzdFhtbE1lc3NhZ2UuQnVpbGRlciluZXcgQmluYXJ5Rm9ybWF0dGVyKCkuRGVzZXJpYWxpemUobXMpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChidWlsZGVyLkJ1aWxkKCksIGNvcHkuQnVpbGQoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RCdWlsZGVyV2l0aEV4dGVuc2lvbnMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0VmFsaWQodHJ1ZSkNCisgICAgICAgICAgICAgICAgLlNldFRleHQoInRleHQiKQ0KKyAgICAgICAgICAgICAgICAuQWRkVGV4dGxpbmVzKCJhIikNCisgICAgICAgICAgICAgICAgLkFkZFRleHRsaW5lcygiYiIpDQorICAgICAgICAgICAgICAgIC5BZGRUZXh0bGluZXMoImMiKQ0KKyAgICAgICAgICAgICAgICAuU2V0TnVtYmVyKDB4MTAxMDEwMTAxMCkNCisgICAgICAgICAgICAgICAgLkFkZE51bWJlcnMoMSkNCisgICAgICAgICAgICAgICAgLkFkZE51bWJlcnMoMikNCisgICAgICAgICAgICAgICAgLkFkZE51bWJlcnMoMykNCisgICAgICAgICAgICAgICAgLlNldENoaWxkKFRlc3RYbWxDaGlsZC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRPcHRpb25zKEVudW1PcHRpb25zLk9ORSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRCaW5hcnkoQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVsxXSkpKQ0KKyAgICAgICAgICAgICAgICAuQWRkQ2hpbGRyZW4oVGVzdFhtbE1lc3NhZ2UuVHlwZXMuQ2hpbGRyZW4uQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRPcHRpb25zKEVudW1PcHRpb25zLlRXTykNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNldEJpbmFyeShCeXRlU3RyaW5nLkNvcHlGcm9tKG5ldyBieXRlWzJdKSkpDQorICAgICAgICAgICAgICAgIC5BZGRDaGlsZHJlbihUZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbi5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZE9wdGlvbnMoRW51bU9wdGlvbnMuVEhSRUUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRCaW5hcnkoQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVszXSkpKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uVGV4dCwgIiBleHRlbnNpb24gdGV4dCB2YWx1ZSAhICIpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25NZXNzYWdlLCBuZXcgVGVzdFhtbEV4dGVuc2lvbi5CdWlsZGVyKCkuU2V0TnVtYmVyKDQyKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uTnVtYmVyLCAxMDApDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25OdW1iZXIsIDEwMSkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvbk51bWJlciwgMTAyKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uRW51bSwgRW51bU9wdGlvbnMuT05FKQ0KKyAgICAgICAgICAgICAgICA7DQorDQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisNCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorICAgICAgICAgICAgbmV3IEJpbmFyeUZvcm1hdHRlcigpLlNlcmlhbGl6ZShtcywgYnVpbGRlcik7DQorDQorICAgICAgICAgICAgbXMuUG9zaXRpb24gPSAwOw0KKyAgICAgICAgICAgIC8veW91IG5lZWQgdG8gcHJvdmlkZSB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5IGFzIGNvbnRleHQgdG8gdGhlIHNlcmlhbGl6ZXINCisgICAgICAgICAgICBCaW5hcnlGb3JtYXR0ZXIgYmZmID0gbmV3IEJpbmFyeUZvcm1hdHRlcihudWxsLCBuZXcgU3RyZWFtaW5nQ29udGV4dChTdHJlYW1pbmdDb250ZXh0U3RhdGVzLkFsbCwgcmVnaXN0cnkpKTsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZS5CdWlsZGVyIGNvcHkgPSAoVGVzdFhtbE1lc3NhZ2UuQnVpbGRlciliZmYuRGVzZXJpYWxpemUobXMpOw0KKw0KKyAgICAgICAgICAgIC8vIEFuZCBhbGwgZXh0ZW5zaW9ucyB3aWxsIGJlIGRlZmluZWQuDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGJ1aWxkZXIuQnVpbGQoKSwgY29weS5CdWlsZCgpKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1NlcnZpY2VUZXN0LmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9TZXJ2aWNlVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTI4Y2ExCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9TZXJ2aWNlVGVzdC5jcwpAQCAtMCwwICsxLDI2MiBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvczsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gVGVzdHMgZm9yIGdlbmVyYXRlZCBzZXJ2aWNlIGNsYXNzZXMuDQorICAgIC8vLyBUT0RPKGpvbnNrZWV0KTogQ29udmVydCB0aGUgbW9ja2luZyB0ZXN0cyB1c2luZyBSaGluby5Nb2Nrcy4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIFNlcnZpY2VUZXN0DQorICAgIHsNCisgICAgICAgIHByaXZhdGUgZGVsZWdhdGUgdm9pZCBBY3Rpb248VDEsIFQyPihUMSB0MSwgVDIgdDIpOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTWV0aG9kRGVzY3JpcHRvciBGb29EZXNjcmlwdG9yID0gVGVzdEdlbmVyaWNTZXJ2aWNlLkRlc2NyaXB0b3IuTWV0aG9kc1swXTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1ldGhvZERlc2NyaXB0b3IgQmFyRGVzY3JpcHRvciA9IFRlc3RHZW5lcmljU2VydmljZS5EZXNjcmlwdG9yLk1ldGhvZHNbMV07DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFJlcXVlc3RQcm90b3R5cGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RHZW5lcmljU2VydmljZSBzZXJ2aWNlID0gbmV3IFRlc3RTZXJ2aWNlSW1wbCgpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKHNlcnZpY2UuR2V0UmVxdWVzdFByb3RvdHlwZShGb29EZXNjcmlwdG9yKSwgRm9vUmVxdWVzdC5EZWZhdWx0SW5zdGFuY2UpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKHNlcnZpY2UuR2V0UmVxdWVzdFByb3RvdHlwZShCYXJEZXNjcmlwdG9yKSwgQmFyUmVxdWVzdC5EZWZhdWx0SW5zdGFuY2UpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRSZXNwb25zZVByb3RvdHlwZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEdlbmVyaWNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgVGVzdFNlcnZpY2VJbXBsKCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUoc2VydmljZS5HZXRSZXNwb25zZVByb3RvdHlwZShGb29EZXNjcmlwdG9yKSwgRm9vUmVzcG9uc2UuRGVmYXVsdEluc3RhbmNlKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShzZXJ2aWNlLkdldFJlc3BvbnNlUHJvdG90eXBlKEJhckRlc2NyaXB0b3IpLCBCYXJSZXNwb25zZS5EZWZhdWx0SW5zdGFuY2UpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBDYWxsTWV0aG9kRm9vKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBGb29SZXF1ZXN0IGZvb1JlcXVlc3QgPSBGb29SZXF1ZXN0LkNyZWF0ZUJ1aWxkZXIoKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEZvb1Jlc3BvbnNlIGZvb1Jlc3BvbnNlID0gRm9vUmVzcG9uc2UuQ3JlYXRlQnVpbGRlcigpLkJ1aWxkKCk7DQorICAgICAgICAgICAgSVJwY0NvbnRyb2xsZXIgY29udHJvbGxlciA9IG5ldyBScGNUZXN0Q29udHJvbGxlcigpOw0KKw0KKyAgICAgICAgICAgIGJvb2wgZm9vQ2FsbGVkID0gZmFsc2U7DQorDQorICAgICAgICAgICAgVGVzdEdlbmVyaWNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgVGVzdFNlcnZpY2VJbXBsKChyZXF1ZXN0LCByZXNwb25zZUFjdGlvbikgPT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShmb29SZXF1ZXN0LCByZXF1ZXN0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb29DYWxsZWQgPSB0cnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQWN0aW9uKGZvb1Jlc3BvbnNlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwsIGNvbnRyb2xsZXIpOw0KKw0KKyAgICAgICAgICAgIGJvb2wgZG9uZUhhbmRsZXJDYWxsZWQgPSBmYWxzZTsNCisgICAgICAgICAgICBBY3Rpb248SU1lc3NhZ2U+IGRvbmVIYW5kbGVyID0gKHJlc3BvbnNlID0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShmb29SZXNwb25zZSwgcmVzcG9uc2UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lSGFuZGxlckNhbGxlZCA9IHRydWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQorDQorICAgICAgICAgICAgc2VydmljZS5DYWxsTWV0aG9kKEZvb0Rlc2NyaXB0b3IsIGNvbnRyb2xsZXIsIGZvb1JlcXVlc3QsIGRvbmVIYW5kbGVyKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGRvbmVIYW5kbGVyQ2FsbGVkKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGZvb0NhbGxlZCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIENhbGxNZXRob2RCYXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEJhclJlcXVlc3QgYmFyUmVxdWVzdCA9IEJhclJlcXVlc3QuQ3JlYXRlQnVpbGRlcigpLkJ1aWxkKCk7DQorICAgICAgICAgICAgQmFyUmVzcG9uc2UgYmFyUmVzcG9uc2UgPSBCYXJSZXNwb25zZS5DcmVhdGVCdWlsZGVyKCkuQnVpbGQoKTsNCisgICAgICAgICAgICBJUnBjQ29udHJvbGxlciBjb250cm9sbGVyID0gbmV3IFJwY1Rlc3RDb250cm9sbGVyKCk7DQorDQorICAgICAgICAgICAgYm9vbCBiYXJDYWxsZWQgPSBmYWxzZTsNCisNCisgICAgICAgICAgICBUZXN0R2VuZXJpY1NlcnZpY2Ugc2VydmljZSA9IG5ldyBUZXN0U2VydmljZUltcGwobnVsbCwgKHJlcXVlc3QsIHJlc3BvbnNlQWN0aW9uKSA9Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKGJhclJlcXVlc3QsIHJlcXVlc3QpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhckNhbGxlZCA9IHRydWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VBY3Rpb24oYmFyUmVzcG9uc2UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29udHJvbGxlcik7DQorDQorICAgICAgICAgICAgYm9vbCBkb25lSGFuZGxlckNhbGxlZCA9IGZhbHNlOw0KKyAgICAgICAgICAgIEFjdGlvbjxJTWVzc2FnZT4gZG9uZUhhbmRsZXIgPSAocmVzcG9uc2UgPT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKGJhclJlc3BvbnNlLCByZXNwb25zZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVIYW5kbGVyQ2FsbGVkID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCisNCisgICAgICAgICAgICBzZXJ2aWNlLkNhbGxNZXRob2QoQmFyRGVzY3JpcHRvciwgY29udHJvbGxlciwgYmFyUmVxdWVzdCwgZG9uZUhhbmRsZXIpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoZG9uZUhhbmRsZXJDYWxsZWQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoYmFyQ2FsbGVkKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgR2VuZXJhdGVkU3R1YkZvb0NhbGwoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIElScGNDaGFubmVsIGNoYW5uZWwgPSBuZXcgUnBjVGVzdENoYW5uZWwoKTsNCisgICAgICAgICAgICBJUnBjQ29udHJvbGxlciBjb250cm9sbGVyID0gbmV3IFJwY1Rlc3RDb250cm9sbGVyKCk7DQorICAgICAgICAgICAgVGVzdEdlbmVyaWNTZXJ2aWNlIHNlcnZpY2UgPSBUZXN0R2VuZXJpY1NlcnZpY2UuQ3JlYXRlU3R1YihjaGFubmVsKTsNCisgICAgICAgICAgICBGb29SZXNwb25zZSBmb29SZXNwb25zZSA9IG51bGw7DQorICAgICAgICAgICAgQWN0aW9uPEZvb1Jlc3BvbnNlPiBkb25lSGFuZGxlciA9IHIgPT4gZm9vUmVzcG9uc2UgPSByOw0KKw0KKyAgICAgICAgICAgIHNlcnZpY2UuRm9vKGNvbnRyb2xsZXIsIEZvb1JlcXVlc3QuRGVmYXVsdEluc3RhbmNlLCBkb25lSGFuZGxlcik7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChmb29SZXNwb25zZSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoY29udHJvbGxlci5GYWlsZWQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBHZW5lcmF0ZWRTdHViQmFyQ2FsbEZhaWxzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJUnBjQ2hhbm5lbCBjaGFubmVsID0gbmV3IFJwY1Rlc3RDaGFubmVsKCk7DQorICAgICAgICAgICAgSVJwY0NvbnRyb2xsZXIgY29udHJvbGxlciA9IG5ldyBScGNUZXN0Q29udHJvbGxlcigpOw0KKyAgICAgICAgICAgIFRlc3RHZW5lcmljU2VydmljZSBzZXJ2aWNlID0gVGVzdEdlbmVyaWNTZXJ2aWNlLkNyZWF0ZVN0dWIoY2hhbm5lbCk7DQorICAgICAgICAgICAgQmFyUmVzcG9uc2UgYmFyUmVzcG9uc2UgPSBudWxsOw0KKyAgICAgICAgICAgIEFjdGlvbjxCYXJSZXNwb25zZT4gZG9uZUhhbmRsZXIgPSByID0+IGJhclJlc3BvbnNlID0gcjsNCisNCisgICAgICAgICAgICBzZXJ2aWNlLkJhcihjb250cm9sbGVyLCBCYXJSZXF1ZXN0LkRlZmF1bHRJbnN0YW5jZSwgZG9uZUhhbmRsZXIpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoYmFyUmVzcG9uc2UpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoY29udHJvbGxlci5GYWlsZWQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI3JlZ2lvbiBScGNUZXN0Q29udHJvbGxlcg0KKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBScGNUZXN0Q29udHJvbGxlciA6IElScGNDb250cm9sbGVyDQorICAgICAgICB7DQorICAgICAgICAgICAgcHVibGljIHN0cmluZyBUZXN0RmFpbGVkUmVhc29uIHsgZ2V0OyBzZXQ7IH0NCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBUZXN0Q2FuY2VsbGVkIHsgZ2V0OyBzZXQ7IH0NCisgICAgICAgICAgICBwdWJsaWMgQWN0aW9uPG9iamVjdD4gVGVzdENhbmNlbGxlZENhbGxiYWNrIHsgZ2V0OyBzZXQ7IH0NCisNCisgICAgICAgICAgICB2b2lkIElScGNDb250cm9sbGVyLlJlc2V0KCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFRlc3RGYWlsZWRSZWFzb24gPSBudWxsOw0KKyAgICAgICAgICAgICAgICBUZXN0Q2FuY2VsbGVkID0gZmFsc2U7DQorICAgICAgICAgICAgICAgIFRlc3RDYW5jZWxsZWRDYWxsYmFjayA9IG51bGw7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGJvb2wgSVJwY0NvbnRyb2xsZXIuRmFpbGVkDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gVGVzdEZhaWxlZFJlYXNvbiAhPSBudWxsOyB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHN0cmluZyBJUnBjQ29udHJvbGxlci5FcnJvclRleHQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBUZXN0RmFpbGVkUmVhc29uOyB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHZvaWQgSVJwY0NvbnRyb2xsZXIuU3RhcnRDYW5jZWwoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVGVzdENhbmNlbGxlZCA9IHRydWU7DQorICAgICAgICAgICAgICAgIGlmIChUZXN0Q2FuY2VsbGVkQ2FsbGJhY2sgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgIFRlc3RDYW5jZWxsZWRDYWxsYmFjayh0aGlzKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgdm9pZCBJUnBjQ29udHJvbGxlci5TZXRGYWlsZWQoc3RyaW5nIHJlYXNvbikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFRlc3RGYWlsZWRSZWFzb24gPSByZWFzb247DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGJvb2wgSVJwY0NvbnRyb2xsZXIuSXNDYW5jZWxlZCgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVGVzdENhbmNlbGxlZDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgdm9pZCBJUnBjQ29udHJvbGxlci5Ob3RpZnlPbkNhbmNlbChBY3Rpb248b2JqZWN0PiBjYWxsYmFjaykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFRlc3RDYW5jZWxsZWRDYWxsYmFjayA9IGNhbGxiYWNrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisgICAgICAgICNyZWdpb24gUnBjVGVzdENoYW5uZWwNCisgICAgICAgIHByaXZhdGUgY2xhc3MgUnBjVGVzdENoYW5uZWwgOiBJUnBjQ2hhbm5lbA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHB1YmxpYyBNZXRob2REZXNjcmlwdG9yIFRlc3RNZXRob2RDYWxsZWQgeyBnZXQ7IHNldDsgfQ0KKw0KKyAgICAgICAgICAgIHZvaWQgSVJwY0NoYW5uZWwuQ2FsbE1ldGhvZChNZXRob2REZXNjcmlwdG9yIG1ldGhvZCwgSVJwY0NvbnRyb2xsZXIgY29udHJvbGxlciwgSU1lc3NhZ2UgcmVxdWVzdCwgSU1lc3NhZ2UgcmVzcG9uc2VQcm90b3R5cGUsIEFjdGlvbjxJTWVzc2FnZT4gZG9uZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFRlc3RNZXRob2RDYWxsZWQgPSBtZXRob2Q7DQorICAgICAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBkb25lKEZvb1Jlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLlNldEZhaWxlZChlLk1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICAgICAgI3JlZ2lvbiBUZXN0U2VydmljZUltcGwNCisgICAgICAgIHByaXZhdGUgY2xhc3MgVGVzdFNlcnZpY2VJbXBsIDogVGVzdEdlbmVyaWNTZXJ2aWNlDQorICAgICAgICB7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBY3Rpb248Rm9vUmVxdWVzdCwgQWN0aW9uPEZvb1Jlc3BvbnNlPj4gZm9vSGFuZGxlcjsNCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEFjdGlvbjxCYXJSZXF1ZXN0LCBBY3Rpb248QmFyUmVzcG9uc2U+PiBiYXJIYW5kbGVyOw0KKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSVJwY0NvbnRyb2xsZXIgZXhwZWN0ZWRDb250cm9sbGVyOw0KKw0KKyAgICAgICAgICAgIGludGVybmFsIFRlc3RTZXJ2aWNlSW1wbCgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpbnRlcm5hbCBUZXN0U2VydmljZUltcGwoQWN0aW9uPEZvb1JlcXVlc3QsIEFjdGlvbjxGb29SZXNwb25zZT4+IGZvb0hhbmRsZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjxCYXJSZXF1ZXN0LCBBY3Rpb248QmFyUmVzcG9uc2U+PiBiYXJIYW5kbGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUnBjQ29udHJvbGxlciBleHBlY3RlZENvbnRyb2xsZXIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aGlzLmZvb0hhbmRsZXIgPSBmb29IYW5kbGVyOw0KKyAgICAgICAgICAgICAgICB0aGlzLmJhckhhbmRsZXIgPSBiYXJIYW5kbGVyOw0KKyAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdGVkQ29udHJvbGxlciA9IGV4cGVjdGVkQ29udHJvbGxlcjsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRm9vKElScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsIEZvb1JlcXVlc3QgcmVxdWVzdCwgQWN0aW9uPEZvb1Jlc3BvbnNlPiBkb25lKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUoZXhwZWN0ZWRDb250cm9sbGVyLCBjb250cm9sbGVyKTsNCisgICAgICAgICAgICAgICAgZm9vSGFuZGxlcihyZXF1ZXN0LCBkb25lKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQmFyKElScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsIEJhclJlcXVlc3QgcmVxdWVzdCwgQWN0aW9uPEJhclJlc3BvbnNlPiBkb25lKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUoZXhwZWN0ZWRDb250cm9sbGVyLCBjb250cm9sbGVyKTsNCisgICAgICAgICAgICAgICAgYmFySGFuZGxlcihyZXF1ZXN0LCBkb25lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICAjZW5kcmVnaW9uDQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0Q29ybmVyQ2FzZXMuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RDb3JuZXJDYXNlcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmU0ZTFkCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0Q29ybmVyQ2FzZXMuY3MKQEAgLTAsMCArMSwzOCBAQAor77u/dXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KK3VzaW5nIFVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdENvcm5lckNhc2VzDQorICAgIHsNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFJvdW5kVHJpcE5lZ2F0aXZlRW51bXMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE5lZ2F0aXZlRW51bU1lc3NhZ2UgbXNnID0gTmVnYXRpdmVFbnVtTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldFZhbHVlKE5lZ2F0aXZlRW51bS5NaW51c09uZSkgLy8xMQ0KKyAgICAgICAgICAgICAgICAuQWRkVmFsdWVzKE5lZ2F0aXZlRW51bS5aZXJvKSAvLzINCisgICAgICAgICAgICAgICAgLkFkZFZhbHVlcyhOZWdhdGl2ZUVudW0uTWludXNPbmUpIC8vMTENCisgICAgICAgICAgICAgICAgLkFkZFZhbHVlcyhOZWdhdGl2ZUVudW0uRml2ZUJlbG93KSAvLzExDQorICAgICAgICAgICAgICAgIC8vMg0KKyAgICAgICAgICAgICAgICAuQWRkUGFja2VkVmFsdWVzKE5lZ2F0aXZlRW51bS5aZXJvKSAvLzENCisgICAgICAgICAgICAgICAgLkFkZFBhY2tlZFZhbHVlcyhOZWdhdGl2ZUVudW0uTWludXNPbmUpIC8vMTANCisgICAgICAgICAgICAgICAgLkFkZFBhY2tlZFZhbHVlcyhOZWdhdGl2ZUVudW0uRml2ZUJlbG93KSAvLzEwDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1OCwgbXNnLlNlcmlhbGl6ZWRTaXplKTsNCisNCisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVs1OF07DQorICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoYnl0ZXMpOw0KKw0KKyAgICAgICAgICAgIG1zZy5Xcml0ZVRvKG91dHB1dCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG91dHB1dC5TcGFjZUxlZnQpOw0KKw0KKyAgICAgICAgICAgIE5lZ2F0aXZlRW51bU1lc3NhZ2UgY29weSA9IE5lZ2F0aXZlRW51bU1lc3NhZ2UuUGFyc2VGcm9tKGJ5dGVzKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobXNnLCBjb3B5KTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RNaW1lTWVzc2FnZUZvcm1hdHMuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RNaW1lTWVzc2FnZUZvcm1hdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2ZjU2NwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdE1pbWVNZXNzYWdlRm9ybWF0cy5jcwpAQCAtMCwwICsxLDI2NCBAQAor77u/dXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb247DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLkh0dHA7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zOw0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdE1pbWVNZXNzYWdlRm9ybWF0cw0KKyAgICB7DQorICAgICAgICAvLyBUaGVyZSBpcyBhIHdob2xlIGhvc3Qgb2YgdmFyaW91cyBqc29uIG1pbWUgdHlwZXMgaW4gdXNlIGFyb3VuZCB0aGUgbmV0LCB0aGlzIGlzIHRoZSBzZXQgd2UgYWNjZXB0Li4uDQorICAgICAgICByZWFkb25seSBJRW51bWVyYWJsZTxzdHJpbmc+IEpzb25UeXBlcyA9IG5ldyBzdHJpbmdbXSB7ICJhcHBsaWNhdGlvbi9qc29uIiwgImFwcGxpY2F0aW9uL3gtanNvbiIsICJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCAidGV4dC9qYXZhc2NyaXB0IiwgInRleHQveC1qYXZhc2NyaXB0IiwgInRleHQveC1qc29uIiwgInRleHQvanNvbiIgfTsNCisgICAgICAgIHJlYWRvbmx5IElFbnVtZXJhYmxlPHN0cmluZz4gWG1sVHlwZXMgPSBuZXcgc3RyaW5nW10geyAidGV4dC94bWwiLCAiYXBwbGljYXRpb24veG1sIiB9Ow0KKyAgICAgICAgcmVhZG9ubHkgSUVudW1lcmFibGU8c3RyaW5nPiBQcm90b2J1ZlR5cGVzID0gbmV3IHN0cmluZ1tdIHsgImFwcGxpY2F0aW9uL2JpbmFyeSIsICJhcHBsaWNhdGlvbi94LXByb3RvYnVmIiwgImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUucHJvdG9idWYiIH07DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RSZWFkSnNvbk1pbWVUeXBlcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHR5cGUgaW4gSnNvblR5cGVzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgNCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGb3JtYXRGYWN0b3J5LkNyZWF0ZUlucHV0U3RyZWFtKG5ldyBNZXNzYWdlRm9ybWF0T3B0aW9ucygpLCB0eXBlLCBTdHJlYW0uTnVsbCkNCisgICAgICAgICAgICAgICAgICAgIGlzIEpzb25Gb3JtYXRSZWFkZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKA0KKyAgICAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0RmFjdG9yeS5DcmVhdGVJbnB1dFN0cmVhbShuZXcgTWVzc2FnZUZvcm1hdE9wdGlvbnMoKSB7IERlZmF1bHRDb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi9qc29uIiB9LCBudWxsLCBTdHJlYW0uTnVsbCkNCisgICAgICAgICAgICAgICAgaXMgSnNvbkZvcm1hdFJlYWRlcik7DQorICAgICAgICB9DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RXcml0ZUpzb25NaW1lVHlwZXMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyB0eXBlIGluIEpzb25UeXBlcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoDQorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0RmFjdG9yeS5DcmVhdGVPdXRwdXRTdHJlYW0obmV3IE1lc3NhZ2VGb3JtYXRPcHRpb25zKCksIHR5cGUsIFN0cmVhbS5OdWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgaXMgSnNvbkZvcm1hdFdyaXRlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoDQorICAgICAgICAgICAgICAgIE1lc3NhZ2VGb3JtYXRGYWN0b3J5LkNyZWF0ZU91dHB1dFN0cmVhbShuZXcgTWVzc2FnZUZvcm1hdE9wdGlvbnMoKSB7IERlZmF1bHRDb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi9qc29uIiB9LCBudWxsLCBTdHJlYW0uTnVsbCkNCisgICAgICAgICAgICAgICAgaXMgSnNvbkZvcm1hdFdyaXRlcik7DQorICAgICAgICB9DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RSZWFkWG1sTWltZVR5cGVzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgdHlwZSBpbiBYbWxUeXBlcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoDQorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0RmFjdG9yeS5DcmVhdGVJbnB1dFN0cmVhbShuZXcgTWVzc2FnZUZvcm1hdE9wdGlvbnMoKSwgdHlwZSwgU3RyZWFtLk51bGwpDQorICAgICAgICAgICAgICAgICAgICBpcyBYbWxGb3JtYXRSZWFkZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKA0KKyAgICAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0RmFjdG9yeS5DcmVhdGVJbnB1dFN0cmVhbShuZXcgTWVzc2FnZUZvcm1hdE9wdGlvbnMoKSB7IERlZmF1bHRDb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94bWwiIH0sIG51bGwsIFN0cmVhbS5OdWxsKQ0KKyAgICAgICAgICAgICAgICBpcyBYbWxGb3JtYXRSZWFkZXIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0V3JpdGVYbWxNaW1lVHlwZXMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyB0eXBlIGluIFhtbFR5cGVzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgNCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGb3JtYXRGYWN0b3J5LkNyZWF0ZU91dHB1dFN0cmVhbShuZXcgTWVzc2FnZUZvcm1hdE9wdGlvbnMoKSwgdHlwZSwgU3RyZWFtLk51bGwpDQorICAgICAgICAgICAgICAgICAgICBpcyBYbWxGb3JtYXRXcml0ZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKA0KKyAgICAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0RmFjdG9yeS5DcmVhdGVPdXRwdXRTdHJlYW0obmV3IE1lc3NhZ2VGb3JtYXRPcHRpb25zKCkgeyBEZWZhdWx0Q29udGVudFR5cGUgPSAiYXBwbGljYXRpb24veG1sIiB9LCBudWxsLCBTdHJlYW0uTnVsbCkNCisgICAgICAgICAgICAgICAgaXMgWG1sRm9ybWF0V3JpdGVyKTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFJlYWRQcm90b01pbWVUeXBlcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHR5cGUgaW4gUHJvdG9idWZUeXBlcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoDQorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0RmFjdG9yeS5DcmVhdGVJbnB1dFN0cmVhbShuZXcgTWVzc2FnZUZvcm1hdE9wdGlvbnMoKSwgdHlwZSwgU3RyZWFtLk51bGwpDQorICAgICAgICAgICAgICAgICAgICBpcyBDb2RlZElucHV0U3RyZWFtKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgNCisgICAgICAgICAgICAgICAgTWVzc2FnZUZvcm1hdEZhY3RvcnkuQ3JlYXRlSW5wdXRTdHJlYW0obmV3IE1lc3NhZ2VGb3JtYXRPcHRpb25zKCkgeyBEZWZhdWx0Q29udGVudFR5cGUgPSAiYXBwbGljYXRpb24vdm5kLmdvb2dsZS5wcm90b2J1ZiIgfSwgbnVsbCwgU3RyZWFtLk51bGwpDQorICAgICAgICAgICAgICAgIGlzIENvZGVkSW5wdXRTdHJlYW0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0V3JpdGVQcm90b01pbWVUeXBlcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHR5cGUgaW4gUHJvdG9idWZUeXBlcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoDQorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0RmFjdG9yeS5DcmVhdGVPdXRwdXRTdHJlYW0obmV3IE1lc3NhZ2VGb3JtYXRPcHRpb25zKCksIHR5cGUsIFN0cmVhbS5OdWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgaXMgQ29kZWRPdXRwdXRTdHJlYW0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKA0KKyAgICAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0RmFjdG9yeS5DcmVhdGVPdXRwdXRTdHJlYW0obmV3IE1lc3NhZ2VGb3JtYXRPcHRpb25zKCkgeyBEZWZhdWx0Q29udGVudFR5cGUgPSAiYXBwbGljYXRpb24vdm5kLmdvb2dsZS5wcm90b2J1ZiIgfSwgbnVsbCwgU3RyZWFtLk51bGwpDQorICAgICAgICAgICAgICAgIGlzIENvZGVkT3V0cHV0U3RyZWFtKTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE1lcmdlRnJvbUpzb25UeXBlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBtc2cgPSBFeHRlbnNpb25zLk1lcmdlRnJvbShuZXcgVGVzdFhtbE1lc3NhZ2UuQnVpbGRlcigpLA0KKyAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZUZvcm1hdE9wdGlvbnMoKSwgImFwcGxpY2F0aW9uL2pzb24iLCBuZXcgTWVtb3J5U3RyZWFtKEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoDQorICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25zLlRvSnNvbihUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0VGV4dCgiYSIpLlNldE51bWJlcigxKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgKSkpDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiYSIsIG1zZy5UZXh0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgbXNnLk51bWJlcik7DQorICAgICAgICB9DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RNZXJnZUZyb21YbWxUeXBlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBtc2cgPSBFeHRlbnNpb25zLk1lcmdlRnJvbShuZXcgVGVzdFhtbE1lc3NhZ2UuQnVpbGRlcigpLA0KKyAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZUZvcm1hdE9wdGlvbnMoKSwgImFwcGxpY2F0aW9uL3htbCIsIG5ldyBNZW1vcnlTdHJlYW0oRW5jb2RpbmcuVVRGOC5HZXRCeXRlcygNCisgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbnMuVG9YbWwoVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldFRleHQoImEiKS5TZXROdW1iZXIoMSkuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgICAgICkpKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImEiLCBtc2cuVGV4dCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG1zZy5OdW1iZXIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TWVyZ2VGcm9tUHJvdG9UeXBlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBtc2cgPSBFeHRlbnNpb25zLk1lcmdlRnJvbShuZXcgVGVzdFhtbE1lc3NhZ2UuQnVpbGRlcigpLA0KKyAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZUZvcm1hdE9wdGlvbnMoKSwgImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUucHJvdG9idWYiLCBuZXcgTWVtb3J5U3RyZWFtKA0KKyAgICAgICAgICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldFRleHQoImEiKS5TZXROdW1iZXIoMSkuQnVpbGQoKS5Ub0J5dGVBcnJheSgpDQorICAgICAgICAgICAgICAgICAgICApKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImEiLCBtc2cuVGV4dCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG1zZy5OdW1iZXIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0V3JpdGVUb0pzb25UeXBlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorICAgICAgICAgICAgRXh0ZW5zaW9ucy5Xcml0ZVRvKFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRUZXh0KCJhIikuU2V0TnVtYmVyKDEpLkJ1aWxkKCksDQorICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdlRm9ybWF0T3B0aW9ucygpLCAiYXBwbGljYXRpb24vanNvbiIsIG1zKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQCJ7IiJ0ZXh0IiI6IiJhIiIsIiJudW1iZXIiIjoxfSIsIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKG1zLlRvQXJyYXkoKSwgMCwgKGludCltcy5MZW5ndGgpKTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFdyaXRlVG9YbWxUeXBlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorICAgICAgICAgICAgRXh0ZW5zaW9ucy5Xcml0ZVRvKFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRUZXh0KCJhIikuU2V0TnVtYmVyKDEpLkJ1aWxkKCksDQorICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdlRm9ybWF0T3B0aW9ucygpLCAiYXBwbGljYXRpb24veG1sIiwgbXMpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiPHJvb3Q+PHRleHQ+YTwvdGV4dD48bnVtYmVyPjE8L251bWJlcj48L3Jvb3Q+IiwgRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcobXMuVG9BcnJheSgpLCAwLCAoaW50KW1zLkxlbmd0aCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0V3JpdGVUb1Byb3RvVHlwZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKyAgICAgICAgICAgIEV4dGVuc2lvbnMuV3JpdGVUbyhUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0VGV4dCgiYSIpLlNldE51bWJlcigxKS5CdWlsZCgpLA0KKyAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZUZvcm1hdE9wdGlvbnMoKSwgImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUucHJvdG9idWYiLCBtcyk7DQorDQorICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldFRleHQoImEiKS5TZXROdW1iZXIoMSkuQnVpbGQoKS5Ub0J5dGVBcnJheSgpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwoYnl0ZXMsIG1zLlRvQXJyYXkoKSk7DQorICAgICAgICB9DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RYbWxSZWFkZXJPcHRpb25zKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorICAgICAgICAgICAgWG1sRm9ybWF0V3JpdGVyLkNyZWF0ZUluc3RhbmNlKG1zKQ0KKyAgICAgICAgICAgICAgICAuU2V0T3B0aW9ucyhYbWxXcml0ZXJPcHRpb25zLk91dHB1dE5lc3RlZEFycmF5cykNCisgICAgICAgICAgICAgICAgLldyaXRlTWVzc2FnZSgibXktcm9vdC1ub2RlIiwgVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldFRleHQoImEiKS5BZGROdW1iZXJzKDEpLkFkZE51bWJlcnMoMikuQnVpbGQoKSk7DQorICAgICAgICAgICAgbXMuUG9zaXRpb24gPSAwOw0KKw0KKyAgICAgICAgICAgIE1lc3NhZ2VGb3JtYXRPcHRpb25zIG9wdGlvbnMgPSBuZXcgTWVzc2FnZUZvcm1hdE9wdGlvbnMoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgWG1sUmVhZGVyT3B0aW9ucyA9IFhtbFJlYWRlck9wdGlvbnMuUmVhZE5lc3RlZEFycmF5cywNCisgICAgICAgICAgICAgICAgWG1sUmVhZGVyUm9vdEVsZW1lbnROYW1lID0gIm15LXJvb3Qtbm9kZSINCisgICAgICAgICAgICB9Ow0KKw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIG1zZyA9IEV4dGVuc2lvbnMuTWVyZ2VGcm9tKG5ldyBUZXN0WG1sTWVzc2FnZS5CdWlsZGVyKCksDQorICAgICAgICAgICAgICAgIG9wdGlvbnMsICJhcHBsaWNhdGlvbi94bWwiLCBtcykNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJhIiwgbXNnLlRleHQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBtc2cuTnVtYmVyc0xpc3RbMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtc2cuTnVtYmVyc0xpc3RbMV0pOw0KKw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0WG1sV3JpdGVyT3B0aW9ucygpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UgbWVzc2FnZSA9IFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRUZXh0KCJhIikuQWRkTnVtYmVycygxKS5BZGROdW1iZXJzKDIpLkJ1aWxkKCk7DQorICAgICAgICAgICAgTWVzc2FnZUZvcm1hdE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBNZXNzYWdlRm9ybWF0T3B0aW9ucygpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBYbWxXcml0ZXJPcHRpb25zID0gWG1sV3JpdGVyT3B0aW9ucy5PdXRwdXROZXN0ZWRBcnJheXMsDQorICAgICAgICAgICAgICAgIFhtbFdyaXRlclJvb3RFbGVtZW50TmFtZSA9ICJyb290LW5vZGUiDQorICAgICAgICAgICAgfTsNCisNCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorICAgICAgICAgICAgRXh0ZW5zaW9ucy5Xcml0ZVRvKG1lc3NhZ2UsIG9wdGlvbnMsICJhcHBsaWNhdGlvbi94bWwiLCBtcyk7DQorICAgICAgICAgICAgbXMuUG9zaXRpb24gPSAwOw0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBYbWxGb3JtYXRSZWFkZXIuQ3JlYXRlSW5zdGFuY2UobXMpDQorICAgICAgICAgICAgICAgIC5TZXRPcHRpb25zKFhtbFJlYWRlck9wdGlvbnMuUmVhZE5lc3RlZEFycmF5cykNCisgICAgICAgICAgICAgICAgLk1lcmdlKCJyb290LW5vZGUiLCBidWlsZGVyKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImEiLCBidWlsZGVyLlRleHQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBidWlsZGVyLk51bWJlcnNMaXN0WzBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgYnVpbGRlci5OdW1iZXJzTGlzdFsxXSk7DQorICAgICAgICB9DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RKc29uRm9ybWF0dGVkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorICAgICAgICAgICAgRXh0ZW5zaW9ucy5Xcml0ZVRvKFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRUZXh0KCJhIikuU2V0TnVtYmVyKDEpLkJ1aWxkKCksDQorICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdlRm9ybWF0T3B0aW9ucygpIHsgRm9ybWF0dGVkT3V0cHV0ID0gdHJ1ZSB9LCAiYXBwbGljYXRpb24vanNvbiIsIG1zKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIntcclxuICAgIFwidGV4dFwiOiBcImFcIixcclxuICAgIFwibnVtYmVyXCI6IDFcclxufSIsIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKG1zLlRvQXJyYXkoKSwgMCwgKGludCltcy5MZW5ndGgpKTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFhtbEZvcm1hdHRlZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKyAgICAgICAgICAgIEV4dGVuc2lvbnMuV3JpdGVUbyhUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0VGV4dCgiYSIpLlNldE51bWJlcigxKS5CdWlsZCgpLA0KKyAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZUZvcm1hdE9wdGlvbnMoKSB7IEZvcm1hdHRlZE91dHB1dCA9IHRydWUgfSwgImFwcGxpY2F0aW9uL3htbCIsIG1zKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjxyb290PlxyXG4gICAgPHRleHQ+YTwvdGV4dD5cclxuICAgIDxudW1iZXI+MTwvbnVtYmVyPlxyXG48L3Jvb3Q+IiwgRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcobXMuVG9BcnJheSgpLCAwLCAoaW50KW1zLkxlbmd0aCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UmVhZEN1c3RvbU1pbWVUeXBlcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBuZXcgTWVzc2FnZUZvcm1hdE9wdGlvbnMoKTsNCisgICAgICAgICAgICAvL1JlbW92ZSBleGlzdGluZyBtaW1lLXR5cGUgbWFwcGluZ3MNCisgICAgICAgICAgICBvcHRpb25zLk1pbWVJbnB1dFR5cGVzLkNsZWFyKCk7DQorICAgICAgICAgICAgLy9BZGQgb3VyIG93bg0KKyAgICAgICAgICAgIG9wdGlvbnMuTWltZUlucHV0VHlwZXMuQWRkKCItY3VzdG9tLVhNTC1taW1lLXR5cGUtIiwgWG1sRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgb3B0aW9ucy5NaW1lSW5wdXRUeXBlcy5Db3VudCk7DQorDQorICAgICAgICAgICAgU3RyZWFtIHhtbFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oRW5jb2RpbmcuVVRGOC5HZXRCeXRlcygNCisgICAgICAgICAgICAgICAgRXh0ZW5zaW9ucy5Ub1htbChUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0VGV4dCgiYSIpLlNldE51bWJlcigxKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICApKTsNCisNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBtc2cgPSBFeHRlbnNpb25zLk1lcmdlRnJvbShuZXcgVGVzdFhtbE1lc3NhZ2UuQnVpbGRlcigpLA0KKyAgICAgICAgICAgICAgICBvcHRpb25zLCAiLWN1c3RvbS1YTUwtbWltZS10eXBlLSIsIHhtbFN0cmVhbSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJhIiwgbXNnLlRleHQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBtc2cuTnVtYmVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFdyaXRlVG9DdXN0b21UeXBlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IG5ldyBNZXNzYWdlRm9ybWF0T3B0aW9ucygpOw0KKyAgICAgICAgICAgIC8vUmVtb3ZlIGV4aXN0aW5nIG1pbWUtdHlwZSBtYXBwaW5ncw0KKyAgICAgICAgICAgIG9wdGlvbnMuTWltZU91dHB1dFR5cGVzLkNsZWFyKCk7DQorICAgICAgICAgICAgLy9BZGQgb3VyIG93bg0KKyAgICAgICAgICAgIG9wdGlvbnMuTWltZU91dHB1dFR5cGVzLkFkZCgiLWN1c3RvbS1YTUwtbWltZS10eXBlLSIsIFhtbEZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZSk7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG9wdGlvbnMuTWltZU91dHB1dFR5cGVzLkNvdW50KTsNCisNCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorICAgICAgICAgICAgRXh0ZW5zaW9ucy5Xcml0ZVRvKFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRUZXh0KCJhIikuU2V0TnVtYmVyKDEpLkJ1aWxkKCksDQorICAgICAgICAgICAgICAgIG9wdGlvbnMsICItY3VzdG9tLVhNTC1taW1lLXR5cGUtIiwgbXMpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiPHJvb3Q+PHRleHQ+YTwvdGV4dD48bnVtYmVyPjE8L251bWJlcj48L3Jvb3Q+IiwgRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcobXMuVG9BcnJheSgpLCAwLCAoaW50KW1zLkxlbmd0aCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdENTaGFycE9wdGlvbnNQcm90b0ZpbGUuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RDU2hhcnBPcHRpb25zUHJvdG9GaWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjODE5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RDU2hhcnBPcHRpb25zUHJvdG9GaWxlLmNzCkBAIC0wLDAgKzEsNDI2IEBACisvLyBHZW5lcmF0ZWQgYnkgUHJvdG9HZW4sIFZlcnNpb249Mi40LjEuNTU1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTU1ZjcxMjUyMzRiZWI1ODkuICBETyBOT1QgRURJVCENCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxDQorI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KKw0KK3VzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zIHsNCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBVbml0VGVzdENTaGFycE9wdGlvbnNQcm90b0ZpbGUgew0KKyAgDQorICAgICNyZWdpb24gRXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbg0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgew0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBTdGF0aWMgdmFyaWFibGVzDQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT3B0aW9uc01lc3NhZ2VfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbnNNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PcHRpb25zTWVzc2FnZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09wdGlvbnNNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBEZXNjcmlwdG9yDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIHByaXZhdGUgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsNCisgICAgDQorICAgIHN0YXRpYyBVbml0VGVzdENTaGFycE9wdGlvbnNQcm90b0ZpbGUoKSB7DQorICAgICAgYnl0ZVtdIGRlc2NyaXB0b3JEYXRhID0gZ2xvYmFsOjpTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKA0KKyAgICAgICAgICBzdHJpbmcuQ29uY2F0KA0KKyAgICAgICAgICAgICJDaTFuYjI5bmJHVXZjSEp2ZEc5aWRXWXZkVzVwZEhSbGMzUmZZM05vWVhKd1gyOXdkR2x2Ym5NdWNISnYiLCANCisgICAgICAgICAgICAiZEc4U0VYQnliM1J2WW5WbVgzVnVhWFIwWlhOMEdpUm5iMjluYkdVdmNISnZkRzlpZFdZdlkzTm9ZWEp3IiwgDQorICAgICAgICAgICAgIlgyOXdkR2x2Ym5NdWNISnZkRzhpWGdvT1QzQjBhVzl1YzAxbGMzTmhaMlVTRGdvR2JtOXliV0ZzR0FFZyIsIA0KKyAgICAgICAgICAgICJBU2dKRWhjS0QyOXdkR2x2Ym5OZmJXVnpjMkZuWlJnQ0lBRW9DUklqQ2dwamRYTjBiMjFwZW1Wa0dBTWciLCANCisgICAgICAgICAgICAiQVNnSlFnL0NQZ3dLQ2tOMWMzUnZiVTVoYldWQ1JzSStRd29oUjI5dloyeGxMbEJ5YjNSdlkyOXNRblZtIiwgDQorICAgICAgICAgICAgIlptVnljeTVVWlhOMFVISnZkRzl6RWg1VmJtbDBWR1Z6ZEVOVGFHRnljRTl3ZEdsdmJuTlFjbTkwYjBacCIsIA0KKyAgICAgICAgICAiYkdVPSIpKTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyIGFzc2lnbmVyID0gZGVsZWdhdGUocGJkOjpGaWxlRGVzY3JpcHRvciByb290KSB7DQorICAgICAgICBkZXNjcmlwdG9yID0gcm9vdDsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT3B0aW9uc01lc3NhZ2VfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT3B0aW9uc01lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbnNNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PcHRpb25zTWVzc2FnZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09wdGlvbnNNZXNzYWdlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiTm9ybWFsIiwgIk9wdGlvbnNNZXNzYWdlXyIsICJDdXN0b21OYW1lIiwgfSk7DQorICAgICAgICBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICByZXR1cm4gcmVnaXN0cnk7DQorICAgICAgfTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbShkZXNjcmlwdG9yRGF0YSwNCisgICAgICAgICAgbmV3IHBiZDo6RmlsZURlc2NyaXB0b3JbXSB7DQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuRGVzY3JpcHRvciwgDQorICAgICAgICAgIH0sIGFzc2lnbmVyKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgfQ0KKyAgI3JlZ2lvbiBNZXNzYWdlcw0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBPcHRpb25zTWVzc2FnZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPE9wdGlvbnNNZXNzYWdlLCBPcHRpb25zTWVzc2FnZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgT3B0aW9uc01lc3NhZ2UoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgT3B0aW9uc01lc3NhZ2UgZGVmYXVsdEluc3RhbmNlID0gbmV3IE9wdGlvbnNNZXNzYWdlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9vcHRpb25zTWVzc2FnZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiY3VzdG9taXplZCIsICJub3JtYWwiLCAib3B0aW9uc19tZXNzYWdlIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX29wdGlvbnNNZXNzYWdlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDI2LCAxMCwgMTggfTsNCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25zTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIE9wdGlvbnNNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE9wdGlvbnNNZXNzYWdlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q1NoYXJwT3B0aW9uc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09wdGlvbnNNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPE9wdGlvbnNNZXNzYWdlLCBPcHRpb25zTWVzc2FnZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDU2hhcnBPcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT3B0aW9uc01lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE5vcm1hbEZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc05vcm1hbDsNCisgICAgcHJpdmF0ZSBzdHJpbmcgbm9ybWFsXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOb3JtYWwgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNOb3JtYWw7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIE5vcm1hbCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG5vcm1hbF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25zTWVzc2FnZV9GaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25zTWVzc2FnZV87DQorICAgIHByaXZhdGUgc3RyaW5nIG9wdGlvbnNNZXNzYWdlXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25zTWVzc2FnZV8gew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25zTWVzc2FnZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIE9wdGlvbnNNZXNzYWdlXyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbnNNZXNzYWdlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEN1c3RvbU5hbWVGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNDdXN0b21OYW1lOw0KKyAgICBwcml2YXRlIHN0cmluZyBjdXN0b21pemVkXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNDdXN0b21OYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQ3VzdG9tTmFtZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgQ3VzdG9tTmFtZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGN1c3RvbWl6ZWRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9vcHRpb25zTWVzc2FnZUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc05vcm1hbCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzFdLCBOb3JtYWwpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uc01lc3NhZ2VfKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMiwgZmllbGRfbmFtZXNbMl0sIE9wdGlvbnNNZXNzYWdlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNDdXN0b21OYW1lKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMywgZmllbGRfbmFtZXNbMF0sIEN1c3RvbU5hbWUpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc05vcm1hbCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMSwgTm9ybWFsKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbnNNZXNzYWdlXykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMiwgT3B0aW9uc01lc3NhZ2VfKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0N1c3RvbU5hbWUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDMsIEN1c3RvbU5hbWUpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25zTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25zTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25zTWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uc01lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbnNNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbnNNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbnNNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbnNNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbnNNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbnNNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIE9wdGlvbnNNZXNzYWdlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKE9wdGlvbnNNZXNzYWdlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPE9wdGlvbnNNZXNzYWdlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihPcHRpb25zTWVzc2FnZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIE9wdGlvbnNNZXNzYWdlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIE9wdGlvbnNNZXNzYWdlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgT3B0aW9uc01lc3NhZ2Ugb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBPcHRpb25zTWVzc2FnZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgT3B0aW9uc01lc3NhZ2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PcHRpb25zTWVzc2FnZS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBPcHRpb25zTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PcHRpb25zTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIE9wdGlvbnNNZXNzYWdlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBPcHRpb25zTWVzc2FnZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChPcHRpb25zTWVzc2FnZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKE9wdGlvbnNNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT3B0aW9uc01lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzTm9ybWFsKSB7DQorICAgICAgICAgIE5vcm1hbCA9IG90aGVyLk5vcm1hbDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25zTWVzc2FnZV8pIHsNCisgICAgICAgICAgT3B0aW9uc01lc3NhZ2VfID0gb3RoZXIuT3B0aW9uc01lc3NhZ2VfOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0N1c3RvbU5hbWUpIHsNCisgICAgICAgICAgQ3VzdG9tTmFtZSA9IG90aGVyLkN1c3RvbU5hbWU7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9vcHRpb25zTWVzc2FnZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9vcHRpb25zTWVzc2FnZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc05vcm1hbCA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5ub3JtYWxfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uc01lc3NhZ2VfID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0Lm9wdGlvbnNNZXNzYWdlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0N1c3RvbU5hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuY3VzdG9taXplZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc05vcm1hbCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc05vcm1hbDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIE5vcm1hbCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk5vcm1hbDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Tm9ybWFsKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROb3JtYWwoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOb3JtYWwgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm5vcm1hbF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5vcm1hbCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTm9ybWFsID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubm9ybWFsXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbnNNZXNzYWdlXyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbnNNZXNzYWdlXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIE9wdGlvbnNNZXNzYWdlXyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbnNNZXNzYWdlXzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uc01lc3NhZ2VfKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25zTWVzc2FnZV8oc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zTWVzc2FnZV8gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbnNNZXNzYWdlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uc01lc3NhZ2VfKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zTWVzc2FnZV8gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25zTWVzc2FnZV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNDdXN0b21OYW1lIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQ3VzdG9tTmFtZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEN1c3RvbU5hbWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5DdXN0b21OYW1lOyB9DQorICAgICAgICBzZXQgeyBTZXRDdXN0b21OYW1lKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRDdXN0b21OYW1lKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQ3VzdG9tTmFtZSA9IHRydWU7DQorICAgICAgICByZXN1bHQuY3VzdG9taXplZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckN1c3RvbU5hbWUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0N1c3RvbU5hbWUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5jdXN0b21pemVkXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBPcHRpb25zTWVzc2FnZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q1NoYXJwT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCit9DQorDQorI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MWNjZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmNzCkBAIC0wLDAgKzEsNjQxMSBAQAorLy8gR2VuZXJhdGVkIGJ5IFByb3RvR2VuLCBWZXJzaW9uPTIuNC4xLjU1NSwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj01NWY3MTI1MjM0YmViNTg5LiAgRE8gTk9UIEVESVQhDQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQ0KKyNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCisNCit1c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVyczsNCit1c2luZyBwYmMgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnM7DQordXNpbmcgcGJkID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcyB7DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlIHsNCisgIA0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkZpbGVPcHQxKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLk1lc3NhZ2VPcHQxKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkZpZWxkT3B0MSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5GaWVsZE9wdDIpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRW51bU9wdDEpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRW51bVZhbHVlT3B0MSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5TZXJ2aWNlT3B0MSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5NZXRob2RPcHQxKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkJvb2xPcHQpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuSW50MzJPcHQpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuSW50NjRPcHQpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuVWludDMyT3B0KTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLlVpbnQ2NE9wdCk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5TaW50MzJPcHQpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuU2ludDY0T3B0KTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkZpeGVkMzJPcHQpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRml4ZWQ2NE9wdCk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5TZml4ZWQzMk9wdCk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5TZml4ZWQ2NE9wdCk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5GbG9hdE9wdCk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5Eb3VibGVPcHQpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuU3RyaW5nT3B0KTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkJ5dGVzT3B0KTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkVudW1PcHQpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuTWVzc2FnZVR5cGVPcHQpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuUXV1eCk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5Db3JnZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5HcmF1bHQpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuR2FycGx5KTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkNvbXBsZXhPcHQxKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkNvbXBsZXhPcHQyKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkNvbXBsZXhPcHQzKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkNvbXBsZXhPcHQ2KTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkZpbGVvcHQpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuTXNnb3B0KTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkZpZWxkb3B0KTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkVudW1vcHRSZW5hbWVkKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkVudW12YWxvcHQpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuU2VydmljZW9wdCk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5NZXRob2RvcHQpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU0LkNvbXBsZXhPcHQ0KTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQuTWVzc2FnZVNldEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZS5OZXN0ZWQpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBFeHRlbnNpb25zDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmlsZU9wdDFGaWVsZE51bWJlciA9IDc3MzY5NzQ7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHVsb25nPiBGaWxlT3B0MTsNCisgICAgcHVibGljIGNvbnN0IGludCBNZXNzYWdlT3B0MUZpZWxkTnVtYmVyID0gNzczOTAzNjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxpbnQ+IE1lc3NhZ2VPcHQxOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkT3B0MUZpZWxkTnVtYmVyID0gNzc0MDkzNjsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8dWxvbmc+IEZpZWxkT3B0MTsNCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZE9wdDJGaWVsZE51bWJlciA9IDc3NTM5MTM7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8aW50PiBGaWVsZE9wdDI7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRW51bU9wdDFGaWVsZE51bWJlciA9IDc3NTM1NzY7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8aW50PiBFbnVtT3B0MTsNCisgICAgcHVibGljIGNvbnN0IGludCBFbnVtVmFsdWVPcHQxRmllbGROdW1iZXIgPSAxNTYwNjc4Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGludD4gRW51bVZhbHVlT3B0MTsNCisgICAgcHVibGljIGNvbnN0IGludCBTZXJ2aWNlT3B0MUZpZWxkTnVtYmVyID0gNzg4NzY1MDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxsb25nPiBTZXJ2aWNlT3B0MTsNCisgICAgcHVibGljIGNvbnN0IGludCBNZXRob2RPcHQxRmllbGROdW1iZXIgPSA3ODkwODYwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk1ldGhvZE9wdDE+IE1ldGhvZE9wdDE7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgQm9vbE9wdEZpZWxkTnVtYmVyID0gNzcwNjA5MDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxib29sPiBCb29sT3B0Ow0KKyAgICBwdWJsaWMgY29uc3QgaW50IEludDMyT3B0RmllbGROdW1iZXIgPSA3NzA1NzA5Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGludD4gSW50MzJPcHQ7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgSW50NjRPcHRGaWVsZE51bWJlciA9IDc3MDU1NDI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8bG9uZz4gSW50NjRPcHQ7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgVWludDMyT3B0RmllbGROdW1iZXIgPSA3NzA0ODgwOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTx1aW50PiBVaW50MzJPcHQ7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgVWludDY0T3B0RmllbGROdW1iZXIgPSA3NzAyMzY3Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTx1bG9uZz4gVWludDY0T3B0Ow0KKyAgICBwdWJsaWMgY29uc3QgaW50IFNpbnQzMk9wdEZpZWxkTnVtYmVyID0gNzcwMTU2ODsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxpbnQ+IFNpbnQzMk9wdDsNCisgICAgcHVibGljIGNvbnN0IGludCBTaW50NjRPcHRGaWVsZE51bWJlciA9IDc3MDA4NjM7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8bG9uZz4gU2ludDY0T3B0Ow0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpeGVkMzJPcHRGaWVsZE51bWJlciA9IDc3MDAzMDc7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHVpbnQ+IEZpeGVkMzJPcHQ7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRml4ZWQ2NE9wdEZpZWxkTnVtYmVyID0gNzcwMDE5NDsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8dWxvbmc+IEZpeGVkNjRPcHQ7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgU2ZpeGVkMzJPcHRGaWVsZE51bWJlciA9IDc2OTg2NDU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8aW50PiBTZml4ZWQzMk9wdDsNCisgICAgcHVibGljIGNvbnN0IGludCBTZml4ZWQ2NE9wdEZpZWxkTnVtYmVyID0gNzY4NTQ3NTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxsb25nPiBTZml4ZWQ2NE9wdDsNCisgICAgcHVibGljIGNvbnN0IGludCBGbG9hdE9wdEZpZWxkTnVtYmVyID0gNzY3NTM5MDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxmbG9hdD4gRmxvYXRPcHQ7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRG91YmxlT3B0RmllbGROdW1iZXIgPSA3NjczMjkzOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGRvdWJsZT4gRG91YmxlT3B0Ow0KKyAgICBwdWJsaWMgY29uc3QgaW50IFN0cmluZ09wdEZpZWxkTnVtYmVyID0gNzY3MzI4NTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzdHJpbmc+IFN0cmluZ09wdDsNCisgICAgcHVibGljIGNvbnN0IGludCBCeXRlc09wdEZpZWxkTnVtYmVyID0gNzY3MzIzODsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxwYjo6Qnl0ZVN0cmluZz4gQnl0ZXNPcHQ7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRW51bU9wdEZpZWxkTnVtYmVyID0gNzY3MzIzMzsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5EdW1teU1lc3NhZ2VDb250YWluaW5nRW51bS5UeXBlcy5UZXN0RW51bVR5cGU+IEVudW1PcHQ7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgTWVzc2FnZVR5cGVPcHRGaWVsZE51bWJlciA9IDc2NjU5Njc7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZT4gTWVzc2FnZVR5cGVPcHQ7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUXV1eEZpZWxkTnVtYmVyID0gNzY2MzcwNzsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxpbnQ+IFF1dXg7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgQ29yZ2VGaWVsZE51bWJlciA9IDc2NjM0NDI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUzPiBDb3JnZTsNCisgICAgcHVibGljIGNvbnN0IGludCBHcmF1bHRGaWVsZE51bWJlciA9IDc2NTA5Mjc7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8aW50PiBHcmF1bHQ7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgR2FycGx5RmllbGROdW1iZXIgPSA3NjQ5OTkyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMT4gR2FycGx5Ow0KKyAgICBwdWJsaWMgY29uc3QgaW50IENvbXBsZXhPcHQxRmllbGROdW1iZXIgPSA3NjQ2NzU2Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMT4gQ29tcGxleE9wdDE7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgQ29tcGxleE9wdDJGaWVsZE51bWJlciA9IDc2MzY5NDk7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUyPiBDb21wbGV4T3B0MjsNCisgICAgcHVibGljIGNvbnN0IGludCBDb21wbGV4T3B0M0ZpZWxkTnVtYmVyID0gNzYzNjQ2MzsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTM+IENvbXBsZXhPcHQzOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IENvbXBsZXhPcHQ2RmllbGROdW1iZXIgPSA3NTk1NDY4Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHQ2PiBDb21wbGV4T3B0NjsNCisgICAgcHVibGljIGNvbnN0IGludCBGaWxlb3B0RmllbGROdW1iZXIgPSAxNTQ3ODQ3OTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGU+IEZpbGVvcHQ7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgTXNnb3B0RmllbGROdW1iZXIgPSAxNTQ4MDA4ODsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGU+IE1zZ29wdDsNCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZG9wdEZpZWxkTnVtYmVyID0gMTU0ODEzNzQ7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlPiBGaWVsZG9wdDsNCisgICAgcHVibGljIGNvbnN0IGludCBFbnVtb3B0UmVuYW1lZEZpZWxkTnVtYmVyID0gMTU0ODMyMTg7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlPiBFbnVtb3B0UmVuYW1lZDsNCisgICAgcHVibGljIGNvbnN0IGludCBFbnVtdmFsb3B0RmllbGROdW1iZXIgPSAxNTQ4NjkyMTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGU+IEVudW12YWxvcHQ7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgU2VydmljZW9wdEZpZWxkTnVtYmVyID0gMTU0OTcxNDU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlPiBTZXJ2aWNlb3B0Ow0KKyAgICBwdWJsaWMgY29uc3QgaW50IE1ldGhvZG9wdEZpZWxkTnVtYmVyID0gMTU1MTI3MTM7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlPiBNZXRob2RvcHQ7DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgICNyZWdpb24gU3RhdGljIHZhcmlhYmxlcw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdF9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdC5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0N1c3RvbU9wdGlvbkZvb1JlcXVlc3RfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9DdXN0b21PcHRpb25Gb29SZXNwb25zZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9EdW1teU1lc3NhZ2VDb250YWluaW5nRW51bV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW0sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkR1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW1fX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9EdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5EdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5EdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0N1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9DdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0N1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9DdXN0b21PcHRpb25PdGhlclZhbHVlc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbk90aGVyVmFsdWVzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9TZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50c19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9TZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdGlvblR5cGUxX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTEsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0NvbXBsZXhPcHRpb25UeXBlMV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0NvbXBsZXhPcHRpb25UeXBlMl9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0aW9uVHlwZTJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0aW9uVHlwZTJfQ29tcGxleE9wdGlvblR5cGU0X19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU0LkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdGlvblR5cGUyX0NvbXBsZXhPcHRpb25UeXBlNF9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0NvbXBsZXhPcHRpb25UeXBlM19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0aW9uVHlwZTNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0aW9uVHlwZTNfQ29tcGxleE9wdGlvblR5cGU1X19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTMuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU1LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTMuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU1LkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdGlvblR5cGUzX0NvbXBsZXhPcHRpb25UeXBlNV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0NvbXBsZXhPcHQ2X19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0NiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdDYuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0Nl9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1ZhcmlvdXNDb21wbGV4T3B0aW9uc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVmFyaW91c0NvbXBsZXhPcHRpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5WYXJpb3VzQ29tcGxleE9wdGlvbnMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9WYXJpb3VzQ29tcGxleE9wdGlvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9BZ2dyZWdhdGVNZXNzYWdlU2V0X19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGVNZXNzYWdlU2V0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGVNZXNzYWdlU2V0LkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQWdncmVnYXRlTWVzc2FnZVNldF9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0FnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50X19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9BZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudF9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0FnZ3JlZ2F0ZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGUuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9BZ2dyZWdhdGVfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9BZ2dyZWdhdGVNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGVNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGVNZXNzYWdlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQWdncmVnYXRlTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gRGVzY3JpcHRvcg0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3I7DQorICAgIA0KKyAgICBzdGF0aWMgVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlKCkgew0KKyAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygNCisgICAgICAgICAgc3RyaW5nLkNvbmNhdCgNCisgICAgICAgICAgICAiQ2kxbmIyOW5iR1V2Y0hKdmRHOWlkV1l2ZFc1cGRIUmxjM1JmWTNWemRHOXRYMjl3ZEdsdmJuTXVjSEp2IiwgDQorICAgICAgICAgICAgImRHOFNFWEJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBHaVJuYjI5bmJHVXZjSEp2ZEc5aWRXWXZZM05vWVhKdyIsIA0KKyAgICAgICAgICAgICJYMjl3ZEdsdmJuTXVjSEp2ZEc4YUlHZHZiMmRzWlM5d2NtOTBiMkoxWmk5a1pYTmpjbWx3ZEc5eUxuQnkiLCANCisgICAgICAgICAgICAiYjNSdklvMEJDaHhVWlhOMFRXVnpjMkZuWlZkcGRHaERkWE4wYjIxUGNIUnBiMjV6RWg0S0JtWnBaV3hrIiwgDQorICAgICAgICAgICAgIk1SZ0JJQUVvQ1VJT0NBSEI0TU1kTGVGMUNnSUFBQUFpT3dvR1FXNUZiblZ0RWc4S0MwRk9SVTVWVFY5VyIsIA0KKyAgICAgICAgICAgICJRVXd4RUFFU0Znb0xRVTVGVGxWTlgxWkJURElRQWhvRnNJYjZCWHNhQ01YMnlSM3IvUC8vT2hBSUFPRHAiLCANCisgICAgICAgICAgICAid2gzSS8vLy8vLy8vLy84QkloZ0tGa04xYzNSdmJVOXdkR2x2YmtadmIxSmxjWFZsYzNRaUdRb1hRM1Z6IiwgDQorICAgICAgICAgICAgImRHOXRUM0IwYVc5dVJtOXZVbVZ6Y0c5dWMyVWliUW9hUkhWdGJYbE5aWE56WVdkbFEyOXVkR0ZwYm1sdSIsIA0KKyAgICAgICAgICAgICJaMFZ1ZFcwaVR3b01WR1Z6ZEVWdWRXMVVlWEJsRWhvS0ZsUkZVMVJmVDFCVVNVOU9YMFZPVlUxZlZGbFEiLCANCisgICAgICAgICAgICAiUlRFUUZoSWpDaFpVUlZOVVgwOVFWRWxQVGw5RlRsVk5YMVJaVUVVeUVPbi8vLy8vLy8vLy93RWlJUW9mIiwgDQorICAgICAgICAgICAgIlJIVnRiWGxOWlhOellXZGxTVzUyWVd4cFpFRnpUM0IwYVc5dVZIbHdaU0tLQVFvY1EzVnpkRzl0VDNCMCIsIA0KKyAgICAgICAgICAgICJhVzl1VFdsdVNXNTBaV2RsY2xaaGJIVmxjenBxbWRhb0hRQUFBQUFBQUFDQXJZMnZIUUFBQUlDUjdxOGQiLCANCisgICAgICAgICAgICAiQUFBQUFBQUFBQUNkOWE4ZEFBQUFBUGlYc0IzLy8vLy8vLy8vLy84QmdNU3dIZi8vLy84UCtQV3dIUUNBIiwgDQorICAgICAgICAgICAgIms3SWRBTEM4c2gyQWdJQ0FnSUNBZ0lBQjZNYXlIWUNBZ0lENC8vLy8vd0hRM3JJZEFDS1JBUW9jUTNWeiIsIA0KKyAgICAgICAgICAgICJkRzl0VDNCMGFXOXVUV0Y0U1c1MFpXZGxjbFpoYkhWbGN6cHhtZGFvSGYvLy8vLy8vLzkvclkydkhmLy8iLCANCisgICAgICAgICAgICAiLzMrUjdxOGQvLy8vLy8vLy8vK2Q5YThkLy8vLy8vaVhzQjMrLy8vLy8vLy8vLzhCZ01Td0hmNy8vLzhQIiwgDQorICAgICAgICAgICAgIitQV3dIZi8vLy8vLy8vLy8vd0dBazdJZC8vLy8vdyt3dkxJZC8vLy8vLy8vLy85LzZNYXlIZi8vLy84SCIsIA0KKyAgICAgICAgICAgICIwTjZ5SFFFaWJnb1hRM1Z6ZEc5dFQzQjBhVzl1VDNSb1pYSldZV3gxWlhNNlU0alpvaDNwLy8vLy8vLy8iLCANCisgICAgICAgICAgICAiLy84QnN0bWlIUXRJWld4c2J3QlhiM0pzWktyY29oME9TR1ZzYkc4c0lDSlhiM0pzWkNMcDNLSWQrMW1NIiwgDQorICAgICAgICAgICAgIlFzckE4ei8xMzZNZDU0ZEZRZWpHc2gyYy8vLy8vLy8vLy84QklqUUtIRk5sZEhScGJtZFNaV0ZzYzBaeSIsIA0KKyAgICAgICAgICAgICJiMjFRYjNOcGRHbDJaVWx1ZEhNNkZPbmNvaDBBQUFBQUFFQmpRUFhmb3gwQUFFQkJJalFLSEZObGRIUnAiLCANCisgICAgICAgICAgICAiYm1kU1pXRnNjMFp5YjIxT1pXZGhkR2wyWlVsdWRITTZGT25jb2gwQUFBQUFBRUJqd1BYZm94MEFBRURCIiwgDQorICAgICAgICAgICAgIklrY0tFa052YlhCc1pYaFBjSFJwYjI1VWVYQmxNUklMQ2dObWIyOFlBU0FCS0FVU0RBb0VabTl2TWhnQyIsIA0KKyAgICAgICAgICAgICJJQUVvQlJJTUNnUm1iMjh6R0FNZ0FTZ0ZLZ2dJWkJDQWdJQ0FBaUxCQWdvU1EyOXRjR3hsZUU5d2RHbHYiLCANCisgICAgICAgICAgICAiYmxSNWNHVXlFaklLQTJKaGNoZ0JJQUVvQ3pJbExuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExrTnZiWEJzIiwgDQorICAgICAgICAgICAgIlpYaFBjSFJwYjI1VWVYQmxNUklMQ2dOaVlYb1lBaUFCS0FVU1Jnb0VabkpsWkJnRElBRW9Dekk0TG5CeSIsIA0KKyAgICAgICAgICAgICJiM1J2WW5WbVgzVnVhWFIwWlhOMExrTnZiWEJzWlhoUGNIUnBiMjVVZVhCbE1pNURiMjF3YkdWNFQzQjAiLCANCisgICAgICAgICAgICAiYVc5dVZIbHdaVFFhbHdFS0VrTnZiWEJzWlhoUGNIUnBiMjVVZVhCbE5CSU5DZ1YzWVd4a2J4Z0JJQUVvIiwgDQorICAgICAgICAgICAgIkJUSnlDZ3hqYjIxd2JHVjRYMjl3ZERRU0h5NW5iMjluYkdVdWNISnZkRzlpZFdZdVRXVnpjMkZuWlU5dyIsIA0KKyAgICAgICAgICAgICJkR2x2Ym5NWWl2WFJBeUFCS0FzeU9DNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNURiMjF3YkdWNFQzQjAiLCANCisgICAgICAgICAgICAiYVc5dVZIbHdaVEl1UTI5dGNHeGxlRTl3ZEdsdmJsUjVjR1UwS2dnSVpCQ0FnSUNBQWlLY0FRb1NRMjl0IiwgDQorICAgICAgICAgICAgImNHeGxlRTl3ZEdsdmJsUjVjR1V6RWdzS0EzRjFlQmdCSUFFb0JSSlVDaEpqYjIxd2JHVjRiM0IwYVc5dSIsIA0KKyAgICAgICAgICAgICJkSGx3WlRVWUFpQUJLQW95T0M1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1RGIyMXdiR1Y0VDNCMGFXOXUiLCANCisgICAgICAgICAgICAiVkhsd1pUTXVRMjl0Y0d4bGVFOXdkR2x2YmxSNWNHVTFHaU1LRWtOdmJYQnNaWGhQY0hScGIyNVVlWEJsIiwgDQorICAgICAgICAgICAgIk5SSU5DZ1Z3YkhWbmFCZ0RJQUVvQlNJZkNndERiMjF3YkdWNFQzQjBOaElRQ2dWNGVYcDZlUmpmdjg4RCIsIA0KKyAgICAgICAgICAgICJJQUVvQlNMUUFRb1ZWbUZ5YVc5MWMwTnZiWEJzWlhoUGNIUnBiMjV6T3JZQjQ5ejhIUGo5K3h3WTVOejgiLCANCisgICAgICAgICAgICAiSE5Lb2p4MERDTE1QK3Q2UUhRSUlDZnJla0IwRUV4Z1dGS3I5a0IwREVOc0hxdjJRSFFiNDVwY2RqZ1dxIiwgDQorICAgICAgICAgICAgIi9aQWRCUW9EQ09jRnF2MlFIUWdLQnRpRm5oM1BENnI5a0IwS0NnaVM5WjBkQXdqWUQ2cjlrQjBJd3F5WCIsIA0KKyAgICAgICAgICAgICJIUU1JNVFXcS9aQWRDOEtzbHgwRzJJV2VIYzRQcXYyUUhRM0NySmNkQ0pMMW5SMERDTWtRcXYyUUhRVWEiLCANCisgICAgICAgICAgICAiQXdqQkFxTGlsUjBDQ0NxaTRwVWRCdGlGbmgzRUFxTGlsUjBJa3ZXZEhRTUk3QVlpSXdvVFFXZG5jbVZuIiwgDQorICAgICAgICAgICAgIllYUmxUV1Z6YzJGblpWTmxkQ29JQ0FRUWdJQ0FnQUk2QWdnQklxQUJDaHBCWjJkeVpXZGhkR1ZOWlhOeiIsIA0KKyAgICAgICAgICAgICJZV2RsVTJWMFJXeGxiV1Z1ZEJJSkNnRnpHQUVnQVNnSk1uY0tGVzFsYzNOaFoyVmZjMlYwWDJWNGRHVnUiLCANCisgICAgICAgICAgICAiYzJsdmJoSW1MbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMa0ZuWjNKbFoyRjBaVTFsYzNOaFoyVlRaWFFZIiwgDQorICAgICAgICAgICAgIjl1dXVCeUFCS0FzeUxTNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNUJaMmR5WldkaGRHVk5aWE56WVdkbCIsIA0KKyAgICAgICAgICAgICJVMlYwUld4bGJXVnVkQ0w5QVFvSlFXZG5jbVZuWVhSbEVna0tBV2tZQVNBQktBVVNDUW9CY3hnQ0lBRW8iLCANCisgICAgICAgICAgICAiQ1JJcENnTnpkV0lZQXlBQktBc3lIQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVCWjJkeVpXZGhkR1VTIiwgDQorICAgICAgICAgICAgIktnb0VabWxzWlJnRUlBRW9DekljTG1kdmIyZHNaUzV3Y205MGIySjFaaTVHYVd4bFQzQjBhVzl1Y3hJMCIsIA0KKyAgICAgICAgICAgICJDZ1J0YzJWMEdBVWdBU2dMTWlZdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVFXZG5jbVZuWVhSbFRXVnoiLCANCisgICAgICAgICAgICAiYzJGblpWTmxkREpOQ2dadVpYTjBaV1FTSEM1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1Um1sc1pVOXdkR2x2IiwgDQorICAgICAgICAgICAgImJuTVlwOUd3QnlBQktBc3lIQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVCWjJkeVpXZGhkR1VpV1FvUSIsIA0KKyAgICAgICAgICAgICJRV2RuY21WbllYUmxUV1Z6YzJGblpSSXBDZ2xtYVdWc1pHNWhiV1VZQVNBQktBVkNGdktoaHpzUkVnOUciLCANCisgICAgICAgICAgICAiYVdWc1pFRnVibTkwWVhScGIyNDZHc0xSaGpzVkNHVVNFVTFsYzNOaFoyVkJibTV2ZEdGMGFXOXVLallLIiwgDQorICAgICAgICAgICAgIkNrMWxkR2h2WkU5d2RERVNFd29QVFVWVVNFOUVUMUJVTVY5V1FVd3hFQUVTRXdvUFRVVlVTRTlFVDFCVSIsIA0KKyAgICAgICAgICAgICJNVjlXUVV3eUVBSXFUUW9OUVdkbmNtVm5ZWFJsUlc1MWJSSWxDZ1ZXUVV4VlJSQUJHaHJLL0lrN0ZSSVQiLCANCisgICAgICAgICAgICAiUlc1MWJWWmhiSFZsUVc1dWIzUmhkR2x2YmhvVmtwV0lPeEFTRGtWdWRXMUJibTV2ZEdGMGFXOXVNbzRCIiwgDQorICAgICAgICAgICAgIkNoeFVaWE4wVTJWeWRtbGpaVmRwZEdoRGRYTjBiMjFQY0hScGIyNXpFbU1LQTBadmJ4SXBMbkJ5YjNSdiIsIA0KKyAgICAgICAgICAgICJZblZtWDNWdWFYUjBaWE4wTGtOMWMzUnZiVTl3ZEdsdmJrWnZiMUpsY1hWbGMzUWFLaTV3Y205MGIySjEiLCANCisgICAgICAgICAgICAiWmw5MWJtbDBkR1Z6ZEM1RGRYTjBiMjFQY0hScGIyNUdiMjlTWlhOd2IyNXpaU0lGNFBxTUhnSWFDWkN5IiwgDQorICAgICAgICAgICAgIml4N1QyNERMU1RLWkFRb1FRV2RuY21WbllYUmxVMlZ5ZG1salpSSnJDZ1pOWlhSb2IyUVNJeTV3Y205MCIsIA0KKyAgICAgICAgICAgICJiMkoxWmw5MWJtbDBkR1Z6ZEM1QloyZHlaV2RoZEdWTlpYTnpZV2RsR2lNdWNISnZkRzlpZFdaZmRXNXAiLCANCisgICAgICAgICAgICAiZEhSbGMzUXVRV2RuY21WbllYUmxUV1Z6YzJGblpTSVh5c2lXT3hJU0VFMWxkR2h2WkVGdWJtOTBZWFJwIiwgDQorICAgICAgICAgICAgImIyNGFHTXI3ampzVEVoRlRaWEoyYVdObFFXNXViM1JoZEdsdmJqb3lDZ2xtYVd4bFgyOXdkREVTSEM1biIsIA0KKyAgICAgICAgICAgICJiMjluYkdVdWNISnZkRzlpZFdZdVJtbHNaVTl3ZEdsdmJuTVlqcDNZQXlBQktBUTZPQW9NYldWemMyRm4iLCANCisgICAgICAgICAgICAiWlY5dmNIUXhFaDh1WjI5dloyeGxMbkJ5YjNSdlluVm1MazFsYzNOaFoyVlBjSFJwYjI1ekdKeXQyQU1nIiwgDQorICAgICAgICAgICAgIkFTZ0ZPalFLQ21acFpXeGtYMjl3ZERFU0hTNW5iMjluYkdVdWNISnZkRzlpZFdZdVJtbGxiR1JQY0hScCIsIA0KKyAgICAgICAgICAgICJiMjV6R0lpODJBTWdBU2dHT2pnS0NtWnBaV3hrWDI5d2RESVNIUzVuYjI5bmJHVXVjSEp2ZEc5aWRXWXUiLCANCisgICAgICAgICAgICAiUm1sbGJHUlBjSFJwYjI1ekdMbWgyUU1nQVNnRk9nSTBNam95Q2dsbGJuVnRYMjl3ZERFU0hDNW5iMjluIiwgDQorICAgICAgICAgICAgImJHVXVjSEp2ZEc5aWRXWXVSVzUxYlU5d2RHbHZibk1ZNko3WkF5QUJLQTg2UEFvUFpXNTFiVjkyWVd4MSIsIA0KKyAgICAgICAgICAgICJaVjl2Y0hReEVpRXVaMjl2WjJ4bExuQnliM1J2WW5WbUxrVnVkVzFXWVd4MVpVOXdkR2x2Ym5NWTVxQmYiLCANCisgICAgICAgICAgICAiSUFFb0JUbzRDZ3h6WlhKMmFXTmxYMjl3ZERFU0h5NW5iMjluYkdVdWNISnZkRzlpZFdZdVUyVnlkbWxqIiwgDQorICAgICAgICAgICAgIlpVOXdkR2x2Ym5NWW9yYmhBeUFCS0JJNlZRb0xiV1YwYUc5a1gyOXdkREVTSGk1bmIyOW5iR1V1Y0hKdiIsIA0KKyAgICAgICAgICAgICJkRzlpZFdZdVRXVjBhRzlrVDNCMGFXOXVjeGlzeitFRElBRW9EaklkTG5CeWIzUnZZblZtWDNWdWFYUjAiLCANCisgICAgICAgICAgICAiWlhOMExrMWxkR2h2WkU5d2RERTZOQW9JWW05dmJGOXZjSFFTSHk1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1IiwgDQorICAgICAgICAgICAgIlRXVnpjMkZuWlU5d2RHbHZibk1ZNnF2V0F5QUJLQWc2TlFvSmFXNTBNekpmYjNCMEVoOHVaMjl2WjJ4bCIsIA0KKyAgICAgICAgICAgICJMbkJ5YjNSdlluVm1MazFsYzNOaFoyVlBjSFJwYjI1ekdPMm8xZ01nQVNnRk9qVUtDV2x1ZERZMFgyOXciLCANCisgICAgICAgICAgICAiZEJJZkxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1TlpYTnpZV2RsVDNCMGFXOXVjeGpHcDlZRElBRW9Bem8yIiwgDQorICAgICAgICAgICAgIkNncDFhVzUwTXpKZmIzQjBFaDh1WjI5dloyeGxMbkJ5YjNSdlluVm1MazFsYzNOaFoyVlBjSFJwYjI1eiIsIA0KKyAgICAgICAgICAgICJHTENpMWdNZ0FTZ05PallLQ25WcGJuUTJORjl2Y0hRU0h5NW5iMjluYkdVdWNISnZkRzlpZFdZdVRXVnoiLCANCisgICAgICAgICAgICAiYzJGblpVOXdkR2x2Ym5NWTM0N1dBeUFCS0FRNk5nb0tjMmx1ZERNeVgyOXdkQklmTG1kdmIyZHNaUzV3IiwgDQorICAgICAgICAgICAgImNtOTBiMkoxWmk1TlpYTnpZV2RsVDNCMGFXOXVjeGpBaU5ZRElBRW9FVG8yQ2dwemFXNTBOalJmYjNCMCIsIA0KKyAgICAgICAgICAgICJFaDh1WjI5dloyeGxMbkJ5YjNSdlluVm1MazFsYzNOaFoyVlBjSFJwYjI1ekdQK0MxZ01nQVNnU09qY0siLCANCisgICAgICAgICAgICAiQzJacGVHVmtNekpmYjNCMEVoOHVaMjl2WjJ4bExuQnliM1J2WW5WbUxrMWxjM05oWjJWUGNIUnBiMjV6IiwgDQorICAgICAgICAgICAgIkdOUCsxUU1nQVNnSE9qY0tDMlpwZUdWa05qUmZiM0IwRWg4dVoyOXZaMnhsTG5CeWIzUnZZblZtTGsxbCIsIA0KKyAgICAgICAgICAgICJjM05oWjJWUGNIUnBiMjV6R09MOTFRTWdBU2dHT2pnS0RITm1hWGhsWkRNeVgyOXdkQklmTG1kdmIyZHMiLCANCisgICAgICAgICAgICAiWlM1d2NtOTBiMkoxWmk1TlpYTnpZV2RsVDNCMGFXOXVjeGpWOGRVRElBRW9Eem80Q2d4elptbDRaV1EyIiwgDQorICAgICAgICAgICAgIk5GOXZjSFFTSHk1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1VFdWemMyRm5aVTl3ZEdsdmJuTVk0NHJWQXlBQiIsIA0KKyAgICAgICAgICAgICJLQkE2TlFvSlpteHZZWFJmYjNCMEVoOHVaMjl2WjJ4bExuQnliM1J2WW5WbUxrMWxjM05oWjJWUGNIUnAiLCANCisgICAgICAgICAgICAiYjI1ekdQNjcxQU1nQVNnQ09qWUtDbVJ2ZFdKc1pWOXZjSFFTSHk1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1IiwgDQorICAgICAgICAgICAgIlRXVnpjMkZuWlU5d2RHbHZibk1ZemF2VUF5QUJLQUU2TmdvS2MzUnlhVzVuWDI5d2RCSWZMbWR2YjJkcyIsIA0KKyAgICAgICAgICAgICJaUzV3Y205MGIySjFaaTVOWlhOellXZGxUM0IwYVc5dWN4akZxOVFESUFFb0NUbzFDZ2xpZVhSbGMxOXYiLCANCisgICAgICAgICAgICAiY0hRU0h5NW5iMjluYkdVdWNISnZkRzlpZFdZdVRXVnpjMkZuWlU5d2RHbHZibk1ZbHF2VUF5QUJLQXc2IiwgDQorICAgICAgICAgICAgImNBb0laVzUxYlY5dmNIUVNIeTVuYjI5bmJHVXVjSEp2ZEc5aWRXWXVUV1Z6YzJGblpVOXdkR2x2Ym5NWSIsIA0KKyAgICAgICAgICAgICJrYXZVQXlBQktBNHlPaTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVFZFcxdGVVMWxjM05oWjJWRGIyNTAiLCANCisgICAgICAgICAgICAiWVdsdWFXNW5SVzUxYlM1VVpYTjBSVzUxYlZSNWNHVTZjQW9RYldWemMyRm5aVjkwZVhCbFgyOXdkQklmIiwgDQorICAgICAgICAgICAgIkxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1TlpYTnpZV2RsVDNCMGFXOXVjeGl2OHRNRElBRW9Dekl5TG5CeSIsIA0KKyAgICAgICAgICAgICJiM1J2WW5WbVgzVnVhWFIwWlhOMExrUjFiVzE1VFdWemMyRm5aVWx1ZG1Gc2FXUkJjMDl3ZEdsdmJsUjUiLCANCisgICAgICAgICAgICAiY0dVNk5nb0VjWFYxZUJJbExuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExrTnZiWEJzWlhoUGNIUnBiMjVVIiwgDQorICAgICAgICAgICAgImVYQmxNUmpiNE5NRElBRW9CVHBlQ2dWamIzSm5aUklsTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGtOdiIsIA0KKyAgICAgICAgICAgICJiWEJzWlhoUGNIUnBiMjVVZVhCbE1SalMzdE1ESUFFb0N6SWxMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjAiLCANCisgICAgICAgICAgICAiTGtOdmJYQnNaWGhQY0hScGIyNVVlWEJsTXpvNENnWm5jbUYxYkhRU0pTNXdjbTkwYjJKMVpsOTFibWwwIiwgDQorICAgICAgICAgICAgImRHVnpkQzVEYjIxd2JHVjRUM0IwYVc5dVZIbHdaVElZNy96U0F5QUJLQVU2WHdvR1oyRnljR3g1RWlVdSIsIA0KKyAgICAgICAgICAgICJjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVRMjl0Y0d4bGVFOXdkR2x2YmxSNWNHVXlHTWoxMGdNZ0FTZ0wiLCANCisgICAgICAgICAgICAiTWlVdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVEyOXRjR3hsZUU5d2RHbHZibFI1Y0dVeE9sOEtER052IiwgDQorICAgICAgICAgICAgImJYQnNaWGhmYjNCME1SSWZMbWR2YjJkc1pTNXdjbTkwYjJKMVppNU5aWE56WVdkbFQzQjBhVzl1Y3hpayIsIA0KKyAgICAgICAgICAgICIzTklESUFFb0N6SWxMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMa052YlhCc1pYaFBjSFJwYjI1VWVYQmwiLCANCisgICAgICAgICAgICAiTVRwZkNneGpiMjF3YkdWNFgyOXdkRElTSHk1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1VFdWemMyRm5aVTl3IiwgDQorICAgICAgICAgICAgImRHbHZibk1ZMVkvU0F5QUJLQXN5SlM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1RGIyMXdiR1Y0VDNCMCIsIA0KKyAgICAgICAgICAgICJhVzl1Vkhsd1pUSTZYd29NWTI5dGNHeGxlRjl2Y0hRekVoOHVaMjl2WjJ4bExuQnliM1J2WW5WbUxrMWwiLCANCisgICAgICAgICAgICAiYzNOaFoyVlBjSFJwYjI1ekdPK0wwZ01nQVNnTE1pVXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVRMjl0IiwgDQorICAgICAgICAgICAgImNHeGxlRTl3ZEdsdmJsUjVjR1V6T2xjS0MyTnZiWEJzWlhodmNIUTJFaDh1WjI5dloyeGxMbkJ5YjNSdiIsIA0KKyAgICAgICAgICAgICJZblZtTGsxbGMzTmhaMlZQY0hScGIyNXpHTXpMendNZ0FTZ0tNaDR1Y0hKdmRHOWlkV1pmZFc1cGRIUmwiLCANCisgICAgICAgICAgICAiYzNRdVEyOXRjR3hsZUU5d2REWTZUZ29IWm1sc1pXOXdkQkljTG1kdmIyZHNaUzV3Y205MGIySjFaaTVHIiwgDQorICAgICAgICAgICAgImFXeGxUM0IwYVc5dWN4alAzYkFISUFFb0N6SWNMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMa0ZuWjNKbCIsIA0KKyAgICAgICAgICAgICJaMkYwWlRwUUNnWnRjMmR2Y0hRU0h5NW5iMjluYkdVdWNISnZkRzlpZFdZdVRXVnpjMkZuWlU5d2RHbHYiLCANCisgICAgICAgICAgICAiYm5NWW1PcXdCeUFCS0FzeUhDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNUJaMmR5WldkaGRHVTZVQW9JIiwgDQorICAgICAgICAgICAgIlptbGxiR1J2Y0hRU0hTNW5iMjluYkdVdWNISnZkRzlpZFdZdVJtbGxiR1JQY0hScGIyNXpHSjcwc0FjZyIsIA0KKyAgICAgICAgICAgICJBU2dMTWh3dWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVFXZG5jbVZuWVhSbE9sWUtEMlZ1ZFcxdmNIUmYiLCANCisgICAgICAgICAgICAiY21WdVlXMWxaQkljTG1kdmIyZHNaUzV3Y205MGIySjFaaTVGYm5WdFQzQjBhVzl1Y3hqU2dyRUhJQUVvIiwgDQorICAgICAgICAgICAgIkN6SWNMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMa0ZuWjNKbFoyRjBaVHBXQ2dwbGJuVnRkbUZzYjNCMCIsIA0KKyAgICAgICAgICAgICJFaUV1WjI5dloyeGxMbkJ5YjNSdlluVm1Ma1Z1ZFcxV1lXeDFaVTl3ZEdsdmJuTVl5Wit4QnlBQktBc3kiLCANCisgICAgICAgICAgICAiSEM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1QloyZHlaV2RoZEdVNlZBb0tjMlZ5ZG1salpXOXdkQklmIiwgDQorICAgICAgICAgICAgIkxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1VFpYSjJhV05sVDNCMGFXOXVjeGk1NzdFSElBRW9DekljTG5CeSIsIA0KKyAgICAgICAgICAgICJiM1J2WW5WbVgzVnVhWFIwWlhOMExrRm5aM0psWjJGMFpUcFNDZ2x0WlhSb2IyUnZjSFFTSGk1bmIyOW4iLCANCisgICAgICAgICAgICAiYkdVdWNISnZkRzlpZFdZdVRXVjBhRzlrVDNCMGFXOXVjeGlKNmJJSElBRW9DekljTG5CeWIzUnZZblZtIiwgDQorICAgICAgICAgICAgIlgzVnVhWFIwWlhOMExrRm5aM0psWjJGMFpVTE5BWUFCQVlnQkFaQUJBY0krUXdvaFIyOXZaMnhsTGxCeSIsIA0KKyAgICAgICAgICAgICJiM1J2WTI5c1FuVm1abVZ5Y3k1VVpYTjBVSEp2ZEc5ekVoNVZibWwwVkdWemRFTjFjM1J2YlU5d2RHbHYiLCANCisgICAgICAgICAgICAiYm5OUWNtOTBiMFpwYkdYdzZNRWQ2cTNBNVNUNjdJVTdjQWhrRWc1R2FXeGxRVzV1YjNSaGRHbHZiaG9XIiwgDQorICAgICAgICAgICAgIkVoUk9aWE4wWldSR2FXeGxRVzV1YjNSaGRHbHZiaUllK3V5Rk94a1NGMFpwYkdWRmVIUmxibk5wYjI1QiIsIA0KKyAgICAgICAgICAgICJibTV2ZEdGMGFXOXVLaVFMRVBicnJnY2FHd29aUlcxaVpXUmtaV1JOWlhOellXZGxVMlYwUld4bGJXVnUiLCANCisgICAgICAgICAgImRBdz0iKSk7DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciBhc3NpZ25lciA9IGRlbGVnYXRlKHBiZDo6RmlsZURlc2NyaXB0b3Igcm9vdCkgew0KKyAgICAgICAgZGVzY3JpcHRvciA9IHJvb3Q7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJGaWVsZDEiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdF9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9DdXN0b21PcHRpb25Gb29SZXF1ZXN0X19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5DdXN0b21PcHRpb25Gb29SZXF1ZXN0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5DdXN0b21PcHRpb25Gb29SZXF1ZXN0LkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0N1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMl07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0N1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5DdXN0b21PcHRpb25Gb29SZXNwb25zZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9DdXN0b21PcHRpb25Gb29SZXNwb25zZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0R1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbM107DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0R1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5EdW1teU1lc3NhZ2VDb250YWluaW5nRW51bSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW0uQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9EdW1teU1lc3NhZ2VDb250YWluaW5nRW51bV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0R1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGVfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s0XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0R1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGVfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9DdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbNV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0N1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9DdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzZdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9DdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5DdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5DdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0N1c3RvbU9wdGlvbk90aGVyVmFsdWVzX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbN107DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0N1c3RvbU9wdGlvbk90aGVyVmFsdWVzX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5DdXN0b21PcHRpb25PdGhlclZhbHVlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9DdXN0b21PcHRpb25PdGhlclZhbHVlc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s4XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50c19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9TZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbOV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9TZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdGlvblR5cGUxX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0aW9uVHlwZTFfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUxLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdGlvblR5cGUxX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRm9vIiwgIkZvbzIiLCAiRm9vMyIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0aW9uVHlwZTJfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxMV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0NvbXBsZXhPcHRpb25UeXBlMl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0aW9uVHlwZTJfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJCYXIiLCAiQmF6IiwgIkZyZWQiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdGlvblR5cGUyX0NvbXBsZXhPcHRpb25UeXBlNF9fRGVzY3JpcHRvciA9IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdGlvblR5cGUyX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0aW9uVHlwZTJfQ29tcGxleE9wdGlvblR5cGU0X19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU0LkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdGlvblR5cGUyX0NvbXBsZXhPcHRpb25UeXBlNF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIldhbGRvIiwgfSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU0LkNvbXBsZXhPcHQ0ID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU0Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU0LkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1swXSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0NvbXBsZXhPcHRpb25UeXBlM19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzEyXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdGlvblR5cGUzX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0NvbXBsZXhPcHRpb25UeXBlM19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIlF1eCIsICJDb21wbGV4T3B0aW9uVHlwZTUiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdGlvblR5cGUzX0NvbXBsZXhPcHRpb25UeXBlNV9fRGVzY3JpcHRvciA9IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdGlvblR5cGUzX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0aW9uVHlwZTNfQ29tcGxleE9wdGlvblR5cGU1X19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTMuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU1LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTMuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU1LkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdGlvblR5cGUzX0NvbXBsZXhPcHRpb25UeXBlNV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIlBsdWdoIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0NvbXBsZXhPcHQ2X19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTNdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0Nl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdDYsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHQ2LkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdDZfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJYeXp6eSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9WYXJpb3VzQ29tcGxleE9wdGlvbnNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxNF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1ZhcmlvdXNDb21wbGV4T3B0aW9uc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVmFyaW91c0NvbXBsZXhPcHRpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5WYXJpb3VzQ29tcGxleE9wdGlvbnMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9WYXJpb3VzQ29tcGxleE9wdGlvbnNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9BZ2dyZWdhdGVNZXNzYWdlU2V0X19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTVdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9BZ2dyZWdhdGVNZXNzYWdlU2V0X19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGVNZXNzYWdlU2V0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGVNZXNzYWdlU2V0LkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQWdncmVnYXRlTWVzc2FnZVNldF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0FnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50X19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTZdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9BZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudF9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50LkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnRfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJTIiwgfSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudC5NZXNzYWdlU2V0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQuRGVzY3JpcHRvci5FeHRlbnNpb25zWzBdKTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQWdncmVnYXRlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTddOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9BZ2dyZWdhdGVfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQWdncmVnYXRlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiSSIsICJTIiwgIlN1YiIsICJGaWxlIiwgIk1zZXQiLCB9KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZS5OZXN0ZWQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1swXSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0FnZ3JlZ2F0ZU1lc3NhZ2VfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxOF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0FnZ3JlZ2F0ZU1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZU1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZU1lc3NhZ2UuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9BZ2dyZWdhdGVNZXNzYWdlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRmllbGRuYW1lIiwgfSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRmlsZU9wdDEgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHVsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzBdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5NZXNzYWdlT3B0MSA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzFdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5GaWVsZE9wdDEgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHVsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzJdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5GaWVsZE9wdDIgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRW51bU9wdDEgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRW51bVZhbHVlT3B0MSA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzVdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5TZXJ2aWNlT3B0MSA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s2XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuTWV0aG9kT3B0MSA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuTWV0aG9kT3B0MT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuQm9vbE9wdCA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Ym9vbD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s4XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuSW50MzJPcHQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s5XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuSW50NjRPcHQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTBdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5VaW50MzJPcHQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHVpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTFdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5VaW50NjRPcHQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHVsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzEyXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuU2ludDMyT3B0ID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTNdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5TaW50NjRPcHQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTRdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5GaXhlZDMyT3B0ID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjx1aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzE1XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRml4ZWQ2NE9wdCA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248dWxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTZdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5TZml4ZWQzMk9wdCA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzE3XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuU2ZpeGVkNjRPcHQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMThdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5GbG9hdE9wdCA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248ZmxvYXQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTldKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5Eb3VibGVPcHQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGRvdWJsZT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syMF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLlN0cmluZ09wdCA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248c3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzIxXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuQnl0ZXNPcHQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHBiOjpCeXRlU3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzIyXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRW51bU9wdCA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW0uVHlwZXMuVGVzdEVudW1UeXBlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzIzXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuTWVzc2FnZVR5cGVPcHQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkR1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGU+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMjRdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5RdXV4ID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMjVdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5Db3JnZSA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUzPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzI2XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuR3JhdWx0ID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMjddKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5HYXJwbHkgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syOF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkNvbXBsZXhPcHQxID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTE+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMjldKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5Db21wbGV4T3B0MiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUyPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzMwXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuQ29tcGxleE9wdDMgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szMV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkNvbXBsZXhPcHQ2ID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0Nj4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szMl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkZpbGVvcHQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szM10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLk1zZ29wdCA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzM0XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRmllbGRvcHQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szNV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkVudW1vcHRSZW5hbWVkID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGU+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMzZdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5FbnVtdmFsb3B0ID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGU+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMzddKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5TZXJ2aWNlb3B0ID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGU+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMzhdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5NZXRob2RvcHQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szOV0pOw0KKyAgICAgICAgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICBSZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5Ow0KKyAgICAgIH07DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oZGVzY3JpcHRvckRhdGEsDQorICAgICAgICAgIG5ldyBwYmQ6OkZpbGVEZXNjcmlwdG9yW10gew0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLkRlc2NyaXB0b3IsIA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLkRlc2NyaXB0b3IsIA0KKyAgICAgICAgICB9LCBhc3NpZ25lcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgIH0NCisgICNyZWdpb24gRW51bXMNCisgIHB1YmxpYyBlbnVtIE1ldGhvZE9wdDEgew0KKyAgICBNRVRIT0RPUFQxX1ZBTDEgPSAxLA0KKyAgICBNRVRIT0RPUFQxX1ZBTDIgPSAyLA0KKyAgfQ0KKyAgDQorICBwdWJsaWMgZW51bSBBZ2dyZWdhdGVFbnVtIHsNCisgICAgVkFMVUUgPSAxLA0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCisgICNyZWdpb24gTWVzc2FnZXMNCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMsIFRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiZmllbGQxIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucywgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uc19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgICNyZWdpb24gTmVzdGVkIHR5cGVzDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7DQorICAgICAgcHVibGljIGVudW0gQW5FbnVtIHsNCisgICAgICAgIEFORU5VTV9WQUwxID0gMSwNCisgICAgICAgIEFORU5VTV9WQUwyID0gMiwNCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzRmllbGQxKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMSwgZmllbGRfbmFtZXNbMF0sIEZpZWxkMSk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzRmllbGQxKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxLCBGaWVsZDEpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxKSB7DQorICAgICAgICAgIEZpZWxkMSA9IG90aGVyLkZpZWxkMTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWVsZDFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxDdXN0b21PcHRpb25Gb29SZXF1ZXN0LCBDdXN0b21PcHRpb25Gb29SZXF1ZXN0LkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBDdXN0b21PcHRpb25Gb29SZXF1ZXN0KCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QgZGVmYXVsdEluc3RhbmNlID0gbmV3IEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2N1c3RvbU9wdGlvbkZvb1JlcXVlc3RGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfY3VzdG9tT3B0aW9uRm9vUmVxdWVzdEZpZWxkVGFncyA9IG5ldyB1aW50W10geyAgfTsNCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25Gb29SZXF1ZXN0IERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBDdXN0b21PcHRpb25Gb29SZXF1ZXN0IFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0N1c3RvbU9wdGlvbkZvb1JlcXVlc3RfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Q3VzdG9tT3B0aW9uRm9vUmVxdWVzdCwgQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdC5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdF9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9jdXN0b21PcHRpb25Gb29SZXF1ZXN0RmllbGROYW1lczsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25Gb29SZXF1ZXN0IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25Gb29SZXF1ZXN0IFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25Gb29SZXF1ZXN0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxDdXN0b21PcHRpb25Gb29SZXF1ZXN0LCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihDdXN0b21PcHRpb25Gb29SZXF1ZXN0IGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBDdXN0b21PcHRpb25Gb29SZXF1ZXN0IFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5DdXN0b21PcHRpb25Gb29SZXF1ZXN0LkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEN1c3RvbU9wdGlvbkZvb1JlcXVlc3Qgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5DdXN0b21PcHRpb25Gb29SZXF1ZXN0LkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfY3VzdG9tT3B0aW9uRm9vUmVxdWVzdEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9jdXN0b21PcHRpb25Gb29SZXF1ZXN0RmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8Q3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UsIEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBDdXN0b21PcHRpb25Gb29SZXNwb25zZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDdXN0b21PcHRpb25Gb29SZXNwb25zZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2N1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2N1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2VfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Q3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UsIEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9DdXN0b21PcHRpb25Gb29SZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9jdXN0b21PcHRpb25Gb29SZXNwb25zZUZpZWxkTmFtZXM7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25Gb29SZXNwb25zZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8Q3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBDdXN0b21PcHRpb25Gb29SZXNwb25zZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBDdXN0b21PcHRpb25Gb29SZXNwb25zZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5DdXN0b21PcHRpb25Gb29SZXNwb25zZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2N1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2N1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtLCBEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW0oKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW0gZGVmYXVsdEluc3RhbmNlID0gbmV3IER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9kdW1teU1lc3NhZ2VDb250YWluaW5nRW51bUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9kdW1teU1lc3NhZ2VDb250YWluaW5nRW51bUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAgfTsNCisgICAgcHVibGljIHN0YXRpYyBEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0R1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtLCBEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW1fX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgew0KKyAgICAgIHB1YmxpYyBlbnVtIFRlc3RFbnVtVHlwZSB7DQorICAgICAgICBURVNUX09QVElPTl9FTlVNX1RZUEUxID0gMjIsDQorICAgICAgICBURVNUX09QVElPTl9FTlVNX1RZUEUyID0gLTIzLA0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfZHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW1GaWVsZE5hbWVzOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW0gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW0gb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW0gTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5EdW1teU1lc3NhZ2VDb250YWluaW5nRW51bS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5EdW1teU1lc3NhZ2VDb250YWluaW5nRW51bS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW0uRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9kdW1teU1lc3NhZ2VDb250YWluaW5nRW51bUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9kdW1teU1lc3NhZ2VDb250YWluaW5nRW51bUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgc3RhdGljIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPER1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGUsIER1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGUuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIER1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGUoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9kdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIER1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGUgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBEdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIER1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGUgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxEdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlLCBEdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9EdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2R1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGVGaWVsZE5hbWVzOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBEdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIER1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBEdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIER1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBEdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIER1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihEdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPER1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGUsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKER1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGUgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBEdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIER1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGUgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBEdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkR1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGUuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5EdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChEdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkR1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGUuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9kdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2R1bW15TWVzc2FnZUludmFsaWRBc09wdGlvblR5cGVGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBEdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPEN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMsIEN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfY3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9jdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBDdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxDdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzLCBDdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9DdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2N1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXNGaWVsZE5hbWVzOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihDdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPEN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBDdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIEN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBDdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5DdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChDdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9jdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2N1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBDdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPEN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMsIEN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfY3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9jdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzLCBDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9DdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2N1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXNGaWVsZE5hbWVzOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPEN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIEN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5DdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9jdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2N1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxDdXN0b21PcHRpb25PdGhlclZhbHVlcywgQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEN1c3RvbU9wdGlvbk90aGVyVmFsdWVzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEN1c3RvbU9wdGlvbk90aGVyVmFsdWVzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBDdXN0b21PcHRpb25PdGhlclZhbHVlcygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfY3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfY3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBDdXN0b21PcHRpb25PdGhlclZhbHVlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBDdXN0b21PcHRpb25PdGhlclZhbHVlcyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9DdXN0b21PcHRpb25PdGhlclZhbHVlc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxDdXN0b21PcHRpb25PdGhlclZhbHVlcywgQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0N1c3RvbU9wdGlvbk90aGVyVmFsdWVzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2N1c3RvbU9wdGlvbk90aGVyVmFsdWVzRmllbGROYW1lczsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEN1c3RvbU9wdGlvbk90aGVyVmFsdWVzIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25PdGhlclZhbHVlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25PdGhlclZhbHVlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25PdGhlclZhbHVlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25PdGhlclZhbHVlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25PdGhlclZhbHVlcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDdXN0b21PcHRpb25PdGhlclZhbHVlcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBDdXN0b21PcHRpb25PdGhlclZhbHVlcyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihDdXN0b21PcHRpb25PdGhlclZhbHVlcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxDdXN0b21PcHRpb25PdGhlclZhbHVlcywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBDdXN0b21PcHRpb25PdGhlclZhbHVlcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBDdXN0b21PcHRpb25PdGhlclZhbHVlcyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEN1c3RvbU9wdGlvbk90aGVyVmFsdWVzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEN1c3RvbU9wdGlvbk90aGVyVmFsdWVzIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBDdXN0b21PcHRpb25PdGhlclZhbHVlcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShDdXN0b21PcHRpb25PdGhlclZhbHVlcyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbk90aGVyVmFsdWVzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfY3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfY3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBDdXN0b21PcHRpb25PdGhlclZhbHVlcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxTZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzLCBTZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBTZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMgZGVmYXVsdEluc3RhbmNlID0gbmV3IFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3NldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfc2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50c0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyAgfTsNCisgICAgcHVibGljIHN0YXRpYyBTZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBTZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8U2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cywgU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50c19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9zZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzRmllbGROYW1lczsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxTZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihTZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBTZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfc2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50c0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9zZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzLCBTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMgZGVmYXVsdEluc3RhbmNlID0gbmV3IFNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3NldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfc2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50c0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyAgfTsNCisgICAgcHVibGljIHN0YXRpYyBTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgU2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50cyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8U2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50cywgU2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50cy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfU2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50c19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9zZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzRmllbGROYW1lczsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50cyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50cyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50cyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoU2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50cyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgU2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50cyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgU2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50cyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50cy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoU2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50cykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfc2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50c0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9zZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgU2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50cygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIENvbXBsZXhPcHRpb25UeXBlMSA6IHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxDb21wbGV4T3B0aW9uVHlwZTEsIENvbXBsZXhPcHRpb25UeXBlMS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgQ29tcGxleE9wdGlvblR5cGUxKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENvbXBsZXhPcHRpb25UeXBlMSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQ29tcGxleE9wdGlvblR5cGUxKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9jb21wbGV4T3B0aW9uVHlwZTFGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImZvbyIsICJmb28yIiwgImZvbzMiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfY29tcGxleE9wdGlvblR5cGUxRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDgsIDE2LCAyNCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlMSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIENvbXBsZXhPcHRpb25UeXBlMSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBDb21wbGV4T3B0aW9uVHlwZTEgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdGlvblR5cGUxX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPENvbXBsZXhPcHRpb25UeXBlMSwgQ29tcGxleE9wdGlvblR5cGUxLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0aW9uVHlwZTFfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZvb0ZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZvbzsNCisgICAgcHJpdmF0ZSBpbnQgZm9vXzsNCisgICAgcHVibGljIGJvb2wgSGFzRm9vIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRm9vOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGb28gew0KKyAgICAgIGdldCB7IHJldHVybiBmb29fOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRm9vMkZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZvbzI7DQorICAgIHByaXZhdGUgaW50IGZvbzJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGb28yIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRm9vMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRm9vMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZvbzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRm9vM0ZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZvbzM7DQorICAgIHByaXZhdGUgaW50IGZvbzNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGb28zIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRm9vMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRm9vMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZvbzNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIUV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfY29tcGxleE9wdGlvblR5cGUxRmllbGROYW1lczsNCisgICAgICBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8Q29tcGxleE9wdGlvblR5cGUxLCBDb21wbGV4T3B0aW9uVHlwZTEuQnVpbGRlcj4uRXh0ZW5zaW9uV3JpdGVyIGV4dGVuc2lvbldyaXRlciA9IENyZWF0ZUV4dGVuc2lvbldyaXRlcih0aGlzKTsNCisgICAgICBpZiAoaGFzRm9vKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgRm9vKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZvbzIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIsIGZpZWxkX25hbWVzWzFdLCBGb28yKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZvbzMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDMsIGZpZWxkX25hbWVzWzJdLCBGb28zKTsNCisgICAgICB9DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoNTM2ODcwOTEyLCBvdXRwdXQpOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzRm9vKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIEZvbyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGb28yKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIsIEZvbzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRm9vMykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgzLCBGb28zKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBFeHRlbnNpb25zU2VyaWFsaXplZFNpemU7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGUxIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlMSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTEgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlMSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGUxIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlMSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTEgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGUxIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlMSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTEgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgQ29tcGxleE9wdGlvblR5cGUxIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKENvbXBsZXhPcHRpb25UeXBlMSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6RXh0ZW5kYWJsZUJ1aWxkZXI8Q29tcGxleE9wdGlvblR5cGUxLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihDb21wbGV4T3B0aW9uVHlwZTEgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBDb21wbGV4T3B0aW9uVHlwZTEgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgQ29tcGxleE9wdGlvblR5cGUxIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgQ29tcGxleE9wdGlvblR5cGUxIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgQ29tcGxleE9wdGlvblR5cGUxKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBDb21wbGV4T3B0aW9uVHlwZTEgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTEuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGxleE9wdGlvblR5cGUxIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBsZXhPcHRpb25UeXBlMSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgQ29tcGxleE9wdGlvblR5cGUxKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKENvbXBsZXhPcHRpb25UeXBlMSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKENvbXBsZXhPcHRpb25UeXBlMSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNGb28pIHsNCisgICAgICAgICAgRm9vID0gb3RoZXIuRm9vOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZvbzIpIHsNCisgICAgICAgICAgRm9vMiA9IG90aGVyLkZvbzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRm9vMykgew0KKyAgICAgICAgICBGb28zID0gb3RoZXIuRm9vMzsNCisgICAgICAgIH0NCisgICAgICAgICAgdGhpcy5NZXJnZUV4dGVuc2lvbkZpZWxkcyhvdGhlcik7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9jb21wbGV4T3B0aW9uVHlwZTFGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfY29tcGxleE9wdGlvblR5cGUxRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGb28gPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5mb29fKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRm9vMiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZvbzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRm9vMyA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZvbzNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGb28gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGb287IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGb28gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Gb287IH0NCisgICAgICAgIHNldCB7IFNldEZvbyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Rm9vKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGb28gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZvb18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZvbygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRm9vID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZm9vXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRm9vMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZvbzI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGb28yIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRm9vMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Rm9vMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Rm9vMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRm9vMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZm9vMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZvbzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZvbzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5mb28yXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRm9vMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZvbzM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGb28zIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRm9vMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Rm9vMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Rm9vMyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRm9vMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZm9vM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZvbzMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZvbzMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5mb28zXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlMSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIENvbXBsZXhPcHRpb25UeXBlMiA6IHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxDb21wbGV4T3B0aW9uVHlwZTIsIENvbXBsZXhPcHRpb25UeXBlMi5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgQ29tcGxleE9wdGlvblR5cGUyKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENvbXBsZXhPcHRpb25UeXBlMiBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQ29tcGxleE9wdGlvblR5cGUyKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9jb21wbGV4T3B0aW9uVHlwZTJGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImJhciIsICJiYXoiLCAiZnJlZCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9jb21wbGV4T3B0aW9uVHlwZTJGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAsIDE2LCAyNiB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlMiBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIENvbXBsZXhPcHRpb25UeXBlMiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBDb21wbGV4T3B0aW9uVHlwZTIgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdGlvblR5cGUyX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPENvbXBsZXhPcHRpb25UeXBlMiwgQ29tcGxleE9wdGlvblR5cGUyLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0aW9uVHlwZTJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgew0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIENvbXBsZXhPcHRpb25UeXBlNCA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPENvbXBsZXhPcHRpb25UeXBlNCwgQ29tcGxleE9wdGlvblR5cGU0LkJ1aWxkZXI+IHsNCisgICAgICAgIHByaXZhdGUgQ29tcGxleE9wdGlvblR5cGU0KCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDb21wbGV4T3B0aW9uVHlwZTQgZGVmYXVsdEluc3RhbmNlID0gbmV3IENvbXBsZXhPcHRpb25UeXBlNCgpLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2NvbXBsZXhPcHRpb25UeXBlNEZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAid2FsZG8iIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2NvbXBsZXhPcHRpb25UeXBlNEZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4IH07DQorICAgICAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlNCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21wbGV4T3B0aW9uVHlwZTQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIENvbXBsZXhPcHRpb25UeXBlNCBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0NvbXBsZXhPcHRpb25UeXBlMl9Db21wbGV4T3B0aW9uVHlwZTRfX0Rlc2NyaXB0b3I7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Q29tcGxleE9wdGlvblR5cGU0LCBDb21wbGV4T3B0aW9uVHlwZTQuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0aW9uVHlwZTJfQ29tcGxleE9wdGlvblR5cGU0X19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBDb21wbGV4T3B0NEZpZWxkTnVtYmVyID0gNzYzMzU0NjsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUyLlR5cGVzLkNvbXBsZXhPcHRpb25UeXBlND4gQ29tcGxleE9wdDQ7DQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IFdhbGRvRmllbGROdW1iZXIgPSAxOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc1dhbGRvOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgd2FsZG9fOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzV2FsZG8gew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzV2FsZG87IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgV2FsZG8gew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gd2FsZG9fOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2NvbXBsZXhPcHRpb25UeXBlNEZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNXYWxkbykgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzBdLCBXYWxkbyk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgIA0KKyAgICAgICAgICBzaXplID0gMDsNCisgICAgICAgICAgaWYgKGhhc1dhbGRvKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBXYWxkbyk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlNCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGU0IFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTQgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlNCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTQgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGU0IFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlNCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTQgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGU0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIENvbXBsZXhPcHRpb25UeXBlNCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQ29tcGxleE9wdGlvblR5cGU0IHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8Q29tcGxleE9wdGlvblR5cGU0LCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKENvbXBsZXhPcHRpb25UeXBlNCBjbG9uZUZyb20pIHsNCisgICAgICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgICAgICBwcml2YXRlIENvbXBsZXhPcHRpb25UeXBlNCByZXN1bHQ7DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIENvbXBsZXhPcHRpb25UeXBlNCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgQ29tcGxleE9wdGlvblR5cGU0IG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENvbXBsZXhPcHRpb25UeXBlNCgpOw0KKyAgICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBDb21wbGV4T3B0aW9uVHlwZTQgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUyLlR5cGVzLkNvbXBsZXhPcHRpb25UeXBlNC5EZXNjcmlwdG9yOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21wbGV4T3B0aW9uVHlwZTQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMi5UeXBlcy5Db21wbGV4T3B0aW9uVHlwZTQuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21wbGV4T3B0aW9uVHlwZTQgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGlzIENvbXBsZXhPcHRpb25UeXBlNCkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoQ29tcGxleE9wdGlvblR5cGU0KSBvdGhlcik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKENvbXBsZXhPcHRpb25UeXBlNCBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU0LkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzV2FsZG8pIHsNCisgICAgICAgICAgICAgIFdhbGRvID0gb3RoZXIuV2FsZG87DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2NvbXBsZXhPcHRpb25UeXBlNEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX2NvbXBsZXhPcHRpb25UeXBlNEZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzV2FsZG8gPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC53YWxkb18pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNXYWxkbyB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNXYWxkbzsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgV2FsZG8gew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuV2FsZG87IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRXYWxkbyh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRXYWxkbyhpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNXYWxkbyA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LndhbGRvXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyV2FsZG8oKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzV2FsZG8gPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQud2FsZG9fID0gMDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlNCgpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQmFyRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzQmFyOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMSBiYXJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNCYXIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNCYXI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUxIEJhciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGJhcl8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUxLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEJhekZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0JhejsNCisgICAgcHJpdmF0ZSBpbnQgYmF6XzsNCisgICAgcHVibGljIGJvb2wgSGFzQmF6IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQmF6OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBCYXogew0KKyAgICAgIGdldCB7IHJldHVybiBiYXpfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRnJlZEZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZyZWQ7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUyLlR5cGVzLkNvbXBsZXhPcHRpb25UeXBlNCBmcmVkXzsNCisgICAgcHVibGljIGJvb2wgSGFzRnJlZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZyZWQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUyLlR5cGVzLkNvbXBsZXhPcHRpb25UeXBlNCBGcmVkIHsNCisgICAgICBnZXQgeyByZXR1cm4gZnJlZF8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUyLlR5cGVzLkNvbXBsZXhPcHRpb25UeXBlNC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmIChIYXNGcmVkKSB7DQorICAgICAgICAgIGlmICghRnJlZC5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIUV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfY29tcGxleE9wdGlvblR5cGUyRmllbGROYW1lczsNCisgICAgICBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8Q29tcGxleE9wdGlvblR5cGUyLCBDb21wbGV4T3B0aW9uVHlwZTIuQnVpbGRlcj4uRXh0ZW5zaW9uV3JpdGVyIGV4dGVuc2lvbldyaXRlciA9IENyZWF0ZUV4dGVuc2lvbldyaXRlcih0aGlzKTsNCisgICAgICBpZiAoaGFzQmFyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDEsIGZpZWxkX25hbWVzWzBdLCBCYXIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQmF6KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyLCBmaWVsZF9uYW1lc1sxXSwgQmF6KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZyZWQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMywgZmllbGRfbmFtZXNbMl0sIEZyZWQpOw0KKyAgICAgIH0NCisgICAgICBleHRlbnNpb25Xcml0ZXIuV3JpdGVVbnRpbCg1MzY4NzA5MTIsIG91dHB1dCk7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNCYXIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxLCBCYXIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQmF6KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIsIEJheik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGcmVkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMywgRnJlZCk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlMiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGUyIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlMiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGUyIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlMiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGUyIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIENvbXBsZXhPcHRpb25UeXBlMiBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihDb21wbGV4T3B0aW9uVHlwZTIgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkV4dGVuZGFibGVCdWlsZGVyPENvbXBsZXhPcHRpb25UeXBlMiwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoQ29tcGxleE9wdGlvblR5cGUyIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQ29tcGxleE9wdGlvblR5cGUyIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIENvbXBsZXhPcHRpb25UeXBlMiBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIENvbXBsZXhPcHRpb25UeXBlMiBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IENvbXBsZXhPcHRpb25UeXBlMigpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQ29tcGxleE9wdGlvblR5cGUyIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUyLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBsZXhPcHRpb25UeXBlMiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21wbGV4T3B0aW9uVHlwZTIgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIENvbXBsZXhPcHRpb25UeXBlMikgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChDb21wbGV4T3B0aW9uVHlwZTIpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShDb21wbGV4T3B0aW9uVHlwZTIgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzQmFyKSB7DQorICAgICAgICAgIE1lcmdlQmFyKG90aGVyLkJhcik7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzQmF6KSB7DQorICAgICAgICAgIEJheiA9IG90aGVyLkJhejsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGcmVkKSB7DQorICAgICAgICAgIE1lcmdlRnJlZChvdGhlci5GcmVkKTsNCisgICAgICAgIH0NCisgICAgICAgICAgdGhpcy5NZXJnZUV4dGVuc2lvbkZpZWxkcyhvdGhlcik7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9jb21wbGV4T3B0aW9uVHlwZTJGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfY29tcGxleE9wdGlvblR5cGUyRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTEuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUxLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzQmFyKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKEJhcik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBCYXIgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNCYXogPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5iYXpfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI2OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU0LkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMi5UeXBlcy5Db21wbGV4T3B0aW9uVHlwZTQuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNGcmVkKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKEZyZWQpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgRnJlZCA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQmFyIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNCYXI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMSBCYXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5CYXI7IH0NCisgICAgICAgIHNldCB7IFNldEJhcih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QmFyKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmFyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5iYXJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QmFyKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNCYXIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmJhcl8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUJhcihnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTEgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNCYXIgJiYNCisgICAgICAgICAgICByZXN1bHQuYmFyXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTEuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmJhcl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTEuQ3JlYXRlQnVpbGRlcihyZXN1bHQuYmFyXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5iYXJfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzQmFyID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckJhcigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmFyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuYmFyXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQmF6IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQmF6OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgQmF6IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQmF6OyB9DQorICAgICAgICBzZXQgeyBTZXRCYXoodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEJheihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmF6ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5iYXpfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJCYXooKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0JheiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmJhel8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZyZWQgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZyZWQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMi5UeXBlcy5Db21wbGV4T3B0aW9uVHlwZTQgRnJlZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZyZWQ7IH0NCisgICAgICAgIHNldCB7IFNldEZyZWQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZyZWQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUyLlR5cGVzLkNvbXBsZXhPcHRpb25UeXBlNCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRnJlZCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZnJlZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGcmVkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMi5UeXBlcy5Db21wbGV4T3B0aW9uVHlwZTQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRnJlZCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZnJlZF8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUZyZWQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUyLlR5cGVzLkNvbXBsZXhPcHRpb25UeXBlNCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0ZyZWQgJiYNCisgICAgICAgICAgICByZXN1bHQuZnJlZF8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUyLlR5cGVzLkNvbXBsZXhPcHRpb25UeXBlNC5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQuZnJlZF8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTIuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU0LkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmZyZWRfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0LmZyZWRfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzRnJlZCA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGcmVkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGcmVkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZnJlZF8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTIoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBDb21wbGV4T3B0aW9uVHlwZTMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxDb21wbGV4T3B0aW9uVHlwZTMsIENvbXBsZXhPcHRpb25UeXBlMy5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgQ29tcGxleE9wdGlvblR5cGUzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENvbXBsZXhPcHRpb25UeXBlMyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQ29tcGxleE9wdGlvblR5cGUzKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9jb21wbGV4T3B0aW9uVHlwZTNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImNvbXBsZXhvcHRpb250eXBlNSIsICJxdXgiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfY29tcGxleE9wdGlvblR5cGUzRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDE5LCA4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGUzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGxleE9wdGlvblR5cGUzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIENvbXBsZXhPcHRpb25UeXBlMyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0aW9uVHlwZTNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Q29tcGxleE9wdGlvblR5cGUzLCBDb21wbGV4T3B0aW9uVHlwZTMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0NvbXBsZXhPcHRpb25UeXBlM19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgICNyZWdpb24gTmVzdGVkIHR5cGVzDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQ29tcGxleE9wdGlvblR5cGU1IDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8Q29tcGxleE9wdGlvblR5cGU1LCBDb21wbGV4T3B0aW9uVHlwZTUuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBDb21wbGV4T3B0aW9uVHlwZTUoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENvbXBsZXhPcHRpb25UeXBlNSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQ29tcGxleE9wdGlvblR5cGU1KCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfY29tcGxleE9wdGlvblR5cGU1RmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJwbHVnaCIgfTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfY29tcGxleE9wdGlvblR5cGU1RmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDI0IH07DQorICAgICAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlNSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21wbGV4T3B0aW9uVHlwZTUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIENvbXBsZXhPcHRpb25UeXBlNSBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0NvbXBsZXhPcHRpb25UeXBlM19Db21wbGV4T3B0aW9uVHlwZTVfX0Rlc2NyaXB0b3I7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Q29tcGxleE9wdGlvblR5cGU1LCBDb21wbGV4T3B0aW9uVHlwZTUuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0aW9uVHlwZTNfQ29tcGxleE9wdGlvblR5cGU1X19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBQbHVnaEZpZWxkTnVtYmVyID0gMzsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNQbHVnaDsNCisgICAgICAgIHByaXZhdGUgaW50IHBsdWdoXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc1BsdWdoIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc1BsdWdoOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IFBsdWdoIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHBsdWdoXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9jb21wbGV4T3B0aW9uVHlwZTVGaWVsZE5hbWVzOw0KKyAgICAgICAgICBpZiAoaGFzUGx1Z2gpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigzLCBmaWVsZF9uYW1lc1swXSwgUGx1Z2gpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIGlmIChoYXNQbHVnaCkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMywgUGx1Z2gpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgICAgIHJldHVybiBzaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGU1IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlNSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGU1IFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGU1IFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlNSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGU1IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlNSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpdmF0ZSBDb21wbGV4T3B0aW9uVHlwZTUgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKENvbXBsZXhPcHRpb25UeXBlNSBwcm90b3R5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPENvbXBsZXhPcHRpb25UeXBlNSwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihDb21wbGV4T3B0aW9uVHlwZTUgY2xvbmVGcm9tKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICAgICAgcHJpdmF0ZSBDb21wbGV4T3B0aW9uVHlwZTUgcmVzdWx0Ow0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBDb21wbGV4T3B0aW9uVHlwZTUgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIENvbXBsZXhPcHRpb25UeXBlNSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDb21wbGV4T3B0aW9uVHlwZTUoKTsNCisgICAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQ29tcGxleE9wdGlvblR5cGU1IE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMy5UeXBlcy5Db21wbGV4T3B0aW9uVHlwZTUuRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGxleE9wdGlvblR5cGU1IERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTMuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU1LkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGxleE9wdGlvblR5cGU1IEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciBpcyBDb21wbGV4T3B0aW9uVHlwZTUpIHsNCisgICAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKENvbXBsZXhPcHRpb25UeXBlNSkgb3RoZXIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShDb21wbGV4T3B0aW9uVHlwZTUgb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUzLlR5cGVzLkNvbXBsZXhPcHRpb25UeXBlNS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc1BsdWdoKSB7DQorICAgICAgICAgICAgICBQbHVnaCA9IG90aGVyLlBsdWdoOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9jb21wbGV4T3B0aW9uVHlwZTVGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgICAgIHRhZyA9IF9jb21wbGV4T3B0aW9uVHlwZTVGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAyNDogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNQbHVnaCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LnBsdWdoXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc1BsdWdoIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1BsdWdoOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBQbHVnaCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QbHVnaDsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldFBsdWdoKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBsdWdoKGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc1BsdWdoID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQucGx1Z2hfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQbHVnaCgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNQbHVnaCA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5wbHVnaF8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGU1KCkgew0KKyAgICAgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBRdXhGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNRdXg7DQorICAgIHByaXZhdGUgaW50IHF1eF87DQorICAgIHB1YmxpYyBib29sIEhhc1F1eCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1F1eDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUXV4IHsNCisgICAgICBnZXQgeyByZXR1cm4gcXV4XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IENvbXBsZXhPcHRpb25UeXBlNUZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0NvbXBsZXhPcHRpb25UeXBlNTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTMuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU1IGNvbXBsZXhPcHRpb25UeXBlNV87DQorICAgIHB1YmxpYyBib29sIEhhc0NvbXBsZXhPcHRpb25UeXBlNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0NvbXBsZXhPcHRpb25UeXBlNTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTMuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU1IENvbXBsZXhPcHRpb25UeXBlNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGNvbXBsZXhPcHRpb25UeXBlNV8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUzLlR5cGVzLkNvbXBsZXhPcHRpb25UeXBlNS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2NvbXBsZXhPcHRpb25UeXBlM0ZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc1F1eCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMV0sIFF1eCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNDb21wbGV4T3B0aW9uVHlwZTUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUdyb3VwKDIsIGZpZWxkX25hbWVzWzBdLCBDb21wbGV4T3B0aW9uVHlwZTUpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc1F1eCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBRdXgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQ29tcGxleE9wdGlvblR5cGU1KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlR3JvdXBTaXplKDIsIENvbXBsZXhPcHRpb25UeXBlNSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlMyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGUzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlMyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGUzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlMyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0aW9uVHlwZTMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdGlvblR5cGUzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIENvbXBsZXhPcHRpb25UeXBlMyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihDb21wbGV4T3B0aW9uVHlwZTMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8Q29tcGxleE9wdGlvblR5cGUzLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihDb21wbGV4T3B0aW9uVHlwZTMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBDb21wbGV4T3B0aW9uVHlwZTMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgQ29tcGxleE9wdGlvblR5cGUzIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgQ29tcGxleE9wdGlvblR5cGUzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgQ29tcGxleE9wdGlvblR5cGUzKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBDb21wbGV4T3B0aW9uVHlwZTMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGxleE9wdGlvblR5cGUzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBsZXhPcHRpb25UeXBlMyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgQ29tcGxleE9wdGlvblR5cGUzKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKENvbXBsZXhPcHRpb25UeXBlMykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKENvbXBsZXhPcHRpb25UeXBlMyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNRdXgpIHsNCisgICAgICAgICAgUXV4ID0gb3RoZXIuUXV4Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0NvbXBsZXhPcHRpb25UeXBlNSkgew0KKyAgICAgICAgICBNZXJnZUNvbXBsZXhPcHRpb25UeXBlNShvdGhlci5Db21wbGV4T3B0aW9uVHlwZTUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfY29tcGxleE9wdGlvblR5cGUzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2NvbXBsZXhPcHRpb25UeXBlM0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzUXV4ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQucXV4Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxOTogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUzLlR5cGVzLkNvbXBsZXhPcHRpb25UeXBlNS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTMuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU1LkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzQ29tcGxleE9wdGlvblR5cGU1KSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKENvbXBsZXhPcHRpb25UeXBlNSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkR3JvdXAoMiwgc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgQ29tcGxleE9wdGlvblR5cGU1ID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNRdXggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNRdXg7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBRdXggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5RdXg7IH0NCisgICAgICAgIHNldCB7IFNldFF1eCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UXV4KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNRdXggPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnF1eF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclF1eCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzUXV4ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQucXV4XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQ29tcGxleE9wdGlvblR5cGU1IHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNDb21wbGV4T3B0aW9uVHlwZTU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMy5UeXBlcy5Db21wbGV4T3B0aW9uVHlwZTUgQ29tcGxleE9wdGlvblR5cGU1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQ29tcGxleE9wdGlvblR5cGU1OyB9DQorICAgICAgICBzZXQgeyBTZXRDb21wbGV4T3B0aW9uVHlwZTUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldENvbXBsZXhPcHRpb25UeXBlNShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTMuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU1IHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDb21wbGV4T3B0aW9uVHlwZTUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmNvbXBsZXhPcHRpb25UeXBlNV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRDb21wbGV4T3B0aW9uVHlwZTUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUzLlR5cGVzLkNvbXBsZXhPcHRpb25UeXBlNS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDb21wbGV4T3B0aW9uVHlwZTUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmNvbXBsZXhPcHRpb25UeXBlNV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUNvbXBsZXhPcHRpb25UeXBlNShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0aW9uVHlwZTMuVHlwZXMuQ29tcGxleE9wdGlvblR5cGU1IHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzQ29tcGxleE9wdGlvblR5cGU1ICYmDQorICAgICAgICAgICAgcmVzdWx0LmNvbXBsZXhPcHRpb25UeXBlNV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ29tcGxleE9wdGlvblR5cGUzLlR5cGVzLkNvbXBsZXhPcHRpb25UeXBlNS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQuY29tcGxleE9wdGlvblR5cGU1XyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHRpb25UeXBlMy5UeXBlcy5Db21wbGV4T3B0aW9uVHlwZTUuQ3JlYXRlQnVpbGRlcihyZXN1bHQuY29tcGxleE9wdGlvblR5cGU1XykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5jb21wbGV4T3B0aW9uVHlwZTVfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzQ29tcGxleE9wdGlvblR5cGU1ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckNvbXBsZXhPcHRpb25UeXBlNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQ29tcGxleE9wdGlvblR5cGU1ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuY29tcGxleE9wdGlvblR5cGU1XyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIENvbXBsZXhPcHRpb25UeXBlMygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIENvbXBsZXhPcHQ2IDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8Q29tcGxleE9wdDYsIENvbXBsZXhPcHQ2LkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBDb21wbGV4T3B0NigpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDb21wbGV4T3B0NiBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQ29tcGxleE9wdDYoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2NvbXBsZXhPcHQ2RmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJ4eXp6eSIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9jb21wbGV4T3B0NkZpZWxkVGFncyA9IG5ldyB1aW50W10geyA2MDc1MTYwOCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHQ2IERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGxleE9wdDYgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQ29tcGxleE9wdDYgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQ29tcGxleE9wdDZfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Q29tcGxleE9wdDYsIENvbXBsZXhPcHQ2LkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Db21wbGV4T3B0Nl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgWHl6enlGaWVsZE51bWJlciA9IDc1OTM5NTE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNYeXp6eTsNCisgICAgcHJpdmF0ZSBpbnQgeHl6enlfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNYeXp6eSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1h5enp5OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBYeXp6eSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHh5enp5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfY29tcGxleE9wdDZGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNYeXp6eSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNzU5Mzk1MSwgZmllbGRfbmFtZXNbMF0sIFh5enp5KTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNYeXp6eSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg3NTkzOTUxLCBYeXp6eSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHQ2IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHQ2IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXhPcHQ2IFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDb21wbGV4T3B0NiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdDYgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdDYgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdDYgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdDYgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdDYgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxleE9wdDYgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgQ29tcGxleE9wdDYgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQ29tcGxleE9wdDYgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8Q29tcGxleE9wdDYsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKENvbXBsZXhPcHQ2IGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQ29tcGxleE9wdDYgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgQ29tcGxleE9wdDYgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBDb21wbGV4T3B0NiBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IENvbXBsZXhPcHQ2KCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBDb21wbGV4T3B0NiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHQ2LkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBsZXhPcHQ2IERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkNvbXBsZXhPcHQ2LkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGxleE9wdDYgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIENvbXBsZXhPcHQ2KSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKENvbXBsZXhPcHQ2KSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oQ29tcGxleE9wdDYgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Db21wbGV4T3B0Ni5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNYeXp6eSkgew0KKyAgICAgICAgICBYeXp6eSA9IG90aGVyLlh5enp5Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfY29tcGxleE9wdDZGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfY29tcGxleE9wdDZGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjA3NTE2MDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNYeXp6eSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0Lnh5enp5Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzWHl6enkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNYeXp6eTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFh5enp5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuWHl6enk7IH0NCisgICAgICAgIHNldCB7IFNldFh5enp5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRYeXp6eShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzWHl6enkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lnh5enp5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyWHl6enkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1h5enp5ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQueHl6enlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgQ29tcGxleE9wdDYoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBWYXJpb3VzQ29tcGxleE9wdGlvbnMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxWYXJpb3VzQ29tcGxleE9wdGlvbnMsIFZhcmlvdXNDb21wbGV4T3B0aW9ucy5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVmFyaW91c0NvbXBsZXhPcHRpb25zKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFZhcmlvdXNDb21wbGV4T3B0aW9ucyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVmFyaW91c0NvbXBsZXhPcHRpb25zKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF92YXJpb3VzQ29tcGxleE9wdGlvbnNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdmFyaW91c0NvbXBsZXhPcHRpb25zRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFZhcmlvdXNDb21wbGV4T3B0aW9ucyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFZhcmlvdXNDb21wbGV4T3B0aW9ucyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBWYXJpb3VzQ29tcGxleE9wdGlvbnMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVmFyaW91c0NvbXBsZXhPcHRpb25zX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFZhcmlvdXNDb21wbGV4T3B0aW9ucywgVmFyaW91c0NvbXBsZXhPcHRpb25zLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9WYXJpb3VzQ29tcGxleE9wdGlvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdmFyaW91c0NvbXBsZXhPcHRpb25zRmllbGROYW1lczsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVmFyaW91c0NvbXBsZXhPcHRpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFZhcmlvdXNDb21wbGV4T3B0aW9ucyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBWYXJpb3VzQ29tcGxleE9wdGlvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFZhcmlvdXNDb21wbGV4T3B0aW9ucyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVmFyaW91c0NvbXBsZXhPcHRpb25zIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFZhcmlvdXNDb21wbGV4T3B0aW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBWYXJpb3VzQ29tcGxleE9wdGlvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVmFyaW91c0NvbXBsZXhPcHRpb25zIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFZhcmlvdXNDb21wbGV4T3B0aW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBWYXJpb3VzQ29tcGxleE9wdGlvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVmFyaW91c0NvbXBsZXhPcHRpb25zIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFZhcmlvdXNDb21wbGV4T3B0aW9ucyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxWYXJpb3VzQ29tcGxleE9wdGlvbnMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFZhcmlvdXNDb21wbGV4T3B0aW9ucyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFZhcmlvdXNDb21wbGV4T3B0aW9ucyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBWYXJpb3VzQ29tcGxleE9wdGlvbnMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBWYXJpb3VzQ29tcGxleE9wdGlvbnMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBWYXJpb3VzQ29tcGxleE9wdGlvbnMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFZhcmlvdXNDb21wbGV4T3B0aW9ucyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlZhcmlvdXNDb21wbGV4T3B0aW9ucy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBWYXJpb3VzQ29tcGxleE9wdGlvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVmFyaW91c0NvbXBsZXhPcHRpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVmFyaW91c0NvbXBsZXhPcHRpb25zIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBWYXJpb3VzQ29tcGxleE9wdGlvbnMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVmFyaW91c0NvbXBsZXhPcHRpb25zKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVmFyaW91c0NvbXBsZXhPcHRpb25zIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVmFyaW91c0NvbXBsZXhPcHRpb25zLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdmFyaW91c0NvbXBsZXhPcHRpb25zRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3ZhcmlvdXNDb21wbGV4T3B0aW9uc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgc3RhdGljIFZhcmlvdXNDb21wbGV4T3B0aW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQgOiBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8QWdncmVnYXRlTWVzc2FnZVNldCwgQWdncmVnYXRlTWVzc2FnZVNldC5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgQWdncmVnYXRlTWVzc2FnZVNldCgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBZ2dyZWdhdGVNZXNzYWdlU2V0IGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBBZ2dyZWdhdGVNZXNzYWdlU2V0KCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9hZ2dyZWdhdGVNZXNzYWdlU2V0RmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2FnZ3JlZ2F0ZU1lc3NhZ2VTZXRGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlTWVzc2FnZVNldCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQWdncmVnYXRlTWVzc2FnZVNldCBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9BZ2dyZWdhdGVNZXNzYWdlU2V0X19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQsIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0FnZ3JlZ2F0ZU1lc3NhZ2VTZXRfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaWYgKCFFeHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2FnZ3JlZ2F0ZU1lc3NhZ2VTZXRGaWVsZE5hbWVzOw0KKyAgICAgIHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxBZ2dyZWdhdGVNZXNzYWdlU2V0LCBBZ2dyZWdhdGVNZXNzYWdlU2V0LkJ1aWxkZXI+LkV4dGVuc2lvbldyaXRlciBleHRlbnNpb25Xcml0ZXIgPSBDcmVhdGVFeHRlbnNpb25Xcml0ZXIodGhpcyk7DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoNTM2ODcwOTEyLCBvdXRwdXQpOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVBc01lc3NhZ2VTZXRUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IEV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZTsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQ7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVNZXNzYWdlU2V0IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlTWVzc2FnZVNldCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlTWVzc2FnZVNldCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlTWVzc2FnZVNldCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVNZXNzYWdlU2V0IFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlTWVzc2FnZVNldCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVNZXNzYWdlU2V0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgQWdncmVnYXRlTWVzc2FnZVNldCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihBZ2dyZWdhdGVNZXNzYWdlU2V0IHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpFeHRlbmRhYmxlQnVpbGRlcjxBZ2dyZWdhdGVNZXNzYWdlU2V0LCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihBZ2dyZWdhdGVNZXNzYWdlU2V0IGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQWdncmVnYXRlTWVzc2FnZVNldCByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBBZ2dyZWdhdGVNZXNzYWdlU2V0IFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgQWdncmVnYXRlTWVzc2FnZVNldCBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGVNZXNzYWdlU2V0LkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoQWdncmVnYXRlTWVzc2FnZVNldCkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGVNZXNzYWdlU2V0LkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICB0aGlzLk1lcmdlRXh0ZW5zaW9uRmllbGRzKG90aGVyKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2FnZ3JlZ2F0ZU1lc3NhZ2VTZXRGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfYWdncmVnYXRlTWVzc2FnZVNldEZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgc3RhdGljIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPEFnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50LCBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudC5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQgZGVmYXVsdEluc3RhbmNlID0gbmV3IEFnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50KCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9hZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudEZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAicyIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9hZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudEZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50IERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnRfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8QWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQsIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50LkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9BZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudF9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTWVzc2FnZVNldEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTU0NDc1NDI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQ+IE1lc3NhZ2VTZXRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgU0ZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc1M7DQorICAgIHByaXZhdGUgc3RyaW5nIHNfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc1Mgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNTOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBTIHsNCisgICAgICBnZXQgeyByZXR1cm4gc187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2FnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50RmllbGROYW1lczsNCisgICAgICBpZiAoaGFzUykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzBdLCBTKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNTKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxLCBTKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50IFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50IG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50IE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50LkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc1MpIHsNCisgICAgICAgICAgUyA9IG90aGVyLlM7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9hZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9hZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudEZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1MgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuc18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1Mgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNTOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgUyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlM7IH0NCisgICAgICAgIHNldCB7IFNldFModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFMoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5zXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzUyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnNfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50KCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQWdncmVnYXRlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8QWdncmVnYXRlLCBBZ2dyZWdhdGUuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEFnZ3JlZ2F0ZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBZ2dyZWdhdGUgZGVmYXVsdEluc3RhbmNlID0gbmV3IEFnZ3JlZ2F0ZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfYWdncmVnYXRlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJmaWxlIiwgImkiLCAibXNldCIsICJzIiwgInN1YiIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9hZ2dyZWdhdGVGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMzQsIDgsIDQyLCAxOCwgMjYgfTsNCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGUgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBBZ2dyZWdhdGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQWdncmVnYXRlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0FnZ3JlZ2F0ZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxBZ2dyZWdhdGUsIEFnZ3JlZ2F0ZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQWdncmVnYXRlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOZXN0ZWRGaWVsZE51bWJlciA9IDE1NDc2OTAzOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZT4gTmVzdGVkOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IElGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNJOw0KKyAgICBwcml2YXRlIGludCBpXzsNCisgICAgcHVibGljIGJvb2wgSGFzSSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0k7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEkgew0KKyAgICAgIGdldCB7IHJldHVybiBpXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFNGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNTOw0KKyAgICBwcml2YXRlIHN0cmluZyBzXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNTIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzUzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgUyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgU3ViRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzU3ViOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZSBzdWJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNTdWIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNTdWI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlIFN1YiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHN1Yl8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpbGVGaWVsZE51bWJlciA9IDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWxlOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVPcHRpb25zIGZpbGVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWxlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmlsZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlT3B0aW9ucyBGaWxlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmlsZV8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZU9wdGlvbnMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTXNldEZpZWxkTnVtYmVyID0gNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc01zZXQ7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldCBtc2V0XzsNCisgICAgcHVibGljIGJvb2wgSGFzTXNldCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc01zZXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldCBNc2V0IHsNCisgICAgICBnZXQgeyByZXR1cm4gbXNldF8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmIChIYXNTdWIpIHsNCisgICAgICAgICAgaWYgKCFTdWIuSXNJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKEhhc0ZpbGUpIHsNCisgICAgICAgICAgaWYgKCFGaWxlLklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2FnZ3JlZ2F0ZUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0kpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzFdLCBJKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1MpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygyLCBmaWVsZF9uYW1lc1szXSwgUyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNTdWIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMywgZmllbGRfbmFtZXNbNF0sIFN1Yik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWxlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDQsIGZpZWxkX25hbWVzWzBdLCBGaWxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc01zZXQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoNSwgZmllbGRfbmFtZXNbMl0sIE1zZXQpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0kpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgSSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNTKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgyLCBTKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1N1Yikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDMsIFN1Yik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWxlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoNCwgRmlsZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNNc2V0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoNSwgTXNldCk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIEFnZ3JlZ2F0ZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihBZ2dyZWdhdGUgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8QWdncmVnYXRlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihBZ2dyZWdhdGUgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBBZ2dyZWdhdGUgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgQWdncmVnYXRlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgQWdncmVnYXRlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgQWdncmVnYXRlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBBZ2dyZWdhdGUgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGUuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQWdncmVnYXRlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEFnZ3JlZ2F0ZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgQWdncmVnYXRlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEFnZ3JlZ2F0ZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEFnZ3JlZ2F0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNJKSB7DQorICAgICAgICAgIEkgPSBvdGhlci5JOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1MpIHsNCisgICAgICAgICAgUyA9IG90aGVyLlM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzU3ViKSB7DQorICAgICAgICAgIE1lcmdlU3ViKG90aGVyLlN1Yik7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmlsZSkgew0KKyAgICAgICAgICBNZXJnZUZpbGUob3RoZXIuRmlsZSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzTXNldCkgew0KKyAgICAgICAgICBNZXJnZU1zZXQob3RoZXIuTXNldCk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9hZ2dyZWdhdGVGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfYWdncmVnYXRlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNJID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuaV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNTID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LnNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI2OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGUuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzU3ViKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKFN1Yik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBTdWIgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzQ6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVPcHRpb25zLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVPcHRpb25zLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzRmlsZSkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShGaWxlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIEZpbGUgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDI6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZU1lc3NhZ2VTZXQuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldC5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc01zZXQpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oTXNldCk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBNc2V0ID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNJIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzSTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5JOyB9DQorICAgICAgICBzZXQgeyBTZXRJKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRJKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5pXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFySSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNTIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzUzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIFMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5TOyB9DQorICAgICAgICBzZXQgeyBTZXRTKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRTKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzUyA9IHRydWU7DQorICAgICAgICByZXN1bHQuc18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1MgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5zXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1N1YiB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzU3ViOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGUgU3ViIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuU3ViOyB9DQorICAgICAgICBzZXQgeyBTZXRTdWIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFN1YihnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGUgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1N1YiA9IHRydWU7DQorICAgICAgICByZXN1bHQuc3ViXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFN1YihnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGUuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU3ViID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5zdWJfID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VTdWIoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzU3ViICYmDQorICAgICAgICAgICAgcmVzdWx0LnN1Yl8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5zdWJfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LnN1Yl8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuc3ViXyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc1N1YiA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTdWIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1N1YiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnN1Yl8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpbGUgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpbGU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVPcHRpb25zIEZpbGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWxlOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWxlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWxlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVPcHRpb25zIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWxlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWxlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpbGUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZU9wdGlvbnMuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmlsZSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmlsZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUZpbGUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZU9wdGlvbnMgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNGaWxlICYmDQorICAgICAgICAgICAgcmVzdWx0LmZpbGVfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVPcHRpb25zLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5maWxlXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVPcHRpb25zLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmZpbGVfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0LmZpbGVfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzRmlsZSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWxlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWxlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmlsZV8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc01zZXQgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc01zZXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZU1lc3NhZ2VTZXQgTXNldCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk1zZXQ7IH0NCisgICAgICAgIHNldCB7IFNldE1zZXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE1zZXQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTXNldCA9IHRydWU7DQorICAgICAgICByZXN1bHQubXNldF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRNc2V0KGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkFnZ3JlZ2F0ZU1lc3NhZ2VTZXQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTXNldCA9IHRydWU7DQorICAgICAgICByZXN1bHQubXNldF8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU1zZXQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc01zZXQgJiYNCisgICAgICAgICAgICByZXN1bHQubXNldF8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZVNldC5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQubXNldF8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGVNZXNzYWdlU2V0LkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm1zZXRfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm1zZXRfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzTXNldCA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJNc2V0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNc2V0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubXNldF8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBBZ2dyZWdhdGUoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBBZ2dyZWdhdGVNZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8QWdncmVnYXRlTWVzc2FnZSwgQWdncmVnYXRlTWVzc2FnZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgQWdncmVnYXRlTWVzc2FnZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBZ2dyZWdhdGVNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBBZ2dyZWdhdGVNZXNzYWdlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9hZ2dyZWdhdGVNZXNzYWdlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJmaWVsZG5hbWUiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfYWdncmVnYXRlTWVzc2FnZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEFnZ3JlZ2F0ZU1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQWdncmVnYXRlTWVzc2FnZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEN1c3RvbU9wdGlvbnNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9BZ2dyZWdhdGVNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEFnZ3JlZ2F0ZU1lc3NhZ2UsIEFnZ3JlZ2F0ZU1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0FnZ3JlZ2F0ZU1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkbmFtZUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkbmFtZTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGRuYW1lXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGRuYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGRuYW1lOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZG5hbWUgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZG5hbWVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9hZ2dyZWdhdGVNZXNzYWdlRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzRmllbGRuYW1lKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgRmllbGRuYW1lKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNGaWVsZG5hbWUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgRmllbGRuYW1lKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZU1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZU1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZU1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZU1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIEFnZ3JlZ2F0ZU1lc3NhZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQWdncmVnYXRlTWVzc2FnZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxBZ2dyZWdhdGVNZXNzYWdlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihBZ2dyZWdhdGVNZXNzYWdlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQWdncmVnYXRlTWVzc2FnZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBBZ2dyZWdhdGVNZXNzYWdlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgQWdncmVnYXRlTWVzc2FnZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEFnZ3JlZ2F0ZU1lc3NhZ2UoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEFnZ3JlZ2F0ZU1lc3NhZ2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGVNZXNzYWdlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEFnZ3JlZ2F0ZU1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQWdncmVnYXRlTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEFnZ3JlZ2F0ZU1lc3NhZ2UgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEFnZ3JlZ2F0ZU1lc3NhZ2UpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoQWdncmVnYXRlTWVzc2FnZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEFnZ3JlZ2F0ZU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5BZ2dyZWdhdGVNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkbmFtZSkgew0KKyAgICAgICAgICBGaWVsZG5hbWUgPSBvdGhlci5GaWVsZG5hbWU7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9hZ2dyZWdhdGVNZXNzYWdlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2FnZ3JlZ2F0ZU1lc3NhZ2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkbmFtZSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkbmFtZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkbmFtZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkbmFtZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkbmFtZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkbmFtZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGRuYW1lKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZG5hbWUoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkbmFtZSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGRuYW1lXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGRuYW1lKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZG5hbWUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZG5hbWVfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgQWdncmVnYXRlTWVzc2FnZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCisgICNyZWdpb24gU2VydmljZXMNCisgIC8qDQorICAqIFNlcnZpY2UgZ2VuZXJhdGlvbiBpcyBub3cgZGlzYWJsZWQgYnkgZGVmYXVsdCwgdXNlIHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGVuYWJsZToNCisgICogb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykuc2VydmljZV9nZW5lcmF0b3JfdHlwZSA9IEdFTkVSSUM7DQorICAqLw0KKyAgLyoNCisgICogU2VydmljZSBnZW5lcmF0aW9uIGlzIG5vdyBkaXNhYmxlZCBieSBkZWZhdWx0LCB1c2UgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gZW5hYmxlOg0KKyAgKiBvcHRpb24gKGdvb2dsZS5wcm90b2J1Zi5jc2hhcnBfZmlsZV9vcHRpb25zKS5zZXJ2aWNlX2dlbmVyYXRvcl90eXBlID0gR0VORVJJQzsNCisgICovDQorICAjZW5kcmVnaW9uDQorICANCit9DQorDQorI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdEVtYmVkT3B0aW1pemVGb3JQcm90b0ZpbGUuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RFbWJlZE9wdGltaXplRm9yUHJvdG9GaWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMWIxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RFbWJlZE9wdGltaXplRm9yUHJvdG9GaWxlLmNzCkBAIC0wLDAgKzEsNDQyIEBACisvLyBHZW5lcmF0ZWQgYnkgUHJvdG9HZW4sIFZlcnNpb249Mi40LjEuNTU1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTU1ZjcxMjUyMzRiZWI1ODkuICBETyBOT1QgRURJVCENCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxDQorI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KKw0KK3VzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zIHsNCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBVbml0VGVzdEVtYmVkT3B0aW1pemVGb3JQcm90b0ZpbGUgew0KKyAgDQorICAgICNyZWdpb24gRXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbg0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgew0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBTdGF0aWMgdmFyaWFibGVzDQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbWJlZE9wdGltaXplZEZvclNpemVfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIERlc2NyaXB0b3INCisgICAgcHVibGljIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOw0KKyAgICANCisgICAgc3RhdGljIFVuaXRUZXN0RW1iZWRPcHRpbWl6ZUZvclByb3RvRmlsZSgpIHsNCisgICAgICBieXRlW10gZGVzY3JpcHRvckRhdGEgPSBnbG9iYWw6OlN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoDQorICAgICAgICAgIHN0cmluZy5Db25jYXQoDQorICAgICAgICAgICAgIkNqRm5iMjluYkdVdmNISnZkRzlpZFdZdmRXNXBkSFJsYzNSZlpXMWlaV1JmYjNCMGFXMXBlbVZmWm05eSIsIA0KKyAgICAgICAgICAgICJMbkJ5YjNSdkVoRndjbTkwYjJKMVpsOTFibWwwZEdWemRCb2taMjl2WjJ4bEwzQnliM1J2WW5WbUwyTnoiLCANCisgICAgICAgICAgICAiYUdGeWNGOXZjSFJwYjI1ekxuQnliM1J2R2l0bmIyOW5iR1V2Y0hKdmRHOWlkV1l2ZFc1cGRIUmxjM1JmIiwgDQorICAgICAgICAgICAgImIzQjBhVzFwZW1WZlptOXlMbkJ5YjNSdklxRUJDaGxVWlhOMFJXMWlaV1JQY0hScGJXbDZaV1JHYjNKVCIsIA0KKyAgICAgICAgICAgICJhWHBsRWtFS0VHOXdkR2x2Ym1Gc1gyMWxjM05oWjJVWUFTQUJLQXN5Snk1d2NtOTBiMkoxWmw5MWJtbDAiLCANCisgICAgICAgICAgICAiZEdWemRDNVVaWE4wVDNCMGFXMXBlbVZrUm05eVUybDZaUkpCQ2hCeVpYQmxZWFJsWkY5dFpYTnpZV2RsIiwgDQorICAgICAgICAgICAgIkdBSWdBeWdMTWljdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRTl3ZEdsdGFYcGxaRVp2Y2xOcCIsIA0KKyAgICAgICAgICAgICJlbVZDUzBnQndqNUdDaUZIYjI5bmJHVXVVSEp2ZEc5amIyeENkV1ptWlhKekxsUmxjM1JRY205MGIzTVMiLCANCisgICAgICAgICAgIklWVnVhWFJVWlhOMFJXMWlaV1JQY0hScGJXbDZaVVp2Y2xCeWIzUnZSbWxzWlE9PSIpKTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyIGFzc2lnbmVyID0gZGVsZWdhdGUocGJkOjpGaWxlRGVzY3JpcHRvciByb290KSB7DQorICAgICAgICBkZXNjcmlwdG9yID0gcm9vdDsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIk9wdGlvbmFsTWVzc2FnZSIsICJSZXBlYXRlZE1lc3NhZ2UiLCB9KTsNCisgICAgICAgIHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IHBiOjpFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0T3B0aW1pemVGb3JQcm90b0ZpbGUuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIHJldHVybiByZWdpc3RyeTsNCisgICAgICB9Ow0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKGRlc2NyaXB0b3JEYXRhLA0KKyAgICAgICAgICBuZXcgcGJkOjpGaWxlRGVzY3JpcHRvcltdIHsNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5EZXNjcmlwdG9yLCANCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RPcHRpbWl6ZUZvclByb3RvRmlsZS5EZXNjcmlwdG9yLCANCisgICAgICAgICAgfSwgYXNzaWduZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICB9DQorICAjcmVnaW9uIE1lc3NhZ2VzDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplLCBUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RFbWJlZE9wdGltaXplZEZvclNpemVGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIm9wdGlvbmFsX21lc3NhZ2UiLCAicmVwZWF0ZWRfbWVzc2FnZSIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwLCAxOCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFbWJlZE9wdGltaXplRm9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplLCBUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEVtYmVkT3B0aW1pemVGb3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbE1lc3NhZ2VGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbE1lc3NhZ2U7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE9wdGltaXplZEZvclNpemUgb3B0aW9uYWxNZXNzYWdlXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxNZXNzYWdlOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RPcHRpbWl6ZWRGb3JTaXplIE9wdGlvbmFsTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsTWVzc2FnZV8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE9wdGltaXplZEZvclNpemUuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRNZXNzYWdlRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RPcHRpbWl6ZWRGb3JTaXplPiByZXBlYXRlZE1lc3NhZ2VfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RPcHRpbWl6ZWRGb3JTaXplPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW1pemVkRm9yU2l6ZT4gUmVwZWF0ZWRNZXNzYWdlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkTWVzc2FnZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkTWVzc2FnZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRNZXNzYWdlXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW1pemVkRm9yU2l6ZSBHZXRSZXBlYXRlZE1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkTWVzc2FnZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaWYgKEhhc09wdGlvbmFsTWVzc2FnZSkgew0KKyAgICAgICAgICBpZiAoIU9wdGlvbmFsTWVzc2FnZS5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW1pemVkRm9yU2l6ZSBlbGVtZW50IGluIFJlcGVhdGVkTWVzc2FnZUxpc3QpIHsNCisgICAgICAgICAgaWYgKCFlbGVtZW50LklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RFbWJlZE9wdGltaXplZEZvclNpemVGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbE1lc3NhZ2UpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMSwgZmllbGRfbmFtZXNbMF0sIE9wdGlvbmFsTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZE1lc3NhZ2VfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDIsIGZpZWxkX25hbWVzWzFdLCByZXBlYXRlZE1lc3NhZ2VfKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbE1lc3NhZ2UpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxLCBPcHRpb25hbE1lc3NhZ2UpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW1pemVkRm9yU2l6ZSBlbGVtZW50IGluIFJlcGVhdGVkTWVzc2FnZUxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgyLCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJlcGVhdGVkTWVzc2FnZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFbWJlZE9wdGltaXplZEZvclNpemUuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFbWJlZE9wdGltaXplZEZvclNpemUuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxNZXNzYWdlKSB7DQorICAgICAgICAgIE1lcmdlT3B0aW9uYWxNZXNzYWdlKG90aGVyLk9wdGlvbmFsTWVzc2FnZSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRNZXNzYWdlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VfLkFkZChvdGhlci5yZXBlYXRlZE1lc3NhZ2VfKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RFbWJlZE9wdGltaXplZEZvclNpemVGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE9wdGltaXplZEZvclNpemUuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE9wdGltaXplZEZvclNpemUuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbE1lc3NhZ2UpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oT3B0aW9uYWxNZXNzYWdlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIE9wdGlvbmFsTWVzc2FnZSA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VfLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW1pemVkRm9yU2l6ZS5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbE1lc3NhZ2Ugew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsTWVzc2FnZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE9wdGltaXplZEZvclNpemUgT3B0aW9uYWxNZXNzYWdlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxNZXNzYWdlOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbE1lc3NhZ2UodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW1pemVkRm9yU2l6ZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxNZXNzYWdlXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlT3B0aW9uYWxNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RPcHRpbWl6ZWRGb3JTaXplIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzT3B0aW9uYWxNZXNzYWdlICYmDQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTWVzc2FnZV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE9wdGltaXplZEZvclNpemUuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTWVzc2FnZV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW1pemVkRm9yU2l6ZS5DcmVhdGVCdWlsZGVyKHJlc3VsdC5vcHRpb25hbE1lc3NhZ2VfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTWVzc2FnZV8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxNZXNzYWdlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbE1lc3NhZ2UgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbE1lc3NhZ2VfID0gbnVsbDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RPcHRpbWl6ZWRGb3JTaXplPiBSZXBlYXRlZE1lc3NhZ2VMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkTWVzc2FnZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZE1lc3NhZ2VDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkTWVzc2FnZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW1pemVkRm9yU2l6ZSBHZXRSZXBlYXRlZE1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkTWVzc2FnZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkTWVzc2FnZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RPcHRpbWl6ZWRGb3JTaXplIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkTWVzc2FnZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTWVzc2FnZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RPcHRpbWl6ZWRGb3JTaXplIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTWVzc2FnZV8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkTWVzc2FnZShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RPcHRpbWl6ZWRGb3JTaXplPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkTWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFbWJlZE9wdGltaXplRm9yUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgICNlbmRyZWdpb24NCisgIA0KK30NCisNCisjZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0RW1wdHlQcm90b0ZpbGUuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RFbXB0eVByb3RvRmlsZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGYxMDM0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0RW1wdHlQcm90b0ZpbGUuY3MKQEAgLTAsMCArMSw1MCBAQAorLy8gR2VuZXJhdGVkIGJ5IFByb3RvR2VuLCBWZXJzaW9uPTIuNC4xLjU1NSwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj01NWY3MTI1MjM0YmViNTg5LiAgRE8gTk9UIEVESVQhDQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQ0KKyNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCisNCit1c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVyczsNCit1c2luZyBwYmMgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnM7DQordXNpbmcgcGJkID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcyB7DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVW5pdFRlc3RFbXB0eVByb3RvRmlsZSB7DQorICANCisgICAgI3JlZ2lvbiBFeHRlbnNpb24gcmVnaXN0cmF0aW9uDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3RlckFsbEV4dGVuc2lvbnMocGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIFN0YXRpYyB2YXJpYWJsZXMNCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIERlc2NyaXB0b3INCisgICAgcHVibGljIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOw0KKyAgICANCisgICAgc3RhdGljIFVuaXRUZXN0RW1wdHlQcm90b0ZpbGUoKSB7DQorICAgICAgYnl0ZVtdIGRlc2NyaXB0b3JEYXRhID0gZ2xvYmFsOjpTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKA0KKyAgICAgICAgICBzdHJpbmcuQ29uY2F0KA0KKyAgICAgICAgICAgICJDaVJuYjI5bmJHVXZjSEp2ZEc5aWRXWXZkVzVwZEhSbGMzUmZaVzF3ZEhrdWNISnZkRzhhSkdkdmIyZHMiLCANCisgICAgICAgICAgICAiWlM5d2NtOTBiMkoxWmk5amMyaGhjbkJmYjNCMGFXOXVjeTV3Y205MGIwSSt3ajQ3Q2lGSGIyOW5iR1V1IiwgDQorICAgICAgICAgICAgIlVISnZkRzlqYjJ4Q2RXWm1aWEp6TGxSbGMzUlFjbTkwYjNNU0ZsVnVhWFJVWlhOMFJXMXdkSGxRY205MCIsIA0KKyAgICAgICAgICAiYjBacGJHVT0iKSk7DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciBhc3NpZ25lciA9IGRlbGVnYXRlKHBiZDo6RmlsZURlc2NyaXB0b3Igcm9vdCkgew0KKyAgICAgICAgZGVzY3JpcHRvciA9IHJvb3Q7DQorICAgICAgICBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICByZXR1cm4gcmVnaXN0cnk7DQorICAgICAgfTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbShkZXNjcmlwdG9yRGF0YSwNCisgICAgICAgICAgbmV3IHBiZDo6RmlsZURlc2NyaXB0b3JbXSB7DQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuRGVzY3JpcHRvciwgDQorICAgICAgICAgIH0sIGFzc2lnbmVyKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgfQ0KK30NCisNCisjZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOGY0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RFeHRyYXNJc3N1ZXNQcm90b0ZpbGUuY3MKQEAgLTAsMCArMSwzNDQzIEBACisvLyBHZW5lcmF0ZWQgYnkgUHJvdG9HZW4sIFZlcnNpb249Mi40LjEuNTU1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTU1ZjcxMjUyMzRiZWI1ODkuICBETyBOT1QgRURJVCENCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxDQorI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KKw0KK3VzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCituYW1lc3BhY2UgVW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3Mgew0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlIHsNCisgIA0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gU3RhdGljIHZhcmlhYmxlcw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19BX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkEsIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuQS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19BX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX0JfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuQiwgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5CLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX0JfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfQUJfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuQUIsIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuQUIuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfQUJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfTnVtYmVyRmllbGRfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTnVtYmVyRmllbGQsIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTnVtYmVyRmllbGQuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfTnVtYmVyRmllbGRfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfTXlNZXNzYWdlQVJlZmVyZW5jZUJfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQVJlZmVyZW5jZUIsIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQVJlZmVyZW5jZUIuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfTXlNZXNzYWdlQVJlZmVyZW5jZUJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfTXlNZXNzYWdlQlJlZmVyZW5jZUFfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQlJlZmVyZW5jZUEsIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQlJlZmVyZW5jZUEuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfTXlNZXNzYWdlQlJlZmVyZW5jZUFfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfTmVnYXRpdmVFbnVtTWVzc2FnZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW1NZXNzYWdlLCBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk5lZ2F0aXZlRW51bU1lc3NhZ2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfTmVnYXRpdmVFbnVtTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19EZXByZWNhdGVkQ2hpbGRfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZENoaWxkLCBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRDaGlsZC5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19EZXByZWNhdGVkQ2hpbGRfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2VfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UsIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfSXRlbUZpZWxkX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkl0ZW1GaWVsZCwgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5JdGVtRmllbGQuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfSXRlbUZpZWxkX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBEZXNjcmlwdG9yDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIHByaXZhdGUgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsNCisgICAgDQorICAgIHN0YXRpYyBVbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZSgpIHsNCisgICAgICBieXRlW10gZGVzY3JpcHRvckRhdGEgPSBnbG9iYWw6OlN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoDQorICAgICAgICAgIHN0cmluZy5Db25jYXQoDQorICAgICAgICAgICAgIkNoeGxlSFJsYzNRdmRXNXBkSFJsYzNSZmFYTnpkV1Z6TG5CeWIzUnZFZzkxYm1sMGRHVnpkRjlwYzNOMSIsIA0KKyAgICAgICAgICAgICJaWE1hSkdkdmIyZHNaUzl3Y205MGIySjFaaTlqYzJoaGNuQmZiM0IwYVc5dWN5NXdjbTkwYnlJUENnRkIiLCANCisgICAgICAgICAgICAiRWdvS0FsOUJHQUVnQVNnRklnOEtBVUlTQ2dvQ1FsOFlBU0FCS0FVaUVRb0NRVUlTQ3dvRFlWOWlHQUVnIiwgDQorICAgICAgICAgICAgIkFTZ0ZJaG9LQzA1MWJXSmxja1pwWld4a0Vnc0tBMTh3TVJnQklBRW9CU0pNQ2hSTmVVMWxjM05oWjJWQiIsIA0KKyAgICAgICAgICAgICJVbVZtWlhKbGJtTmxRaEkwQ2dWMllXeDFaUmdCSUFJb0N6SWxMblZ1YVhSMFpYTjBYMmx6YzNWbGN5NU4iLCANCisgICAgICAgICAgICAiZVUxbGMzTmhaMlZDVW1WbVpYSmxibU5sUVNKTUNoUk5lVTFsYzNOaFoyVkNVbVZtWlhKbGJtTmxRUkkwIiwgDQorICAgICAgICAgICAgIkNnVjJZV3gxWlJnQklBSW9DeklsTG5WdWFYUjBaWE4wWDJsemMzVmxjeTVOZVUxbGMzTmhaMlZCVW1WbSIsIA0KKyAgICAgICAgICAgICJaWEpsYm1ObFFpS3NBUW9UVG1WbllYUnBkbVZGYm5WdFRXVnpjMkZuWlJJc0NnVjJZV3gxWlJnQklBRW8iLCANCisgICAgICAgICAgICAiRGpJZExuVnVhWFIwWlhOMFgybHpjM1ZsY3k1T1pXZGhkR2wyWlVWdWRXMFNMUW9HZG1Gc2RXVnpHQUlnIiwgDQorICAgICAgICAgICAgIkF5Z09NaDB1ZFc1cGRIUmxjM1JmYVhOemRXVnpMazVsWjJGMGFYWmxSVzUxYlJJNENnMXdZV05yWldSZiIsIA0KKyAgICAgICAgICAgICJkbUZzZFdWekdBTWdBeWdPTWgwdWRXNXBkSFJsYzNSZmFYTnpkV1Z6TGs1bFoyRjBhWFpsUlc1MWJVSUMiLCANCisgICAgICAgICAgICAiRUFFaUVRb1BSR1Z3Y21WallYUmxaRU5vYVd4a0lya0NDaGRFWlhCeVpXTmhkR1ZrUm1sbGJHUnpUV1Z6IiwgDQorICAgICAgICAgICAgImMyRm5aUklhQ2c1UWNtbHRhWFJwZG1WV1lXeDFaUmdCSUFFb0JVSUNHQUVTR2dvT1VISnBiV2wwYVhabCIsIA0KKyAgICAgICAgICAgICJRWEp5WVhrWUFpQURLQVZDQWhnQkVqb0tERTFsYzNOaFoyVldZV3gxWlJnRElBRW9DeklnTG5WdWFYUjAiLCANCisgICAgICAgICAgICAiWlhOMFgybHpjM1ZsY3k1RVpYQnlaV05oZEdWa1EyaHBiR1JDQWhnQkVqb0tERTFsYzNOaFoyVkJjbkpoIiwgDQorICAgICAgICAgICAgImVSZ0VJQU1vQ3pJZ0xuVnVhWFIwWlhOMFgybHpjM1ZsY3k1RVpYQnlaV05oZEdWa1EyaHBiR1JDQWhnQiIsIA0KKyAgICAgICAgICAgICJFallLQ1VWdWRXMVdZV3gxWlJnRklBRW9EaklmTG5WdWFYUjBaWE4wWDJsemMzVmxjeTVFWlhCeVpXTmgiLCANCisgICAgICAgICAgICAiZEdWa1JXNTFiVUlDR0FFU05nb0pSVzUxYlVGeWNtRjVHQVlnQXlnT01oOHVkVzVwZEhSbGMzUmZhWE56IiwgDQorICAgICAgICAgICAgImRXVnpMa1JsY0hKbFkyRjBaV1JGYm5WdFFnSVlBU0laQ2dsSmRHVnRSbWxsYkdRU0RBb0VhWFJsYlJnQiIsIA0KKyAgICAgICAgICAgICJJQUVvQlNwSENneE9aV2RoZEdsMlpVVnVkVzBTRmdvSlJtbDJaVUpsYkc5M0VQdi8vLy8vLy8vLy93RVMiLCANCisgICAgICAgICAgICAiRlFvSVRXbHVkWE5QYm1VUS8vLy8vLy8vLy8vL0FSSUlDZ1JhWlhKdkVBQXFHUW9PUkdWd2NtVmpZWFJsIiwgDQorICAgICAgICAgICAgIlpFVnVkVzBTQndvRGIyNWxFQUZDUUVnQndqNDdDaHBWYm1sMFZHVnpkQzVKYzNOMVpYTXVWR1Z6ZEZCeSIsIA0KKyAgICAgICAgICAiYjNSdmN4SWRWVzVwZEZSbGMzUkZlSFJ5WVhOSmMzTjFaWE5RY205MGIwWnBiR1U9IikpOw0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgYXNzaWduZXIgPSBkZWxlZ2F0ZShwYmQ6OkZpbGVEZXNjcmlwdG9yIHJvb3QpIHsNCisgICAgICAgIGRlc2NyaXB0b3IgPSByb290Ow0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfQV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfQV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5BLCBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkEuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfQV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkFfIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19CX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19CX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkIsIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuQi5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19CX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQl8iLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX0FCX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMl07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19BQl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5BQiwgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5BQi5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19BQl9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkFCXyIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfTnVtYmVyRmllbGRfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1szXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX051bWJlckZpZWxkX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk51bWJlckZpZWxkLCBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk51bWJlckZpZWxkLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX051bWJlckZpZWxkX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiXzAxIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19NeU1lc3NhZ2VBUmVmZXJlbmNlQl9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzRdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfTXlNZXNzYWdlQVJlZmVyZW5jZUJfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQVJlZmVyZW5jZUIsIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQVJlZmVyZW5jZUIuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfTXlNZXNzYWdlQVJlZmVyZW5jZUJfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJWYWx1ZSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfTXlNZXNzYWdlQlJlZmVyZW5jZUFfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s1XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX015TWVzc2FnZUJSZWZlcmVuY2VBX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk15TWVzc2FnZUJSZWZlcmVuY2VBLCBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk15TWVzc2FnZUJSZWZlcmVuY2VBLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX015TWVzc2FnZUJSZWZlcmVuY2VBX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiVmFsdWUiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX05lZ2F0aXZlRW51bU1lc3NhZ2VfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s2XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX05lZ2F0aXZlRW51bU1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtTWVzc2FnZSwgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW1NZXNzYWdlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX05lZ2F0aXZlRW51bU1lc3NhZ2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJWYWx1ZSIsICJWYWx1ZXMiLCAiUGFja2VkVmFsdWVzIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19EZXByZWNhdGVkQ2hpbGRfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s3XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX0RlcHJlY2F0ZWRDaGlsZF9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQsIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZENoaWxkLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX0RlcHJlY2F0ZWRDaGlsZF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19EZXByZWNhdGVkRmllbGRzTWVzc2FnZV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzhdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UsIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJQcmltaXRpdmVWYWx1ZSIsICJQcmltaXRpdmVBcnJheSIsICJNZXNzYWdlVmFsdWUiLCAiTWVzc2FnZUFycmF5IiwgIkVudW1WYWx1ZSIsICJFbnVtQXJyYXkiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX0l0ZW1GaWVsZF9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzldOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfSXRlbUZpZWxkX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkl0ZW1GaWVsZCwgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5JdGVtRmllbGQuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfSXRlbUZpZWxkX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiSXRlbSIsIH0pOw0KKyAgICAgICAgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICBSZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5Ow0KKyAgICAgIH07DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oZGVzY3JpcHRvckRhdGEsDQorICAgICAgICAgIG5ldyBwYmQ6OkZpbGVEZXNjcmlwdG9yW10gew0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLkRlc2NyaXB0b3IsIA0KKyAgICAgICAgICB9LCBhc3NpZ25lcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgIH0NCisgICNyZWdpb24gRW51bXMNCisgIHB1YmxpYyBlbnVtIE5lZ2F0aXZlRW51bSB7DQorICAgIEZpdmVCZWxvdyA9IC01LA0KKyAgICBNaW51c09uZSA9IC0xLA0KKyAgICBaZXJvID0gMCwNCisgIH0NCisgIA0KKyAgcHVibGljIGVudW0gRGVwcmVjYXRlZEVudW0gew0KKyAgICBvbmUgPSAxLA0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCisgICNyZWdpb24gTWVzc2FnZXMNCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPEEsIEEuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEEoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfYUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiX0EiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfYUZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgQSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEEgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX0FfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8QSwgQS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19BX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBBX0ZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0FfOw0KKyAgICBwcml2YXRlIGludCBhXzsNCisgICAgcHVibGljIGJvb2wgSGFzQV8gew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNBXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgQV8gew0KKyAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfYUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0FfKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgQV8pOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0FfKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIEFfKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEEgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEEgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEEgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEEgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIEEgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxBLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihBIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBBIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgQSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEEoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEEgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkEuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkEuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBBIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBBKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEEpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShBIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5BLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0FfKSB7DQorICAgICAgICAgIEFfID0gb3RoZXIuQV87DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9hRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2FGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0FfID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0FfIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBBXyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkFfOyB9DQorICAgICAgICBzZXQgeyBTZXRBXyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QV8oaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0FfID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQV8oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0FfID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuYV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBBKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEIgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxCLCBCLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBCKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEIgZGVmYXVsdEluc3RhbmNlID0gbmV3IEIoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2JGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIkJfIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2JGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEIgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBCIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEIgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19CX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEIsIEIuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNJc3N1ZXNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfQl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQl9GaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNCXzsNCisgICAgcHJpdmF0ZSBpbnQgYl87DQorICAgIHB1YmxpYyBib29sIEhhc0JfIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQl87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEJfIHsNCisgICAgICBnZXQgeyByZXR1cm4gYl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2JGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNCXykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEJfKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNCXykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBCXyk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBCIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKEIgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8QiwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoQiBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIEIgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgQiBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEIgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBCKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5CLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5CLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQiBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgQikgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChCKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oQiBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuQi5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNCXykgew0KKyAgICAgICAgICBCXyA9IG90aGVyLkJfOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfYkZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9iRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNCXyA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNCXyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0JfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgQl8gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5CXzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Ql8odmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEJfKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNCXyA9IHRydWU7DQorICAgICAgICByZXN1bHQuYl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckJfKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNCXyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgQigpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNJc3N1ZXNQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBBQiA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPEFCLCBBQi5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgQUIoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQUIgZGVmYXVsdEluc3RhbmNlID0gbmV3IEFCKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9hQkZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYV9iIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2FCRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDggfTsNCisgICAgcHVibGljIHN0YXRpYyBBQiBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEFCIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEFCIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNJc3N1ZXNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfQUJfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8QUIsIEFCLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX0FCX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBBQl9GaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNBQl87DQorICAgIHByaXZhdGUgaW50IGFCXzsNCisgICAgcHVibGljIGJvb2wgSGFzQUJfIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQUJfOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBBQl8gew0KKyAgICAgIGdldCB7IHJldHVybiBhQl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2FCRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzQUJfKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgQUJfKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNBQl8pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgQUJfKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQUIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQUIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQUIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEFCIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBQiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBQiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBQiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBQiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBQiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBBQiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBBQiBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihBQiBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxBQiwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoQUIgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBBQiByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBBQiBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEFCIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgQUIoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEFCIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5BQi5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBBQiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkFCLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQUIgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEFCKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEFCKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oQUIgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkFCLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0FCXykgew0KKyAgICAgICAgICBBQl8gPSBvdGhlci5BQl87DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9hQkZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9hQkZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzQUJfID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYUJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNBQl8gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBQl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBBQl8gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BQl87IH0NCisgICAgICAgIHNldCB7IFNldEFCXyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QUJfKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBQl8gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmFCXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQUJfKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBQl8gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5hQl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBBQigpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNJc3N1ZXNQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBOdW1iZXJGaWVsZCA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPE51bWJlckZpZWxkLCBOdW1iZXJGaWVsZC5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgTnVtYmVyRmllbGQoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTnVtYmVyRmllbGQgZGVmYXVsdEluc3RhbmNlID0gbmV3IE51bWJlckZpZWxkKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9udW1iZXJGaWVsZEZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiXzAxIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX251bWJlckZpZWxkRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDggfTsNCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXJGaWVsZCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIE51bWJlckZpZWxkIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE51bWJlckZpZWxkIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNJc3N1ZXNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfTnVtYmVyRmllbGRfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8TnVtYmVyRmllbGQsIE51bWJlckZpZWxkLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX051bWJlckZpZWxkX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBjb25zdCBpbnQgXzAxRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzXzAxOw0KKyAgICBwcml2YXRlIGludCBfMDFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNfMDEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNfMDE7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIGludCBfMDEgew0KKyAgICAgIGdldCB7IHJldHVybiBfMDFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9udW1iZXJGaWVsZEZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc18wMSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIF8wMSk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzXzAxKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIF8wMSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlckZpZWxkIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlckZpZWxkIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlckZpZWxkIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXJGaWVsZCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyRmllbGQgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyRmllbGQgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyRmllbGQgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyRmllbGQgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyRmllbGQgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyRmllbGQgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgTnVtYmVyRmllbGQgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoTnVtYmVyRmllbGQgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8TnVtYmVyRmllbGQsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKE51bWJlckZpZWxkIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgTnVtYmVyRmllbGQgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgTnVtYmVyRmllbGQgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBOdW1iZXJGaWVsZCBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IE51bWJlckZpZWxkKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBOdW1iZXJGaWVsZCBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTnVtYmVyRmllbGQuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgTnVtYmVyRmllbGQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OdW1iZXJGaWVsZC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIE51bWJlckZpZWxkIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBOdW1iZXJGaWVsZCkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChOdW1iZXJGaWVsZCkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKE51bWJlckZpZWxkIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OdW1iZXJGaWVsZC5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNfMDEpIHsNCisgICAgICAgICAgXzAxID0gb3RoZXIuXzAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfbnVtYmVyRmllbGRGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfbnVtYmVyRmllbGRGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc18wMSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0Ll8wMV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc18wMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc18wMTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgaW50IF8wMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Ll8wMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0XzAxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRfMDEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc18wMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuXzAxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyXzAxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNfMDEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5fMDFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgTnVtYmVyRmllbGQoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgTXlNZXNzYWdlQVJlZmVyZW5jZUIgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxNeU1lc3NhZ2VBUmVmZXJlbmNlQiwgTXlNZXNzYWdlQVJlZmVyZW5jZUIuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIE15TWVzc2FnZUFSZWZlcmVuY2VCKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE15TWVzc2FnZUFSZWZlcmVuY2VCIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBNeU1lc3NhZ2VBUmVmZXJlbmNlQigpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfbXlNZXNzYWdlQVJlZmVyZW5jZUJGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInZhbHVlIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX215TWVzc2FnZUFSZWZlcmVuY2VCRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgTXlNZXNzYWdlQVJlZmVyZW5jZUIgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBNeU1lc3NhZ2VBUmVmZXJlbmNlQiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBNeU1lc3NhZ2VBUmVmZXJlbmNlQiBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX015TWVzc2FnZUFSZWZlcmVuY2VCX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPE15TWVzc2FnZUFSZWZlcmVuY2VCLCBNeU1lc3NhZ2VBUmVmZXJlbmNlQi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19NeU1lc3NhZ2VBUmVmZXJlbmNlQl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVmFsdWVGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNWYWx1ZTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk15TWVzc2FnZUJSZWZlcmVuY2VBIHZhbHVlXzsNCisgICAgcHVibGljIGJvb2wgSGFzVmFsdWUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNWYWx1ZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk15TWVzc2FnZUJSZWZlcmVuY2VBIFZhbHVlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdmFsdWVfID8/IGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQlJlZmVyZW5jZUEuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIWhhc1ZhbHVlKSByZXR1cm4gZmFsc2U7DQorICAgICAgICBpZiAoIVZhbHVlLklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX215TWVzc2FnZUFSZWZlcmVuY2VCRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzVmFsdWUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMSwgZmllbGRfbmFtZXNbMF0sIFZhbHVlKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNWYWx1ZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIFZhbHVlKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTXlNZXNzYWdlQVJlZmVyZW5jZUIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTXlNZXNzYWdlQVJlZmVyZW5jZUIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTXlNZXNzYWdlQVJlZmVyZW5jZUIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE15TWVzc2FnZUFSZWZlcmVuY2VCIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNeU1lc3NhZ2VBUmVmZXJlbmNlQiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNeU1lc3NhZ2VBUmVmZXJlbmNlQiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNeU1lc3NhZ2VBUmVmZXJlbmNlQiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNeU1lc3NhZ2VBUmVmZXJlbmNlQiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNeU1lc3NhZ2VBUmVmZXJlbmNlQiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNeU1lc3NhZ2VBUmVmZXJlbmNlQiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBNeU1lc3NhZ2VBUmVmZXJlbmNlQiBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihNeU1lc3NhZ2VBUmVmZXJlbmNlQiBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxNeU1lc3NhZ2VBUmVmZXJlbmNlQiwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoTXlNZXNzYWdlQVJlZmVyZW5jZUIgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBNeU1lc3NhZ2VBUmVmZXJlbmNlQiByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBNeU1lc3NhZ2VBUmVmZXJlbmNlQiBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIE15TWVzc2FnZUFSZWZlcmVuY2VCIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgTXlNZXNzYWdlQVJlZmVyZW5jZUIoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE15TWVzc2FnZUFSZWZlcmVuY2VCIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5NeU1lc3NhZ2VBUmVmZXJlbmNlQi5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBNeU1lc3NhZ2VBUmVmZXJlbmNlQiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk15TWVzc2FnZUFSZWZlcmVuY2VCLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgTXlNZXNzYWdlQVJlZmVyZW5jZUIgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIE15TWVzc2FnZUFSZWZlcmVuY2VCKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKE15TWVzc2FnZUFSZWZlcmVuY2VCKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oTXlNZXNzYWdlQVJlZmVyZW5jZUIgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk15TWVzc2FnZUFSZWZlcmVuY2VCLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc1ZhbHVlKSB7DQorICAgICAgICAgIE1lcmdlVmFsdWUob3RoZXIuVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfbXlNZXNzYWdlQVJlZmVyZW5jZUJGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfbXlNZXNzYWdlQVJlZmVyZW5jZUJGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQlJlZmVyZW5jZUEuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5NeU1lc3NhZ2VCUmVmZXJlbmNlQS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc1ZhbHVlKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKFZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIFZhbHVlID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNWYWx1ZSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzVmFsdWU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQlJlZmVyZW5jZUEgVmFsdWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5WYWx1ZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0VmFsdWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFZhbHVlKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQlJlZmVyZW5jZUEgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ZhbHVlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC52YWx1ZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRWYWx1ZShnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk15TWVzc2FnZUJSZWZlcmVuY2VBLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ZhbHVlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC52YWx1ZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZVZhbHVlKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQlJlZmVyZW5jZUEgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNWYWx1ZSAmJg0KKyAgICAgICAgICAgIHJlc3VsdC52YWx1ZV8gIT0gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5NeU1lc3NhZ2VCUmVmZXJlbmNlQS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQudmFsdWVfID0gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5NeU1lc3NhZ2VCUmVmZXJlbmNlQS5DcmVhdGVCdWlsZGVyKHJlc3VsdC52YWx1ZV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQudmFsdWVfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzVmFsdWUgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVmFsdWUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ZhbHVlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQudmFsdWVfID0gbnVsbDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgTXlNZXNzYWdlQVJlZmVyZW5jZUIoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgTXlNZXNzYWdlQlJlZmVyZW5jZUEgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxNeU1lc3NhZ2VCUmVmZXJlbmNlQSwgTXlNZXNzYWdlQlJlZmVyZW5jZUEuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIE15TWVzc2FnZUJSZWZlcmVuY2VBKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE15TWVzc2FnZUJSZWZlcmVuY2VBIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBNeU1lc3NhZ2VCUmVmZXJlbmNlQSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfbXlNZXNzYWdlQlJlZmVyZW5jZUFGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInZhbHVlIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX215TWVzc2FnZUJSZWZlcmVuY2VBRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgTXlNZXNzYWdlQlJlZmVyZW5jZUEgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBNeU1lc3NhZ2VCUmVmZXJlbmNlQSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBNeU1lc3NhZ2VCUmVmZXJlbmNlQSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX015TWVzc2FnZUJSZWZlcmVuY2VBX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPE15TWVzc2FnZUJSZWZlcmVuY2VBLCBNeU1lc3NhZ2VCUmVmZXJlbmNlQS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19NeU1lc3NhZ2VCUmVmZXJlbmNlQV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVmFsdWVGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNWYWx1ZTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk15TWVzc2FnZUFSZWZlcmVuY2VCIHZhbHVlXzsNCisgICAgcHVibGljIGJvb2wgSGFzVmFsdWUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNWYWx1ZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk15TWVzc2FnZUFSZWZlcmVuY2VCIFZhbHVlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdmFsdWVfID8/IGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQVJlZmVyZW5jZUIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIWhhc1ZhbHVlKSByZXR1cm4gZmFsc2U7DQorICAgICAgICBpZiAoIVZhbHVlLklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX215TWVzc2FnZUJSZWZlcmVuY2VBRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzVmFsdWUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMSwgZmllbGRfbmFtZXNbMF0sIFZhbHVlKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNWYWx1ZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIFZhbHVlKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTXlNZXNzYWdlQlJlZmVyZW5jZUEgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTXlNZXNzYWdlQlJlZmVyZW5jZUEgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTXlNZXNzYWdlQlJlZmVyZW5jZUEgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE15TWVzc2FnZUJSZWZlcmVuY2VBIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNeU1lc3NhZ2VCUmVmZXJlbmNlQSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNeU1lc3NhZ2VCUmVmZXJlbmNlQSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNeU1lc3NhZ2VCUmVmZXJlbmNlQSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNeU1lc3NhZ2VCUmVmZXJlbmNlQSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNeU1lc3NhZ2VCUmVmZXJlbmNlQSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNeU1lc3NhZ2VCUmVmZXJlbmNlQSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBNeU1lc3NhZ2VCUmVmZXJlbmNlQSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihNeU1lc3NhZ2VCUmVmZXJlbmNlQSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxNeU1lc3NhZ2VCUmVmZXJlbmNlQSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoTXlNZXNzYWdlQlJlZmVyZW5jZUEgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBNeU1lc3NhZ2VCUmVmZXJlbmNlQSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBNeU1lc3NhZ2VCUmVmZXJlbmNlQSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIE15TWVzc2FnZUJSZWZlcmVuY2VBIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgTXlNZXNzYWdlQlJlZmVyZW5jZUEoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE15TWVzc2FnZUJSZWZlcmVuY2VBIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5NeU1lc3NhZ2VCUmVmZXJlbmNlQS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBNeU1lc3NhZ2VCUmVmZXJlbmNlQSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk15TWVzc2FnZUJSZWZlcmVuY2VBLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgTXlNZXNzYWdlQlJlZmVyZW5jZUEgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIE15TWVzc2FnZUJSZWZlcmVuY2VBKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKE15TWVzc2FnZUJSZWZlcmVuY2VBKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oTXlNZXNzYWdlQlJlZmVyZW5jZUEgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk15TWVzc2FnZUJSZWZlcmVuY2VBLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc1ZhbHVlKSB7DQorICAgICAgICAgIE1lcmdlVmFsdWUob3RoZXIuVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfbXlNZXNzYWdlQlJlZmVyZW5jZUFGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfbXlNZXNzYWdlQlJlZmVyZW5jZUFGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQVJlZmVyZW5jZUIuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5NeU1lc3NhZ2VBUmVmZXJlbmNlQi5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc1ZhbHVlKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKFZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIFZhbHVlID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNWYWx1ZSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzVmFsdWU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQVJlZmVyZW5jZUIgVmFsdWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5WYWx1ZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0VmFsdWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFZhbHVlKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQVJlZmVyZW5jZUIgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ZhbHVlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC52YWx1ZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRWYWx1ZShnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk15TWVzc2FnZUFSZWZlcmVuY2VCLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ZhbHVlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC52YWx1ZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZVZhbHVlKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTXlNZXNzYWdlQVJlZmVyZW5jZUIgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNWYWx1ZSAmJg0KKyAgICAgICAgICAgIHJlc3VsdC52YWx1ZV8gIT0gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5NeU1lc3NhZ2VBUmVmZXJlbmNlQi5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQudmFsdWVfID0gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5NeU1lc3NhZ2VBUmVmZXJlbmNlQi5DcmVhdGVCdWlsZGVyKHJlc3VsdC52YWx1ZV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQudmFsdWVfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzVmFsdWUgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVmFsdWUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ZhbHVlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQudmFsdWVfID0gbnVsbDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgTXlNZXNzYWdlQlJlZmVyZW5jZUEoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgTmVnYXRpdmVFbnVtTWVzc2FnZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPE5lZ2F0aXZlRW51bU1lc3NhZ2UsIE5lZ2F0aXZlRW51bU1lc3NhZ2UuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIE5lZ2F0aXZlRW51bU1lc3NhZ2UoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTmVnYXRpdmVFbnVtTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgTmVnYXRpdmVFbnVtTWVzc2FnZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfbmVnYXRpdmVFbnVtTWVzc2FnZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAicGFja2VkX3ZhbHVlcyIsICJ2YWx1ZSIsICJ2YWx1ZXMiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfbmVnYXRpdmVFbnVtTWVzc2FnZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAyNiwgOCwgMTYgfTsNCisgICAgcHVibGljIHN0YXRpYyBOZWdhdGl2ZUVudW1NZXNzYWdlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgTmVnYXRpdmVFbnVtTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBOZWdhdGl2ZUVudW1NZXNzYWdlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNJc3N1ZXNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfTmVnYXRpdmVFbnVtTWVzc2FnZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxOZWdhdGl2ZUVudW1NZXNzYWdlLCBOZWdhdGl2ZUVudW1NZXNzYWdlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX05lZ2F0aXZlRW51bU1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFZhbHVlRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzVmFsdWU7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW0gdmFsdWVfID0gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW0uRml2ZUJlbG93Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNWYWx1ZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1ZhbHVlOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtIFZhbHVlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdmFsdWVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVmFsdWVzRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtPiB2YWx1ZXNfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk5lZ2F0aXZlRW51bT4gVmFsdWVzTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh2YWx1ZXNfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVmFsdWVzQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB2YWx1ZXNfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtIEdldFZhbHVlcyhpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdmFsdWVzX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkVmFsdWVzRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGludCBwYWNrZWRWYWx1ZXNNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtPiBwYWNrZWRWYWx1ZXNfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk5lZ2F0aXZlRW51bT4gUGFja2VkVmFsdWVzTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRWYWx1ZXNfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkVmFsdWVzQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRWYWx1ZXNfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtIEdldFBhY2tlZFZhbHVlcyhpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkVmFsdWVzX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9uZWdhdGl2ZUVudW1NZXNzYWdlRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzVmFsdWUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW0oMSwgZmllbGRfbmFtZXNbMV0sIChpbnQpIFZhbHVlLCBWYWx1ZSk7DQorICAgICAgfQ0KKyAgICAgIGlmICh2YWx1ZXNfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bUFycmF5KDIsIGZpZWxkX25hbWVzWzJdLCB2YWx1ZXNfKTsNCisgICAgICB9DQorICAgICAgaWYgKHBhY2tlZFZhbHVlc18uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRFbnVtQXJyYXkoMywgZmllbGRfbmFtZXNbMF0sIHBhY2tlZFZhbHVlc01lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZFZhbHVlc18pOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc1ZhbHVlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoMSwgKGludCkgVmFsdWUpOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKHZhbHVlc18uQ291bnQgPiAwKSB7DQorICAgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtIGVsZW1lbnQgaW4gdmFsdWVzXykgew0KKyAgICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemVOb1RhZygoaW50KSBlbGVtZW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICBzaXplICs9IDEgKiB2YWx1ZXNfLkNvdW50Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKHBhY2tlZFZhbHVlc18uQ291bnQgPiAwKSB7DQorICAgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtIGVsZW1lbnQgaW4gcGFja2VkVmFsdWVzXykgew0KKyAgICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemVOb1RhZygoaW50KSBlbGVtZW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICBzaXplICs9IDE7DQorICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVSYXdWYXJpbnQzMlNpemUoKHVpbnQpIGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZFZhbHVlc01lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTmVnYXRpdmVFbnVtTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBOZWdhdGl2ZUVudW1NZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE5lZ2F0aXZlRW51bU1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE5lZ2F0aXZlRW51bU1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE5lZ2F0aXZlRW51bU1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTmVnYXRpdmVFbnVtTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBOZWdhdGl2ZUVudW1NZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE5lZ2F0aXZlRW51bU1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTmVnYXRpdmVFbnVtTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBOZWdhdGl2ZUVudW1NZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIE5lZ2F0aXZlRW51bU1lc3NhZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHZhbHVlc18uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkVmFsdWVzXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKE5lZ2F0aXZlRW51bU1lc3NhZ2UgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8TmVnYXRpdmVFbnVtTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoTmVnYXRpdmVFbnVtTWVzc2FnZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIE5lZ2F0aXZlRW51bU1lc3NhZ2UgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgTmVnYXRpdmVFbnVtTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIE5lZ2F0aXZlRW51bU1lc3NhZ2Ugb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBOZWdhdGl2ZUVudW1NZXNzYWdlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBOZWdhdGl2ZUVudW1NZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW1NZXNzYWdlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIE5lZ2F0aXZlRW51bU1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW1NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgTmVnYXRpdmVFbnVtTWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgTmVnYXRpdmVFbnVtTWVzc2FnZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChOZWdhdGl2ZUVudW1NZXNzYWdlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oTmVnYXRpdmVFbnVtTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNWYWx1ZSkgew0KKyAgICAgICAgICBWYWx1ZSA9IG90aGVyLlZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnZhbHVlc18uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudmFsdWVzXy5BZGQob3RoZXIudmFsdWVzXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkVmFsdWVzXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRWYWx1ZXNfLkFkZChvdGhlci5wYWNrZWRWYWx1ZXNfKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX25lZ2F0aXZlRW51bU1lc3NhZ2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfbmVnYXRpdmVFbnVtTWVzc2FnZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQudmFsdWVfLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc1ZhbHVlID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgxLCAodWxvbmcpKGludCl1bmtub3duKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE4Og0KKyAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgIHNjZzo6SUNvbGxlY3Rpb248b2JqZWN0PiB1bmtub3duSXRlbXM7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRW51bUFycmF5PGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtPih0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC52YWx1ZXNfLCBvdXQgdW5rbm93bkl0ZW1zKTsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duSXRlbXMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCByYXdWYWx1ZSBpbiB1bmtub3duSXRlbXMpDQorICAgICAgICAgICAgICAgICAgaWYgKHJhd1ZhbHVlIGlzIGludCkNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgyLCAodWxvbmcpKGludClyYXdWYWx1ZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNjoNCisgICAgICAgICAgICBjYXNlIDI0OiB7DQorICAgICAgICAgICAgICBzY2c6OklDb2xsZWN0aW9uPG9iamVjdD4gdW5rbm93bkl0ZW1zOw0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEVudW1BcnJheTxnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk5lZ2F0aXZlRW51bT4odGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkVmFsdWVzXywgb3V0IHVua25vd25JdGVtcyk7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkl0ZW1zICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgcmF3VmFsdWUgaW4gdW5rbm93bkl0ZW1zKQ0KKyAgICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZSBpcyBpbnQpDQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoMywgKHVsb25nKShpbnQpcmF3VmFsdWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1ZhbHVlIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNWYWx1ZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW0gVmFsdWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5WYWx1ZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0VmFsdWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFZhbHVlKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ZhbHVlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC52YWx1ZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclZhbHVlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNWYWx1ZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnZhbHVlXyA9IGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtLkZpdmVCZWxvdzsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtPiBWYWx1ZXNMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnZhbHVlc187IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBWYWx1ZXNDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlZhbHVlc0NvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk5lZ2F0aXZlRW51bSBHZXRWYWx1ZXMoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFZhbHVlcyhpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFZhbHVlcyhpbnQgaW5kZXgsIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnZhbHVlc19baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVmFsdWVzKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnZhbHVlc18uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVZhbHVlcyhzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudmFsdWVzXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclZhbHVlcygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudmFsdWVzXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW0+IFBhY2tlZFZhbHVlc0xpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkVmFsdWVzXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZFZhbHVlc0NvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkVmFsdWVzQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtIEdldFBhY2tlZFZhbHVlcyhpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkVmFsdWVzKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkVmFsdWVzKGludCBpbmRleCwgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkVmFsdWVzX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRWYWx1ZXMoZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkVmFsdWVzXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkVmFsdWVzKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW0+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRWYWx1ZXNfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkVmFsdWVzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRWYWx1ZXNfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIE5lZ2F0aXZlRW51bU1lc3NhZ2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRGVwcmVjYXRlZENoaWxkIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8RGVwcmVjYXRlZENoaWxkLCBEZXByZWNhdGVkQ2hpbGQuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIERlcHJlY2F0ZWRDaGlsZCgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEZXByZWNhdGVkQ2hpbGQgZGVmYXVsdEluc3RhbmNlID0gbmV3IERlcHJlY2F0ZWRDaGlsZCgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZGVwcmVjYXRlZENoaWxkRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2RlcHJlY2F0ZWRDaGlsZEZpZWxkVGFncyA9IG5ldyB1aW50W10geyAgfTsNCisgICAgcHVibGljIHN0YXRpYyBEZXByZWNhdGVkQ2hpbGQgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBEZXByZWNhdGVkQ2hpbGQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRGVwcmVjYXRlZENoaWxkIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNJc3N1ZXNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9pc3N1ZXNfRGVwcmVjYXRlZENoaWxkX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPERlcHJlY2F0ZWRDaGlsZCwgRGVwcmVjYXRlZENoaWxkLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX0RlcHJlY2F0ZWRDaGlsZF9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9kZXByZWNhdGVkQ2hpbGRGaWVsZE5hbWVzOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBEZXByZWNhdGVkQ2hpbGQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRGVwcmVjYXRlZENoaWxkIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIERlcHJlY2F0ZWRDaGlsZCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRGVwcmVjYXRlZENoaWxkIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBEZXByZWNhdGVkQ2hpbGQgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRGVwcmVjYXRlZENoaWxkIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIERlcHJlY2F0ZWRDaGlsZCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBEZXByZWNhdGVkQ2hpbGQgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRGVwcmVjYXRlZENoaWxkIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIERlcHJlY2F0ZWRDaGlsZCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBEZXByZWNhdGVkQ2hpbGQgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoRGVwcmVjYXRlZENoaWxkIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPERlcHJlY2F0ZWRDaGlsZCwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoRGVwcmVjYXRlZENoaWxkIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgRGVwcmVjYXRlZENoaWxkIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIERlcHJlY2F0ZWRDaGlsZCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIERlcHJlY2F0ZWRDaGlsZCBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IERlcHJlY2F0ZWRDaGlsZCgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRGVwcmVjYXRlZENoaWxkIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRGVwcmVjYXRlZENoaWxkIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZENoaWxkLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRGVwcmVjYXRlZENoaWxkIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBEZXByZWNhdGVkQ2hpbGQpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRGVwcmVjYXRlZENoaWxkKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRGVwcmVjYXRlZENoaWxkIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9kZXByZWNhdGVkQ2hpbGRGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfZGVwcmVjYXRlZENoaWxkRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgRGVwcmVjYXRlZENoaWxkKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8RGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UsIERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBEZXByZWNhdGVkRmllbGRzTWVzc2FnZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEZXByZWNhdGVkRmllbGRzTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2RlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJFbnVtQXJyYXkiLCAiRW51bVZhbHVlIiwgIk1lc3NhZ2VBcnJheSIsICJNZXNzYWdlVmFsdWUiLCAiUHJpbWl0aXZlQXJyYXkiLCAiUHJpbWl0aXZlVmFsdWUiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfZGVwcmVjYXRlZEZpZWxkc01lc3NhZ2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgNDgsIDQwLCAzNCwgMjYsIDE2LCA4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBEZXByZWNhdGVkRmllbGRzTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBEZXByZWNhdGVkRmllbGRzTWVzc2FnZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX0RlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlLCBEZXByZWNhdGVkRmllbGRzTWVzc2FnZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19EZXByZWNhdGVkRmllbGRzTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUHJpbWl0aXZlVmFsdWVGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNQcmltaXRpdmVWYWx1ZTsNCisgICAgcHJpdmF0ZSBpbnQgcHJpbWl0aXZlVmFsdWVfOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIGJvb2wgSGFzUHJpbWl0aXZlVmFsdWUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNQcmltaXRpdmVWYWx1ZTsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgaW50IFByaW1pdGl2ZVZhbHVlIHsNCisgICAgICBnZXQgeyByZXR1cm4gcHJpbWl0aXZlVmFsdWVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUHJpbWl0aXZlQXJyYXlGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiBwcmltaXRpdmVBcnJheV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBQcmltaXRpdmVBcnJheUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocHJpbWl0aXZlQXJyYXlfKTsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgaW50IFByaW1pdGl2ZUFycmF5Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwcmltaXRpdmVBcnJheV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIGludCBHZXRQcmltaXRpdmVBcnJheShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBNZXNzYWdlVmFsdWVGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNNZXNzYWdlVmFsdWU7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQgbWVzc2FnZVZhbHVlXzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBib29sIEhhc01lc3NhZ2VWYWx1ZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc01lc3NhZ2VWYWx1ZTsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQgTWVzc2FnZVZhbHVlIHsNCisgICAgICBnZXQgeyByZXR1cm4gbWVzc2FnZVZhbHVlXyA/PyBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRDaGlsZC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBNZXNzYWdlQXJyYXlGaWVsZE51bWJlciA9IDQ7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQ+IG1lc3NhZ2VBcnJheV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQ+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRDaGlsZD4gTWVzc2FnZUFycmF5TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG1lc3NhZ2VBcnJheV87IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIGludCBNZXNzYWdlQXJyYXlDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG1lc3NhZ2VBcnJheV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZENoaWxkIEdldE1lc3NhZ2VBcnJheShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gbWVzc2FnZUFycmF5X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRW51bVZhbHVlRmllbGROdW1iZXIgPSA1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRW51bVZhbHVlOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZEVudW0gZW51bVZhbHVlXyA9IGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZEVudW0ub25lOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIGJvb2wgSGFzRW51bVZhbHVlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRW51bVZhbHVlOyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRFbnVtIEVudW1WYWx1ZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGVudW1WYWx1ZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBFbnVtQXJyYXlGaWVsZE51bWJlciA9IDY7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkRW51bT4gZW51bUFycmF5XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRFbnVtPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkRW51bT4gRW51bUFycmF5TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShlbnVtQXJyYXlfKTsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgaW50IEVudW1BcnJheUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gZW51bUFycmF5Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkRW51bSBHZXRFbnVtQXJyYXkoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGVudW1BcnJheV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfZGVwcmVjYXRlZEZpZWxkc01lc3NhZ2VGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNQcmltaXRpdmVWYWx1ZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbNV0sIFByaW1pdGl2ZVZhbHVlKTsNCisgICAgICB9DQorICAgICAgaWYgKHByaW1pdGl2ZUFycmF5Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyQXJyYXkoMiwgZmllbGRfbmFtZXNbNF0sIHByaW1pdGl2ZUFycmF5Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNNZXNzYWdlVmFsdWUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMywgZmllbGRfbmFtZXNbM10sIE1lc3NhZ2VWYWx1ZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChtZXNzYWdlQXJyYXlfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDQsIGZpZWxkX25hbWVzWzJdLCBtZXNzYWdlQXJyYXlfKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0VudW1WYWx1ZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSg1LCBmaWVsZF9uYW1lc1sxXSwgKGludCkgRW51bVZhbHVlLCBFbnVtVmFsdWUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoZW51bUFycmF5Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW1BcnJheSg2LCBmaWVsZF9uYW1lc1swXSwgZW51bUFycmF5Xyk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzUHJpbWl0aXZlVmFsdWUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgUHJpbWl0aXZlVmFsdWUpOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoaW50IGVsZW1lbnQgaW4gUHJpbWl0aXZlQXJyYXlMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAxICogcHJpbWl0aXZlQXJyYXlfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTWVzc2FnZVZhbHVlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMywgTWVzc2FnZVZhbHVlKTsNCisgICAgICB9DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQgZWxlbWVudCBpbiBNZXNzYWdlQXJyYXlMaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoNCwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNFbnVtVmFsdWUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSg1LCAoaW50KSBFbnVtVmFsdWUpOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKGVudW1BcnJheV8uQ291bnQgPiAwKSB7DQorICAgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZEVudW0gZWxlbWVudCBpbiBlbnVtQXJyYXlfKSB7DQorICAgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZU5vVGFnKChpbnQpIGVsZW1lbnQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICAgIHNpemUgKz0gMSAqIGVudW1BcnJheV8uQ291bnQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBEZXByZWNhdGVkRmllbGRzTWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHByaW1pdGl2ZUFycmF5Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBtZXNzYWdlQXJyYXlfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIGVudW1BcnJheV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihEZXByZWNhdGVkRmllbGRzTWVzc2FnZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxEZXByZWNhdGVkRmllbGRzTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBEZXByZWNhdGVkRmllbGRzTWVzc2FnZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBEZXByZWNhdGVkRmllbGRzTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkRmllbGRzTWVzc2FnZS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBEZXByZWNhdGVkRmllbGRzTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc1ByaW1pdGl2ZVZhbHVlKSB7DQorICAgICAgICAgIFByaW1pdGl2ZVZhbHVlID0gb3RoZXIuUHJpbWl0aXZlVmFsdWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucHJpbWl0aXZlQXJyYXlfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnByaW1pdGl2ZUFycmF5Xy5BZGQob3RoZXIucHJpbWl0aXZlQXJyYXlfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNNZXNzYWdlVmFsdWUpIHsNCisgICAgICAgICAgTWVyZ2VNZXNzYWdlVmFsdWUob3RoZXIuTWVzc2FnZVZhbHVlKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5tZXNzYWdlQXJyYXlfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VBcnJheV8uQWRkKG90aGVyLm1lc3NhZ2VBcnJheV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0VudW1WYWx1ZSkgew0KKyAgICAgICAgICBFbnVtVmFsdWUgPSBvdGhlci5FbnVtVmFsdWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuZW51bUFycmF5Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5lbnVtQXJyYXlfLkFkZChvdGhlci5lbnVtQXJyYXlfKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2RlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2RlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNQcmltaXRpdmVWYWx1ZSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LnByaW1pdGl2ZVZhbHVlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODoNCisgICAgICAgICAgICBjYXNlIDE2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wcmltaXRpdmVBcnJheV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjY6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZENoaWxkLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZENoaWxkLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzTWVzc2FnZVZhbHVlKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKE1lc3NhZ2VWYWx1ZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBNZXNzYWdlVmFsdWUgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQubWVzc2FnZUFycmF5XywgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQuRGVmYXVsdEluc3RhbmNlLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0MDogew0KKyAgICAgICAgICAgICAgb2JqZWN0IHVua25vd247DQorICAgICAgICAgICAgICBpZihpbnB1dC5SZWFkRW51bShyZWYgcmVzdWx0LmVudW1WYWx1ZV8sIG91dCB1bmtub3duKSkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQuaGFzRW51bVZhbHVlID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCg1LCAodWxvbmcpKGludCl1bmtub3duKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDUwOg0KKyAgICAgICAgICAgIGNhc2UgNDg6IHsNCisgICAgICAgICAgICAgIHNjZzo6SUNvbGxlY3Rpb248b2JqZWN0PiB1bmtub3duSXRlbXM7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRW51bUFycmF5PGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZEVudW0+KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LmVudW1BcnJheV8sIG91dCB1bmtub3duSXRlbXMpOw0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25JdGVtcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IHJhd1ZhbHVlIGluIHVua25vd25JdGVtcykNCisgICAgICAgICAgICAgICAgICBpZiAocmF3VmFsdWUgaXMgaW50KQ0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5NZXJnZVZhcmludEZpZWxkKDYsICh1bG9uZykoaW50KXJhd1ZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgYm9vbCBIYXNQcmltaXRpdmVWYWx1ZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1ByaW1pdGl2ZVZhbHVlOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBpbnQgUHJpbWl0aXZlVmFsdWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QcmltaXRpdmVWYWx1ZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0UHJpbWl0aXZlVmFsdWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFByaW1pdGl2ZVZhbHVlKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNQcmltaXRpdmVWYWx1ZSA9IHRydWU7DQorICAgICAgICByZXN1bHQucHJpbWl0aXZlVmFsdWVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQcmltaXRpdmVWYWx1ZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzUHJpbWl0aXZlVmFsdWUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5wcmltaXRpdmVWYWx1ZV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBQcmltaXRpdmVBcnJheUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucHJpbWl0aXZlQXJyYXlfOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBpbnQgUHJpbWl0aXZlQXJyYXlDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlByaW1pdGl2ZUFycmF5Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIGludCBHZXRQcmltaXRpdmVBcnJheShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UHJpbWl0aXZlQXJyYXkoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQcmltaXRpdmVBcnJheShpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wcmltaXRpdmVBcnJheV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUHJpbWl0aXZlQXJyYXkoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnByaW1pdGl2ZUFycmF5Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUHJpbWl0aXZlQXJyYXkoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wcmltaXRpdmVBcnJheV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQcmltaXRpdmVBcnJheSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucHJpbWl0aXZlQXJyYXlfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIGJvb2wgSGFzTWVzc2FnZVZhbHVlIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNNZXNzYWdlVmFsdWU7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZENoaWxkIE1lc3NhZ2VWYWx1ZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk1lc3NhZ2VWYWx1ZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TWVzc2FnZVZhbHVlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRNZXNzYWdlVmFsdWUoZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc01lc3NhZ2VWYWx1ZSA9IHRydWU7DQorICAgICAgICByZXN1bHQubWVzc2FnZVZhbHVlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE1lc3NhZ2VWYWx1ZShnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRDaGlsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNZXNzYWdlVmFsdWUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm1lc3NhZ2VWYWx1ZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU1lc3NhZ2VWYWx1ZShnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRDaGlsZCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc01lc3NhZ2VWYWx1ZSAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5tZXNzYWdlVmFsdWVfICE9IGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZENoaWxkLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5tZXNzYWdlVmFsdWVfID0gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQuQ3JlYXRlQnVpbGRlcihyZXN1bHQubWVzc2FnZVZhbHVlXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5tZXNzYWdlVmFsdWVfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZVZhbHVlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck1lc3NhZ2VWYWx1ZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZVZhbHVlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubWVzc2FnZVZhbHVlXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRDaGlsZD4gTWVzc2FnZUFycmF5TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5tZXNzYWdlQXJyYXlfOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBpbnQgTWVzc2FnZUFycmF5Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5NZXNzYWdlQXJyYXlDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQgR2V0TWVzc2FnZUFycmF5KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRNZXNzYWdlQXJyYXkoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRNZXNzYWdlQXJyYXkoaW50IGluZGV4LCBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRDaGlsZCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubWVzc2FnZUFycmF5X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRNZXNzYWdlQXJyYXkoaW50IGluZGV4LCBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRDaGlsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5tZXNzYWdlQXJyYXlfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZE1lc3NhZ2VBcnJheShnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRDaGlsZCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubWVzc2FnZUFycmF5Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZE1lc3NhZ2VBcnJheShnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRDaGlsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5tZXNzYWdlQXJyYXlfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VNZXNzYWdlQXJyYXkoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRDaGlsZD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lm1lc3NhZ2VBcnJheV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJNZXNzYWdlQXJyYXkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lm1lc3NhZ2VBcnJheV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgYm9vbCBIYXNFbnVtVmFsdWUgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0VudW1WYWx1ZTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkRW51bSBFbnVtVmFsdWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5FbnVtVmFsdWU7IH0NCisgICAgICAgIHNldCB7IFNldEVudW1WYWx1ZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RW51bVZhbHVlKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRW51bVZhbHVlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5lbnVtVmFsdWVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJFbnVtVmFsdWUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0VudW1WYWx1ZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmVudW1WYWx1ZV8gPSBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRFbnVtLm9uZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZEVudW0+IEVudW1BcnJheUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZW51bUFycmF5XzsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgaW50IEVudW1BcnJheUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRW51bUFycmF5Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZEVudW0gR2V0RW51bUFycmF5KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRFbnVtQXJyYXkoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRFbnVtQXJyYXkoaW50IGluZGV4LCBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRFbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmVudW1BcnJheV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRW51bUFycmF5KGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZW51bUFycmF5Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRW51bUFycmF5KHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkRW51bT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmVudW1BcnJheV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJFbnVtQXJyYXkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmVudW1BcnJheV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgSXRlbUZpZWxkIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8SXRlbUZpZWxkLCBJdGVtRmllbGQuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEl0ZW1GaWVsZCgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJdGVtRmllbGQgZGVmYXVsdEluc3RhbmNlID0gbmV3IEl0ZW1GaWVsZCgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfaXRlbUZpZWxkRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJpdGVtIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2l0ZW1GaWVsZEZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgSXRlbUZpZWxkIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgSXRlbUZpZWxkIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEl0ZW1GaWVsZCBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzSXNzdWVzUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfaXNzdWVzX0l0ZW1GaWVsZF9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxJdGVtRmllbGQsIEl0ZW1GaWVsZC5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2lzc3Vlc19JdGVtRmllbGRfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEl0ZW1GaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNJdGVtOw0KKyAgICBwcml2YXRlIGludCBpdGVtXzsNCisgICAgcHVibGljIGJvb2wgSGFzSXRlbSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0l0ZW07IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEl0ZW0gew0KKyAgICAgIGdldCB7IHJldHVybiBpdGVtXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfaXRlbUZpZWxkRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzSXRlbSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEl0ZW0pOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0l0ZW0pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgSXRlbSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEl0ZW1GaWVsZCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJdGVtRmllbGQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSXRlbUZpZWxkIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJdGVtRmllbGQgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEl0ZW1GaWVsZCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJdGVtRmllbGQgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSXRlbUZpZWxkIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEl0ZW1GaWVsZCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJdGVtRmllbGQgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSXRlbUZpZWxkIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIEl0ZW1GaWVsZCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihJdGVtRmllbGQgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8SXRlbUZpZWxkLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihJdGVtRmllbGQgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBJdGVtRmllbGQgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgSXRlbUZpZWxkIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgSXRlbUZpZWxkIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbUZpZWxkKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBJdGVtRmllbGQgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkl0ZW1GaWVsZC5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBJdGVtRmllbGQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5JdGVtRmllbGQuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBJdGVtRmllbGQgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEl0ZW1GaWVsZCkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChJdGVtRmllbGQpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShJdGVtRmllbGQgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkl0ZW1GaWVsZC5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNJdGVtKSB7DQorICAgICAgICAgIEl0ZW0gPSBvdGhlci5JdGVtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfaXRlbUZpZWxkRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2l0ZW1GaWVsZEZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzSXRlbSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0Lml0ZW1fKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNJdGVtIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzSXRlbTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEl0ZW0gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5JdGVtOyB9DQorICAgICAgICBzZXQgeyBTZXRJdGVtKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRJdGVtKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJdGVtID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5pdGVtXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFySXRlbSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSXRlbSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lml0ZW1fID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgSXRlbUZpZWxkKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0lzc3Vlc1Byb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCit9DQorDQorI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODc3YzYwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLmNzCkBAIC0wLDAgKzEsNDAxIEBACisvLyBHZW5lcmF0ZWQgYnkgUHJvdG9HZW4sIFZlcnNpb249Mi40LjEuNTU1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTU1ZjcxMjUyMzRiZWI1ODkuICBETyBOT1QgRURJVCENCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxDQorI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KKw0KK3VzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zIHsNCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBVbml0VGVzdEV4dHJhc1Byb3RvRmlsZSB7DQorICANCisgICAgI3JlZ2lvbiBFeHRlbnNpb24gcmVnaXN0cmF0aW9uDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3RlckFsbEV4dGVuc2lvbnMocGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkSW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEludDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRVaW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZFVpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkU2ludDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRTaW50NjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEZpeGVkNjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkRmxvYXRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZERvdWJsZUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkQm9vbEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkRW51bUV4dGVuc2lvbik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbnMNCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5MDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGludD4+IFVucGFja2VkSW50MzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRJbnQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gOTE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxsb25nPj4gVW5wYWNrZWRJbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFVpbnQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gOTI7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8dWludD4+IFVucGFja2VkVWludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkVWludDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5MzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDx1bG9uZz4+IFVucGFja2VkVWludDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkU2ludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5NDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGludD4+IFVucGFja2VkU2ludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkU2ludDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5NTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGxvbmc+PiBVbnBhY2tlZFNpbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEZpeGVkMzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDk2Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHVpbnQ+PiBVbnBhY2tlZEZpeGVkMzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRGaXhlZDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5NzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDx1bG9uZz4+IFVucGFja2VkRml4ZWQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5ODsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGludD4+IFVucGFja2VkU2ZpeGVkMzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gOTk7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxsb25nPj4gVW5wYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEZsb2F0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxMDA7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxmbG9hdD4+IFVucGFja2VkRmxvYXRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWREb3VibGVFeHRlbnNpb25GaWVsZE51bWJlciA9IDEwMTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGRvdWJsZT4+IFVucGFja2VkRG91YmxlRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkQm9vbEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTAyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8Ym9vbD4+IFVucGFja2VkQm9vbEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEVudW1FeHRlbnNpb25GaWVsZE51bWJlciA9IDEwMzsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVucGFja2VkRXh0ZW5zaW9uc0ZvcmVpZ25FbnVtPj4gVW5wYWNrZWRFbnVtRXh0ZW5zaW9uOw0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICAjcmVnaW9uIFN0YXRpYyB2YXJpYWJsZXMNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0VW5wYWNrZWRFeHRlbnNpb25zX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFVucGFja2VkRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gRGVzY3JpcHRvcg0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3I7DQorICAgIA0KKyAgICBzdGF0aWMgVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUoKSB7DQorICAgICAgYnl0ZVtdIGRlc2NyaXB0b3JEYXRhID0gZ2xvYmFsOjpTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKA0KKyAgICAgICAgICBzdHJpbmcuQ29uY2F0KA0KKyAgICAgICAgICAgICJDaHhsZUhSbGMzUXZkVzVwZEhSbGMzUmZaWGgwY21GekxuQnliM1J2RWhkd2NtOTBiMkoxWmw5MWJtbDAiLCANCisgICAgICAgICAgICAiZEdWemRGOWxlSFJ5WVJva1oyOXZaMnhsTDNCeWIzUnZZblZtTDJOemFHRnljRjl2Y0hScGIyNXpMbkJ5IiwgDQorICAgICAgICAgICAgImIzUnZJaUlLRmxSbGMzUlZibkJoWTJ0bFpFVjRkR1Z1YzJsdmJuTXFDQWdCRUlDQWdJQUNLbElLSFZWdSIsIA0KKyAgICAgICAgICAgICJjR0ZqYTJWa1JYaDBaVzV6YVc5dWMwWnZjbVZwWjI1RmJuVnRFZzhLQzBaUFVrVkpSMDVmUms5UEVBUVMiLCANCisgICAgICAgICAgICAiRHdvTFJrOVNSVWxIVGw5Q1FWSVFCUklQQ2d0R1QxSkZTVWRPWDBKQldoQUdPbEVLR0hWdWNHRmphMlZrIiwgDQorICAgICAgICAgICAgIlgybHVkRE15WDJWNGRHVnVjMmx2YmhJdkxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMFgyVjRkSEpoTGxSbCIsIA0KKyAgICAgICAgICAgICJjM1JWYm5CaFkydGxaRVY0ZEdWdWMybHZibk1ZV2lBREtBVTZVUW9ZZFc1d1lXTnJaV1JmYVc1ME5qUmYiLCANCisgICAgICAgICAgICAiWlhoMFpXNXphVzl1RWk4dWNISnZkRzlpZFdaZmRXNXBkSFJsYzNSZlpYaDBjbUV1VkdWemRGVnVjR0ZqIiwgDQorICAgICAgICAgICAgImEyVmtSWGgwWlc1emFXOXVjeGhiSUFNb0F6cFNDaGwxYm5CaFkydGxaRjkxYVc1ME16SmZaWGgwWlc1eiIsIA0KKyAgICAgICAgICAgICJhVzl1RWk4dWNISnZkRzlpZFdaZmRXNXBkSFJsYzNSZlpYaDBjbUV1VkdWemRGVnVjR0ZqYTJWa1JYaDAiLCANCisgICAgICAgICAgICAiWlc1emFXOXVjeGhjSUFNb0RUcFNDaGwxYm5CaFkydGxaRjkxYVc1ME5qUmZaWGgwWlc1emFXOXVFaTh1IiwgDQorICAgICAgICAgICAgImNISnZkRzlpZFdaZmRXNXBkSFJsYzNSZlpYaDBjbUV1VkdWemRGVnVjR0ZqYTJWa1JYaDBaVzV6YVc5dSIsIA0KKyAgICAgICAgICAgICJjeGhkSUFNb0JEcFNDaGwxYm5CaFkydGxaRjl6YVc1ME16SmZaWGgwWlc1emFXOXVFaTh1Y0hKdmRHOWkiLCANCisgICAgICAgICAgICAiZFdaZmRXNXBkSFJsYzNSZlpYaDBjbUV1VkdWemRGVnVjR0ZqYTJWa1JYaDBaVzV6YVc5dWN4aGVJQU1vIiwgDQorICAgICAgICAgICAgIkVUcFNDaGwxYm5CaFkydGxaRjl6YVc1ME5qUmZaWGgwWlc1emFXOXVFaTh1Y0hKdmRHOWlkV1pmZFc1cCIsIA0KKyAgICAgICAgICAgICJkSFJsYzNSZlpYaDBjbUV1VkdWemRGVnVjR0ZqYTJWa1JYaDBaVzV6YVc5dWN4aGZJQU1vRWpwVENocDEiLCANCisgICAgICAgICAgICAiYm5CaFkydGxaRjltYVhobFpETXlYMlY0ZEdWdWMybHZiaEl2TG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wIiwgDQorICAgICAgICAgICAgIlgyVjRkSEpoTGxSbGMzUlZibkJoWTJ0bFpFVjRkR1Z1YzJsdmJuTVlZQ0FES0FjNlV3b2FkVzV3WVdOciIsIA0KKyAgICAgICAgICAgICJaV1JmWm1sNFpXUTJORjlsZUhSbGJuTnBiMjRTTHk1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEY5bGVIUnkiLCANCisgICAgICAgICAgICAiWVM1VVpYTjBWVzV3WVdOclpXUkZlSFJsYm5OcGIyNXpHR0VnQXlnR09sUUtHM1Z1Y0dGamEyVmtYM05tIiwgDQorICAgICAgICAgICAgImFYaGxaRE15WDJWNGRHVnVjMmx2YmhJdkxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMFgyVjRkSEpoTGxSbCIsIA0KKyAgICAgICAgICAgICJjM1JWYm5CaFkydGxaRVY0ZEdWdWMybHZibk1ZWWlBREtBODZWQW9iZFc1d1lXTnJaV1JmYzJacGVHVmsiLCANCisgICAgICAgICAgICAiTmpSZlpYaDBaVzV6YVc5dUVpOHVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUmZaWGgwY21FdVZHVnpkRlZ1IiwgDQorICAgICAgICAgICAgImNHRmphMlZrUlhoMFpXNXphVzl1Y3hoaklBTW9FRHBSQ2hoMWJuQmhZMnRsWkY5bWJHOWhkRjlsZUhSbCIsIA0KKyAgICAgICAgICAgICJibk5wYjI0U0x5NXdjbTkwYjJKMVpsOTFibWwwZEdWemRGOWxlSFJ5WVM1VVpYTjBWVzV3WVdOclpXUkYiLCANCisgICAgICAgICAgICAiZUhSbGJuTnBiMjV6R0dRZ0F5Z0NPbElLR1hWdWNHRmphMlZrWDJSdmRXSnNaVjlsZUhSbGJuTnBiMjRTIiwgDQorICAgICAgICAgICAgIkx5NXdjbTkwYjJKMVpsOTFibWwwZEdWemRGOWxlSFJ5WVM1VVpYTjBWVzV3WVdOclpXUkZlSFJsYm5OcCIsIA0KKyAgICAgICAgICAgICJiMjV6R0dVZ0F5Z0JPbEFLRjNWdWNHRmphMlZrWDJKdmIyeGZaWGgwWlc1emFXOXVFaTh1Y0hKdmRHOWkiLCANCisgICAgICAgICAgICAiZFdaZmRXNXBkSFJsYzNSZlpYaDBjbUV1VkdWemRGVnVjR0ZqYTJWa1JYaDBaVzV6YVc5dWN4aG1JQU1vIiwgDQorICAgICAgICAgICAgIkNEcUlBUW9YZFc1d1lXTnJaV1JmWlc1MWJWOWxlSFJsYm5OcGIyNFNMeTV3Y205MGIySjFabDkxYm1sMCIsIA0KKyAgICAgICAgICAgICJkR1Z6ZEY5bGVIUnlZUzVVWlhOMFZXNXdZV05yWldSRmVIUmxibk5wYjI1ekdHY2dBeWdPTWpZdWNISnYiLCANCisgICAgICAgICAgICAiZEc5aWRXWmZkVzVwZEhSbGMzUmZaWGgwY21FdVZXNXdZV05yWldSRmVIUmxibk5wYjI1elJtOXlaV2xuIiwgDQorICAgICAgICAgICAgImJrVnVkVzFDVmdvVFkyOXRMbWR2YjJkc1pTNXdjbTkwYjJKMVpzSStQZ29oUjI5dloyeGxMbEJ5YjNSdiIsIA0KKyAgICAgICAgICAgICJZMjlzUW5WbVptVnljeTVVWlhOMFVISnZkRzl6RWhkVmJtbDBWR1Z6ZEVWNGRISmhjMUJ5YjNSdlJtbHMiLCANCisgICAgICAgICAgIlpVZ0IiKSk7DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciBhc3NpZ25lciA9IGRlbGVnYXRlKHBiZDo6RmlsZURlc2NyaXB0b3Igcm9vdCkgew0KKyAgICAgICAgZGVzY3JpcHRvciA9IHJvb3Q7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RVbnBhY2tlZEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFVucGFja2VkRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkRXh0ZW5zaW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkRXh0ZW5zaW9ucy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RVbnBhY2tlZEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRJbnQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRJbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzFdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkVWludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjx1aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRVaW50NjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHVsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbM10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRTaW50MzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzRdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkU2ludDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRGaXhlZDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjx1aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRGaXhlZDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjx1bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzddKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkU2ZpeGVkMzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzhdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkU2ZpeGVkNjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s5XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEZsb2F0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxmbG9hdD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzEwXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZERvdWJsZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248ZG91YmxlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTFdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkQm9vbEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Ym9vbD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzEyXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEVudW1FeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVucGFja2VkRXh0ZW5zaW9uc0ZvcmVpZ25FbnVtPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTNdKTsNCisgICAgICAgIHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IHBiOjpFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIHJldHVybiByZWdpc3RyeTsNCisgICAgICB9Ow0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKGRlc2NyaXB0b3JEYXRhLA0KKyAgICAgICAgICBuZXcgcGJkOjpGaWxlRGVzY3JpcHRvcltdIHsNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5EZXNjcmlwdG9yLCANCisgICAgICAgICAgfSwgYXNzaWduZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICB9DQorICAjcmVnaW9uIEVudW1zDQorICBwdWJsaWMgZW51bSBVbnBhY2tlZEV4dGVuc2lvbnNGb3JlaWduRW51bSB7DQorICAgIEZPUkVJR05fRk9PID0gNCwNCisgICAgRk9SRUlHTl9CQVIgPSA1LA0KKyAgICBGT1JFSUdOX0JBWiA9IDYsDQorICB9DQorICANCisgICNlbmRyZWdpb24NCisgIA0KKyAgI3JlZ2lvbiBNZXNzYWdlcw0KKyAgW2dsb2JhbDo6U3lzdGVtLlNlcmlhbGl6YWJsZUF0dHJpYnV0ZSgpXQ0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0VW5wYWNrZWRFeHRlbnNpb25zIDogcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMsIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdFVucGFja2VkRXh0ZW5zaW9ucyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFVucGFja2VkRXh0ZW5zaW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFVucGFja2VkRXh0ZW5zaW9uc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0VW5wYWNrZWRFeHRlbnNpb25zRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0VW5wYWNrZWRFeHRlbnNpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0VW5wYWNrZWRFeHRlbnNpb25zX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMsIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFVucGFja2VkRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIUV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFVucGFja2VkRXh0ZW5zaW9uc0ZpZWxkTmFtZXM7DQorICAgICAgcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMsIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMuQnVpbGRlcj4uRXh0ZW5zaW9uV3JpdGVyIGV4dGVuc2lvbldyaXRlciA9IENyZWF0ZUV4dGVuc2lvbldyaXRlcih0aGlzKTsNCisgICAgICBleHRlbnNpb25Xcml0ZXIuV3JpdGVVbnRpbCg1MzY4NzA5MTIsIG91dHB1dCk7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHNpemUgKz0gRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRFeHRlbnNpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRFeHRlbnNpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRFeHRlbnNpb25zIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkRXh0ZW5zaW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRFeHRlbnNpb25zIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0VW5wYWNrZWRFeHRlbnNpb25zIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGVBdHRyaWJ1dGUoKV0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6RXh0ZW5kYWJsZUJ1aWxkZXI8VGVzdFVucGFja2VkRXh0ZW5zaW9ucywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdFVucGFja2VkRXh0ZW5zaW9ucyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdFVucGFja2VkRXh0ZW5zaW9ucyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0VW5wYWNrZWRFeHRlbnNpb25zKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0VW5wYWNrZWRFeHRlbnNpb25zIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkRXh0ZW5zaW9ucy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0VW5wYWNrZWRFeHRlbnNpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0VW5wYWNrZWRFeHRlbnNpb25zIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0VW5wYWNrZWRFeHRlbnNpb25zKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0VW5wYWNrZWRFeHRlbnNpb25zIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkRXh0ZW5zaW9ucy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgdGhpcy5NZXJnZUV4dGVuc2lvbkZpZWxkcyhvdGhlcik7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0VW5wYWNrZWRFeHRlbnNpb25zRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RVbnBhY2tlZEV4dGVuc2lvbnNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0VW5wYWNrZWRFeHRlbnNpb25zKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorfQ0KKw0KKyNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RHZW5lcmljU2VydmljZXMuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RHZW5lcmljU2VydmljZXMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViN2UwOAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdEdlbmVyaWNTZXJ2aWNlcy5jcwpAQCAtMCwwICsxLDI2MCBAQAorLy8gR2VuZXJhdGVkIGJ5IFByb3RvR2VuLCBWZXJzaW9uPTIuNC4xLjU1NSwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj01NWY3MTI1MjM0YmViNTg5LiAgRE8gTk9UIEVESVQhDQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQ0KKyNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCisNCit1c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVyczsNCit1c2luZyBwYmMgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnM7DQordXNpbmcgcGJkID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcyB7DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVW5pdFRlc3RHZW5lcmljU2VydmljZXMgew0KKyAgDQorICAgICNyZWdpb24gRXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbg0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgew0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBTdGF0aWMgdmFyaWFibGVzDQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBEZXNjcmlwdG9yDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIHByaXZhdGUgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsNCisgICAgDQorICAgIHN0YXRpYyBVbml0VGVzdEdlbmVyaWNTZXJ2aWNlcygpIHsNCisgICAgICBieXRlW10gZGVzY3JpcHRvckRhdGEgPSBnbG9iYWw6OlN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoDQorICAgICAgICAgIHN0cmluZy5Db25jYXQoDQorICAgICAgICAgICAgIkNpWmxlSFJsYzNRdmRXNXBkSFJsYzNSZloyVnVaWEpwWTE5elpYSjJhV05sY3k1d2NtOTBieElSY0hKdiIsIA0KKyAgICAgICAgICAgICJkRzlpZFdaZmRXNXBkSFJsYzNRYUpHZHZiMmRzWlM5d2NtOTBiMkoxWmk5amMyaGhjbkJmYjNCMGFXOXUiLCANCisgICAgICAgICAgICAiY3k1d2NtOTBieG9lWjI5dloyeGxMM0J5YjNSdlluVm1MM1Z1YVhSMFpYTjBMbkJ5YjNSdkdpMW5iMjluIiwgDQorICAgICAgICAgICAgImJHVXZjSEp2ZEc5aWRXWXZkVzVwZEhSbGMzUmZZM1Z6ZEc5dFgyOXdkR2x2Ym5NdWNISnZkRzh5b0FFSyIsIA0KKyAgICAgICAgICAgICJFbFJsYzNSSFpXNWxjbWxqVTJWeWRtbGpaUkpFQ2dOR2IyOFNIUzV3Y205MGIySjFabDkxYm1sMGRHVnoiLCANCisgICAgICAgICAgICAiZEM1R2IyOVNaWEYxWlhOMEdoNHVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVSbTl2VW1WemNHOXVjMlVTIiwgDQorICAgICAgICAgICAgIlJBb0RRbUZ5RWgwdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVFtRnlVbVZ4ZFdWemRCb2VMbkJ5YjNSdiIsIA0KKyAgICAgICAgICAgICJZblZtWDNWdWFYUjBaWE4wTGtKaGNsSmxjM0J2Ym5ObE1wVUJDaU5VWlhOMFIyVnVaWEpwWTFObGNuWnAiLCANCisgICAgICAgICAgICAiWTJWWGFYUm9RM1Z6ZEc5dFQzQjBhVzl1Y3hKakNnTkdiMjhTS1M1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6IiwgDQorICAgICAgICAgICAgImRDNURkWE4wYjIxUGNIUnBiMjVHYjI5U1pYRjFaWE4wR2lvdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdSIsIA0KKyAgICAgICAgICAgICJRM1Z6ZEc5dFQzQjBhVzl1Um05dlVtVnpjRzl1YzJVaUJlRDZqQjRDR2dtUXNvc2UwOXVBeTBsQ1JFZ0IiLCANCisgICAgICAgICAgICAid2o0L0NpRkhiMjluYkdVdVVISnZkRzlqYjJ4Q2RXWm1aWEp6TGxSbGMzUlFjbTkwYjNNU0YxVnVhWFJVIiwgDQorICAgICAgICAgICJaWE4wUjJWdVpYSnBZMU5sY25acFkyVnppQTRCIikpOw0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgYXNzaWduZXIgPSBkZWxlZ2F0ZShwYmQ6OkZpbGVEZXNjcmlwdG9yIHJvb3QpIHsNCisgICAgICAgIGRlc2NyaXB0b3IgPSByb290Ow0KKyAgICAgICAgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICBSZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0Q3VzdG9tT3B0aW9uc1Byb3RvRmlsZS5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5Ow0KKyAgICAgIH07DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oZGVzY3JpcHRvckRhdGEsDQorICAgICAgICAgIG5ldyBwYmQ6OkZpbGVEZXNjcmlwdG9yW10gew0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLkRlc2NyaXB0b3IsIA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCANCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RDdXN0b21PcHRpb25zUHJvdG9GaWxlLkRlc2NyaXB0b3IsIA0KKyAgICAgICAgICB9LCBhc3NpZ25lcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgIH0NCisgICNyZWdpb24gU2VydmljZXMNCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVzdEdlbmVyaWNTZXJ2aWNlIDogcGI6OklTZXJ2aWNlIHsNCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgRm9vKA0KKyAgICAgICAgcGI6OklScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsDQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0IHJlcXVlc3QsDQorICAgICAgICBnbG9iYWw6OlN5c3RlbS5BY3Rpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2U+IGRvbmUpOw0KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBCYXIoDQorICAgICAgICBwYjo6SVJwY0NvbnRyb2xsZXIgY29udHJvbGxlciwNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlcXVlc3QgcmVxdWVzdCwNCisgICAgICAgIGdsb2JhbDo6U3lzdGVtLkFjdGlvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXNwb25zZT4gZG9uZSk7DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6U2VydmljZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIFVuaXRUZXN0R2VuZXJpY1NlcnZpY2VzLkRlc2NyaXB0b3IuU2VydmljZXNbMF07IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgcGJkOjpTZXJ2aWNlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgQ2FsbE1ldGhvZCgNCisgICAgICAgIHBiZDo6TWV0aG9kRGVzY3JpcHRvciBtZXRob2QsDQorICAgICAgICBwYjo6SVJwY0NvbnRyb2xsZXIgY29udHJvbGxlciwNCisgICAgICAgIHBiOjpJTWVzc2FnZSByZXF1ZXN0LA0KKyAgICAgICAgZ2xvYmFsOjpTeXN0ZW0uQWN0aW9uPHBiOjpJTWVzc2FnZT4gZG9uZSkgew0KKyAgICAgIGlmIChtZXRob2QuU2VydmljZSAhPSBEZXNjcmlwdG9yKSB7DQorICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsOjpTeXN0ZW0uQXJndW1lbnRFeGNlcHRpb24oDQorICAgICAgICAgICAgIlNlcnZpY2UuQ2FsbE1ldGhvZCgpIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yIGZvciB3cm9uZyBzZXJ2aWNlIHR5cGUuIik7DQorICAgICAgfQ0KKyAgICAgIHN3aXRjaChtZXRob2QuSW5kZXgpIHsNCisgICAgICAgIGNhc2UgMDoNCisgICAgICAgICAgdGhpcy5Gb28oY29udHJvbGxlciwgKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvb1JlcXVlc3QpIHJlcXVlc3QsDQorICAgICAgICAgICAgICBwYjo6UnBjVXRpbC5TcGVjaWFsaXplQ2FsbGJhY2s8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2U+KA0KKyAgICAgICAgICAgICAgZG9uZSkpOw0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICBjYXNlIDE6DQorICAgICAgICAgIHRoaXMuQmFyKGNvbnRyb2xsZXIsIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXF1ZXN0KSByZXF1ZXN0LA0KKyAgICAgICAgICAgICAgcGI6OlJwY1V0aWwuU3BlY2lhbGl6ZUNhbGxiYWNrPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlPigNCisgICAgICAgICAgICAgIGRvbmUpKTsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbDo6U3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IGdldCBoZXJlLiIpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHBiOjpJTWVzc2FnZSBHZXRSZXF1ZXN0UHJvdG90eXBlKHBiZDo6TWV0aG9kRGVzY3JpcHRvciBtZXRob2QpIHsNCisgICAgICBpZiAobWV0aG9kLlNlcnZpY2UgIT0gRGVzY3JpcHRvcikgew0KKyAgICAgICAgdGhyb3cgbmV3IGdsb2JhbDo6U3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uKA0KKyAgICAgICAgICAgICJTZXJ2aWNlLkdldFJlcXVlc3RQcm90b3R5cGUoKSBnaXZlbiBtZXRob2QgZGVzY3JpcHRvciBmb3Igd3Jvbmcgc2VydmljZSB0eXBlLiIpOw0KKyAgICAgIH0NCisgICAgICBzd2l0Y2gobWV0aG9kLkluZGV4KSB7DQorICAgICAgICBjYXNlIDA6DQorICAgICAgICAgIHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0LkRlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlcXVlc3QuRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbDo6U3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IGdldCBoZXJlLiIpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHBiOjpJTWVzc2FnZSBHZXRSZXNwb25zZVByb3RvdHlwZShwYmQ6Ok1ldGhvZERlc2NyaXB0b3IgbWV0aG9kKSB7DQorICAgICAgaWYgKG1ldGhvZC5TZXJ2aWNlICE9IERlc2NyaXB0b3IpIHsNCisgICAgICAgIHRocm93IG5ldyBnbG9iYWw6OlN5c3RlbS5Bcmd1bWVudEV4Y2VwdGlvbigNCisgICAgICAgICAgICAiU2VydmljZS5HZXRSZXNwb25zZVByb3RvdHlwZSgpIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yIGZvciB3cm9uZyBzZXJ2aWNlIHR5cGUuIik7DQorICAgICAgfQ0KKyAgICAgIHN3aXRjaChtZXRob2QuSW5kZXgpIHsNCisgICAgICAgIGNhc2UgMDoNCisgICAgICAgICAgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvb1Jlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIHRocm93IG5ldyBnbG9iYWw6OlN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4ndCBnZXQgaGVyZS4iKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgU3R1YiBDcmVhdGVTdHViKHBiOjpJUnBjQ2hhbm5lbCBjaGFubmVsKSB7DQorICAgICAgcmV0dXJuIG5ldyBTdHViKGNoYW5uZWwpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgY2xhc3MgU3R1YiA6IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RHZW5lcmljU2VydmljZSB7DQorICAgICAgaW50ZXJuYWwgU3R1YihwYjo6SVJwY0NoYW5uZWwgY2hhbm5lbCkgew0KKyAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSByZWFkb25seSBwYjo6SVJwY0NoYW5uZWwgY2hhbm5lbDsNCisgICAgICANCisgICAgICBwdWJsaWMgcGI6OklScGNDaGFubmVsIENoYW5uZWwgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGNoYW5uZWw7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRm9vKA0KKyAgICAgICAgICBwYjo6SVJwY0NvbnRyb2xsZXIgY29udHJvbGxlciwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVxdWVzdCByZXF1ZXN0LA0KKyAgICAgICAgICBnbG9iYWw6OlN5c3RlbS5BY3Rpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2U+IGRvbmUpIHsNCisgICAgICAgIGNoYW5uZWwuQ2FsbE1ldGhvZChEZXNjcmlwdG9yLk1ldGhvZHNbMF0sDQorICAgICAgICAgICAgY29udHJvbGxlciwgcmVxdWVzdCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2UuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICAgIHBiOjpScGNVdGlsLkdlbmVyYWxpemVDYWxsYmFjazxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXNwb25zZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2UuQnVpbGRlcj4oZG9uZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2UuRGVmYXVsdEluc3RhbmNlKSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEJhcigNCisgICAgICAgICAgcGI6OklScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlcXVlc3QgcmVxdWVzdCwNCisgICAgICAgICAgZ2xvYmFsOjpTeXN0ZW0uQWN0aW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlPiBkb25lKSB7DQorICAgICAgICBjaGFubmVsLkNhbGxNZXRob2QoRGVzY3JpcHRvci5NZXRob2RzWzFdLA0KKyAgICAgICAgICAgIGNvbnRyb2xsZXIsIHJlcXVlc3QsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgICBwYjo6UnBjVXRpbC5HZW5lcmFsaXplQ2FsbGJhY2s8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQmFyUmVzcG9uc2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlLkJ1aWxkZXI+KGRvbmUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZSkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0R2VuZXJpY1NlcnZpY2VXaXRoQ3VzdG9tT3B0aW9ucyA6IHBiOjpJU2VydmljZSB7DQorICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIEZvbygNCisgICAgICAgIHBiOjpJUnBjQ29udHJvbGxlciBjb250cm9sbGVyLA0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCByZXF1ZXN0LA0KKyAgICAgICAgZ2xvYmFsOjpTeXN0ZW0uQWN0aW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlPiBkb25lKTsNCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpTZXJ2aWNlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gVW5pdFRlc3RHZW5lcmljU2VydmljZXMuRGVzY3JpcHRvci5TZXJ2aWNlc1sxXTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBwYmQ6OlNlcnZpY2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCBDYWxsTWV0aG9kKA0KKyAgICAgICAgcGJkOjpNZXRob2REZXNjcmlwdG9yIG1ldGhvZCwNCisgICAgICAgIHBiOjpJUnBjQ29udHJvbGxlciBjb250cm9sbGVyLA0KKyAgICAgICAgcGI6OklNZXNzYWdlIHJlcXVlc3QsDQorICAgICAgICBnbG9iYWw6OlN5c3RlbS5BY3Rpb248cGI6OklNZXNzYWdlPiBkb25lKSB7DQorICAgICAgaWYgKG1ldGhvZC5TZXJ2aWNlICE9IERlc2NyaXB0b3IpIHsNCisgICAgICAgIHRocm93IG5ldyBnbG9iYWw6OlN5c3RlbS5Bcmd1bWVudEV4Y2VwdGlvbigNCisgICAgICAgICAgICAiU2VydmljZS5DYWxsTWV0aG9kKCkgZ2l2ZW4gbWV0aG9kIGRlc2NyaXB0b3IgZm9yIHdyb25nIHNlcnZpY2UgdHlwZS4iKTsNCisgICAgICB9DQorICAgICAgc3dpdGNoKG1ldGhvZC5JbmRleCkgew0KKyAgICAgICAgY2FzZSAwOg0KKyAgICAgICAgICB0aGlzLkZvbyhjb250cm9sbGVyLCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCkgcmVxdWVzdCwNCisgICAgICAgICAgICAgIHBiOjpScGNVdGlsLlNwZWNpYWxpemVDYWxsYmFjazxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5DdXN0b21PcHRpb25Gb29SZXNwb25zZT4oDQorICAgICAgICAgICAgICBkb25lKSk7DQorICAgICAgICAgIHJldHVybjsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIHRocm93IG5ldyBnbG9iYWw6OlN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4ndCBnZXQgaGVyZS4iKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBwYjo6SU1lc3NhZ2UgR2V0UmVxdWVzdFByb3RvdHlwZShwYmQ6Ok1ldGhvZERlc2NyaXB0b3IgbWV0aG9kKSB7DQorICAgICAgaWYgKG1ldGhvZC5TZXJ2aWNlICE9IERlc2NyaXB0b3IpIHsNCisgICAgICAgIHRocm93IG5ldyBnbG9iYWw6OlN5c3RlbS5Bcmd1bWVudEV4Y2VwdGlvbigNCisgICAgICAgICAgICAiU2VydmljZS5HZXRSZXF1ZXN0UHJvdG90eXBlKCkgZ2l2ZW4gbWV0aG9kIGRlc2NyaXB0b3IgZm9yIHdyb25nIHNlcnZpY2UgdHlwZS4iKTsNCisgICAgICB9DQorICAgICAgc3dpdGNoKG1ldGhvZC5JbmRleCkgew0KKyAgICAgICAgY2FzZSAwOg0KKyAgICAgICAgICByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdC5EZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsOjpTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgZ2V0IGhlcmUuIik7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgcGI6OklNZXNzYWdlIEdldFJlc3BvbnNlUHJvdG90eXBlKHBiZDo6TWV0aG9kRGVzY3JpcHRvciBtZXRob2QpIHsNCisgICAgICBpZiAobWV0aG9kLlNlcnZpY2UgIT0gRGVzY3JpcHRvcikgew0KKyAgICAgICAgdGhyb3cgbmV3IGdsb2JhbDo6U3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uKA0KKyAgICAgICAgICAgICJTZXJ2aWNlLkdldFJlc3BvbnNlUHJvdG90eXBlKCkgZ2l2ZW4gbWV0aG9kIGRlc2NyaXB0b3IgZm9yIHdyb25nIHNlcnZpY2UgdHlwZS4iKTsNCisgICAgICB9DQorICAgICAgc3dpdGNoKG1ldGhvZC5JbmRleCkgew0KKyAgICAgICAgY2FzZSAwOg0KKyAgICAgICAgICByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UuRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbDo6U3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IGdldCBoZXJlLiIpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBTdHViIENyZWF0ZVN0dWIocGI6OklScGNDaGFubmVsIGNoYW5uZWwpIHsNCisgICAgICByZXR1cm4gbmV3IFN0dWIoY2hhbm5lbCk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBjbGFzcyBTdHViIDogZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEdlbmVyaWNTZXJ2aWNlV2l0aEN1c3RvbU9wdGlvbnMgew0KKyAgICAgIGludGVybmFsIFN0dWIocGI6OklScGNDaGFubmVsIGNoYW5uZWwpIHsNCisgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgcmVhZG9ubHkgcGI6OklScGNDaGFubmVsIGNoYW5uZWw7DQorICAgICAgDQorICAgICAgcHVibGljIHBiOjpJUnBjQ2hhbm5lbCBDaGFubmVsIHsNCisgICAgICAgIGdldCB7IHJldHVybiBjaGFubmVsOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZvbygNCisgICAgICAgICAgcGI6OklScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbkZvb1JlcXVlc3QgcmVxdWVzdCwNCisgICAgICAgICAgZ2xvYmFsOjpTeXN0ZW0uQWN0aW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlPiBkb25lKSB7DQorICAgICAgICBjaGFubmVsLkNhbGxNZXRob2QoRGVzY3JpcHRvci5NZXRob2RzWzBdLA0KKyAgICAgICAgICAgIGNvbnRyb2xsZXIsIHJlcXVlc3QsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgICBwYjo6UnBjVXRpbC5HZW5lcmFsaXplQ2FsbGJhY2s8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlLkJ1aWxkZXI+KGRvbmUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZSkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorfQ0KKw0KKyNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RHb29nbGVTaXplUHJvdG9GaWxlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0R29vZ2xlU2l6ZVByb3RvRmlsZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGVmOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0R29vZ2xlU2l6ZVByb3RvRmlsZS5jcwpAQCAtMCwwICsxLDQ1NzMgQEAKKy8vIEdlbmVyYXRlZCBieSBQcm90b0dlbiwgVmVyc2lvbj0yLjQuMS41NTUsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49NTVmNzEyNTIzNGJlYjU4OS4gIERPIE5PVCBFRElUIQ0KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjENCisjcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQorDQordXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM7DQordXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KK3VzaW5nIHBiZCA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCit1c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3Mgew0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXRUZXN0R29vZ2xlU2l6ZVByb3RvRmlsZSB7DQorICANCisgICAgI3JlZ2lvbiBFeHRlbnNpb24gcmVnaXN0cmF0aW9uDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3RlckFsbEV4dGVuc2lvbnMocGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIFN0YXRpYyB2YXJpYWJsZXMNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc2l6ZV9TaXplTWVzc2FnZTFfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UxLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UxX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zaXplX1NpemVNZXNzYWdlMVN1Yk1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc2l6ZV9TaXplTWVzc2FnZTJfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UyX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UyX0dyb3VwMV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyLlR5cGVzLkdyb3VwMSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyLlR5cGVzLkdyb3VwMS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zaXplX1NpemVNZXNzYWdlMl9Hcm91cDFfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc2l6ZV9TaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIERlc2NyaXB0b3INCisgICAgcHVibGljIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOw0KKyAgICANCisgICAgc3RhdGljIFVuaXRUZXN0R29vZ2xlU2l6ZVByb3RvRmlsZSgpIHsNCisgICAgICBieXRlW10gZGVzY3JpcHRvckRhdGEgPSBnbG9iYWw6OlN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoDQorICAgICAgICAgIHN0cmluZy5Db25jYXQoDQorICAgICAgICAgICAgIkNoMW5iMjluYkdVdmRHVnpkQzluYjI5bmJHVmZjMmw2WlM1d2NtOTBieElVZFc1cGRIUmxjM1JmWjI5diIsIA0KKyAgICAgICAgICAgICJaMnhsWDNOcGVtVWFKR2R2YjJkc1pTOXdjbTkwYjJKMVppOWpjMmhoY25CZmIzQjBhVzl1Y3k1d2NtOTAiLCANCisgICAgICAgICAgICAiYnlLQUJ3b01VMmw2WlUxbGMzTmhaMlV4RWc0S0JtWnBaV3hrTVJnQklBSW9DUklPQ2dabWFXVnNaRGtZIiwgDQorICAgICAgICAgICAgIkNTQUJLQWtTRHdvSFptbGxiR1F4T0JnU0lBRW9DUklXQ2dkbWFXVnNaRGd3R0ZBZ0FTZ0lPZ1ZtWVd4eiIsIA0KKyAgICAgICAgICAgICJaUklWQ2dkbWFXVnNaRGd4R0ZFZ0FTZ0lPZ1IwY25WbEVnNEtCbVpwWld4a01oZ0NJQUlvQlJJT0NnWm0iLCANCisgICAgICAgICAgICAiYVdWc1pETVlBeUFDS0FVU0VRb0labWxsYkdReU9EQVltQUlnQVNnRkVoRUtCbVpwWld4a05oZ0dJQUVvIiwgDQorICAgICAgICAgICAgIkJUb0JNQklQQ2dkbWFXVnNaREl5R0JZZ0FTZ0RFZzRLQm1acFpXeGtOQmdFSUFFb0NSSU9DZ1ptYVdWcyIsIA0KKyAgICAgICAgICAgICJaRFVZQlNBREtBWVNGZ29IWm1sbGJHUTFPUmc3SUFFb0NEb0ZabUZzYzJVU0Rnb0dabWxsYkdRM0dBY2ciLCANCisgICAgICAgICAgICAiQVNnSkVnOEtCMlpwWld4a01UWVlFQ0FCS0FVU0ZBb0labWxsYkdReE16QVlnZ0VnQVNnRk9nRXdFaFVLIiwgDQorICAgICAgICAgICAgIkIyWnBaV3hrTVRJWURDQUJLQWc2QkhSeWRXVVNGUW9IWm1sbGJHUXhOeGdSSUFFb0NEb0VkSEoxWlJJViIsIA0KKyAgICAgICAgICAgICJDZ2RtYVdWc1pERXpHQTBnQVNnSU9nUjBjblZsRWhVS0IyWnBaV3hrTVRRWURpQUJLQWc2QkhSeWRXVVMiLCANCisgICAgICAgICAgICAiRXdvSVptbGxiR1F4TURRWWFDQUJLQVU2QVRBU0V3b0labWxsYkdReE1EQVlaQ0FCS0FVNkFUQVNFd29JIiwgDQorICAgICAgICAgICAgIlptbGxiR1F4TURFWVpTQUJLQVU2QVRBU0VBb0labWxsYkdReE1ESVlaaUFCS0FrU0VBb0labWxsYkdReCIsIA0KKyAgICAgICAgICAgICJNRE1ZWnlBQktBa1NFZ29IWm1sbGJHUXlPUmdkSUFFb0JUb0JNQklXQ2dkbWFXVnNaRE13R0I0Z0FTZ0kiLCANCisgICAgICAgICAgICAiT2dWbVlXeHpaUklUQ2dkbWFXVnNaRFl3R0R3Z0FTZ0ZPZ0l0TVJJVkNnaG1hV1ZzWkRJM01SaVBBaUFCIiwgDQorICAgICAgICAgICAgIktBVTZBaTB4RWhVS0NHWnBaV3hrTWpjeUdKQUNJQUVvQlRvQ0xURVNFUW9JWm1sbGJHUXhOVEFZbGdFZyIsIA0KKyAgICAgICAgICAgICJBU2dGRWhJS0IyWnBaV3hrTWpNWUZ5QUJLQVU2QVRBU0Znb0habWxsYkdReU5CZ1lJQUVvQ0RvRlptRnMiLCANCisgICAgICAgICAgICAiYzJVU0Vnb0habWxsYkdReU5SZ1pJQUVvQlRvQk1CSTlDZ2RtYVdWc1pERTFHQThnQVNnTE1pd3VkVzVwIiwgDQorICAgICAgICAgICAgImRIUmxjM1JmWjI5dloyeGxYM05wZW1VdVUybDZaVTFsYzNOaFoyVXhVM1ZpVFdWemMyRm5aUklQQ2dkbSIsIA0KKyAgICAgICAgICAgICJhV1ZzWkRjNEdFNGdBU2dJRWhJS0IyWnBaV3hrTmpjWVF5QUJLQVU2QVRBU0R3b0habWxsYkdRMk9CaEUiLCANCisgICAgICAgICAgICAiSUFFb0JSSVVDZ2htYVdWc1pERXlPQmlBQVNBQktBVTZBVEFTS0FvSVptbGxiR1F4TWprWWdRRWdBU2dKIiwgDQorICAgICAgICAgICAgIk9oVjRlSGg0ZUhoNGVIaDRlSGg0ZUhoNGVIaDRlSGdTRkFvSVptbGxiR1F4TXpFWWd3RWdBU2dGT2dFdyIsIA0KKyAgICAgICAgICAgICJJcUVEQ2haVGFYcGxUV1Z6YzJGblpURlRkV0pOWlhOellXZGxFaEVLQm1acFpXeGtNUmdCSUFFb0JUb0IiLCANCisgICAgICAgICAgICAiTUJJUkNnWm1hV1ZzWkRJWUFpQUJLQVU2QVRBU0VRb0dabWxsYkdRekdBTWdBU2dGT2dFd0VnOEtCMlpwIiwgDQorICAgICAgICAgICAgIlpXeGtNVFVZRHlBQktBa1NGUW9IWm1sbGJHUXhNaGdNSUFFb0NEb0VkSEoxWlJJUENnZG1hV1ZzWkRFeiIsIA0KKyAgICAgICAgICAgICJHQTBnQVNnREVnOEtCMlpwWld4a01UUVlEaUFCS0FNU0R3b0habWxsYkdReE5oZ1FJQUVvQlJJU0NnZG0iLCANCisgICAgICAgICAgICAiYVdWc1pERTVHQk1nQVNnRk9nRXlFaFVLQjJacFpXeGtNakFZRkNBQktBZzZCSFJ5ZFdVU0ZRb0habWxsIiwgDQorICAgICAgICAgICAgImJHUXlPQmdjSUFFb0NEb0VkSEoxWlJJUENnZG1hV1ZzWkRJeEdCVWdBU2dHRWc4S0IyWnBaV3hrTWpJWSIsIA0KKyAgICAgICAgICAgICJGaUFCS0FVU0Znb0habWxsYkdReU14Z1hJQUVvQ0RvRlptRnNjMlVTR0FvSVptbGxiR1F5TURZWXpnRWciLCANCisgICAgICAgICAgICAiQVNnSU9nVm1ZV3h6WlJJUkNnaG1hV1ZzWkRJd014akxBU0FCS0FjU0VRb0labWxsYkdReU1EUVl6QUVnIiwgDQorICAgICAgICAgICAgIkFTZ0ZFaEVLQ0dacFpXeGtNakExR00wQklBRW9DUklSQ2dobWFXVnNaREl3TnhqUEFTQUJLQVFTRVFvSSIsIA0KKyAgICAgICAgICAgICJabWxsYkdRek1EQVlyQUlnQVNnRUl0c0hDZ3hUYVhwbFRXVnpjMkZuWlRJU0Rnb0dabWxsYkdReEdBRWciLCANCisgICAgICAgICAgICAiQVNnSkVnNEtCbVpwWld4a014Z0RJQUVvQXhJT0NnWm1hV1ZzWkRRWUJDQUJLQU1TRHdvSFptbGxiR1F6IiwgDQorICAgICAgICAgICAgIk1CZ2VJQUVvQXhJV0NnZG1hV1ZzWkRjMUdFc2dBU2dJT2dWbVlXeHpaUklPQ2dabWFXVnNaRFlZQmlBQiIsIA0KKyAgICAgICAgICAgICJLQWtTRGdvR1ptbGxiR1F5R0FJZ0FTZ01FaElLQjJacFpXeGtNakVZRlNBQktBVTZBVEFTRHdvSFptbGwiLCANCisgICAgICAgICAgICAiYkdRM01SaEhJQUVvQlJJUENnZG1hV1ZzWkRJMUdCa2dBU2dDRWhNS0NHWnBaV3hrTVRBNUdHMGdBU2dGIiwgDQorICAgICAgICAgICAgIk9nRXdFaFFLQ0dacFpXeGtNakV3R05JQklBRW9CVG9CTUJJVUNnaG1hV1ZzWkRJeE1SalRBU0FCS0FVNiIsIA0KKyAgICAgICAgICAgICJBVEFTRkFvSVptbGxiR1F5TVRJWTFBRWdBU2dGT2dFd0VoUUtDR1pwWld4a01qRXpHTlVCSUFFb0JUb0IiLCANCisgICAgICAgICAgICAiTUJJVUNnaG1hV1ZzWkRJeE5oallBU0FCS0FVNkFUQVNGQW9JWm1sbGJHUXlNVGNZMlFFZ0FTZ0ZPZ0V3IiwgDQorICAgICAgICAgICAgIkVoUUtDR1pwWld4a01qRTRHTm9CSUFFb0JUb0JNQklVQ2dobWFXVnNaREl5TUJqY0FTQUJLQVU2QVRBUyIsIA0KKyAgICAgICAgICAgICJGQW9JWm1sbGJHUXlNakVZM1FFZ0FTZ0ZPZ0V3RWhRS0NHWnBaV3hrTWpJeUdONEJJQUVvQWpvQk1CSVAiLCANCisgICAgICAgICAgICAiQ2dkbWFXVnNaRFl6R0Q4Z0FTZ0ZFamtLQm1keWIzVndNUmdLSUFNb0NqSXBMblZ1YVhSMFpYTjBYMmR2IiwgDQorICAgICAgICAgICAgImIyZHNaVjl6YVhwbExsTnBlbVZOWlhOellXZGxNaTVIY205MWNERVNFUW9JWm1sbGJHUXhNamdZZ0FFZyIsIA0KKyAgICAgICAgICAgICJBeWdKRWhFS0NHWnBaV3hrTVRNeEdJTUJJQUVvQXhJUUNnaG1hV1ZzWkRFeU54aC9JQU1vQ1JJUkNnaG0iLCANCisgICAgICAgICAgICAiYVdWc1pERXlPUmlCQVNBQktBVVNFUW9JWm1sbGJHUXhNekFZZ2dFZ0F5Z0RFaGdLQ0dacFpXeGtNakExIiwgDQorICAgICAgICAgICAgIkdNMEJJQUVvQ0RvRlptRnNjMlVTR0FvSVptbGxiR1F5TURZWXpnRWdBU2dJT2dWbVlXeHpaUnJNQWdvRyIsIA0KKyAgICAgICAgICAgICJSM0p2ZFhBeEVnOEtCMlpwWld4a01URVlDeUFDS0FJU0R3b0habWxsYkdReU5oZ2FJQUVvQWhJUENnZG0iLCANCisgICAgICAgICAgICAiYVdWc1pERXlHQXdnQVNnSkVnOEtCMlpwWld4a01UTVlEU0FCS0FrU0R3b0habWxsYkdReE5CZ09JQU1vIiwgDQorICAgICAgICAgICAgIkNSSVBDZ2RtYVdWc1pERTFHQThnQWlnRUVnNEtCbVpwWld4a05SZ0ZJQUVvQlJJUENnZG1hV1ZzWkRJMyIsIA0KKyAgICAgICAgICAgICJHQnNnQVNnSkVnOEtCMlpwWld4a01qZ1lIQ0FCS0FVU0R3b0habWxsYkdReU9SZ2RJQUVvQ1JJUENnZG0iLCANCisgICAgICAgICAgICAiYVdWc1pERTJHQkFnQVNnSkVnOEtCMlpwWld4a01qSVlGaUFES0FrU0R3b0habWxsYkdRM014aEpJQU1vIiwgDQorICAgICAgICAgICAgIkJSSVNDZ2RtYVdWc1pESXdHQlFnQVNnRk9nRXdFZzhLQjJacFpXeGtNalFZR0NBQktBa1NRUW9IWm1sbCIsIA0KKyAgICAgICAgICAgICJiR1F6TVJnZklBRW9Dekl3TG5WdWFYUjBaWE4wWDJkdmIyZHNaVjl6YVhwbExsTnBlbVZOWlhOellXZGwiLCANCisgICAgICAgICAgICAiTWtkeWIzVndaV1JOWlhOellXZGxJdDRCQ2hwVGFYcGxUV1Z6YzJGblpUSkhjbTkxY0dWa1RXVnpjMkZuIiwgDQorICAgICAgICAgICAgIlpSSU9DZ1ptYVdWc1pERVlBU0FCS0FJU0Rnb0dabWxsYkdReUdBSWdBU2dDRWhFS0JtWnBaV3hrTXhnRCIsIA0KKyAgICAgICAgICAgICJJQUVvQWpvQk1CSU9DZ1ptYVdWc1pEUVlCQ0FCS0FnU0Rnb0dabWxsYkdRMUdBVWdBU2dJRWhRS0JtWnAiLCANCisgICAgICAgICAgICAiWld4a05oZ0dJQUVvQ0RvRWRISjFaUklWQ2dabWFXVnNaRGNZQnlBQktBZzZCV1poYkhObEVnNEtCbVpwIiwgDQorICAgICAgICAgICAgIlpXeGtPQmdJSUFFb0FoSU9DZ1ptYVdWc1pEa1lDU0FCS0FnU0R3b0habWxsYkdReE1CZ0tJQUVvQWhJUCIsIA0KKyAgICAgICAgICAgICJDZ2RtYVdWc1pERXhHQXNnQVNnRFFsRkNDa2R2YjJkc1pWTnBlbVZJQXNJK1FBb2hSMjl2WjJ4bExsQnkiLCANCisgICAgICAgICAgICAiYjNSdlkyOXNRblZtWm1WeWN5NVVaWE4wVUhKdmRHOXpFaHRWYm1sMFZHVnpkRWR2YjJkc1pWTnBlbVZRIiwgDQorICAgICAgICAgICJjbTkwYjBacGJHVT0iKSk7DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciBhc3NpZ25lciA9IGRlbGVnYXRlKHBiZDo6RmlsZURlc2NyaXB0b3Igcm9vdCkgew0KKyAgICAgICAgZGVzY3JpcHRvciA9IHJvb3Q7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zaXplX1NpemVNZXNzYWdlMV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc2l6ZV9TaXplTWVzc2FnZTFfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UxLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UxX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRmllbGQxIiwgIkZpZWxkOSIsICJGaWVsZDE4IiwgIkZpZWxkODAiLCAiRmllbGQ4MSIsICJGaWVsZDIiLCAiRmllbGQzIiwgIkZpZWxkMjgwIiwgIkZpZWxkNiIsICJGaWVsZDIyIiwgIkZpZWxkNCIsICJGaWVsZDUiLCAiRmllbGQ1OSIsICJGaWVsZDciLCAiRmllbGQxNiIsICJGaWVsZDEzMCIsICJGaWVsZDEyIiwgIkZpZWxkMTciLCAiRmllbGQxMyIsICJGaWVsZDE0IiwgIkZpZWxkMTA0IiwgIkZpZWxkMTAwIiwgIkZpZWxkMTAxIiwgIkZpZWxkMTAyIiwgIkZpZWxkMTAzIiwgIkZpZWxkMjkiLCAiRmllbGQzMCIsICJGaWVsZDYwIiwgIkZpZWxkMjcxIiwgIkZpZWxkMjcyIiwgIkZpZWxkMTUwIiwgIkZpZWxkMjMiLCAiRmllbGQyNCIsICJGaWVsZDI1IiwgIkZpZWxkMTUiLCAiRmllbGQ3OCIsICJGaWVsZDY3IiwgIkZpZWxkNjgiLCAiRmllbGQxMjgiLCAiRmllbGQxMjkiLCAiRmllbGQxMzEiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc2l6ZV9TaXplTWVzc2FnZTFTdWJNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTFTdWJNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTFTdWJNZXNzYWdlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkZpZWxkMSIsICJGaWVsZDIiLCAiRmllbGQzIiwgIkZpZWxkMTUiLCAiRmllbGQxMiIsICJGaWVsZDEzIiwgIkZpZWxkMTQiLCAiRmllbGQxNiIsICJGaWVsZDE5IiwgIkZpZWxkMjAiLCAiRmllbGQyOCIsICJGaWVsZDIxIiwgIkZpZWxkMjIiLCAiRmllbGQyMyIsICJGaWVsZDIwNiIsICJGaWVsZDIwMyIsICJGaWVsZDIwNCIsICJGaWVsZDIwNSIsICJGaWVsZDIwNyIsICJGaWVsZDMwMCIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc2l6ZV9TaXplTWVzc2FnZTJfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UyX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMi5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zaXplX1NpemVNZXNzYWdlMl9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkZpZWxkMSIsICJGaWVsZDMiLCAiRmllbGQ0IiwgIkZpZWxkMzAiLCAiRmllbGQ3NSIsICJGaWVsZDYiLCAiRmllbGQyIiwgIkZpZWxkMjEiLCAiRmllbGQ3MSIsICJGaWVsZDI1IiwgIkZpZWxkMTA5IiwgIkZpZWxkMjEwIiwgIkZpZWxkMjExIiwgIkZpZWxkMjEyIiwgIkZpZWxkMjEzIiwgIkZpZWxkMjE2IiwgIkZpZWxkMjE3IiwgIkZpZWxkMjE4IiwgIkZpZWxkMjIwIiwgIkZpZWxkMjIxIiwgIkZpZWxkMjIyIiwgIkZpZWxkNjMiLCAiR3JvdXAxIiwgIkZpZWxkMTI4IiwgIkZpZWxkMTMxIiwgIkZpZWxkMTI3IiwgIkZpZWxkMTI5IiwgIkZpZWxkMTMwIiwgIkZpZWxkMjA1IiwgIkZpZWxkMjA2IiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zaXplX1NpemVNZXNzYWdlMl9Hcm91cDFfX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zaXplX1NpemVNZXNzYWdlMl9fRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UyX0dyb3VwMV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyLlR5cGVzLkdyb3VwMSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyLlR5cGVzLkdyb3VwMS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zaXplX1NpemVNZXNzYWdlMl9Hcm91cDFfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJGaWVsZDExIiwgIkZpZWxkMjYiLCAiRmllbGQxMiIsICJGaWVsZDEzIiwgIkZpZWxkMTQiLCAiRmllbGQxNSIsICJGaWVsZDUiLCAiRmllbGQyNyIsICJGaWVsZDI4IiwgIkZpZWxkMjkiLCAiRmllbGQxNiIsICJGaWVsZDIyIiwgIkZpZWxkNzMiLCAiRmllbGQyMCIsICJGaWVsZDI0IiwgIkZpZWxkMzEiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1szXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zaXplX1NpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRmllbGQxIiwgIkZpZWxkMiIsICJGaWVsZDMiLCAiRmllbGQ0IiwgIkZpZWxkNSIsICJGaWVsZDYiLCAiRmllbGQ3IiwgIkZpZWxkOCIsICJGaWVsZDkiLCAiRmllbGQxMCIsICJGaWVsZDExIiwgfSk7DQorICAgICAgICBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICByZXR1cm4gcmVnaXN0cnk7DQorICAgICAgfTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbShkZXNjcmlwdG9yRGF0YSwNCisgICAgICAgICAgbmV3IHBiZDo6RmlsZURlc2NyaXB0b3JbXSB7DQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuRGVzY3JpcHRvciwgDQorICAgICAgICAgIH0sIGFzc2lnbmVyKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgfQ0KKyAgI3JlZ2lvbiBNZXNzYWdlcw0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBTaXplTWVzc2FnZTEgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxTaXplTWVzc2FnZTEsIFNpemVNZXNzYWdlMS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgU2l6ZU1lc3NhZ2UxKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNpemVNZXNzYWdlMSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgU2l6ZU1lc3NhZ2UxKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgU2l6ZU1lc3NhZ2UxIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNpemVNZXNzYWdlMSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEdvb2dsZVNpemVQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc2l6ZV9TaXplTWVzc2FnZTFfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8U2l6ZU1lc3NhZ2UxLCBTaXplTWVzc2FnZTEuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU2l6ZVByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zaXplX1NpemVNZXNzYWdlMV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxOw0KKyAgICBwcml2YXRlIHN0cmluZyBmaWVsZDFfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkOUZpZWxkTnVtYmVyID0gOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkOTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQ5XyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDkgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkOV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE4RmllbGROdW1iZXIgPSAxODsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTg7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMThfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTggew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE4OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDE4IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxOF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDgwRmllbGROdW1iZXIgPSA4MDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkODA7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDgwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ4MCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkODA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDgwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ4MF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDgxRmllbGROdW1iZXIgPSA4MTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkODE7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDgxXyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkODEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDgxOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQ4MSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkODFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDNGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDM7DQorICAgIHByaXZhdGUgaW50IGZpZWxkM187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjgwRmllbGROdW1iZXIgPSAyODA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI4MDsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyODBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI4MCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjgwOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDI4MCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjgwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNkZpZWxkTnVtYmVyID0gNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNjsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQ2XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ2OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDYgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMkZpZWxkTnVtYmVyID0gMjI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIyOw0KKyAgICBwcml2YXRlIGxvbmcgZmllbGQyMl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIyOyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRmllbGQyMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ0RmllbGROdW1iZXIgPSA0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ0Ow0KKyAgICBwcml2YXRlIHN0cmluZyBmaWVsZDRfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRmllbGQ0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNUZpZWxkTnVtYmVyID0gNTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4gZmllbGQ1XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVsb25nPiBGaWVsZDVMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KGZpZWxkNV8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDVDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIEdldEZpZWxkNShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gZmllbGQ1X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ1OUZpZWxkTnVtYmVyID0gNTk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDU5Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQ1OV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNTkgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDU5OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQ1OSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNTlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ3RmllbGROdW1iZXIgPSA3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ3Ow0KKyAgICBwcml2YXRlIHN0cmluZyBmaWVsZDdfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRmllbGQ3IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ3XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTZGaWVsZE51bWJlciA9IDE2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxNjsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxNl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTYgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE2OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDE2IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxNl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEzMEZpZWxkTnVtYmVyID0gMTMwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMzA7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTMwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMzAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEzMDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMzAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEzMF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEyRmllbGROdW1iZXIgPSAxMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTI7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDEyXyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEyOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQxMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxN0ZpZWxkTnVtYmVyID0gMTc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE3Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQxN18gPSB0cnVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE3IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxNzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMTcgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDE3XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTNGaWVsZE51bWJlciA9IDEzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMzsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMTNfID0gdHJ1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDEzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxM187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE0RmllbGROdW1iZXIgPSAxNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTQ7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDE0XyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE0OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQxNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMDRGaWVsZE51bWJlciA9IDEwNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTA0Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDEwNF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTA0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMDQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTA0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMDRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMDBGaWVsZE51bWJlciA9IDEwMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTAwOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDEwMF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTAwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMDA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTAwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMDBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMDFGaWVsZE51bWJlciA9IDEwMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTAxOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDEwMV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTAxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMDE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTAxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMDFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMDJGaWVsZE51bWJlciA9IDEwMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTAyOw0KKyAgICBwcml2YXRlIHN0cmluZyBmaWVsZDEwMl8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEwMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxMDIgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEwMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEwM0ZpZWxkTnVtYmVyID0gMTAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMDM7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMTAzXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTAzOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDEwMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTAzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjlGaWVsZE51bWJlciA9IDI5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyOTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyOV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjkgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI5OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDI5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyOV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDMwRmllbGROdW1iZXIgPSAzMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMzA7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDMwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQzMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMzA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDMwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQzMF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDYwRmllbGROdW1iZXIgPSA2MDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNjA7DQorICAgIHByaXZhdGUgaW50IGZpZWxkNjBfID0gLTE7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNjAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDYwOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDYwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ2MF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDI3MUZpZWxkTnVtYmVyID0gMjcxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyNzE7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjcxXyA9IC0xOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI3MSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjcxOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDI3MSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjcxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjcyRmllbGROdW1iZXIgPSAyNzI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI3MjsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyNzJfID0gLTE7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjcyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyNzI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjcyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyNzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxNTBGaWVsZE51bWJlciA9IDE1MDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTUwOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDE1MF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTUwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxNTA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTUwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxNTBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyM0ZpZWxkTnVtYmVyID0gMjM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIzOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjMgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjRGaWVsZE51bWJlciA9IDI0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyNDsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMjRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyNDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMjQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDI0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjVGaWVsZE51bWJlciA9IDI1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyNTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyNV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI1OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDI1IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyNV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE1RmllbGROdW1iZXIgPSAxNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTU7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBmaWVsZDE1XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBGaWVsZDE1IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxNV8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDc4RmllbGROdW1iZXIgPSA3ODsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNzg7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDc4XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ3OCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNzg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDc4IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ3OF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDY3RmllbGROdW1iZXIgPSA2NzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNjc7DQorICAgIHByaXZhdGUgaW50IGZpZWxkNjdfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDY3IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ2NzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQ2NyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNjdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ2OEZpZWxkTnVtYmVyID0gNjg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDY4Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDY4XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2OCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNjg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkNjggew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDY4XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTI4RmllbGROdW1iZXIgPSAxMjg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEyODsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxMjhfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEyOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTI4OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDEyOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTI4XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTI5RmllbGROdW1iZXIgPSAxMjk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEyOTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxMjlfID0gInh4eHh4eHh4eHh4eHh4eHh4eHh4eCI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTI5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMjk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTI5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMjlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMzFGaWVsZE51bWJlciA9IDEzMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTMxOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDEzMV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMzE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTMxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMzFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTEgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTEgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTEgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgU2l6ZU1lc3NhZ2UxIE1ha2VSZWFkT25seSgpIHsNCisgICAgICBmaWVsZDVfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoU2l6ZU1lc3NhZ2UxIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFNpemVNZXNzYWdlMSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoU2l6ZU1lc3NhZ2UxIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgU2l6ZU1lc3NhZ2UxIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFNpemVNZXNzYWdlMSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFNpemVNZXNzYWdlMSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFNpemVNZXNzYWdlMSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU2l6ZU1lc3NhZ2UxIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UxLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNpemVNZXNzYWdlMSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTEuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTaXplTWVzc2FnZTEgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDFfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ5OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQ5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ5OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDkodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkOShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkOSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ5KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDlfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTg7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDE4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxODsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxOCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxOChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTggPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMThfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE4KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE4ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxOF8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDgwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ4MDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDgwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ4MDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ4MCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ4MChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkODAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkODBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDgwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDgwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ4MF8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDgxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ4MTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDgxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ4MTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ4MSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ4MShib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkODEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkODFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDgxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDgxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ4MV8gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDM7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQzKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQzXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyODAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI4MDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjgwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyODA7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjgwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI4MChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyODAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjgwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyODAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjgwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyODBfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDY7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ2KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDYgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ2XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgRmllbGQyMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjIobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjJfID0gMEw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQ0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ0OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDRfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1bG9uZz4gRmllbGQ1TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5maWVsZDVfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQ1Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDVDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgR2V0RmllbGQ1KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRGaWVsZDUoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDUoaW50IGluZGV4LCB1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDVfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEZpZWxkNSh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDVfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VGaWVsZDUoc2NnOjpJRW51bWVyYWJsZTx1bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDU5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ1OTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDU5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ1OTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ1OSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ1OShib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNTkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNTlfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDU5KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDU5ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ1OV8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDc7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDc7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ3KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ3ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkN18gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE2OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE2KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxNigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTZfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTMwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMzAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEzMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMzAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTMwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzMCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMzBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEzMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMzAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMTIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEyOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEyKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyXyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTc7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQxNyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTc7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTcoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE3ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE3XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxNygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTdfID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDEzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMyhib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxM18gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMTQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE0OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE0KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxNF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE0XyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEwNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTA0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMDQ7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTA0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEwNChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTA0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMDQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTA0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMDRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTAwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMDAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEwMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMDAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTAwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwMCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMDBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEwMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwMF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTAxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMDE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDEwMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTAxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEwMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMDEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTAxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTAxXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEwMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTAyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMDI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTAyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEwMihzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTAyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTAyXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTAzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMDM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDEwMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTAzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEwMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMDMoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMDNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEwMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwM18gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI5OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDI5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI5KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyOSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQzMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDMwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQzMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQzMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQzMChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMzBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDMwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQzMF8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDYwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ2MDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkNjAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDYwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDYwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDYwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDYwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDYwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ2MCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2MCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNjBfID0gLTE7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNzEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI3MTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjcxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyNzE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjcxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI3MShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyNzEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjcxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyNzEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjcxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyNzFfID0gLTE7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI3MjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjcyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyNzI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjcyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI3MihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyNzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjcyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyNzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjcyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyNzJfID0gLTE7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNTAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE1MDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTUwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxNTA7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTUwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE1MChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNTAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTUwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxNTAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTUwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxNTBfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIzKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjNfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDI0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyNDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyNChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyNF8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyNTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI1OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDI1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI1KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjVfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE1IHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTFTdWJNZXNzYWdlIEZpZWxkMTUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE1OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE1KGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxNShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTFTdWJNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTVfID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VGaWVsZDE1KGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNGaWVsZDE1ICYmDQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTVfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTVfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZS5DcmVhdGVCdWlsZGVyKHJlc3VsdC5maWVsZDE1XykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5maWVsZDE1XyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTUgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTVfID0gbnVsbDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDc4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ3ODsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDc4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ3ODsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ3OCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ3OChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNzggPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNzhfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDc4KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDc4ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ3OF8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDY3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ2NzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkNjcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDY3OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDY3KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDY3KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDY3ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDY3XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ2NygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2NyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNjdfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDY4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ2ODsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkNjggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDY4OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDY4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDY4KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDY4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDY4XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ2OCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2OCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNjhfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEyOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTI4OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMjggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEyODsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMjgodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTI4KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyOCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMjhfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEyOCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMjggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyOF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTI5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMjk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDEyOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI5OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEyOSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMjkoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyOSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMjlfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEyOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMjkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyOV8gPSAieHh4eHh4eHh4eHh4eHh4eHh4eHh4IjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTMxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMzEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEzMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMzEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTMxKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMzFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEzMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMzEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBTaXplTWVzc2FnZTEoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEdvb2dsZVNpemVQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8U2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSwgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTaXplTWVzc2FnZTFTdWJNZXNzYWdlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEdvb2dsZVNpemVQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc2l6ZV9TaXplTWVzc2FnZTFTdWJNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UsIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU2l6ZVByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zaXplX1NpemVNZXNzYWdlMVN1Yk1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDNGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDM7DQorICAgIHByaXZhdGUgaW50IGZpZWxkM187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTVGaWVsZE51bWJlciA9IDE1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxNTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxNV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTUgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDE1XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTJGaWVsZE51bWJlciA9IDEyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMjsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMTJfID0gdHJ1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDEyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEzRmllbGROdW1iZXIgPSAxMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTM7DQorICAgIHByaXZhdGUgbG9uZyBmaWVsZDEzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBGaWVsZDEzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxM187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE0RmllbGROdW1iZXIgPSAxNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTQ7DQorICAgIHByaXZhdGUgbG9uZyBmaWVsZDE0XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBGaWVsZDE0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE2RmllbGROdW1iZXIgPSAxNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTY7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTZfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxOUZpZWxkTnVtYmVyID0gMTk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE5Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDE5XyA9IDI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTkgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE5OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDE5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxOV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIwRmllbGROdW1iZXIgPSAyMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjA7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDIwXyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIwOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQyMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyOEZpZWxkTnVtYmVyID0gMjg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI4Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQyOF8gPSB0cnVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI4IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyODsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMjggew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDI4XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjFGaWVsZE51bWJlciA9IDIxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMTsNCisgICAgcHJpdmF0ZSB1bG9uZyBmaWVsZDIxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjE7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIEZpZWxkMjEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjJGaWVsZE51bWJlciA9IDIyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMjsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyMl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIzRmllbGROdW1iZXIgPSAyMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjM7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDIzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDIzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyM187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIwNkZpZWxkTnVtYmVyID0gMjA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMDY7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDIwNl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMDY7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDIwNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjA2XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjAzRmllbGROdW1iZXIgPSAyMDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIwMzsNCisgICAgcHJpdmF0ZSB1aW50IGZpZWxkMjAzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIwMzsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBGaWVsZDIwMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjAzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjA0RmllbGROdW1iZXIgPSAyMDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIwNDsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyMDRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjA0OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIwNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjA0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjA1RmllbGROdW1iZXIgPSAyMDU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIwNTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQyMDVfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA1IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMDU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjA1IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMDVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMDdGaWVsZE51bWJlciA9IDIwNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjA3Ow0KKyAgICBwcml2YXRlIHVsb25nIGZpZWxkMjA3XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIwNzsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgRmllbGQyMDcgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIwN187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDMwMEZpZWxkTnVtYmVyID0gMzAwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQzMDA7DQorICAgIHByaXZhdGUgdWxvbmcgZmllbGQzMDBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMwMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMzAwOyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBGaWVsZDMwMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMzAwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8U2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFNpemVNZXNzYWdlMVN1Yk1lc3NhZ2Ugb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBTaXplTWVzc2FnZTFTdWJNZXNzYWdlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMVN1Yk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTaXplTWVzc2FnZTFTdWJNZXNzYWdlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkM18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTUoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTVfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQxMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTIoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTJfID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDEzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMyhsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxM18gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDE0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxNDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxNChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxNF8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE2OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE2KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxNigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTZfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE5OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE5KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxOSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTlfID0gMjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDIwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMF8gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI4OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMjggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI4OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDI4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI4KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyOCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyOF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI4XyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjE7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEZpZWxkMjEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIxKHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMjMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIzKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIzXyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQyMDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIwNjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMDYodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjA2KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDYgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMDYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA2ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMDZfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIwMzsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBGaWVsZDIwMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjAzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIwMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMDModWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMDNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIwMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwM18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIwNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjA0OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIwNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMDQoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwNF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjA0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA0XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIwNTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjA1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMDU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjA1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIwNShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwNV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjA1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA1XyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDc7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEZpZWxkMjA3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMDc7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjA3KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIwNyh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMDdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIwNygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDcgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwN18gPSAwVUw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQzMDAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDMwMDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgRmllbGQzMDAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDMwMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQzMDAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMzAwKHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzAwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDMwMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMzAwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMwMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMzAwXyA9IDBVTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgU2l6ZU1lc3NhZ2UxU3ViTWVzc2FnZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU2l6ZVByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFNpemVNZXNzYWdlMiA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFNpemVNZXNzYWdlMiwgU2l6ZU1lc3NhZ2UyLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTIoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU2l6ZU1lc3NhZ2UyIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTaXplTWVzc2FnZTIoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTIgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBTaXplTWVzc2FnZTIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU2l6ZU1lc3NhZ2UyIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU2l6ZVByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zaXplX1NpemVNZXNzYWdlMl9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxTaXplTWVzc2FnZTIsIFNpemVNZXNzYWdlMi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RHb29nbGVTaXplUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UyX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMNCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsNCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBHcm91cDEgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxHcm91cDEsIEdyb3VwMS5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIEdyb3VwMSgpIHsgfQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR3JvdXAxIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBHcm91cDEoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEdyb3VwMSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgR3JvdXAxIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RHb29nbGVTaXplUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UyX0dyb3VwMV9fRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxHcm91cDEsIEdyb3VwMS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU2l6ZVByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zaXplX1NpemVNZXNzYWdlMl9Hcm91cDFfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTFGaWVsZE51bWJlciA9IDExOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTE7DQorICAgICAgICBwcml2YXRlIGZsb2F0IGZpZWxkMTFfOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDExOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgZmxvYXQgRmllbGQxMSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDExXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjZGaWVsZE51bWJlciA9IDI2Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjY7DQorICAgICAgICBwcml2YXRlIGZsb2F0IGZpZWxkMjZfOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNiB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI2OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgZmxvYXQgRmllbGQyNiB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDI2XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTJGaWVsZE51bWJlciA9IDEyOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTI7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBmaWVsZDEyXyA9ICIiOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMiB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEyOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTIgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMl87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEzRmllbGROdW1iZXIgPSAxMzsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEzOw0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxM18gPSAiIjsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDEzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTNfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxNEZpZWxkTnVtYmVyID0gMTQ7DQorICAgICAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gZmllbGQxNF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICAgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBGaWVsZDE0TGlzdCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoZmllbGQxNF8pOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IEZpZWxkMTRDb3VudCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDE0Xy5Db3VudDsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBHZXRGaWVsZDE0KGludCBpbmRleCkgew0KKyAgICAgICAgICByZXR1cm4gZmllbGQxNF9baW5kZXhdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTVGaWVsZE51bWJlciA9IDE1Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTU7DQorICAgICAgICBwcml2YXRlIHVsb25nIGZpZWxkMTVfOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE1OyB9DQorICAgICAgICB9DQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB1bG9uZyBGaWVsZDE1IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTVfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ1RmllbGROdW1iZXIgPSA1Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNTsNCisgICAgICAgIHByaXZhdGUgaW50IGZpZWxkNV87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ1OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IEZpZWxkNSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDVfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyN0ZpZWxkTnVtYmVyID0gMjc7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyNzsNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMjdfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI3IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjc7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQyNyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDI3XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjhGaWVsZE51bWJlciA9IDI4Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjg7DQorICAgICAgICBwcml2YXRlIGludCBmaWVsZDI4XzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjggew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyODsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBGaWVsZDI4IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjhfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyOUZpZWxkTnVtYmVyID0gMjk7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyOTsNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMjlfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI5IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjk7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQyOSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDI5XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTZGaWVsZE51bWJlciA9IDE2Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTY7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBmaWVsZDE2XyA9ICIiOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNiB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE2OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTYgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQxNl87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIyRmllbGROdW1iZXIgPSAyMjsNCisgICAgICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiBmaWVsZDIyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgICAgICBwdWJsaWMgc2NnOjpJTGlzdDxzdHJpbmc+IEZpZWxkMjJMaXN0IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShmaWVsZDIyXyk7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgRmllbGQyMkNvdW50IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjJfLkNvdW50OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIEdldEZpZWxkMjIoaW50IGluZGV4KSB7DQorICAgICAgICAgIHJldHVybiBmaWVsZDIyX1tpbmRleF07DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ3M0ZpZWxkTnVtYmVyID0gNzM7DQorICAgICAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gZmllbGQ3M18gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICAgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBGaWVsZDczTGlzdCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoZmllbGQ3M18pOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IEZpZWxkNzNDb3VudCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDczXy5Db3VudDsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBHZXRGaWVsZDczKGludCBpbmRleCkgew0KKyAgICAgICAgICByZXR1cm4gZmllbGQ3M19baW5kZXhdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjBGaWVsZE51bWJlciA9IDIwOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjA7DQorICAgICAgICBwcml2YXRlIGludCBmaWVsZDIwXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjAgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMDsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBGaWVsZDIwIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjBfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyNEZpZWxkTnVtYmVyID0gMjQ7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyNDsNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMjRfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI0IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQyNCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDI0XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMzFGaWVsZE51bWJlciA9IDMxOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMzE7DQorICAgICAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIGZpZWxkMzFfOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQzMSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDMxOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgRmllbGQzMSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDMxXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHcm91cDEgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHcm91cDEgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHcm91cDEgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpdmF0ZSBHcm91cDEgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICBmaWVsZDE0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgZmllbGQyMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIGZpZWxkNzNfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKEdyb3VwMSBwcm90b3R5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPEdyb3VwMSwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihHcm91cDEgY2xvbmVGcm9tKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICAgICAgcHJpdmF0ZSBHcm91cDEgcmVzdWx0Ow0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBHcm91cDEgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIEdyb3VwMSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBHcm91cDEoKTsNCisgICAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgR3JvdXAxIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMi5UeXBlcy5Hcm91cDEuRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgR3JvdXAxIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTIuVHlwZXMuR3JvdXAxLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgR3JvdXAxIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTEgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBmbG9hdCBGaWVsZDExIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTE7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDExKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTEoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDExID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxMV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTEoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDExXyA9IDBGOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI2IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjY7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgZmxvYXQgRmllbGQyNiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI2OyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQyNih2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI2KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyNiA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjZfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI2KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjYgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyNl8gPSAwRjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEyOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDEyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDEyKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTIoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxMl8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTIoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMiA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDEyXyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTMgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMzsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkMTModmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMyhzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDEzXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMygpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTNfID0gIiI7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBGaWVsZDE0TGlzdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZmllbGQxNF87IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEZpZWxkMTRDb3VudCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE0Q291bnQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgc3RyaW5nIEdldEZpZWxkMTQoaW50IGluZGV4KSB7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRGaWVsZDE0KGluZGV4KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE0KGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDE0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGRGaWVsZDE0KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNF8uQWRkKHZhbHVlKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUZpZWxkMTQoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxNCgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDE0Xy5DbGVhcigpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE1IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTU7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgICAgcHVibGljIHVsb25nIEZpZWxkMTUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxNTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkMTUodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTUodWxvbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTUoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxNSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDE1XyA9IDBVTDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ1IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgRmllbGQ1IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkNSh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDUoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ1ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQ1XyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ1KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDVfID0gMDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNyB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI3OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDI3IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjc7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDI3KHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjcoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI3ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyN18gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjcoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyNyA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDI3XyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI4IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjg7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEZpZWxkMjggew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyODsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkMjgodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyOChpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI4ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyOF8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjgoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyOCA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDI4XyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjkgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyOTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQyOSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI5OyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQyOSh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI5KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyOSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjlfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI5KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjkgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyOV8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE2OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDE2IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTY7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDE2KHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTYoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE2ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNl8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTYoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxNiA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDE2XyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gRmllbGQyMkxpc3Qgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmZpZWxkMjJfOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBGaWVsZDIyQ291bnQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMkNvdW50OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBHZXRGaWVsZDIyKGludCBpbmRleCkgew0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuR2V0RmllbGQyMihpbmRleCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMihpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmllbGQyMihzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjJfLkFkZCh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VGaWVsZDIyKHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDIyXy5BZGQodmFsdWVzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjIoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyMl8uQ2xlYXIoKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IEZpZWxkNzNMaXN0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5maWVsZDczXzsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgRmllbGQ3M0NvdW50IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNzNDb3VudDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgR2V0RmllbGQ3MyhpbnQgaW5kZXgpIHsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0LkdldEZpZWxkNzMoaW5kZXgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNzMoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDczX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGRGaWVsZDczKGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkNzNfLkFkZCh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VGaWVsZDczKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDczXy5BZGQodmFsdWVzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNzMoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQ3M18uQ2xlYXIoKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIwOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBGaWVsZDIwIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjA7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDIwKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjAoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMCA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjBfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIwKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjAgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyMF8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyNDsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkMjQodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyNChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjQgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDI0XyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyNCgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI0ID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjRfID0gIiI7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMzEgew0KKyAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDMxOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIEZpZWxkMzEgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQzMTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkMzEodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQzMShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQzMSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMzFfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQzMShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMxID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQzMV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUZpZWxkMzEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNGaWVsZDMxICYmDQorICAgICAgICAgICAgICAgIHJlc3VsdC5maWVsZDMxXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0LmZpZWxkMzFfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQuZmllbGQzMV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJlc3VsdC5maWVsZDMxXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQzMSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDMxKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzEgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQzMV8gPSBudWxsOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgR3JvdXAxKCkgew0KKyAgICAgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU2l6ZVByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQzRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQzOw0KKyAgICBwcml2YXRlIGxvbmcgZmllbGQzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQzOyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRmllbGQzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNEZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNDsNCisgICAgcHJpdmF0ZSBsb25nIGZpZWxkNF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEZpZWxkNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDMwRmllbGROdW1iZXIgPSAzMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMzA7DQorICAgIHByaXZhdGUgbG9uZyBmaWVsZDMwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQzMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMzA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBGaWVsZDMwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQzMF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDc1RmllbGROdW1iZXIgPSA3NTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNzU7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDc1XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ3NSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNzU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDc1IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ3NV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDZGaWVsZE51bWJlciA9IDY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDY7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkNl8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ2OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDYgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyOw0KKyAgICBwcml2YXRlIHBiOjpCeXRlU3RyaW5nIGZpZWxkMl8gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyOyB9DQorICAgIH0NCisgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIEZpZWxkMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIxRmllbGROdW1iZXIgPSAyMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjE7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ3MUZpZWxkTnVtYmVyID0gNzE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDcxOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDcxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ3MSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNzE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkNzEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDcxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjVGaWVsZE51bWJlciA9IDI1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyNTsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDI1XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQyNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMDlGaWVsZE51bWJlciA9IDEwOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTA5Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDEwOV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTA5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMDk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTA5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMDlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMTBGaWVsZE51bWJlciA9IDIxMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjEwOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxMF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjEwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjEwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMTBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMTFGaWVsZE51bWJlciA9IDIxMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjExOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxMV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjExIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjExIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMTFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMTJGaWVsZE51bWJlciA9IDIxMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjEyOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxMl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjEyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjEyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMTJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMTNGaWVsZE51bWJlciA9IDIxMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjEzOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxM187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjEzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjEzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMTNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMTZGaWVsZE51bWJlciA9IDIxNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjE2Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxNl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjE2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTY7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjE2IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMTZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMTdGaWVsZE51bWJlciA9IDIxNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjE3Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxN187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjE3IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjE3IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMTdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMThGaWVsZE51bWJlciA9IDIxODsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjE4Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxOF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjE4IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMTg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjE4IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMThfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMjBGaWVsZE51bWJlciA9IDIyMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjIwOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIyMF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMjA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjIwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMjBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMjFGaWVsZE51bWJlciA9IDIyMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjIxOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIyMV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMjE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjIxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMjFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMjJGaWVsZE51bWJlciA9IDIyMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjIyOw0KKyAgICBwcml2YXRlIGZsb2F0IGZpZWxkMjIyXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMjIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIyMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBGaWVsZDIyMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjIyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNjNGaWVsZE51bWJlciA9IDYzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ2MzsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQ2M187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNjMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDYzOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDYzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ2M187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBHcm91cDFGaWVsZE51bWJlciA9IDEwOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMi5UeXBlcy5Hcm91cDE+IGdyb3VwMV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyLlR5cGVzLkdyb3VwMT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyLlR5cGVzLkdyb3VwMT4gR3JvdXAxTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdyb3VwMV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdyb3VwMUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gZ3JvdXAxXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTIuVHlwZXMuR3JvdXAxIEdldEdyb3VwMShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gZ3JvdXAxX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMjhGaWVsZE51bWJlciA9IDEyODsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+IGZpZWxkMTI4XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gRmllbGQxMjhMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KGZpZWxkMTI4Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTI4Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEyOF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEdldEZpZWxkMTI4KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBmaWVsZDEyOF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTMxRmllbGROdW1iZXIgPSAxMzE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEzMTsNCisgICAgcHJpdmF0ZSBsb25nIGZpZWxkMTMxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMzEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEzMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEZpZWxkMTMxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMzFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMjdGaWVsZE51bWJlciA9IDEyNzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+IGZpZWxkMTI3XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gRmllbGQxMjdMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KGZpZWxkMTI3Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTI3Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEyN18uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEdldEZpZWxkMTI3KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBmaWVsZDEyN19baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTI5RmllbGROdW1iZXIgPSAxMjk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEyOTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxMjlfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEyOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTI5OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDEyOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTI5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTMwRmllbGROdW1iZXIgPSAxMzA7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gZmllbGQxMzBfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGxvbmc+IEZpZWxkMTMwTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShmaWVsZDEzMF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDEzMENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMzBfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0RmllbGQxMzAoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGZpZWxkMTMwX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMDVGaWVsZE51bWJlciA9IDIwNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjA1Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQyMDVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjA1OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQyMDUgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIwNV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIwNkZpZWxkTnVtYmVyID0gMjA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMDY7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDIwNl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMDY7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDIwNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjA2XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UyIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UyIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UyIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFNpemVNZXNzYWdlMiBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgZ3JvdXAxXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBmaWVsZDEyOF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgZmllbGQxMjdfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIGZpZWxkMTMwXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFNpemVNZXNzYWdlMiBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxTaXplTWVzc2FnZTIsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFNpemVNZXNzYWdlMiBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFNpemVNZXNzYWdlMiByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTIgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBTaXplTWVzc2FnZTIgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBTaXplTWVzc2FnZTIoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNpemVNZXNzYWdlMiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMi5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTaXplTWVzc2FnZTIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgU2l6ZU1lc3NhZ2UyIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDM7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQzKGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkM18gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgRmllbGQ0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ0OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDRfID0gMEw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQzMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMzA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgRmllbGQzMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMzA7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMzAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMzAobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDMwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQzMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMzBfID0gMEw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ3NSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNzU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQ3NSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNzU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNzUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNzUoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDc1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDc1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ3NSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ3NSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNzVfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ2OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQ2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ2OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDYodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNihzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ2KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDYgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDZfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyKHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyXyA9IHBiOjpCeXRlU3RyaW5nLkVtcHR5Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNzEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDcxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQ3MSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNzE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNzEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNzEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNzEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNzFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDcxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDcxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ3MV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBGaWVsZDI1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyNTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyNSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyNShmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjVfID0gMEY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEwOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTA5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMDk7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTA5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEwOShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTA5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMDkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTA5ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMDlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjEwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMTAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIxMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMTAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjEwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMTBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxMF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjExIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMTE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIxMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjExOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIxMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMTEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjExID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjExKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjExXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIxMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjEyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMTI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjEyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIxMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjEyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMTIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMTJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjEzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMTMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIxMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMTModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjEzKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMTNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxM18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjE2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMTY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIxNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjE2OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIxNih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMTYoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjE2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxNl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjE2KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjE2XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIxNzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjE3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMTc7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjE3KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIxNyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjE3XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMTcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjE3ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMTdfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjE4OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMTggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIxODsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMTgodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjE4KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxOCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMThfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxOCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxOF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMjA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIyMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjIwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIyMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMjAoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIyMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjIwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIyMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjIwXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMjEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIyMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjIxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMjE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjIxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIyMShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMjEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjIxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMjEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMjFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIyMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjIyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBGaWVsZDIyMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjIyOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIyMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMjIoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMjIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjIyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMjIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMjJfID0gMEY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2MyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNjM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDYzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ2MzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ2Myh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ2MyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2MyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ2M18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNjMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNjMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDYzXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTIuVHlwZXMuR3JvdXAxPiBHcm91cDFMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmdyb3VwMV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHcm91cDFDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lkdyb3VwMUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTIuVHlwZXMuR3JvdXAxIEdldEdyb3VwMShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0R3JvdXAxKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0R3JvdXAxKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyLlR5cGVzLkdyb3VwMSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZ3JvdXAxX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRHcm91cDEoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTIuVHlwZXMuR3JvdXAxLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmdyb3VwMV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkR3JvdXAxKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNpemVNZXNzYWdlMi5UeXBlcy5Hcm91cDEgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmdyb3VwMV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRHcm91cDEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyLlR5cGVzLkdyb3VwMS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5ncm91cDFfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VHcm91cDEoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TaXplTWVzc2FnZTIuVHlwZXMuR3JvdXAxPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZ3JvdXAxXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckdyb3VwMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZ3JvdXAxXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBGaWVsZDEyOExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZmllbGQxMjhfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMjhDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI4Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBHZXRGaWVsZDEyOChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0RmllbGQxMjgoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEyOChpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMjhfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEZpZWxkMTI4KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMjhfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VGaWVsZDEyOChzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI4Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTI4KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyOF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTMxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEZpZWxkMTMxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMzE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTMxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEzMShsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTMxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTMxXyA9IDBMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBGaWVsZDEyN0xpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZmllbGQxMjdfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMjdDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI3Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBHZXRGaWVsZDEyNyhpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0RmllbGQxMjcoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEyNyhpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMjdfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEZpZWxkMTI3KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMjdfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VGaWVsZDEyNyhzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI3Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTI3KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyN18uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEyOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTI5OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMjkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEyOTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMjkodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTI5KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyOSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMjlfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEyOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMjkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyOV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gRmllbGQxMzBMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmZpZWxkMTMwXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTMwQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEzMENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEdldEZpZWxkMTMwKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRGaWVsZDEzMChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTMwKGludCBpbmRleCwgbG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmllbGQxMzAobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUZpZWxkMTMwKHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTMwXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTMwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjA1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMjA1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMDU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjA1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIwNShib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwNV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjA1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA1XyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMDY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQyMDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIwNjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMDYodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjA2KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDYgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMDYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA2ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMDZfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFNpemVNZXNzYWdlMigpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU2l6ZVByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8U2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UsIFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU2l6ZVByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zaXplX1NpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLCBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RHb29nbGVTaXplUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NpemVfU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMkZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkM0ZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMzsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNEZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNDsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkNF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDVGaWVsZE51bWJlciA9IDU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDU7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDUgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ2RmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ2Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQ2XyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDdGaWVsZE51bWJlciA9IDc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDc7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDdfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDcgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ4RmllbGROdW1iZXIgPSA4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ4Ow0KKyAgICBwcml2YXRlIGZsb2F0IGZpZWxkOF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkODsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBGaWVsZDggew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDhfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ5RmllbGROdW1iZXIgPSA5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ5Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQ5XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ5OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQ5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTBGaWVsZE51bWJlciA9IDEwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMDsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDEwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQxMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMUZpZWxkTnVtYmVyID0gMTE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDExOw0KKyAgICBwcml2YXRlIGxvbmcgZmllbGQxMV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDExOyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRmllbGQxMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNpemVNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTaXplTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMV8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEZpZWxkMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMl8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEZpZWxkMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDMoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkM18gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQ0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ0OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDRfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDUoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ1ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ1XyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDY7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ2KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDZfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNl8gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDc7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ3KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ3ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkN18gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDg7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEZpZWxkOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkODsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDgoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDhfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkOCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkOF8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQ5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ5OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDkodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkOShib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkOSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ5KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDlfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEZpZWxkMTAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEwKGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMF8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDExIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDExIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMShsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDExKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDExID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMV8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgU2l6ZU1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEdvb2dsZVNpemVQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorfQ0KKw0KKyNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RHb29nbGVTcGVlZFByb3RvRmlsZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdEdvb2dsZVNwZWVkUHJvdG9GaWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYTBlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RHb29nbGVTcGVlZFByb3RvRmlsZS5jcwpAQCAtMCwwICsxLDY2MzggQEAKKy8vIEdlbmVyYXRlZCBieSBQcm90b0dlbiwgVmVyc2lvbj0yLjQuMS41NTUsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49NTVmNzEyNTIzNGJlYjU4OS4gIERPIE5PVCBFRElUIQ0KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjENCisjcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQorDQordXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM7DQordXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KK3VzaW5nIHBiZCA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCit1c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3Mgew0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXRUZXN0R29vZ2xlU3BlZWRQcm90b0ZpbGUgew0KKyAgDQorICAgICNyZWdpb24gRXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbg0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgew0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBTdGF0aWMgdmFyaWFibGVzDQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NwZWVkX1NwZWVkTWVzc2FnZTFfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTEsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTEuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc3BlZWRfU3BlZWRNZXNzYWdlMV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zcGVlZF9TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NwZWVkX1NwZWVkTWVzc2FnZTFTdWJNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NwZWVkX1NwZWVkTWVzc2FnZTJfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTIuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc3BlZWRfU3BlZWRNZXNzYWdlMl9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zcGVlZF9TcGVlZE1lc3NhZ2UyX0dyb3VwMV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMi5UeXBlcy5Hcm91cDEsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NwZWVkX1NwZWVkTWVzc2FnZTJfR3JvdXAxX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NwZWVkX1NwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc3BlZWRfU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBEZXNjcmlwdG9yDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIHByaXZhdGUgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsNCisgICAgDQorICAgIHN0YXRpYyBVbml0VGVzdEdvb2dsZVNwZWVkUHJvdG9GaWxlKCkgew0KKyAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygNCisgICAgICAgICAgc3RyaW5nLkNvbmNhdCgNCisgICAgICAgICAgICAiQ2g1bmIyOW5iR1V2ZEdWemRDOW5iMjluYkdWZmMzQmxaV1F1Y0hKdmRHOFNGWFZ1YVhSMFpYTjBYMmR2IiwgDQorICAgICAgICAgICAgImIyZHNaVjl6Y0dWbFpCb2taMjl2WjJ4bEwzQnliM1J2WW5WbUwyTnphR0Z5Y0Y5dmNIUnBiMjV6TG5CeSIsIA0KKyAgICAgICAgICAgICJiM1J2SW9NSENnMVRjR1ZsWkUxbGMzTmhaMlV4RWc0S0JtWnBaV3hrTVJnQklBSW9DUklPQ2dabWFXVnMiLCANCisgICAgICAgICAgICAiWkRrWUNTQUJLQWtTRHdvSFptbGxiR1F4T0JnU0lBRW9DUklXQ2dkbWFXVnNaRGd3R0ZBZ0FTZ0lPZ1ZtIiwgDQorICAgICAgICAgICAgIllXeHpaUklWQ2dkbWFXVnNaRGd4R0ZFZ0FTZ0lPZ1IwY25WbEVnNEtCbVpwWld4a01oZ0NJQUlvQlJJTyIsIA0KKyAgICAgICAgICAgICJDZ1ptYVdWc1pETVlBeUFDS0FVU0VRb0labWxsYkdReU9EQVltQUlnQVNnRkVoRUtCbVpwWld4a05oZ0ciLCANCisgICAgICAgICAgICAiSUFFb0JUb0JNQklQQ2dkbWFXVnNaREl5R0JZZ0FTZ0RFZzRLQm1acFpXeGtOQmdFSUFFb0NSSU9DZ1ptIiwgDQorICAgICAgICAgICAgImFXVnNaRFVZQlNBREtBWVNGZ29IWm1sbGJHUTFPUmc3SUFFb0NEb0ZabUZzYzJVU0Rnb0dabWxsYkdRMyIsIA0KKyAgICAgICAgICAgICJHQWNnQVNnSkVnOEtCMlpwWld4a01UWVlFQ0FCS0FVU0ZBb0labWxsYkdReE16QVlnZ0VnQVNnRk9nRXciLCANCisgICAgICAgICAgICAiRWhVS0IyWnBaV3hrTVRJWURDQUJLQWc2QkhSeWRXVVNGUW9IWm1sbGJHUXhOeGdSSUFFb0NEb0VkSEoxIiwgDQorICAgICAgICAgICAgIlpSSVZDZ2RtYVdWc1pERXpHQTBnQVNnSU9nUjBjblZsRWhVS0IyWnBaV3hrTVRRWURpQUJLQWc2QkhSeSIsIA0KKyAgICAgICAgICAgICJkV1VTRXdvSVptbGxiR1F4TURRWWFDQUJLQVU2QVRBU0V3b0labWxsYkdReE1EQVlaQ0FCS0FVNkFUQVMiLCANCisgICAgICAgICAgICAiRXdvSVptbGxiR1F4TURFWVpTQUJLQVU2QVRBU0VBb0labWxsYkdReE1ESVlaaUFCS0FrU0VBb0labWxsIiwgDQorICAgICAgICAgICAgImJHUXhNRE1ZWnlBQktBa1NFZ29IWm1sbGJHUXlPUmdkSUFFb0JUb0JNQklXQ2dkbWFXVnNaRE13R0I0ZyIsIA0KKyAgICAgICAgICAgICJBU2dJT2dWbVlXeHpaUklUQ2dkbWFXVnNaRFl3R0R3Z0FTZ0ZPZ0l0TVJJVkNnaG1hV1ZzWkRJM01SaVAiLCANCisgICAgICAgICAgICAiQWlBQktBVTZBaTB4RWhVS0NHWnBaV3hrTWpjeUdKQUNJQUVvQlRvQ0xURVNFUW9JWm1sbGJHUXhOVEFZIiwgDQorICAgICAgICAgICAgImxnRWdBU2dGRWhJS0IyWnBaV3hrTWpNWUZ5QUJLQVU2QVRBU0Znb0habWxsYkdReU5CZ1lJQUVvQ0RvRiIsIA0KKyAgICAgICAgICAgICJabUZzYzJVU0Vnb0habWxsYkdReU5SZ1pJQUVvQlRvQk1CSS9DZ2RtYVdWc1pERTFHQThnQVNnTE1pNHUiLCANCisgICAgICAgICAgICAiZFc1cGRIUmxjM1JmWjI5dloyeGxYM053WldWa0xsTndaV1ZrVFdWemMyRm5aVEZUZFdKTlpYTnpZV2RsIiwgDQorICAgICAgICAgICAgIkVnOEtCMlpwWld4a056Z1lUaUFCS0FnU0Vnb0habWxsYkdRMk54aERJQUVvQlRvQk1CSVBDZ2RtYVdWcyIsIA0KKyAgICAgICAgICAgICJaRFk0R0VRZ0FTZ0ZFaFFLQ0dacFpXeGtNVEk0R0lBQklBRW9CVG9CTUJJb0NnaG1hV1ZzWkRFeU9SaUIiLCANCisgICAgICAgICAgICAiQVNBQktBazZGWGg0ZUhoNGVIaDRlSGg0ZUhoNGVIaDRlSGg0ZUJJVUNnaG1hV1ZzWkRFek1SaURBU0FCIiwgDQorICAgICAgICAgICAgIktBVTZBVEFpb2dNS0YxTndaV1ZrVFdWemMyRm5aVEZUZFdKTlpYTnpZV2RsRWhFS0JtWnBaV3hrTVJnQiIsIA0KKyAgICAgICAgICAgICJJQUVvQlRvQk1CSVJDZ1ptYVdWc1pESVlBaUFCS0FVNkFUQVNFUW9HWm1sbGJHUXpHQU1nQVNnRk9nRXciLCANCisgICAgICAgICAgICAiRWc4S0IyWnBaV3hrTVRVWUR5QUJLQWtTRlFvSFptbGxiR1F4TWhnTUlBRW9DRG9FZEhKMVpSSVBDZ2RtIiwgDQorICAgICAgICAgICAgImFXVnNaREV6R0EwZ0FTZ0RFZzhLQjJacFpXeGtNVFFZRGlBQktBTVNEd29IWm1sbGJHUXhOaGdRSUFFbyIsIA0KKyAgICAgICAgICAgICJCUklTQ2dkbWFXVnNaREU1R0JNZ0FTZ0ZPZ0V5RWhVS0IyWnBaV3hrTWpBWUZDQUJLQWc2QkhSeWRXVVMiLCANCisgICAgICAgICAgICAiRlFvSFptbGxiR1F5T0JnY0lBRW9DRG9FZEhKMVpSSVBDZ2RtYVdWc1pESXhHQlVnQVNnR0VnOEtCMlpwIiwgDQorICAgICAgICAgICAgIlpXeGtNaklZRmlBQktBVVNGZ29IWm1sbGJHUXlNeGdYSUFFb0NEb0ZabUZzYzJVU0dBb0labWxsYkdReSIsIA0KKyAgICAgICAgICAgICJNRFlZemdFZ0FTZ0lPZ1ZtWVd4elpSSVJDZ2htYVdWc1pESXdNeGpMQVNBQktBY1NFUW9JWm1sbGJHUXkiLCANCisgICAgICAgICAgICAiTURRWXpBRWdBU2dGRWhFS0NHWnBaV3hrTWpBMUdNMEJJQUVvQ1JJUkNnaG1hV1ZzWkRJd054alBBU0FCIiwgDQorICAgICAgICAgICAgIktBUVNFUW9JWm1sbGJHUXpNREFZckFJZ0FTZ0VJdUFIQ2cxVGNHVmxaRTFsYzNOaFoyVXlFZzRLQm1acCIsIA0KKyAgICAgICAgICAgICJaV3hrTVJnQklBRW9DUklPQ2dabWFXVnNaRE1ZQXlBQktBTVNEZ29HWm1sbGJHUTBHQVFnQVNnREVnOEsiLCANCisgICAgICAgICAgICAiQjJacFpXeGtNekFZSGlBQktBTVNGZ29IWm1sbGJHUTNOUmhMSUFFb0NEb0ZabUZzYzJVU0Rnb0dabWxsIiwgDQorICAgICAgICAgICAgImJHUTJHQVlnQVNnSkVnNEtCbVpwWld4a01oZ0NJQUVvREJJU0NnZG1hV1ZzWkRJeEdCVWdBU2dGT2dFdyIsIA0KKyAgICAgICAgICAgICJFZzhLQjJacFpXeGtOekVZUnlBQktBVVNEd29IWm1sbGJHUXlOUmdaSUFFb0FoSVRDZ2htYVdWc1pERXciLCANCisgICAgICAgICAgICAiT1JodElBRW9CVG9CTUJJVUNnaG1hV1ZzWkRJeE1CalNBU0FCS0FVNkFUQVNGQW9JWm1sbGJHUXlNVEVZIiwgDQorICAgICAgICAgICAgIjB3RWdBU2dGT2dFd0VoUUtDR1pwWld4a01qRXlHTlFCSUFFb0JUb0JNQklVQ2dobWFXVnNaREl4TXhqViIsIA0KKyAgICAgICAgICAgICJBU0FCS0FVNkFUQVNGQW9JWm1sbGJHUXlNVFlZMkFFZ0FTZ0ZPZ0V3RWhRS0NHWnBaV3hrTWpFM0dOa0IiLCANCisgICAgICAgICAgICAiSUFFb0JUb0JNQklVQ2dobWFXVnNaREl4T0JqYUFTQUJLQVU2QVRBU0ZBb0labWxsYkdReU1qQVkzQUVnIiwgDQorICAgICAgICAgICAgIkFTZ0ZPZ0V3RWhRS0NHWnBaV3hrTWpJeEdOMEJJQUVvQlRvQk1CSVVDZ2htYVdWc1pESXlNaGplQVNBQiIsIA0KKyAgICAgICAgICAgICJLQUk2QVRBU0R3b0habWxsYkdRMk14Zy9JQUVvQlJJN0NnWm5jbTkxY0RFWUNpQURLQW95S3k1MWJtbDAiLCANCisgICAgICAgICAgICAiZEdWemRGOW5iMjluYkdWZmMzQmxaV1F1VTNCbFpXUk5aWE56WVdkbE1pNUhjbTkxY0RFU0VRb0labWxsIiwgDQorICAgICAgICAgICAgImJHUXhNamdZZ0FFZ0F5Z0pFaEVLQ0dacFpXeGtNVE14R0lNQklBRW9BeElRQ2dobWFXVnNaREV5TnhoLyIsIA0KKyAgICAgICAgICAgICJJQU1vQ1JJUkNnaG1hV1ZzWkRFeU9SaUJBU0FCS0FVU0VRb0labWxsYkdReE16QVlnZ0VnQXlnREVoZ0siLCANCisgICAgICAgICAgICAiQ0dacFpXeGtNakExR00wQklBRW9DRG9GWm1Gc2MyVVNHQW9JWm1sbGJHUXlNRFlZemdFZ0FTZ0lPZ1ZtIiwgDQorICAgICAgICAgICAgIllXeHpaUnJPQWdvR1IzSnZkWEF4RWc4S0IyWnBaV3hrTVRFWUN5QUNLQUlTRHdvSFptbGxiR1F5TmhnYSIsIA0KKyAgICAgICAgICAgICJJQUVvQWhJUENnZG1hV1ZzWkRFeUdBd2dBU2dKRWc4S0IyWnBaV3hrTVRNWURTQUJLQWtTRHdvSFptbGwiLCANCisgICAgICAgICAgICAiYkdReE5CZ09JQU1vQ1JJUENnZG1hV1ZzWkRFMUdBOGdBaWdFRWc0S0JtWnBaV3hrTlJnRklBRW9CUklQIiwgDQorICAgICAgICAgICAgIkNnZG1hV1ZzWkRJM0dCc2dBU2dKRWc4S0IyWnBaV3hrTWpnWUhDQUJLQVVTRHdvSFptbGxiR1F5T1JnZCIsIA0KKyAgICAgICAgICAgICJJQUVvQ1JJUENnZG1hV1ZzWkRFMkdCQWdBU2dKRWc4S0IyWnBaV3hrTWpJWUZpQURLQWtTRHdvSFptbGwiLCANCisgICAgICAgICAgICAiYkdRM014aEpJQU1vQlJJU0NnZG1hV1ZzWkRJd0dCUWdBU2dGT2dFd0VnOEtCMlpwWld4a01qUVlHQ0FCIiwgDQorICAgICAgICAgICAgIktBa1NRd29IWm1sbGJHUXpNUmdmSUFFb0N6SXlMblZ1YVhSMFpYTjBYMmR2YjJkc1pWOXpjR1ZsWkM1VCIsIA0KKyAgICAgICAgICAgICJjR1ZsWkUxbGMzTmhaMlV5UjNKdmRYQmxaRTFsYzNOaFoyVWkzd0VLRzFOd1pXVmtUV1Z6YzJGblpUSkgiLCANCisgICAgICAgICAgICAiY205MWNHVmtUV1Z6YzJGblpSSU9DZ1ptYVdWc1pERVlBU0FCS0FJU0Rnb0dabWxsYkdReUdBSWdBU2dDIiwgDQorICAgICAgICAgICAgIkVoRUtCbVpwWld4a014Z0RJQUVvQWpvQk1CSU9DZ1ptYVdWc1pEUVlCQ0FCS0FnU0Rnb0dabWxsYkdRMSIsIA0KKyAgICAgICAgICAgICJHQVVnQVNnSUVoUUtCbVpwWld4a05oZ0dJQUVvQ0RvRWRISjFaUklWQ2dabWFXVnNaRGNZQnlBQktBZzYiLCANCisgICAgICAgICAgICAiQldaaGJITmxFZzRLQm1acFpXeGtPQmdJSUFFb0FoSU9DZ1ptYVdWc1pEa1lDU0FCS0FnU0R3b0habWxsIiwgDQorICAgICAgICAgICAgImJHUXhNQmdLSUFFb0FoSVBDZ2RtYVdWc1pERXhHQXNnQVNnRFFsTkNDMGR2YjJkc1pWTndaV1ZrU0FIQyIsIA0KKyAgICAgICAgICAgICJQa0VLSVVkdmIyZHNaUzVRY205MGIyTnZiRUoxWm1abGNuTXVWR1Z6ZEZCeWIzUnZjeEljVlc1cGRGUmwiLCANCisgICAgICAgICAgImMzUkhiMjluYkdWVGNHVmxaRkJ5YjNSdlJtbHNaUT09IikpOw0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgYXNzaWduZXIgPSBkZWxlZ2F0ZShwYmQ6OkZpbGVEZXNjcmlwdG9yIHJvb3QpIHsNCisgICAgICAgIGRlc2NyaXB0b3IgPSByb290Ow0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc3BlZWRfU3BlZWRNZXNzYWdlMV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc3BlZWRfU3BlZWRNZXNzYWdlMV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zcGVlZF9TcGVlZE1lc3NhZ2UxX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRmllbGQxIiwgIkZpZWxkOSIsICJGaWVsZDE4IiwgIkZpZWxkODAiLCAiRmllbGQ4MSIsICJGaWVsZDIiLCAiRmllbGQzIiwgIkZpZWxkMjgwIiwgIkZpZWxkNiIsICJGaWVsZDIyIiwgIkZpZWxkNCIsICJGaWVsZDUiLCAiRmllbGQ1OSIsICJGaWVsZDciLCAiRmllbGQxNiIsICJGaWVsZDEzMCIsICJGaWVsZDEyIiwgIkZpZWxkMTciLCAiRmllbGQxMyIsICJGaWVsZDE0IiwgIkZpZWxkMTA0IiwgIkZpZWxkMTAwIiwgIkZpZWxkMTAxIiwgIkZpZWxkMTAyIiwgIkZpZWxkMTAzIiwgIkZpZWxkMjkiLCAiRmllbGQzMCIsICJGaWVsZDYwIiwgIkZpZWxkMjcxIiwgIkZpZWxkMjcyIiwgIkZpZWxkMTUwIiwgIkZpZWxkMjMiLCAiRmllbGQyNCIsICJGaWVsZDI1IiwgIkZpZWxkMTUiLCAiRmllbGQ3OCIsICJGaWVsZDY3IiwgIkZpZWxkNjgiLCAiRmllbGQxMjgiLCAiRmllbGQxMjkiLCAiRmllbGQxMzEiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NwZWVkX1NwZWVkTWVzc2FnZTFTdWJNZXNzYWdlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zcGVlZF9TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NwZWVkX1NwZWVkTWVzc2FnZTFTdWJNZXNzYWdlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRmllbGQxIiwgIkZpZWxkMiIsICJGaWVsZDMiLCAiRmllbGQxNSIsICJGaWVsZDEyIiwgIkZpZWxkMTMiLCAiRmllbGQxNCIsICJGaWVsZDE2IiwgIkZpZWxkMTkiLCAiRmllbGQyMCIsICJGaWVsZDI4IiwgIkZpZWxkMjEiLCAiRmllbGQyMiIsICJGaWVsZDIzIiwgIkZpZWxkMjA2IiwgIkZpZWxkMjAzIiwgIkZpZWxkMjA0IiwgIkZpZWxkMjA1IiwgIkZpZWxkMjA3IiwgIkZpZWxkMzAwIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zcGVlZF9TcGVlZE1lc3NhZ2UyX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMl07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zcGVlZF9TcGVlZE1lc3NhZ2UyX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NwZWVkX1NwZWVkTWVzc2FnZTJfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJGaWVsZDEiLCAiRmllbGQzIiwgIkZpZWxkNCIsICJGaWVsZDMwIiwgIkZpZWxkNzUiLCAiRmllbGQ2IiwgIkZpZWxkMiIsICJGaWVsZDIxIiwgIkZpZWxkNzEiLCAiRmllbGQyNSIsICJGaWVsZDEwOSIsICJGaWVsZDIxMCIsICJGaWVsZDIxMSIsICJGaWVsZDIxMiIsICJGaWVsZDIxMyIsICJGaWVsZDIxNiIsICJGaWVsZDIxNyIsICJGaWVsZDIxOCIsICJGaWVsZDIyMCIsICJGaWVsZDIyMSIsICJGaWVsZDIyMiIsICJGaWVsZDYzIiwgIkdyb3VwMSIsICJGaWVsZDEyOCIsICJGaWVsZDEzMSIsICJGaWVsZDEyNyIsICJGaWVsZDEyOSIsICJGaWVsZDEzMCIsICJGaWVsZDIwNSIsICJGaWVsZDIwNiIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc3BlZWRfU3BlZWRNZXNzYWdlMl9Hcm91cDFfX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zcGVlZF9TcGVlZE1lc3NhZ2UyX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc3BlZWRfU3BlZWRNZXNzYWdlMl9Hcm91cDFfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zcGVlZF9TcGVlZE1lc3NhZ2UyX0dyb3VwMV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkZpZWxkMTEiLCAiRmllbGQyNiIsICJGaWVsZDEyIiwgIkZpZWxkMTMiLCAiRmllbGQxNCIsICJGaWVsZDE1IiwgIkZpZWxkNSIsICJGaWVsZDI3IiwgIkZpZWxkMjgiLCAiRmllbGQyOSIsICJGaWVsZDE2IiwgIkZpZWxkMjIiLCAiRmllbGQ3MyIsICJGaWVsZDIwIiwgIkZpZWxkMjQiLCAiRmllbGQzMSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc3BlZWRfU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbM107DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zcGVlZF9TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NwZWVkX1NwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkZpZWxkMSIsICJGaWVsZDIiLCAiRmllbGQzIiwgIkZpZWxkNCIsICJGaWVsZDUiLCAiRmllbGQ2IiwgIkZpZWxkNyIsICJGaWVsZDgiLCAiRmllbGQ5IiwgIkZpZWxkMTAiLCAiRmllbGQxMSIsIH0pOw0KKyAgICAgICAgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICBSZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5Ow0KKyAgICAgIH07DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oZGVzY3JpcHRvckRhdGEsDQorICAgICAgICAgIG5ldyBwYmQ6OkZpbGVEZXNjcmlwdG9yW10gew0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLkRlc2NyaXB0b3IsIA0KKyAgICAgICAgICB9LCBhc3NpZ25lcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgIH0NCisgICNyZWdpb24gTWVzc2FnZXMNCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgU3BlZWRNZXNzYWdlMSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFNwZWVkTWVzc2FnZTEsIFNwZWVkTWVzc2FnZTEuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFNwZWVkTWVzc2FnZTEoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU3BlZWRNZXNzYWdlMSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgU3BlZWRNZXNzYWdlMSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfc3BlZWRNZXNzYWdlMUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiZmllbGQxIiwgImZpZWxkMTAwIiwgImZpZWxkMTAxIiwgImZpZWxkMTAyIiwgImZpZWxkMTAzIiwgImZpZWxkMTA0IiwgImZpZWxkMTIiLCAiZmllbGQxMjgiLCAiZmllbGQxMjkiLCAiZmllbGQxMyIsICJmaWVsZDEzMCIsICJmaWVsZDEzMSIsICJmaWVsZDE0IiwgImZpZWxkMTUiLCAiZmllbGQxNTAiLCAiZmllbGQxNiIsICJmaWVsZDE3IiwgImZpZWxkMTgiLCAiZmllbGQyIiwgImZpZWxkMjIiLCAiZmllbGQyMyIsICJmaWVsZDI0IiwgImZpZWxkMjUiLCAiZmllbGQyNzEiLCAiZmllbGQyNzIiLCAiZmllbGQyODAiLCAiZmllbGQyOSIsICJmaWVsZDMiLCAiZmllbGQzMCIsICJmaWVsZDQiLCAiZmllbGQ1IiwgImZpZWxkNTkiLCAiZmllbGQ2IiwgImZpZWxkNjAiLCAiZmllbGQ2NyIsICJmaWVsZDY4IiwgImZpZWxkNyIsICJmaWVsZDc4IiwgImZpZWxkODAiLCAiZmllbGQ4MSIsICJmaWVsZDkiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfc3BlZWRNZXNzYWdlMUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCwgODAwLCA4MDgsIDgxOCwgODI2LCA4MzIsIDk2LCAxMDI0LCAxMDM0LCAxMDQsIDEwNDAsIDEwNDgsIDExMiwgMTIyLCAxMjAwLCAxMjgsIDEzNiwgMTQ2LCAxNiwgMTc2LCAxODQsIDE5MiwgMjAwLCAyMTY4LCAyMTc2LCAyMjQwLCAyMzIsIDI0LCAyNDAsIDM0LCA0MSwgNDcyLCA0OCwgNDgwLCA1MzYsIDU0NCwgNTgsIDYyNCwgNjQwLCA2NDgsIDc0IH07DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTEgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU3BlZWRNZXNzYWdlMSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEdvb2dsZVNwZWVkUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NwZWVkX1NwZWVkTWVzc2FnZTFfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8U3BlZWRNZXNzYWdlMSwgU3BlZWRNZXNzYWdlMS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RHb29nbGVTcGVlZFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zcGVlZF9TcGVlZE1lc3NhZ2UxX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ5RmllbGROdW1iZXIgPSA5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ5Ow0KKyAgICBwcml2YXRlIHN0cmluZyBmaWVsZDlfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkOTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRmllbGQ5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMThGaWVsZE51bWJlciA9IDE4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxODsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxOF8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTggew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDE4XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkODBGaWVsZE51bWJlciA9IDgwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ4MDsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkODBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDgwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ4MDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkODAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDgwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkODFGaWVsZE51bWJlciA9IDgxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ4MTsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkODFfID0gdHJ1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ4MSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkODE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDgxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ4MV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDJGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkM0ZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMzsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQzOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDMgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyODBGaWVsZE51bWJlciA9IDI4MDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjgwOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDI4MF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjgwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyODA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjgwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyODBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ2RmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ2Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDZfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDYgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDY7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIyRmllbGROdW1iZXIgPSAyMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjI7DQorICAgIHByaXZhdGUgbG9uZyBmaWVsZDIyXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBGaWVsZDIyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDRGaWVsZE51bWJlciA9IDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDQ7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkNF8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ0OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ1RmllbGROdW1iZXIgPSA1Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiBmaWVsZDVfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IEZpZWxkNUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoZmllbGQ1Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkNUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ1Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgR2V0RmllbGQ1KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBmaWVsZDVfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDU5RmllbGROdW1iZXIgPSA1OTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNTk7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDU5XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ1OSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNTk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDU5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ1OV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDdGaWVsZE51bWJlciA9IDc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDc7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkN18gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ3IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ3OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDcgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxNkZpZWxkTnVtYmVyID0gMTY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE2Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDE2XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTY7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTYgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDE2XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTMwRmllbGROdW1iZXIgPSAxMzA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEzMDsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxMzBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTMwOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDEzMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTMwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTJGaWVsZE51bWJlciA9IDEyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMjsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMTJfID0gdHJ1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDEyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE3RmllbGROdW1iZXIgPSAxNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTc7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDE3XyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE3OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQxNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxM0ZpZWxkTnVtYmVyID0gMTM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEzOw0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQxM18gPSB0cnVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMTMgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTRGaWVsZE51bWJlciA9IDE0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxNDsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMTRfID0gdHJ1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDE0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEwNEZpZWxkTnVtYmVyID0gMTA0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMDQ7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTA0XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEwNDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMDQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEwNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEwMEZpZWxkTnVtYmVyID0gMTAwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMDA7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTAwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEwMDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMDAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEwMF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEwMUZpZWxkTnVtYmVyID0gMTAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMDE7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTAxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEwMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMDEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEwMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEwMkZpZWxkTnVtYmVyID0gMTAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMDI7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMTAyXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTAyOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDEwMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTAyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTAzRmllbGROdW1iZXIgPSAxMDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEwMzsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxMDNfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTAzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMDM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTAzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMDNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyOUZpZWxkTnVtYmVyID0gMjk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI5Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDI5XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjkgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDI5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMzBGaWVsZE51bWJlciA9IDMwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQzMDsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMzBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQzMDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMzAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDMwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNjBGaWVsZE51bWJlciA9IDYwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ2MDsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQ2MF8gPSAtMTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2MCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNjA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkNjAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDYwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjcxRmllbGROdW1iZXIgPSAyNzE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI3MTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyNzFfID0gLTE7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjcxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyNzE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjcxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyNzFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyNzJGaWVsZE51bWJlciA9IDI3MjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjcyOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDI3Ml8gPSAtMTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI3MjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyNzIgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDI3Ml87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE1MEZpZWxkTnVtYmVyID0gMTUwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxNTA7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTUwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNTAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE1MDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxNTAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDE1MF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIzRmllbGROdW1iZXIgPSAyMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjM7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyNEZpZWxkTnVtYmVyID0gMjQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI0Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQyNF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI0OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQyNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyNUZpZWxkTnVtYmVyID0gMjU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDI1Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDI1XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjUgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDI1XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTVGaWVsZE51bWJlciA9IDE1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxNTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSBmaWVsZDE1XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgRmllbGQxNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTVfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNzhGaWVsZE51bWJlciA9IDc4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ3ODsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkNzhfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDc4IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ3ODsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkNzggew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDc4XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNjdGaWVsZE51bWJlciA9IDY3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ2NzsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQ2N187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNjcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDY3OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDY3IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ2N187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDY4RmllbGROdW1iZXIgPSA2ODsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNjg7DQorICAgIHByaXZhdGUgaW50IGZpZWxkNjhfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDY4IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ2ODsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQ2OCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNjhfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMjhGaWVsZE51bWJlciA9IDEyODsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTI4Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDEyOF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTI4IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMjg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTI4IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMjhfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMjlGaWVsZE51bWJlciA9IDEyOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTI5Ow0KKyAgICBwcml2YXRlIHN0cmluZyBmaWVsZDEyOV8gPSAieHh4eHh4eHh4eHh4eHh4eHh4eHh4IjsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMjkgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEyOTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxMjkgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEyOV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEzMUZpZWxkTnVtYmVyID0gMTMxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxMzE7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMTMxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMzEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEzMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMzEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEzMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmICghaGFzRmllbGQxKSByZXR1cm4gZmFsc2U7DQorICAgICAgICBpZiAoIWhhc0ZpZWxkMikgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgaWYgKCFoYXNGaWVsZDMpIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3NwZWVkTWVzc2FnZTFGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNGaWVsZDEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxLCBmaWVsZF9uYW1lc1swXSwgRmllbGQxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMiwgZmllbGRfbmFtZXNbMThdLCBGaWVsZDIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigzLCBmaWVsZF9uYW1lc1syN10sIEZpZWxkMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyg0LCBmaWVsZF9uYW1lc1syOV0sIEZpZWxkNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChmaWVsZDVfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQ2NEFycmF5KDUsIGZpZWxkX25hbWVzWzMwXSwgZmllbGQ1Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDYpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDYsIGZpZWxkX25hbWVzWzMyXSwgRmllbGQ2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDcsIGZpZWxkX25hbWVzWzM2XSwgRmllbGQ3KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkOSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDksIGZpZWxkX25hbWVzWzQwXSwgRmllbGQ5KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMTIsIGZpZWxkX25hbWVzWzZdLCBGaWVsZDEyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMTMsIGZpZWxkX25hbWVzWzldLCBGaWVsZDEzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMTQsIGZpZWxkX25hbWVzWzEyXSwgRmllbGQxNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDE1KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDE1LCBmaWVsZF9uYW1lc1sxM10sIEZpZWxkMTUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxNikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTYsIGZpZWxkX25hbWVzWzE1XSwgRmllbGQxNik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDE3KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDE3LCBmaWVsZF9uYW1lc1sxNl0sIEZpZWxkMTcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxOCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDE4LCBmaWVsZF9uYW1lc1sxN10sIEZpZWxkMTgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50NjQoMjIsIGZpZWxkX25hbWVzWzE5XSwgRmllbGQyMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMywgZmllbGRfbmFtZXNbMjBdLCBGaWVsZDIzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMjQsIGZpZWxkX25hbWVzWzIxXSwgRmllbGQyNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDI1KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyNSwgZmllbGRfbmFtZXNbMjJdLCBGaWVsZDI1KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjkpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDI5LCBmaWVsZF9uYW1lc1syNl0sIEZpZWxkMjkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQzMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCgzMCwgZmllbGRfbmFtZXNbMjhdLCBGaWVsZDMwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNTkpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woNTksIGZpZWxkX25hbWVzWzMxXSwgRmllbGQ1OSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDYwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig2MCwgZmllbGRfbmFtZXNbMzNdLCBGaWVsZDYwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNjcpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDY3LCBmaWVsZF9uYW1lc1szNF0sIEZpZWxkNjcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ2OCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNjgsIGZpZWxkX25hbWVzWzM1XSwgRmllbGQ2OCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDc4KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDc4LCBmaWVsZF9uYW1lc1szN10sIEZpZWxkNzgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ4MCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCg4MCwgZmllbGRfbmFtZXNbMzhdLCBGaWVsZDgwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkODEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woODEsIGZpZWxkX25hbWVzWzM5XSwgRmllbGQ4MSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEwMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTAwLCBmaWVsZF9uYW1lc1sxXSwgRmllbGQxMDApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMDEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEwMSwgZmllbGRfbmFtZXNbMl0sIEZpZWxkMTAxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTAyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMTAyLCBmaWVsZF9uYW1lc1szXSwgRmllbGQxMDIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMDMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxMDMsIGZpZWxkX25hbWVzWzRdLCBGaWVsZDEwMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEwNCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTA0LCBmaWVsZF9uYW1lc1s1XSwgRmllbGQxMDQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMjgpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEyOCwgZmllbGRfbmFtZXNbN10sIEZpZWxkMTI4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTI5KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMTI5LCBmaWVsZF9uYW1lc1s4XSwgRmllbGQxMjkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMzApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEzMCwgZmllbGRfbmFtZXNbMTBdLCBGaWVsZDEzMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEzMSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTMxLCBmaWVsZF9uYW1lc1sxMV0sIEZpZWxkMTMxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTUwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxNTAsIGZpZWxkX25hbWVzWzE0XSwgRmllbGQxNTApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyNzEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDI3MSwgZmllbGRfbmFtZXNbMjNdLCBGaWVsZDI3MSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDI3Mikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjcyLCBmaWVsZF9uYW1lc1syNF0sIEZpZWxkMjcyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjgwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyODAsIGZpZWxkX25hbWVzWzI1XSwgRmllbGQyODApOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0ZpZWxkMSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMSwgRmllbGQxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkOSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoOSwgRmllbGQ5KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTgpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDE4LCBGaWVsZDE4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkODApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSg4MCwgRmllbGQ4MCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDgxKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoODEsIEZpZWxkODEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIsIEZpZWxkMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMywgRmllbGQzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjgwKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDI4MCwgRmllbGQyODApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ2KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDYsIEZpZWxkNik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKDIyLCBGaWVsZDIyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoNCwgRmllbGQ0KTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIGZpZWxkNV8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAxICogZmllbGQ1Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNTkpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSg1OSwgRmllbGQ1OSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDcsIEZpZWxkNyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDE2KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDE2LCBGaWVsZDE2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTMwKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEzMCwgRmllbGQxMzApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDEyLCBGaWVsZDEyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSgxNywgRmllbGQxNyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMTMsIEZpZWxkMTMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxNCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDE0LCBGaWVsZDE0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTA0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEwNCwgRmllbGQxMDQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMDApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTAwLCBGaWVsZDEwMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEwMSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxMDEsIEZpZWxkMTAxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTAyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxMDIsIEZpZWxkMTAyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTAzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxMDMsIEZpZWxkMTAzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjkpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjksIEZpZWxkMjkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQzMCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDMwLCBGaWVsZDMwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNjApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNjAsIEZpZWxkNjApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyNzEpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjcxLCBGaWVsZDI3MSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDI3Mikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyNzIsIEZpZWxkMjcyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTUwKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDE1MCwgRmllbGQxNTApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyMywgRmllbGQyMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDI0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMjQsIEZpZWxkMjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyNSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyNSwgRmllbGQyNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDE1KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMTUsIEZpZWxkMTUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ3OCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDc4LCBGaWVsZDc4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNjcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNjcsIEZpZWxkNjcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ2OCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg2OCwgRmllbGQ2OCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEyOCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxMjgsIEZpZWxkMTI4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTI5KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxMjksIEZpZWxkMTI5KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTMxKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEzMSwgRmllbGQxMzEpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UxIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTEgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UxIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTEgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UxIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTEgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgU3BlZWRNZXNzYWdlMSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgZmllbGQ1Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFNwZWVkTWVzc2FnZTEgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8U3BlZWRNZXNzYWdlMSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoU3BlZWRNZXNzYWdlMSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFNwZWVkTWVzc2FnZTEgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgU3BlZWRNZXNzYWdlMSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFNwZWVkTWVzc2FnZTEgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBTcGVlZE1lc3NhZ2UxKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBTcGVlZE1lc3NhZ2UxIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTcGVlZE1lc3NhZ2UxIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTEuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTcGVlZE1lc3NhZ2UxIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBTcGVlZE1lc3NhZ2UxKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFNwZWVkTWVzc2FnZTEpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShTcGVlZE1lc3NhZ2UxIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEpIHsNCisgICAgICAgICAgRmllbGQxID0gb3RoZXIuRmllbGQxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkOSkgew0KKyAgICAgICAgICBGaWVsZDkgPSBvdGhlci5GaWVsZDk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxOCkgew0KKyAgICAgICAgICBGaWVsZDE4ID0gb3RoZXIuRmllbGQxODsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDgwKSB7DQorICAgICAgICAgIEZpZWxkODAgPSBvdGhlci5GaWVsZDgwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkODEpIHsNCisgICAgICAgICAgRmllbGQ4MSA9IG90aGVyLkZpZWxkODE7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyKSB7DQorICAgICAgICAgIEZpZWxkMiA9IG90aGVyLkZpZWxkMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDMpIHsNCisgICAgICAgICAgRmllbGQzID0gb3RoZXIuRmllbGQzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjgwKSB7DQorICAgICAgICAgIEZpZWxkMjgwID0gb3RoZXIuRmllbGQyODA7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ2KSB7DQorICAgICAgICAgIEZpZWxkNiA9IG90aGVyLkZpZWxkNjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIyKSB7DQorICAgICAgICAgIEZpZWxkMjIgPSBvdGhlci5GaWVsZDIyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkNCkgew0KKyAgICAgICAgICBGaWVsZDQgPSBvdGhlci5GaWVsZDQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuZmllbGQ1Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5maWVsZDVfLkFkZChvdGhlci5maWVsZDVfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDU5KSB7DQorICAgICAgICAgIEZpZWxkNTkgPSBvdGhlci5GaWVsZDU5Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkNykgew0KKyAgICAgICAgICBGaWVsZDcgPSBvdGhlci5GaWVsZDc7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxNikgew0KKyAgICAgICAgICBGaWVsZDE2ID0gb3RoZXIuRmllbGQxNjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEzMCkgew0KKyAgICAgICAgICBGaWVsZDEzMCA9IG90aGVyLkZpZWxkMTMwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTIpIHsNCisgICAgICAgICAgRmllbGQxMiA9IG90aGVyLkZpZWxkMTI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxNykgew0KKyAgICAgICAgICBGaWVsZDE3ID0gb3RoZXIuRmllbGQxNzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEzKSB7DQorICAgICAgICAgIEZpZWxkMTMgPSBvdGhlci5GaWVsZDEzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTQpIHsNCisgICAgICAgICAgRmllbGQxNCA9IG90aGVyLkZpZWxkMTQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxMDQpIHsNCisgICAgICAgICAgRmllbGQxMDQgPSBvdGhlci5GaWVsZDEwNDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEwMCkgew0KKyAgICAgICAgICBGaWVsZDEwMCA9IG90aGVyLkZpZWxkMTAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTAxKSB7DQorICAgICAgICAgIEZpZWxkMTAxID0gb3RoZXIuRmllbGQxMDE7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxMDIpIHsNCisgICAgICAgICAgRmllbGQxMDIgPSBvdGhlci5GaWVsZDEwMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEwMykgew0KKyAgICAgICAgICBGaWVsZDEwMyA9IG90aGVyLkZpZWxkMTAzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjkpIHsNCisgICAgICAgICAgRmllbGQyOSA9IG90aGVyLkZpZWxkMjk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQzMCkgew0KKyAgICAgICAgICBGaWVsZDMwID0gb3RoZXIuRmllbGQzMDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDYwKSB7DQorICAgICAgICAgIEZpZWxkNjAgPSBvdGhlci5GaWVsZDYwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjcxKSB7DQorICAgICAgICAgIEZpZWxkMjcxID0gb3RoZXIuRmllbGQyNzE7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyNzIpIHsNCisgICAgICAgICAgRmllbGQyNzIgPSBvdGhlci5GaWVsZDI3MjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDE1MCkgew0KKyAgICAgICAgICBGaWVsZDE1MCA9IG90aGVyLkZpZWxkMTUwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjMpIHsNCisgICAgICAgICAgRmllbGQyMyA9IG90aGVyLkZpZWxkMjM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyNCkgew0KKyAgICAgICAgICBGaWVsZDI0ID0gb3RoZXIuRmllbGQyNDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDI1KSB7DQorICAgICAgICAgIEZpZWxkMjUgPSBvdGhlci5GaWVsZDI1Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTUpIHsNCisgICAgICAgICAgTWVyZ2VGaWVsZDE1KG90aGVyLkZpZWxkMTUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkNzgpIHsNCisgICAgICAgICAgRmllbGQ3OCA9IG90aGVyLkZpZWxkNzg7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ2Nykgew0KKyAgICAgICAgICBGaWVsZDY3ID0gb3RoZXIuRmllbGQ2NzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDY4KSB7DQorICAgICAgICAgIEZpZWxkNjggPSBvdGhlci5GaWVsZDY4Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTI4KSB7DQorICAgICAgICAgIEZpZWxkMTI4ID0gb3RoZXIuRmllbGQxMjg7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxMjkpIHsNCisgICAgICAgICAgRmllbGQxMjkgPSBvdGhlci5GaWVsZDEyOTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEzMSkgew0KKyAgICAgICAgICBGaWVsZDEzMSA9IG90aGVyLkZpZWxkMTMxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfc3BlZWRNZXNzYWdlMUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9zcGVlZE1lc3NhZ2UxRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmZpZWxkMV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNCA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWVsZDRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQyOg0KKyAgICAgICAgICAgIGNhc2UgNDE6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuZmllbGQ1Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkNl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDcgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZmllbGQ3Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkOSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWVsZDlfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDk2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMiA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQxMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMyA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQxM18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTEyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxNCA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQxNF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTIyOiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc0ZpZWxkMTUpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oRmllbGQxNSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBGaWVsZDE1ID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEyODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTYgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDE2Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMzY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE3ID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDE3Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNDY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE4ID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmZpZWxkMThfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE3Njogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIgPSBpbnB1dC5SZWFkSW50NjQocmVmIHJlc3VsdC5maWVsZDIyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIzID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQyM18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTkyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyNCA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQyNF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjAwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyNSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMjVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDIzMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjkgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDI5Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMwID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDMwXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0NzI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDU5ID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDU5Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0ODA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDYwID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQ2MF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTM2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ2NyA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkNjdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU0NDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNjggPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDY4Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2MjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDc4ID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDc4Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2NDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDgwID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDgwXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2NDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDgxID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDgxXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4MDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwMCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMTAwXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4MDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwMSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMTAxXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4MTg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwMiA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWVsZDEwMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODI2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMDMgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZmllbGQxMDNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgzMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTA0ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQxMDRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwMjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyOCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMTI4Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDM0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMjkgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZmllbGQxMjlfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwNDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzMCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMTMwXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDQ4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMzEgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDEzMV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTIwMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTUwID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQxNTBfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDIxNjg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI3MSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMjcxXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMTc2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyNzIgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDI3Ml8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjI0MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjgwID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQyODBfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDk7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkOSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ5KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDlfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkOSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkOV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxODsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE4OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE4KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxOCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxOF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE4XyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkODAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDgwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkODAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDgwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDgwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDgwKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ4MCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ4MF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkODAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkODAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDgwXyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkODEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDgxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkODEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDgxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDgxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDgxKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ4MSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ4MV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkODEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkODEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDgxXyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDMoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDNfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI4MCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjgwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyODAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI4MDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyODAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjgwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI4MCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyODBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI4MCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyODAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI4MF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDYoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ2KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDYgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDZfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDIyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMihsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMl8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDQ7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ0KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNF8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVsb25nPiBGaWVsZDVMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmZpZWxkNV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDVDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBHZXRGaWVsZDUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldEZpZWxkNShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNShpbnQgaW5kZXgsIHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmllbGQ1KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUZpZWxkNShzY2c6OklFbnVtZXJhYmxlPHVsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQ1Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQ1Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNTkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDU5OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkNTkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDU5OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDU5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDU5KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ1OSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ1OV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNTkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNTkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDU5XyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkNyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ3KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDcoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkN18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ3ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ3XyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE2OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTY7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTYodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTYoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTYgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTZfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE2KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE2ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxNl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMzA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDEzMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTMwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEzMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMzAoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTMwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTMwXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQxMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTIoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTJfID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxNzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDE3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxNzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxNyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxNyhib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE3KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE3ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxN18gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMTMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEzKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzXyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQxNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTQ7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTQoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxNCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTRfID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTA0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxMDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEwNDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMDQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTA0KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwNCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMDRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEwNCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwNF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTAwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMDA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDEwMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTAwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEwMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMDAoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTAwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTAwXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEwMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTAxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMDE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTAxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEwMShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTAxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMDEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMDFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTAyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxMDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEwMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMDIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTAyKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTAyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMDIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMDJfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEwMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTAzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMDM7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTAzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEwMyhzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTAzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTAzXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI5OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjk7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjkodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjkoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjlfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI5KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI5ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyOV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMzAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDMwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMzAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDMwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDMwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDMwKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzMCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQzMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMzAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDMwXyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNjAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDYwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQ2MCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNjA7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNjAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNjAoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNjAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNjBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDYwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDYwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ2MF8gPSAtMTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI3MSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjcxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyNzEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI3MTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyNzEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjcxKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI3MSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyNzFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI3MSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyNzEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI3MV8gPSAtMTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI3MiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjcyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyNzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI3MjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyNzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjcyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI3MiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyNzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI3MigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyNzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI3Ml8gPSAtMTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE1MCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTUwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxNTAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE1MDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxNTAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTUwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1MCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxNTBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE1MCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNTAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE1MF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjM7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjMoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyM18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI0OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDI0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI0KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyNCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyNF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI0XyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjUoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI1ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyNV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTUgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIEZpZWxkMTUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE1OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE1KGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxNV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUZpZWxkMTUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNGaWVsZDE1ICYmDQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTVfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDE1XyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmZpZWxkMTVfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0LmZpZWxkMTVfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxNV8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNzggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDc4OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkNzggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDc4OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDc4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDc4KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ3OCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ3OF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNzgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNzggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDc4XyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNjcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDY3OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQ2NyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNjc7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNjcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNjcoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNjcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNjdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDY3KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDY3ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ2N18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNjggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDY4OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQ2OCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNjg7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNjgodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNjgoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNjggPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNjhfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDY4KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDY4ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ2OF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTI4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMjg7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDEyOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI4OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEyOCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMjgoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTI4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyOF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTI4KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyOCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI4XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMjkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEyOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTI5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMjk7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTI5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEyOShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTI5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyOV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTI5KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyOSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI5XyA9ICJ4eHh4eHh4eHh4eHh4eHh4eHh4eHgiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMzE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDEzMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTMxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEzMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMzEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTMxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTMxXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFNwZWVkTWVzc2FnZTEoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEdvb2dsZVNwZWVkUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSwgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfc3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImZpZWxkMSIsICJmaWVsZDEyIiwgImZpZWxkMTMiLCAiZmllbGQxNCIsICJmaWVsZDE1IiwgImZpZWxkMTYiLCAiZmllbGQxOSIsICJmaWVsZDIiLCAiZmllbGQyMCIsICJmaWVsZDIwMyIsICJmaWVsZDIwNCIsICJmaWVsZDIwNSIsICJmaWVsZDIwNiIsICJmaWVsZDIwNyIsICJmaWVsZDIxIiwgImZpZWxkMjIiLCAiZmllbGQyMyIsICJmaWVsZDI4IiwgImZpZWxkMyIsICJmaWVsZDMwMCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9zcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4LCA5NiwgMTA0LCAxMTIsIDEyMiwgMTI4LCAxNTIsIDE2LCAxNjAsIDE2MjksIDE2MzIsIDE2NDIsIDE2NDgsIDE2NTYsIDE2OSwgMTc2LCAxODQsIDIyNCwgMjQsIDI0MDAgfTsNCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU3BlZWRQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc3BlZWRfU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2VfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8U3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UsIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEdvb2dsZVNwZWVkUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NwZWVkX1NwZWVkTWVzc2FnZTFTdWJNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMkZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQzRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQzOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkM187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDE1RmllbGROdW1iZXIgPSAxNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTU7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMTVfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE1OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDE1IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxNV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEyRmllbGROdW1iZXIgPSAxMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTI7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDEyXyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEyOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQxMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxM0ZpZWxkTnVtYmVyID0gMTM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEzOw0KKyAgICBwcml2YXRlIGxvbmcgZmllbGQxM187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEzOyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRmllbGQxMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxNEZpZWxkTnVtYmVyID0gMTQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE0Ow0KKyAgICBwcml2YXRlIGxvbmcgZmllbGQxNF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE0OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRmllbGQxNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxNkZpZWxkTnVtYmVyID0gMTY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDE2Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDE2XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTY7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTYgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDE2XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTlGaWVsZE51bWJlciA9IDE5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxOTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxOV8gPSAyOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxOTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMEZpZWxkTnVtYmVyID0gMjA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIwOw0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQyMF8gPSB0cnVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMjAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjhGaWVsZE51bWJlciA9IDI4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyODsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMjhfID0gdHJ1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDI4IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyOF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIxRmllbGROdW1iZXIgPSAyMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjE7DQorICAgIHByaXZhdGUgdWxvbmcgZmllbGQyMV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIxOyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBGaWVsZDIxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIyRmllbGROdW1iZXIgPSAyMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjI7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyM0ZpZWxkTnVtYmVyID0gMjM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIzOw0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQyM187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIzOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQyMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMDZGaWVsZE51bWJlciA9IDIwNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjA2Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQyMDZfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjA2OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQyMDYgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIwNl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIwM0ZpZWxkTnVtYmVyID0gMjAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMDM7DQorICAgIHByaXZhdGUgdWludCBmaWVsZDIwM187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjAzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMDM7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgRmllbGQyMDMgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIwM187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIwNEZpZWxkTnVtYmVyID0gMjA0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMDQ7DQorICAgIHByaXZhdGUgaW50IGZpZWxkMjA0XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIwNDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQyMDQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIwNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIwNUZpZWxkTnVtYmVyID0gMjA1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMDU7DQorICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMjA1XyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjA1OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBGaWVsZDIwNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjA1XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjA3RmllbGROdW1iZXIgPSAyMDc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIwNzsNCisgICAgcHJpdmF0ZSB1bG9uZyBmaWVsZDIwN187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA3IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMDc7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIEZpZWxkMjA3IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMDdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQzMDBGaWVsZE51bWJlciA9IDMwMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMzAwOw0KKyAgICBwcml2YXRlIHVsb25nIGZpZWxkMzAwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQzMDAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDMwMDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgRmllbGQzMDAgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDMwMF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3NwZWVkTWVzc2FnZTFTdWJNZXNzYWdlRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzRmllbGQxKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgRmllbGQxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMiwgZmllbGRfbmFtZXNbN10sIEZpZWxkMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDMsIGZpZWxkX25hbWVzWzE4XSwgRmllbGQzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMTIsIGZpZWxkX25hbWVzWzFdLCBGaWVsZDEyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KDEzLCBmaWVsZF9uYW1lc1syXSwgRmllbGQxMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDE0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NCgxNCwgZmllbGRfbmFtZXNbM10sIEZpZWxkMTQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxNSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDE1LCBmaWVsZF9uYW1lc1s0XSwgRmllbGQxNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDE2KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxNiwgZmllbGRfbmFtZXNbNV0sIEZpZWxkMTYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxOSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTksIGZpZWxkX25hbWVzWzZdLCBGaWVsZDE5KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMjAsIGZpZWxkX25hbWVzWzhdLCBGaWVsZDIwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkNjQoMjEsIGZpZWxkX25hbWVzWzE0XSwgRmllbGQyMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMiwgZmllbGRfbmFtZXNbMTVdLCBGaWVsZDIyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMjMsIGZpZWxkX25hbWVzWzE2XSwgRmllbGQyMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDI4KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDI4LCBmaWVsZF9uYW1lc1sxN10sIEZpZWxkMjgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMDMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkMzIoMjAzLCBmaWVsZF9uYW1lc1s5XSwgRmllbGQyMDMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMDQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIwNCwgZmllbGRfbmFtZXNbMTBdLCBGaWVsZDIwNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIwNSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDIwNSwgZmllbGRfbmFtZXNbMTFdLCBGaWVsZDIwNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIwNikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCgyMDYsIGZpZWxkX25hbWVzWzEyXSwgRmllbGQyMDYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMDcpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQ2NCgyMDcsIGZpZWxkX25hbWVzWzEzXSwgRmllbGQyMDcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQzMDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQ2NCgzMDAsIGZpZWxkX25hbWVzWzE5XSwgRmllbGQzMDApOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0ZpZWxkMSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBGaWVsZDEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIsIEZpZWxkMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMywgRmllbGQzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDE1LCBGaWVsZDE1KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSgxMiwgRmllbGQxMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKDEzLCBGaWVsZDEzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUoMTQsIEZpZWxkMTQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxNikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxNiwgRmllbGQxNik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDE5KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDE5LCBGaWVsZDE5KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSgyMCwgRmllbGQyMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDI4KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMjgsIEZpZWxkMjgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZpeGVkNjRTaXplKDIxLCBGaWVsZDIxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjIsIEZpZWxkMjIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDIzLCBGaWVsZDIzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjA2KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMjA2LCBGaWVsZDIwNik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIwMykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZpeGVkMzJTaXplKDIwMywgRmllbGQyMDMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMDQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjA0LCBGaWVsZDIwNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIwNSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMjA1LCBGaWVsZDIwNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIwNykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQ2NFNpemUoMjA3LCBGaWVsZDIwNyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDMwMCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQ2NFNpemUoMzAwLCBGaWVsZDMwMCk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8U3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2UgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFNwZWVkTWVzc2FnZTFTdWJNZXNzYWdlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oU3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEpIHsNCisgICAgICAgICAgRmllbGQxID0gb3RoZXIuRmllbGQxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMikgew0KKyAgICAgICAgICBGaWVsZDIgPSBvdGhlci5GaWVsZDI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQzKSB7DQorICAgICAgICAgIEZpZWxkMyA9IG90aGVyLkZpZWxkMzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDE1KSB7DQorICAgICAgICAgIEZpZWxkMTUgPSBvdGhlci5GaWVsZDE1Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTIpIHsNCisgICAgICAgICAgRmllbGQxMiA9IG90aGVyLkZpZWxkMTI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxMykgew0KKyAgICAgICAgICBGaWVsZDEzID0gb3RoZXIuRmllbGQxMzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDE0KSB7DQorICAgICAgICAgIEZpZWxkMTQgPSBvdGhlci5GaWVsZDE0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTYpIHsNCisgICAgICAgICAgRmllbGQxNiA9IG90aGVyLkZpZWxkMTY7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxOSkgew0KKyAgICAgICAgICBGaWVsZDE5ID0gb3RoZXIuRmllbGQxOTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIwKSB7DQorICAgICAgICAgIEZpZWxkMjAgPSBvdGhlci5GaWVsZDIwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjgpIHsNCisgICAgICAgICAgRmllbGQyOCA9IG90aGVyLkZpZWxkMjg7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMSkgew0KKyAgICAgICAgICBGaWVsZDIxID0gb3RoZXIuRmllbGQyMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIyKSB7DQorICAgICAgICAgIEZpZWxkMjIgPSBvdGhlci5GaWVsZDIyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjMpIHsNCisgICAgICAgICAgRmllbGQyMyA9IG90aGVyLkZpZWxkMjM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMDYpIHsNCisgICAgICAgICAgRmllbGQyMDYgPSBvdGhlci5GaWVsZDIwNjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIwMykgew0KKyAgICAgICAgICBGaWVsZDIwMyA9IG90aGVyLkZpZWxkMjAzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjA0KSB7DQorICAgICAgICAgIEZpZWxkMjA0ID0gb3RoZXIuRmllbGQyMDQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMDUpIHsNCisgICAgICAgICAgRmllbGQyMDUgPSBvdGhlci5GaWVsZDIwNTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIwNykgew0KKyAgICAgICAgICBGaWVsZDIwNyA9IG90aGVyLkZpZWxkMjA3Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMzAwKSB7DQorICAgICAgICAgIEZpZWxkMzAwID0gb3RoZXIuRmllbGQzMDA7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9zcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9zcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQxXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDk2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMiA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQxMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMyA9IGlucHV0LlJlYWRJbnQ2NChyZWYgcmVzdWx0LmZpZWxkMTNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDExMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTQgPSBpbnB1dC5SZWFkSW50NjQocmVmIHJlc3VsdC5maWVsZDE0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMjI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1ID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmZpZWxkMTVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEyODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTYgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDE2Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNTI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE5ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQxOV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTYwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMCA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQyMF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY5OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMSA9IGlucHV0LlJlYWRGaXhlZDY0KHJlZiByZXN1bHQuZmllbGQyMV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTc2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMjJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE4NDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjMgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmZpZWxkMjNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDIyNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjggPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmZpZWxkMjhfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2Mjk6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwMyA9IGlucHV0LlJlYWRGaXhlZDMyKHJlZiByZXN1bHQuZmllbGQyMDNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2MzI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMjA0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjQyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMDUgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZmllbGQyMDVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2NDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNiA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQyMDZfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2NTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNyA9IGlucHV0LlJlYWRVSW50NjQocmVmIHJlc3VsdC5maWVsZDIwN18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQwMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzAwID0gaW5wdXQuUmVhZFVJbnQ2NChyZWYgcmVzdWx0LmZpZWxkMzAwXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDM7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQzKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQzXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBGaWVsZDE1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxNTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxNSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxNShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxNV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDEyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMihib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMl8gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEZpZWxkMTMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEzOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEzKGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzXyA9IDBMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEZpZWxkMTQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE0OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDE0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxNCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxNF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDE0XyA9IDBMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE2OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTY7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTYodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTYoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTYgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTZfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE2KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE2ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxNl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE5OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQxOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTk7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTkodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTkoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTlfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDE5KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE5ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxOV8gPSAyOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMjAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIwKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwXyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjg7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQyOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjg7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjgodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjgoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI4XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyOCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyOCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjhfID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgRmllbGQyMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjEodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQyMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjM7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjMoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjNfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIwNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDIwNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjA2OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIwNih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMDYoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMDZfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIwNigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDYgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwNl8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjAzOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1aW50IEZpZWxkMjAzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMDM7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjAzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIwMyh1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjAzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjAzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjAzXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIwNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjA0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMDQ7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjA0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIwNChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMDQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMDRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjA1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQyMDUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIwNTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMDUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjA1KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMDUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA1ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMDVfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIwNzsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgRmllbGQyMDcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIwNzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMDcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjA3KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA3ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwN18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjA3KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA3XyA9IDBVTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDMwMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMzAwOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBGaWVsZDMwMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMzAwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDMwMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQzMDAodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzMDAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMzAwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQzMDAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzAwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQzMDBfID0gMFVMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBTcGVlZE1lc3NhZ2UxU3ViTWVzc2FnZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU3BlZWRQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBTcGVlZE1lc3NhZ2UyIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8U3BlZWRNZXNzYWdlMiwgU3BlZWRNZXNzYWdlMi5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgU3BlZWRNZXNzYWdlMigpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTcGVlZE1lc3NhZ2UyIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTcGVlZE1lc3NhZ2UyKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9zcGVlZE1lc3NhZ2UyRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJmaWVsZDEiLCAiZmllbGQxMDkiLCAiZmllbGQxMjciLCAiZmllbGQxMjgiLCAiZmllbGQxMjkiLCAiZmllbGQxMzAiLCAiZmllbGQxMzEiLCAiZmllbGQyIiwgImZpZWxkMjA1IiwgImZpZWxkMjA2IiwgImZpZWxkMjEiLCAiZmllbGQyMTAiLCAiZmllbGQyMTEiLCAiZmllbGQyMTIiLCAiZmllbGQyMTMiLCAiZmllbGQyMTYiLCAiZmllbGQyMTciLCAiZmllbGQyMTgiLCAiZmllbGQyMjAiLCAiZmllbGQyMjEiLCAiZmllbGQyMjIiLCAiZmllbGQyNSIsICJmaWVsZDMiLCAiZmllbGQzMCIsICJmaWVsZDQiLCAiZmllbGQ2IiwgImZpZWxkNjMiLCAiZmllbGQ3MSIsICJmaWVsZDc1IiwgImdyb3VwMSIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9zcGVlZE1lc3NhZ2UyRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwLCA4NzIsIDEwMTgsIDEwMjYsIDEwMzIsIDEwNDAsIDEwNDgsIDE4LCAxNjQwLCAxNjQ4LCAxNjgsIDE2ODAsIDE2ODgsIDE2OTYsIDE3MDQsIDE3MjgsIDE3MzYsIDE3NDQsIDE3NjAsIDE3NjgsIDE3ODEsIDIwNSwgMjQsIDI0MCwgMzIsIDUwLCA1MDQsIDU2OCwgNjAwLCA4MyB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTIgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBTcGVlZE1lc3NhZ2UyIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTIgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RHb29nbGVTcGVlZFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zcGVlZF9TcGVlZE1lc3NhZ2UyX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFNwZWVkTWVzc2FnZTIsIFNwZWVkTWVzc2FnZTIuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU3BlZWRQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc3BlZWRfU3BlZWRNZXNzYWdlMl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgICNyZWdpb24gTmVzdGVkIHR5cGVzDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgR3JvdXAxIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8R3JvdXAxLCBHcm91cDEuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBHcm91cDEoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdyb3VwMSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgR3JvdXAxKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZ3JvdXAxRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJmaWVsZDExIiwgImZpZWxkMTIiLCAiZmllbGQxMyIsICJmaWVsZDE0IiwgImZpZWxkMTUiLCAiZmllbGQxNiIsICJmaWVsZDIwIiwgImZpZWxkMjIiLCAiZmllbGQyNCIsICJmaWVsZDI2IiwgImZpZWxkMjciLCAiZmllbGQyOCIsICJmaWVsZDI5IiwgImZpZWxkMzEiLCAiZmllbGQ1IiwgImZpZWxkNzMiIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2dyb3VwMUZpZWxkVGFncyA9IG5ldyB1aW50W10geyA5MywgOTgsIDEwNiwgMTE0LCAxMjAsIDEzMCwgMTYwLCAxNzgsIDE5NCwgMjEzLCAyMTgsIDIyNCwgMjM0LCAyNTAsIDQwLCA1ODQgfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEdyb3VwMSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgR3JvdXAxIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RHb29nbGVTcGVlZFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3VuaXR0ZXN0X2dvb2dsZV9zcGVlZF9TcGVlZE1lc3NhZ2UyX0dyb3VwMV9fRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxHcm91cDEsIEdyb3VwMS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU3BlZWRQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc3BlZWRfU3BlZWRNZXNzYWdlMl9Hcm91cDFfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTFGaWVsZE51bWJlciA9IDExOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTE7DQorICAgICAgICBwcml2YXRlIGZsb2F0IGZpZWxkMTFfOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDExOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgZmxvYXQgRmllbGQxMSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDExXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjZGaWVsZE51bWJlciA9IDI2Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjY7DQorICAgICAgICBwcml2YXRlIGZsb2F0IGZpZWxkMjZfOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNiB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI2OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgZmxvYXQgRmllbGQyNiB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDI2XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTJGaWVsZE51bWJlciA9IDEyOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTI7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBmaWVsZDEyXyA9ICIiOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMiB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDEyOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTIgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMl87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEzRmllbGROdW1iZXIgPSAxMzsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEzOw0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgZmllbGQxM18gPSAiIjsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDEzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTNfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxNEZpZWxkTnVtYmVyID0gMTQ7DQorICAgICAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gZmllbGQxNF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICAgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBGaWVsZDE0TGlzdCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoZmllbGQxNF8pOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IEZpZWxkMTRDb3VudCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDE0Xy5Db3VudDsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBHZXRGaWVsZDE0KGludCBpbmRleCkgew0KKyAgICAgICAgICByZXR1cm4gZmllbGQxNF9baW5kZXhdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTVGaWVsZE51bWJlciA9IDE1Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTU7DQorICAgICAgICBwcml2YXRlIHVsb25nIGZpZWxkMTVfOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE1OyB9DQorICAgICAgICB9DQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB1bG9uZyBGaWVsZDE1IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTVfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ1RmllbGROdW1iZXIgPSA1Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNTsNCisgICAgICAgIHByaXZhdGUgaW50IGZpZWxkNV87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ1OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IEZpZWxkNSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDVfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyN0ZpZWxkTnVtYmVyID0gMjc7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyNzsNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMjdfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI3IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjc7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQyNyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDI3XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjhGaWVsZE51bWJlciA9IDI4Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjg7DQorICAgICAgICBwcml2YXRlIGludCBmaWVsZDI4XzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjggew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyODsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBGaWVsZDI4IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjhfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyOUZpZWxkTnVtYmVyID0gMjk7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyOTsNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMjlfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI5IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjk7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQyOSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDI5XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTZGaWVsZE51bWJlciA9IDE2Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTY7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBmaWVsZDE2XyA9ICIiOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNiB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDE2OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTYgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGQxNl87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIyRmllbGROdW1iZXIgPSAyMjsNCisgICAgICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiBmaWVsZDIyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgICAgICBwdWJsaWMgc2NnOjpJTGlzdDxzdHJpbmc+IEZpZWxkMjJMaXN0IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShmaWVsZDIyXyk7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgRmllbGQyMkNvdW50IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjJfLkNvdW50OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIEdldEZpZWxkMjIoaW50IGluZGV4KSB7DQorICAgICAgICAgIHJldHVybiBmaWVsZDIyX1tpbmRleF07DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ3M0ZpZWxkTnVtYmVyID0gNzM7DQorICAgICAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gZmllbGQ3M18gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICAgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBGaWVsZDczTGlzdCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoZmllbGQ3M18pOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IEZpZWxkNzNDb3VudCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDczXy5Db3VudDsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBHZXRGaWVsZDczKGludCBpbmRleCkgew0KKyAgICAgICAgICByZXR1cm4gZmllbGQ3M19baW5kZXhdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjBGaWVsZE51bWJlciA9IDIwOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjA7DQorICAgICAgICBwcml2YXRlIGludCBmaWVsZDIwXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjAgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMDsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBGaWVsZDIwIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjBfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyNEZpZWxkTnVtYmVyID0gMjQ7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyNDsNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIGZpZWxkMjRfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI0IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQyNCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZDI0XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMzFGaWVsZE51bWJlciA9IDMxOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMzE7DQorICAgICAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBmaWVsZDMxXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMzEgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQzMTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBGaWVsZDMxIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMzFfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaWYgKCFoYXNGaWVsZDExKSByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgaWYgKCFoYXNGaWVsZDE1KSByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfZ3JvdXAxRmllbGROYW1lczsNCisgICAgICAgICAgaWYgKGhhc0ZpZWxkNSkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDUsIGZpZWxkX25hbWVzWzE0XSwgRmllbGQ1KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQxMSkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDExLCBmaWVsZF9uYW1lc1swXSwgRmllbGQxMSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMTIpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMTIsIGZpZWxkX25hbWVzWzFdLCBGaWVsZDEyKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQxMykgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxMywgZmllbGRfbmFtZXNbMl0sIEZpZWxkMTMpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChmaWVsZDE0Xy5Db3VudCA+IDApIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmdBcnJheSgxNCwgZmllbGRfbmFtZXNbM10sIGZpZWxkMTRfKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQxNSkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQ2NCgxNSwgZmllbGRfbmFtZXNbNF0sIEZpZWxkMTUpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDE2KSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDE2LCBmaWVsZF9uYW1lc1s1XSwgRmllbGQxNik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMjApIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMCwgZmllbGRfbmFtZXNbNl0sIEZpZWxkMjApOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChmaWVsZDIyXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmdBcnJheSgyMiwgZmllbGRfbmFtZXNbN10sIGZpZWxkMjJfKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQyNCkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygyNCwgZmllbGRfbmFtZXNbOF0sIEZpZWxkMjQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDI2KSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoMjYsIGZpZWxkX25hbWVzWzldLCBGaWVsZDI2KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQyNykgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygyNywgZmllbGRfbmFtZXNbMTBdLCBGaWVsZDI3KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQyOCkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDI4LCBmaWVsZF9uYW1lc1sxMV0sIEZpZWxkMjgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDI5KSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDI5LCBmaWVsZF9uYW1lc1sxMl0sIEZpZWxkMjkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDMxKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZSgzMSwgZmllbGRfbmFtZXNbMTNdLCBGaWVsZDMxKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoZmllbGQ3M18uQ291bnQgPiAwKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzJBcnJheSg3MywgZmllbGRfbmFtZXNbMTVdLCBmaWVsZDczXyk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgIA0KKyAgICAgICAgICBzaXplID0gMDsNCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMTEpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDExLCBGaWVsZDExKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQyNikgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoMjYsIEZpZWxkMjYpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDEyKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMTIsIEZpZWxkMTIpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDEzKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMTMsIEZpZWxkMTMpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIEZpZWxkMTRMaXN0KSB7DQorICAgICAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgICAgICBzaXplICs9IDEgKiBmaWVsZDE0Xy5Db3VudDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQxNSkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50NjRTaXplKDE1LCBGaWVsZDE1KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzRmllbGQ1KSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg1LCBGaWVsZDUpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDI3KSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMjcsIEZpZWxkMjcpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDI4KSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyOCwgRmllbGQyOCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMjkpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgyOSwgRmllbGQyOSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMTYpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxNiwgRmllbGQxNik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGVsZW1lbnQgaW4gRmllbGQyMkxpc3QpIHsNCisgICAgICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICAgIHNpemUgKz0gMiAqIGZpZWxkMjJfLkNvdW50Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIEZpZWxkNzNMaXN0KSB7DQorICAgICAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICAgIHNpemUgKz0gMiAqIGZpZWxkNzNfLkNvdW50Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNGaWVsZDIwKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyMCwgRmllbGQyMCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMjQpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgyNCwgRmllbGQyNCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0ZpZWxkMzEpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMzEsIEZpZWxkMzEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgICAgIHJldHVybiBzaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHcm91cDEgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHcm91cDEgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHcm91cDEgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAxIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEdyb3VwMSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpdmF0ZSBHcm91cDEgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICBmaWVsZDE0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgZmllbGQyMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIGZpZWxkNzNfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKEdyb3VwMSBwcm90b3R5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPEdyb3VwMSwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihHcm91cDEgY2xvbmVGcm9tKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICAgICAgcHJpdmF0ZSBHcm91cDEgcmVzdWx0Ow0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBHcm91cDEgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIEdyb3VwMSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBHcm91cDEoKTsNCisgICAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgR3JvdXAxIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTIuVHlwZXMuR3JvdXAxLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEdyb3VwMSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMi5UeXBlcy5Hcm91cDEuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBHcm91cDEgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGlzIEdyb3VwMSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoR3JvdXAxKSBvdGhlcik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEdyb3VwMSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTEpIHsNCisgICAgICAgICAgICAgIEZpZWxkMTEgPSBvdGhlci5GaWVsZDExOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyNikgew0KKyAgICAgICAgICAgICAgRmllbGQyNiA9IG90aGVyLkZpZWxkMjY7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEyKSB7DQorICAgICAgICAgICAgICBGaWVsZDEyID0gb3RoZXIuRmllbGQxMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTMpIHsNCisgICAgICAgICAgICAgIEZpZWxkMTMgPSBvdGhlci5GaWVsZDEzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIuZmllbGQxNF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTRfLkFkZChvdGhlci5maWVsZDE0Xyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDE1KSB7DQorICAgICAgICAgICAgICBGaWVsZDE1ID0gb3RoZXIuRmllbGQxNTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkNSkgew0KKyAgICAgICAgICAgICAgRmllbGQ1ID0gb3RoZXIuRmllbGQ1Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyNykgew0KKyAgICAgICAgICAgICAgRmllbGQyNyA9IG90aGVyLkZpZWxkMjc7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDI4KSB7DQorICAgICAgICAgICAgICBGaWVsZDI4ID0gb3RoZXIuRmllbGQyODsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjkpIHsNCisgICAgICAgICAgICAgIEZpZWxkMjkgPSBvdGhlci5GaWVsZDI5Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxNikgew0KKyAgICAgICAgICAgICAgRmllbGQxNiA9IG90aGVyLkZpZWxkMTY7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5maWVsZDIyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgICAgICByZXN1bHQuZmllbGQyMl8uQWRkKG90aGVyLmZpZWxkMjJfKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLmZpZWxkNzNfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgICAgIHJlc3VsdC5maWVsZDczXy5BZGQob3RoZXIuZmllbGQ3M18pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMCkgew0KKyAgICAgICAgICAgICAgRmllbGQyMCA9IG90aGVyLkZpZWxkMjA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDI0KSB7DQorICAgICAgICAgICAgICBGaWVsZDI0ID0gb3RoZXIuRmllbGQyNDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMzEpIHsNCisgICAgICAgICAgICAgIE1lcmdlRmllbGQzMShvdGhlci5GaWVsZDMxKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfZ3JvdXAxRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgICAgICB0YWcgPSBfZ3JvdXAxRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgNDA6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ1ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQ1Xyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSA5Mzogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDExID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQuZmllbGQxMV8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgOTg6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMiA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWVsZDEyXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAxMDY6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMyA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWVsZDEzXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAxMTQ6IHsNCisgICAgICAgICAgICAgICAgICBpbnB1dC5SZWFkU3RyaW5nQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuZmllbGQxNF8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTIwOiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTUgPSBpbnB1dC5SZWFkVUludDY0KHJlZiByZXN1bHQuZmllbGQxNV8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTMwOiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTYgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZmllbGQxNl8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTYwOiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjAgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDIwXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAxNzg6IHsNCisgICAgICAgICAgICAgICAgICBpbnB1dC5SZWFkU3RyaW5nQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuZmllbGQyMl8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTk0OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjQgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZmllbGQyNF8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMjEzOiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjYgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5maWVsZDI2Xyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAyMTg6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyNyA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWVsZDI3Xyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAyMjQ6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyOCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMjhfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDIzNDogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI5ID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmZpZWxkMjlfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDI1MDogew0KKyAgICAgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzRmllbGQzMSkgew0KKyAgICAgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oRmllbGQzMSk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgICBGaWVsZDMxID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDU4NjoNCisgICAgICAgICAgICAgICAgY2FzZSA1ODQ6IHsNCisgICAgICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5maWVsZDczXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTEgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxMTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBmbG9hdCBGaWVsZDExIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTE7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDExKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTEoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDExID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxMV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTEoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDExXyA9IDBGOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI2IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjY7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgZmxvYXQgRmllbGQyNiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI2OyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQyNih2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI2KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyNiA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjZfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI2KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjYgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyNl8gPSAwRjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEyOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDEyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTI7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDEyKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTIoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxMl8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTIoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMiA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDEyXyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMTMgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMzsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkMTModmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMyhzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTMgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDEzXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMygpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTNfID0gIiI7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBGaWVsZDE0TGlzdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZmllbGQxNF87IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEZpZWxkMTRDb3VudCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE0Q291bnQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgc3RyaW5nIEdldEZpZWxkMTQoaW50IGluZGV4KSB7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRGaWVsZDE0KGluZGV4KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDE0KGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDE0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGRGaWVsZDE0KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNF8uQWRkKHZhbHVlKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUZpZWxkMTQoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMTRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxNCgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDE0Xy5DbGVhcigpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDE1IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTU7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgICAgcHVibGljIHVsb25nIEZpZWxkMTUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxNTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkMTUodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTUodWxvbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE1ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTUoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxNSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDE1XyA9IDBVTDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ1IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgRmllbGQ1IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkNSh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDUoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ1ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQ1XyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ1KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDVfID0gMDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyNyB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI3OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDI3IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjc7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDI3KHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjcoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI3ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyN18gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjcoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyNyA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDI3XyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI4IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjg7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEZpZWxkMjggew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyODsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkMjgodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyOChpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI4ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyOF8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjgoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyOCA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDI4XyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjkgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyOTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQyOSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI5OyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RmllbGQyOSh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDI5KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyOSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjlfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDI5KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjkgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyOV8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxNiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDE2OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZDE2IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTY7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDE2KHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTYoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDE2ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQxNl8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMTYoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxNiA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDE2XyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gRmllbGQyMkxpc3Qgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmZpZWxkMjJfOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBGaWVsZDIyQ291bnQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMkNvdW50OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBHZXRGaWVsZDIyKGludCBpbmRleCkgew0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuR2V0RmllbGQyMihpbmRleCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMihpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmllbGQyMihzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjJfLkFkZCh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VGaWVsZDIyKHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDIyXy5BZGQodmFsdWVzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjIoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyMl8uQ2xlYXIoKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IEZpZWxkNzNMaXN0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5maWVsZDczXzsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgRmllbGQ3M0NvdW50IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNzNDb3VudDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgR2V0RmllbGQ3MyhpbnQgaW5kZXgpIHsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0LkdldEZpZWxkNzMoaW5kZXgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNzMoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDczX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGRGaWVsZDczKGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkNzNfLkFkZCh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VGaWVsZDczKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDczXy5BZGQodmFsdWVzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNzMoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQ3M18uQ2xlYXIoKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIwOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBGaWVsZDIwIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjA7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDIwKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjAoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMCA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjBfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIwKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjAgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQyMF8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDI0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMjQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyNDsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEZpZWxkMjQodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyNChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjQgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5maWVsZDI0XyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyNCgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI0ID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmZpZWxkMjRfID0gIiI7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMzEgew0KKyAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDMxOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBGaWVsZDMxIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMzE7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRGaWVsZDMxKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMzEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMxID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQzMV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDMxKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMxID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQzMV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUZpZWxkMzEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzRmllbGQzMSAmJg0KKyAgICAgICAgICAgICAgICByZXN1bHQuZmllbGQzMV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQuZmllbGQzMV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQuZmllbGQzMV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJlc3VsdC5maWVsZDMxXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQzMSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDMxKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMzEgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuZmllbGQzMV8gPSBudWxsOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgR3JvdXAxKCkgew0KKyAgICAgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU3BlZWRQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxOw0KKyAgICBwcml2YXRlIHN0cmluZyBmaWVsZDFfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRmllbGQxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkM0ZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMzsNCisgICAgcHJpdmF0ZSBsb25nIGZpZWxkM187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEZpZWxkMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkM187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDRGaWVsZE51bWJlciA9IDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDQ7DQorICAgIHByaXZhdGUgbG9uZyBmaWVsZDRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBGaWVsZDQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQzMEZpZWxkTnVtYmVyID0gMzA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDMwOw0KKyAgICBwcml2YXRlIGxvbmcgZmllbGQzMF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMzAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDMwOyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRmllbGQzMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMzBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ3NUZpZWxkTnVtYmVyID0gNzU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDc1Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQ3NV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNzUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDc1OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQ3NSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNzVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ2RmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ2Ow0KKyAgICBwcml2YXRlIHN0cmluZyBmaWVsZDZfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRmllbGQ2IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ2XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMkZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjsNCisgICAgcHJpdmF0ZSBwYjo6Qnl0ZVN0cmluZyBmaWVsZDJfID0gcGI6OkJ5dGVTdHJpbmcuRW1wdHk7DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBGaWVsZDIgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyMUZpZWxkTnVtYmVyID0gMjE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIxOw0KKyAgICBwcml2YXRlIGludCBmaWVsZDIxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMjEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNzFGaWVsZE51bWJlciA9IDcxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ3MTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQ3MV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNzEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDcxOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDcxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ3MV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDI1RmllbGROdW1iZXIgPSAyNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMjU7DQorICAgIHByaXZhdGUgZmxvYXQgZmllbGQyNV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDI1OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IEZpZWxkMjUgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDI1XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMTA5RmllbGROdW1iZXIgPSAxMDk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEwOTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQxMDlfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTA5OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDEwOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTA5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjEwRmllbGROdW1iZXIgPSAyMTA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIxMDsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyMTBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjEwOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIxMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjEwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjExRmllbGROdW1iZXIgPSAyMTE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIxMTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyMTFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjExOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIxMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjExXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjEyRmllbGROdW1iZXIgPSAyMTI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIxMjsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyMTJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjEyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIxMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjEyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjEzRmllbGROdW1iZXIgPSAyMTM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIxMzsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyMTNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjEzOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIxMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjEzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjE2RmllbGROdW1iZXIgPSAyMTY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIxNjsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyMTZfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjE2OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIxNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjE2XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjE3RmllbGROdW1iZXIgPSAyMTc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIxNzsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyMTdfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjE3OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIxNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjE3XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjE4RmllbGROdW1iZXIgPSAyMTg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIxODsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyMThfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjE4OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIxOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjE4XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjIwRmllbGROdW1iZXIgPSAyMjA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIyMDsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyMjBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIyMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjIwOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIyMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjIwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjIxRmllbGROdW1iZXIgPSAyMjE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIyMTsNCisgICAgcHJpdmF0ZSBpbnQgZmllbGQyMjFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIyMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjIxOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBGaWVsZDIyMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjIxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjIyRmllbGROdW1iZXIgPSAyMjI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIyMjsNCisgICAgcHJpdmF0ZSBmbG9hdCBmaWVsZDIyMl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMjI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRmllbGQyMjIgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDIyMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDYzRmllbGROdW1iZXIgPSA2MzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNjM7DQorICAgIHByaXZhdGUgaW50IGZpZWxkNjNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDYzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ2MzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQ2MyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNjNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgR3JvdXAxRmllbGROdW1iZXIgPSAxMDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMT4gZ3JvdXAxXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMi5UeXBlcy5Hcm91cDE+IEdyb3VwMUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBncm91cDFfOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHcm91cDFDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdyb3VwMV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMi5UeXBlcy5Hcm91cDEgR2V0R3JvdXAxKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBncm91cDFfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEyOEZpZWxkTnVtYmVyID0gMTI4Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gZmllbGQxMjhfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBGaWVsZDEyOExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoZmllbGQxMjhfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMjhDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTI4Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgR2V0RmllbGQxMjgoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGZpZWxkMTI4X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMzFGaWVsZE51bWJlciA9IDEzMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTMxOw0KKyAgICBwcml2YXRlIGxvbmcgZmllbGQxMzFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEzMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTMxOyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRmllbGQxMzEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEzMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDEyN0ZpZWxkTnVtYmVyID0gMTI3Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gZmllbGQxMjdfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBGaWVsZDEyN0xpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoZmllbGQxMjdfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRmllbGQxMjdDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMTI3Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgR2V0RmllbGQxMjcoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGZpZWxkMTI3X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMjlGaWVsZE51bWJlciA9IDEyOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTI5Ow0KKyAgICBwcml2YXRlIGludCBmaWVsZDEyOV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTI5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMjk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTI5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMjlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMzBGaWVsZE51bWJlciA9IDEzMDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiBmaWVsZDEzMF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gRmllbGQxMzBMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KGZpZWxkMTMwXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkMTMwQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDEzMF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBHZXRGaWVsZDEzMChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gZmllbGQxMzBfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDIwNUZpZWxkTnVtYmVyID0gMjA1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyMDU7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDIwNV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjA1IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQyMDU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDIwNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkMjA1XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkMjA2RmllbGROdW1iZXIgPSAyMDY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDIwNjsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkMjA2XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDYgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDIwNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkMjA2IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQyMDZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9zcGVlZE1lc3NhZ2UyRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzRmllbGQxKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMSwgZmllbGRfbmFtZXNbMF0sIEZpZWxkMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKDIsIGZpZWxkX25hbWVzWzddLCBGaWVsZDIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NCgzLCBmaWVsZF9uYW1lc1syMl0sIEZpZWxkMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KDQsIGZpZWxkX25hbWVzWzI0XSwgRmllbGQ0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDYsIGZpZWxkX25hbWVzWzI1XSwgRmllbGQ2KTsNCisgICAgICB9DQorICAgICAgaWYgKGdyb3VwMV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVHcm91cEFycmF5KDEwLCBmaWVsZF9uYW1lc1syOV0sIGdyb3VwMV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjEsIGZpZWxkX25hbWVzWzEwXSwgRmllbGQyMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDI1KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgyNSwgZmllbGRfbmFtZXNbMjFdLCBGaWVsZDI1KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMzApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KDMwLCBmaWVsZF9uYW1lc1syM10sIEZpZWxkMzApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ2Mykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNjMsIGZpZWxkX25hbWVzWzI2XSwgRmllbGQ2Myk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDcxKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig3MSwgZmllbGRfbmFtZXNbMjddLCBGaWVsZDcxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNzUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woNzUsIGZpZWxkX25hbWVzWzI4XSwgRmllbGQ3NSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEwOSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTA5LCBmaWVsZF9uYW1lc1sxXSwgRmllbGQxMDkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoZmllbGQxMjdfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoMTI3LCBmaWVsZF9uYW1lc1syXSwgZmllbGQxMjdfKTsNCisgICAgICB9DQorICAgICAgaWYgKGZpZWxkMTI4Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZ0FycmF5KDEyOCwgZmllbGRfbmFtZXNbM10sIGZpZWxkMTI4Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEyOSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTI5LCBmaWVsZF9uYW1lc1s0XSwgRmllbGQxMjkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoZmllbGQxMzBfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50NjRBcnJheSgxMzAsIGZpZWxkX25hbWVzWzVdLCBmaWVsZDEzMF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMzEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KDEzMSwgZmllbGRfbmFtZXNbNl0sIEZpZWxkMTMxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjA1KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDIwNSwgZmllbGRfbmFtZXNbOF0sIEZpZWxkMjA1KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjA2KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDIwNiwgZmllbGRfbmFtZXNbOV0sIEZpZWxkMjA2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjEwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMTAsIGZpZWxkX25hbWVzWzExXSwgRmllbGQyMTApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMTEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIxMSwgZmllbGRfbmFtZXNbMTJdLCBGaWVsZDIxMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIxMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjEyLCBmaWVsZF9uYW1lc1sxM10sIEZpZWxkMjEyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjEzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMTMsIGZpZWxkX25hbWVzWzE0XSwgRmllbGQyMTMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMTYpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIxNiwgZmllbGRfbmFtZXNbMTVdLCBGaWVsZDIxNik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIxNykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjE3LCBmaWVsZF9uYW1lc1sxNl0sIEZpZWxkMjE3KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjE4KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMTgsIGZpZWxkX25hbWVzWzE3XSwgRmllbGQyMTgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMjApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIyMCwgZmllbGRfbmFtZXNbMThdLCBGaWVsZDIyMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIyMSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjIxLCBmaWVsZF9uYW1lc1sxOV0sIEZpZWxkMjIxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjIyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgyMjIsIGZpZWxkX25hbWVzWzIwXSwgRmllbGQyMjIpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0ZpZWxkMSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMSwgRmllbGQxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZSgzLCBGaWVsZDMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKDQsIEZpZWxkNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDMwKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKDMwLCBGaWVsZDMwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNzUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSg3NSwgRmllbGQ3NSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDYpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDYsIEZpZWxkNik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCeXRlc1NpemUoMiwgRmllbGQyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjEpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjEsIEZpZWxkMjEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ3MSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg3MSwgRmllbGQ3MSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDI1KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDI1LCBGaWVsZDI1KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTA5KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEwOSwgRmllbGQxMDkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMTApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjEwLCBGaWVsZDIxMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIxMSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyMTEsIEZpZWxkMjExKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjEyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIxMiwgRmllbGQyMTIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMTMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjEzLCBGaWVsZDIxMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIxNikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyMTYsIEZpZWxkMjE2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjE3KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIxNywgRmllbGQyMTcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMTgpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjE4LCBGaWVsZDIxOCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIyMCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyMjAsIEZpZWxkMjIwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMjIxKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIyMSwgRmllbGQyMjEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMjIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoMjIyLCBGaWVsZDIyMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDYzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDYzLCBGaWVsZDYzKTsNCisgICAgICB9DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMi5UeXBlcy5Hcm91cDEgZWxlbWVudCBpbiBHcm91cDFMaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlR3JvdXBTaXplKDEwLCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIEZpZWxkMTI4TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiBmaWVsZDEyOF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEzMSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZSgxMzEsIEZpZWxkMTMxKTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIEZpZWxkMTI3TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiBmaWVsZDEyN18uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDEyOSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxMjksIEZpZWxkMTI5KTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGxvbmcgZWxlbWVudCBpbiBGaWVsZDEzMExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiBmaWVsZDEzMF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIwNSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDIwNSwgRmllbGQyMDUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQyMDYpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSgyMDYsIEZpZWxkMjA2KTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTIgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFNwZWVkTWVzc2FnZTIgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIGdyb3VwMV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgZmllbGQxMjhfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIGZpZWxkMTI3Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBmaWVsZDEzMF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihTcGVlZE1lc3NhZ2UyIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFNwZWVkTWVzc2FnZTIsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFNwZWVkTWVzc2FnZTIgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBTcGVlZE1lc3NhZ2UyIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFNwZWVkTWVzc2FnZTIgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBTcGVlZE1lc3NhZ2UyIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgU3BlZWRNZXNzYWdlMigpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU3BlZWRNZXNzYWdlMiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTIuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3BlZWRNZXNzYWdlMiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3BlZWRNZXNzYWdlMiBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgU3BlZWRNZXNzYWdlMikgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChTcGVlZE1lc3NhZ2UyKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oU3BlZWRNZXNzYWdlMiBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTIuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxKSB7DQorICAgICAgICAgIEZpZWxkMSA9IG90aGVyLkZpZWxkMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDMpIHsNCisgICAgICAgICAgRmllbGQzID0gb3RoZXIuRmllbGQzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkNCkgew0KKyAgICAgICAgICBGaWVsZDQgPSBvdGhlci5GaWVsZDQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQzMCkgew0KKyAgICAgICAgICBGaWVsZDMwID0gb3RoZXIuRmllbGQzMDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDc1KSB7DQorICAgICAgICAgIEZpZWxkNzUgPSBvdGhlci5GaWVsZDc1Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkNikgew0KKyAgICAgICAgICBGaWVsZDYgPSBvdGhlci5GaWVsZDY7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyKSB7DQorICAgICAgICAgIEZpZWxkMiA9IG90aGVyLkZpZWxkMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIxKSB7DQorICAgICAgICAgIEZpZWxkMjEgPSBvdGhlci5GaWVsZDIxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkNzEpIHsNCisgICAgICAgICAgRmllbGQ3MSA9IG90aGVyLkZpZWxkNzE7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyNSkgew0KKyAgICAgICAgICBGaWVsZDI1ID0gb3RoZXIuRmllbGQyNTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEwOSkgew0KKyAgICAgICAgICBGaWVsZDEwOSA9IG90aGVyLkZpZWxkMTA5Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjEwKSB7DQorICAgICAgICAgIEZpZWxkMjEwID0gb3RoZXIuRmllbGQyMTA7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMTEpIHsNCisgICAgICAgICAgRmllbGQyMTEgPSBvdGhlci5GaWVsZDIxMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIxMikgew0KKyAgICAgICAgICBGaWVsZDIxMiA9IG90aGVyLkZpZWxkMjEyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjEzKSB7DQorICAgICAgICAgIEZpZWxkMjEzID0gb3RoZXIuRmllbGQyMTM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMTYpIHsNCisgICAgICAgICAgRmllbGQyMTYgPSBvdGhlci5GaWVsZDIxNjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIxNykgew0KKyAgICAgICAgICBGaWVsZDIxNyA9IG90aGVyLkZpZWxkMjE3Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjE4KSB7DQorICAgICAgICAgIEZpZWxkMjE4ID0gb3RoZXIuRmllbGQyMTg7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQyMjApIHsNCisgICAgICAgICAgRmllbGQyMjAgPSBvdGhlci5GaWVsZDIyMDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIyMSkgew0KKyAgICAgICAgICBGaWVsZDIyMSA9IG90aGVyLkZpZWxkMjIxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjIyKSB7DQorICAgICAgICAgIEZpZWxkMjIyID0gb3RoZXIuRmllbGQyMjI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ2Mykgew0KKyAgICAgICAgICBGaWVsZDYzID0gb3RoZXIuRmllbGQ2MzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5ncm91cDFfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0Lmdyb3VwMV8uQWRkKG90aGVyLmdyb3VwMV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLmZpZWxkMTI4Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5maWVsZDEyOF8uQWRkKG90aGVyLmZpZWxkMTI4Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQxMzEpIHsNCisgICAgICAgICAgRmllbGQxMzEgPSBvdGhlci5GaWVsZDEzMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5maWVsZDEyN18uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQuZmllbGQxMjdfLkFkZChvdGhlci5maWVsZDEyN18pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTI5KSB7DQorICAgICAgICAgIEZpZWxkMTI5ID0gb3RoZXIuRmllbGQxMjk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuZmllbGQxMzBfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LmZpZWxkMTMwXy5BZGQob3RoZXIuZmllbGQxMzBfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDIwNSkgew0KKyAgICAgICAgICBGaWVsZDIwNSA9IG90aGVyLkZpZWxkMjA1Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMjA2KSB7DQorICAgICAgICAgIEZpZWxkMjA2ID0gb3RoZXIuRmllbGQyMDY7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9zcGVlZE1lc3NhZ2UyRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3NwZWVkTWVzc2FnZTJGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZmllbGQxXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMiA9IGlucHV0LlJlYWRCeXRlcyhyZWYgcmVzdWx0LmZpZWxkMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMgPSBpbnB1dC5SZWFkSW50NjQocmVmIHJlc3VsdC5maWVsZDNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ0ID0gaW5wdXQuUmVhZEludDY0KHJlZiByZXN1bHQuZmllbGQ0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNiA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWVsZDZfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgzOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkR3JvdXBBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5ncm91cDFfLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMS5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDIxXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMDU6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI1ID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQuZmllbGQyNV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQzMCA9IGlucHV0LlJlYWRJbnQ2NChyZWYgcmVzdWx0LmZpZWxkMzBfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDUwNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNjMgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDYzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1Njg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDcxID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQ3MV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjAwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ3NSA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQ3NV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODcyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxMDkgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDEwOV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTAxODogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LmZpZWxkMTI3Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDI2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU3RyaW5nQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuZmllbGQxMjhfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwMzI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEyOSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMTI5Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDQyOg0KKyAgICAgICAgICAgIGNhc2UgMTA0MDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEludDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuZmllbGQxMzBfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwNDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzMSA9IGlucHV0LlJlYWRJbnQ2NChyZWYgcmVzdWx0LmZpZWxkMTMxXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjQwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMDUgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmZpZWxkMjA1Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjQ4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMDYgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmZpZWxkMjA2Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjgwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMTAgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDIxMF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY4ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjExID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQyMTFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2OTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMjEyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNzA0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMTMgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDIxM18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTcyODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjE2ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQyMTZfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE3MzY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxNyA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMjE3Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNzQ0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMTggPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5maWVsZDIxOF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTc2MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIwID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZmllbGQyMjBfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE3Njg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIyMSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmZpZWxkMjIxXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNzgxOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQyMjIgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5maWVsZDIyMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDM7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQzKGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkM18gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgRmllbGQ0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ0OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDRfID0gMEw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQzMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMzA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgRmllbGQzMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMzA7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMzAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMzAobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDMwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQzMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQzMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMzBfID0gMEw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ3NSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNzU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQ3NSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNzU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNzUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNzUoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDc1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDc1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ3NSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ3NSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNzVfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ2OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGQ2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ2OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDYodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNihzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ2KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDYgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDZfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyKHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyXyA9IHBiOjpCeXRlU3RyaW5nLkVtcHR5Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNzEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDcxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQ3MSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNzE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNzEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNzEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNzEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNzFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDcxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDcxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ3MV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDI1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBGaWVsZDI1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyNTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyNSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyNShmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDI1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDI1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjVfID0gMEY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMDkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEwOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTA5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMDk7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTA5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEwOShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMDkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTA5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMDkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTA5ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMDlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjEwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMTAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIxMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMTAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjEwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMTBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxMF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjExIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMTE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIxMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjExOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIxMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMTEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjExID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjExKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjExXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIxMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjEyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMTI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjEyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIxMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjEyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMTIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjEyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMTJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjEzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMTMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIxMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMTModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjEzKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMTNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxM18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjE2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMTY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIxNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjE2OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIxNih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMTYoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjE2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxNl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjE2KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjE2XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMTcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIxNzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjE3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMTc7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjE3KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIxNyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjE3XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMTcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjE3ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMTdfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIxOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjE4OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGQyMTggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDIxODsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQyMTgodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMjE4KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIxOCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMThfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIxOCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMTggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIxOF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMjIwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyMjA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDIyMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjIwOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIyMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMjAoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIyMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjIwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIyMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjIwXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMjEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIyMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMjIxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMjE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjIxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIyMShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMjEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjIxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMjEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIxID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMjFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIyMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjIyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBGaWVsZDIyMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjIyOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIyMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMjIoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMjIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjIyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyMjIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjIyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQyMjJfID0gMEY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2MyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNjM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDYzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ2MzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ2Myh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ2MyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ2MyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ2M18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNjMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNjMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDYzXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMT4gR3JvdXAxTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5ncm91cDFfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR3JvdXAxQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Hcm91cDFDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BlZWRNZXNzYWdlMi5UeXBlcy5Hcm91cDEgR2V0R3JvdXAxKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRHcm91cDEoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRHcm91cDEoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZ3JvdXAxX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRHcm91cDEoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5ncm91cDFfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEdyb3VwMShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZ3JvdXAxXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEdyb3VwMShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5ncm91cDFfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VHcm91cDEoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyLlR5cGVzLkdyb3VwMT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmdyb3VwMV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJHcm91cDEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmdyb3VwMV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gRmllbGQxMjhMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmZpZWxkMTI4XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTI4Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEyOENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgR2V0RmllbGQxMjgoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldEZpZWxkMTI4KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMjgoaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI4X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRGaWVsZDEyOChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI4Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRmllbGQxMjgoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyOF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEyOCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMjhfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMzEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEzMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBGaWVsZDEzMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTMxOyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDEzMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMzEobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEzMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxMzFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEzMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMzEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMV8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gRmllbGQxMjdMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmZpZWxkMTI3XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTI3Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDEyN0NvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgR2V0RmllbGQxMjcoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldEZpZWxkMTI3KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMjcoaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI3X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRGaWVsZDEyNyhzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI3Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRmllbGQxMjcoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEyN18uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEyNygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMjdfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMjkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEyOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEZpZWxkMTI5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMjk7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTI5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEyOShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMjkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTI5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMjkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTI5ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQxMjlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGxvbmc+IEZpZWxkMTMwTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5maWVsZDEzMF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBGaWVsZDEzMENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMzBDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBHZXRGaWVsZDEzMChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0RmllbGQxMzAoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDEzMChpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMzBfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEZpZWxkMTMwKGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMzBfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VGaWVsZDEzMChzY2c6OklFbnVtZXJhYmxlPGxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEzMF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDEzMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGQxMzBfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyMDUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDIwNTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDIwNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMjA1OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDIwNSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyMDUoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyMDVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDIwNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQyMDUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwNV8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDIwNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMjA2OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkMjA2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQyMDY7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMjA2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDIwNihib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMjA2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDIwNl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkMjA2KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIwNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMjA2XyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBTcGVlZE1lc3NhZ2UyKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RHb29nbGVTcGVlZFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSwgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3NwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiZmllbGQxIiwgImZpZWxkMTAiLCAiZmllbGQxMSIsICJmaWVsZDIiLCAiZmllbGQzIiwgImZpZWxkNCIsICJmaWVsZDUiLCAiZmllbGQ2IiwgImZpZWxkNyIsICJmaWVsZDgiLCAiZmllbGQ5IiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3NwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMywgODUsIDg4LCAyMSwgMjksIDMyLCA0MCwgNDgsIDU2LCA2OSwgNzIgfTsNCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU3BlZWRQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY191bml0dGVzdF9nb29nbGVfc3BlZWRfU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSwgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEdvb2dsZVNwZWVkUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfdW5pdHRlc3RfZ29vZ2xlX3NwZWVkX1NwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQxOw0KKyAgICBwcml2YXRlIGZsb2F0IGZpZWxkMV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBGaWVsZDEgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQyRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQyOw0KKyAgICBwcml2YXRlIGZsb2F0IGZpZWxkMl87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBGaWVsZDIgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQzRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQzOw0KKyAgICBwcml2YXRlIGZsb2F0IGZpZWxkM187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBGaWVsZDMgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQ0RmllbGROdW1iZXIgPSA0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmllbGQ0Ow0KKyAgICBwcml2YXRlIGJvb2wgZmllbGQ0XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ0OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQ0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkNUZpZWxkTnVtYmVyID0gNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNTsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkNV87DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkNV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDZGaWVsZE51bWJlciA9IDY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDY7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDZfID0gdHJ1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ2OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRmllbGQ2IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQ2XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkN0ZpZWxkTnVtYmVyID0gNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkNzsNCisgICAgcHJpdmF0ZSBib29sIGZpZWxkN187DQorICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkNzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEZpZWxkNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkN187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDhGaWVsZE51bWJlciA9IDg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDg7DQorICAgIHByaXZhdGUgZmxvYXQgZmllbGQ4XzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQ4IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQ4OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IEZpZWxkOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkOF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDlGaWVsZE51bWJlciA9IDk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDk7DQorICAgIHByaXZhdGUgYm9vbCBmaWVsZDlfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDkgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGaWVsZDk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBGaWVsZDkgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZDlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQxMEZpZWxkTnVtYmVyID0gMTA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGaWVsZDEwOw0KKyAgICBwcml2YXRlIGZsb2F0IGZpZWxkMTBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDEwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRmllbGQxMDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBGaWVsZDEwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWVsZDExRmllbGROdW1iZXIgPSAxMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZpZWxkMTE7DQorICAgIHByaXZhdGUgbG9uZyBmaWVsZDExXzsNCisgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpZWxkMTE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBGaWVsZDExIHsNCisgICAgICBnZXQgeyByZXR1cm4gZmllbGQxMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3NwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0ZpZWxkMSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoMSwgZmllbGRfbmFtZXNbMF0sIEZpZWxkMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDIsIGZpZWxkX25hbWVzWzNdLCBGaWVsZDIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgzLCBmaWVsZF9uYW1lc1s0XSwgRmllbGQzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCg0LCBmaWVsZF9uYW1lc1s1XSwgRmllbGQ0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCg1LCBmaWVsZF9uYW1lc1s2XSwgRmllbGQ1KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCg2LCBmaWVsZF9uYW1lc1s3XSwgRmllbGQ2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCg3LCBmaWVsZF9uYW1lc1s4XSwgRmllbGQ3KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkOCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoOCwgZmllbGRfbmFtZXNbOV0sIEZpZWxkOCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDkpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woOSwgZmllbGRfbmFtZXNbMTBdLCBGaWVsZDkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoMTAsIGZpZWxkX25hbWVzWzFdLCBGaWVsZDEwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KDExLCBmaWVsZF9uYW1lc1syXSwgRmllbGQxMSk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzRmllbGQxKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDEsIEZpZWxkMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoMiwgRmllbGQyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSgzLCBGaWVsZDMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoNCwgRmllbGQ0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkNSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDUsIEZpZWxkNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWVsZDYpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSg2LCBGaWVsZDYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ3KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoNywgRmllbGQ3KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkOCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSg4LCBGaWVsZDgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQ5KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoOSwgRmllbGQ5KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0ZpZWxkMTApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoMTAsIEZpZWxkMTApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRmllbGQxMSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZSgxMSwgRmllbGQxMSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8U3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBTcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgU3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEpIHsNCisgICAgICAgICAgRmllbGQxID0gb3RoZXIuRmllbGQxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMikgew0KKyAgICAgICAgICBGaWVsZDIgPSBvdGhlci5GaWVsZDI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQzKSB7DQorICAgICAgICAgIEZpZWxkMyA9IG90aGVyLkZpZWxkMzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDQpIHsNCisgICAgICAgICAgRmllbGQ0ID0gb3RoZXIuRmllbGQ0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkNSkgew0KKyAgICAgICAgICBGaWVsZDUgPSBvdGhlci5GaWVsZDU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ2KSB7DQorICAgICAgICAgIEZpZWxkNiA9IG90aGVyLkZpZWxkNjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDcpIHsNCisgICAgICAgICAgRmllbGQ3ID0gb3RoZXIuRmllbGQ3Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkOCkgew0KKyAgICAgICAgICBGaWVsZDggPSBvdGhlci5GaWVsZDg7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRmllbGQ5KSB7DQorICAgICAgICAgIEZpZWxkOSA9IG90aGVyLkZpZWxkOTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGaWVsZDEwKSB7DQorICAgICAgICAgIEZpZWxkMTAgPSBvdGhlci5GaWVsZDEwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpZWxkMTEpIHsNCisgICAgICAgICAgRmllbGQxMSA9IG90aGVyLkZpZWxkMTE7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9zcGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfc3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEzOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQxID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQuZmllbGQxXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMiA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0LmZpZWxkMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjk6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5maWVsZDNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ0ID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ1ID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQ4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ2ID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDZfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ3ID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5maWVsZDdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY5OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmllbGQ4ID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQuZmllbGQ4Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3Mjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkOSA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZmllbGQ5Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4NTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTAgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5maWVsZDEwXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMTEgPSBpbnB1dC5SZWFkSW50NjQocmVmIHJlc3VsdC5maWVsZDExXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQxOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBGaWVsZDEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxKGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDFfID0gMEY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBGaWVsZDIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDI7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQyKGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDJfID0gMEY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBGaWVsZDMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDM7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQzKGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDNfID0gMEY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkNDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDQoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkNCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ0XyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkNTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBGaWVsZDUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDU7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkNSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ1KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGaWVsZDUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkNV8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQ2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ2OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDYodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNihib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ2KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDYgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDZfID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGaWVsZDcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDc7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRmllbGQ3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQ3OyB9DQorICAgICAgICBzZXQgeyBTZXRGaWVsZDcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkNyhib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkNyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ3XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ3KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDcgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDdfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ4OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBGaWVsZDggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5GaWVsZDg7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkOCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQ4KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZpZWxkOCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZmllbGQ4XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQ4KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDhfID0gMEY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQ5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRmllbGQ5OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEZpZWxkOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkOTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQ5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZDkoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkOV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpZWxkOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQ5ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZmllbGQ5XyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkMTAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWVsZDEwOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBGaWVsZDEwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmllbGQxMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RmllbGQxMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmllbGQxMChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDEwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDEwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTBfID0gMEY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQxMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZpZWxkMTE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgRmllbGQxMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkMTE7IH0NCisgICAgICAgIHNldCB7IFNldEZpZWxkMTEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkMTEobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWVsZDExID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWVsZDExXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQxMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmllbGQxMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkMTFfID0gMEw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFNwZWVkTWVzc2FnZTJHcm91cGVkTWVzc2FnZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0R29vZ2xlU3BlZWRQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorfQ0KKw0KKyNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTFmNDA4Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZS5jcwpAQCAtMCwwICsxLDMwOCBAQAorLy8gR2VuZXJhdGVkIGJ5IFByb3RvR2VuLCBWZXJzaW9uPTIuNC4xLjU1NSwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj01NWY3MTI1MjM0YmViNTg5LiAgRE8gTk9UIEVESVQhDQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQ0KKyNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCisNCit1c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVyczsNCit1c2luZyBwYmMgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnM7DQordXNpbmcgcGJkID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcyB7DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlIHsNCisgIA0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gU3RhdGljIHZhcmlhYmxlcw0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gRXh0ZW5zaW9ucw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgb2JqZWN0IERlc2NyaXB0b3I7DQorICAgIHN0YXRpYyBVbml0VGVzdEltcG9ydExpdGVQcm90b0ZpbGUoKSB7DQorICAgICAgRGVzY3JpcHRvciA9IG51bGw7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgIH0NCisgICNyZWdpb24gRW51bXMNCisgIHB1YmxpYyBlbnVtIEltcG9ydEVudW1MaXRlIHsNCisgICAgSU1QT1JUX0xJVEVfRk9PID0gNywNCisgICAgSU1QT1JUX0xJVEVfQkFSID0gOCwNCisgICAgSU1QT1JUX0xJVEVfQkFaID0gOSwNCisgIH0NCisgIA0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorICAjcmVnaW9uIE1lc3NhZ2VzDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEltcG9ydE1lc3NhZ2VMaXRlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2VMaXRlPEltcG9ydE1lc3NhZ2VMaXRlLCBJbXBvcnRNZXNzYWdlTGl0ZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgSW1wb3J0TWVzc2FnZUxpdGUoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSW1wb3J0TWVzc2FnZUxpdGUgZGVmYXVsdEluc3RhbmNlID0gbmV3IEltcG9ydE1lc3NhZ2VMaXRlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9pbXBvcnRNZXNzYWdlTGl0ZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiZCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9pbXBvcnRNZXNzYWdlTGl0ZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZUxpdGUgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBJbXBvcnRNZXNzYWdlTGl0ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBJbXBvcnRNZXNzYWdlTGl0ZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBERmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRDsNCisgICAgcHJpdmF0ZSBpbnQgZF87DQorICAgIHB1YmxpYyBib29sIEhhc0Qgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEIHsNCisgICAgICBnZXQgeyByZXR1cm4gZF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2ltcG9ydE1lc3NhZ2VMaXRlRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzRCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgRCk7DQorICAgICAgfQ0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgICNyZWdpb24gTGl0ZSBydW50aW1lIG1ldGhvZHMNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsNCisgICAgICBpbnQgaGFzaCA9IEdldFR5cGUoKS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNEKSBoYXNoIF49IGRfLkdldEhhc2hDb2RlKCk7DQorICAgICAgcmV0dXJuIGhhc2g7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKSB7DQorICAgICAgSW1wb3J0TWVzc2FnZUxpdGUgb3RoZXIgPSBvYmogYXMgSW1wb3J0TWVzc2FnZUxpdGU7DQorICAgICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzRCAhPSBvdGhlci5oYXNEIHx8IChoYXNEICYmICFkXy5FcXVhbHMob3RoZXIuZF8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludFRvKGdsb2JhbDo6U3lzdGVtLklPLlRleHRXcml0ZXIgd3JpdGVyKSB7DQorICAgICAgUHJpbnRGaWVsZCgiZCIsIGhhc0QsIGRfLCB3cml0ZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZUxpdGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZUxpdGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZUxpdGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydE1lc3NhZ2VMaXRlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlTGl0ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlTGl0ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlTGl0ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlTGl0ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlTGl0ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlTGl0ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBJbXBvcnRNZXNzYWdlTGl0ZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihJbXBvcnRNZXNzYWdlTGl0ZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlckxpdGU8SW1wb3J0TWVzc2FnZUxpdGUsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEltcG9ydE1lc3NhZ2VMaXRlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgSW1wb3J0TWVzc2FnZUxpdGUgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgSW1wb3J0TWVzc2FnZUxpdGUgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBJbXBvcnRNZXNzYWdlTGl0ZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEltcG9ydE1lc3NhZ2VMaXRlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBJbXBvcnRNZXNzYWdlTGl0ZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEltcG9ydE1lc3NhZ2VMaXRlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2VMaXRlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgSW1wb3J0TWVzc2FnZUxpdGUgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZUxpdGUgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBJbXBvcnRNZXNzYWdlTGl0ZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChJbXBvcnRNZXNzYWdlTGl0ZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEltcG9ydE1lc3NhZ2VMaXRlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRCkgew0KKyAgICAgICAgICBEID0gb3RoZXIuRDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9pbXBvcnRNZXNzYWdlTGl0ZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9pbXBvcnRNZXNzYWdlTGl0ZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0Q7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0QgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIEltcG9ydE1lc3NhZ2VMaXRlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgICNlbmRyZWdpb24NCisgIA0KK30NCisNCisjZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYWUyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuY3MKQEAgLTAsMCArMSwzNDYgQEAKKy8vIEdlbmVyYXRlZCBieSBQcm90b0dlbiwgVmVyc2lvbj0yLjQuMS41NTUsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49NTVmNzEyNTIzNGJlYjU4OS4gIERPIE5PVCBFRElUIQ0KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjENCisjcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQorDQordXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM7DQordXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KK3VzaW5nIHBiZCA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCit1c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3Mgew0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlIHsNCisgIA0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gU3RhdGljIHZhcmlhYmxlcw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydF9JbXBvcnRNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0X0ltcG9ydE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIERlc2NyaXB0b3INCisgICAgcHVibGljIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOw0KKyAgICANCisgICAgc3RhdGljIFVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlKCkgew0KKyAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygNCisgICAgICAgICAgc3RyaW5nLkNvbmNhdCgNCisgICAgICAgICAgICAiQ2lWbmIyOW5iR1V2Y0hKdmRHOWlkV1l2ZFc1cGRIUmxjM1JmYVcxd2IzSjBMbkJ5YjNSdkVoaHdjbTkwIiwgDQorICAgICAgICAgICAgImIySjFabDkxYm1sMGRHVnpkRjlwYlhCdmNuUWFKR2R2YjJkc1pTOXdjbTkwYjJKMVppOWpjMmhoY25CZiIsIA0KKyAgICAgICAgICAgICJiM0IwYVc5dWN5NXdjbTkwYnlJYUNnMUpiWEJ2Y25STlpYTnpZV2RsRWdrS0FXUVlBU0FCS0FVcVBBb0siLCANCisgICAgICAgICAgICAiU1cxd2IzSjBSVzUxYlJJT0NncEpUVkJQVWxSZlJrOVBFQWNTRGdvS1NVMVFUMUpVWDBKQlVoQUlFZzRLIiwgDQorICAgICAgICAgICAgIkNrbE5VRTlTVkY5Q1FWb1FDVUpiQ2hoamIyMHVaMjl2WjJ4bExuQnliM1J2WW5WbUxuUmxjM1JJQWNJKyIsIA0KKyAgICAgICAgICAgICJQQW9oUjI5dloyeGxMbEJ5YjNSdlkyOXNRblZtWm1WeWN5NVVaWE4wVUhKdmRHOXpFaGRWYm1sMFZHVnoiLCANCisgICAgICAgICAgImRFbHRjRzl5ZEZCeWIzUnZSbWxzWlE9PSIpKTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyIGFzc2lnbmVyID0gZGVsZWdhdGUocGJkOjpGaWxlRGVzY3JpcHRvciByb290KSB7DQorICAgICAgICBkZXNjcmlwdG9yID0gcm9vdDsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0X0ltcG9ydE1lc3NhZ2VfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0X0ltcG9ydE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9pbXBvcnRfSW1wb3J0TWVzc2FnZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkQiLCB9KTsNCisgICAgICAgIHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IHBiOjpFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIHJldHVybiByZWdpc3RyeTsNCisgICAgICB9Ow0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKGRlc2NyaXB0b3JEYXRhLA0KKyAgICAgICAgICBuZXcgcGJkOjpGaWxlRGVzY3JpcHRvcltdIHsNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5EZXNjcmlwdG9yLCANCisgICAgICAgICAgfSwgYXNzaWduZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICB9DQorICAjcmVnaW9uIEVudW1zDQorICBwdWJsaWMgZW51bSBJbXBvcnRFbnVtIHsNCisgICAgSU1QT1JUX0ZPTyA9IDcsDQorICAgIElNUE9SVF9CQVIgPSA4LA0KKyAgICBJTVBPUlRfQkFaID0gOSwNCisgIH0NCisgIA0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorICAjcmVnaW9uIE1lc3NhZ2VzDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEltcG9ydE1lc3NhZ2UgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxJbXBvcnRNZXNzYWdlLCBJbXBvcnRNZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBJbXBvcnRNZXNzYWdlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEltcG9ydE1lc3NhZ2UgZGVmYXVsdEluc3RhbmNlID0gbmV3IEltcG9ydE1lc3NhZ2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2ltcG9ydE1lc3NhZ2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImQiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfaW1wb3J0TWVzc2FnZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEltcG9ydE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgSW1wb3J0TWVzc2FnZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEltcG9ydFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydF9JbXBvcnRNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEltcG9ydE1lc3NhZ2UsIEltcG9ydE1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0X0ltcG9ydE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEOw0KKyAgICBwcml2YXRlIGludCBkXzsNCisgICAgcHVibGljIGJvb2wgSGFzRCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0Q7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEQgew0KKyAgICAgIGdldCB7IHJldHVybiBkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfaW1wb3J0TWVzc2FnZUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0QpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzBdLCBEKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNEKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIEQpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydE1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgSW1wb3J0TWVzc2FnZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihJbXBvcnRNZXNzYWdlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPEltcG9ydE1lc3NhZ2UsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEltcG9ydE1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBJbXBvcnRNZXNzYWdlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIEltcG9ydE1lc3NhZ2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBJbXBvcnRNZXNzYWdlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgSW1wb3J0TWVzc2FnZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgSW1wb3J0TWVzc2FnZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgSW1wb3J0TWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgSW1wb3J0TWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgSW1wb3J0TWVzc2FnZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChJbXBvcnRNZXNzYWdlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oSW1wb3J0TWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRCkgew0KKyAgICAgICAgICBEID0gb3RoZXIuRDsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2ltcG9ydE1lc3NhZ2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfaW1wb3J0TWVzc2FnZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EOyB9DQorICAgICAgICBzZXQgeyBTZXREKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgSW1wb3J0TWVzc2FnZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgICNlbmRyZWdpb24NCisgIA0KK30NCisNCisjZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0TWVzc2FnZVNldFByb3RvRmlsZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdE1lc3NhZ2VTZXRQcm90b0ZpbGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EyODc1YwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdE1lc3NhZ2VTZXRQcm90b0ZpbGUuY3MKQEAgLTAsMCArMSwxODI2IEBACisvLyBHZW5lcmF0ZWQgYnkgUHJvdG9HZW4sIFZlcnNpb249Mi40LjEuNTU1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTU1ZjcxMjUyMzRiZWI1ODkuICBETyBOT1QgRURJVCENCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxDQorI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KKw0KK3VzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zIHsNCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBVbml0VGVzdE1lc3NhZ2VTZXRQcm90b0ZpbGUgew0KKyAgDQorICAgICNyZWdpb24gRXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbg0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgew0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEuTWVzc2FnZVNldEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5NZXNzYWdlU2V0RXh0ZW5zaW9uKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gU3RhdGljIHZhcmlhYmxlcw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNZXNzYWdlU2V0X19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWVzc2FnZVNldCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXQuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TWVzc2FnZVNldF9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNZXNzYWdlU2V0Q29udGFpbmVyX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWVzc2FnZVNldENvbnRhaW5lciwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TWVzc2FnZVNldENvbnRhaW5lcl9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjJfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfUmF3TWVzc2FnZVNldF9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmF3TWVzc2FnZVNldCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmF3TWVzc2FnZVNldC5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Jhd01lc3NhZ2VTZXRfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9SYXdNZXNzYWdlU2V0X0l0ZW1fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuVHlwZXMuSXRlbSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmF3TWVzc2FnZVNldC5UeXBlcy5JdGVtLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfUmF3TWVzc2FnZVNldF9JdGVtX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBEZXNjcmlwdG9yDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIHByaXZhdGUgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsNCisgICAgDQorICAgIHN0YXRpYyBVbml0VGVzdE1lc3NhZ2VTZXRQcm90b0ZpbGUoKSB7DQorICAgICAgYnl0ZVtdIGRlc2NyaXB0b3JEYXRhID0gZ2xvYmFsOjpTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKA0KKyAgICAgICAgICBzdHJpbmcuQ29uY2F0KA0KKyAgICAgICAgICAgICJDaU5uYjI5bmJHVXZjSEp2ZEc5aWRXWXZkVzVwZEhSbGMzUmZiWE5sZEM1d2NtOTBieElSY0hKdmRHOWkiLCANCisgICAgICAgICAgICAiZFdaZmRXNXBkSFJsYzNRYUpHZHZiMmRzWlM5d2NtOTBiMkoxWmk5amMyaGhjbkJmYjNCMGFXOXVjeTV3IiwgDQorICAgICAgICAgICAgImNtOTBieUllQ2c1VVpYTjBUV1Z6YzJGblpWTmxkQ29JQ0FRUWdJQ0FnQUk2QWdnQklsRUtGMVJsYzNSTiIsIA0KKyAgICAgICAgICAgICJaWE56WVdkbFUyVjBRMjl1ZEdGcGJtVnlFallLQzIxbGMzTmhaMlZmYzJWMEdBRWdBU2dMTWlFdWNISnYiLCANCisgICAgICAgICAgICAiZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEUxbGMzTmhaMlZUWlhRaWxnRUtHRlJsYzNSTlpYTnpZV2RsIiwgDQorICAgICAgICAgICAgIlUyVjBSWGgwWlc1emFXOXVNUklKQ2dGcEdBOGdBU2dGTW04S0ZXMWxjM05oWjJWZmMyVjBYMlY0ZEdWdSIsIA0KKyAgICAgICAgICAgICJjMmx2YmhJaExuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JOWlhOellXZGxVMlYwR0xDbVhpQUIiLCANCisgICAgICAgICAgICAiS0FzeUt5NXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wVFdWemMyRm5aVk5sZEVWNGRHVnVjMmx2IiwgDQorICAgICAgICAgICAgImJqRWltQUVLR0ZSbGMzUk5aWE56WVdkbFUyVjBSWGgwWlc1emFXOXVNaElMQ2dOemRISVlHU0FCS0FreSIsIA0KKyAgICAgICAgICAgICJid29WYldWemMyRm5aVjl6WlhSZlpYaDBaVzV6YVc5dUVpRXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXUiLCANCisgICAgICAgICAgICAiVkdWemRFMWxjM05oWjJWVFpYUVkrYnRlSUFFb0N6SXJMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsIiwgDQorICAgICAgICAgICAgImMzUk5aWE56WVdkbFUyVjBSWGgwWlc1emFXOXVNaUp1Q2cxU1lYZE5aWE56WVdkbFUyVjBFak1LQkdsMCIsIA0KKyAgICAgICAgICAgICJaVzBZQVNBREtBb3lKUzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVTWVhkTlpYTnpZV2RsVTJWMExrbDAiLCANCisgICAgICAgICAgICAiWlcwYUtBb0VTWFJsYlJJUENnZDBlWEJsWDJsa0dBSWdBaWdGRWc4S0IyMWxjM05oWjJVWUF5QUNLQXhDIiwgDQorICAgICAgICAgICAgIlJVZ0J3ajVBQ2lGSGIyOW5iR1V1VUhKdmRHOWpiMnhDZFdabVpYSnpMbFJsYzNSUWNtOTBiM01TRzFWdSIsIA0KKyAgICAgICAgICAiYVhSVVpYTjBUV1Z6YzJGblpWTmxkRkJ5YjNSdlJtbHNaUT09IikpOw0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgYXNzaWduZXIgPSBkZWxlZ2F0ZShwYmQ6OkZpbGVEZXNjcmlwdG9yIHJvb3QpIHsNCisgICAgICAgIGRlc2NyaXB0b3IgPSByb290Ow0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TWVzc2FnZVNldF9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TWVzc2FnZVNldF9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXQsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0LkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE1lc3NhZ2VTZXRfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TWVzc2FnZVNldENvbnRhaW5lcl9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TWVzc2FnZVNldENvbnRhaW5lcl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE1lc3NhZ2VTZXRDb250YWluZXJfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJNZXNzYWdlU2V0IiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzJdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiSSIsIH0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLk1lc3NhZ2VTZXRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1swXSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMl9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzNdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjJfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiU3RyIiwgfSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIuTWVzc2FnZVNldEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIuRGVzY3JpcHRvci5FeHRlbnNpb25zWzBdKTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfUmF3TWVzc2FnZVNldF9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzRdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9SYXdNZXNzYWdlU2V0X19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SYXdNZXNzYWdlU2V0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SYXdNZXNzYWdlU2V0LkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfUmF3TWVzc2FnZVNldF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkl0ZW0iLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfUmF3TWVzc2FnZVNldF9JdGVtX19EZXNjcmlwdG9yID0gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9SYXdNZXNzYWdlU2V0X19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9SYXdNZXNzYWdlU2V0X0l0ZW1fX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuVHlwZXMuSXRlbSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmF3TWVzc2FnZVNldC5UeXBlcy5JdGVtLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfUmF3TWVzc2FnZVNldF9JdGVtX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiVHlwZUlkIiwgIk1lc3NhZ2UiLCB9KTsNCisgICAgICAgIHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IHBiOjpFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIHJldHVybiByZWdpc3RyeTsNCisgICAgICB9Ow0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKGRlc2NyaXB0b3JEYXRhLA0KKyAgICAgICAgICBuZXcgcGJkOjpGaWxlRGVzY3JpcHRvcltdIHsNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5EZXNjcmlwdG9yLCANCisgICAgICAgICAgfSwgYXNzaWduZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICB9DQorICAjcmVnaW9uIE1lc3NhZ2VzDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RNZXNzYWdlU2V0IDogcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RNZXNzYWdlU2V0LCBUZXN0TWVzc2FnZVNldC5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdE1lc3NhZ2VTZXQoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdE1lc3NhZ2VTZXQgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RNZXNzYWdlU2V0KCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0TWVzc2FnZVNldEZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0TWVzc2FnZVNldEZpZWxkVGFncyA9IG5ldyB1aW50W10geyAgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RNZXNzYWdlU2V0IERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNZXNzYWdlU2V0IFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TWVzc2FnZVNldFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNZXNzYWdlU2V0X19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RNZXNzYWdlU2V0LCBUZXN0TWVzc2FnZVNldC5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RNZXNzYWdlU2V0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE1lc3NhZ2VTZXRfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaWYgKCFFeHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RNZXNzYWdlU2V0RmllbGROYW1lczsNCisgICAgICBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8VGVzdE1lc3NhZ2VTZXQsIFRlc3RNZXNzYWdlU2V0LkJ1aWxkZXI+LkV4dGVuc2lvbldyaXRlciBleHRlbnNpb25Xcml0ZXIgPSBDcmVhdGVFeHRlbnNpb25Xcml0ZXIodGhpcyk7DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoNTM2ODcwOTEyLCBvdXRwdXQpOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVBc01lc3NhZ2VTZXRUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IEV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZTsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQ7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VTZXQgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlU2V0IFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlU2V0IFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlU2V0IFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlU2V0IFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlU2V0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlU2V0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RNZXNzYWdlU2V0IE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RNZXNzYWdlU2V0IHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpFeHRlbmRhYmxlQnVpbGRlcjxUZXN0TWVzc2FnZVNldCwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdE1lc3NhZ2VTZXQgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0TWVzc2FnZVNldCByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0TWVzc2FnZVNldCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RNZXNzYWdlU2V0IG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdE1lc3NhZ2VTZXQoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNZXNzYWdlU2V0IE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXQuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE1lc3NhZ2VTZXQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXQuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TWVzc2FnZVNldCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdE1lc3NhZ2VTZXQpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdE1lc3NhZ2VTZXQpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0TWVzc2FnZVNldCBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0LkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICB0aGlzLk1lcmdlRXh0ZW5zaW9uRmllbGRzKG90aGVyKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RNZXNzYWdlU2V0RmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RNZXNzYWdlU2V0RmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdE1lc3NhZ2VTZXQoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdE1lc3NhZ2VTZXRQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0TWVzc2FnZVNldENvbnRhaW5lciA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RNZXNzYWdlU2V0Q29udGFpbmVyLCBUZXN0TWVzc2FnZVNldENvbnRhaW5lci5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdE1lc3NhZ2VTZXRDb250YWluZXIoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdE1lc3NhZ2VTZXRDb250YWluZXIgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RNZXNzYWdlU2V0Q29udGFpbmVyKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0TWVzc2FnZVNldENvbnRhaW5lckZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAibWVzc2FnZV9zZXQiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdE1lc3NhZ2VTZXRDb250YWluZXJGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldENvbnRhaW5lciBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RNZXNzYWdlU2V0Q29udGFpbmVyIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNZXNzYWdlU2V0Q29udGFpbmVyIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TWVzc2FnZVNldFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNZXNzYWdlU2V0Q29udGFpbmVyX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RNZXNzYWdlU2V0Q29udGFpbmVyLCBUZXN0TWVzc2FnZVNldENvbnRhaW5lci5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RNZXNzYWdlU2V0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE1lc3NhZ2VTZXRDb250YWluZXJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE1lc3NhZ2VTZXRGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNNZXNzYWdlU2V0Ow0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2VTZXRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNNZXNzYWdlU2V0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTWVzc2FnZVNldDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWVzc2FnZVNldCBNZXNzYWdlU2V0IHsNCisgICAgICBnZXQgeyByZXR1cm4gbWVzc2FnZVNldF8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXQuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0TWVzc2FnZVNldENvbnRhaW5lckZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc01lc3NhZ2VTZXQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMSwgZmllbGRfbmFtZXNbMF0sIE1lc3NhZ2VTZXQpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc01lc3NhZ2VTZXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxLCBNZXNzYWdlU2V0KTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VTZXRDb250YWluZXIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VTZXRDb250YWluZXIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VTZXRDb250YWluZXIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlU2V0Q29udGFpbmVyIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldENvbnRhaW5lciBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldENvbnRhaW5lciBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldENvbnRhaW5lciBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldENvbnRhaW5lciBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldENvbnRhaW5lciBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldENvbnRhaW5lciBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0TWVzc2FnZVNldENvbnRhaW5lciBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0TWVzc2FnZVNldENvbnRhaW5lciBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0TWVzc2FnZVNldENvbnRhaW5lciwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdE1lc3NhZ2VTZXRDb250YWluZXIgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0TWVzc2FnZVNldENvbnRhaW5lciByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0TWVzc2FnZVNldENvbnRhaW5lciBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RNZXNzYWdlU2V0Q29udGFpbmVyIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdE1lc3NhZ2VTZXRDb250YWluZXIoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNZXNzYWdlU2V0Q29udGFpbmVyIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE1lc3NhZ2VTZXRDb250YWluZXIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TWVzc2FnZVNldENvbnRhaW5lciBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdE1lc3NhZ2VTZXRDb250YWluZXIpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdE1lc3NhZ2VTZXRDb250YWluZXIpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0TWVzc2FnZVNldENvbnRhaW5lciBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc01lc3NhZ2VTZXQpIHsNCisgICAgICAgICAgTWVyZ2VNZXNzYWdlU2V0KG90aGVyLk1lc3NhZ2VTZXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdE1lc3NhZ2VTZXRDb250YWluZXJGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdE1lc3NhZ2VTZXRDb250YWluZXJGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0LkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0LkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzTWVzc2FnZVNldCkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShNZXNzYWdlU2V0KTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIE1lc3NhZ2VTZXQgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc01lc3NhZ2VTZXQgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc01lc3NhZ2VTZXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0IE1lc3NhZ2VTZXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5NZXNzYWdlU2V0OyB9DQorICAgICAgICBzZXQgeyBTZXRNZXNzYWdlU2V0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRNZXNzYWdlU2V0KGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0IHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNZXNzYWdlU2V0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5tZXNzYWdlU2V0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE1lc3NhZ2VTZXQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZVNldCA9IHRydWU7DQorICAgICAgICByZXN1bHQubWVzc2FnZVNldF8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU1lc3NhZ2VTZXQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXQgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNNZXNzYWdlU2V0ICYmDQorICAgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VTZXRfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0LkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5tZXNzYWdlU2V0XyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0LkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm1lc3NhZ2VTZXRfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VTZXRfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZVNldCA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJNZXNzYWdlU2V0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNZXNzYWdlU2V0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubWVzc2FnZVNldF8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0TWVzc2FnZVNldENvbnRhaW5lcigpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TWVzc2FnZVNldFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSwgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiaSIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTIwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdE1lc3NhZ2VTZXRQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLCBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TWVzc2FnZVNldFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTWVzc2FnZVNldEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTU0NTAwODsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE+IE1lc3NhZ2VTZXRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgSUZpZWxkTnVtYmVyID0gMTU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNJOw0KKyAgICBwcml2YXRlIGludCBpXzsNCisgICAgcHVibGljIGJvb2wgSGFzSSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0k7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEkgew0KKyAgICAgIGdldCB7IHJldHVybiBpXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzSSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTUsIGZpZWxkX25hbWVzWzBdLCBJKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNJKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDE1LCBJKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0kpIHsNCisgICAgICAgICAgSSA9IG90aGVyLkk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEyMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0kgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5pXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzSSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0k7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBJIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0SSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0SShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSSA9IHRydWU7DQorICAgICAgICByZXN1bHQuaV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0kgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5pXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TWVzc2FnZVNldFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiwgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMkZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAic3RyIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMkZpZWxkVGFncyA9IG5ldyB1aW50W10geyAyMDIgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TWVzc2FnZVNldFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMl9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIsIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RNZXNzYWdlU2V0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBNZXNzYWdlU2V0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxNTQ3NzY5Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMj4gTWVzc2FnZVNldEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBTdHJGaWVsZE51bWJlciA9IDI1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzU3RyOw0KKyAgICBwcml2YXRlIHN0cmluZyBzdHJfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc1N0ciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1N0cjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgU3RyIHsNCisgICAgICBnZXQgeyByZXR1cm4gc3RyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzU3RyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMjUsIGZpZWxkX25hbWVzWzBdLCBTdHIpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc1N0cikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMjUsIFN0cik7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMikgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNTdHIpIHsNCisgICAgICAgICAgU3RyID0gb3RoZXIuU3RyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMkZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMDI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNTdHIgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuc3RyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzU3RyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzU3RyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgU3RyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuU3RyOyB9DQorICAgICAgICBzZXQgeyBTZXRTdHIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFN0cihzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1N0ciA9IHRydWU7DQorICAgICAgICByZXN1bHQuc3RyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyU3RyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTdHIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5zdHJfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMigpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TWVzc2FnZVNldFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFJhd01lc3NhZ2VTZXQgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxSYXdNZXNzYWdlU2V0LCBSYXdNZXNzYWdlU2V0LkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBSYXdNZXNzYWdlU2V0KCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJhd01lc3NhZ2VTZXQgZGVmYXVsdEluc3RhbmNlID0gbmV3IFJhd01lc3NhZ2VTZXQoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Jhd01lc3NhZ2VTZXRGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIml0ZW0iIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfcmF3TWVzc2FnZVNldEZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMSB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFJhd01lc3NhZ2VTZXQgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBSYXdNZXNzYWdlU2V0IERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFJhd01lc3NhZ2VTZXQgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RNZXNzYWdlU2V0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfUmF3TWVzc2FnZVNldF9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxSYXdNZXNzYWdlU2V0LCBSYXdNZXNzYWdlU2V0LkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdE1lc3NhZ2VTZXRQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9SYXdNZXNzYWdlU2V0X19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMNCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsNCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBJdGVtIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8SXRlbSwgSXRlbS5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIEl0ZW0oKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEl0ZW0gZGVmYXVsdEluc3RhbmNlID0gbmV3IEl0ZW0oKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9pdGVtRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJtZXNzYWdlIiwgInR5cGVfaWQiIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2l0ZW1GaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMjYsIDE2IH07DQorICAgICAgICBwdWJsaWMgc3RhdGljIEl0ZW0gRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSXRlbSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgSXRlbSBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TWVzc2FnZVNldFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Jhd01lc3NhZ2VTZXRfSXRlbV9fRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxJdGVtLCBJdGVtLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RNZXNzYWdlU2V0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfUmF3TWVzc2FnZVNldF9JdGVtX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBUeXBlSWRGaWVsZE51bWJlciA9IDI7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzVHlwZUlkOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgdHlwZUlkXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc1R5cGVJZCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNUeXBlSWQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgVHlwZUlkIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHR5cGVJZF87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBNZXNzYWdlRmllbGROdW1iZXIgPSAzOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc01lc3NhZ2U7DQorICAgICAgICBwcml2YXRlIHBiOjpCeXRlU3RyaW5nIG1lc3NhZ2VfID0gcGI6OkJ5dGVTdHJpbmcuRW1wdHk7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc01lc3NhZ2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIG1lc3NhZ2VfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGlmICghaGFzVHlwZUlkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgaWYgKCFoYXNNZXNzYWdlKSByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfaXRlbUZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNUeXBlSWQpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyLCBmaWVsZF9uYW1lc1sxXSwgVHlwZUlkKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzTWVzc2FnZSkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKDMsIGZpZWxkX25hbWVzWzBdLCBNZXNzYWdlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgDQorICAgICAgICAgIHNpemUgPSAwOw0KKyAgICAgICAgICBpZiAoaGFzVHlwZUlkKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyLCBUeXBlSWQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNNZXNzYWdlKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJ5dGVzU2l6ZSgzLCBNZXNzYWdlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSXRlbSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBJdGVtIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEl0ZW0gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEl0ZW0gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEl0ZW0gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSXRlbSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBJdGVtIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEl0ZW0gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSXRlbSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBJdGVtIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIEl0ZW0gTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKEl0ZW0gcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxJdGVtLCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKEl0ZW0gY2xvbmVGcm9tKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICAgICAgcHJpdmF0ZSBJdGVtIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgSXRlbSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgSXRlbSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJdGVtKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEl0ZW0gTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmF3TWVzc2FnZVNldC5UeXBlcy5JdGVtLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEl0ZW0gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuVHlwZXMuSXRlbS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEl0ZW0gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGlzIEl0ZW0pIHsNCisgICAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEl0ZW0pIG90aGVyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oSXRlbSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SYXdNZXNzYWdlU2V0LlR5cGVzLkl0ZW0uRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNUeXBlSWQpIHsNCisgICAgICAgICAgICAgIFR5cGVJZCA9IG90aGVyLlR5cGVJZDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc01lc3NhZ2UpIHsNCisgICAgICAgICAgICAgIE1lc3NhZ2UgPSBvdGhlci5NZXNzYWdlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9pdGVtRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgICAgICB0YWcgPSBfaXRlbUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDE2OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc1R5cGVJZCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LnR5cGVJZF8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMjY6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzTWVzc2FnZSA9IGlucHV0LlJlYWRCeXRlcyhyZWYgcmVzdWx0Lm1lc3NhZ2VfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICANCisgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzVHlwZUlkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1R5cGVJZDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgVHlwZUlkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlR5cGVJZDsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldFR5cGVJZCh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRUeXBlSWQoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzVHlwZUlkID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQudHlwZUlkXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVHlwZUlkKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc1R5cGVJZCA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC50eXBlSWRfID0gMDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzTWVzc2FnZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNNZXNzYWdlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIE1lc3NhZ2Ugew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTWVzc2FnZTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldE1lc3NhZ2UodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TWVzc2FnZShwYjo6Qnl0ZVN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzTWVzc2FnZSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJNZXNzYWdlKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc01lc3NhZ2UgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQubWVzc2FnZV8gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIEl0ZW0oKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RNZXNzYWdlU2V0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEl0ZW1GaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmF3TWVzc2FnZVNldC5UeXBlcy5JdGVtPiBpdGVtXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SYXdNZXNzYWdlU2V0LlR5cGVzLkl0ZW0+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuVHlwZXMuSXRlbT4gSXRlbUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBpdGVtXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgSXRlbUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gaXRlbV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmF3TWVzc2FnZVNldC5UeXBlcy5JdGVtIEdldEl0ZW0oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGl0ZW1fW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Jhd01lc3NhZ2VTZXRGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChpdGVtXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUdyb3VwQXJyYXkoMSwgZmllbGRfbmFtZXNbMF0sIGl0ZW1fKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuVHlwZXMuSXRlbSBlbGVtZW50IGluIEl0ZW1MaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlR3JvdXBTaXplKDEsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSYXdNZXNzYWdlU2V0IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJhd01lc3NhZ2VTZXQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmF3TWVzc2FnZVNldCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmF3TWVzc2FnZVNldCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmF3TWVzc2FnZVNldCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSYXdNZXNzYWdlU2V0IFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJhd01lc3NhZ2VTZXQgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmF3TWVzc2FnZVNldCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSYXdNZXNzYWdlU2V0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJhd01lc3NhZ2VTZXQgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgUmF3TWVzc2FnZVNldCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgaXRlbV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihSYXdNZXNzYWdlU2V0IHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFJhd01lc3NhZ2VTZXQsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFJhd01lc3NhZ2VTZXQgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBSYXdNZXNzYWdlU2V0IHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFJhd01lc3NhZ2VTZXQgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBSYXdNZXNzYWdlU2V0IG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgUmF3TWVzc2FnZVNldCgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgUmF3TWVzc2FnZVNldCBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmF3TWVzc2FnZVNldCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SYXdNZXNzYWdlU2V0LkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmF3TWVzc2FnZVNldCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgUmF3TWVzc2FnZVNldCkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChSYXdNZXNzYWdlU2V0KSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oUmF3TWVzc2FnZVNldCBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuaXRlbV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQuaXRlbV8uQWRkKG90aGVyLml0ZW1fKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Jhd01lc3NhZ2VTZXRGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfcmF3TWVzc2FnZVNldEZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEdyb3VwQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuaXRlbV8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuVHlwZXMuSXRlbS5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuVHlwZXMuSXRlbT4gSXRlbUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuaXRlbV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBJdGVtQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5JdGVtQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuVHlwZXMuSXRlbSBHZXRJdGVtKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRJdGVtKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0SXRlbShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuVHlwZXMuSXRlbSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaXRlbV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0SXRlbShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuVHlwZXMuSXRlbS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5pdGVtX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRJdGVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuVHlwZXMuSXRlbSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaXRlbV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRJdGVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuVHlwZXMuSXRlbS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5pdGVtXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlSXRlbShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJhd01lc3NhZ2VTZXQuVHlwZXMuSXRlbT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lml0ZW1fLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFySXRlbSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaXRlbV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgUmF3TWVzc2FnZVNldCgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TWVzc2FnZVNldFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCit9DQorDQorI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdE5vR2VuZXJpY1NlcnZpY2VzUHJvdG9GaWxlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0Tm9HZW5lcmljU2VydmljZXNQcm90b0ZpbGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmMjFjMwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdE5vR2VuZXJpY1NlcnZpY2VzUHJvdG9GaWxlLmNzCkBAIC0wLDAgKzEsMzY4IEBACisvLyBHZW5lcmF0ZWQgYnkgUHJvdG9HZW4sIFZlcnNpb249Mi40LjEuNTU1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTU1ZjcxMjUyMzRiZWI1ODkuICBETyBOT1QgRURJVCENCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxDQorI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KKw0KK3VzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk5vR2VuZXJpY1NlcnZpY2Ugew0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXRUZXN0Tm9HZW5lcmljU2VydmljZXNQcm90b0ZpbGUgew0KKyAgDQorICAgICNyZWdpb24gRXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbg0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgew0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Ob0dlbmVyaWNTZXJ2aWNlLlVuaXRUZXN0Tm9HZW5lcmljU2VydmljZXNQcm90b0ZpbGUuVGVzdEV4dGVuc2lvbik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbnMNCisgICAgcHVibGljIGNvbnN0IGludCBUZXN0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxMDAwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGludD4gVGVzdEV4dGVuc2lvbjsNCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgI3JlZ2lvbiBTdGF0aWMgdmFyaWFibGVzDQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX25vX2dlbmVyaWNfc2VydmljZXNfdGVzdF9UZXN0TWVzc2FnZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuTm9HZW5lcmljU2VydmljZS5UZXN0TWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuTm9HZW5lcmljU2VydmljZS5UZXN0TWVzc2FnZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9ub19nZW5lcmljX3NlcnZpY2VzX3Rlc3RfVGVzdE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIERlc2NyaXB0b3INCisgICAgcHVibGljIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOw0KKyAgICANCisgICAgc3RhdGljIFVuaXRUZXN0Tm9HZW5lcmljU2VydmljZXNQcm90b0ZpbGUoKSB7DQorICAgICAgYnl0ZVtdIGRlc2NyaXB0b3JEYXRhID0gZ2xvYmFsOjpTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKA0KKyAgICAgICAgICBzdHJpbmcuQ29uY2F0KA0KKyAgICAgICAgICAgICJDakpuYjI5bmJHVXZjSEp2ZEc5aWRXWXZkVzVwZEhSbGMzUmZibTlmWjJWdVpYSnBZMTl6WlhKMmFXTmwiLCANCisgICAgICAgICAgICAiY3k1d2NtOTBieElvWjI5dloyeGxMbkJ5YjNSdlluVm1MbTV2WDJkbGJtVnlhV05mYzJWeWRtbGpaWE5mIiwgDQorICAgICAgICAgICAgImRHVnpkQm9rWjI5dloyeGxMM0J5YjNSdlluVm1MMk56YUdGeWNGOXZjSFJwYjI1ekxuQnliM1J2SWlNSyIsIA0KKyAgICAgICAgICAgICJDMVJsYzNSTlpYTnpZV2RsRWdrS0FXRVlBU0FCS0FVcUNRam9CeENBZ0lDQUFpb1RDZ2hVWlhOMFJXNTEiLCANCisgICAgICAgICAgICAiYlJJSENnTkdUMDhRQVRLQ0FRb0xWR1Z6ZEZObGNuWnBZMlVTY3dvRFJtOXZFalV1WjI5dloyeGxMbkJ5IiwgDQorICAgICAgICAgICAgImIzUnZZblZtTG01dlgyZGxibVZ5YVdOZmMyVnlkbWxqWlhOZmRHVnpkQzVVWlhOMFRXVnpjMkZuWlJvMSIsIA0KKyAgICAgICAgICAgICJMbWR2YjJkc1pTNXdjbTkwYjJKMVppNXViMTluWlc1bGNtbGpYM05sY25acFkyVnpYM1JsYzNRdVZHVnoiLCANCisgICAgICAgICAgICAiZEUxbGMzTmhaMlU2VGdvT2RHVnpkRjlsZUhSbGJuTnBiMjRTTlM1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1IiwgDQorICAgICAgICAgICAgImJtOWZaMlZ1WlhKcFkxOXpaWEoyYVdObGMxOTBaWE4wTGxSbGMzUk5aWE56WVdkbEdPZ0hJQUVvQlVKYiIsIA0KKyAgICAgICAgICAgICJ3ajVZQ2pKSGIyOW5iR1V1VUhKdmRHOWpiMnhDZFdabVpYSnpMbFJsYzNSUWNtOTBiM011VG05SFpXNWwiLCANCisgICAgICAgICAgICAiY21salUyVnlkbWxqWlJJaVZXNXBkRlJsYzNST2IwZGxibVZ5YVdOVFpYSjJhV05sYzFCeWIzUnZSbWxzIiwgDQorICAgICAgICAgICJaUT09IikpOw0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgYXNzaWduZXIgPSBkZWxlZ2F0ZShwYmQ6OkZpbGVEZXNjcmlwdG9yIHJvb3QpIHsNCisgICAgICAgIGRlc2NyaXB0b3IgPSByb290Ow0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfbm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0X1Rlc3RNZXNzYWdlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9ub19nZW5lcmljX3NlcnZpY2VzX3Rlc3RfVGVzdE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk5vR2VuZXJpY1NlcnZpY2UuVGVzdE1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk5vR2VuZXJpY1NlcnZpY2UuVGVzdE1lc3NhZ2UuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfbm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0X1Rlc3RNZXNzYWdlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQSIsIH0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuTm9HZW5lcmljU2VydmljZS5Vbml0VGVzdE5vR2VuZXJpY1NlcnZpY2VzUHJvdG9GaWxlLlRlc3RFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuTm9HZW5lcmljU2VydmljZS5Vbml0VGVzdE5vR2VuZXJpY1NlcnZpY2VzUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1swXSk7DQorICAgICAgICBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICByZXR1cm4gcmVnaXN0cnk7DQorICAgICAgfTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbShkZXNjcmlwdG9yRGF0YSwNCisgICAgICAgICAgbmV3IHBiZDo6RmlsZURlc2NyaXB0b3JbXSB7DQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuRGVzY3JpcHRvciwgDQorICAgICAgICAgIH0sIGFzc2lnbmVyKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgfQ0KKyAgI3JlZ2lvbiBFbnVtcw0KKyAgcHVibGljIGVudW0gVGVzdEVudW0gew0KKyAgICBGT08gPSAxLA0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCisgICNyZWdpb24gTWVzc2FnZXMNCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdE1lc3NhZ2UgOiBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8VGVzdE1lc3NhZ2UsIFRlc3RNZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0TWVzc2FnZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0TWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdE1lc3NhZ2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RNZXNzYWdlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RNZXNzYWdlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDggfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNZXNzYWdlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk5vR2VuZXJpY1NlcnZpY2UuVW5pdFRlc3ROb0dlbmVyaWNTZXJ2aWNlc1Byb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9ub19nZW5lcmljX3NlcnZpY2VzX3Rlc3RfVGVzdE1lc3NhZ2VfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdE1lc3NhZ2UsIFRlc3RNZXNzYWdlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Ob0dlbmVyaWNTZXJ2aWNlLlVuaXRUZXN0Tm9HZW5lcmljU2VydmljZXNQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfbm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0X1Rlc3RNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBBRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzQTsNCisgICAgcHJpdmF0ZSBpbnQgYV87DQorICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNBOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBBIHsNCisgICAgICBnZXQgeyByZXR1cm4gYV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmICghRXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0TWVzc2FnZUZpZWxkTmFtZXM7DQorICAgICAgcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RNZXNzYWdlLCBUZXN0TWVzc2FnZS5CdWlsZGVyPi5FeHRlbnNpb25Xcml0ZXIgZXh0ZW5zaW9uV3JpdGVyID0gQ3JlYXRlRXh0ZW5zaW9uV3JpdGVyKHRoaXMpOw0KKyAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgQSk7DQorICAgICAgfQ0KKyAgICAgIGV4dGVuc2lvbldyaXRlci5Xcml0ZVVudGlsKDUzNjg3MDkxMiwgb3V0cHV0KTsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgQSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdE1lc3NhZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdE1lc3NhZ2UgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkV4dGVuZGFibGVCdWlsZGVyPFRlc3RNZXNzYWdlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0TWVzc2FnZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RNZXNzYWdlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RNZXNzYWdlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdE1lc3NhZ2Ugb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0TWVzc2FnZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdE1lc3NhZ2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Ob0dlbmVyaWNTZXJ2aWNlLlRlc3RNZXNzYWdlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk5vR2VuZXJpY1NlcnZpY2UuVGVzdE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdE1lc3NhZ2UpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdE1lc3NhZ2UpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0TWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk5vR2VuZXJpY1NlcnZpY2UuVGVzdE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzQSkgew0KKyAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgIH0NCisgICAgICAgICAgdGhpcy5NZXJnZUV4dGVuc2lvbkZpZWxkcyhvdGhlcik7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0TWVzc2FnZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0TWVzc2FnZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzQSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BOyB9DQorICAgICAgICBzZXQgeyBTZXRBKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRBKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdE1lc3NhZ2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Ob0dlbmVyaWNTZXJ2aWNlLlVuaXRUZXN0Tm9HZW5lcmljU2VydmljZXNQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorICAjcmVnaW9uIFNlcnZpY2VzDQorICAvKg0KKyAgKiBTZXJ2aWNlIGdlbmVyYXRpb24gaXMgbm93IGRpc2FibGVkIGJ5IGRlZmF1bHQsIHVzZSB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBlbmFibGU6DQorICAqIG9wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLnNlcnZpY2VfZ2VuZXJhdG9yX3R5cGUgPSBHRU5FUklDOw0KKyAgKi8NCisgICNlbmRyZWdpb24NCisgIA0KK30NCisNCisjZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0T3B0aW1pemVGb3JQcm90b0ZpbGUuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RPcHRpbWl6ZUZvclByb3RvRmlsZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWI0NWMwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0T3B0aW1pemVGb3JQcm90b0ZpbGUuY3MKQEAgLTAsMCArMSw2NTkgQEAKKy8vIEdlbmVyYXRlZCBieSBQcm90b0dlbiwgVmVyc2lvbj0yLjQuMS41NTUsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49NTVmNzEyNTIzNGJlYjU4OS4gIERPIE5PVCBFRElUIQ0KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjENCisjcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQorDQordXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM7DQordXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KK3VzaW5nIHBiZCA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCit1c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3Mgew0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXRUZXN0T3B0aW1pemVGb3JQcm90b0ZpbGUgew0KKyAgDQorICAgICNyZWdpb24gRXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbg0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgew0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW1pemVkRm9yU2l6ZS5UZXN0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE9wdGltaXplZEZvclNpemUuVGVzdEV4dGVuc2lvbjIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBTdGF0aWMgdmFyaWFibGVzDQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE9wdGltaXplZEZvclNpemVfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RPcHRpbWl6ZWRGb3JTaXplLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW1pemVkRm9yU2l6ZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RPcHRpbWl6ZWRGb3JTaXplX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemVfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gRGVzY3JpcHRvcg0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3I7DQorICAgIA0KKyAgICBzdGF0aWMgVW5pdFRlc3RPcHRpbWl6ZUZvclByb3RvRmlsZSgpIHsNCisgICAgICBieXRlW10gZGVzY3JpcHRvckRhdGEgPSBnbG9iYWw6OlN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoDQorICAgICAgICAgIHN0cmluZy5Db25jYXQoDQorICAgICAgICAgICAgIkNpdG5iMjluYkdVdmNISnZkRzlpZFdZdmRXNXBkSFJsYzNSZmIzQjBhVzFwZW1WZlptOXlMbkJ5YjNSdiIsIA0KKyAgICAgICAgICAgICJFaEZ3Y205MGIySjFabDkxYm1sMGRHVnpkQm9rWjI5dloyeGxMM0J5YjNSdlluVm1MMk56YUdGeWNGOXYiLCANCisgICAgICAgICAgICAiY0hScGIyNXpMbkJ5YjNSdkdoNW5iMjluYkdVdmNISnZkRzlpZFdZdmRXNXBkSFJsYzNRdWNISnZkRzhpIiwgDQorICAgICAgICAgICAgImtnSUtGRlJsYzNSUGNIUnBiV2w2WldSR2IzSlRhWHBsRWdrS0FXa1lBU0FCS0FVU0xnb0RiWE5uR0JNZyIsIA0KKyAgICAgICAgICAgICJBU2dMTWlFdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVJtOXlaV2xuYmsxbGMzTmhaMlVxQ1Fqb0J4Q0EiLCANCisgICAgICAgICAgICAiZ0lDQUFqSkFDZzUwWlhOMFgyVjRkR1Z1YzJsdmJoSW5MbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsIiwgDQorICAgICAgICAgICAgImMzUlBjSFJwYldsNlpXUkdiM0pUYVhwbEdOSUpJQUVvQlRKeUNnOTBaWE4wWDJWNGRHVnVjMmx2YmpJUyIsIA0KKyAgICAgICAgICAgICJKeTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFQzQjBhVzFwZW1Wa1JtOXlVMmw2WlJqVENTQUIiLCANCisgICAgICAgICAgICAiS0FzeUx5NXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wVW1WeGRXbHlaV1JQY0hScGJXbDZaV1JHIiwgDQorICAgICAgICAgICAgImIzSlRhWHBsSWlrS0hGUmxjM1JTWlhGMWFYSmxaRTl3ZEdsdGFYcGxaRVp2Y2xOcGVtVVNDUW9CZUJnQiIsIA0KKyAgICAgICAgICAgICJJQUlvQlNKYUNoeFVaWE4wVDNCMGFXOXVZV3hQY0hScGJXbDZaV1JHYjNKVGFYcGxFam9LQVc4WUFTQUIiLCANCisgICAgICAgICAgICAiS0FzeUx5NXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wVW1WeGRXbHlaV1JQY0hScGJXbDZaV1JHIiwgDQorICAgICAgICAgICAgImIzSlRhWHBsUWtaSUFzSStRUW9oUjI5dloyeGxMbEJ5YjNSdlkyOXNRblZtWm1WeWN5NVVaWE4wVUhKdiIsIA0KKyAgICAgICAgICAiZEc5ekVoeFZibWwwVkdWemRFOXdkR2x0YVhwbFJtOXlVSEp2ZEc5R2FXeGwiKSk7DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciBhc3NpZ25lciA9IGRlbGVnYXRlKHBiZDo6RmlsZURlc2NyaXB0b3Igcm9vdCkgew0KKyAgICAgICAgZGVzY3JpcHRvciA9IHJvb3Q7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RPcHRpbWl6ZWRGb3JTaXplX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RPcHRpbWl6ZWRGb3JTaXplX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW1pemVkRm9yU2l6ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE9wdGltaXplZEZvclNpemUuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0T3B0aW1pemVkRm9yU2l6ZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkkiLCAiTXNnIiwgfSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW1pemVkRm9yU2l6ZS5UZXN0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RPcHRpbWl6ZWRGb3JTaXplLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1swXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW1pemVkRm9yU2l6ZS5UZXN0RXh0ZW5zaW9uMiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE9wdGltaXplZEZvclNpemUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzFdKTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIlgiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzJdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIk8iLCB9KTsNCisgICAgICAgIHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IHBiOjpFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICByZXR1cm4gcmVnaXN0cnk7DQorICAgICAgfTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbShkZXNjcmlwdG9yRGF0YSwNCisgICAgICAgICAgbmV3IHBiZDo6RmlsZURlc2NyaXB0b3JbXSB7DQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuRGVzY3JpcHRvciwgDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIA0KKyAgICAgICAgICB9LCBhc3NpZ25lcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgIH0NCisgICNyZWdpb24gTWVzc2FnZXMNCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdE9wdGltaXplZEZvclNpemUgOiBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8VGVzdE9wdGltaXplZEZvclNpemUsIFRlc3RPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0T3B0aW1pemVkRm9yU2l6ZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0T3B0aW1pemVkRm9yU2l6ZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdE9wdGltaXplZEZvclNpemUoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0T3B0aW1pemVkRm9yU2l6ZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RPcHRpbWl6ZWRGb3JTaXplIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RPcHRpbWl6ZWRGb3JTaXplIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0T3B0aW1pemVGb3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0T3B0aW1pemVkRm9yU2l6ZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0T3B0aW1pemVkRm9yU2l6ZSwgVGVzdE9wdGltaXplZEZvclNpemUuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0T3B0aW1pemVGb3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0T3B0aW1pemVkRm9yU2l6ZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVGVzdEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTIzNDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxpbnQ+IFRlc3RFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgVGVzdEV4dGVuc2lvbjJGaWVsZE51bWJlciA9IDEyMzU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZT4gVGVzdEV4dGVuc2lvbjI7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgSUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0k7DQorICAgIHByaXZhdGUgaW50IGlfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNJIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzSTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgSSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTXNnRmllbGROdW1iZXIgPSAxOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc01zZzsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBtc2dfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNNc2cgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNNc2c7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgTXNnIHsNCisgICAgICBnZXQgeyByZXR1cm4gbXNnXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBUZXN0T3B0aW1pemVkRm9yU2l6ZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0T3B0aW1pemVkRm9yU2l6ZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0T3B0aW1pemVkRm9yU2l6ZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE9wdGltaXplZEZvclNpemUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RPcHRpbWl6ZWRGb3JTaXplIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RPcHRpbWl6ZWRGb3JTaXplIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpFeHRlbmRhYmxlQnVpbGRlcjxUZXN0T3B0aW1pemVkRm9yU2l6ZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdE9wdGltaXplZEZvclNpemUgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0T3B0aW1pemVkRm9yU2l6ZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0T3B0aW1pemVkRm9yU2l6ZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RPcHRpbWl6ZWRGb3JTaXplIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdE9wdGltaXplZEZvclNpemUoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RPcHRpbWl6ZWRGb3JTaXplIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE9wdGltaXplZEZvclNpemUuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE9wdGltaXplZEZvclNpemUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE9wdGltaXplZEZvclNpemUuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0T3B0aW1pemVkRm9yU2l6ZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNJIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzSTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5JOyB9DQorICAgICAgICBzZXQgeyBTZXRJKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRJKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5pXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFySSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNNc2cgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc01zZzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgTXNnIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTXNnOyB9DQorICAgICAgICBzZXQgeyBTZXRNc2codmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE1zZyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTXNnID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5tc2dfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TXNnKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc01zZyA9IHRydWU7DQorICAgICAgICByZXN1bHQubXNnXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlTXNnKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzTXNnICYmDQorICAgICAgICAgICAgcmVzdWx0Lm1zZ18gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm1zZ18gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5DcmVhdGVCdWlsZGVyKHJlc3VsdC5tc2dfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm1zZ18gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNNc2cgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTXNnKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNc2cgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5tc2dfID0gbnVsbDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdE9wdGltaXplZEZvclNpemUoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdE9wdGltaXplRm9yUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUsIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RPcHRpbWl6ZUZvclByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemVfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSwgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RPcHRpbWl6ZUZvclByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemVfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFhGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNYOw0KKyAgICBwcml2YXRlIGludCB4XzsNCisgICAgcHVibGljIGJvb2wgSGFzWCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1g7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFggew0KKyAgICAgIGdldCB7IHJldHVybiB4XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1ggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNYOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgWCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Llg7IH0NCisgICAgICAgIHNldCB7IFNldFgodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFgoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ggPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnhfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJYKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNYID0gZmFsc2U7DQorICAgICAgICByZXN1bHQueF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RPcHRpbWl6ZUZvclByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLCBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0T3B0aW1pemVGb3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUsIFRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0T3B0aW1pemVGb3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzTzsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIG9fOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIE8gew0KKyAgICAgIGdldCB7IHJldHVybiBvXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc08gew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc087IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgTyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk87IH0NCisgICAgICAgIHNldCB7IFNldE8odmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE8oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTyA9IHRydWU7DQorICAgICAgICByZXN1bHQub18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTyA9IHRydWU7DQorICAgICAgICByZXN1bHQub18gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU8oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc08gJiYNCisgICAgICAgICAgICByZXN1bHQub18gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQub18gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplLkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm9fKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm9fID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzTyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub18gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RPcHRpbWl6ZUZvclByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCit9DQorDQorI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdFByb3RvRmlsZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdFByb3RvRmlsZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDMxYzY3Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0UHJvdG9GaWxlLmNzCkBAIC0wLDAgKzEsMjE2MDIgQEAKKy8vIEdlbmVyYXRlZCBieSBQcm90b0dlbiwgVmVyc2lvbj0yLjQuMS41NTUsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49NTVmNzEyNTIzNGJlYjU4OS4gIERPIE5PVCBFRElUIQ0KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjENCisjcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQorDQordXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM7DQordXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KK3VzaW5nIHBiZCA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCit1c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3Mgew0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXRUZXN0UHJvdG9GaWxlIHsNCisgIA0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbnQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50NjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFVpbnQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsVWludDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTaW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFNpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGbG9hdEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxCb29sRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEJ5dGVzRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxHcm91cEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQ29yZEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEludDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRVaW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTaW50NjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRmxvYXRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQm9vbEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRCeXRlc0V4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkR3JvdXBFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZENvcmRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW50NjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0VWludDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFVpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTaW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ludDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGbG9hdEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHREb3VibGVFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Qm9vbEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Qnl0ZXNFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdENvcmRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5NeUV4dGVuc2lvblN0cmluZyk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk15RXh0ZW5zaW9uSW50KTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkSW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRJbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFVpbnQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFVpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFNpbnQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFNpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGaXhlZDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEZsb2F0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRG91YmxlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkQm9vbEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEVudW1FeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uLlRlc3QpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuU2luZ2xlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLk11bHRpKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gRXh0ZW5zaW9ucw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsSW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8aW50PiBPcHRpb25hbEludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsSW50NjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8bG9uZz4gT3B0aW9uYWxJbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFVpbnQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8dWludD4gT3B0aW9uYWxVaW50MzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxVaW50NjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDQ7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHVsb25nPiBPcHRpb25hbFVpbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFNpbnQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxpbnQ+IE9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA2Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGxvbmc+IE9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8dWludD4gT3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gODsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8dWxvbmc+IE9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGludD4gT3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxMDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxsb25nPiBPcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRmxvYXRFeHRlbnNpb25GaWVsZE51bWJlciA9IDExOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGZsb2F0PiBPcHRpb25hbEZsb2F0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxMjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxkb3VibGU+IE9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQm9vbEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTM7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Ym9vbD4gT3B0aW9uYWxCb29sRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxNDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzdHJpbmc+IE9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQnl0ZXNFeHRlbnNpb25GaWVsZE51bWJlciA9IDE1Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHBiOjpCeXRlU3RyaW5nPiBPcHRpb25hbEJ5dGVzRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsR3JvdXBFeHRlbnNpb25GaWVsZE51bWJlciA9IDE2Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uPiBPcHRpb25hbEdyb3VwRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTg7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2U+IE9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxOTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gT3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25GaWVsZE51bWJlciA9IDIwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2U+IE9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25GaWVsZE51bWJlciA9IDIxOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtPiBPcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMjI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IE9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAyMzsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPiBPcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMjQ7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c3RyaW5nPiBPcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQ29yZEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMjU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c3RyaW5nPiBPcHRpb25hbENvcmRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxpbnQ+PiBSZXBlYXRlZEludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW50NjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDMyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8bG9uZz4+IFJlcGVhdGVkSW50NjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRVaW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDMzOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHVpbnQ+PiBSZXBlYXRlZFVpbnQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzQ7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8dWxvbmc+PiBSZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxpbnQ+PiBSZXBlYXRlZFNpbnQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzY7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxsb25nPj4gUmVwZWF0ZWRTaW50NjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAzNzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDx1aW50Pj4gUmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzg7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8dWxvbmc+PiBSZXBlYXRlZEZpeGVkNjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzk7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxpbnQ+PiBSZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDQwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8bG9uZz4+IFJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNDE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxmbG9hdD4+IFJlcGVhdGVkRmxvYXRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWREb3VibGVFeHRlbnNpb25GaWVsZE51bWJlciA9IDQyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8ZG91YmxlPj4gUmVwZWF0ZWREb3VibGVFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRCb29sRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA0MzsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGJvb2w+PiBSZXBlYXRlZEJvb2xFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25GaWVsZE51bWJlciA9IDQ0Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8c3RyaW5nPj4gUmVwZWF0ZWRTdHJpbmdFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkZpZWxkTnVtYmVyID0gNDU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxwYjo6Qnl0ZVN0cmluZz4+IFJlcGVhdGVkQnl0ZXNFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRHcm91cEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNDY7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbj4+IFJlcGVhdGVkR3JvdXBFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA0ODsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPj4gUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25GaWVsZE51bWJlciA9IDQ5Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+PiBSZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNTA7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlPj4gUmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNTE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bT4+IFJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA1MjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPj4gUmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25GaWVsZE51bWJlciA9IDUzOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4+IFJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA1NDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHN0cmluZz4+IFJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRDb3JkRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA1NTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHN0cmluZz4+IFJlcGVhdGVkQ29yZEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0SW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDYxOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGludD4gRGVmYXVsdEludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRJbnQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNjI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8bG9uZz4gRGVmYXVsdEludDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRVaW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDYzOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTx1aW50PiBEZWZhdWx0VWludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRVaW50NjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDY0Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTx1bG9uZz4gRGVmYXVsdFVpbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0U2ludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA2NTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxpbnQ+IERlZmF1bHRTaW50MzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNjY7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8bG9uZz4gRGVmYXVsdFNpbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNjc7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHVpbnQ+IERlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA2ODsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8dWxvbmc+IERlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNjk7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8aW50PiBEZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA3MDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxsb25nPiBEZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEZsb2F0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA3MTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxmbG9hdD4gRGVmYXVsdEZsb2F0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHREb3VibGVFeHRlbnNpb25GaWVsZE51bWJlciA9IDcyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGRvdWJsZT4gRGVmYXVsdERvdWJsZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0Qm9vbEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNzM7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Ym9vbD4gRGVmYXVsdEJvb2xFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFN0cmluZ0V4dGVuc2lvbkZpZWxkTnVtYmVyID0gNzQ7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c3RyaW5nPiBEZWZhdWx0U3RyaW5nRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRCeXRlc0V4dGVuc2lvbkZpZWxkTnVtYmVyID0gNzU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8cGI6OkJ5dGVTdHJpbmc+IERlZmF1bHRCeXRlc0V4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gODE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+IERlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gODI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IERlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gODM7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4gRGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA4NDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzdHJpbmc+IERlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0Q29yZEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gODU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c3RyaW5nPiBEZWZhdWx0Q29yZEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBNeUV4dGVuc2lvblN0cmluZ0ZpZWxkTnVtYmVyID0gNTA7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c3RyaW5nPiBNeUV4dGVuc2lvblN0cmluZzsNCisgICAgcHVibGljIGNvbnN0IGludCBNeUV4dGVuc2lvbkludEZpZWxkTnVtYmVyID0gNTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxpbnQ+IE15RXh0ZW5zaW9uSW50Ow0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5MDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGludD4+IFBhY2tlZEludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEludDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5MTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGxvbmc+PiBQYWNrZWRJbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRVaW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDkyOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHVpbnQ+PiBQYWNrZWRVaW50MzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkVWludDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5MzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDx1bG9uZz4+IFBhY2tlZFVpbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTaW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDk0Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8aW50Pj4gUGFja2VkU2ludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFNpbnQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gOTU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxsb25nPj4gUGFja2VkU2ludDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEZpeGVkMzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDk2Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHVpbnQ+PiBQYWNrZWRGaXhlZDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEZpeGVkNjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDk3Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHVsb25nPj4gUGFja2VkRml4ZWQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gOTg7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxpbnQ+PiBQYWNrZWRTZml4ZWQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gOTk7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxsb25nPj4gUGFja2VkU2ZpeGVkNjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRmxvYXRFeHRlbnNpb25GaWVsZE51bWJlciA9IDEwMDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGZsb2F0Pj4gUGFja2VkRmxvYXRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRG91YmxlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxMDE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxkb3VibGU+PiBQYWNrZWREb3VibGVFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkQm9vbEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTAyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8Ym9vbD4+IFBhY2tlZEJvb2xFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTAzOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+PiBQYWNrZWRFbnVtRXh0ZW5zaW9uOw0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICAjcmVnaW9uIFN0YXRpYyB2YXJpYWJsZXMNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2VfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX09wdGlvbmFsR3JvdXBfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXBfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cC5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19SZXBlYXRlZEdyb3VwX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdERlcHJlY2F0ZWRGaWVsZHNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REZXByZWNhdGVkRmllbGRzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RGVwcmVjYXRlZEZpZWxkcy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REZXByZWNhdGVkRmllbGRzX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9yZWlnbk1lc3NhZ2VfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0ZvcmVpZ25NZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxFeHRlbnNpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT3B0aW9uYWxHcm91cF9leHRlbnNpb25fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PcHRpb25hbEdyb3VwX2V4dGVuc2lvbi5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1JlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZEV4dGVuc2lvbl9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZEV4dGVuc2lvbiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZEV4dGVuc2lvbi5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRFeHRlbnNpb25fX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVxdWlyZWRfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkRm9yZWlnbl9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkRm9yZWlnbiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkRm9yZWlnbi5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZEZvcmVpZ25fX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Rm9yZWlnbk5lc3RlZF9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZvcmVpZ25OZXN0ZWQsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RGb3JlaWduTmVzdGVkLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEZvcmVpZ25OZXN0ZWRfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtcHR5TWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWFsbHlMYXJnZVRhZ051bWJlci5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZWFsbHlMYXJnZVRhZ051bWJlcl9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZWN1cnNpdmVNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVjdXJzaXZlTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVjdXJzaXZlTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25BX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25CX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQl9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfRm9vX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX0Zvb19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9CYXJfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfQmFyX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19OZXN0ZWRNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuVHlwZXMuTmVzdGVkTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfTmVzdGVkTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0Q2FtZWxDYXNlRmllbGROYW1lcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Q2FtZWxDYXNlRmllbGROYW1lc19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGaWVsZE9yZGVyaW5nc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZpZWxkT3JkZXJpbmdzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RmllbGRPcmRlcmluZ3MuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RmllbGRPcmRlcmluZ3NfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfU3BhcnNlRW51bU1lc3NhZ2VfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwYXJzZUVudW1NZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGFyc2VFbnVtTWVzc2FnZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NwYXJzZUVudW1NZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT25lU3RyaW5nX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVTdHJpbmcsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9uZVN0cmluZy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09uZVN0cmluZ19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09uZUJ5dGVzX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVCeXRlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lQnl0ZXMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVCeXRlc19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRUeXBlc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZFR5cGVzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkVHlwZXMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkVHlwZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0VW5wYWNrZWRUeXBlc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkVHlwZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZFR5cGVzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFVucGFja2VkVHlwZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkRXh0ZW5zaW9uc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFBhY2tlZEV4dGVuc2lvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHluYW1pY0V4dGVuc2lvbnNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX0R5bmFtaWNNZXNzYWdlVHlwZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REeW5hbWljRXh0ZW5zaW9uc19EeW5hbWljTWVzc2FnZVR5cGVfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXF1ZXN0X19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0LkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9vUmVxdWVzdF9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0Zvb1Jlc3BvbnNlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXNwb25zZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0JhclJlcXVlc3RfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlcXVlc3QsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlcXVlc3QuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXF1ZXN0X19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQmFyUmVzcG9uc2VfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXNwb25zZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0JhclJlc3BvbnNlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBEZXNjcmlwdG9yDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIHByaXZhdGUgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsNCisgICAgDQorICAgIHN0YXRpYyBVbml0VGVzdFByb3RvRmlsZSgpIHsNCisgICAgICBieXRlW10gZGVzY3JpcHRvckRhdGEgPSBnbG9iYWw6OlN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoDQorICAgICAgICAgIHN0cmluZy5Db25jYXQoDQorICAgICAgICAgICAgIkNoNW5iMjluYkdVdmNISnZkRzlpZFdZdmRXNXBkSFJsYzNRdWNISnZkRzhTRVhCeWIzUnZZblZtWDNWdSIsIA0KKyAgICAgICAgICAgICJhWFIwWlhOMEdpUm5iMjluYkdVdmNISnZkRzlpZFdZdlkzTm9ZWEp3WDI5d2RHbHZibk11Y0hKdmRHOGEiLCANCisgICAgICAgICAgICAiSldkdmIyZHNaUzl3Y205MGIySjFaaTkxYm1sMGRHVnpkRjlwYlhCdmNuUXVjSEp2ZEc4aXV4VUtERlJsIiwgDQorICAgICAgICAgICAgImMzUkJiR3hVZVhCbGN4SVdDZzV2Y0hScGIyNWhiRjlwYm5Rek1oZ0JJQUVvQlJJV0NnNXZjSFJwYjI1aCIsIA0KKyAgICAgICAgICAgICJiRjlwYm5RMk5CZ0NJQUVvQXhJWENnOXZjSFJwYjI1aGJGOTFhVzUwTXpJWUF5QUJLQTBTRndvUGIzQjAiLCANCisgICAgICAgICAgICAiYVc5dVlXeGZkV2x1ZERZMEdBUWdBU2dFRWhjS0QyOXdkR2x2Ym1Gc1gzTnBiblF6TWhnRklBRW9FUklYIiwgDQorICAgICAgICAgICAgIkNnOXZjSFJwYjI1aGJGOXphVzUwTmpRWUJpQUJLQklTR0FvUWIzQjBhVzl1WVd4ZlptbDRaV1F6TWhnSCIsIA0KKyAgICAgICAgICAgICJJQUVvQnhJWUNoQnZjSFJwYjI1aGJGOW1hWGhsWkRZMEdBZ2dBU2dHRWhrS0VXOXdkR2x2Ym1Gc1gzTm0iLCANCisgICAgICAgICAgICAiYVhobFpETXlHQWtnQVNnUEVoa0tFVzl3ZEdsdmJtRnNYM05tYVhobFpEWTBHQW9nQVNnUUVoWUtEbTl3IiwgDQorICAgICAgICAgICAgImRHbHZibUZzWDJac2IyRjBHQXNnQVNnQ0VoY0tEMjl3ZEdsdmJtRnNYMlJ2ZFdKc1pSZ01JQUVvQVJJViIsIA0KKyAgICAgICAgICAgICJDZzF2Y0hScGIyNWhiRjlpYjI5c0dBMGdBU2dJRWhjS0QyOXdkR2x2Ym1Gc1gzTjBjbWx1WnhnT0lBRW8iLCANCisgICAgICAgICAgICAiQ1JJV0NnNXZjSFJwYjI1aGJGOWllWFJsY3hnUElBRW9EQkpFQ2cxdmNIUnBiMjVoYkdkeWIzVndHQkFnIiwgDQorICAgICAgICAgICAgIkFTZ0tNaTB1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRlI1Y0dWekxrOXdkR2x2Ym1GcyIsIA0KKyAgICAgICAgICAgICJSM0p2ZFhBU1Rnb1hiM0IwYVc5dVlXeGZibVZ6ZEdWa1gyMWxjM05oWjJVWUVpQUJLQXN5TFM1d2NtOTAiLCANCisgICAgICAgICAgICAiYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVd4c1ZIbHdaWE11VG1WemRHVmtUV1Z6YzJGblpSSkRDaGh2IiwgDQorICAgICAgICAgICAgImNIUnBiMjVoYkY5bWIzSmxhV2R1WDIxbGMzTmhaMlVZRXlBQktBc3lJUzV3Y205MGIySjFabDkxYm1sMCIsIA0KKyAgICAgICAgICAgICJkR1Z6ZEM1R2IzSmxhV2R1VFdWemMyRm5aUkpJQ2hkdmNIUnBiMjVoYkY5cGJYQnZjblJmYldWemMyRm4iLCANCisgICAgICAgICAgICAiWlJnVUlBRW9DekluTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wWDJsdGNHOXlkQzVKYlhCdmNuUk5aWE56IiwgDQorICAgICAgICAgICAgIllXZGxFa2dLRkc5d2RHbHZibUZzWDI1bGMzUmxaRjlsYm5WdEdCVWdBU2dPTWlvdWNISnZkRzlpZFdaZiIsIA0KKyAgICAgICAgICAgICJkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JGUjVjR1Z6TGs1bGMzUmxaRVZ1ZFcwU1BRb1ZiM0IwYVc5dVlXeGYiLCANCisgICAgICAgICAgICAiWm05eVpXbG5ibDlsYm5WdEdCWWdBU2dPTWg0dWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVJtOXlaV2xuIiwgDQorICAgICAgICAgICAgImJrVnVkVzBTUWdvVWIzQjBhVzl1WVd4ZmFXMXdiM0owWDJWdWRXMFlGeUFCS0E0eUpDNXdjbTkwYjJKMSIsIA0KKyAgICAgICAgICAgICJabDkxYm1sMGRHVnpkRjlwYlhCdmNuUXVTVzF3YjNKMFJXNTFiUkloQ2hWdmNIUnBiMjVoYkY5emRISnAiLCANCisgICAgICAgICAgICAiYm1kZmNHbGxZMlVZR0NBQktBbENBZ2dDRWhrS0RXOXdkR2x2Ym1Gc1gyTnZjbVFZR1NBQktBbENBZ2dCIiwgDQorICAgICAgICAgICAgIkVoWUtEbkpsY0dWaGRHVmtYMmx1ZERNeUdCOGdBeWdGRWhZS0RuSmxjR1ZoZEdWa1gybHVkRFkwR0NBZyIsIA0KKyAgICAgICAgICAgICJBeWdERWhjS0QzSmxjR1ZoZEdWa1gzVnBiblF6TWhnaElBTW9EUklYQ2c5eVpYQmxZWFJsWkY5MWFXNTAiLCANCisgICAgICAgICAgICAiTmpRWUlpQURLQVFTRndvUGNtVndaV0YwWldSZmMybHVkRE15R0NNZ0F5Z1JFaGNLRDNKbGNHVmhkR1ZrIiwgDQorICAgICAgICAgICAgIlgzTnBiblEyTkJna0lBTW9FaElZQ2hCeVpYQmxZWFJsWkY5bWFYaGxaRE15R0NVZ0F5Z0hFaGdLRUhKbCIsIA0KKyAgICAgICAgICAgICJjR1ZoZEdWa1gyWnBlR1ZrTmpRWUppQURLQVlTR1FvUmNtVndaV0YwWldSZmMyWnBlR1ZrTXpJWUp5QUQiLCANCisgICAgICAgICAgICAiS0E4U0dRb1JjbVZ3WldGMFpXUmZjMlpwZUdWa05qUVlLQ0FES0JBU0Znb09jbVZ3WldGMFpXUmZabXh2IiwgDQorICAgICAgICAgICAgIllYUVlLU0FES0FJU0Z3b1BjbVZ3WldGMFpXUmZaRzkxWW14bEdDb2dBeWdCRWhVS0RYSmxjR1ZoZEdWayIsIA0KKyAgICAgICAgICAgICJYMkp2YjJ3WUt5QURLQWdTRndvUGNtVndaV0YwWldSZmMzUnlhVzVuR0N3Z0F5Z0pFaFlLRG5KbGNHVmgiLCANCisgICAgICAgICAgICAiZEdWa1gySjVkR1Z6R0MwZ0F5Z01Fa1FLRFhKbGNHVmhkR1ZrWjNKdmRYQVlMaUFES0FveUxTNXdjbTkwIiwgDQorICAgICAgICAgICAgImIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNWSGx3WlhNdVVtVndaV0YwWldSSGNtOTFjQkpPQ2hkeSIsIA0KKyAgICAgICAgICAgICJaWEJsWVhSbFpGOXVaWE4wWldSZmJXVnpjMkZuWlJnd0lBTW9Dekl0TG5CeWIzUnZZblZtWDNWdWFYUjAiLCANCisgICAgICAgICAgICAiWlhOMExsUmxjM1JCYkd4VWVYQmxjeTVPWlhOMFpXUk5aWE56WVdkbEVrTUtHSEpsY0dWaGRHVmtYMlp2IiwgDQorICAgICAgICAgICAgImNtVnBaMjVmYldWemMyRm5aUmd4SUFNb0N6SWhMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMa1p2Y21WcCIsIA0KKyAgICAgICAgICAgICJaMjVOWlhOellXZGxFa2dLRjNKbGNHVmhkR1ZrWDJsdGNHOXlkRjl0WlhOellXZGxHRElnQXlnTE1pY3UiLCANCisgICAgICAgICAgICAiY0hKdmRHOWlkV1pmZFc1cGRIUmxjM1JmYVcxd2IzSjBMa2x0Y0c5eWRFMWxjM05oWjJVU1NBb1VjbVZ3IiwgDQorICAgICAgICAgICAgIlpXRjBaV1JmYm1WemRHVmtYMlZ1ZFcwWU15QURLQTR5S2k1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VSIsIA0KKyAgICAgICAgICAgICJaWE4wUVd4c1ZIbHdaWE11VG1WemRHVmtSVzUxYlJJOUNoVnlaWEJsWVhSbFpGOW1iM0psYVdkdVgyVnUiLCANCisgICAgICAgICAgICAiZFcwWU5DQURLQTR5SGk1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1R2IzSmxhV2R1Ulc1MWJSSkNDaFJ5IiwgDQorICAgICAgICAgICAgIlpYQmxZWFJsWkY5cGJYQnZjblJmWlc1MWJSZzFJQU1vRGpJa0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMCIsIA0KKyAgICAgICAgICAgICJYMmx0Y0c5eWRDNUpiWEJ2Y25SRmJuVnRFaUVLRlhKbGNHVmhkR1ZrWDNOMGNtbHVaMTl3YVdWalpSZzIiLCANCisgICAgICAgICAgICAiSUFNb0NVSUNDQUlTR1FvTmNtVndaV0YwWldSZlkyOXlaQmczSUFNb0NVSUNDQUVTR1FvTlpHVm1ZWFZzIiwgDQorICAgICAgICAgICAgImRGOXBiblF6TWhnOUlBRW9CVG9DTkRFU0dRb05aR1ZtWVhWc2RGOXBiblEyTkJnK0lBRW9Bem9DTkRJUyIsIA0KKyAgICAgICAgICAgICJHZ29PWkdWbVlYVnNkRjkxYVc1ME16SVlQeUFCS0EwNkFqUXpFaG9LRG1SbFptRjFiSFJmZFdsdWREWTAiLCANCisgICAgICAgICAgICAiR0VBZ0FTZ0VPZ0kwTkJJYkNnNWtaV1poZFd4MFgzTnBiblF6TWhoQklBRW9FVG9ETFRRMUVob0tEbVJsIiwgDQorICAgICAgICAgICAgIlptRjFiSFJmYzJsdWREWTBHRUlnQVNnU09nSTBOaEliQ2c5a1pXWmhkV3gwWDJacGVHVmtNeklZUXlBQiIsIA0KKyAgICAgICAgICAgICJLQWM2QWpRM0Voc0tEMlJsWm1GMWJIUmZabWw0WldRMk5CaEVJQUVvQmpvQ05EZ1NIQW9RWkdWbVlYVnMiLCANCisgICAgICAgICAgICAiZEY5elptbDRaV1F6TWhoRklBRW9Eem9DTkRrU0hRb1FaR1ZtWVhWc2RGOXpabWw0WldRMk5CaEdJQUVvIiwgDQorICAgICAgICAgICAgIkVEb0RMVFV3RWhzS0RXUmxabUYxYkhSZlpteHZZWFFZUnlBQktBSTZCRFV4TGpVU0hRb09aR1ZtWVhWcyIsIA0KKyAgICAgICAgICAgICJkRjlrYjNWaWJHVVlTQ0FCS0FFNkJUVXlNREF3RWhvS0RHUmxabUYxYkhSZlltOXZiQmhKSUFFb0NEb0UiLCANCisgICAgICAgICAgICAiZEhKMVpSSWRDZzVrWldaaGRXeDBYM04wY21sdVp4aEtJQUVvQ1RvRmFHVnNiRzhTSEFvTlpHVm1ZWFZzIiwgDQorICAgICAgICAgICAgImRGOWllWFJsY3hoTElBRW9ERG9GZDI5eWJHUVNUQW9UWkdWbVlYVnNkRjl1WlhOMFpXUmZaVzUxYlJoUiIsIA0KKyAgICAgICAgICAgICJJQUVvRGpJcUxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JCYkd4VWVYQmxjeTVPWlhOMFpXUkYiLCANCisgICAgICAgICAgICAiYm5WdE9nTkNRVklTU1FvVVpHVm1ZWFZzZEY5bWIzSmxhV2R1WDJWdWRXMFlVaUFCS0E0eUhpNXdjbTkwIiwgDQorICAgICAgICAgICAgImIySjFabDkxYm1sMGRHVnpkQzVHYjNKbGFXZHVSVzUxYlRvTFJrOVNSVWxIVGw5Q1FWSVNUUW9UWkdWbSIsIA0KKyAgICAgICAgICAgICJZWFZzZEY5cGJYQnZjblJmWlc1MWJSaFRJQUVvRGpJa0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMFgybHQiLCANCisgICAgICAgICAgICAiY0c5eWRDNUpiWEJ2Y25SRmJuVnRPZ3BKVFZCUFVsUmZRa0ZTRWlVS0ZHUmxabUYxYkhSZmMzUnlhVzVuIiwgDQorICAgICAgICAgICAgIlgzQnBaV05sR0ZRZ0FTZ0pPZ05oWW1OQ0FnZ0NFaDBLREdSbFptRjFiSFJmWTI5eVpCaFZJQUVvQ1RvRCIsIA0KKyAgICAgICAgICAgICJNVEl6UWdJSUFSb2JDZzFPWlhOMFpXUk5aWE56WVdkbEVnb0tBbUppR0FFZ0FTZ0ZHaG9LRFU5d2RHbHYiLCANCisgICAgICAgICAgICAiYm1Gc1IzSnZkWEFTQ1FvQllSZ1JJQUVvQlJvYUNnMVNaWEJsWVhSbFpFZHliM1Z3RWdrS0FXRVlMeUFCIiwgDQorICAgICAgICAgICAgIktBVWlKd29LVG1WemRHVmtSVzUxYlJJSENnTkdUMDhRQVJJSENnTkNRVklRQWhJSENnTkNRVm9RQXlJMCIsIA0KKyAgICAgICAgICAgICJDaFJVWlhOMFJHVndjbVZqWVhSbFpFWnBaV3hrY3hJY0NoQmtaWEJ5WldOaGRHVmtYMmx1ZERNeUdBRWciLCANCisgICAgICAgICAgICAiQVNnRlFnSVlBU0liQ2c1R2IzSmxhV2R1VFdWemMyRm5aUklKQ2dGakdBRWdBU2dGSWgwS0VWUmxjM1JCIiwgDQorICAgICAgICAgICAgImJHeEZlSFJsYm5OcGIyNXpLZ2dJQVJDQWdJQ0FBaUlrQ2hkUGNIUnBiMjVoYkVkeWIzVndYMlY0ZEdWdSIsIA0KKyAgICAgICAgICAgICJjMmx2YmhJSkNnRmhHQkVnQVNnRklpUUtGMUpsY0dWaGRHVmtSM0p2ZFhCZlpYaDBaVzV6YVc5dUVna0siLCANCisgICAgICAgICAgICAiQVdFWUx5QUJLQVVpVUFvVFZHVnpkRTVsYzNSbFpFVjRkR1Z1YzJsdmJqSTVDZ1IwWlhOMEVpUXVjSEp2IiwgDQorICAgICAgICAgICAgImRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZNmdjZ0FTZ0pPZ1IwWlhOMCIsIA0KKyAgICAgICAgICAgICJJdFVGQ2d4VVpYTjBVbVZ4ZFdseVpXUVNDUW9CWVJnQklBSW9CUklPQ2daa2RXMXRlVElZQWlBQktBVVMiLCANCisgICAgICAgICAgICAiQ1FvQlloZ0RJQUlvQlJJT0NnWmtkVzF0ZVRRWUJDQUJLQVVTRGdvR1pIVnRiWGsxR0FVZ0FTZ0ZFZzRLIiwgDQorICAgICAgICAgICAgIkJtUjFiVzE1TmhnR0lBRW9CUklPQ2daa2RXMXRlVGNZQnlBQktBVVNEZ29HWkhWdGJYazRHQWdnQVNnRiIsIA0KKyAgICAgICAgICAgICJFZzRLQm1SMWJXMTVPUmdKSUFFb0JSSVBDZ2RrZFcxdGVURXdHQW9nQVNnRkVnOEtCMlIxYlcxNU1URVkiLCANCisgICAgICAgICAgICAiQ3lBQktBVVNEd29IWkhWdGJYa3hNaGdNSUFFb0JSSVBDZ2RrZFcxdGVURXpHQTBnQVNnRkVnOEtCMlIxIiwgDQorICAgICAgICAgICAgImJXMTVNVFFZRGlBQktBVVNEd29IWkhWdGJYa3hOUmdQSUFFb0JSSVBDZ2RrZFcxdGVURTJHQkFnQVNnRiIsIA0KKyAgICAgICAgICAgICJFZzhLQjJSMWJXMTVNVGNZRVNBQktBVVNEd29IWkhWdGJYa3hPQmdTSUFFb0JSSVBDZ2RrZFcxdGVURTUiLCANCisgICAgICAgICAgICAiR0JNZ0FTZ0ZFZzhLQjJSMWJXMTVNakFZRkNBQktBVVNEd29IWkhWdGJYa3lNUmdWSUFFb0JSSVBDZ2RrIiwgDQorICAgICAgICAgICAgImRXMXRlVEl5R0JZZ0FTZ0ZFZzhLQjJSMWJXMTVNak1ZRnlBQktBVVNEd29IWkhWdGJYa3lOQmdZSUFFbyIsIA0KKyAgICAgICAgICAgICJCUklQQ2dka2RXMXRlVEkxR0JrZ0FTZ0ZFZzhLQjJSMWJXMTVNallZR2lBQktBVVNEd29IWkhWdGJYa3kiLCANCisgICAgICAgICAgICAiTnhnYklBRW9CUklQQ2dka2RXMXRlVEk0R0J3Z0FTZ0ZFZzhLQjJSMWJXMTVNamtZSFNBQktBVVNEd29IIiwgDQorICAgICAgICAgICAgIlpIVnRiWGt6TUJnZUlBRW9CUklQQ2dka2RXMXRlVE14R0I4Z0FTZ0ZFZzhLQjJSMWJXMTVNeklZSUNBQiIsIA0KKyAgICAgICAgICAgICJLQVVTQ1FvQll4Z2hJQUlvQlRKV0NnWnphVzVuYkdVU0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVUiLCANCisgICAgICAgICAgICAiWlhOMFFXeHNSWGgwWlc1emFXOXVjeGpvQnlBQktBc3lIeTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVIiwgDQorICAgICAgICAgICAgIlpYTjBVbVZ4ZFdseVpXUXlWUW9GYlhWc2RHa1NKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMCIsIA0KKyAgICAgICAgICAgICJRV3hzUlhoMFpXNXphVzl1Y3hqcEJ5QURLQXN5SHk1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjAiLCANCisgICAgICAgICAgICAiVW1WeGRXbHlaV1FpbWdFS0UxUmxjM1JTWlhGMWFYSmxaRVp2Y21WcFoyNFNPUW9RYjNCMGFXOXVZV3hmIiwgDQorICAgICAgICAgICAgImJXVnpjMkZuWlJnQklBRW9DeklmTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUlNaWEYxYVhKbCIsIA0KKyAgICAgICAgICAgICJaQkk1Q2hCeVpYQmxZWFJsWkY5dFpYTnpZV2RsR0FJZ0F5Z0xNaDh1Y0hKdmRHOWlkV1pmZFc1cGRIUmwiLCANCisgICAgICAgICAgICAiYzNRdVZHVnpkRkpsY1hWcGNtVmtFZzBLQldSMWJXMTVHQU1nQVNnRklsb0tFVlJsYzNSR2IzSmxhV2R1IiwgDQorICAgICAgICAgICAgIlRtVnpkR1ZrRWtVS0RtWnZjbVZwWjI1ZmJtVnpkR1ZrR0FFZ0FTZ0xNaTB1Y0hKdmRHOWlkV1pmZFc1cCIsIA0KKyAgICAgICAgICAgICJkSFJsYzNRdVZHVnpkRUZzYkZSNWNHVnpMazVsYzNSbFpFMWxjM05oWjJVaUVnb1FWR1Z6ZEVWdGNIUjUiLCANCisgICAgICAgICAgICAiVFdWemMyRm5aU0lxQ2g1VVpYTjBSVzF3ZEhsTlpYTnpZV2RsVjJsMGFFVjRkR1Z1YzJsdmJuTXFDQWdCIiwgDQorICAgICAgICAgICAgIkVJQ0FnSUFDSWpjS0cxUmxjM1JOZFd4MGFYQnNaVVY0ZEdWdWMybHZibEpoYm1kbGN5b0VDQ29RS3lvRyIsIA0KKyAgICAgICAgICAgICJDSzhnRUpRaEtnb0lnSUFFRUlDQWdJQUNJalFLR0ZSbGMzUlNaV0ZzYkhsTVlYSm5aVlJoWjA1MWJXSmwiLCANCisgICAgICAgICAgICAiY2hJSkNnRmhHQUVnQVNnRkVnMEtBbUppR1AvLy8zOGdBU2dGSWxVS0ZGUmxjM1JTWldOMWNuTnBkbVZOIiwgDQorICAgICAgICAgICAgIlpYTnpZV2RsRWpJS0FXRVlBU0FCS0FzeUp5NXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wVW1WaiIsIA0KKyAgICAgICAgICAgICJkWEp6YVhabFRXVnpjMkZuWlJJSkNnRnBHQUlnQVNnRklrc0tGRlJsYzNSTmRYUjFZV3hTWldOMWNuTnAiLCANCisgICAgICAgICAgICAiYjI1QkVqTUtBbUppR0FFZ0FTZ0xNaWN1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFMTFkSFZoIiwgDQorICAgICAgICAgICAgImJGSmxZM1Z5YzJsdmJrSWlZZ29VVkdWemRFMTFkSFZoYkZKbFkzVnljMmx2YmtJU01nb0JZUmdCSUFFbyIsIA0KKyAgICAgICAgICAgICJDekluTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUk5kWFIxWVd4U1pXTjFjbk5wYjI1QkVoWUsiLCANCisgICAgICAgICAgICAiRG05d2RHbHZibUZzWDJsdWRETXlHQUlnQVNnRklyTUJDaEpVWlhOMFJIVndSbWxsYkdST2RXMWlaWElTIiwgDQorICAgICAgICAgICAgIkNRb0JZUmdCSUFFb0JSSTJDZ05tYjI4WUFpQUJLQW95S1M1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VSIsIA0KKyAgICAgICAgICAgICJaWE4wUkhWd1JtbGxiR1JPZFcxaVpYSXVSbTl2RWpZS0EySmhjaGdESUFFb0NqSXBMbkJ5YjNSdlluVm0iLCANCisgICAgICAgICAgICAiWDNWdWFYUjBaWE4wTGxSbGMzUkVkWEJHYVdWc1pFNTFiV0psY2k1Q1lYSWFFQW9EUm05dkVna0tBV0VZIiwgDQorICAgICAgICAgICAgIkFTQUJLQVVhRUFvRFFtRnlFZ2tLQVdFWUFTQUJLQVVpZ0FJS0dGUmxjM1JPWlhOMFpXUk5aWE56WVdkbCIsIA0KKyAgICAgICAgICAgICJTR0Z6UW1sMGN4SmFDaGR2Y0hScGIyNWhiRjl1WlhOMFpXUmZiV1Z6YzJGblpSZ0JJQUVvQ3pJNUxuQnkiLCANCisgICAgICAgICAgICAiYjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNST1pYTjBaV1JOWlhOellXZGxTR0Z6UW1sMGN5NU9aWE4wIiwgDQorICAgICAgICAgICAgIlpXUk5aWE56WVdkbEdvY0JDZzFPWlhOMFpXUk5aWE56WVdkbEVpUUtIRzVsYzNSbFpHMWxjM05oWjJWZiIsIA0KKyAgICAgICAgICAgICJjbVZ3WldGMFpXUmZhVzUwTXpJWUFTQURLQVVTVUFvbGJtVnpkR1ZrYldWemMyRm5aVjl5WlhCbFlYUmwiLCANCisgICAgICAgICAgICAiWkY5bWIzSmxhV2R1YldWemMyRm5aUmdDSUFNb0N6SWhMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMa1p2IiwgDQorICAgICAgICAgICAgImNtVnBaMjVOWlhOellXZGxJdVVEQ2hkVVpYTjBRMkZ0Wld4RFlYTmxSbWxsYkdST1lXMWxjeElXQ2c1USIsIA0KKyAgICAgICAgICAgICJjbWx0YVhScGRtVkdhV1ZzWkJnQklBRW9CUklUQ2d0VGRISnBibWRHYVdWc1pCZ0NJQUVvQ1JJeENnbEYiLCANCisgICAgICAgICAgICAiYm5WdFJtbGxiR1FZQXlBQktBNHlIaTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVHYjNKbGFXZHVSVzUxIiwgDQorICAgICAgICAgICAgImJSSTNDZ3hOWlhOellXZGxSbWxsYkdRWUJDQUJLQXN5SVM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1RyIsIA0KKyAgICAgICAgICAgICJiM0psYVdkdVRXVnpjMkZuWlJJY0NoQlRkSEpwYm1kUWFXVmpaVVpwWld4a0dBVWdBU2dKUWdJSUFoSVYiLCANCisgICAgICAgICAgICAiQ2dsRGIzSmtSbWxsYkdRWUJpQUJLQWxDQWdnQkVoNEtGbEpsY0dWaGRHVmtVSEpwYldsMGFYWmxSbWxsIiwgDQorICAgICAgICAgICAgImJHUVlCeUFES0FVU0d3b1RVbVZ3WldGMFpXUlRkSEpwYm1kR2FXVnNaQmdJSUFNb0NSSTVDaEZTWlhCbCIsIA0KKyAgICAgICAgICAgICJZWFJsWkVWdWRXMUdhV1ZzWkJnSklBTW9EakllTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGtadmNtVnAiLCANCisgICAgICAgICAgICAiWjI1RmJuVnRFajhLRkZKbGNHVmhkR1ZrVFdWemMyRm5aVVpwWld4a0dBb2dBeWdMTWlFdWNISnZkRzlpIiwgDQorICAgICAgICAgICAgImRXWmZkVzVwZEhSbGMzUXVSbTl5WldsbmJrMWxjM05oWjJVU0pBb1lVbVZ3WldGMFpXUlRkSEpwYm1kUSIsIA0KKyAgICAgICAgICAgICJhV1ZqWlVacFpXeGtHQXNnQXlnSlFnSUlBaElkQ2hGU1pYQmxZWFJsWkVOdmNtUkdhV1ZzWkJnTUlBTW8iLCANCisgICAgICAgICAgICAiQ1VJQ0NBRWlWUW9TVkdWemRFWnBaV3hrVDNKa1pYSnBibWR6RWhFS0NXMTVYM04wY21sdVp4Z0xJQUVvIiwgDQorICAgICAgICAgICAgIkNSSU9DZ1p0ZVY5cGJuUVlBU0FCS0FNU0VBb0liWGxmWm14dllYUVlaU0FCS0FJcUJBZ0NFQXNxQkFnTSIsIA0KKyAgICAgICAgICAgICJFR1Vpb3dVS0dGUmxjM1JGZUhSeVpXMWxSR1ZtWVhWc2RGWmhiSFZsY3hJL0NnMWxjMk5oY0dWa1gySjUiLCANCisgICAgICAgICAgICAiZEdWekdBRWdBU2dNT2loY01EQXdYREF3TVZ3d01EZGNNREV3WERBeE5GeHVYSEpjZEZ3d01UTmNYRnduIiwgDQorICAgICAgICAgICAgIlhDSmNNemMyRWlBS0RHeGhjbWRsWDNWcGJuUXpNaGdDSUFFb0RUb0tOREk1TkRrMk56STVOUklxQ2d4cyIsIA0KKyAgICAgICAgICAgICJZWEpuWlY5MWFXNTBOalFZQXlBQktBUTZGREU0TkRRMk56UTBNRGN6TnpBNU5UVXhOakUxRWlBS0MzTnQiLCANCisgICAgICAgICAgICAiWVd4c1gybHVkRE15R0FRZ0FTZ0ZPZ3N0TWpFME56UTRNelkwTnhJcENndHpiV0ZzYkY5cGJuUTJOQmdGIiwgDQorICAgICAgICAgICAgIklBRW9Bem9VTFRreU1qTXpOekl3TXpZNE5UUTNOelU0TURjU0dBb0xkWFJtT0Y5emRISnBibWNZQmlBQiIsIA0KKyAgICAgICAgICAgICJLQWs2QStHSXRCSVZDZ3A2WlhKdlgyWnNiMkYwR0FjZ0FTZ0NPZ0V3RWhRS0NXOXVaVjltYkc5aGRCZ0kiLCANCisgICAgICAgICAgICAiSUFFb0Fqb0JNUklZQ2d0emJXRnNiRjltYkc5aGRCZ0pJQUVvQWpvRE1TNDFFaDRLRW01bFoyRjBhWFpsIiwgDQorICAgICAgICAgICAgIlgyOXVaVjltYkc5aGRCZ0tJQUVvQWpvQ0xURVNIQW9PYm1WbllYUnBkbVZmWm14dllYUVlDeUFCS0FJNiIsIA0KKyAgICAgICAgICAgICJCQzB4TGpVU0d3b0xiR0Z5WjJWZlpteHZZWFFZRENBQktBSTZCakpsS3pBd09CSWxDaFJ6YldGc2JGOXUiLCANCisgICAgICAgICAgICAiWldkaGRHbDJaVjltYkc5aGRCZ05JQUVvQWpvSExUaGxMVEF5T0JJWENncHBibVpmWkc5MVlteGxHQTRnIiwgDQorICAgICAgICAgICAgIkFTZ0JPZ05wYm1ZU0hBb09ibVZuWDJsdVpsOWtiM1ZpYkdVWUR5QUJLQUU2QkMxcGJtWVNGd29LYm1GdSIsIA0KKyAgICAgICAgICAgICJYMlJ2ZFdKc1pSZ1FJQUVvQVRvRGJtRnVFaFlLQ1dsdVpsOW1iRzloZEJnUklBRW9Bam9EYVc1bUVoc0siLCANCisgICAgICAgICAgICAiRFc1bFoxOXBibVpmWm14dllYUVlFaUFCS0FJNkJDMXBibVlTRmdvSmJtRnVYMlpzYjJGMEdCTWdBU2dDIiwgDQorICAgICAgICAgICAgIk9nTnVZVzRTS3dvTVkzQndYM1J5YVdkeVlYQm9HQlFnQVNnSk9oVS9JRDhnUHo4Z1B6OGdQejgvSUQ4LyIsIA0KKyAgICAgICAgICAgICJMeUEvUHkwaVN3b1JVM0JoY25ObFJXNTFiVTFsYzNOaFoyVVNOZ29MYzNCaGNuTmxYMlZ1ZFcwWUFTQUIiLCANCisgICAgICAgICAgICAiS0E0eUlTNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wVTNCaGNuTmxSVzUxYlNJWkNnbFBibVZUIiwgDQorICAgICAgICAgICAgImRISnBibWNTREFvRVpHRjBZUmdCSUFFb0NTSVlDZ2hQYm1WQ2VYUmxjeElNQ2dSa1lYUmhHQUVnQVNnTSIsIA0KKyAgICAgICAgICAgICJJcW9EQ2c5VVpYTjBVR0ZqYTJWa1ZIbHdaWE1TR0FvTWNHRmphMlZrWDJsdWRETXlHRm9nQXlnRlFnSVEiLCANCisgICAgICAgICAgICAiQVJJWUNneHdZV05yWldSZmFXNTBOalFZV3lBREtBTkNBaEFCRWhrS0RYQmhZMnRsWkY5MWFXNTBNeklZIiwgDQorICAgICAgICAgICAgIlhDQURLQTFDQWhBQkVoa0tEWEJoWTJ0bFpGOTFhVzUwTmpRWVhTQURLQVJDQWhBQkVoa0tEWEJoWTJ0bCIsIA0KKyAgICAgICAgICAgICJaRjl6YVc1ME16SVlYaUFES0JGQ0FoQUJFaGtLRFhCaFkydGxaRjl6YVc1ME5qUVlYeUFES0JKQ0FoQUIiLCANCisgICAgICAgICAgICAiRWhvS0RuQmhZMnRsWkY5bWFYaGxaRE15R0dBZ0F5Z0hRZ0lRQVJJYUNnNXdZV05yWldSZlptbDRaV1EyIiwgDQorICAgICAgICAgICAgIk5CaGhJQU1vQmtJQ0VBRVNHd29QY0dGamEyVmtYM05tYVhobFpETXlHR0lnQXlnUFFnSVFBUkliQ2c5dyIsIA0KKyAgICAgICAgICAgICJZV05yWldSZmMyWnBlR1ZrTmpRWVl5QURLQkJDQWhBQkVoZ0tESEJoWTJ0bFpGOW1iRzloZEJoa0lBTW8iLCANCisgICAgICAgICAgICAiQWtJQ0VBRVNHUW9OY0dGamEyVmtYMlJ2ZFdKc1pSaGxJQU1vQVVJQ0VBRVNGd29MY0dGamEyVmtYMkp2IiwgDQorICAgICAgICAgICAgImIyd1laaUFES0FoQ0FoQUJFamNLQzNCaFkydGxaRjlsYm5WdEdHY2dBeWdPTWg0dWNISnZkRzlpZFdaZiIsIA0KKyAgICAgICAgICAgICJkVzVwZEhSbGMzUXVSbTl5WldsbmJrVnVkVzFDQWhBQklzZ0RDaEZVWlhOMFZXNXdZV05yWldSVWVYQmwiLCANCisgICAgICAgICAgICAiY3hJYUNnNTFibkJoWTJ0bFpGOXBiblF6TWhoYUlBTW9CVUlDRUFBU0dnb09kVzV3WVdOclpXUmZhVzUwIiwgDQorICAgICAgICAgICAgIk5qUVlXeUFES0FOQ0FoQUFFaHNLRDNWdWNHRmphMlZrWDNWcGJuUXpNaGhjSUFNb0RVSUNFQUFTR3dvUCIsIA0KKyAgICAgICAgICAgICJkVzV3WVdOclpXUmZkV2x1ZERZMEdGMGdBeWdFUWdJUUFCSWJDZzkxYm5CaFkydGxaRjl6YVc1ME16SVkiLCANCisgICAgICAgICAgICAiWGlBREtCRkNBaEFBRWhzS0QzVnVjR0ZqYTJWa1gzTnBiblEyTkJoZklBTW9Fa0lDRUFBU0hBb1FkVzV3IiwgDQorICAgICAgICAgICAgIllXTnJaV1JmWm1sNFpXUXpNaGhnSUFNb0IwSUNFQUFTSEFvUWRXNXdZV05yWldSZlptbDRaV1EyTkJoaCIsIA0KKyAgICAgICAgICAgICJJQU1vQmtJQ0VBQVNIUW9SZFc1d1lXTnJaV1JmYzJacGVHVmtNeklZWWlBREtBOUNBaEFBRWgwS0VYVnUiLCANCisgICAgICAgICAgICAiY0dGamEyVmtYM05tYVhobFpEWTBHR01nQXlnUVFnSVFBQklhQ2c1MWJuQmhZMnRsWkY5bWJHOWhkQmhrIiwgDQorICAgICAgICAgICAgIklBTW9Ba0lDRUFBU0d3b1BkVzV3WVdOclpXUmZaRzkxWW14bEdHVWdBeWdCUWdJUUFCSVpDZzExYm5CaCIsIA0KKyAgICAgICAgICAgICJZMnRsWkY5aWIyOXNHR1lnQXlnSVFnSVFBQkk1Q2cxMWJuQmhZMnRsWkY5bGJuVnRHR2NnQXlnT01oNHUiLCANCisgICAgICAgICAgICAiY0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1Um05eVpXbG5ia1Z1ZFcxQ0FoQUFJaUFLRkZSbGMzUlFZV05yIiwgDQorICAgICAgICAgICAgIlpXUkZlSFJsYm5OcGIyNXpLZ2dJQVJDQWdJQ0FBaUtaQkFvVlZHVnpkRVI1Ym1GdGFXTkZlSFJsYm5OcCIsIA0KKyAgICAgICAgICAgICJiMjV6RWhrS0VITmpZV3hoY2w5bGVIUmxibk5wYjI0WTBBOGdBU2dIRWpjS0RtVnVkVzFmWlhoMFpXNXoiLCANCisgICAgICAgICAgICAiYVc5dUdORVBJQUVvRGpJZUxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExrWnZjbVZwWjI1RmJuVnRFbGtLIiwgDQorICAgICAgICAgICAgIkZtUjVibUZ0YVdOZlpXNTFiVjlsZUhSbGJuTnBiMjRZMGc4Z0FTZ09Namd1Y0hKdmRHOWlkV1pmZFc1cCIsIA0KKyAgICAgICAgICAgICJkSFJsYzNRdVZHVnpkRVI1Ym1GdGFXTkZlSFJsYm5OcGIyNXpMa1I1Ym1GdGFXTkZiblZ0Vkhsd1pSSTkiLCANCisgICAgICAgICAgICAiQ2hGdFpYTnpZV2RsWDJWNGRHVnVjMmx2YmhqVER5QUJLQXN5SVM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6IiwgDQorICAgICAgICAgICAgImRDNUdiM0psYVdkdVRXVnpjMkZuWlJKZkNobGtlVzVoYldsalgyMWxjM05oWjJWZlpYaDBaVzV6YVc5dSIsIA0KKyAgICAgICAgICAgICJHTlFQSUFFb0N6STdMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSRWVXNWhiV2xqUlhoMFpXNXoiLCANCisgICAgICAgICAgICAiYVc5dWN5NUVlVzVoYldsalRXVnpjMkZuWlZSNWNHVVNHd29TY21Wd1pXRjBaV1JmWlhoMFpXNXphVzl1IiwgDQorICAgICAgICAgICAgIkdOVVBJQU1vQ1JJZENoQndZV05yWldSZlpYaDBaVzV6YVc5dUdOWVBJQU1vRVVJQ0VBRWFMQW9TUkhsdSIsIA0KKyAgICAgICAgICAgICJZVzFwWTAxbGMzTmhaMlZVZVhCbEVoWUtEV1I1Ym1GdGFXTmZabWxsYkdRWXRCQWdBU2dGSWtjS0QwUjUiLCANCisgICAgICAgICAgICAiYm1GdGFXTkZiblZ0Vkhsd1pSSVFDZ3RFV1U1QlRVbERYMFpQVHhDWUVSSVFDZ3RFV1U1QlRVbERYMEpCIiwgDQorICAgICAgICAgICAgIlVoQ1pFUklRQ2d0RVdVNUJUVWxEWDBKQldoQ2FFU0xBQVFvalZHVnpkRkpsY0dWaGRHVmtVMk5oYkdGeSIsIA0KKyAgICAgICAgICAgICJSR2xtWm1WeVpXNTBWR0ZuVTJsNlpYTVNHQW9RY21Wd1pXRjBaV1JmWm1sNFpXUXpNaGdNSUFNb0J4SVciLCANCisgICAgICAgICAgICAiQ2c1eVpYQmxZWFJsWkY5cGJuUXpNaGdOSUFNb0JSSVpDaEJ5WlhCbFlYUmxaRjltYVhobFpEWTBHUDRQIiwgDQorICAgICAgICAgICAgIklBTW9CaElYQ2c1eVpYQmxZWFJsWkY5cGJuUTJOQmovRHlBREtBTVNHQW9PY21Wd1pXRjBaV1JmWm14diIsIA0KKyAgICAgICAgICAgICJZWFFZL3Y4UElBTW9BaElaQ2c5eVpYQmxZWFJsWkY5MWFXNTBOalFZLy84UElBTW9CQ0lNQ2dwR2IyOVMiLCANCisgICAgICAgICAgICAiWlhGMVpYTjBJZzBLQzBadmIxSmxjM0J2Ym5ObElnd0tDa0poY2xKbGNYVmxjM1FpRFFvTFFtRnlVbVZ6IiwgDQorICAgICAgICAgICAgImNHOXVjMlVxUUFvTFJtOXlaV2xuYmtWdWRXMFNEd29MUms5U1JVbEhUbDlHVDA4UUJCSVBDZ3RHVDFKRiIsIA0KKyAgICAgICAgICAgICJTVWRPWDBKQlVoQUZFZzhLQzBaUFVrVkpSMDVmUWtGYUVBWXFSd29VVkdWemRFVnVkVzFYYVhSb1JIVnciLCANCisgICAgICAgICAgICAiVm1Gc2RXVVNDQW9FUms5UE1SQUJFZ2dLQkVKQlVqRVFBaElIQ2dOQ1FWb1FBeElJQ2dSR1QwOHlFQUVTIiwgDQorICAgICAgICAgICAgIkNBb0VRa0ZTTWhBQ0tva0JDZzVVWlhOMFUzQmhjbk5sUlc1MWJSSU1DZ2hUVUVGU1UwVmZRUkI3RWc0SyIsIA0KKyAgICAgICAgICAgICJDRk5RUVZKVFJWOUNFS2JuQXhJUENnaFRVRUZTVTBWZlF4Q3lzWUFHRWhVS0NGTlFRVkpUUlY5RUVQSC8iLCANCisgICAgICAgICAgICAiLy8vLy8vLy8vd0VTRlFvSVUxQkJVbE5GWDBVUXRONzgvLy8vLy8vL0FSSU1DZ2hUVUVGU1UwVmZSaEFBIiwgDQorICAgICAgICAgICAgIkVnd0tDRk5RUVZKVFJWOUhFQUl5bVFFS0MxUmxjM1JUWlhKMmFXTmxFa1FLQTBadmJ4SWRMbkJ5YjNSdiIsIA0KKyAgICAgICAgICAgICJZblZtWDNWdWFYUjBaWE4wTGtadmIxSmxjWFZsYzNRYUhpNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNUciLCANCisgICAgICAgICAgICAiYjI5U1pYTndiMjV6WlJKRUNnTkNZWElTSFM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1Q1lYSlNaWEYxIiwgDQorICAgICAgICAgICAgIlpYTjBHaDR1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1UW1GeVVtVnpjRzl1YzJVNlJnb1liM0IwYVc5dSIsIA0KKyAgICAgICAgICAgICJZV3hmYVc1ME16SmZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnMiLCANCisgICAgICAgICAgICAiYkVWNGRHVnVjMmx2Ym5NWUFTQUJLQVU2UmdvWWIzQjBhVzl1WVd4ZmFXNTBOalJmWlhoMFpXNXphVzl1IiwgDQorICAgICAgICAgICAgIkVpUXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlBaUFCS0FNNiIsIA0KKyAgICAgICAgICAgICJSd29aYjNCMGFXOXVZV3hmZFdsdWRETXlYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjAiLCANCisgICAgICAgICAgICAiWlhOMExsUmxjM1JCYkd4RmVIUmxibk5wYjI1ekdBTWdBU2dOT2tjS0dXOXdkR2x2Ym1Gc1gzVnBiblEyIiwgDQorICAgICAgICAgICAgIk5GOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1eiIsIA0KKyAgICAgICAgICAgICJhVzl1Y3hnRUlBRW9CRHBIQ2hsdmNIUnBiMjVoYkY5emFXNTBNekpmWlhoMFpXNXphVzl1RWlRdWNISnYiLCANCisgICAgICAgICAgICAiZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlCU0FCS0JFNlJ3b1piM0IwIiwgDQorICAgICAgICAgICAgImFXOXVZV3hmYzJsdWREWTBYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbCIsIA0KKyAgICAgICAgICAgICJjM1JCYkd4RmVIUmxibk5wYjI1ekdBWWdBU2dTT2tnS0dtOXdkR2x2Ym1Gc1gyWnBlR1ZrTXpKZlpYaDAiLCANCisgICAgICAgICAgICAiWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZIiwgDQorICAgICAgICAgICAgIkJ5QUJLQWM2U0FvYWIzQjBhVzl1WVd4ZlptbDRaV1EyTkY5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMSIsIA0KKyAgICAgICAgICAgICJabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1emFXOXVjeGdJSUFFb0JqcEpDaHR2Y0hScGIyNWgiLCANCisgICAgICAgICAgICAiYkY5elptbDRaV1F6TWw5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wIiwgDQorICAgICAgICAgICAgIlFXeHNSWGgwWlc1emFXOXVjeGdKSUFFb0R6cEpDaHR2Y0hScGIyNWhiRjl6Wm1sNFpXUTJORjlsZUhSbCIsIA0KKyAgICAgICAgICAgICJibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVd4c1JYaDBaVzV6YVc5dWN4Z0siLCANCisgICAgICAgICAgICAiSUFFb0VEcEdDaGh2Y0hScGIyNWhiRjltYkc5aGRGOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxIiwgDQorICAgICAgICAgICAgImJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMFpXNXphVzl1Y3hnTElBRW9BanBIQ2hsdmNIUnBiMjVoYkY5ayIsIA0KKyAgICAgICAgICAgICJiM1ZpYkdWZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjQiLCANCisgICAgICAgICAgICAiZEdWdWMybHZibk1ZRENBQktBRTZSUW9YYjNCMGFXOXVZV3hmWW05dmJGOWxlSFJsYm5OcGIyNFNKQzV3IiwgDQorICAgICAgICAgICAgImNtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMFpXNXphVzl1Y3hnTklBRW9DRHBIQ2hsdiIsIA0KKyAgICAgICAgICAgICJjSFJwYjI1aGJGOXpkSEpwYm1kZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXUiLCANCisgICAgICAgICAgICAiVkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZRGlBQktBazZSZ29ZYjNCMGFXOXVZV3hmWW5sMFpYTmZaWGgwIiwgDQorICAgICAgICAgICAgIlpXNXphVzl1RWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWSIsIA0KKyAgICAgICAgICAgICJEeUFCS0F3NmNRb1hiM0IwYVc5dVlXeG5jbTkxY0Y5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTEiLCANCisgICAgICAgICAgICAiYm1sMGRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1emFXOXVjeGdRSUFFb0NqSXFMbkJ5YjNSdlluVm1YM1Z1IiwgDQorICAgICAgICAgICAgImFYUjBaWE4wTGs5d2RHbHZibUZzUjNKdmRYQmZaWGgwWlc1emFXOXVPbjRLSVc5d2RHbHZibUZzWDI1bCIsIA0KKyAgICAgICAgICAgICJjM1JsWkY5dFpYTnpZV2RsWDJWNGRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmwiLCANCisgICAgICAgICAgICAiYzNSQmJHeEZlSFJsYm5OcGIyNXpHQklnQVNnTE1pMHVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6IiwgDQorICAgICAgICAgICAgImRFRnNiRlI1Y0dWekxrNWxjM1JsWkUxbGMzTmhaMlU2Y3dvaWIzQjBhVzl1WVd4ZlptOXlaV2xuYmw5dCIsIA0KKyAgICAgICAgICAgICJaWE56WVdkbFgyVjRkR1Z1YzJsdmJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEYiLCANCisgICAgICAgICAgICAiZUhSbGJuTnBiMjV6R0JNZ0FTZ0xNaUV1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1Um05eVpXbG5iazFsIiwgDQorICAgICAgICAgICAgImMzTmhaMlU2ZUFvaGIzQjBhVzl1WVd4ZmFXMXdiM0owWDIxbGMzTmhaMlZmWlhoMFpXNXphVzl1RWlRdSIsIA0KKyAgICAgICAgICAgICJjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlGQ0FCS0FzeUp5NXciLCANCisgICAgICAgICAgICAiY205MGIySjFabDkxYm1sMGRHVnpkRjlwYlhCdmNuUXVTVzF3YjNKMFRXVnpjMkZuWlRwNENoNXZjSFJwIiwgDQorICAgICAgICAgICAgImIyNWhiRjl1WlhOMFpXUmZaVzUxYlY5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWeiIsIA0KKyAgICAgICAgICAgICJkQzVVWlhOMFFXeHNSWGgwWlc1emFXOXVjeGdWSUFFb0RqSXFMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjAiLCANCisgICAgICAgICAgICAiTGxSbGMzUkJiR3hVZVhCbGN5NU9aWE4wWldSRmJuVnRPbTBLSDI5d2RHbHZibUZzWDJadmNtVnBaMjVmIiwgDQorICAgICAgICAgICAgIlpXNTFiVjlsZUhSbGJuTnBiMjRTSkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMCIsIA0KKyAgICAgICAgICAgICJaVzV6YVc5dWN4Z1dJQUVvRGpJZUxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExrWnZjbVZwWjI1RmJuVnQiLCANCisgICAgICAgICAgICAiT25JS0htOXdkR2x2Ym1Gc1gybHRjRzl5ZEY5bGJuVnRYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtIiwgDQorICAgICAgICAgICAgIlgzVnVhWFIwWlhOMExsUmxjM1JCYkd4RmVIUmxibk5wYjI1ekdCY2dBU2dPTWlRdWNISnZkRzlpZFdaZiIsIA0KKyAgICAgICAgICAgICJkVzVwZEhSbGMzUmZhVzF3YjNKMExrbHRjRzl5ZEVWdWRXMDZVUW9mYjNCMGFXOXVZV3hmYzNSeWFXNW4iLCANCisgICAgICAgICAgICAiWDNCcFpXTmxYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGIiwgDQorICAgICAgICAgICAgImVIUmxibk5wYjI1ekdCZ2dBU2dKUWdJSUFqcEpDaGR2Y0hScGIyNWhiRjlqYjNKa1gyVjRkR1Z1YzJsdiIsIA0KKyAgICAgICAgICAgICJiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6R0JrZ0FTZ0oiLCANCisgICAgICAgICAgICAiUWdJSUFUcEdDaGh5WlhCbFlYUmxaRjlwYm5Rek1sOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxIiwgDQorICAgICAgICAgICAgImJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMFpXNXphVzl1Y3hnZklBTW9CVHBHQ2hoeVpYQmxZWFJsWkY5cCIsIA0KKyAgICAgICAgICAgICJiblEyTkY5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVd4c1JYaDAiLCANCisgICAgICAgICAgICAiWlc1emFXOXVjeGdnSUFNb0F6cEhDaGx5WlhCbFlYUmxaRjkxYVc1ME16SmZaWGgwWlc1emFXOXVFaVF1IiwgDQorICAgICAgICAgICAgImNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWUlTQURLQTA2UndvWiIsIA0KKyAgICAgICAgICAgICJjbVZ3WldGMFpXUmZkV2x1ZERZMFgyVjRkR1Z1YzJsdmJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjAiLCANCisgICAgICAgICAgICAiTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6R0NJZ0F5Z0VPa2NLR1hKbGNHVmhkR1ZrWDNOcGJuUXpNbDlsIiwgDQorICAgICAgICAgICAgImVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVd4c1JYaDBaVzV6YVc5dSIsIA0KKyAgICAgICAgICAgICJjeGdqSUFNb0VUcEhDaGx5WlhCbFlYUmxaRjl6YVc1ME5qUmZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWkiLCANCisgICAgICAgICAgICAiZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWUpDQURLQkk2U0FvYWNtVndaV0YwIiwgDQorICAgICAgICAgICAgIlpXUmZabWw0WldRek1sOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMCIsIA0KKyAgICAgICAgICAgICJRV3hzUlhoMFpXNXphVzl1Y3hnbElBTW9CenBJQ2hweVpYQmxZWFJsWkY5bWFYaGxaRFkwWDJWNGRHVnUiLCANCisgICAgICAgICAgICAiYzJsdmJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHQ1lnIiwgDQorICAgICAgICAgICAgIkF5Z0dPa2tLRzNKbGNHVmhkR1ZrWDNObWFYaGxaRE15WDJWNGRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbSIsIA0KKyAgICAgICAgICAgICJYM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHQ2NnQXlnUE9ra0tHM0psY0dWaGRHVmsiLCANCisgICAgICAgICAgICAiWDNObWFYaGxaRFkwWDJWNGRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JCIiwgDQorICAgICAgICAgICAgImJHeEZlSFJsYm5OcGIyNXpHQ2dnQXlnUU9rWUtHSEpsY0dWaGRHVmtYMlpzYjJGMFgyVjRkR1Z1YzJsdiIsIA0KKyAgICAgICAgICAgICJiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6R0NrZ0F5Z0MiLCANCisgICAgICAgICAgICAiT2tjS0dYSmxjR1ZoZEdWa1gyUnZkV0pzWlY5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwIiwgDQorICAgICAgICAgICAgImRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1emFXOXVjeGdxSUFNb0FUcEZDaGR5WlhCbFlYUmxaRjlpYjI5cyIsIA0KKyAgICAgICAgICAgICJYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnAiLCANCisgICAgICAgICAgICAiYjI1ekdDc2dBeWdJT2tjS0dYSmxjR1ZoZEdWa1gzTjBjbWx1WjE5bGVIUmxibk5wYjI0U0pDNXdjbTkwIiwgDQorICAgICAgICAgICAgImIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1emFXOXVjeGdzSUFNb0NUcEdDaGh5WlhCbCIsIA0KKyAgICAgICAgICAgICJZWFJsWkY5aWVYUmxjMTlsZUhSbGJuTnBiMjRTSkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjAiLCANCisgICAgICAgICAgICAiUVd4c1JYaDBaVzV6YVc5dWN4Z3RJQU1vRERweENoZHlaWEJsWVhSbFpHZHliM1Z3WDJWNGRHVnVjMmx2IiwgDQorICAgICAgICAgICAgImJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHQzRnQXlnSyIsIA0KKyAgICAgICAgICAgICJNaW91Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VW1Wd1pXRjBaV1JIY205MWNGOWxlSFJsYm5OcGIyNDYiLCANCisgICAgICAgICAgICAiZmdvaGNtVndaV0YwWldSZmJtVnpkR1ZrWDIxbGMzTmhaMlZmWlhoMFpXNXphVzl1RWlRdWNISnZkRzlpIiwgDQorICAgICAgICAgICAgImRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlNQ0FES0FzeUxTNXdjbTkwYjJKMSIsIA0KKyAgICAgICAgICAgICJabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNWSGx3WlhNdVRtVnpkR1ZrVFdWemMyRm5aVHB6Q2lKeVpYQmwiLCANCisgICAgICAgICAgICAiWVhSbFpGOW1iM0psYVdkdVgyMWxjM05oWjJWZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmZkVzVwIiwgDQorICAgICAgICAgICAgImRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZTVNBREtBc3lJUzV3Y205MGIySjFabDkxYm1sMCIsIA0KKyAgICAgICAgICAgICJkR1Z6ZEM1R2IzSmxhV2R1VFdWemMyRm5aVHA0Q2lGeVpYQmxZWFJsWkY5cGJYQnZjblJmYldWemMyRm4iLCANCisgICAgICAgICAgICAiWlY5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVd4c1JYaDBaVzV6IiwgDQorICAgICAgICAgICAgImFXOXVjeGd5SUFNb0N6SW5MbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBYMmx0Y0c5eWRDNUpiWEJ2Y25STiIsIA0KKyAgICAgICAgICAgICJaWE56WVdkbE9uZ0tIbkpsY0dWaGRHVmtYMjVsYzNSbFpGOWxiblZ0WDJWNGRHVnVjMmx2YmhJa0xuQnkiLCANCisgICAgICAgICAgICAiYjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHRE1nQXlnT01pb3VjSEp2IiwgDQorICAgICAgICAgICAgImRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRlI1Y0dWekxrNWxjM1JsWkVWdWRXMDZiUW9mY21WdyIsIA0KKyAgICAgICAgICAgICJaV0YwWldSZlptOXlaV2xuYmw5bGJuVnRYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjAiLCANCisgICAgICAgICAgICAiWlhOMExsUmxjM1JCYkd4RmVIUmxibk5wYjI1ekdEUWdBeWdPTWg0dWNISnZkRzlpZFdaZmRXNXBkSFJsIiwgDQorICAgICAgICAgICAgImMzUXVSbTl5WldsbmJrVnVkVzA2Y2dvZWNtVndaV0YwWldSZmFXMXdiM0owWDJWdWRXMWZaWGgwWlc1eiIsIA0KKyAgICAgICAgICAgICJhVzl1RWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWU5TQUQiLCANCisgICAgICAgICAgICAiS0E0eUpDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRGOXBiWEJ2Y25RdVNXMXdiM0owUlc1MWJUcFJDaDl5IiwgDQorICAgICAgICAgICAgIlpYQmxZWFJsWkY5emRISnBibWRmY0dsbFkyVmZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cCIsIA0KKyAgICAgICAgICAgICJkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWU5pQURLQWxDQWdnQ09ra0tGM0psY0dWaGRHVmsiLCANCisgICAgICAgICAgICAiWDJOdmNtUmZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0IiwgDQorICAgICAgICAgICAgImRHVnVjMmx2Ym5NWU55QURLQWxDQWdnQk9ra0tGMlJsWm1GMWJIUmZhVzUwTXpKZlpYaDBaVzV6YVc5dSIsIA0KKyAgICAgICAgICAgICJFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZUFNBQktBVTYiLCANCisgICAgICAgICAgICAiQWpReE9ra0tGMlJsWm1GMWJIUmZhVzUwTmpSZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmZkVzVwIiwgDQorICAgICAgICAgICAgImRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZUGlBQktBTTZBalF5T2tvS0dHUmxabUYxYkhSZiIsIA0KKyAgICAgICAgICAgICJkV2x1ZERNeVgyVjRkR1Z1YzJsdmJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEYiLCANCisgICAgICAgICAgICAiZUhSbGJuTnBiMjV6R0Q4Z0FTZ05PZ0kwTXpwS0NoaGtaV1poZFd4MFgzVnBiblEyTkY5bGVIUmxibk5wIiwgDQorICAgICAgICAgICAgImIyNFNKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1emFXOXVjeGhBSUFFbyIsIA0KKyAgICAgICAgICAgICJCRG9DTkRRNlN3b1laR1ZtWVhWc2RGOXphVzUwTXpKZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmYiLCANCisgICAgICAgICAgICAiZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZUVNBQktCRTZBeTAwTlRwS0NoaGtaV1poIiwgDQorICAgICAgICAgICAgImRXeDBYM05wYm5RMk5GOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMCIsIA0KKyAgICAgICAgICAgICJRV3hzUlhoMFpXNXphVzl1Y3hoQ0lBRW9Fam9DTkRZNlN3b1paR1ZtWVhWc2RGOW1hWGhsWkRNeVgyVjQiLCANCisgICAgICAgICAgICAiZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6IiwgDQorICAgICAgICAgICAgIkdFTWdBU2dIT2dJME56cExDaGxrWldaaGRXeDBYMlpwZUdWa05qUmZaWGgwWlc1emFXOXVFaVF1Y0hKdiIsIA0KKyAgICAgICAgICAgICJkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWVJDQUJLQVk2QWpRNE9rd0siLCANCisgICAgICAgICAgICAiR21SbFptRjFiSFJmYzJacGVHVmtNekpmWlhoMFpXNXphVzl1RWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsIiwgDQorICAgICAgICAgICAgImMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlSU0FCS0E4NkFqUTVPazBLR21SbFptRjFiSFJmYzJacCIsIA0KKyAgICAgICAgICAgICJlR1ZrTmpSZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjQiLCANCisgICAgICAgICAgICAiZEdWdWMybHZibk1ZUmlBQktCQTZBeTAxTURwTENoZGtaV1poZFd4MFgyWnNiMkYwWDJWNGRHVnVjMmx2IiwgDQorICAgICAgICAgICAgImJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHRWNnQVNnQyIsIA0KKyAgICAgICAgICAgICJPZ1ExTVM0MU9rMEtHR1JsWm1GMWJIUmZaRzkxWW14bFgyVjRkR1Z1YzJsdmJoSWtMbkJ5YjNSdlluVm0iLCANCisgICAgICAgICAgICAiWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6R0VnZ0FTZ0JPZ1UxTWpBd01EcEtDaFprIiwgDQorICAgICAgICAgICAgIlpXWmhkV3gwWDJKdmIyeGZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWeiIsIA0KKyAgICAgICAgICAgICJkRUZzYkVWNGRHVnVjMmx2Ym5NWVNTQUJLQWc2QkhSeWRXVTZUUW9ZWkdWbVlYVnNkRjl6ZEhKcGJtZGYiLCANCisgICAgICAgICAgICAiWlhoMFpXNXphVzl1RWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2IiwgDQorICAgICAgICAgICAgImJuTVlTaUFCS0FrNkJXaGxiR3h2T2t3S0YyUmxabUYxYkhSZllubDBaWE5mWlhoMFpXNXphVzl1RWlRdSIsIA0KKyAgICAgICAgICAgICJjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlTeUFCS0F3NkJYZHYiLCANCisgICAgICAgICAgICAiY214a09ud0tIV1JsWm1GMWJIUmZibVZ6ZEdWa1gyVnVkVzFmWlhoMFpXNXphVzl1RWlRdWNISnZkRzlpIiwgDQorICAgICAgICAgICAgImRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlVU0FCS0E0eUtpNXdjbTkwYjJKMSIsIA0KKyAgICAgICAgICAgICJabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNWSGx3WlhNdVRtVnpkR1ZrUlc1MWJUb0RRa0ZTT25rS0htUmwiLCANCisgICAgICAgICAgICAiWm1GMWJIUmZabTl5WldsbmJsOWxiblZ0WDJWNGRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbVgzVnVhWFIwIiwgDQorICAgICAgICAgICAgIlpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHRklnQVNnT01oNHVjSEp2ZEc5aWRXWmZkVzVwZEhSbCIsIA0KKyAgICAgICAgICAgICJjM1F1Um05eVpXbG5ia1Z1ZFcwNkMwWlBVa1ZKUjA1ZlFrRlNPbjBLSFdSbFptRjFiSFJmYVcxd2IzSjAiLCANCisgICAgICAgICAgICAiWDJWdWRXMWZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0IiwgDQorICAgICAgICAgICAgImRHVnVjMmx2Ym5NWVV5QUJLQTR5SkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEY5cGJYQnZjblF1U1cxdyIsIA0KKyAgICAgICAgICAgICJiM0owUlc1MWJUb0tTVTFRVDFKVVgwSkJVanBWQ2g1a1pXWmhkV3gwWDNOMGNtbHVaMTl3YVdWalpWOWwiLCANCisgICAgICAgICAgICAiZUhSbGJuTnBiMjRTSkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMFpXNXphVzl1IiwgDQorICAgICAgICAgICAgImN4aFVJQUVvQ1RvRFlXSmpRZ0lJQWpwTkNoWmtaV1poZFd4MFgyTnZjbVJmWlhoMFpXNXphVzl1RWlRdSIsIA0KKyAgICAgICAgICAgICJjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlWU0FCS0FrNkF6RXkiLCANCisgICAgICAgICAgICAiTTBJQ0NBRTZRZ29UYlhsZlpYaDBaVzV6YVc5dVgzTjBjbWx1WnhJbExuQnliM1J2WW5WbVgzVnVhWFIwIiwgDQorICAgICAgICAgICAgIlpYTjBMbFJsYzNSR2FXVnNaRTl5WkdWeWFXNW5jeGd5SUFFb0NUby9DaEJ0ZVY5bGVIUmxibk5wYjI1ZiIsIA0KKyAgICAgICAgICAgICJhVzUwRWlVdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRVpwWld4a1QzSmtaWEpwYm1kekdBVWciLCANCisgICAgICAgICAgICAiQVNnRk9rc0tGbkJoWTJ0bFpGOXBiblF6TWw5bGVIUmxibk5wYjI0U0p5NXdjbTkwYjJKMVpsOTFibWwwIiwgDQorICAgICAgICAgICAgImRHVnpkQzVVWlhOMFVHRmphMlZrUlhoMFpXNXphVzl1Y3hoYUlBTW9CVUlDRUFFNlN3b1djR0ZqYTJWayIsIA0KKyAgICAgICAgICAgICJYMmx1ZERZMFgyVjRkR1Z1YzJsdmJoSW5MbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSUVlXTnIiLCANCisgICAgICAgICAgICAiWldSRmVIUmxibk5wYjI1ekdGc2dBeWdEUWdJUUFUcE1DaGR3WVdOclpXUmZkV2x1ZERNeVgyVjRkR1Z1IiwgDQorICAgICAgICAgICAgImMybHZiaEluTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUlFZV05yWldSRmVIUmxibk5wYjI1eiIsIA0KKyAgICAgICAgICAgICJHRndnQXlnTlFnSVFBVHBNQ2hkd1lXTnJaV1JmZFdsdWREWTBYMlY0ZEdWdWMybHZiaEluTG5CeWIzUnYiLCANCisgICAgICAgICAgICAiWW5WbVgzVnVhWFIwWlhOMExsUmxjM1JRWVdOclpXUkZlSFJsYm5OcGIyNXpHRjBnQXlnRVFnSVFBVHBNIiwgDQorICAgICAgICAgICAgIkNoZHdZV05yWldSZmMybHVkRE15WDJWNGRHVnVjMmx2YmhJbkxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMCIsIA0KKyAgICAgICAgICAgICJMbFJsYzNSUVlXTnJaV1JGZUhSbGJuTnBiMjV6R0Y0Z0F5Z1JRZ0lRQVRwTUNoZHdZV05yWldSZmMybHUiLCANCisgICAgICAgICAgICAiZERZMFgyVjRkR1Z1YzJsdmJoSW5MbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSUVlXTnJaV1JGIiwgDQorICAgICAgICAgICAgImVIUmxibk5wYjI1ekdGOGdBeWdTUWdJUUFUcE5DaGh3WVdOclpXUmZabWw0WldRek1sOWxlSFJsYm5OcCIsIA0KKyAgICAgICAgICAgICJiMjRTSnk1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBVR0ZqYTJWa1JYaDBaVzV6YVc5dWN4aGciLCANCisgICAgICAgICAgICAiSUFNb0IwSUNFQUU2VFFvWWNHRmphMlZrWDJacGVHVmtOalJmWlhoMFpXNXphVzl1RWljdWNISnZkRzlpIiwgDQorICAgICAgICAgICAgImRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEZCaFkydGxaRVY0ZEdWdWMybHZibk1ZWVNBREtBWkNBaEFCT2s0SyIsIA0KKyAgICAgICAgICAgICJHWEJoWTJ0bFpGOXpabWw0WldRek1sOWxlSFJsYm5OcGIyNFNKeTV3Y205MGIySjFabDkxYm1sMGRHVnoiLCANCisgICAgICAgICAgICAiZEM1VVpYTjBVR0ZqYTJWa1JYaDBaVzV6YVc5dWN4aGlJQU1vRDBJQ0VBRTZUZ29aY0dGamEyVmtYM05tIiwgDQorICAgICAgICAgICAgImFYaGxaRFkwWDJWNGRHVnVjMmx2YmhJbkxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JRWVdOciIsIA0KKyAgICAgICAgICAgICJaV1JGZUhSbGJuTnBiMjV6R0dNZ0F5Z1FRZ0lRQVRwTENoWndZV05yWldSZlpteHZZWFJmWlhoMFpXNXoiLCANCisgICAgICAgICAgICAiYVc5dUVpY3VjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEZCaFkydGxaRVY0ZEdWdWMybHZibk1ZIiwgDQorICAgICAgICAgICAgIlpDQURLQUpDQWhBQk9rd0tGM0JoWTJ0bFpGOWtiM1ZpYkdWZlpYaDBaVzV6YVc5dUVpY3VjSEp2ZEc5aSIsIA0KKyAgICAgICAgICAgICJkV1pmZFc1cGRIUmxjM1F1VkdWemRGQmhZMnRsWkVWNGRHVnVjMmx2Ym5NWVpTQURLQUZDQWhBQk9rb0siLCANCisgICAgICAgICAgICAiRlhCaFkydGxaRjlpYjI5c1gyVjRkR1Z1YzJsdmJoSW5MbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsIiwgDQorICAgICAgICAgICAgImMzUlFZV05yWldSRmVIUmxibk5wYjI1ekdHWWdBeWdJUWdJUUFUcHFDaFZ3WVdOclpXUmZaVzUxYlY5bCIsIA0KKyAgICAgICAgICAgICJlSFJsYm5OcGIyNFNKeTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFVHRmphMlZrUlhoMFpXNXoiLCANCisgICAgICAgICAgICAiYVc5dWN4aG5JQU1vRGpJZUxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExrWnZjbVZwWjI1RmJuVnRRZ0lRIiwgDQorICAgICAgICAgICAgIkFVSlRRZzFWYm1sMGRHVnpkRkJ5YjNSdlNBR0FBUUdJQVFHUUFRSENQallLSVVkdmIyZHNaUzVRY205MCIsIA0KKyAgICAgICAgICAiYjJOdmJFSjFabVpsY25NdVZHVnpkRkJ5YjNSdmN4SVJWVzVwZEZSbGMzUlFjbTkwYjBacGJHVT0iKSk7DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciBhc3NpZ25lciA9IGRlbGVnYXRlKHBiZDo6RmlsZURlc2NyaXB0b3Igcm9vdCkgew0KKyAgICAgICAgZGVzY3JpcHRvciA9IHJvb3Q7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiT3B0aW9uYWxJbnQzMiIsICJPcHRpb25hbEludDY0IiwgIk9wdGlvbmFsVWludDMyIiwgIk9wdGlvbmFsVWludDY0IiwgIk9wdGlvbmFsU2ludDMyIiwgIk9wdGlvbmFsU2ludDY0IiwgIk9wdGlvbmFsRml4ZWQzMiIsICJPcHRpb25hbEZpeGVkNjQiLCAiT3B0aW9uYWxTZml4ZWQzMiIsICJPcHRpb25hbFNmaXhlZDY0IiwgIk9wdGlvbmFsRmxvYXQiLCAiT3B0aW9uYWxEb3VibGUiLCAiT3B0aW9uYWxCb29sIiwgIk9wdGlvbmFsU3RyaW5nIiwgIk9wdGlvbmFsQnl0ZXMiLCAiT3B0aW9uYWxHcm91cCIsICJPcHRpb25hbE5lc3RlZE1lc3NhZ2UiLCAiT3B0aW9uYWxGb3JlaWduTWVzc2FnZSIsICJPcHRpb25hbEltcG9ydE1lc3NhZ2UiLCAiT3B0aW9uYWxOZXN0ZWRFbnVtIiwgIk9wdGlvbmFsRm9yZWlnbkVudW0iLCAiT3B0aW9uYWxJbXBvcnRFbnVtIiwgIk9wdGlvbmFsU3RyaW5nUGllY2UiLCAiT3B0aW9uYWxDb3JkIiwgIlJlcGVhdGVkSW50MzIiLCAiUmVwZWF0ZWRJbnQ2NCIsICJSZXBlYXRlZFVpbnQzMiIsICJSZXBlYXRlZFVpbnQ2NCIsICJSZXBlYXRlZFNpbnQzMiIsICJSZXBlYXRlZFNpbnQ2NCIsICJSZXBlYXRlZEZpeGVkMzIiLCAiUmVwZWF0ZWRGaXhlZDY0IiwgIlJlcGVhdGVkU2ZpeGVkMzIiLCAiUmVwZWF0ZWRTZml4ZWQ2NCIsICJSZXBlYXRlZEZsb2F0IiwgIlJlcGVhdGVkRG91YmxlIiwgIlJlcGVhdGVkQm9vbCIsICJSZXBlYXRlZFN0cmluZyIsICJSZXBlYXRlZEJ5dGVzIiwgIlJlcGVhdGVkR3JvdXAiLCAiUmVwZWF0ZWROZXN0ZWRNZXNzYWdlIiwgIlJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UiLCAiUmVwZWF0ZWRJbXBvcnRNZXNzYWdlIiwgIlJlcGVhdGVkTmVzdGVkRW51bSIsICJSZXBlYXRlZEZvcmVpZ25FbnVtIiwgIlJlcGVhdGVkSW1wb3J0RW51bSIsICJSZXBlYXRlZFN0cmluZ1BpZWNlIiwgIlJlcGVhdGVkQ29yZCIsICJEZWZhdWx0SW50MzIiLCAiRGVmYXVsdEludDY0IiwgIkRlZmF1bHRVaW50MzIiLCAiRGVmYXVsdFVpbnQ2NCIsICJEZWZhdWx0U2ludDMyIiwgIkRlZmF1bHRTaW50NjQiLCAiRGVmYXVsdEZpeGVkMzIiLCAiRGVmYXVsdEZpeGVkNjQiLCAiRGVmYXVsdFNmaXhlZDMyIiwgIkRlZmF1bHRTZml4ZWQ2NCIsICJEZWZhdWx0RmxvYXQiLCAiRGVmYXVsdERvdWJsZSIsICJEZWZhdWx0Qm9vbCIsICJEZWZhdWx0U3RyaW5nIiwgIkRlZmF1bHRCeXRlcyIsICJEZWZhdWx0TmVzdGVkRW51bSIsICJEZWZhdWx0Rm9yZWlnbkVudW0iLCAiRGVmYXVsdEltcG9ydEVudW0iLCAiRGVmYXVsdFN0cmluZ1BpZWNlIiwgIkRlZmF1bHRDb3JkIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlX19EZXNjcmlwdG9yID0gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfX0Rlc2NyaXB0b3IuTmVzdGVkVHlwZXNbMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkJiIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwX19EZXNjcmlwdG9yID0gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfX0Rlc2NyaXB0b3IuTmVzdGVkVHlwZXNbMV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfT3B0aW9uYWxHcm91cF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkEiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXBfX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19fRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1syXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXBfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cC5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19SZXBlYXRlZEdyb3VwX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RGVwcmVjYXRlZEZpZWxkc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RGVwcmVjYXRlZEZpZWxkc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdERlcHJlY2F0ZWRGaWVsZHMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REZXByZWNhdGVkRmllbGRzLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdERlcHJlY2F0ZWRGaWVsZHNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJEZXByZWNhdGVkSW50MzIiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9yZWlnbk1lc3NhZ2VfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9yZWlnbk1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0ZvcmVpZ25NZXNzYWdlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQyIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsRXh0ZW5zaW9uc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzNdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzRdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT3B0aW9uYWxHcm91cF9leHRlbnNpb24sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT3B0aW9uYWxHcm91cF9leHRlbnNpb25fX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1JlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbNV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1JlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVwZWF0ZWRHcm91cF9leHRlbnNpb24uQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkEiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZEV4dGVuc2lvbl9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzZdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkRXh0ZW5zaW9uX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZEV4dGVuc2lvbl9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgfSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uLlRlc3QgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZEV4dGVuc2lvbi5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMF0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVxdWlyZWRfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s3XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkEiLCAiRHVtbXkyIiwgIkIiLCAiRHVtbXk0IiwgIkR1bW15NSIsICJEdW1teTYiLCAiRHVtbXk3IiwgIkR1bW15OCIsICJEdW1teTkiLCAiRHVtbXkxMCIsICJEdW1teTExIiwgIkR1bW15MTIiLCAiRHVtbXkxMyIsICJEdW1teTE0IiwgIkR1bW15MTUiLCAiRHVtbXkxNiIsICJEdW1teTE3IiwgIkR1bW15MTgiLCAiRHVtbXkxOSIsICJEdW1teTIwIiwgIkR1bW15MjEiLCAiRHVtbXkyMiIsICJEdW1teTIzIiwgIkR1bW15MjQiLCAiRHVtbXkyNSIsICJEdW1teTI2IiwgIkR1bW15MjciLCAiRHVtbXkyOCIsICJEdW1teTI5IiwgIkR1bW15MzAiLCAiRHVtbXkzMSIsICJEdW1teTMyIiwgIkMiLCB9KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5TaW5nbGUgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1swXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuTXVsdGkgPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1sxXSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZEZvcmVpZ25fX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s4XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkRm9yZWlnbl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkRm9yZWlnbiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkRm9yZWlnbi5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZEZvcmVpZ25fX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJPcHRpb25hbE1lc3NhZ2UiLCAiUmVwZWF0ZWRNZXNzYWdlIiwgIkR1bW15IiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGb3JlaWduTmVzdGVkX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbOV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGb3JlaWduTmVzdGVkX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0Rm9yZWlnbk5lc3RlZCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZvcmVpZ25OZXN0ZWQuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Rm9yZWlnbk5lc3RlZF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkZvcmVpZ25OZXN0ZWQiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtcHR5TWVzc2FnZV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzEwXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtcHR5TWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbXB0eU1lc3NhZ2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxMV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxMl07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXJfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxM107DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZWFsbHlMYXJnZVRhZ051bWJlcl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXJfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgIkJiIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZWN1cnNpdmVNZXNzYWdlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTRdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVjdXJzaXZlTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgIkkiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11dHVhbFJlY3Vyc2lvbkFfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxNV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25BX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkJiIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25CX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTZdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11dHVhbFJlY3Vyc2lvbkJfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgIk9wdGlvbmFsSW50MzIiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTddOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlciwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQSIsICJGb28iLCAiQmFyIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9Gb29fX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9fRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX0Zvb19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvbywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvby5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9Gb29fX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9CYXJfX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9fRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1sxXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX0Jhcl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhciwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhci5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9CYXJfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzE4XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIk9wdGlvbmFsTmVzdGVkTWVzc2FnZSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfTmVzdGVkTWVzc2FnZV9fRGVzY3JpcHRvciA9IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfTmVzdGVkTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzX05lc3RlZE1lc3NhZ2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMiIsICJOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Q2FtZWxDYXNlRmllbGROYW1lc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzE5XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RDYW1lbENhc2VGaWVsZE5hbWVzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0Q2FtZWxDYXNlRmllbGROYW1lcy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiUHJpbWl0aXZlRmllbGQiLCAiU3RyaW5nRmllbGQiLCAiRW51bUZpZWxkIiwgIk1lc3NhZ2VGaWVsZCIsICJTdHJpbmdQaWVjZUZpZWxkIiwgIkNvcmRGaWVsZCIsICJSZXBlYXRlZFByaW1pdGl2ZUZpZWxkIiwgIlJlcGVhdGVkU3RyaW5nRmllbGQiLCAiUmVwZWF0ZWRFbnVtRmllbGQiLCAiUmVwZWF0ZWRNZXNzYWdlRmllbGQiLCAiUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkIiwgIlJlcGVhdGVkQ29yZEZpZWxkIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGaWVsZE9yZGVyaW5nc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzIwXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEZpZWxkT3JkZXJpbmdzX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RmllbGRPcmRlcmluZ3MsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RGaWVsZE9yZGVyaW5ncy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGaWVsZE9yZGVyaW5nc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIk15U3RyaW5nIiwgIk15SW50IiwgIk15RmxvYXQiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMjFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRXNjYXBlZEJ5dGVzIiwgIkxhcmdlVWludDMyIiwgIkxhcmdlVWludDY0IiwgIlNtYWxsSW50MzIiLCAiU21hbGxJbnQ2NCIsICJVdGY4U3RyaW5nIiwgIlplcm9GbG9hdCIsICJPbmVGbG9hdCIsICJTbWFsbEZsb2F0IiwgIk5lZ2F0aXZlT25lRmxvYXQiLCAiTmVnYXRpdmVGbG9hdCIsICJMYXJnZUZsb2F0IiwgIlNtYWxsTmVnYXRpdmVGbG9hdCIsICJJbmZEb3VibGUiLCAiTmVnSW5mRG91YmxlIiwgIk5hbkRvdWJsZSIsICJJbmZGbG9hdCIsICJOZWdJbmZGbG9hdCIsICJOYW5GbG9hdCIsICJDcHBUcmlncmFwaCIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9TcGFyc2VFbnVtTWVzc2FnZV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzIyXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfU3BhcnNlRW51bU1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwYXJzZUVudW1NZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGFyc2VFbnVtTWVzc2FnZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NwYXJzZUVudW1NZXNzYWdlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiU3BhcnNlRW51bSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVTdHJpbmdfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syM107DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09uZVN0cmluZ19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lU3RyaW5nLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVTdHJpbmcuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVTdHJpbmdfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJEYXRhIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09uZUJ5dGVzX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMjRdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVCeXRlc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lQnl0ZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9uZUJ5dGVzLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT25lQnl0ZXNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJEYXRhIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRUeXBlc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzI1XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFBhY2tlZFR5cGVzX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkVHlwZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRUeXBlc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIlBhY2tlZEludDMyIiwgIlBhY2tlZEludDY0IiwgIlBhY2tlZFVpbnQzMiIsICJQYWNrZWRVaW50NjQiLCAiUGFja2VkU2ludDMyIiwgIlBhY2tlZFNpbnQ2NCIsICJQYWNrZWRGaXhlZDMyIiwgIlBhY2tlZEZpeGVkNjQiLCAiUGFja2VkU2ZpeGVkMzIiLCAiUGFja2VkU2ZpeGVkNjQiLCAiUGFja2VkRmxvYXQiLCAiUGFja2VkRG91YmxlIiwgIlBhY2tlZEJvb2wiLCAiUGFja2VkRW51bSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0VW5wYWNrZWRUeXBlc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzI2XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFVucGFja2VkVHlwZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZFR5cGVzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRUeXBlcy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RVbnBhY2tlZFR5cGVzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiVW5wYWNrZWRJbnQzMiIsICJVbnBhY2tlZEludDY0IiwgIlVucGFja2VkVWludDMyIiwgIlVucGFja2VkVWludDY0IiwgIlVucGFja2VkU2ludDMyIiwgIlVucGFja2VkU2ludDY0IiwgIlVucGFja2VkRml4ZWQzMiIsICJVbnBhY2tlZEZpeGVkNjQiLCAiVW5wYWNrZWRTZml4ZWQzMiIsICJVbnBhY2tlZFNmaXhlZDY0IiwgIlVucGFja2VkRmxvYXQiLCAiVW5wYWNrZWREb3VibGUiLCAiVW5wYWNrZWRCb29sIiwgIlVucGFja2VkRW51bSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkRXh0ZW5zaW9uc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzI3XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFBhY2tlZEV4dGVuc2lvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9ucy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRFeHRlbnNpb25zX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMjhdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHluYW1pY0V4dGVuc2lvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiU2NhbGFyRXh0ZW5zaW9uIiwgIkVudW1FeHRlbnNpb24iLCAiRHluYW1pY0VudW1FeHRlbnNpb24iLCAiTWVzc2FnZUV4dGVuc2lvbiIsICJEeW5hbWljTWVzc2FnZUV4dGVuc2lvbiIsICJSZXBlYXRlZEV4dGVuc2lvbiIsICJQYWNrZWRFeHRlbnNpb24iLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX0R5bmFtaWNNZXNzYWdlVHlwZV9fRGVzY3JpcHRvciA9IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHluYW1pY0V4dGVuc2lvbnNfRHluYW1pY01lc3NhZ2VUeXBlX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX0R5bmFtaWNNZXNzYWdlVHlwZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkR5bmFtaWNGaWVsZCIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzI5XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiUmVwZWF0ZWRGaXhlZDMyIiwgIlJlcGVhdGVkSW50MzIiLCAiUmVwZWF0ZWRGaXhlZDY0IiwgIlJlcGVhdGVkSW50NjQiLCAiUmVwZWF0ZWRGbG9hdCIsICJSZXBlYXRlZFVpbnQ2NCIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXF1ZXN0X19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXF1ZXN0X19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0LkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9vUmVxdWVzdF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0Zvb1Jlc3BvbnNlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMzFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvb1Jlc3BvbnNlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9vUmVzcG9uc2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXF1ZXN0X19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMzJdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXF1ZXN0X19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXF1ZXN0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXF1ZXN0LkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQmFyUmVxdWVzdF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0JhclJlc3BvbnNlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMzNdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQmFyUmVzcG9uc2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQmFyUmVzcG9uc2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbnQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzFdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsVWludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjx1aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxVaW50NjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHVsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbM10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTaW50MzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzRdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjx1aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjx1bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzddKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzhdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s5XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZsb2F0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxmbG9hdD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzEwXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbERvdWJsZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248ZG91YmxlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTFdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQm9vbEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Ym9vbD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzEyXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFN0cmluZ0V4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248c3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTNdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQnl0ZXNFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHBiOjpCeXRlU3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTRdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsR3JvdXBFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTVdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2U+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1sxNl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1sxN10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMThdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1sxOV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syMF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMjFdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzIyXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbENvcmRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzIzXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syNF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzI1XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248dWludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzI2XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248dWxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syN10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzI4XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzI5XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHVpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szMF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjx1bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzMxXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szMl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzMzXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZsb2F0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxmbG9hdD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzM0XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248ZG91YmxlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMzVdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQm9vbEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Ym9vbD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzM2XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248c3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMzddKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQnl0ZXNFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHBiOjpCeXRlU3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMzhdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkR3JvdXBFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMzldKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2U+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0MF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0MV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNDJdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0M10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0NF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNDVdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzQ2XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZENvcmRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzQ3XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW50MzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzQ4XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW50NjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0OV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFVpbnQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248dWludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzUwXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0VWludDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjx1bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzUxXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s1Ml0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNpbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzUzXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248dWludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzU0XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248dWxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s1NV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s1Nl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNTddKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGbG9hdEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248ZmxvYXQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s1OF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdERvdWJsZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248ZG91YmxlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNTldKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRCb29sRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxib29sPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNjBdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzYxXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Qnl0ZXNFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHBiOjpCeXRlU3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNjJdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzYzXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNjRdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNjVdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248c3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNjZdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRDb3JkRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxzdHJpbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s2N10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuTXlFeHRlbnNpb25TdHJpbmcgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzY4XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5NeUV4dGVuc2lvbkludCA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNjldKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3MF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkSW50NjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3MV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkVWludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjx1aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNzJdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFVpbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248dWxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3M10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3NF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ludDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNzVdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEZpeGVkMzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHVpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3Nl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRml4ZWQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248dWxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3N10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ZpeGVkMzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzc4XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzc5XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGbG9hdEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248ZmxvYXQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s4MF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRG91YmxlRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxkb3VibGU+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s4MV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkQm9vbEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Ym9vbD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzgyXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRFbnVtRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzgzXSk7DQorICAgICAgICBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEltcG9ydFByb3RvRmlsZS5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5Ow0KKyAgICAgIH07DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oZGVzY3JpcHRvckRhdGEsDQorICAgICAgICAgIG5ldyBwYmQ6OkZpbGVEZXNjcmlwdG9yW10gew0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLkRlc2NyaXB0b3IsIA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEltcG9ydFByb3RvRmlsZS5EZXNjcmlwdG9yLCANCisgICAgICAgICAgfSwgYXNzaWduZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICB9DQorICAjcmVnaW9uIEVudW1zDQorICBwdWJsaWMgZW51bSBGb3JlaWduRW51bSB7DQorICAgIEZPUkVJR05fRk9PID0gNCwNCisgICAgRk9SRUlHTl9CQVIgPSA1LA0KKyAgICBGT1JFSUdOX0JBWiA9IDYsDQorICB9DQorICANCisgIHB1YmxpYyBlbnVtIFRlc3RFbnVtV2l0aER1cFZhbHVlIHsNCisgICAgRk9PMSA9IDEsDQorICAgIEJBUjEgPSAyLA0KKyAgICBCQVogPSAzLA0KKyAgICBGT08yID0gMSwNCisgICAgQkFSMiA9IDIsDQorICB9DQorICANCisgIHB1YmxpYyBlbnVtIFRlc3RTcGFyc2VFbnVtIHsNCisgICAgU1BBUlNFX0EgPSAxMjMsDQorICAgIFNQQVJTRV9CID0gNjIzNzQsDQorICAgIFNQQVJTRV9DID0gMTI1ODkyMzQsDQorICAgIFNQQVJTRV9EID0gLTE1LA0KKyAgICBTUEFSU0VfRSA9IC01MzQ1MiwNCisgICAgU1BBUlNFX0YgPSAwLA0KKyAgICBTUEFSU0VfRyA9IDIsDQorICB9DQorICANCisgICNlbmRyZWdpb24NCisgIA0KKyAgI3JlZ2lvbiBNZXNzYWdlcw0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0QWxsVHlwZXMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdEFsbFR5cGVzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RBbGxUeXBlcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdEFsbFR5cGVzKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0QWxsVHlwZXNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImRlZmF1bHRfYm9vbCIsICJkZWZhdWx0X2J5dGVzIiwgImRlZmF1bHRfY29yZCIsICJkZWZhdWx0X2RvdWJsZSIsICJkZWZhdWx0X2ZpeGVkMzIiLCAiZGVmYXVsdF9maXhlZDY0IiwgImRlZmF1bHRfZmxvYXQiLCAiZGVmYXVsdF9mb3JlaWduX2VudW0iLCAiZGVmYXVsdF9pbXBvcnRfZW51bSIsICJkZWZhdWx0X2ludDMyIiwgImRlZmF1bHRfaW50NjQiLCAiZGVmYXVsdF9uZXN0ZWRfZW51bSIsICJkZWZhdWx0X3NmaXhlZDMyIiwgImRlZmF1bHRfc2ZpeGVkNjQiLCAiZGVmYXVsdF9zaW50MzIiLCAiZGVmYXVsdF9zaW50NjQiLCAiZGVmYXVsdF9zdHJpbmciLCAiZGVmYXVsdF9zdHJpbmdfcGllY2UiLCAiZGVmYXVsdF91aW50MzIiLCAiZGVmYXVsdF91aW50NjQiLCAib3B0aW9uYWxfYm9vbCIsICJvcHRpb25hbF9ieXRlcyIsICJvcHRpb25hbF9jb3JkIiwgIm9wdGlvbmFsX2RvdWJsZSIsICJvcHRpb25hbF9maXhlZDMyIiwgIm9wdGlvbmFsX2ZpeGVkNjQiLCAib3B0aW9uYWxfZmxvYXQiLCAib3B0aW9uYWxfZm9yZWlnbl9lbnVtIiwgIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIsICJvcHRpb25hbF9pbXBvcnRfZW51bSIsICJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIsICJvcHRpb25hbF9pbnQzMiIsICJvcHRpb25hbF9pbnQ2NCIsICJvcHRpb25hbF9uZXN0ZWRfZW51bSIsICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIsICJvcHRpb25hbF9zZml4ZWQzMiIsICJvcHRpb25hbF9zZml4ZWQ2NCIsICJvcHRpb25hbF9zaW50MzIiLCAib3B0aW9uYWxfc2ludDY0IiwgIm9wdGlvbmFsX3N0cmluZyIsICJvcHRpb25hbF9zdHJpbmdfcGllY2UiLCAib3B0aW9uYWxfdWludDMyIiwgIm9wdGlvbmFsX3VpbnQ2NCIsICJvcHRpb25hbGdyb3VwIiwgInJlcGVhdGVkX2Jvb2wiLCAicmVwZWF0ZWRfYnl0ZXMiLCAicmVwZWF0ZWRfY29yZCIsICJyZXBlYXRlZF9kb3VibGUiLCAicmVwZWF0ZWRfZml4ZWQzMiIsICJyZXBlYXRlZF9maXhlZDY0IiwgInJlcGVhdGVkX2Zsb2F0IiwgInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIsICJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiLCAicmVwZWF0ZWRfaW1wb3J0X2VudW0iLCAicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiLCAicmVwZWF0ZWRfaW50MzIiLCAicmVwZWF0ZWRfaW50NjQiLCAicmVwZWF0ZWRfbmVzdGVkX2VudW0iLCAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiLCAicmVwZWF0ZWRfc2ZpeGVkMzIiLCAicmVwZWF0ZWRfc2ZpeGVkNjQiLCAicmVwZWF0ZWRfc2ludDMyIiwgInJlcGVhdGVkX3NpbnQ2NCIsICJyZXBlYXRlZF9zdHJpbmciLCAicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiwgInJlcGVhdGVkX3VpbnQzMiIsICJyZXBlYXRlZF91aW50NjQiLCAicmVwZWF0ZWRncm91cCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0QWxsVHlwZXNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgNTg0LCA2MDIsIDY4MiwgNTc3LCA1NDEsIDU0NSwgNTczLCA2NTYsIDY2NCwgNDg4LCA0OTYsIDY0OCwgNTU3LCA1NjEsIDUyMCwgNTI4LCA1OTQsIDY3NCwgNTA0LCA1MTIsIDEwNCwgMTIyLCAyMDIsIDk3LCA2MSwgNjUsIDkzLCAxNzYsIDE1NCwgMTg0LCAxNjIsIDgsIDE2LCAxNjgsIDE0NiwgNzcsIDgxLCA0MCwgNDgsIDExNCwgMTk0LCAyNCwgMzIsIDEzMSwgMzQ0LCAzNjIsIDQ0MiwgMzM3LCAzMDEsIDMwNSwgMzMzLCA0MTYsIDM5NCwgNDI0LCA0MDIsIDI0OCwgMjU2LCA0MDgsIDM4NiwgMzE3LCAzMjEsIDI4MCwgMjg4LCAzNTQsIDQzNCwgMjY0LCAyNzIsIDM3MSB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RBbGxUeXBlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0QWxsVHlwZXMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMNCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsNCisgICAgICBwdWJsaWMgZW51bSBOZXN0ZWRFbnVtIHsNCisgICAgICAgIEZPTyA9IDEsDQorICAgICAgICBCQVIgPSAyLA0KKyAgICAgICAgQkFaID0gMywNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgTmVzdGVkTWVzc2FnZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPE5lc3RlZE1lc3NhZ2UsIE5lc3RlZE1lc3NhZ2UuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBOZXN0ZWRNZXNzYWdlKCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBOZXN0ZWRNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBOZXN0ZWRNZXNzYWdlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfbmVzdGVkTWVzc2FnZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYmIiIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX25lc3RlZE1lc3NhZ2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCB9Ow0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgVGhpc01lc3NhZ2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPE5lc3RlZE1lc3NhZ2UsIE5lc3RlZE1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBCYkZpZWxkTnVtYmVyID0gMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNCYjsNCisgICAgICAgIHByaXZhdGUgaW50IGJiXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0JiIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0JiOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IEJiIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGJiXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9uZXN0ZWRNZXNzYWdlRmllbGROYW1lczsNCisgICAgICAgICAgaWYgKGhhc0JiKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEJiKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgDQorICAgICAgICAgIHNpemUgPSAwOw0KKyAgICAgICAgICBpZiAoaGFzQmIpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIEJiKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIE5lc3RlZE1lc3NhZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKE5lc3RlZE1lc3NhZ2UgcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxOZXN0ZWRNZXNzYWdlLCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKE5lc3RlZE1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICAgICAgcHJpdmF0ZSBOZXN0ZWRNZXNzYWdlIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgTmVzdGVkTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgTmVzdGVkTWVzc2FnZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBOZXN0ZWRNZXNzYWdlKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgTmVzdGVkTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBOZXN0ZWRNZXNzYWdlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciBpcyBOZXN0ZWRNZXNzYWdlKSB7DQorICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChOZXN0ZWRNZXNzYWdlKSBvdGhlcik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKE5lc3RlZE1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNCYikgew0KKyAgICAgICAgICAgICAgQmIgPSBvdGhlci5CYjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfbmVzdGVkTWVzc2FnZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX25lc3RlZE1lc3NhZ2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0JiID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYmJfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICANCisgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzQmIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQmI7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEJiIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkJiOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0QmIodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QmIoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQmIgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5iYl8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckJiKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0JiID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmJiXyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0YXRpYyBOZXN0ZWRNZXNzYWdlKCkgew0KKyAgICAgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBPcHRpb25hbEdyb3VwIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8T3B0aW9uYWxHcm91cCwgT3B0aW9uYWxHcm91cC5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIE9wdGlvbmFsR3JvdXAoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE9wdGlvbmFsR3JvdXAgZGVmYXVsdEluc3RhbmNlID0gbmV3IE9wdGlvbmFsR3JvdXAoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9vcHRpb25hbEdyb3VwRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiB9Ow0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9vcHRpb25hbEdyb3VwRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEzNiB9Ow0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIE9wdGlvbmFsR3JvdXAgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE9wdGlvbmFsR3JvdXAgVGhpc01lc3NhZ2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPE9wdGlvbmFsR3JvdXAsIE9wdGlvbmFsR3JvdXAuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBBRmllbGROdW1iZXIgPSAxNzsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgYV87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0E7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9vcHRpb25hbEdyb3VwRmllbGROYW1lczsNCisgICAgICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxNywgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxNywgQSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXAgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXAgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXAgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpdmF0ZSBPcHRpb25hbEdyb3VwIE1ha2VSZWFkT25seSgpIHsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihPcHRpb25hbEdyb3VwIHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8T3B0aW9uYWxHcm91cCwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihPcHRpb25hbEdyb3VwIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgT3B0aW9uYWxHcm91cCByZXN1bHQ7DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIE9wdGlvbmFsR3JvdXAgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIE9wdGlvbmFsR3JvdXAgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgT3B0aW9uYWxHcm91cCgpOw0KKyAgICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBPcHRpb25hbEdyb3VwIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIE9wdGlvbmFsR3JvdXAgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgT3B0aW9uYWxHcm91cCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgaXMgT3B0aW9uYWxHcm91cCkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoT3B0aW9uYWxHcm91cCkgb3RoZXIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShPcHRpb25hbEdyb3VwIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzQSkgew0KKyAgICAgICAgICAgICAgQSA9IG90aGVyLkE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX29wdGlvbmFsR3JvdXBGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgICAgIHRhZyA9IF9vcHRpb25hbEdyb3VwRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTM2OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5hXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0QSh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRBKGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5hXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQSgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmFfID0gMDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIE9wdGlvbmFsR3JvdXAoKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFJlcGVhdGVkR3JvdXAgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxSZXBlYXRlZEdyb3VwLCBSZXBlYXRlZEdyb3VwLkJ1aWxkZXI+IHsNCisgICAgICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cCgpIHsgfQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUmVwZWF0ZWRHcm91cCBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgUmVwZWF0ZWRHcm91cCgpLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3JlcGVhdGVkR3JvdXBGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImEiIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3JlcGVhdGVkR3JvdXBGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMzc2IH07DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cCBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXBfX0Rlc2NyaXB0b3I7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8UmVwZWF0ZWRHcm91cCwgUmVwZWF0ZWRHcm91cC5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXBfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEFGaWVsZE51bWJlciA9IDQ3Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0E7DQorICAgICAgICBwcml2YXRlIGludCBhXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzQTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGFfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3JlcGVhdGVkR3JvdXBGaWVsZE5hbWVzOw0KKyAgICAgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDQ3LCBmaWVsZF9uYW1lc1swXSwgQSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgIA0KKyAgICAgICAgICBzaXplID0gMDsNCisgICAgICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDQ3LCBBKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIFJlcGVhdGVkR3JvdXAgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFJlcGVhdGVkR3JvdXAgcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxSZXBlYXRlZEdyb3VwLCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKFJlcGVhdGVkR3JvdXAgY2xvbmVGcm9tKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICAgICAgcHJpdmF0ZSBSZXBlYXRlZEdyb3VwIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgUmVwZWF0ZWRHcm91cCBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZXBlYXRlZEdyb3VwKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFJlcGVhdGVkR3JvdXAgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAuRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBSZXBlYXRlZEdyb3VwIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciBpcyBSZXBlYXRlZEdyb3VwKSB7DQorICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChSZXBlYXRlZEdyb3VwKSBvdGhlcik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFJlcGVhdGVkR3JvdXAgb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfcmVwZWF0ZWRHcm91cEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX3JlcGVhdGVkR3JvdXBGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAzNzY6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzQSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmFfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICANCisgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRBKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuYV8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgUmVwZWF0ZWRHcm91cCgpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEludDMyRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxJbnQzMjsNCisgICAgcHJpdmF0ZSBpbnQgb3B0aW9uYWxJbnQzMl87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbEludDMyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBPcHRpb25hbEludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxJbnQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEludDY0RmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxJbnQ2NDsNCisgICAgcHJpdmF0ZSBsb25nIG9wdGlvbmFsSW50NjRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxJbnQ2NDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIE9wdGlvbmFsSW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEludDY0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsVWludDMyRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxVaW50MzI7DQorICAgIHByaXZhdGUgdWludCBvcHRpb25hbFVpbnQzMl87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsVWludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxVaW50MzI7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgT3B0aW9uYWxVaW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFVpbnQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFVpbnQ2NEZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsVWludDY0Ow0KKyAgICBwcml2YXRlIHVsb25nIG9wdGlvbmFsVWludDY0XzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxVaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbFVpbnQ2NDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgT3B0aW9uYWxVaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFVpbnQ2NF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFNpbnQzMkZpZWxkTnVtYmVyID0gNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsU2ludDMyOw0KKyAgICBwcml2YXRlIGludCBvcHRpb25hbFNpbnQzMl87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU2ludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxTaW50MzI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IE9wdGlvbmFsU2ludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxTaW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTaW50NjRGaWVsZE51bWJlciA9IDY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbFNpbnQ2NDsNCisgICAgcHJpdmF0ZSBsb25nIG9wdGlvbmFsU2ludDY0XzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbFNpbnQ2NDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIE9wdGlvbmFsU2ludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxTaW50NjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxGaXhlZDMyRmllbGROdW1iZXIgPSA3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxGaXhlZDMyOw0KKyAgICBwcml2YXRlIHVpbnQgb3B0aW9uYWxGaXhlZDMyXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGaXhlZDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxGaXhlZDMyOyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IE9wdGlvbmFsRml4ZWQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsRml4ZWQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEZpeGVkNjRGaWVsZE51bWJlciA9IDg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbEZpeGVkNjQ7DQorICAgIHByaXZhdGUgdWxvbmcgb3B0aW9uYWxGaXhlZDY0XzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGaXhlZDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxGaXhlZDY0OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBPcHRpb25hbEZpeGVkNjQgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEZpeGVkNjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTZml4ZWQzMkZpZWxkTnVtYmVyID0gOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsU2ZpeGVkMzI7DQorICAgIHByaXZhdGUgaW50IG9wdGlvbmFsU2ZpeGVkMzJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFNmaXhlZDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxTZml4ZWQzMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgT3B0aW9uYWxTZml4ZWQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU2ZpeGVkMzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTZml4ZWQ2NEZpZWxkTnVtYmVyID0gMTA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbFNmaXhlZDY0Ow0KKyAgICBwcml2YXRlIGxvbmcgb3B0aW9uYWxTZml4ZWQ2NF87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU2ZpeGVkNjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbFNmaXhlZDY0OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgT3B0aW9uYWxTZml4ZWQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU2ZpeGVkNjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxGbG9hdEZpZWxkTnVtYmVyID0gMTE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbEZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IG9wdGlvbmFsRmxvYXRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxGbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBPcHRpb25hbEZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbERvdWJsZUZpZWxkTnVtYmVyID0gMTI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbERvdWJsZTsNCisgICAgcHJpdmF0ZSBkb3VibGUgb3B0aW9uYWxEb3VibGVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbERvdWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsRG91YmxlOyB9DQorICAgIH0NCisgICAgcHVibGljIGRvdWJsZSBPcHRpb25hbERvdWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsRG91YmxlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQm9vbEZpZWxkTnVtYmVyID0gMTM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbEJvb2w7DQorICAgIHByaXZhdGUgYm9vbCBvcHRpb25hbEJvb2xfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEJvb2wgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbEJvb2w7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBPcHRpb25hbEJvb2wgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEJvb2xfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTdHJpbmdGaWVsZE51bWJlciA9IDE0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxTdHJpbmc7DQorICAgIHByaXZhdGUgc3RyaW5nIG9wdGlvbmFsU3RyaW5nXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFN0cmluZyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsU3RyaW5nOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBPcHRpb25hbFN0cmluZyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU3RyaW5nXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQnl0ZXNGaWVsZE51bWJlciA9IDE1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxCeXRlczsNCisgICAgcHJpdmF0ZSBwYjo6Qnl0ZVN0cmluZyBvcHRpb25hbEJ5dGVzXyA9IHBiOjpCeXRlU3RyaW5nLkVtcHR5Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEJ5dGVzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxCeXRlczsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBPcHRpb25hbEJ5dGVzIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxCeXRlc187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEdyb3VwRmllbGROdW1iZXIgPSAxNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsR3JvdXA7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAgb3B0aW9uYWxHcm91cF87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsR3JvdXAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbEdyb3VwOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwIE9wdGlvbmFsR3JvdXAgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEdyb3VwXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbE5lc3RlZE1lc3NhZ2VGaWVsZE51bWJlciA9IDE4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIG9wdGlvbmFsTmVzdGVkTWVzc2FnZV87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSBPcHRpb25hbE5lc3RlZE1lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbE5lc3RlZE1lc3NhZ2VfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VGaWVsZE51bWJlciA9IDE5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBvcHRpb25hbEZvcmVpZ25NZXNzYWdlXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2U7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgT3B0aW9uYWxGb3JlaWduTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsSW1wb3J0TWVzc2FnZUZpZWxkTnVtYmVyID0gMjA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbEltcG9ydE1lc3NhZ2U7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZSBvcHRpb25hbEltcG9ydE1lc3NhZ2VfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEltcG9ydE1lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbEltcG9ydE1lc3NhZ2U7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZSBPcHRpb25hbEltcG9ydE1lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEltcG9ydE1lc3NhZ2VfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxOZXN0ZWRFbnVtRmllbGROdW1iZXIgPSAyMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsTmVzdGVkRW51bTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSBvcHRpb25hbE5lc3RlZEVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uRk9POw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbE5lc3RlZEVudW0gew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbE5lc3RlZEVudW07IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gT3B0aW9uYWxOZXN0ZWRFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxOZXN0ZWRFbnVtXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRm9yZWlnbkVudW1GaWVsZE51bWJlciA9IDIyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxGb3JlaWduRW51bTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBvcHRpb25hbEZvcmVpZ25FbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtLkZPUkVJR05fRk9POw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEZvcmVpZ25FbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxGb3JlaWduRW51bTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBPcHRpb25hbEZvcmVpZ25FbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxGb3JlaWduRW51bV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEltcG9ydEVudW1GaWVsZE51bWJlciA9IDIzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxJbXBvcnRFbnVtOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0gb3B0aW9uYWxJbXBvcnRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0uSU1QT1JUX0ZPTzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxJbXBvcnRFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxJbXBvcnRFbnVtOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0gT3B0aW9uYWxJbXBvcnRFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxJbXBvcnRFbnVtXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU3RyaW5nUGllY2VGaWVsZE51bWJlciA9IDI0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxTdHJpbmdQaWVjZTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgb3B0aW9uYWxTdHJpbmdQaWVjZV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTdHJpbmdQaWVjZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsU3RyaW5nUGllY2U7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIE9wdGlvbmFsU3RyaW5nUGllY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFN0cmluZ1BpZWNlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQ29yZEZpZWxkTnVtYmVyID0gMjU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbENvcmQ7DQorICAgIHByaXZhdGUgc3RyaW5nIG9wdGlvbmFsQ29yZF8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxDb3JkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxDb3JkOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBPcHRpb25hbENvcmQgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbENvcmRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbnQzMkZpZWxkTnVtYmVyID0gMzE7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiByZXBlYXRlZEludDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gUmVwZWF0ZWRJbnQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRJbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEludDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEludDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgR2V0UmVwZWF0ZWRJbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRJbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW50NjRGaWVsZE51bWJlciA9IDMyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+IHJlcGVhdGVkSW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGxvbmc+IFJlcGVhdGVkSW50NjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkSW50NjRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRJbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRJbnQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBHZXRSZXBlYXRlZEludDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEludDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRVaW50MzJGaWVsZE51bWJlciA9IDMzOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+IHJlcGVhdGVkVWludDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWludD4gUmVwZWF0ZWRVaW50MzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkVWludDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkVWludDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFVpbnQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgR2V0UmVwZWF0ZWRVaW50MzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkVWludDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRVaW50NjRGaWVsZE51bWJlciA9IDM0Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiByZXBlYXRlZFVpbnQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1bG9uZz4gUmVwZWF0ZWRVaW50NjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkVWludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkVWludDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFVpbnQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIEdldFJlcGVhdGVkVWludDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFVpbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU2ludDMyRmllbGROdW1iZXIgPSAzNTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IHJlcGVhdGVkU2ludDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gUmVwZWF0ZWRTaW50MzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkU2ludDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ludDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFNpbnQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkU2ludDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFNpbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU2ludDY0RmllbGROdW1iZXIgPSAzNjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiByZXBlYXRlZFNpbnQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gUmVwZWF0ZWRTaW50NjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkU2ludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ludDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFNpbnQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBHZXRSZXBlYXRlZFNpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRTaW50NjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZpeGVkMzJGaWVsZE51bWJlciA9IDM3Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+IHJlcGVhdGVkRml4ZWQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVpbnQ+IFJlcGVhdGVkRml4ZWQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRGaXhlZDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRml4ZWQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGaXhlZDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBHZXRSZXBlYXRlZEZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRml4ZWQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRml4ZWQ2NEZpZWxkTnVtYmVyID0gMzg7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+IHJlcGVhdGVkRml4ZWQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1bG9uZz4gUmVwZWF0ZWRGaXhlZDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEZpeGVkNjRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGaXhlZDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEZpeGVkNjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBHZXRSZXBlYXRlZEZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRml4ZWQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU2ZpeGVkMzJGaWVsZE51bWJlciA9IDM5Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gcmVwZWF0ZWRTZml4ZWQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFJlcGVhdGVkU2ZpeGVkMzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkU2ZpeGVkMzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRTZml4ZWQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRTZml4ZWQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkU2ZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkU2ZpeGVkMzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNmaXhlZDY0RmllbGROdW1iZXIgPSA0MDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiByZXBlYXRlZFNmaXhlZDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBSZXBlYXRlZFNmaXhlZDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFNmaXhlZDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ZpeGVkNjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU2ZpeGVkNjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRTZml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRTZml4ZWQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRmxvYXRGaWVsZE51bWJlciA9IDQxOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGZsb2F0PiByZXBlYXRlZEZsb2F0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxmbG9hdD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8ZmxvYXQ+IFJlcGVhdGVkRmxvYXRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkRmxvYXRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGbG9hdENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGbG9hdF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgR2V0UmVwZWF0ZWRGbG9hdChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRGbG9hdF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRG91YmxlRmllbGROdW1iZXIgPSA0MjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxkb3VibGU+IHJlcGVhdGVkRG91YmxlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxkb3VibGU+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGRvdWJsZT4gUmVwZWF0ZWREb3VibGVMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkRG91YmxlXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRG91YmxlQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZERvdWJsZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZG91YmxlIEdldFJlcGVhdGVkRG91YmxlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZERvdWJsZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkQm9vbEZpZWxkTnVtYmVyID0gNDM7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Ym9vbD4gcmVwZWF0ZWRCb29sXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxib29sPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxib29sPiBSZXBlYXRlZEJvb2xMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkQm9vbF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEJvb2xDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkQm9vbF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBHZXRSZXBlYXRlZEJvb2woaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkQm9vbF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU3RyaW5nRmllbGROdW1iZXIgPSA0NDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+IHJlcGVhdGVkU3RyaW5nXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gUmVwZWF0ZWRTdHJpbmdMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkU3RyaW5nXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkU3RyaW5nQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFN0cmluZ18uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFN0cmluZ19baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkQnl0ZXNGaWVsZE51bWJlciA9IDQ1Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHBiOjpCeXRlU3RyaW5nPiByZXBlYXRlZEJ5dGVzXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxwYjo6Qnl0ZVN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8cGI6OkJ5dGVTdHJpbmc+IFJlcGVhdGVkQnl0ZXNMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkQnl0ZXNfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRCeXRlc0NvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRCeXRlc18uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgR2V0UmVwZWF0ZWRCeXRlcyhpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRCeXRlc19baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkR3JvdXBGaWVsZE51bWJlciA9IDQ2Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwPiByZXBlYXRlZEdyb3VwXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXA+IFJlcGVhdGVkR3JvdXBMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRHcm91cF87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkR3JvdXBDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkR3JvdXBfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwIEdldFJlcGVhdGVkR3JvdXAoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkR3JvdXBfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZE5lc3RlZE1lc3NhZ2VGaWVsZE51bWJlciA9IDQ4Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPiByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZT4gUmVwZWF0ZWROZXN0ZWRNZXNzYWdlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkTmVzdGVkTWVzc2FnZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkTmVzdGVkTWVzc2FnZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSBHZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkTmVzdGVkTWVzc2FnZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VGaWVsZE51bWJlciA9IDQ5Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPiByZXBlYXRlZEZvcmVpZ25NZXNzYWdlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGb3JlaWduTWVzc2FnZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIEdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEltcG9ydE1lc3NhZ2VGaWVsZE51bWJlciA9IDUwOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2U+IHJlcGVhdGVkSW1wb3J0TWVzc2FnZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZT4gUmVwZWF0ZWRJbXBvcnRNZXNzYWdlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkSW1wb3J0TWVzc2FnZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW1wb3J0TWVzc2FnZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlIEdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRJbXBvcnRNZXNzYWdlX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWROZXN0ZWRFbnVtRmllbGROdW1iZXIgPSA1MTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bT4gcmVwZWF0ZWROZXN0ZWRFbnVtXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+IFJlcGVhdGVkTmVzdGVkRW51bUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWROZXN0ZWRFbnVtXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkTmVzdGVkRW51bUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWROZXN0ZWRFbnVtXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSBHZXRSZXBlYXRlZE5lc3RlZEVudW0oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkTmVzdGVkRW51bV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRm9yZWlnbkVudW1GaWVsZE51bWJlciA9IDUyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiByZXBlYXRlZEZvcmVpZ25FbnVtXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkRm9yZWlnbkVudW1fKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGb3JlaWduRW51bUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGb3JlaWduRW51bV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gR2V0UmVwZWF0ZWRGb3JlaWduRW51bShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRGb3JlaWduRW51bV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW1wb3J0RW51bUZpZWxkTnVtYmVyID0gNTM7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4gcmVwZWF0ZWRJbXBvcnRFbnVtXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPiBSZXBlYXRlZEltcG9ydEVudW1MaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkSW1wb3J0RW51bV8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEltcG9ydEVudW1Db3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkSW1wb3J0RW51bV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSBHZXRSZXBlYXRlZEltcG9ydEVudW0oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkSW1wb3J0RW51bV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZE51bWJlciA9IDU0Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gcmVwZWF0ZWRTdHJpbmdQaWVjZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxzdHJpbmc+IFJlcGVhdGVkU3RyaW5nUGllY2VMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkU3RyaW5nUGllY2VfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRTdHJpbmdQaWVjZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRTdHJpbmdQaWVjZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nUGllY2UoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkU3RyaW5nUGllY2VfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZENvcmRGaWVsZE51bWJlciA9IDU1Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gcmVwZWF0ZWRDb3JkXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gUmVwZWF0ZWRDb3JkTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZENvcmRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRDb3JkQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZENvcmRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZENvcmQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkQ29yZF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRJbnQzMkZpZWxkTnVtYmVyID0gNjE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0SW50MzI7DQorICAgIHByaXZhdGUgaW50IGRlZmF1bHRJbnQzMl8gPSA0MTsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdEludDMyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEZWZhdWx0SW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEludDY0RmllbGROdW1iZXIgPSA2MjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRJbnQ2NDsNCisgICAgcHJpdmF0ZSBsb25nIGRlZmF1bHRJbnQ2NF8gPSA0Mkw7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRJbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRJbnQ2NDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIERlZmF1bHRJbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnQ2NF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0VWludDMyRmllbGROdW1iZXIgPSA2MzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRVaW50MzI7DQorICAgIHByaXZhdGUgdWludCBkZWZhdWx0VWludDMyXyA9IDQzOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0VWludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdFVpbnQzMjsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBEZWZhdWx0VWludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdFVpbnQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0VWludDY0RmllbGROdW1iZXIgPSA2NDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRVaW50NjQ7DQorICAgIHByaXZhdGUgdWxvbmcgZGVmYXVsdFVpbnQ2NF8gPSA0NFVMOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0VWludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdFVpbnQ2NDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgRGVmYXVsdFVpbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRVaW50NjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFNpbnQzMkZpZWxkTnVtYmVyID0gNjU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0U2ludDMyOw0KKyAgICBwcml2YXRlIGludCBkZWZhdWx0U2ludDMyXyA9IC00NTsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFNpbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRTaW50MzI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IERlZmF1bHRTaW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0U2ludDMyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTaW50NjRGaWVsZE51bWJlciA9IDY2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdFNpbnQ2NDsNCisgICAgcHJpdmF0ZSBsb25nIGRlZmF1bHRTaW50NjRfID0gNDY7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0U2ludDY0OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRGVmYXVsdFNpbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRTaW50NjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEZpeGVkMzJGaWVsZE51bWJlciA9IDY3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdEZpeGVkMzI7DQorICAgIHByaXZhdGUgdWludCBkZWZhdWx0Rml4ZWQzMl8gPSA0NzsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEZpeGVkMzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0Rml4ZWQzMjsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBEZWZhdWx0Rml4ZWQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRGaXhlZDMyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRGaXhlZDY0RmllbGROdW1iZXIgPSA2ODsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRGaXhlZDY0Ow0KKyAgICBwcml2YXRlIHVsb25nIGRlZmF1bHRGaXhlZDY0XyA9IDQ4Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Rml4ZWQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRGaXhlZDY0OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBEZWZhdWx0Rml4ZWQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRGaXhlZDY0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTZml4ZWQzMkZpZWxkTnVtYmVyID0gNjk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0U2ZpeGVkMzI7DQorICAgIHByaXZhdGUgaW50IGRlZmF1bHRTZml4ZWQzMl8gPSA0OTsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFNmaXhlZDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdFNmaXhlZDMyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEZWZhdWx0U2ZpeGVkMzIgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0U2ZpeGVkMzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFNmaXhlZDY0RmllbGROdW1iZXIgPSA3MDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRTZml4ZWQ2NDsNCisgICAgcHJpdmF0ZSBsb25nIGRlZmF1bHRTZml4ZWQ2NF8gPSAtNTA7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTZml4ZWQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRTZml4ZWQ2NDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIERlZmF1bHRTZml4ZWQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRTZml4ZWQ2NF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0RmxvYXRGaWVsZE51bWJlciA9IDcxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdEZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IGRlZmF1bHRGbG9hdF8gPSA1MS41RjsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdEZsb2F0OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IERlZmF1bHRGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0RG91YmxlRmllbGROdW1iZXIgPSA3MjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHREb3VibGU7DQorICAgIHByaXZhdGUgZG91YmxlIGRlZmF1bHREb3VibGVfID0gNTIwMDBEOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0RG91YmxlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdERvdWJsZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBkb3VibGUgRGVmYXVsdERvdWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHREb3VibGVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEJvb2xGaWVsZE51bWJlciA9IDczOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdEJvb2w7DQorICAgIHByaXZhdGUgYm9vbCBkZWZhdWx0Qm9vbF8gPSB0cnVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Qm9vbCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRCb29sOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRGVmYXVsdEJvb2wgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0Qm9vbF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0U3RyaW5nRmllbGROdW1iZXIgPSA3NDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRTdHJpbmc7DQorICAgIHByaXZhdGUgc3RyaW5nIGRlZmF1bHRTdHJpbmdfID0gImhlbGxvIjsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFN0cmluZyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRTdHJpbmc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIERlZmF1bHRTdHJpbmcgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0U3RyaW5nXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRCeXRlc0ZpZWxkTnVtYmVyID0gNzU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0Qnl0ZXM7DQorICAgIHByaXZhdGUgcGI6OkJ5dGVTdHJpbmcgZGVmYXVsdEJ5dGVzXyA9IChwYjo6Qnl0ZVN0cmluZykgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IuRmllbGRzWzYyXS5EZWZhdWx0VmFsdWU7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRCeXRlcyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRCeXRlczsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBEZWZhdWx0Qnl0ZXMgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0Qnl0ZXNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdE5lc3RlZEVudW1GaWVsZE51bWJlciA9IDgxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdE5lc3RlZEVudW07DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gZGVmYXVsdE5lc3RlZEVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uQkFSOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0TmVzdGVkRW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHROZXN0ZWRFbnVtOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIERlZmF1bHROZXN0ZWRFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdE5lc3RlZEVudW1fOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEZvcmVpZ25FbnVtRmllbGROdW1iZXIgPSA4MjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRGb3JlaWduRW51bTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBkZWZhdWx0Rm9yZWlnbkVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0uRk9SRUlHTl9CQVI7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRGb3JlaWduRW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRGb3JlaWduRW51bTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBEZWZhdWx0Rm9yZWlnbkVudW0gew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0Rm9yZWlnbkVudW1fOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEltcG9ydEVudW1GaWVsZE51bWJlciA9IDgzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdEltcG9ydEVudW07DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSBkZWZhdWx0SW1wb3J0RW51bV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtLklNUE9SVF9CQVI7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRJbXBvcnRFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdEltcG9ydEVudW07IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSBEZWZhdWx0SW1wb3J0RW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbXBvcnRFbnVtXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTdHJpbmdQaWVjZUZpZWxkTnVtYmVyID0gODQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0U3RyaW5nUGllY2U7DQorICAgIHByaXZhdGUgc3RyaW5nIGRlZmF1bHRTdHJpbmdQaWVjZV8gPSAiYWJjIjsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFN0cmluZ1BpZWNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdFN0cmluZ1BpZWNlOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBEZWZhdWx0U3RyaW5nUGllY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0U3RyaW5nUGllY2VfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdENvcmRGaWVsZE51bWJlciA9IDg1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdENvcmQ7DQorICAgIHByaXZhdGUgc3RyaW5nIGRlZmF1bHRDb3JkXyA9ICIxMjMiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Q29yZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRDb3JkOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBEZWZhdWx0Q29yZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRDb3JkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdEFsbFR5cGVzRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMzFdLCBPcHRpb25hbEludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW50NjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KDIsIGZpZWxkX25hbWVzWzMyXSwgT3B0aW9uYWxJbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFVpbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlVUludDMyKDMsIGZpZWxkX25hbWVzWzQxXSwgT3B0aW9uYWxVaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxVaW50NjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQ2NCg0LCBmaWVsZF9uYW1lc1s0Ml0sIE9wdGlvbmFsVWludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsU2ludDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTSW50MzIoNSwgZmllbGRfbmFtZXNbMzddLCBPcHRpb25hbFNpbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFNpbnQ2NCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ludDY0KDYsIGZpZWxkX25hbWVzWzM4XSwgT3B0aW9uYWxTaW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxGaXhlZDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDMyKDcsIGZpZWxkX25hbWVzWzI0XSwgT3B0aW9uYWxGaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRml4ZWQ2NCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQ2NCg4LCBmaWVsZF9uYW1lc1syNV0sIE9wdGlvbmFsRml4ZWQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFNmaXhlZDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQzMig5LCBmaWVsZF9uYW1lc1szNV0sIE9wdGlvbmFsU2ZpeGVkMzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTZml4ZWQ2NCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ZpeGVkNjQoMTAsIGZpZWxkX25hbWVzWzM2XSwgT3B0aW9uYWxTZml4ZWQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZsb2F0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgxMSwgZmllbGRfbmFtZXNbMjZdLCBPcHRpb25hbEZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRG91YmxlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGUoMTIsIGZpZWxkX25hbWVzWzIzXSwgT3B0aW9uYWxEb3VibGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxCb29sKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDEzLCBmaWVsZF9uYW1lc1syMF0sIE9wdGlvbmFsQm9vbCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFN0cmluZykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDE0LCBmaWVsZF9uYW1lc1szOV0sIE9wdGlvbmFsU3RyaW5nKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsQnl0ZXMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKDE1LCBmaWVsZF9uYW1lc1syMV0sIE9wdGlvbmFsQnl0ZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxHcm91cCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlR3JvdXAoMTYsIGZpZWxkX25hbWVzWzQzXSwgT3B0aW9uYWxHcm91cCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMTgsIGZpZWxkX25hbWVzWzM0XSwgT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMTksIGZpZWxkX25hbWVzWzI4XSwgT3B0aW9uYWxGb3JlaWduTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMjAsIGZpZWxkX25hbWVzWzMwXSwgT3B0aW9uYWxJbXBvcnRNZXNzYWdlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsTmVzdGVkRW51bSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSgyMSwgZmllbGRfbmFtZXNbMzNdLCAoaW50KSBPcHRpb25hbE5lc3RlZEVudW0sIE9wdGlvbmFsTmVzdGVkRW51bSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZvcmVpZ25FbnVtKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDIyLCBmaWVsZF9uYW1lc1syN10sIChpbnQpIE9wdGlvbmFsRm9yZWlnbkVudW0sIE9wdGlvbmFsRm9yZWlnbkVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbXBvcnRFbnVtKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDIzLCBmaWVsZF9uYW1lc1syOV0sIChpbnQpIE9wdGlvbmFsSW1wb3J0RW51bSwgT3B0aW9uYWxJbXBvcnRFbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsU3RyaW5nUGllY2UpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygyNCwgZmllbGRfbmFtZXNbNDBdLCBPcHRpb25hbFN0cmluZ1BpZWNlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsQ29yZCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDI1LCBmaWVsZF9uYW1lc1syMl0sIE9wdGlvbmFsQ29yZCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyQXJyYXkoMzEsIGZpZWxkX25hbWVzWzU1XSwgcmVwZWF0ZWRJbnQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRJbnQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NEFycmF5KDMyLCBmaWVsZF9uYW1lc1s1Nl0sIHJlcGVhdGVkSW50NjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkVWludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQzMkFycmF5KDMzLCBmaWVsZF9uYW1lc1s2NV0sIHJlcGVhdGVkVWludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFVpbnQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50NjRBcnJheSgzNCwgZmllbGRfbmFtZXNbNjZdLCByZXBlYXRlZFVpbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRTaW50MzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ludDMyQXJyYXkoMzUsIGZpZWxkX25hbWVzWzYxXSwgcmVwZWF0ZWRTaW50MzJfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkU2ludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNJbnQ2NEFycmF5KDM2LCBmaWVsZF9uYW1lc1s2Ml0sIHJlcGVhdGVkU2ludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEZpeGVkMzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQzMkFycmF5KDM3LCBmaWVsZF9uYW1lc1s0OF0sIHJlcGVhdGVkRml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRGaXhlZDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkNjRBcnJheSgzOCwgZmllbGRfbmFtZXNbNDldLCByZXBlYXRlZEZpeGVkNjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkU2ZpeGVkMzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ZpeGVkMzJBcnJheSgzOSwgZmllbGRfbmFtZXNbNTldLCByZXBlYXRlZFNmaXhlZDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFNmaXhlZDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNGaXhlZDY0QXJyYXkoNDAsIGZpZWxkX25hbWVzWzYwXSwgcmVwZWF0ZWRTZml4ZWQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRGbG9hdF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdEFycmF5KDQxLCBmaWVsZF9uYW1lc1s1MF0sIHJlcGVhdGVkRmxvYXRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkRG91YmxlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZURvdWJsZUFycmF5KDQyLCBmaWVsZF9uYW1lc1s0N10sIHJlcGVhdGVkRG91YmxlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEJvb2xfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbEFycmF5KDQzLCBmaWVsZF9uYW1lc1s0NF0sIHJlcGVhdGVkQm9vbF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRTdHJpbmdfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoNDQsIGZpZWxkX25hbWVzWzYzXSwgcmVwZWF0ZWRTdHJpbmdfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkQnl0ZXNfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQnl0ZXNBcnJheSg0NSwgZmllbGRfbmFtZXNbNDVdLCByZXBlYXRlZEJ5dGVzXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEdyb3VwXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUdyb3VwQXJyYXkoNDYsIGZpZWxkX25hbWVzWzY3XSwgcmVwZWF0ZWRHcm91cF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSg0OCwgZmllbGRfbmFtZXNbNThdLCByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDQ5LCBmaWVsZF9uYW1lc1s1Ml0sIHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlQXJyYXkoNTAsIGZpZWxkX25hbWVzWzU0XSwgcmVwZWF0ZWRJbXBvcnRNZXNzYWdlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZE5lc3RlZEVudW1fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bUFycmF5KDUxLCBmaWVsZF9uYW1lc1s1N10sIHJlcGVhdGVkTmVzdGVkRW51bV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRGb3JlaWduRW51bV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtQXJyYXkoNTIsIGZpZWxkX25hbWVzWzUxXSwgcmVwZWF0ZWRGb3JlaWduRW51bV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRJbXBvcnRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW1BcnJheSg1MywgZmllbGRfbmFtZXNbNTNdLCByZXBlYXRlZEltcG9ydEVudW1fKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkU3RyaW5nUGllY2VfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoNTQsIGZpZWxkX25hbWVzWzY0XSwgcmVwZWF0ZWRTdHJpbmdQaWVjZV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRDb3JkXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZ0FycmF5KDU1LCBmaWVsZF9uYW1lc1s0Nl0sIHJlcGVhdGVkQ29yZF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEludDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig2MSwgZmllbGRfbmFtZXNbOV0sIERlZmF1bHRJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0SW50NjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KDYyLCBmaWVsZF9uYW1lc1sxMF0sIERlZmF1bHRJbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0VWludDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50MzIoNjMsIGZpZWxkX25hbWVzWzE4XSwgRGVmYXVsdFVpbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0VWludDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50NjQoNjQsIGZpZWxkX25hbWVzWzE5XSwgRGVmYXVsdFVpbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0U2ludDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTSW50MzIoNjUsIGZpZWxkX25hbWVzWzE0XSwgRGVmYXVsdFNpbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0U2ludDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTSW50NjQoNjYsIGZpZWxkX25hbWVzWzE1XSwgRGVmYXVsdFNpbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0Rml4ZWQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQzMig2NywgZmllbGRfbmFtZXNbNF0sIERlZmF1bHRGaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRGaXhlZDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDY0KDY4LCBmaWVsZF9uYW1lc1s1XSwgRGVmYXVsdEZpeGVkNjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFNmaXhlZDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQzMig2OSwgZmllbGRfbmFtZXNbMTJdLCBEZWZhdWx0U2ZpeGVkMzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFNmaXhlZDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQ2NCg3MCwgZmllbGRfbmFtZXNbMTNdLCBEZWZhdWx0U2ZpeGVkNjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEZsb2F0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCg3MSwgZmllbGRfbmFtZXNbNl0sIERlZmF1bHRGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0RG91YmxlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGUoNzIsIGZpZWxkX25hbWVzWzNdLCBEZWZhdWx0RG91YmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRCb29sKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDczLCBmaWVsZF9uYW1lc1swXSwgRGVmYXVsdEJvb2wpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFN0cmluZykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDc0LCBmaWVsZF9uYW1lc1sxNl0sIERlZmF1bHRTdHJpbmcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEJ5dGVzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCeXRlcyg3NSwgZmllbGRfbmFtZXNbMV0sIERlZmF1bHRCeXRlcyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0TmVzdGVkRW51bSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSg4MSwgZmllbGRfbmFtZXNbMTFdLCAoaW50KSBEZWZhdWx0TmVzdGVkRW51bSwgRGVmYXVsdE5lc3RlZEVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEZvcmVpZ25FbnVtKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDgyLCBmaWVsZF9uYW1lc1s3XSwgKGludCkgRGVmYXVsdEZvcmVpZ25FbnVtLCBEZWZhdWx0Rm9yZWlnbkVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEltcG9ydEVudW0pIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW0oODMsIGZpZWxkX25hbWVzWzhdLCAoaW50KSBEZWZhdWx0SW1wb3J0RW51bSwgRGVmYXVsdEltcG9ydEVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFN0cmluZ1BpZWNlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoODQsIGZpZWxkX25hbWVzWzE3XSwgRGVmYXVsdFN0cmluZ1BpZWNlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRDb3JkKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoODUsIGZpZWxkX25hbWVzWzJdLCBEZWZhdWx0Q29yZCk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbnQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBPcHRpb25hbEludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW50NjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUoMiwgT3B0aW9uYWxJbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFVpbnQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQzMlNpemUoMywgT3B0aW9uYWxVaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxVaW50NjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50NjRTaXplKDQsIE9wdGlvbmFsVWludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsU2ludDMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDMyU2l6ZSg1LCBPcHRpb25hbFNpbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFNpbnQ2NCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQ2NFNpemUoNiwgT3B0aW9uYWxTaW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxGaXhlZDMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRml4ZWQzMlNpemUoNywgT3B0aW9uYWxGaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRml4ZWQ2NCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZpeGVkNjRTaXplKDgsIE9wdGlvbmFsRml4ZWQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFNmaXhlZDMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ZpeGVkMzJTaXplKDksIE9wdGlvbmFsU2ZpeGVkMzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTZml4ZWQ2NCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNGaXhlZDY0U2l6ZSgxMCwgT3B0aW9uYWxTZml4ZWQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDExLCBPcHRpb25hbEZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRG91YmxlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRG91YmxlU2l6ZSgxMiwgT3B0aW9uYWxEb3VibGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxCb29sKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMTMsIE9wdGlvbmFsQm9vbCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFN0cmluZykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMTQsIE9wdGlvbmFsU3RyaW5nKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsQnl0ZXMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCeXRlc1NpemUoMTUsIE9wdGlvbmFsQnl0ZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxHcm91cCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUdyb3VwU2l6ZSgxNiwgT3B0aW9uYWxHcm91cCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxOCwgT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxOSwgT3B0aW9uYWxGb3JlaWduTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgyMCwgT3B0aW9uYWxJbXBvcnRNZXNzYWdlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsTmVzdGVkRW51bSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDIxLCAoaW50KSBPcHRpb25hbE5lc3RlZEVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxGb3JlaWduRW51bSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDIyLCAoaW50KSBPcHRpb25hbEZvcmVpZ25FbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW1wb3J0RW51bSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDIzLCAoaW50KSBPcHRpb25hbEltcG9ydEVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTdHJpbmdQaWVjZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMjQsIE9wdGlvbmFsU3RyaW5nUGllY2UpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxDb3JkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgyNSwgT3B0aW9uYWxDb3JkKTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIFJlcGVhdGVkSW50MzJMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRJbnQzMl8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChsb25nIGVsZW1lbnQgaW4gUmVwZWF0ZWRJbnQ2NExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZEludDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHVpbnQgZWxlbWVudCBpbiBSZXBlYXRlZFVpbnQzMkxpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50MzJTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRVaW50MzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAodWxvbmcgZWxlbWVudCBpbiBSZXBlYXRlZFVpbnQ2NExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50NjRTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRVaW50NjRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoaW50IGVsZW1lbnQgaW4gUmVwZWF0ZWRTaW50MzJMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkU2ludDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGxvbmcgZWxlbWVudCBpbiBSZXBlYXRlZFNpbnQ2NExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50NjRTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRTaW50NjRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogcmVwZWF0ZWRGaXhlZDMyXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZEZpeGVkMzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogcmVwZWF0ZWRGaXhlZDY0Xy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZEZpeGVkNjRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogcmVwZWF0ZWRTZml4ZWQzMl8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRTZml4ZWQzMl8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDggKiByZXBlYXRlZFNmaXhlZDY0Xy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZFNmaXhlZDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHJlcGVhdGVkRmxvYXRfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkRmxvYXRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogcmVwZWF0ZWREb3VibGVfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkRG91YmxlXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gMSAqIHJlcGVhdGVkQm9vbF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRCb29sXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIFJlcGVhdGVkU3RyaW5nTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZFN0cmluZ18uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChwYjo6Qnl0ZVN0cmluZyBlbGVtZW50IGluIFJlcGVhdGVkQnl0ZXNMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRCeXRlc18uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwIGVsZW1lbnQgaW4gUmVwZWF0ZWRHcm91cExpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVHcm91cFNpemUoNDYsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSBlbGVtZW50IGluIFJlcGVhdGVkTmVzdGVkTWVzc2FnZUxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSg0OCwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIGVsZW1lbnQgaW4gUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSg0OSwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UgZWxlbWVudCBpbiBSZXBlYXRlZEltcG9ydE1lc3NhZ2VMaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoNTAsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKHJlcGVhdGVkTmVzdGVkRW51bV8uQ291bnQgPiAwKSB7DQorICAgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIGVsZW1lbnQgaW4gcmVwZWF0ZWROZXN0ZWRFbnVtXykgew0KKyAgICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemVOb1RhZygoaW50KSBlbGVtZW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZE5lc3RlZEVudW1fLkNvdW50Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKHJlcGVhdGVkRm9yZWlnbkVudW1fLkNvdW50ID4gMCkgew0KKyAgICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBlbGVtZW50IGluIHJlcGVhdGVkRm9yZWlnbkVudW1fKSB7DQorICAgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZU5vVGFnKChpbnQpIGVsZW1lbnQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkRm9yZWlnbkVudW1fLkNvdW50Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKHJlcGVhdGVkSW1wb3J0RW51bV8uQ291bnQgPiAwKSB7DQorICAgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0gZWxlbWVudCBpbiByZXBlYXRlZEltcG9ydEVudW1fKSB7DQorICAgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZU5vVGFnKChpbnQpIGVsZW1lbnQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkSW1wb3J0RW51bV8uQ291bnQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChzdHJpbmcgZWxlbWVudCBpbiBSZXBlYXRlZFN0cmluZ1BpZWNlTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZFN0cmluZ1BpZWNlXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIFJlcGVhdGVkQ29yZExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRDb3JkXy5Db3VudDsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRJbnQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg2MSwgRGVmYXVsdEludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRJbnQ2NCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZSg2MiwgRGVmYXVsdEludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRVaW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50MzJTaXplKDYzLCBEZWZhdWx0VWludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRVaW50NjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50NjRTaXplKDY0LCBEZWZhdWx0VWludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTaW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50MzJTaXplKDY1LCBEZWZhdWx0U2ludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTaW50NjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50NjRTaXplKDY2LCBEZWZhdWx0U2ludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRGaXhlZDMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRml4ZWQzMlNpemUoNjcsIERlZmF1bHRGaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRGaXhlZDY0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRml4ZWQ2NFNpemUoNjgsIERlZmF1bHRGaXhlZDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTZml4ZWQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNGaXhlZDMyU2l6ZSg2OSwgRGVmYXVsdFNmaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTZml4ZWQ2NCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNGaXhlZDY0U2l6ZSg3MCwgRGVmYXVsdFNmaXhlZDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRGbG9hdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSg3MSwgRGVmYXVsdEZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHREb3VibGUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVEb3VibGVTaXplKDcyLCBEZWZhdWx0RG91YmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRCb29sKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoNzMsIERlZmF1bHRCb29sKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTdHJpbmcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDc0LCBEZWZhdWx0U3RyaW5nKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRCeXRlcykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJ5dGVzU2l6ZSg3NSwgRGVmYXVsdEJ5dGVzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHROZXN0ZWRFbnVtKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoODEsIChpbnQpIERlZmF1bHROZXN0ZWRFbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRGb3JlaWduRW51bSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDgyLCAoaW50KSBEZWZhdWx0Rm9yZWlnbkVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEltcG9ydEVudW0pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSg4MywgKGludCkgRGVmYXVsdEltcG9ydEVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFN0cmluZ1BpZWNlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSg4NCwgRGVmYXVsdFN0cmluZ1BpZWNlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRDb3JkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSg4NSwgRGVmYXVsdENvcmQpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0QWxsVHlwZXMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJlcGVhdGVkSW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkSW50NjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkVWludDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZFVpbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRTaW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU2ludDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEZpeGVkMzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkRml4ZWQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRTZml4ZWQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRTZml4ZWQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRGbG9hdF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWREb3VibGVfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkQm9vbF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRTdHJpbmdfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkQnl0ZXNfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkR3JvdXBfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZE5lc3RlZEVudW1fLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkRm9yZWlnbkVudW1fLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkSW1wb3J0RW51bV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRTdHJpbmdQaWVjZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRDb3JkXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RBbGxUeXBlcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RBbGxUeXBlcyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RBbGxUeXBlcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0QWxsVHlwZXMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0QWxsVHlwZXMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0QWxsVHlwZXMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RBbGxUeXBlcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0QWxsVHlwZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEFsbFR5cGVzIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0QWxsVHlwZXMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdEFsbFR5cGVzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdEFsbFR5cGVzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsSW50MzIpIHsNCisgICAgICAgICAgT3B0aW9uYWxJbnQzMiA9IG90aGVyLk9wdGlvbmFsSW50MzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxJbnQ2NCkgew0KKyAgICAgICAgICBPcHRpb25hbEludDY0ID0gb3RoZXIuT3B0aW9uYWxJbnQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbFVpbnQzMikgew0KKyAgICAgICAgICBPcHRpb25hbFVpbnQzMiA9IG90aGVyLk9wdGlvbmFsVWludDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsVWludDY0KSB7DQorICAgICAgICAgIE9wdGlvbmFsVWludDY0ID0gb3RoZXIuT3B0aW9uYWxVaW50NjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxTaW50MzIpIHsNCisgICAgICAgICAgT3B0aW9uYWxTaW50MzIgPSBvdGhlci5PcHRpb25hbFNpbnQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbFNpbnQ2NCkgew0KKyAgICAgICAgICBPcHRpb25hbFNpbnQ2NCA9IG90aGVyLk9wdGlvbmFsU2ludDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsRml4ZWQzMikgew0KKyAgICAgICAgICBPcHRpb25hbEZpeGVkMzIgPSBvdGhlci5PcHRpb25hbEZpeGVkMzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxGaXhlZDY0KSB7DQorICAgICAgICAgIE9wdGlvbmFsRml4ZWQ2NCA9IG90aGVyLk9wdGlvbmFsRml4ZWQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbFNmaXhlZDMyKSB7DQorICAgICAgICAgIE9wdGlvbmFsU2ZpeGVkMzIgPSBvdGhlci5PcHRpb25hbFNmaXhlZDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsU2ZpeGVkNjQpIHsNCisgICAgICAgICAgT3B0aW9uYWxTZml4ZWQ2NCA9IG90aGVyLk9wdGlvbmFsU2ZpeGVkNjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxGbG9hdCkgew0KKyAgICAgICAgICBPcHRpb25hbEZsb2F0ID0gb3RoZXIuT3B0aW9uYWxGbG9hdDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbERvdWJsZSkgew0KKyAgICAgICAgICBPcHRpb25hbERvdWJsZSA9IG90aGVyLk9wdGlvbmFsRG91YmxlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsQm9vbCkgew0KKyAgICAgICAgICBPcHRpb25hbEJvb2wgPSBvdGhlci5PcHRpb25hbEJvb2w7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxTdHJpbmcpIHsNCisgICAgICAgICAgT3B0aW9uYWxTdHJpbmcgPSBvdGhlci5PcHRpb25hbFN0cmluZzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEJ5dGVzKSB7DQorICAgICAgICAgIE9wdGlvbmFsQnl0ZXMgPSBvdGhlci5PcHRpb25hbEJ5dGVzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsR3JvdXApIHsNCisgICAgICAgICAgTWVyZ2VPcHRpb25hbEdyb3VwKG90aGVyLk9wdGlvbmFsR3JvdXApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSkgew0KKyAgICAgICAgICBNZXJnZU9wdGlvbmFsTmVzdGVkTWVzc2FnZShvdGhlci5PcHRpb25hbE5lc3RlZE1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpIHsNCisgICAgICAgICAgTWVyZ2VPcHRpb25hbEZvcmVpZ25NZXNzYWdlKG90aGVyLk9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSkgew0KKyAgICAgICAgICBNZXJnZU9wdGlvbmFsSW1wb3J0TWVzc2FnZShvdGhlci5PcHRpb25hbEltcG9ydE1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsTmVzdGVkRW51bSkgew0KKyAgICAgICAgICBPcHRpb25hbE5lc3RlZEVudW0gPSBvdGhlci5PcHRpb25hbE5lc3RlZEVudW07DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxGb3JlaWduRW51bSkgew0KKyAgICAgICAgICBPcHRpb25hbEZvcmVpZ25FbnVtID0gb3RoZXIuT3B0aW9uYWxGb3JlaWduRW51bTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEltcG9ydEVudW0pIHsNCisgICAgICAgICAgT3B0aW9uYWxJbXBvcnRFbnVtID0gb3RoZXIuT3B0aW9uYWxJbXBvcnRFbnVtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsU3RyaW5nUGllY2UpIHsNCisgICAgICAgICAgT3B0aW9uYWxTdHJpbmdQaWVjZSA9IG90aGVyLk9wdGlvbmFsU3RyaW5nUGllY2U7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxDb3JkKSB7DQorICAgICAgICAgIE9wdGlvbmFsQ29yZCA9IG90aGVyLk9wdGlvbmFsQ29yZDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDMyXy5BZGQob3RoZXIucmVwZWF0ZWRJbnQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkSW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50NjRfLkFkZChvdGhlci5yZXBlYXRlZEludDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRVaW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDMyXy5BZGQob3RoZXIucmVwZWF0ZWRVaW50MzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFVpbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50NjRfLkFkZChvdGhlci5yZXBlYXRlZFVpbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkU2ludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQzMl8uQWRkKG90aGVyLnJlcGVhdGVkU2ludDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRTaW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDY0Xy5BZGQob3RoZXIucmVwZWF0ZWRTaW50NjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEZpeGVkMzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQzMl8uQWRkKG90aGVyLnJlcGVhdGVkRml4ZWQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkRml4ZWQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xy5BZGQob3RoZXIucmVwZWF0ZWRGaXhlZDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRTZml4ZWQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRTZml4ZWQzMl8uQWRkKG90aGVyLnJlcGVhdGVkU2ZpeGVkMzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFNmaXhlZDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNmaXhlZDY0Xy5BZGQob3RoZXIucmVwZWF0ZWRTZml4ZWQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkRmxvYXRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRmxvYXRfLkFkZChvdGhlci5yZXBlYXRlZEZsb2F0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWREb3VibGVfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRG91YmxlXy5BZGQob3RoZXIucmVwZWF0ZWREb3VibGVfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEJvb2xfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkQm9vbF8uQWRkKG90aGVyLnJlcGVhdGVkQm9vbF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkU3RyaW5nXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ18uQWRkKG90aGVyLnJlcGVhdGVkU3RyaW5nXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRCeXRlc18uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRCeXRlc18uQWRkKG90aGVyLnJlcGVhdGVkQnl0ZXNfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEdyb3VwXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEdyb3VwXy5BZGQob3RoZXIucmVwZWF0ZWRHcm91cF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5BZGQob3RoZXIucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8uQWRkKG90aGVyLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEltcG9ydE1lc3NhZ2VfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQWRkKG90aGVyLnJlcGVhdGVkSW1wb3J0TWVzc2FnZV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkTmVzdGVkRW51bV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRFbnVtXy5BZGQob3RoZXIucmVwZWF0ZWROZXN0ZWRFbnVtXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRGb3JlaWduRW51bV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduRW51bV8uQWRkKG90aGVyLnJlcGVhdGVkRm9yZWlnbkVudW1fKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEltcG9ydEVudW1fLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0RW51bV8uQWRkKG90aGVyLnJlcGVhdGVkSW1wb3J0RW51bV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkU3RyaW5nUGllY2VfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VfLkFkZChvdGhlci5yZXBlYXRlZFN0cmluZ1BpZWNlXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRDb3JkXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZENvcmRfLkFkZChvdGhlci5yZXBlYXRlZENvcmRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0SW50MzIpIHsNCisgICAgICAgICAgRGVmYXVsdEludDMyID0gb3RoZXIuRGVmYXVsdEludDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRJbnQ2NCkgew0KKyAgICAgICAgICBEZWZhdWx0SW50NjQgPSBvdGhlci5EZWZhdWx0SW50NjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdFVpbnQzMikgew0KKyAgICAgICAgICBEZWZhdWx0VWludDMyID0gb3RoZXIuRGVmYXVsdFVpbnQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0VWludDY0KSB7DQorICAgICAgICAgIERlZmF1bHRVaW50NjQgPSBvdGhlci5EZWZhdWx0VWludDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRTaW50MzIpIHsNCisgICAgICAgICAgRGVmYXVsdFNpbnQzMiA9IG90aGVyLkRlZmF1bHRTaW50MzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdFNpbnQ2NCkgew0KKyAgICAgICAgICBEZWZhdWx0U2ludDY0ID0gb3RoZXIuRGVmYXVsdFNpbnQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0Rml4ZWQzMikgew0KKyAgICAgICAgICBEZWZhdWx0Rml4ZWQzMiA9IG90aGVyLkRlZmF1bHRGaXhlZDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRGaXhlZDY0KSB7DQorICAgICAgICAgIERlZmF1bHRGaXhlZDY0ID0gb3RoZXIuRGVmYXVsdEZpeGVkNjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdFNmaXhlZDMyKSB7DQorICAgICAgICAgIERlZmF1bHRTZml4ZWQzMiA9IG90aGVyLkRlZmF1bHRTZml4ZWQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0U2ZpeGVkNjQpIHsNCisgICAgICAgICAgRGVmYXVsdFNmaXhlZDY0ID0gb3RoZXIuRGVmYXVsdFNmaXhlZDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRGbG9hdCkgew0KKyAgICAgICAgICBEZWZhdWx0RmxvYXQgPSBvdGhlci5EZWZhdWx0RmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdERvdWJsZSkgew0KKyAgICAgICAgICBEZWZhdWx0RG91YmxlID0gb3RoZXIuRGVmYXVsdERvdWJsZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0Qm9vbCkgew0KKyAgICAgICAgICBEZWZhdWx0Qm9vbCA9IG90aGVyLkRlZmF1bHRCb29sOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRTdHJpbmcpIHsNCisgICAgICAgICAgRGVmYXVsdFN0cmluZyA9IG90aGVyLkRlZmF1bHRTdHJpbmc7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdEJ5dGVzKSB7DQorICAgICAgICAgIERlZmF1bHRCeXRlcyA9IG90aGVyLkRlZmF1bHRCeXRlczsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0TmVzdGVkRW51bSkgew0KKyAgICAgICAgICBEZWZhdWx0TmVzdGVkRW51bSA9IG90aGVyLkRlZmF1bHROZXN0ZWRFbnVtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRGb3JlaWduRW51bSkgew0KKyAgICAgICAgICBEZWZhdWx0Rm9yZWlnbkVudW0gPSBvdGhlci5EZWZhdWx0Rm9yZWlnbkVudW07DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdEltcG9ydEVudW0pIHsNCisgICAgICAgICAgRGVmYXVsdEltcG9ydEVudW0gPSBvdGhlci5EZWZhdWx0SW1wb3J0RW51bTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0U3RyaW5nUGllY2UpIHsNCisgICAgICAgICAgRGVmYXVsdFN0cmluZ1BpZWNlID0gb3RoZXIuRGVmYXVsdFN0cmluZ1BpZWNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRDb3JkKSB7DQorICAgICAgICAgIERlZmF1bHRDb3JkID0gb3RoZXIuRGVmYXVsdENvcmQ7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0QWxsVHlwZXNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdEFsbFR5cGVzRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEludDMyID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQub3B0aW9uYWxJbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEludDY0ID0gaW5wdXQuUmVhZEludDY0KHJlZiByZXN1bHQub3B0aW9uYWxJbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFVpbnQzMiA9IGlucHV0LlJlYWRVSW50MzIocmVmIHJlc3VsdC5vcHRpb25hbFVpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFVpbnQ2NCA9IGlucHV0LlJlYWRVSW50NjQocmVmIHJlc3VsdC5vcHRpb25hbFVpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNpbnQzMiA9IGlucHV0LlJlYWRTSW50MzIocmVmIHJlc3VsdC5vcHRpb25hbFNpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNpbnQ2NCA9IGlucHV0LlJlYWRTSW50NjQocmVmIHJlc3VsdC5vcHRpb25hbFNpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZpeGVkMzIgPSBpbnB1dC5SZWFkRml4ZWQzMihyZWYgcmVzdWx0Lm9wdGlvbmFsRml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjU6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZpeGVkNjQgPSBpbnB1dC5SZWFkRml4ZWQ2NChyZWYgcmVzdWx0Lm9wdGlvbmFsRml4ZWQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzc6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNmaXhlZDMyID0gaW5wdXQuUmVhZFNGaXhlZDMyKHJlZiByZXN1bHQub3B0aW9uYWxTZml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNmaXhlZDY0ID0gaW5wdXQuUmVhZFNGaXhlZDY0KHJlZiByZXN1bHQub3B0aW9uYWxTZml4ZWQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgOTM6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZsb2F0ID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQub3B0aW9uYWxGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgOTc6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbERvdWJsZSA9IGlucHV0LlJlYWREb3VibGUocmVmIHJlc3VsdC5vcHRpb25hbERvdWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxCb29sID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5vcHRpb25hbEJvb2xfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDExNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0Lm9wdGlvbmFsU3RyaW5nXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMjI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEJ5dGVzID0gaW5wdXQuUmVhZEJ5dGVzKHJlZiByZXN1bHQub3B0aW9uYWxCeXRlc18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTMxOiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsR3JvdXApIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oT3B0aW9uYWxHcm91cCk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkR3JvdXAoMTYsIHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIE9wdGlvbmFsR3JvdXAgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTQ2OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShPcHRpb25hbE5lc3RlZE1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE1NDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgT3B0aW9uYWxGb3JlaWduTWVzc2FnZSA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjI6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShPcHRpb25hbEltcG9ydE1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgT3B0aW9uYWxJbXBvcnRNZXNzYWdlID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2ODogew0KKyAgICAgICAgICAgICAgb2JqZWN0IHVua25vd247DQorICAgICAgICAgICAgICBpZihpbnB1dC5SZWFkRW51bShyZWYgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkRW51bV8sIG91dCB1bmtub3duKSkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRFbnVtID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgyMSwgKHVsb25nKShpbnQpdW5rbm93bik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNzY6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5vcHRpb25hbEZvcmVpZ25FbnVtXywgb3V0IHVua25vd24pKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25FbnVtID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgyMiwgKHVsb25nKShpbnQpdW5rbm93bik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODQ6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5vcHRpb25hbEltcG9ydEVudW1fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW1wb3J0RW51bSA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoMjMsICh1bG9uZykoaW50KXVua25vd24pOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTk0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTdHJpbmdQaWVjZSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5vcHRpb25hbFN0cmluZ1BpZWNlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMDI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbENvcmQgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQub3B0aW9uYWxDb3JkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNTA6DQorICAgICAgICAgICAgY2FzZSAyNDg6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkSW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI1ODoNCisgICAgICAgICAgICBjYXNlIDI1Njogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEludDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRJbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjY2Og0KKyAgICAgICAgICAgIGNhc2UgMjY0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkVUludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRVaW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI3NDoNCisgICAgICAgICAgICBjYXNlIDI3Mjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFVJbnQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkVWludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyODI6DQorICAgICAgICAgICAgY2FzZSAyODA6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZFNpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjkwOg0KKyAgICAgICAgICAgIGNhc2UgMjg4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ludDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTaW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI5ODoNCisgICAgICAgICAgICBjYXNlIDMwMTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEZpeGVkMzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEZpeGVkMzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMwNjoNCisgICAgICAgICAgICBjYXNlIDMwNTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEZpeGVkNjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMxNDoNCisgICAgICAgICAgICBjYXNlIDMxNzogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNGaXhlZDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTZml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzIyOg0KKyAgICAgICAgICAgIGNhc2UgMzIxOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ZpeGVkNjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZFNmaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzMzA6DQorICAgICAgICAgICAgY2FzZSAzMzM6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGbG9hdEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkRmxvYXRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMzODoNCisgICAgICAgICAgICBjYXNlIDMzNzogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZERvdWJsZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkRG91YmxlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzNDY6DQorICAgICAgICAgICAgY2FzZSAzNDQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRCb29sQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRCb29sXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzNTQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTdHJpbmdBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZFN0cmluZ18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzYyOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkQnl0ZXNBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEJ5dGVzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzNzE6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRHcm91cEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkR3JvdXBfLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cC5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM4Njogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM5NDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0MDI6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRJbXBvcnRNZXNzYWdlXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQxMDoNCisgICAgICAgICAgICBjYXNlIDQwODogew0KKyAgICAgICAgICAgICAgc2NnOjpJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd25JdGVtczsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXk8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkTmVzdGVkRW51bV8sIG91dCB1bmtub3duSXRlbXMpOw0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25JdGVtcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IHJhd1ZhbHVlIGluIHVua25vd25JdGVtcykNCisgICAgICAgICAgICAgICAgICBpZiAocmF3VmFsdWUgaXMgaW50KQ0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5NZXJnZVZhcmludEZpZWxkKDUxLCAodWxvbmcpKGludClyYXdWYWx1ZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0MTg6DQorICAgICAgICAgICAgY2FzZSA0MTY6IHsNCisgICAgICAgICAgICAgIHNjZzo6SUNvbGxlY3Rpb248b2JqZWN0PiB1bmtub3duSXRlbXM7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRW51bUFycmF5PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPih0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25FbnVtXywgb3V0IHVua25vd25JdGVtcyk7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkl0ZW1zICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgcmF3VmFsdWUgaW4gdW5rbm93bkl0ZW1zKQ0KKyAgICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZSBpcyBpbnQpDQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoNTIsICh1bG9uZykoaW50KXJhd1ZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQyNjoNCisgICAgICAgICAgICBjYXNlIDQyNDogew0KKyAgICAgICAgICAgICAgc2NnOjpJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd25JdGVtczsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXk8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4odGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRJbXBvcnRFbnVtXywgb3V0IHVua25vd25JdGVtcyk7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkl0ZW1zICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgcmF3VmFsdWUgaW4gdW5rbm93bkl0ZW1zKQ0KKyAgICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZSBpcyBpbnQpDQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoNTMsICh1bG9uZykoaW50KXJhd1ZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQzNDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQ0Mjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkQ29yZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDg4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEludDMyID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZGVmYXVsdEludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0OTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0SW50NjQgPSBpbnB1dC5SZWFkSW50NjQocmVmIHJlc3VsdC5kZWZhdWx0SW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDUwNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRVaW50MzIgPSBpbnB1dC5SZWFkVUludDMyKHJlZiByZXN1bHQuZGVmYXVsdFVpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTEyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFVpbnQ2NCA9IGlucHV0LlJlYWRVSW50NjQocmVmIHJlc3VsdC5kZWZhdWx0VWludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1MjA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ludDMyID0gaW5wdXQuUmVhZFNJbnQzMihyZWYgcmVzdWx0LmRlZmF1bHRTaW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDUyODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTaW50NjQgPSBpbnB1dC5SZWFkU0ludDY0KHJlZiByZXN1bHQuZGVmYXVsdFNpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTQxOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEZpeGVkMzIgPSBpbnB1dC5SZWFkRml4ZWQzMihyZWYgcmVzdWx0LmRlZmF1bHRGaXhlZDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1NDU6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Rml4ZWQ2NCA9IGlucHV0LlJlYWRGaXhlZDY0KHJlZiByZXN1bHQuZGVmYXVsdEZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU1Nzogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTZml4ZWQzMiA9IGlucHV0LlJlYWRTRml4ZWQzMihyZWYgcmVzdWx0LmRlZmF1bHRTZml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTYxOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNmaXhlZDY0ID0gaW5wdXQuUmVhZFNGaXhlZDY0KHJlZiByZXN1bHQuZGVmYXVsdFNmaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1NzM6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0RmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5kZWZhdWx0RmxvYXRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU3Nzogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHREb3VibGUgPSBpbnB1dC5SZWFkRG91YmxlKHJlZiByZXN1bHQuZGVmYXVsdERvdWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTg0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEJvb2wgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmRlZmF1bHRCb29sXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1OTQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U3RyaW5nID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmRlZmF1bHRTdHJpbmdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDYwMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRCeXRlcyA9IGlucHV0LlJlYWRCeXRlcyhyZWYgcmVzdWx0LmRlZmF1bHRCeXRlc18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjQ4OiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQuZGVmYXVsdE5lc3RlZEVudW1fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHROZXN0ZWRFbnVtID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCg4MSwgKHVsb25nKShpbnQpdW5rbm93bik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2NTY6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5kZWZhdWx0Rm9yZWlnbkVudW1fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGb3JlaWduRW51bSA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoODIsICh1bG9uZykoaW50KXVua25vd24pOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjY0OiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQuZGVmYXVsdEltcG9ydEVudW1fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRJbXBvcnRFbnVtID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCg4MywgKHVsb25nKShpbnQpdW5rbm93bik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2NzQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U3RyaW5nUGllY2UgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZGVmYXVsdFN0cmluZ1BpZWNlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2ODI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Q29yZCA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5kZWZhdWx0Q29yZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgT3B0aW9uYWxJbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsSW50MzI7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsSW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW50MzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEludDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbnQzMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEludDY0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIE9wdGlvbmFsSW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEludDY0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEludDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbnQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbnQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsSW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW50NjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEludDY0XyA9IDBMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsVWludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxVaW50MzI7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgT3B0aW9uYWxVaW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbFVpbnQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxVaW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsVWludDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxVaW50MzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsVWludDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxVaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsVWludDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxVaW50MzJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFVpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsVWludDY0OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBPcHRpb25hbFVpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsVWludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbFVpbnQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxVaW50NjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxVaW50NjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsVWludDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxVaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsVWludDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxVaW50NjRfID0gMFVMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU2ludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxTaW50MzI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBPcHRpb25hbFNpbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsU2ludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbFNpbnQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxTaW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU2ludDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFNpbnQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsU2ludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNpbnQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsU2ludDMyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTaW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbFNpbnQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBPcHRpb25hbFNpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsU2ludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbFNpbnQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxTaW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNpbnQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTaW50NjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbFNpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTaW50NjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFNpbnQ2NF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRml4ZWQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsRml4ZWQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBPcHRpb25hbEZpeGVkMzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEZpeGVkMzI7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsRml4ZWQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxGaXhlZDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGaXhlZDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZpeGVkMzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRml4ZWQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRml4ZWQzMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsRml4ZWQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgT3B0aW9uYWxGaXhlZDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxGaXhlZDY0OyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEZpeGVkNjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsRml4ZWQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZpeGVkNjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRml4ZWQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsRml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGaXhlZDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxGaXhlZDY0XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTZml4ZWQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsU2ZpeGVkMzI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBPcHRpb25hbFNmaXhlZDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxTZml4ZWQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxTZml4ZWQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxTZml4ZWQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTZml4ZWQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTZml4ZWQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsU2ZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU2ZpeGVkMzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFNmaXhlZDMyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTZml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsU2ZpeGVkNjQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgT3B0aW9uYWxTZml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsU2ZpeGVkNjQ7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsU2ZpeGVkNjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsU2ZpeGVkNjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNmaXhlZDY0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFNmaXhlZDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxTZml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTZml4ZWQ2NCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsU2ZpeGVkNjRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxGbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgT3B0aW9uYWxGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsRmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsRmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxGbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZsb2F0XyA9IDBGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRG91YmxlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxEb3VibGU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGRvdWJsZSBPcHRpb25hbERvdWJsZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsRG91YmxlOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbERvdWJsZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxEb3VibGUoZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRG91YmxlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbERvdWJsZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsRG91YmxlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbERvdWJsZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRG91YmxlXyA9IDBEOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsQm9vbCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsQm9vbDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBPcHRpb25hbEJvb2wgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEJvb2w7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsQm9vbCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxCb29sKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxCb29sID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEJvb2xfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEJvb2woKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsQm9vbCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsQm9vbF8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFN0cmluZyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgT3B0aW9uYWxTdHJpbmcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbFN0cmluZzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxTdHJpbmcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsU3RyaW5nKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTdHJpbmcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsU3RyaW5nXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxTdHJpbmcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTdHJpbmdfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxCeXRlcyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsQnl0ZXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIE9wdGlvbmFsQnl0ZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEJ5dGVzOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEJ5dGVzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEJ5dGVzKHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEJ5dGVzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEJ5dGVzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxCeXRlcygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxCeXRlcyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsQnl0ZXNfID0gcGI6OkJ5dGVTdHJpbmcuRW1wdHk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxHcm91cCB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxHcm91cDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAgT3B0aW9uYWxHcm91cCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsR3JvdXA7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsR3JvdXAodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsR3JvdXAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsR3JvdXAgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsR3JvdXBfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxHcm91cChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEdyb3VwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEdyb3VwXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlT3B0aW9uYWxHcm91cChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsR3JvdXAgJiYNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxHcm91cF8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsR3JvdXBfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxHcm91cF8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQub3B0aW9uYWxHcm91cF8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEdyb3VwID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsR3JvdXAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsR3JvdXAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEdyb3VwXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsTmVzdGVkTWVzc2FnZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbmFsTmVzdGVkTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsTmVzdGVkTWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgT3B0aW9uYWxGb3JlaWduTWVzc2FnZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsRm9yZWlnbk1lc3NhZ2U7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZvcmVpZ25NZXNzYWdlXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlT3B0aW9uYWxGb3JlaWduTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgJiYNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxGb3JlaWduTWVzc2FnZV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQub3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZvcmVpZ25NZXNzYWdlXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UgT3B0aW9uYWxJbXBvcnRNZXNzYWdlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxJbXBvcnRNZXNzYWdlOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEltcG9ydE1lc3NhZ2UodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsSW1wb3J0TWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW1wb3J0TWVzc2FnZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEltcG9ydE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW1wb3J0TWVzc2FnZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbmFsSW1wb3J0TWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlICYmDQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW1wb3J0TWVzc2FnZV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxJbXBvcnRNZXNzYWdlXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxJbXBvcnRNZXNzYWdlXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5vcHRpb25hbEltcG9ydE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsSW1wb3J0TWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbXBvcnRNZXNzYWdlXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxOZXN0ZWRFbnVtIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZEVudW07IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIE9wdGlvbmFsTmVzdGVkRW51bSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsTmVzdGVkRW51bTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxOZXN0ZWRFbnVtKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbE5lc3RlZEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRFbnVtID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZEVudW1fID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbE5lc3RlZEVudW0oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkRW51bSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkRW51bV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5GT087DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGb3JlaWduRW51bSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxGb3JlaWduRW51bTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gT3B0aW9uYWxGb3JlaWduRW51bSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsRm9yZWlnbkVudW07IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsRm9yZWlnbkVudW0odmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsRm9yZWlnbkVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGb3JlaWduRW51bSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxGb3JlaWduRW51bV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsRm9yZWlnbkVudW0oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRm9yZWlnbkVudW0gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZvcmVpZ25FbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtLkZPUkVJR05fRk9POw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW1wb3J0RW51bSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRFbnVtOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtIE9wdGlvbmFsSW1wb3J0RW51bSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsSW1wb3J0RW51bTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxJbXBvcnRFbnVtKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEltcG9ydEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEltcG9ydEVudW0gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW1wb3J0RW51bV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsSW1wb3J0RW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRFbnVtID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbXBvcnRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0uSU1QT1JUX0ZPTzsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFN0cmluZ1BpZWNlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxTdHJpbmdQaWVjZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIE9wdGlvbmFsU3RyaW5nUGllY2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbFN0cmluZ1BpZWNlOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbFN0cmluZ1BpZWNlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbFN0cmluZ1BpZWNlKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTdHJpbmdQaWVjZSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTdHJpbmdQaWVjZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsU3RyaW5nUGllY2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nUGllY2UgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFN0cmluZ1BpZWNlXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsQ29yZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsQ29yZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIE9wdGlvbmFsQ29yZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsQ29yZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxDb3JkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbENvcmQoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbENvcmQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsQ29yZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsQ29yZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxDb3JkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxDb3JkXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBSZXBlYXRlZEludDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkSW50MzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkSW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEludDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gUmVwZWF0ZWRJbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRJbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRJbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRJbnQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkSW50NjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50NjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkSW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRJbnQ2NChzY2c6OklFbnVtZXJhYmxlPGxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkSW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50NjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1aW50PiBSZXBlYXRlZFVpbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRVaW50MzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRVaW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkVWludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgR2V0UmVwZWF0ZWRVaW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkVWludDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRVaW50MzIoaW50IGluZGV4LCB1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZFVpbnQzMih1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRVaW50MzIoc2NnOjpJRW51bWVyYWJsZTx1aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRVaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IFJlcGVhdGVkVWludDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFVpbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZFVpbnQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRVaW50NjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgR2V0UmVwZWF0ZWRVaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkVWludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRVaW50NjQoaW50IGluZGV4LCB1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRVaW50NjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50NjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZFVpbnQ2NChzY2c6OklFbnVtZXJhYmxlPHVsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRVaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBSZXBlYXRlZFNpbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRTaW50MzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRTaW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkU2ludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXRSZXBlYXRlZFNpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRTaW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZFNpbnQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRTaW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRTaW50MzIoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZFNpbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTaW50MzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBSZXBlYXRlZFNpbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRTaW50NjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRTaW50NjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkU2ludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRTaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkU2ludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRTaW50NjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZFNpbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRTaW50NjQoc2NnOjpJRW51bWVyYWJsZTxsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTaW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRTaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWludD4gUmVwZWF0ZWRGaXhlZDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEZpeGVkMzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGaXhlZDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEZpeGVkMzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBHZXRSZXBlYXRlZEZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRml4ZWQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkRml4ZWQzMihpbnQgaW5kZXgsIHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEZpeGVkMzIodWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkMzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEZpeGVkMzIoc2NnOjpJRW51bWVyYWJsZTx1aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRml4ZWQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IFJlcGVhdGVkRml4ZWQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRGaXhlZDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRml4ZWQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRGaXhlZDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEdldFJlcGVhdGVkRml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRGaXhlZDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRGaXhlZDY0KGludCBpbmRleCwgdWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEZpeGVkNjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRGaXhlZDY0KHNjZzo6SUVudW1lcmFibGU8dWxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkNjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRGaXhlZDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkNjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IFJlcGVhdGVkU2ZpeGVkMzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkU2ZpeGVkMzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRTZml4ZWQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRTZml4ZWQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0UmVwZWF0ZWRTZml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRTZml4ZWQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkU2ZpeGVkMzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTZml4ZWQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRTZml4ZWQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTZml4ZWQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkU2ZpeGVkMzIoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNmaXhlZDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkU2ZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkMzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBSZXBlYXRlZFNmaXhlZDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFNmaXhlZDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ZpeGVkNjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkU2ZpeGVkNjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBHZXRSZXBlYXRlZFNmaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZFNmaXhlZDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRTZml4ZWQ2NChpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTZml4ZWQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRTZml4ZWQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkNjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZFNmaXhlZDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkNjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRTZml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTZml4ZWQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGZsb2F0PiBSZXBlYXRlZEZsb2F0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEZsb2F0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRmxvYXRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkRmxvYXRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgR2V0UmVwZWF0ZWRGbG9hdChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRGbG9hdChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkRmxvYXQoaW50IGluZGV4LCBmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRmxvYXRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEZsb2F0KHNjZzo6SUVudW1lcmFibGU8ZmxvYXQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRmxvYXRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxkb3VibGU+IFJlcGVhdGVkRG91YmxlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZERvdWJsZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZERvdWJsZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWREb3VibGVDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZG91YmxlIEdldFJlcGVhdGVkRG91YmxlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZERvdWJsZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkRG91YmxlKGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRG91YmxlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZERvdWJsZShkb3VibGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWREb3VibGVfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZERvdWJsZShzY2c6OklFbnVtZXJhYmxlPGRvdWJsZT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRG91YmxlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRG91YmxlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZERvdWJsZV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGJvb2w+IFJlcGVhdGVkQm9vbExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRCb29sXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkQm9vbENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRCb29sQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgR2V0UmVwZWF0ZWRCb29sKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEJvb2woaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEJvb2woaW50IGluZGV4LCBib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQm9vbF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRCb29sKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRCb29sXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRCb29sKHNjZzo6SUVudW1lcmFibGU8Ym9vbD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQm9vbF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEJvb2woKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQm9vbF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gUmVwZWF0ZWRTdHJpbmdMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkU3RyaW5nXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU3RyaW5nQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFN0cmluZ0NvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgR2V0UmVwZWF0ZWRTdHJpbmcoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkU3RyaW5nKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRTdHJpbmcoaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZFN0cmluZyhzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRTdHJpbmcoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ18uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZFN0cmluZygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxwYjo6Qnl0ZVN0cmluZz4gUmVwZWF0ZWRCeXRlc0xpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRCeXRlc187IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEJ5dGVzQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEJ5dGVzQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIEdldFJlcGVhdGVkQnl0ZXMoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkQnl0ZXMoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEJ5dGVzKGludCBpbmRleCwgcGI6OkJ5dGVTdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQnl0ZXNfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkQnl0ZXMocGI6OkJ5dGVTdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQnl0ZXNfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEJ5dGVzKHNjZzo6SUVudW1lcmFibGU8cGI6OkJ5dGVTdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJ5dGVzXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkQnl0ZXMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQnl0ZXNfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cD4gUmVwZWF0ZWRHcm91cExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRHcm91cF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEdyb3VwQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEdyb3VwQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwIEdldFJlcGVhdGVkR3JvdXAoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkR3JvdXAoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEdyb3VwKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkR3JvdXBfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkR3JvdXAoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEdyb3VwX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEdyb3VwKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEdyb3VwXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkR3JvdXAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRHcm91cF8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkR3JvdXAoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkR3JvdXBfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRHcm91cCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRHcm91cF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPiBSZXBlYXRlZE5lc3RlZE1lc3NhZ2VMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkTmVzdGVkTWVzc2FnZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZE5lc3RlZE1lc3NhZ2VDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkTmVzdGVkTWVzc2FnZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSBHZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkTmVzdGVkTWVzc2FnZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkTmVzdGVkTWVzc2FnZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTmVzdGVkTWVzc2FnZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkTmVzdGVkTWVzc2FnZShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkTmVzdGVkTWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBHZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlPiBSZXBlYXRlZEltcG9ydE1lc3NhZ2VMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkSW1wb3J0TWVzc2FnZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEltcG9ydE1lc3NhZ2VDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkSW1wb3J0TWVzc2FnZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlIEdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRNZXNzYWdlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2UoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0TWVzc2FnZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRJbXBvcnRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEltcG9ydE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEltcG9ydE1lc3NhZ2VfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEltcG9ydE1lc3NhZ2Uoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkSW1wb3J0TWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+IFJlcGVhdGVkTmVzdGVkRW51bUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWROZXN0ZWRFbnVtXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkTmVzdGVkRW51bUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWROZXN0ZWRFbnVtQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIEdldFJlcGVhdGVkTmVzdGVkRW51bShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWROZXN0ZWRFbnVtKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWROZXN0ZWRFbnVtKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRFbnVtX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZE5lc3RlZEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRFbnVtXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWROZXN0ZWRFbnVtKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE5lc3RlZEVudW1fLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWROZXN0ZWRFbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE5lc3RlZEVudW1fLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gUmVwZWF0ZWRGb3JlaWduRW51bUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRGb3JlaWduRW51bV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEZvcmVpZ25FbnVtQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEZvcmVpZ25FbnVtQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEdldFJlcGVhdGVkRm9yZWlnbkVudW0oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRm9yZWlnbkVudW0oaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEZvcmVpZ25FbnVtKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduRW51bV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRGb3JlaWduRW51bShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25FbnVtXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRGb3JlaWduRW51bShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduRW51bV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEZvcmVpZ25FbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25FbnVtXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4gUmVwZWF0ZWRJbXBvcnRFbnVtTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEltcG9ydEVudW1fOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRJbXBvcnRFbnVtQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEltcG9ydEVudW1Db3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSBHZXRSZXBlYXRlZEltcG9ydEVudW0oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkSW1wb3J0RW51bShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkSW1wb3J0RW51bShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRFbnVtX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEltcG9ydEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEltcG9ydEVudW1fLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEltcG9ydEVudW0oc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRFbnVtXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkSW1wb3J0RW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRFbnVtXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBSZXBlYXRlZFN0cmluZ1BpZWNlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFN0cmluZ1BpZWNlXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU3RyaW5nUGllY2VDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkU3RyaW5nUGllY2VDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nUGllY2UoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkU3RyaW5nUGllY2UoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZFN0cmluZ1BpZWNlKGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ1BpZWNlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZFN0cmluZ1BpZWNlKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdQaWVjZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkU3RyaW5nUGllY2Uoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ1BpZWNlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkU3RyaW5nUGllY2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxzdHJpbmc+IFJlcGVhdGVkQ29yZExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRDb3JkXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkQ29yZENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRDb3JkQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZENvcmQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkQ29yZChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkQ29yZChpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRDb3JkX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZENvcmQoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZENvcmRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZENvcmQoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZENvcmRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRDb3JkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZENvcmRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdEludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRGVmYXVsdEludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdEludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0SW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRJbnQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEludDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0SW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0SW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRJbnQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRJbnQzMl8gPSA0MTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0SW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0SW50NjQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgRGVmYXVsdEludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdEludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0SW50NjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRJbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRJbnQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEludDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdEludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0SW50NjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0SW50NjRfID0gNDJMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRVaW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0VWludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1aW50IERlZmF1bHRVaW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0VWludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0VWludDMyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0VWludDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFVpbnQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFVpbnQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRVaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRVaW50MzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0VWludDMyXyA9IDQzOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRVaW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0VWludDY0OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBEZWZhdWx0VWludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdFVpbnQ2NDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdFVpbnQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdFVpbnQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0VWludDY0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0VWludDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdFVpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFVpbnQ2NCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRVaW50NjRfID0gNDRVTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U2ludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdFNpbnQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IERlZmF1bHRTaW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0U2ludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0U2ludDMyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0U2ludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ludDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U2ludDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdFNpbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNpbnQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTaW50MzJfID0gLTQ1Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTaW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0U2ludDY0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIERlZmF1bHRTaW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0U2ludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0U2ludDY0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0U2ludDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNpbnQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFNpbnQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRTaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTaW50NjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U2ludDY0XyA9IDQ2Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRGaXhlZDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdEZpeGVkMzI7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgRGVmYXVsdEZpeGVkMzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0Rml4ZWQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdEZpeGVkMzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRGaXhlZDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEZpeGVkMzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRGaXhlZDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdEZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGaXhlZDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEZpeGVkMzJfID0gNDc7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEZpeGVkNjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0Rml4ZWQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgRGVmYXVsdEZpeGVkNjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0Rml4ZWQ2NDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdEZpeGVkNjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRGaXhlZDY0KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGaXhlZDY0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0Rml4ZWQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRGaXhlZDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Rml4ZWQ2NCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRGaXhlZDY0XyA9IDQ4Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTZml4ZWQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRTZml4ZWQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IERlZmF1bHRTZml4ZWQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRTZml4ZWQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdFNmaXhlZDMyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0U2ZpeGVkMzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTZml4ZWQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFNmaXhlZDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdFNmaXhlZDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ZpeGVkMzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U2ZpeGVkMzJfID0gNDk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFNmaXhlZDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdFNmaXhlZDY0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIERlZmF1bHRTZml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRTZml4ZWQ2NDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdFNmaXhlZDY0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0U2ZpeGVkNjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ZpeGVkNjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTZml4ZWQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRTZml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNmaXhlZDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFNmaXhlZDY0XyA9IC01MDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0RmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0RmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IERlZmF1bHRGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRGbG9hdDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdEZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0RmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEZsb2F0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0RmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0RmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGbG9hdCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRGbG9hdF8gPSA1MS41RjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0RG91YmxlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdERvdWJsZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZG91YmxlIERlZmF1bHREb3VibGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0RG91YmxlOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0RG91YmxlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0RG91YmxlKGRvdWJsZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0RG91YmxlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0RG91YmxlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdERvdWJsZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdERvdWJsZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHREb3VibGVfID0gNTIwMDBEOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRCb29sIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdEJvb2w7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgRGVmYXVsdEJvb2wgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0Qm9vbDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdEJvb2wodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRCb29sKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEJvb2wgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRCb29sXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdEJvb2woKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRCb29sID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEJvb2xfID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U3RyaW5nIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdFN0cmluZzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIERlZmF1bHRTdHJpbmcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0U3RyaW5nOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0U3RyaW5nKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0U3RyaW5nKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFN0cmluZyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFN0cmluZ18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRTdHJpbmcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTdHJpbmcgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U3RyaW5nXyA9ICJoZWxsbyI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEJ5dGVzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdEJ5dGVzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBEZWZhdWx0Qnl0ZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0Qnl0ZXM7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRCeXRlcyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdEJ5dGVzKHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Qnl0ZXMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRCeXRlc18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRCeXRlcygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEJ5dGVzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEJ5dGVzXyA9IChwYjo6Qnl0ZVN0cmluZykgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IuRmllbGRzWzYyXS5EZWZhdWx0VmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdE5lc3RlZEVudW0gew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHROZXN0ZWRFbnVtOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSBEZWZhdWx0TmVzdGVkRW51bSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHROZXN0ZWRFbnVtOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0TmVzdGVkRW51bSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdE5lc3RlZEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdE5lc3RlZEVudW0gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHROZXN0ZWRFbnVtXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdE5lc3RlZEVudW0oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHROZXN0ZWRFbnVtID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdE5lc3RlZEVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uQkFSOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRGb3JlaWduRW51bSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdEZvcmVpZ25FbnVtOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBEZWZhdWx0Rm9yZWlnbkVudW0gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0Rm9yZWlnbkVudW07IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRGb3JlaWduRW51bSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdEZvcmVpZ25FbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGb3JlaWduRW51bSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEZvcmVpZ25FbnVtXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdEZvcmVpZ25FbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Rm9yZWlnbkVudW0gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0Rm9yZWlnbkVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0uRk9SRUlHTl9CQVI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEltcG9ydEVudW0gew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRJbXBvcnRFbnVtOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtIERlZmF1bHRJbXBvcnRFbnVtIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdEltcG9ydEVudW07IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRJbXBvcnRFbnVtKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0SW1wb3J0RW51bShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRJbXBvcnRFbnVtID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0SW1wb3J0RW51bV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRJbXBvcnRFbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0SW1wb3J0RW51bSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRJbXBvcnRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0uSU1QT1JUX0JBUjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U3RyaW5nUGllY2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0U3RyaW5nUGllY2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBEZWZhdWx0U3RyaW5nUGllY2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0U3RyaW5nUGllY2U7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRTdHJpbmdQaWVjZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdFN0cmluZ1BpZWNlKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFN0cmluZ1BpZWNlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U3RyaW5nUGllY2VfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0U3RyaW5nUGllY2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTdHJpbmdQaWVjZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTdHJpbmdQaWVjZV8gPSAiYWJjIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Q29yZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRDb3JkOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRGVmYXVsdENvcmQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0Q29yZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdENvcmQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRDb3JkKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdENvcmQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRDb3JkXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdENvcmQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRDb3JkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdENvcmRfID0gIjEyMyI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RBbGxUeXBlcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdERlcHJlY2F0ZWRGaWVsZHMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0RGVwcmVjYXRlZEZpZWxkcywgVGVzdERlcHJlY2F0ZWRGaWVsZHMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3REZXByZWNhdGVkRmllbGRzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3REZXByZWNhdGVkRmllbGRzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0RGVwcmVjYXRlZEZpZWxkcygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdERlcHJlY2F0ZWRGaWVsZHNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImRlcHJlY2F0ZWRfaW50MzIiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdERlcHJlY2F0ZWRGaWVsZHNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REZXByZWNhdGVkRmllbGRzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdERlcHJlY2F0ZWRGaWVsZHMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdERlcHJlY2F0ZWRGaWVsZHMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RGVwcmVjYXRlZEZpZWxkc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0RGVwcmVjYXRlZEZpZWxkcywgVGVzdERlcHJlY2F0ZWRGaWVsZHMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdERlcHJlY2F0ZWRGaWVsZHNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlcHJlY2F0ZWRJbnQzMkZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlcHJlY2F0ZWRJbnQzMjsNCisgICAgcHJpdmF0ZSBpbnQgZGVwcmVjYXRlZEludDMyXzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBib29sIEhhc0RlcHJlY2F0ZWRJbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlcHJlY2F0ZWRJbnQzMjsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgaW50IERlcHJlY2F0ZWRJbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlcHJlY2F0ZWRJbnQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3REZXByZWNhdGVkRmllbGRzRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzRGVwcmVjYXRlZEludDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgRGVwcmVjYXRlZEludDMyKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNEZXByZWNhdGVkSW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgRGVwcmVjYXRlZEludDMyKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REZXByZWNhdGVkRmllbGRzIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0RGVwcmVjYXRlZEZpZWxkcyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0RGVwcmVjYXRlZEZpZWxkcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0RGVwcmVjYXRlZEZpZWxkcywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdERlcHJlY2F0ZWRGaWVsZHMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0RGVwcmVjYXRlZEZpZWxkcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3REZXByZWNhdGVkRmllbGRzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdERlcHJlY2F0ZWRGaWVsZHMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3REZXByZWNhdGVkRmllbGRzIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdERlcHJlY2F0ZWRGaWVsZHMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdERlcHJlY2F0ZWRGaWVsZHMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdERlcHJlY2F0ZWRGaWVsZHMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RGVwcmVjYXRlZEZpZWxkcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdERlcHJlY2F0ZWRGaWVsZHMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdERlcHJlY2F0ZWRGaWVsZHMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0RGVwcmVjYXRlZEZpZWxkcyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REZXByZWNhdGVkRmllbGRzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlcHJlY2F0ZWRJbnQzMikgew0KKyAgICAgICAgICBEZXByZWNhdGVkSW50MzIgPSBvdGhlci5EZXByZWNhdGVkSW50MzI7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0RGVwcmVjYXRlZEZpZWxkc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0RGVwcmVjYXRlZEZpZWxkc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVwcmVjYXRlZEludDMyID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZGVwcmVjYXRlZEludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVwcmVjYXRlZEludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVwcmVjYXRlZEludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBpbnQgRGVwcmVjYXRlZEludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVwcmVjYXRlZEludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXREZXByZWNhdGVkSW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlcHJlY2F0ZWRJbnQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVwcmVjYXRlZEludDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZXByZWNhdGVkSW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZXByZWNhdGVkSW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlcHJlY2F0ZWRJbnQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlcHJlY2F0ZWRJbnQzMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRm9yZWlnbk1lc3NhZ2UgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxGb3JlaWduTWVzc2FnZSwgRm9yZWlnbk1lc3NhZ2UuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEZvcmVpZ25NZXNzYWdlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZvcmVpZ25NZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBGb3JlaWduTWVzc2FnZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZm9yZWlnbk1lc3NhZ2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImMiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfZm9yZWlnbk1lc3NhZ2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEZvcmVpZ25NZXNzYWdlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgRm9yZWlnbk1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRm9yZWlnbk1lc3NhZ2UgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb3JlaWduTWVzc2FnZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxGb3JlaWduTWVzc2FnZSwgRm9yZWlnbk1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9yZWlnbk1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IENGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNDOw0KKyAgICBwcml2YXRlIGludCBjXzsNCisgICAgcHVibGljIGJvb2wgSGFzQyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0M7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEMgew0KKyAgICAgIGdldCB7IHJldHVybiBjXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfZm9yZWlnbk1lc3NhZ2VGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNDKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgQyk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzQykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBDKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvcmVpZ25NZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBGb3JlaWduTWVzc2FnZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihGb3JlaWduTWVzc2FnZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxGb3JlaWduTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoRm9yZWlnbk1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBGb3JlaWduTWVzc2FnZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBGb3JlaWduTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEZvcmVpZ25NZXNzYWdlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgRm9yZWlnbk1lc3NhZ2UoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZvcmVpZ25NZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRm9yZWlnbk1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBGb3JlaWduTWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgRm9yZWlnbk1lc3NhZ2UpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRm9yZWlnbk1lc3NhZ2UpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShGb3JlaWduTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0MpIHsNCisgICAgICAgICAgQyA9IG90aGVyLkM7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9mb3JlaWduTWVzc2FnZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9mb3JlaWduTWVzc2FnZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzQyA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNDIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5DOyB9DQorICAgICAgICBzZXQgeyBTZXRDKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRDKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5jXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmNfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgRm9yZWlnbk1lc3NhZ2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RBbGxFeHRlbnNpb25zIDogcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RBbGxFeHRlbnNpb25zLCBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdEFsbEV4dGVuc2lvbnMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdEFsbEV4dGVuc2lvbnMgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RBbGxFeHRlbnNpb25zKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0QWxsRXh0ZW5zaW9uc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0QWxsRXh0ZW5zaW9uc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyAgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RBbGxFeHRlbnNpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RBbGxFeHRlbnNpb25zIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdEFsbEV4dGVuc2lvbnMsIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxFeHRlbnNpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmICghRXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0QWxsRXh0ZW5zaW9uc0ZpZWxkTmFtZXM7DQorICAgICAgcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RBbGxFeHRlbnNpb25zLCBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyPi5FeHRlbnNpb25Xcml0ZXIgZXh0ZW5zaW9uV3JpdGVyID0gQ3JlYXRlRXh0ZW5zaW9uV3JpdGVyKHRoaXMpOw0KKyAgICAgIGV4dGVuc2lvbldyaXRlci5Xcml0ZVVudGlsKDUzNjg3MDkxMiwgb3V0cHV0KTsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBFeHRlbnNpb25zU2VyaWFsaXplZFNpemU7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxFeHRlbnNpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0QWxsRXh0ZW5zaW9ucyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0QWxsRXh0ZW5zaW9ucyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6RXh0ZW5kYWJsZUJ1aWxkZXI8VGVzdEFsbEV4dGVuc2lvbnMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RBbGxFeHRlbnNpb25zIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdEFsbEV4dGVuc2lvbnMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdEFsbEV4dGVuc2lvbnMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RBbGxFeHRlbnNpb25zKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0QWxsRXh0ZW5zaW9ucyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RBbGxFeHRlbnNpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEFsbEV4dGVuc2lvbnMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RBbGxFeHRlbnNpb25zKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RBbGxFeHRlbnNpb25zKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdEFsbEV4dGVuc2lvbnMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9ucy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgdGhpcy5NZXJnZUV4dGVuc2lvbkZpZWxkcyhvdGhlcik7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0QWxsRXh0ZW5zaW9uc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0QWxsRXh0ZW5zaW9uc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgc3RhdGljIFRlc3RBbGxFeHRlbnNpb25zKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLCBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbi5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb24oKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gZGVmYXVsdEluc3RhbmNlID0gbmV3IE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9vcHRpb25hbEdyb3VwRXh0ZW5zaW9uRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX29wdGlvbmFsR3JvdXBFeHRlbnNpb25GaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTM2IH07DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLCBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICBwcml2YXRlIGludCBhXzsNCisgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0E7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfb3B0aW9uYWxHcm91cEV4dGVuc2lvbkZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDE3LCBmaWVsZF9uYW1lc1swXSwgQSk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxNywgQSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoT3B0aW9uYWxHcm91cF9leHRlbnNpb24gcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8T3B0aW9uYWxHcm91cF9leHRlbnNpb24sIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oT3B0aW9uYWxHcm91cF9leHRlbnNpb24gb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PcHRpb25hbEdyb3VwX2V4dGVuc2lvbi5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgIEEgPSBvdGhlci5BOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfb3B0aW9uYWxHcm91cEV4dGVuc2lvbkZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9vcHRpb25hbEdyb3VwRXh0ZW5zaW9uRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEzNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5hXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0E7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0QSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLCBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24oKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gZGVmYXVsdEluc3RhbmNlID0gbmV3IFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9yZXBlYXRlZEdyb3VwRXh0ZW5zaW9uRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3JlcGVhdGVkR3JvdXBFeHRlbnNpb25GaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMzc2IH07DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1JlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLCBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gNDc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICBwcml2YXRlIGludCBhXzsNCisgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0E7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfcmVwZWF0ZWRHcm91cEV4dGVuc2lvbkZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDQ3LCBmaWVsZF9uYW1lc1swXSwgQSk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg0NywgQSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8UmVwZWF0ZWRHcm91cF9leHRlbnNpb24sIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgIEEgPSBvdGhlci5BOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfcmVwZWF0ZWRHcm91cEV4dGVuc2lvbkZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9yZXBlYXRlZEdyb3VwRXh0ZW5zaW9uRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM3Njogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5hXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0E7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0QSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0TmVzdGVkRXh0ZW5zaW9uIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdE5lc3RlZEV4dGVuc2lvbiwgVGVzdE5lc3RlZEV4dGVuc2lvbi5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdE5lc3RlZEV4dGVuc2lvbigpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0TmVzdGVkRXh0ZW5zaW9uIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0TmVzdGVkRXh0ZW5zaW9uKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0TmVzdGVkRXh0ZW5zaW9uRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3ROZXN0ZWRFeHRlbnNpb25GaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbiBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3ROZXN0ZWRFeHRlbnNpb24gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdE5lc3RlZEV4dGVuc2lvbiBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRFeHRlbnNpb25fX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdE5lc3RlZEV4dGVuc2lvbiwgVGVzdE5lc3RlZEV4dGVuc2lvbi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkRXh0ZW5zaW9uX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBUZXN0RmllbGROdW1iZXIgPSAxMDAyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHN0cmluZz4gVGVzdDsNCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3ROZXN0ZWRFeHRlbnNpb25GaWVsZE5hbWVzOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkRXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb24gUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkRXh0ZW5zaW9uIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkRXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb24gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdE5lc3RlZEV4dGVuc2lvbiBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0TmVzdGVkRXh0ZW5zaW9uIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3ROZXN0ZWRFeHRlbnNpb24sIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3ROZXN0ZWRFeHRlbnNpb24gY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0TmVzdGVkRXh0ZW5zaW9uIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3ROZXN0ZWRFeHRlbnNpb24gUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0TmVzdGVkRXh0ZW5zaW9uIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdE5lc3RlZEV4dGVuc2lvbigpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdE5lc3RlZEV4dGVuc2lvbiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRFeHRlbnNpb24uRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE5lc3RlZEV4dGVuc2lvbiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE5lc3RlZEV4dGVuc2lvbiBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdE5lc3RlZEV4dGVuc2lvbikgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0TmVzdGVkRXh0ZW5zaW9uKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdE5lc3RlZEV4dGVuc2lvbiBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRFeHRlbnNpb24uRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0TmVzdGVkRXh0ZW5zaW9uRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3ROZXN0ZWRFeHRlbnNpb25GaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0TmVzdGVkRXh0ZW5zaW9uKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0UmVxdWlyZWQgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0UmVxdWlyZWQsIFRlc3RSZXF1aXJlZC5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdFJlcXVpcmVkKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RSZXF1aXJlZCBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFJlcXVpcmVkKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0UmVxdWlyZWRGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImR1bW15MTAiLCAiZHVtbXkxMSIsICJkdW1teTEyIiwgImR1bW15MTMiLCAiZHVtbXkxNCIsICJkdW1teTE1IiwgImR1bW15MTYiLCAiZHVtbXkxNyIsICJkdW1teTE4IiwgImR1bW15MTkiLCAiZHVtbXkyIiwgImR1bW15MjAiLCAiZHVtbXkyMSIsICJkdW1teTIyIiwgImR1bW15MjMiLCAiZHVtbXkyNCIsICJkdW1teTI1IiwgImR1bW15MjYiLCAiZHVtbXkyNyIsICJkdW1teTI4IiwgImR1bW15MjkiLCAiZHVtbXkzMCIsICJkdW1teTMxIiwgImR1bW15MzIiLCAiZHVtbXk0IiwgImR1bW15NSIsICJkdW1teTYiLCAiZHVtbXk3IiwgImR1bW15OCIsICJkdW1teTkiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFJlcXVpcmVkRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDgsIDI0LCAyNjQsIDgwLCA4OCwgOTYsIDEwNCwgMTEyLCAxMjAsIDEyOCwgMTM2LCAxNDQsIDE1MiwgMTYsIDE2MCwgMTY4LCAxNzYsIDE4NCwgMTkyLCAyMDAsIDIwOCwgMjE2LCAyMjQsIDIzMiwgMjQwLCAyNDgsIDI1NiwgMzIsIDQwLCA0OCwgNTYsIDY0LCA3MiB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZXF1aXJlZCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UmVxdWlyZWQgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVxdWlyZWRfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdFJlcXVpcmVkLCBUZXN0UmVxdWlyZWQuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBTaW5nbGVGaWVsZE51bWJlciA9IDEwMDA7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkPiBTaW5nbGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgTXVsdGlGaWVsZE51bWJlciA9IDEwMDE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQ+PiBNdWx0aTsNCisgICAgcHVibGljIGNvbnN0IGludCBBRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzQTsNCisgICAgcHJpdmF0ZSBpbnQgYV87DQorICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNBOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBBIHsNCisgICAgICBnZXQgeyByZXR1cm4gYV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTJGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTI7DQorICAgIHByaXZhdGUgaW50IGR1bW15Ml87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEJGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNCOw0KKyAgICBwcml2YXRlIGludCBiXzsNCisgICAgcHVibGljIGJvb2wgSGFzQiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0I7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEIgew0KKyAgICAgIGdldCB7IHJldHVybiBiXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15NEZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15NDsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXk0XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXk0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXk0OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTQgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXk1RmllbGROdW1iZXIgPSA1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXk1Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15NSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15NV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTZGaWVsZE51bWJlciA9IDY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTY7DQorICAgIHByaXZhdGUgaW50IGR1bW15Nl87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15NiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15NjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXk2IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXk2XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15N0ZpZWxkTnVtYmVyID0gNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15NzsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXk3XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXk3IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXk3OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTcgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXk4RmllbGROdW1iZXIgPSA4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXk4Ow0KKyAgICBwcml2YXRlIGludCBkdW1teThfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTggew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15OCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15OF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTlGaWVsZE51bWJlciA9IDk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTk7DQorICAgIHByaXZhdGUgaW50IGR1bW15OV87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15OSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15OTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXk5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXk5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MTBGaWVsZE51bWJlciA9IDEwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkxMDsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkxMF87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MTAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTEwOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTEwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkxMF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTExRmllbGROdW1iZXIgPSAxMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MTE7DQorICAgIHByaXZhdGUgaW50IGR1bW15MTFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTExIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkxMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkxMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MTFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkxMkZpZWxkTnVtYmVyID0gMTI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTEyOw0KKyAgICBwcml2YXRlIGludCBkdW1teTEyXzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MTI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MTIgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTEyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MTNGaWVsZE51bWJlciA9IDEzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkxMzsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkxM187DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MTMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTEzOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTEzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkxM187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTE0RmllbGROdW1iZXIgPSAxNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MTQ7DQorICAgIHByaXZhdGUgaW50IGR1bW15MTRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkxNDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkxNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MTRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkxNUZpZWxkTnVtYmVyID0gMTU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTE1Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTE1XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MTU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MTUgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTE1XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MTZGaWVsZE51bWJlciA9IDE2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkxNjsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkxNl87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MTYgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTE2OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTE2IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkxNl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTE3RmllbGROdW1iZXIgPSAxNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MTc7DQorICAgIHByaXZhdGUgaW50IGR1bW15MTdfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE3IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkxNzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkxNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MTdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkxOEZpZWxkTnVtYmVyID0gMTg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTE4Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTE4XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MTg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MTggew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTE4XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MTlGaWVsZE51bWJlciA9IDE5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkxOTsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkxOV87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MTkgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTE5OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTE5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkxOV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTIwRmllbGROdW1iZXIgPSAyMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MjA7DQorICAgIHByaXZhdGUgaW50IGR1bW15MjBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkyMDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkyMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MjBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkyMUZpZWxkTnVtYmVyID0gMjE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTIxOw0KKyAgICBwcml2YXRlIGludCBkdW1teTIxXzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MjE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MjEgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTIxXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MjJGaWVsZE51bWJlciA9IDIyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkyMjsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkyMl87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MjIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTIyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTIyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkyMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTIzRmllbGROdW1iZXIgPSAyMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MjM7DQorICAgIHByaXZhdGUgaW50IGR1bW15MjNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkyMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkyMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MjNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkyNEZpZWxkTnVtYmVyID0gMjQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTI0Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTI0XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MjQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MjQgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTI0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MjVGaWVsZE51bWJlciA9IDI1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkyNTsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkyNV87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MjUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTI1OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTI1IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkyNV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTI2RmllbGROdW1iZXIgPSAyNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MjY7DQorICAgIHByaXZhdGUgaW50IGR1bW15MjZfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkyNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkyNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MjZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkyN0ZpZWxkTnVtYmVyID0gMjc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTI3Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTI3XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15Mjc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15Mjcgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTI3XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MjhGaWVsZE51bWJlciA9IDI4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkyODsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkyOF87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15Mjggew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTI4OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTI4IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkyOF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTI5RmllbGROdW1iZXIgPSAyOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15Mjk7DQorICAgIHByaXZhdGUgaW50IGR1bW15MjlfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkyOTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkyOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MjlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkzMEZpZWxkTnVtYmVyID0gMzA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTMwOw0KKyAgICBwcml2YXRlIGludCBkdW1teTMwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkzMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MzA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MzAgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTMwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MzFGaWVsZE51bWJlciA9IDMxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkzMTsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkzMV87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MzEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTMxOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTMxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkzMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTMyRmllbGROdW1iZXIgPSAzMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MzI7DQorICAgIHByaXZhdGUgaW50IGR1bW15MzJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkzMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQ0ZpZWxkTnVtYmVyID0gMzM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNDOw0KKyAgICBwcml2YXRlIGludCBjXzsNCisgICAgcHVibGljIGJvb2wgSGFzQyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0M7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEMgew0KKyAgICAgIGdldCB7IHJldHVybiBjXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaWYgKCFoYXNBKSByZXR1cm4gZmFsc2U7DQorICAgICAgICBpZiAoIWhhc0IpIHJldHVybiBmYWxzZTsNCisgICAgICAgIGlmICghaGFzQykgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFJlcXVpcmVkRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyLCBmaWVsZF9uYW1lc1sxM10sIER1bW15Mik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNCKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigzLCBmaWVsZF9uYW1lc1sxXSwgQik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDQsIGZpZWxkX25hbWVzWzI3XSwgRHVtbXk0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15NSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNSwgZmllbGRfbmFtZXNbMjhdLCBEdW1teTUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXk2KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig2LCBmaWVsZF9uYW1lc1syOV0sIER1bW15Nik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTcpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDcsIGZpZWxkX25hbWVzWzMwXSwgRHVtbXk3KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15OCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoOCwgZmllbGRfbmFtZXNbMzFdLCBEdW1teTgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXk5KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig5LCBmaWVsZF9uYW1lc1szMl0sIER1bW15OSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTEwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxMCwgZmllbGRfbmFtZXNbM10sIER1bW15MTApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxMSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTEsIGZpZWxkX25hbWVzWzRdLCBEdW1teTExKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEyLCBmaWVsZF9uYW1lc1s1XSwgRHVtbXkxMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTEzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxMywgZmllbGRfbmFtZXNbNl0sIER1bW15MTMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxNCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTQsIGZpZWxkX25hbWVzWzddLCBEdW1teTE0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDE1LCBmaWVsZF9uYW1lc1s4XSwgRHVtbXkxNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTE2KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxNiwgZmllbGRfbmFtZXNbOV0sIER1bW15MTYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxNykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTcsIGZpZWxkX25hbWVzWzEwXSwgRHVtbXkxNyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTE4KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxOCwgZmllbGRfbmFtZXNbMTFdLCBEdW1teTE4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTkpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDE5LCBmaWVsZF9uYW1lc1sxMl0sIER1bW15MTkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjAsIGZpZWxkX25hbWVzWzE0XSwgRHVtbXkyMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTIxKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMSwgZmllbGRfbmFtZXNbMTVdLCBEdW1teTIxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIyLCBmaWVsZF9uYW1lc1sxNl0sIER1bW15MjIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyMykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjMsIGZpZWxkX25hbWVzWzE3XSwgRHVtbXkyMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTI0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyNCwgZmllbGRfbmFtZXNbMThdLCBEdW1teTI0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDI1LCBmaWVsZF9uYW1lc1sxOV0sIER1bW15MjUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyNikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjYsIGZpZWxkX25hbWVzWzIwXSwgRHVtbXkyNik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTI3KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyNywgZmllbGRfbmFtZXNbMjFdLCBEdW1teTI3KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjgpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDI4LCBmaWVsZF9uYW1lc1syMl0sIER1bW15MjgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyOSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjksIGZpZWxkX25hbWVzWzIzXSwgRHVtbXkyOSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTMwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigzMCwgZmllbGRfbmFtZXNbMjRdLCBEdW1teTMwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MzEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDMxLCBmaWVsZF9uYW1lc1syNV0sIER1bW15MzEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMzIsIGZpZWxkX25hbWVzWzI2XSwgRHVtbXkzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNDKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigzMywgZmllbGRfbmFtZXNbMl0sIEMpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgQSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMiwgRHVtbXkyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0IpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMywgQik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNCwgRHVtbXk0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15NSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg1LCBEdW1teTUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXk2KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDYsIER1bW15Nik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNywgRHVtbXk3KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15OCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg4LCBEdW1teTgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXk5KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDksIER1bW15OSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTEwKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEwLCBEdW1teTEwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTEpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTEsIER1bW15MTEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxMiwgRHVtbXkxMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTEzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEzLCBEdW1teTEzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTQsIER1bW15MTQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxNSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxNSwgRHVtbXkxNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTE2KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDE2LCBEdW1teTE2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTcsIER1bW15MTcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxOCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxOCwgRHVtbXkxOCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTE5KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDE5LCBEdW1teTE5KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjAsIER1bW15MjApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyMSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyMSwgRHVtbXkyMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTIyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIyLCBEdW1teTIyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjMsIER1bW15MjMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyNCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyNCwgRHVtbXkyNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTI1KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDI1LCBEdW1teTI1KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjYpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjYsIER1bW15MjYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyNykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyNywgRHVtbXkyNyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTI4KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDI4LCBEdW1teTI4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjkpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjksIER1bW15MjkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkzMCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgzMCwgRHVtbXkzMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTMxKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDMxLCBEdW1teTMxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMzIsIER1bW15MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgzMywgQyk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWQgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWQgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWQgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RSZXF1aXJlZCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0UmVxdWlyZWQgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdFJlcXVpcmVkLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0UmVxdWlyZWQgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0UmVxdWlyZWQgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdFJlcXVpcmVkIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFJlcXVpcmVkIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFJlcXVpcmVkKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UmVxdWlyZWQgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlcXVpcmVkIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZXF1aXJlZCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFJlcXVpcmVkKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RSZXF1aXJlZCkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RSZXF1aXJlZCBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgIEEgPSBvdGhlci5BOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15Mikgew0KKyAgICAgICAgICBEdW1teTIgPSBvdGhlci5EdW1teTI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzQikgew0KKyAgICAgICAgICBCID0gb3RoZXIuQjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTQpIHsNCisgICAgICAgICAgRHVtbXk0ID0gb3RoZXIuRHVtbXk0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15NSkgew0KKyAgICAgICAgICBEdW1teTUgPSBvdGhlci5EdW1teTU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXk2KSB7DQorICAgICAgICAgIER1bW15NiA9IG90aGVyLkR1bW15NjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTcpIHsNCisgICAgICAgICAgRHVtbXk3ID0gb3RoZXIuRHVtbXk3Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15OCkgew0KKyAgICAgICAgICBEdW1teTggPSBvdGhlci5EdW1teTg7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXk5KSB7DQorICAgICAgICAgIER1bW15OSA9IG90aGVyLkR1bW15OTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTEwKSB7DQorICAgICAgICAgIER1bW15MTAgPSBvdGhlci5EdW1teTEwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MTEpIHsNCisgICAgICAgICAgRHVtbXkxMSA9IG90aGVyLkR1bW15MTE7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkxMikgew0KKyAgICAgICAgICBEdW1teTEyID0gb3RoZXIuRHVtbXkxMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTEzKSB7DQorICAgICAgICAgIER1bW15MTMgPSBvdGhlci5EdW1teTEzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MTQpIHsNCisgICAgICAgICAgRHVtbXkxNCA9IG90aGVyLkR1bW15MTQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkxNSkgew0KKyAgICAgICAgICBEdW1teTE1ID0gb3RoZXIuRHVtbXkxNTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTE2KSB7DQorICAgICAgICAgIER1bW15MTYgPSBvdGhlci5EdW1teTE2Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MTcpIHsNCisgICAgICAgICAgRHVtbXkxNyA9IG90aGVyLkR1bW15MTc7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkxOCkgew0KKyAgICAgICAgICBEdW1teTE4ID0gb3RoZXIuRHVtbXkxODsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTE5KSB7DQorICAgICAgICAgIER1bW15MTkgPSBvdGhlci5EdW1teTE5Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MjApIHsNCisgICAgICAgICAgRHVtbXkyMCA9IG90aGVyLkR1bW15MjA7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkyMSkgew0KKyAgICAgICAgICBEdW1teTIxID0gb3RoZXIuRHVtbXkyMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTIyKSB7DQorICAgICAgICAgIER1bW15MjIgPSBvdGhlci5EdW1teTIyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MjMpIHsNCisgICAgICAgICAgRHVtbXkyMyA9IG90aGVyLkR1bW15MjM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkyNCkgew0KKyAgICAgICAgICBEdW1teTI0ID0gb3RoZXIuRHVtbXkyNDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTI1KSB7DQorICAgICAgICAgIER1bW15MjUgPSBvdGhlci5EdW1teTI1Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MjYpIHsNCisgICAgICAgICAgRHVtbXkyNiA9IG90aGVyLkR1bW15MjY7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkyNykgew0KKyAgICAgICAgICBEdW1teTI3ID0gb3RoZXIuRHVtbXkyNzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTI4KSB7DQorICAgICAgICAgIER1bW15MjggPSBvdGhlci5EdW1teTI4Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MjkpIHsNCisgICAgICAgICAgRHVtbXkyOSA9IG90aGVyLkR1bW15Mjk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkzMCkgew0KKyAgICAgICAgICBEdW1teTMwID0gb3RoZXIuRHVtbXkzMDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTMxKSB7DQorICAgICAgICAgIER1bW15MzEgPSBvdGhlci5EdW1teTMxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MzIpIHsNCisgICAgICAgICAgRHVtbXkzMiA9IG90aGVyLkR1bW15MzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzQykgew0KKyAgICAgICAgICBDID0gb3RoZXIuQzsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RSZXF1aXJlZEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0UmVxdWlyZWRGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5hXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15Ml8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNCID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTQgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXk1ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXk1Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15NiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15Nl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTcgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXk4ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXk4Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3Mjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15OSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15OV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTEwID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkxMF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTExID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkxMV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgOTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTEyID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkxMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkxMyA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MTNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDExMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTQgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTE0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMjA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTE1ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkxNV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTI4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkxNiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MTZfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEzNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTcgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTE3Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNDQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTE4ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkxOF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTUyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkxOSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MTlfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjAgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTIwXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTIxID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkyMV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTc2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkyMiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MjJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE4NDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjMgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTIzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxOTI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTI0ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkyNF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjAwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkyNSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MjVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDIwODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjYgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTI2Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTI3ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkyN18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjI0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkyOCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MjhfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDIzMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjkgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTI5Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTMwID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkzMF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQ4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkzMSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MzFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI1Njogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MzIgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNDID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuY18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuYV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0R1bW15MiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkR1bW15MjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNCIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5COyB9DQorICAgICAgICBzZXQgeyBTZXRCKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRCKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNCID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5iXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEdW1teTQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTQ7IH0NCisgICAgICAgIHNldCB7IFNldER1bW15NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXk0KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXk0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZHVtbXk0XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXk1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXk1OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRHVtbXk1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXk1OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldER1bW15NShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXk1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEdW1teTUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15NSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15NV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0R1bW15NiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15NjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15NiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkR1bW15NjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXk2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTYoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15NiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXk2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXk2KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTYgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTZfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEdW1teTc7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTc7IH0NCisgICAgICAgIHNldCB7IFNldER1bW15Nyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXk3KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15N18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15NygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXk3ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZHVtbXk3XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXk4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXk4OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRHVtbXk4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXk4OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTgodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldER1bW15OChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXk4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teThfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEdW1teTgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15OCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15OF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0R1bW15OSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15OTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15OSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkR1bW15OTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXk5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTkoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15OSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXk5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXk5KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTEwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTEwOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTEwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTEwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTEwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTEwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTBfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTExIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTExOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTExKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTExKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTExID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTExXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTEyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTEyOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTEyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTEyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTEyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTEyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTEzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTEzOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTEzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTEzKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTEzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTEzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTNfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTE0OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTE0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTE0KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTE0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxNCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxNTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTE1OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTE1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTE1KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTE1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTVfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTE2OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTE2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTE2KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTE2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxNigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTZfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxNzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTE3OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTE3KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTE3KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTE3ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE3XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxNygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxNyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTdfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxODsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTE4OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTE4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTE4KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTE4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE4XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxOCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxOCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MThfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkxOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MTkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTE5OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTE5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTE5KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTE5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkxOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxOSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MTlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MjAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTIwOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTIwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTIwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTIwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTIwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjBfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MjEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTIxOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTIxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTIxKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTIxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTIxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MjIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTIyOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTIyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTIyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTIyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTIyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyMzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MjMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTIzOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTIzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTIzKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTIzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTIzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyMygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyMyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjNfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyNDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTI0OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTI0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTI0KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTI0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyNCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyNCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyNTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MjUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTI1OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTI1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTI1KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTI1ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyNSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyNSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjVfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyNjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MjYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTI2OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTI2KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTI2KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTI2ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI2XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyNigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyNiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjZfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyNzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15Mjcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTI3OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTI3KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTI3KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTI3ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI3XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyNygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyNyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjdfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyODsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15Mjggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTI4OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTI4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTI4KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTI4ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI4XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyOCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyOCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjhfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkyOTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15Mjkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTI5OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTI5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTI5KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTI5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI5XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkyOSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyOSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MjlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTMwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkzMDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MzAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTMwOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTMwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTMwKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTMwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTMwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkzMCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkzMCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MzBfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTMxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkzMTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MzEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTMxOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTMxKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTMxKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTMxID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTMxXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkzMSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkzMSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MzFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXkzMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTMyOyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTMyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15MzJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNDIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5DOyB9DQorICAgICAgICBzZXQgeyBTZXRDKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRDKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5jXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmNfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdFJlcXVpcmVkKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0UmVxdWlyZWRGb3JlaWduIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdFJlcXVpcmVkRm9yZWlnbiwgVGVzdFJlcXVpcmVkRm9yZWlnbi5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdFJlcXVpcmVkRm9yZWlnbigpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0UmVxdWlyZWRGb3JlaWduIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0UmVxdWlyZWRGb3JlaWduKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0UmVxdWlyZWRGb3JlaWduRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJkdW1teSIsICJvcHRpb25hbF9tZXNzYWdlIiwgInJlcGVhdGVkX21lc3NhZ2UiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFJlcXVpcmVkRm9yZWlnbkZpZWxkVGFncyA9IG5ldyB1aW50W10geyAyNCwgMTAsIDE4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkRm9yZWlnbiBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZXF1aXJlZEZvcmVpZ24gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFJlcXVpcmVkRm9yZWlnbiBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZEZvcmVpZ25fX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdFJlcXVpcmVkRm9yZWlnbiwgVGVzdFJlcXVpcmVkRm9yZWlnbi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVxdWlyZWRGb3JlaWduX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbE1lc3NhZ2VGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbE1lc3NhZ2U7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkIG9wdGlvbmFsTWVzc2FnZV87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsTWVzc2FnZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQgT3B0aW9uYWxNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxNZXNzYWdlXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRNZXNzYWdlRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZD4gcmVwZWF0ZWRNZXNzYWdlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZD4gUmVwZWF0ZWRNZXNzYWdlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkTWVzc2FnZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkTWVzc2FnZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRNZXNzYWdlXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQgR2V0UmVwZWF0ZWRNZXNzYWdlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZE1lc3NhZ2VfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teUZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15Ow0KKyAgICBwcml2YXRlIGludCBkdW1teV87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoSGFzT3B0aW9uYWxNZXNzYWdlKSB7DQorICAgICAgICAgIGlmICghT3B0aW9uYWxNZXNzYWdlLklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCBlbGVtZW50IGluIFJlcGVhdGVkTWVzc2FnZUxpc3QpIHsNCisgICAgICAgICAgaWYgKCFlbGVtZW50LklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RSZXF1aXJlZEZvcmVpZ25GaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbE1lc3NhZ2UpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMSwgZmllbGRfbmFtZXNbMV0sIE9wdGlvbmFsTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZE1lc3NhZ2VfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDIsIGZpZWxkX25hbWVzWzJdLCByZXBlYXRlZE1lc3NhZ2VfKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigzLCBmaWVsZF9uYW1lc1swXSwgRHVtbXkpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc09wdGlvbmFsTWVzc2FnZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIE9wdGlvbmFsTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCBlbGVtZW50IGluIFJlcGVhdGVkTWVzc2FnZUxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgyLCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDMsIER1bW15KTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkRm9yZWlnbiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRGb3JlaWduIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZEZvcmVpZ24gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZEZvcmVpZ24gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZEZvcmVpZ24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkRm9yZWlnbiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRGb3JlaWduIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZEZvcmVpZ24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkRm9yZWlnbiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRGb3JlaWduIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RSZXF1aXJlZEZvcmVpZ24gTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJlcGVhdGVkTWVzc2FnZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0UmVxdWlyZWRGb3JlaWduIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RSZXF1aXJlZEZvcmVpZ24sIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RSZXF1aXJlZEZvcmVpZ24gY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0UmVxdWlyZWRGb3JlaWduIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RSZXF1aXJlZEZvcmVpZ24gUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0UmVxdWlyZWRGb3JlaWduIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFJlcXVpcmVkRm9yZWlnbigpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFJlcXVpcmVkRm9yZWlnbiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZEZvcmVpZ24uRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlcXVpcmVkRm9yZWlnbiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWRGb3JlaWduLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlcXVpcmVkRm9yZWlnbiBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFJlcXVpcmVkRm9yZWlnbikgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0UmVxdWlyZWRGb3JlaWduKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdFJlcXVpcmVkRm9yZWlnbiBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZEZvcmVpZ24uRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxNZXNzYWdlKSB7DQorICAgICAgICAgIE1lcmdlT3B0aW9uYWxNZXNzYWdlKG90aGVyLk9wdGlvbmFsTWVzc2FnZSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRNZXNzYWdlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VfLkFkZChvdGhlci5yZXBlYXRlZE1lc3NhZ2VfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teSkgew0KKyAgICAgICAgICBEdW1teSA9IG90aGVyLkR1bW15Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdFJlcXVpcmVkRm9yZWlnbkZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0UmVxdWlyZWRGb3JlaWduRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzT3B0aW9uYWxNZXNzYWdlKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKE9wdGlvbmFsTWVzc2FnZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBPcHRpb25hbE1lc3NhZ2UgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTg6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRNZXNzYWdlXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxNZXNzYWdlIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbE1lc3NhZ2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCBPcHRpb25hbE1lc3NhZ2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbE1lc3NhZ2U7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsTWVzc2FnZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTWVzc2FnZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbmFsTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbE1lc3NhZ2UgJiYNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxNZXNzYWdlXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTWVzc2FnZV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxNZXNzYWdlXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsTWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxNZXNzYWdlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxNZXNzYWdlXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQ+IFJlcGVhdGVkTWVzc2FnZUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRNZXNzYWdlXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkTWVzc2FnZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRNZXNzYWdlQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCBHZXRSZXBlYXRlZE1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkTWVzc2FnZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkTWVzc2FnZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZE1lc3NhZ2UoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZE1lc3NhZ2Uoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRNZXNzYWdlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEdW1teTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXk7IH0NCisgICAgICAgIHNldCB7IFNldER1bW15KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZHVtbXlfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdFJlcXVpcmVkRm9yZWlnbigpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdEZvcmVpZ25OZXN0ZWQgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0Rm9yZWlnbk5lc3RlZCwgVGVzdEZvcmVpZ25OZXN0ZWQuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RGb3JlaWduTmVzdGVkKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RGb3JlaWduTmVzdGVkIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0Rm9yZWlnbk5lc3RlZCgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdEZvcmVpZ25OZXN0ZWRGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImZvcmVpZ25fbmVzdGVkIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RGb3JlaWduTmVzdGVkRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZvcmVpZ25OZXN0ZWQgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0Rm9yZWlnbk5lc3RlZCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0Rm9yZWlnbk5lc3RlZCBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGb3JlaWduTmVzdGVkX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RGb3JlaWduTmVzdGVkLCBUZXN0Rm9yZWlnbk5lc3RlZC5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Rm9yZWlnbk5lc3RlZF9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRm9yZWlnbk5lc3RlZEZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZvcmVpZ25OZXN0ZWQ7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgZm9yZWlnbk5lc3RlZF87DQorICAgIHB1YmxpYyBib29sIEhhc0ZvcmVpZ25OZXN0ZWQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNGb3JlaWduTmVzdGVkOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIEZvcmVpZ25OZXN0ZWQgew0KKyAgICAgIGdldCB7IHJldHVybiBmb3JlaWduTmVzdGVkXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RGb3JlaWduTmVzdGVkRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzRm9yZWlnbk5lc3RlZCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZSgxLCBmaWVsZF9uYW1lc1swXSwgRm9yZWlnbk5lc3RlZCk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzRm9yZWlnbk5lc3RlZCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIEZvcmVpZ25OZXN0ZWQpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Rm9yZWlnbk5lc3RlZCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Rm9yZWlnbk5lc3RlZCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Rm9yZWlnbk5lc3RlZCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZvcmVpZ25OZXN0ZWQgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RGb3JlaWduTmVzdGVkIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RGb3JlaWduTmVzdGVkIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RGb3JlaWduTmVzdGVkLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0Rm9yZWlnbk5lc3RlZCBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RGb3JlaWduTmVzdGVkIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RGb3JlaWduTmVzdGVkIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdEZvcmVpZ25OZXN0ZWQgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0Rm9yZWlnbk5lc3RlZCgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEZvcmVpZ25OZXN0ZWQgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0Rm9yZWlnbk5lc3RlZC5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0Rm9yZWlnbk5lc3RlZCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0Rm9yZWlnbk5lc3RlZC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RGb3JlaWduTmVzdGVkIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0Rm9yZWlnbk5lc3RlZCkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0Rm9yZWlnbk5lc3RlZCkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RGb3JlaWduTmVzdGVkIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZvcmVpZ25OZXN0ZWQuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRm9yZWlnbk5lc3RlZCkgew0KKyAgICAgICAgICBNZXJnZUZvcmVpZ25OZXN0ZWQob3RoZXIuRm9yZWlnbk5lc3RlZCk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0Rm9yZWlnbk5lc3RlZEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0Rm9yZWlnbk5lc3RlZEZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNGb3JlaWduTmVzdGVkKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKEZvcmVpZ25OZXN0ZWQpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgRm9yZWlnbk5lc3RlZCA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRm9yZWlnbk5lc3RlZCB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRm9yZWlnbk5lc3RlZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgRm9yZWlnbk5lc3RlZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZvcmVpZ25OZXN0ZWQ7IH0NCisgICAgICAgIHNldCB7IFNldEZvcmVpZ25OZXN0ZWQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZvcmVpZ25OZXN0ZWQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZvcmVpZ25OZXN0ZWQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmZvcmVpZ25OZXN0ZWRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Rm9yZWlnbk5lc3RlZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGb3JlaWduTmVzdGVkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5mb3JlaWduTmVzdGVkXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlRm9yZWlnbk5lc3RlZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0ZvcmVpZ25OZXN0ZWQgJiYNCisgICAgICAgICAgICByZXN1bHQuZm9yZWlnbk5lc3RlZF8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmZvcmVpZ25OZXN0ZWRfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQuZm9yZWlnbk5lc3RlZF8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuZm9yZWlnbk5lc3RlZF8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNGb3JlaWduTmVzdGVkID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZvcmVpZ25OZXN0ZWQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZvcmVpZ25OZXN0ZWQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5mb3JlaWduTmVzdGVkXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0RW1wdHlNZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdEVtcHR5TWVzc2FnZSwgVGVzdEVtcHR5TWVzc2FnZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdEVtcHR5TWVzc2FnZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0RW1wdHlNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0RW1wdHlNZXNzYWdlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0RW1wdHlNZXNzYWdlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RFbXB0eU1lc3NhZ2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RFbXB0eU1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEVtcHR5TWVzc2FnZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbXB0eU1lc3NhZ2VfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdEVtcHR5TWVzc2FnZSwgVGVzdEVtcHR5TWVzc2FnZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RFbXB0eU1lc3NhZ2VGaWVsZE5hbWVzOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdEVtcHR5TWVzc2FnZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0RW1wdHlNZXNzYWdlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RFbXB0eU1lc3NhZ2UsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RFbXB0eU1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0RW1wdHlNZXNzYWdlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RFbXB0eU1lc3NhZ2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0RW1wdHlNZXNzYWdlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdEVtcHR5TWVzc2FnZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEVtcHR5TWVzc2FnZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFbXB0eU1lc3NhZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEVtcHR5TWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEVtcHR5TWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdEVtcHR5TWVzc2FnZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0RW1wdHlNZXNzYWdlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdEVtcHR5TWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFbXB0eU1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0RW1wdHlNZXNzYWdlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RFbXB0eU1lc3NhZ2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgOiBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8VGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLCBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyAgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucywgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIUV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zRmllbGROYW1lczsNCisgICAgICBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8VGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLCBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMuQnVpbGRlcj4uRXh0ZW5zaW9uV3JpdGVyIGV4dGVuc2lvbldyaXRlciA9IENyZWF0ZUV4dGVuc2lvbldyaXRlcih0aGlzKTsNCisgICAgICBleHRlbnNpb25Xcml0ZXIuV3JpdGVVbnRpbCg1MzY4NzA5MTIsIG91dHB1dCk7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHNpemUgKz0gRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkV4dGVuZGFibGVCdWlsZGVyPFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgIHRoaXMuTWVyZ2VFeHRlbnNpb25GaWVsZHMob3RoZXIpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIDogcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcywgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMsIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaWYgKCFFeHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlc0ZpZWxkTmFtZXM7DQorICAgICAgcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcywgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLkJ1aWxkZXI+LkV4dGVuc2lvbldyaXRlciBleHRlbnNpb25Xcml0ZXIgPSBDcmVhdGVFeHRlbnNpb25Xcml0ZXIodGhpcyk7DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoNDMsIG91dHB1dCk7DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoNDI0NCwgb3V0cHV0KTsNCisgICAgICBleHRlbnNpb25Xcml0ZXIuV3JpdGVVbnRpbCg1MzY4NzA5MTIsIG91dHB1dCk7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHNpemUgKz0gRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkV4dGVuZGFibGVCdWlsZGVyPFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgIHRoaXMuTWVyZ2VFeHRlbnNpb25GaWVsZHMob3RoZXIpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgc3RhdGljIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyLCBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlcigpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlcigpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiwgImJiIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RSZWFsbHlMYXJnZVRhZ051bWJlckZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4LCAyMTQ3NDgzNjQwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZWFsbHlMYXJnZVRhZ051bWJlcl9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIsIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlci5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICBwcml2YXRlIGludCBhXzsNCisgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0E7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEJiRmllbGROdW1iZXIgPSAyNjg0MzU0NTU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNCYjsNCisgICAgcHJpdmF0ZSBpbnQgYmJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNCYiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0JiOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBCYiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGJiXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQmIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDI2ODQzNTQ1NSwgZmllbGRfbmFtZXNbMV0sIEJiKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIEEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQmIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjY4NDM1NDU1LCBCYik7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWFsbHlMYXJnZVRhZ051bWJlci5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlcikgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWFsbHlMYXJnZVRhZ051bWJlci5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgIEEgPSBvdGhlci5BOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0JiKSB7DQorICAgICAgICAgIEJiID0gb3RoZXIuQmI7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXJGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjE0NzQ4MzY0MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0JiID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYmJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BOyB9DQorICAgICAgICBzZXQgeyBTZXRBKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRBKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNCYiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0JiOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgQmIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5CYjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0QmIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEJiKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNCYiA9IHRydWU7DQorICAgICAgICByZXN1bHQuYmJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJCYigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5iYl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RSZWN1cnNpdmVNZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdFJlY3Vyc2l2ZU1lc3NhZ2UsIFRlc3RSZWN1cnNpdmVNZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RSZWN1cnNpdmVNZXNzYWdlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiwgImkiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFJlY3Vyc2l2ZU1lc3NhZ2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAsIDE2IH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZWN1cnNpdmVNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RSZWN1cnNpdmVNZXNzYWdlLCBUZXN0UmVjdXJzaXZlTWVzc2FnZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVjdXJzaXZlTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0E7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgYV87DQorICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNBOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlIEEgew0KKyAgICAgIGdldCB7IHJldHVybiBhXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVjdXJzaXZlTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBJRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzSTsNCisgICAgcHJpdmF0ZSBpbnQgaV87DQorICAgIHB1YmxpYyBib29sIEhhc0kgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNJOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBJIHsNCisgICAgICBnZXQgeyByZXR1cm4gaV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RSZWN1cnNpdmVNZXNzYWdlRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZSgxLCBmaWVsZF9uYW1lc1swXSwgQSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNJKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyLCBmaWVsZF9uYW1lc1sxXSwgSSk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIEEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyLCBJKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWN1cnNpdmVNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0UmVjdXJzaXZlTWVzc2FnZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0UmVjdXJzaXZlTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RSZWN1cnNpdmVNZXNzYWdlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RSZWN1cnNpdmVNZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0UmVjdXJzaXZlTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0EpIHsNCisgICAgICAgICAgTWVyZ2VBKG90aGVyLkEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0kpIHsNCisgICAgICAgICAgSSA9IG90aGVyLkk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0UmVjdXJzaXZlTWVzc2FnZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0UmVjdXJzaXZlTWVzc2FnZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNBKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKEEpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgQSA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0kgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5pXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVjdXJzaXZlTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlQShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVjdXJzaXZlTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0EgJiYNCisgICAgICAgICAgICByZXN1bHQuYV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmFfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQuYV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzSSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0k7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBJIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0SSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0SShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSSA9IHRydWU7DQorICAgICAgICByZXN1bHQuaV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0kgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5pXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RSZWN1cnNpdmVNZXNzYWdlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0TXV0dWFsUmVjdXJzaW9uQSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RNdXR1YWxSZWN1cnNpb25BLCBUZXN0TXV0dWFsUmVjdXJzaW9uQS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdE11dHVhbFJlY3Vyc2lvbkEoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdE11dHVhbFJlY3Vyc2lvbkEgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RNdXR1YWxSZWN1cnNpb25BKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0TXV0dWFsUmVjdXJzaW9uQUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYmIiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdE11dHVhbFJlY3Vyc2lvbkFGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RNdXR1YWxSZWN1cnNpb25BIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNdXR1YWxSZWN1cnNpb25BIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11dHVhbFJlY3Vyc2lvbkFfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdE11dHVhbFJlY3Vyc2lvbkEsIFRlc3RNdXR1YWxSZWN1cnNpb25BLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25BX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBCYkZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0JiOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CIGJiXzsNCisgICAgcHVibGljIGJvb2wgSGFzQmIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNCYjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQiBCYiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGJiXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQi5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RNdXR1YWxSZWN1cnNpb25BRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzQmIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMSwgZmllbGRfbmFtZXNbMF0sIEJiKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNCYikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIEJiKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkEgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkEgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkEgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdXR1YWxSZWN1cnNpb25BIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0TXV0dWFsUmVjdXJzaW9uQSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0TXV0dWFsUmVjdXJzaW9uQSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0TXV0dWFsUmVjdXJzaW9uQSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdE11dHVhbFJlY3Vyc2lvbkEgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0TXV0dWFsUmVjdXJzaW9uQSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RNdXR1YWxSZWN1cnNpb25BIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdE11dHVhbFJlY3Vyc2lvbkEoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNdXR1YWxSZWN1cnNpb25BIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE11dHVhbFJlY3Vyc2lvbkEgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TXV0dWFsUmVjdXJzaW9uQSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdE11dHVhbFJlY3Vyc2lvbkEpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdE11dHVhbFJlY3Vyc2lvbkEpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0TXV0dWFsUmVjdXJzaW9uQSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0JiKSB7DQorICAgICAgICAgIE1lcmdlQmIob3RoZXIuQmIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdE11dHVhbFJlY3Vyc2lvbkFGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdE11dHVhbFJlY3Vyc2lvbkFGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzQmIpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oQmIpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgQmIgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0JiIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNCYjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIgQmIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5CYjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0QmIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEJiKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNCYiA9IHRydWU7DQorICAgICAgICByZXN1bHQuYmJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QmIoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmJiXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlQmIoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNCYiAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5iYl8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmJiXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmJiXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5iYl8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNCYiA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJCYigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5iYl8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdE11dHVhbFJlY3Vyc2lvbkIgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0TXV0dWFsUmVjdXJzaW9uQiwgVGVzdE11dHVhbFJlY3Vyc2lvbkIuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RNdXR1YWxSZWN1cnNpb25CKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RNdXR1YWxSZWN1cnNpb25CIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0TXV0dWFsUmVjdXJzaW9uQigpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdE11dHVhbFJlY3Vyc2lvbkJGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImEiLCAib3B0aW9uYWxfaW50MzIiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdE11dHVhbFJlY3Vyc2lvbkJGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAsIDE2IH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TXV0dWFsUmVjdXJzaW9uQiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0TXV0dWFsUmVjdXJzaW9uQiBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25CX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RNdXR1YWxSZWN1cnNpb25CLCBUZXN0TXV0dWFsUmVjdXJzaW9uQi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0E7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEgYV87DQorICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNBOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BIEEgew0KKyAgICAgIGdldCB7IHJldHVybiBhXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEludDMyRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxJbnQzMjsNCisgICAgcHJpdmF0ZSBpbnQgb3B0aW9uYWxJbnQzMl87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbEludDMyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBPcHRpb25hbEludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxJbnQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RNdXR1YWxSZWN1cnNpb25CRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZSgxLCBmaWVsZF9uYW1lc1swXSwgQSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEludDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyLCBmaWVsZF9uYW1lc1sxXSwgT3B0aW9uYWxJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIEEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbnQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyLCBPcHRpb25hbEludDMyKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdXR1YWxSZWN1cnNpb25CIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0TXV0dWFsUmVjdXJzaW9uQiBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0TXV0dWFsUmVjdXJzaW9uQiBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0TXV0dWFsUmVjdXJzaW9uQiwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdE11dHVhbFJlY3Vyc2lvbkIgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0TXV0dWFsUmVjdXJzaW9uQiByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RNdXR1YWxSZWN1cnNpb25CIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdE11dHVhbFJlY3Vyc2lvbkIoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNdXR1YWxSZWN1cnNpb25CIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE11dHVhbFJlY3Vyc2lvbkIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TXV0dWFsUmVjdXJzaW9uQiBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdE11dHVhbFJlY3Vyc2lvbkIpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdE11dHVhbFJlY3Vyc2lvbkIpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0TXV0dWFsUmVjdXJzaW9uQiBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0EpIHsNCisgICAgICAgICAgTWVyZ2VBKG90aGVyLkEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsSW50MzIpIHsNCisgICAgICAgICAgT3B0aW9uYWxJbnQzMiA9IG90aGVyLk9wdGlvbmFsSW50MzI7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0TXV0dWFsUmVjdXJzaW9uQkZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0TXV0dWFsUmVjdXJzaW9uQkZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNBKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKEEpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgQSA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW50MzIgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5vcHRpb25hbEludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEgQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlQShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0EgJiYNCisgICAgICAgICAgICByZXN1bHQuYV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmFfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuQ3JlYXRlQnVpbGRlcihyZXN1bHQuYV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxJbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsSW50MzI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBPcHRpb25hbEludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxJbnQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxJbnQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxJbnQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbnQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbnQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsSW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW50MzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEludDMyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RNdXR1YWxSZWN1cnNpb25CKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0RHVwRmllbGROdW1iZXIgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0RHVwRmllbGROdW1iZXIsIFRlc3REdXBGaWVsZE51bWJlci5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdER1cEZpZWxkTnVtYmVyKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3REdXBGaWVsZE51bWJlciBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdER1cEZpZWxkTnVtYmVyKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0RHVwRmllbGROdW1iZXJGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImEiLCAiYmFyIiwgImZvbyIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0RHVwRmllbGROdW1iZXJGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCwgMjcsIDE5IH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER1cEZpZWxkTnVtYmVyIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdER1cEZpZWxkTnVtYmVyIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3REdXBGaWVsZE51bWJlciBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0RHVwRmllbGROdW1iZXIsIFRlc3REdXBGaWVsZE51bWJlci5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgew0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEZvbyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPEZvbywgRm9vLkJ1aWxkZXI+IHsNCisgICAgICAgIHByaXZhdGUgRm9vKCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGb28gZGVmYXVsdEluc3RhbmNlID0gbmV3IEZvbygpLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2Zvb0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYSIgfTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfZm9vRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDggfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRm9vIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEZvbyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRm9vIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfRm9vX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEZvbywgRm9vLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfRm9vX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBBRmllbGROdW1iZXIgPSAxOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0E7DQorICAgICAgICBwcml2YXRlIGludCBhXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzQTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGFfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2Zvb0ZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBBKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRm9vIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvbyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGb28gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvbyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRm9vIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvbyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGb28gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRm9vIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvbyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGb28gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgRm9vIE1ha2VSZWFkT25seSgpIHsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihGb28gcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxGb28sIEJ1aWxkZXI+IHsNCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludGVybmFsIEJ1aWxkZXIoRm9vIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgRm9vIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgRm9vIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICBGb28gb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgRm9vKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZvbyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEZvbyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvby5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEZvbyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgaXMgRm9vKSB7DQorICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChGb28pIG90aGVyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRm9vIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28uRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfZm9vRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgICAgICB0YWcgPSBfZm9vRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYV8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0E7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5hXyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0YXRpYyBGb28oKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJhciA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPEJhciwgQmFyLkJ1aWxkZXI+IHsNCisgICAgICAgIHByaXZhdGUgQmFyKCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBCYXIgZGVmYXVsdEluc3RhbmNlID0gbmV3IEJhcigpLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2JhckZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYSIgfTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfYmFyRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDggfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFyIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJhciBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQmFyIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfQmFyX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEJhciwgQmFyLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfQmFyX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBBRmllbGROdW1iZXIgPSAxOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0E7DQorICAgICAgICBwcml2YXRlIGludCBhXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzQTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGFfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2JhckZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBBKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFyIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJhciBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCYXIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJhciBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFyIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJhciBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCYXIgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFyIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJhciBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCYXIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgQmFyIE1ha2VSZWFkT25seSgpIHsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihCYXIgcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxCYXIsIEJ1aWxkZXI+IHsNCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludGVybmFsIEJ1aWxkZXIoQmFyIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgQmFyIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgQmFyIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICBCYXIgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQmFyKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJhciBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJhciBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhci5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJhciBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgaXMgQmFyKSB7DQorICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChCYXIpIG90aGVyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oQmFyIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfYmFyRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgICAgICB0YWcgPSBfYmFyRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYV8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0E7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5hXyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0YXRpYyBCYXIoKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0E7DQorICAgIHByaXZhdGUgaW50IGFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRm9vRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRm9vOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28gZm9vXzsNCisgICAgcHVibGljIGJvb2wgSGFzRm9vIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRm9vOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28gRm9vIHsNCisgICAgICBnZXQgeyByZXR1cm4gZm9vXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEJhckZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0JhcjsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyIGJhcl87DQorICAgIHB1YmxpYyBib29sIEhhc0JhciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0JhcjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyIEJhciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGJhcl8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhci5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3REdXBGaWVsZE51bWJlckZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzBdLCBBKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0Zvbykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlR3JvdXAoMiwgZmllbGRfbmFtZXNbMl0sIEZvbyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNCYXIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUdyb3VwKDMsIGZpZWxkX25hbWVzWzFdLCBCYXIpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgQSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGb28pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVHcm91cFNpemUoMiwgRm9vKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0Jhcikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUdyb3VwU2l6ZSgzLCBCYXIpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHVwRmllbGROdW1iZXIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER1cEZpZWxkTnVtYmVyIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REdXBGaWVsZE51bWJlciBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER1cEZpZWxkTnVtYmVyIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHVwRmllbGROdW1iZXIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER1cEZpZWxkTnVtYmVyIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REdXBGaWVsZE51bWJlciBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHVwRmllbGROdW1iZXIgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER1cEZpZWxkTnVtYmVyIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REdXBGaWVsZE51bWJlciBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0RHVwRmllbGROdW1iZXIgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdER1cEZpZWxkTnVtYmVyIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3REdXBGaWVsZE51bWJlciwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdER1cEZpZWxkTnVtYmVyIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdER1cEZpZWxkTnVtYmVyIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3REdXBGaWVsZE51bWJlciBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3REdXBGaWVsZE51bWJlciBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3REdXBGaWVsZE51bWJlcigpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdER1cEZpZWxkTnVtYmVyIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3REdXBGaWVsZE51bWJlciBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RHVwRmllbGROdW1iZXIgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3REdXBGaWVsZE51bWJlcikgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0RHVwRmllbGROdW1iZXIpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0RHVwRmllbGROdW1iZXIgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzQSkgew0KKyAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNGb28pIHsNCisgICAgICAgICAgTWVyZ2VGb28ob3RoZXIuRm9vKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNCYXIpIHsNCisgICAgICAgICAgTWVyZ2VCYXIob3RoZXIuQmFyKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3REdXBGaWVsZE51bWJlckZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0RHVwRmllbGROdW1iZXJGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5hXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxOTogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvby5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzRm9vKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKEZvbyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkR3JvdXAoMiwgc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgRm9vID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI3OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNCYXIpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oQmFyKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRHcm91cCgzLCBzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBCYXIgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuYV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZvbyB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRm9vOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vIEZvbyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZvbzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Rm9vKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGb28oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvbyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRm9vID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5mb29fID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Rm9vKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRm9vID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5mb29fID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VGb28oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvbyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0ZvbyAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5mb29fICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28uRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmZvb18gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmZvb18pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuZm9vXyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc0ZvbyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGb28oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZvbyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZvb18gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0JhciB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQmFyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyIEJhciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkJhcjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0QmFyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRCYXIoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhciB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmFyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5iYXJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QmFyKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmFyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5iYXJfID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VCYXIoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhciB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0JhciAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5iYXJfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LmJhcl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmJhcl8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuYmFyXyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc0JhciA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJCYXIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0JhciA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmJhcl8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0RHVwRmllbGROdW1iZXIoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cywgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMsIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgew0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE5lc3RlZE1lc3NhZ2UgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxOZXN0ZWRNZXNzYWdlLCBOZXN0ZWRNZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgICAgIHByaXZhdGUgTmVzdGVkTWVzc2FnZSgpIHsgfQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTmVzdGVkTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgTmVzdGVkTWVzc2FnZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX25lc3RlZE1lc3NhZ2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIm5lc3RlZG1lc3NhZ2VfcmVwZWF0ZWRfZm9yZWlnbm1lc3NhZ2UiLCAibmVzdGVkbWVzc2FnZV9yZXBlYXRlZF9pbnQzMiIgfTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfbmVzdGVkTWVzc2FnZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxOCwgOCB9Ow0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgVGhpc01lc3NhZ2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19OZXN0ZWRNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPE5lc3RlZE1lc3NhZ2UsIE5lc3RlZE1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19OZXN0ZWRNZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMkZpZWxkTnVtYmVyID0gMTsNCisgICAgICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICAgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMkxpc3Qgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyXyk7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJDb3VudCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl8uQ291bnQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgR2V0TmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICAgIHJldHVybiBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl9baW5kZXhdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlRmllbGROdW1iZXIgPSAyOw0KKyAgICAgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gbmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPigpOw0KKyAgICAgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlTGlzdCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV87IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgTmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VDb3VudCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8uQ291bnQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBHZXROZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZShpbnQgaW5kZXgpIHsNCisgICAgICAgICAgcmV0dXJuIG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlX1tpbmRleF07DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX25lc3RlZE1lc3NhZ2VGaWVsZE5hbWVzOw0KKyAgICAgICAgICBpZiAobmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyQXJyYXkoMSwgZmllbGRfbmFtZXNbMV0sIG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyXyk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlQXJyYXkoMiwgZmllbGRfbmFtZXNbMF0sIG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXyk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgIA0KKyAgICAgICAgICBzaXplID0gMDsNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICAgICAgZm9yZWFjaCAoaW50IGVsZW1lbnQgaW4gTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJMaXN0KSB7DQorICAgICAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICAgIHNpemUgKz0gMSAqIG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyXy5Db3VudDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBlbGVtZW50IGluIE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlTGlzdCkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgyLCBlbGVtZW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIE5lc3RlZE1lc3NhZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihOZXN0ZWRNZXNzYWdlIHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8TmVzdGVkTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihOZXN0ZWRNZXNzYWdlIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgTmVzdGVkTWVzc2FnZSByZXN1bHQ7DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIE5lc3RlZE1lc3NhZ2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIE5lc3RlZE1lc3NhZ2Ugb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgTmVzdGVkTWVzc2FnZSgpOw0KKyAgICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBOZXN0ZWRNZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgTmVzdGVkTWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgaXMgTmVzdGVkTWVzc2FnZSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoTmVzdGVkTWVzc2FnZSkgb3RoZXIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShOZXN0ZWRNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIubmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgICAgIHJlc3VsdC5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl8uQWRkKG90aGVyLm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyXyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICAgICAgcmVzdWx0Lm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXy5BZGQob3RoZXIubmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfbmVzdGVkTWVzc2FnZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX25lc3RlZE1lc3NhZ2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAxMDoNCisgICAgICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICAgICAgaW5wdXQuUmVhZEludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDE4OiB7DQorICAgICAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJMaXN0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl87IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyQ291bnQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJDb3VudDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgR2V0TmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXROZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMihpbmRleCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMihzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzIoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfLkNsZWFyKCk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlTGlzdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkubmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZUNvdW50IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlQ291bnQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgR2V0TmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXROZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZShpbmRleCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2UoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8uQWRkKHZhbHVlKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGROZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZU5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IHZhbHVlcykgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXy5BZGQodmFsdWVzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXy5DbGVhcigpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgTmVzdGVkTWVzc2FnZSgpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbE5lc3RlZE1lc3NhZ2VGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2U7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxOZXN0ZWRNZXNzYWdlXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMSwgZmllbGRfbmFtZXNbMF0sIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMSwgT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSkgew0KKyAgICAgICAgICBNZXJnZU9wdGlvbmFsTmVzdGVkTWVzc2FnZShvdGhlci5PcHRpb25hbE5lc3RlZE1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsTmVzdGVkTWVzc2FnZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbmFsTmVzdGVkTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuVHlwZXMuTmVzdGVkTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsTmVzdGVkTWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0Q2FtZWxDYXNlRmllbGROYW1lcywgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdENhbWVsQ2FzZUZpZWxkTmFtZXNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIkNvcmRGaWVsZCIsICJFbnVtRmllbGQiLCAiTWVzc2FnZUZpZWxkIiwgIlByaW1pdGl2ZUZpZWxkIiwgIlJlcGVhdGVkQ29yZEZpZWxkIiwgIlJlcGVhdGVkRW51bUZpZWxkIiwgIlJlcGVhdGVkTWVzc2FnZUZpZWxkIiwgIlJlcGVhdGVkUHJpbWl0aXZlRmllbGQiLCAiUmVwZWF0ZWRTdHJpbmdGaWVsZCIsICJSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGQiLCAiU3RyaW5nRmllbGQiLCAiU3RyaW5nUGllY2VGaWVsZCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0Q2FtZWxDYXNlRmllbGROYW1lc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyA1MCwgMjQsIDM0LCA4LCA5OCwgNzIsIDgyLCA1NiwgNjYsIDkwLCAxOCwgNDIgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMsIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQcmltaXRpdmVGaWVsZEZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc1ByaW1pdGl2ZUZpZWxkOw0KKyAgICBwcml2YXRlIGludCBwcmltaXRpdmVGaWVsZF87DQorICAgIHB1YmxpYyBib29sIEhhc1ByaW1pdGl2ZUZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzUHJpbWl0aXZlRmllbGQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFByaW1pdGl2ZUZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gcHJpbWl0aXZlRmllbGRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgU3RyaW5nRmllbGRGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNTdHJpbmdGaWVsZDsNCisgICAgcHJpdmF0ZSBzdHJpbmcgc3RyaW5nRmllbGRfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc1N0cmluZ0ZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzU3RyaW5nRmllbGQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIFN0cmluZ0ZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gc3RyaW5nRmllbGRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRW51bUZpZWxkRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRW51bUZpZWxkOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIGVudW1GaWVsZF8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPTzsNCisgICAgcHVibGljIGJvb2wgSGFzRW51bUZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRW51bUZpZWxkOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEVudW1GaWVsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGVudW1GaWVsZF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBNZXNzYWdlRmllbGRGaWVsZE51bWJlciA9IDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNNZXNzYWdlRmllbGQ7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgbWVzc2FnZUZpZWxkXzsNCisgICAgcHVibGljIGJvb2wgSGFzTWVzc2FnZUZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTWVzc2FnZUZpZWxkOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIE1lc3NhZ2VGaWVsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG1lc3NhZ2VGaWVsZF8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgU3RyaW5nUGllY2VGaWVsZEZpZWxkTnVtYmVyID0gNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc1N0cmluZ1BpZWNlRmllbGQ7DQorICAgIHByaXZhdGUgc3RyaW5nIHN0cmluZ1BpZWNlRmllbGRfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc1N0cmluZ1BpZWNlRmllbGQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNTdHJpbmdQaWVjZUZpZWxkOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBTdHJpbmdQaWVjZUZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gc3RyaW5nUGllY2VGaWVsZF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBDb3JkRmllbGRGaWVsZE51bWJlciA9IDY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNDb3JkRmllbGQ7DQorICAgIHByaXZhdGUgc3RyaW5nIGNvcmRGaWVsZF8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzQ29yZEZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQ29yZEZpZWxkOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBDb3JkRmllbGQgew0KKyAgICAgIGdldCB7IHJldHVybiBjb3JkRmllbGRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEZpZWxkTnVtYmVyID0gNzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IHJlcGVhdGVkUHJpbWl0aXZlRmllbGRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFByaW1pdGl2ZUZpZWxkXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkUHJpbWl0aXZlRmllbGRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRSZXBlYXRlZFByaW1pdGl2ZUZpZWxkKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFByaW1pdGl2ZUZpZWxkX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTdHJpbmdGaWVsZEZpZWxkTnVtYmVyID0gODsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+IHJlcGVhdGVkU3RyaW5nRmllbGRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBSZXBlYXRlZFN0cmluZ0ZpZWxkTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFN0cmluZ0ZpZWxkXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkU3RyaW5nRmllbGRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU3RyaW5nRmllbGRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZFN0cmluZ0ZpZWxkKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFN0cmluZ0ZpZWxkX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRFbnVtRmllbGRGaWVsZE51bWJlciA9IDk7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IHJlcGVhdGVkRW51bUZpZWxkXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IFJlcGVhdGVkRW51bUZpZWxkTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEVudW1GaWVsZF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEVudW1GaWVsZENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRFbnVtRmllbGRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEdldFJlcGVhdGVkRW51bUZpZWxkKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEVudW1GaWVsZF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkTWVzc2FnZUZpZWxkRmllbGROdW1iZXIgPSAxMDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gcmVwZWF0ZWRNZXNzYWdlRmllbGRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gUmVwZWF0ZWRNZXNzYWdlRmllbGRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRNZXNzYWdlRmllbGRfOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZE1lc3NhZ2VGaWVsZENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRNZXNzYWdlRmllbGRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIEdldFJlcGVhdGVkTWVzc2FnZUZpZWxkKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZE1lc3NhZ2VGaWVsZF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZEZpZWxkTnVtYmVyID0gMTE7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiByZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRDb3JkRmllbGRGaWVsZE51bWJlciA9IDEyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gcmVwZWF0ZWRDb3JkRmllbGRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBSZXBlYXRlZENvcmRGaWVsZExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRDb3JkRmllbGRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRDb3JkRmllbGRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkQ29yZEZpZWxkXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgR2V0UmVwZWF0ZWRDb3JkRmllbGQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkQ29yZEZpZWxkX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0Q2FtZWxDYXNlRmllbGROYW1lc0ZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc1ByaW1pdGl2ZUZpZWxkKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1szXSwgUHJpbWl0aXZlRmllbGQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU3RyaW5nRmllbGQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygyLCBmaWVsZF9uYW1lc1sxMF0sIFN0cmluZ0ZpZWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0VudW1GaWVsZCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSgzLCBmaWVsZF9uYW1lc1sxXSwgKGludCkgRW51bUZpZWxkLCBFbnVtRmllbGQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTWVzc2FnZUZpZWxkKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDQsIGZpZWxkX25hbWVzWzJdLCBNZXNzYWdlRmllbGQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU3RyaW5nUGllY2VGaWVsZCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDUsIGZpZWxkX25hbWVzWzExXSwgU3RyaW5nUGllY2VGaWVsZCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNDb3JkRmllbGQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyg2LCBmaWVsZF9uYW1lc1swXSwgQ29yZEZpZWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkUHJpbWl0aXZlRmllbGRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzJBcnJheSg3LCBmaWVsZF9uYW1lc1s3XSwgcmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRTdHJpbmdGaWVsZF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmdBcnJheSg4LCBmaWVsZF9uYW1lc1s4XSwgcmVwZWF0ZWRTdHJpbmdGaWVsZF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRFbnVtRmllbGRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bUFycmF5KDksIGZpZWxkX25hbWVzWzVdLCByZXBlYXRlZEVudW1GaWVsZF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRNZXNzYWdlRmllbGRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDEwLCBmaWVsZF9uYW1lc1s2XSwgcmVwZWF0ZWRNZXNzYWdlRmllbGRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmdBcnJheSgxMSwgZmllbGRfbmFtZXNbOV0sIHJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRDb3JkRmllbGRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoMTIsIGZpZWxkX25hbWVzWzRdLCByZXBlYXRlZENvcmRGaWVsZF8pOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc1ByaW1pdGl2ZUZpZWxkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIFByaW1pdGl2ZUZpZWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1N0cmluZ0ZpZWxkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgyLCBTdHJpbmdGaWVsZCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNFbnVtRmllbGQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgzLCAoaW50KSBFbnVtRmllbGQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTWVzc2FnZUZpZWxkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoNCwgTWVzc2FnZUZpZWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1N0cmluZ1BpZWNlRmllbGQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDUsIFN0cmluZ1BpZWNlRmllbGQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQ29yZEZpZWxkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSg2LCBDb3JkRmllbGQpOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoaW50IGVsZW1lbnQgaW4gUmVwZWF0ZWRQcmltaXRpdmVGaWVsZExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDEgKiByZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIFJlcGVhdGVkU3RyaW5nRmllbGRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMSAqIHJlcGVhdGVkU3RyaW5nRmllbGRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKHJlcGVhdGVkRW51bUZpZWxkXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gZWxlbWVudCBpbiByZXBlYXRlZEVudW1GaWVsZF8pIHsNCisgICAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplTm9UYWcoKGludCkgZWxlbWVudCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgICAgc2l6ZSArPSAxICogcmVwZWF0ZWRFbnVtRmllbGRfLkNvdW50Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBlbGVtZW50IGluIFJlcGVhdGVkTWVzc2FnZUZpZWxkTGlzdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEwLCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAxICogcmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIFJlcGVhdGVkQ29yZEZpZWxkTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDEgKiByZXBlYXRlZENvcmRGaWVsZF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJlcGVhdGVkUHJpbWl0aXZlRmllbGRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU3RyaW5nRmllbGRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkRW51bUZpZWxkXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZE1lc3NhZ2VGaWVsZF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZENvcmRGaWVsZF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0Q2FtZWxDYXNlRmllbGROYW1lcywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RDYW1lbENhc2VGaWVsZE5hbWVzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc1ByaW1pdGl2ZUZpZWxkKSB7DQorICAgICAgICAgIFByaW1pdGl2ZUZpZWxkID0gb3RoZXIuUHJpbWl0aXZlRmllbGQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzU3RyaW5nRmllbGQpIHsNCisgICAgICAgICAgU3RyaW5nRmllbGQgPSBvdGhlci5TdHJpbmdGaWVsZDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNFbnVtRmllbGQpIHsNCisgICAgICAgICAgRW51bUZpZWxkID0gb3RoZXIuRW51bUZpZWxkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc01lc3NhZ2VGaWVsZCkgew0KKyAgICAgICAgICBNZXJnZU1lc3NhZ2VGaWVsZChvdGhlci5NZXNzYWdlRmllbGQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1N0cmluZ1BpZWNlRmllbGQpIHsNCisgICAgICAgICAgU3RyaW5nUGllY2VGaWVsZCA9IG90aGVyLlN0cmluZ1BpZWNlRmllbGQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzQ29yZEZpZWxkKSB7DQorICAgICAgICAgIENvcmRGaWVsZCA9IG90aGVyLkNvcmRGaWVsZDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5BZGQob3RoZXIucmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkU3RyaW5nRmllbGRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nRmllbGRfLkFkZChvdGhlci5yZXBlYXRlZFN0cmluZ0ZpZWxkXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRFbnVtRmllbGRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRW51bUZpZWxkXy5BZGQob3RoZXIucmVwZWF0ZWRFbnVtRmllbGRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZE1lc3NhZ2VGaWVsZF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlRmllbGRfLkFkZChvdGhlci5yZXBlYXRlZE1lc3NhZ2VGaWVsZF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkXy5BZGQob3RoZXIucmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRDb3JkRmllbGRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkQ29yZEZpZWxkXy5BZGQob3RoZXIucmVwZWF0ZWRDb3JkRmllbGRfKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNQcmltaXRpdmVGaWVsZCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LnByaW1pdGl2ZUZpZWxkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1N0cmluZ0ZpZWxkID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LnN0cmluZ0ZpZWxkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNDogew0KKyAgICAgICAgICAgICAgb2JqZWN0IHVua25vd247DQorICAgICAgICAgICAgICBpZihpbnB1dC5SZWFkRW51bShyZWYgcmVzdWx0LmVudW1GaWVsZF8sIG91dCB1bmtub3duKSkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQuaGFzRW51bUZpZWxkID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgzLCAodWxvbmcpKGludCl1bmtub3duKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM0OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc01lc3NhZ2VGaWVsZCkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShNZXNzYWdlRmllbGQpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgTWVzc2FnZUZpZWxkID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzU3RyaW5nUGllY2VGaWVsZCA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5zdHJpbmdQaWVjZUZpZWxkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0NvcmRGaWVsZCA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5jb3JkRmllbGRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU4Og0KKyAgICAgICAgICAgIGNhc2UgNTY6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkUHJpbWl0aXZlRmllbGRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU3RyaW5nQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTdHJpbmdGaWVsZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzQ6DQorICAgICAgICAgICAgY2FzZSA3Mjogew0KKyAgICAgICAgICAgICAgc2NnOjpJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd25JdGVtczsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXk8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkRW51bUZpZWxkXywgb3V0IHVua25vd25JdGVtcyk7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkl0ZW1zICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgcmF3VmFsdWUgaW4gdW5rbm93bkl0ZW1zKQ0KKyAgICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZSBpcyBpbnQpDQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoOSwgKHVsb25nKShpbnQpcmF3VmFsdWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODI6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRNZXNzYWdlRmllbGRfLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDkwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU3RyaW5nQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA5ODogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkQ29yZEZpZWxkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzUHJpbWl0aXZlRmllbGQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNQcmltaXRpdmVGaWVsZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFByaW1pdGl2ZUZpZWxkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUHJpbWl0aXZlRmllbGQ7IH0NCisgICAgICAgIHNldCB7IFNldFByaW1pdGl2ZUZpZWxkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQcmltaXRpdmVGaWVsZChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzUHJpbWl0aXZlRmllbGQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnByaW1pdGl2ZUZpZWxkXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUHJpbWl0aXZlRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ByaW1pdGl2ZUZpZWxkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQucHJpbWl0aXZlRmllbGRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNTdHJpbmdGaWVsZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1N0cmluZ0ZpZWxkOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgU3RyaW5nRmllbGQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5TdHJpbmdGaWVsZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0U3RyaW5nRmllbGQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFN0cmluZ0ZpZWxkKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU3RyaW5nRmllbGQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnN0cmluZ0ZpZWxkXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyU3RyaW5nRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1N0cmluZ0ZpZWxkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuc3RyaW5nRmllbGRfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRW51bUZpZWxkIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNFbnVtRmllbGQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEVudW1GaWVsZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkVudW1GaWVsZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RW51bUZpZWxkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRFbnVtRmllbGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRW51bUZpZWxkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5lbnVtRmllbGRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJFbnVtRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0VudW1GaWVsZCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmVudW1GaWVsZF8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPTzsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNNZXNzYWdlRmllbGQgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc01lc3NhZ2VGaWVsZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgTWVzc2FnZUZpZWxkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTWVzc2FnZUZpZWxkOyB9DQorICAgICAgICBzZXQgeyBTZXRNZXNzYWdlRmllbGQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE1lc3NhZ2VGaWVsZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZUZpZWxkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5tZXNzYWdlRmllbGRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TWVzc2FnZUZpZWxkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc01lc3NhZ2VGaWVsZCA9IHRydWU7DQorICAgICAgICByZXN1bHQubWVzc2FnZUZpZWxkXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlTWVzc2FnZUZpZWxkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzTWVzc2FnZUZpZWxkICYmDQorICAgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VGaWVsZF8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VGaWVsZF8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5DcmVhdGVCdWlsZGVyKHJlc3VsdC5tZXNzYWdlRmllbGRfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VGaWVsZF8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNNZXNzYWdlRmllbGQgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTWVzc2FnZUZpZWxkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNZXNzYWdlRmllbGQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5tZXNzYWdlRmllbGRfID0gbnVsbDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNTdHJpbmdQaWVjZUZpZWxkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzU3RyaW5nUGllY2VGaWVsZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIFN0cmluZ1BpZWNlRmllbGQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5TdHJpbmdQaWVjZUZpZWxkOyB9DQorICAgICAgICBzZXQgeyBTZXRTdHJpbmdQaWVjZUZpZWxkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRTdHJpbmdQaWVjZUZpZWxkKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU3RyaW5nUGllY2VGaWVsZCA9IHRydWU7DQorICAgICAgICByZXN1bHQuc3RyaW5nUGllY2VGaWVsZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclN0cmluZ1BpZWNlRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1N0cmluZ1BpZWNlRmllbGQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5zdHJpbmdQaWVjZUZpZWxkXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0NvcmRGaWVsZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0NvcmRGaWVsZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIENvcmRGaWVsZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkNvcmRGaWVsZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Q29yZEZpZWxkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRDb3JkRmllbGQoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDb3JkRmllbGQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmNvcmRGaWVsZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckNvcmRGaWVsZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQ29yZEZpZWxkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuY29yZEZpZWxkXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFByaW1pdGl2ZUZpZWxkXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkUHJpbWl0aXZlRmllbGRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkUHJpbWl0aXZlRmllbGQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkUHJpbWl0aXZlRmllbGQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZFByaW1pdGl2ZUZpZWxkKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkUHJpbWl0aXZlRmllbGRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkUHJpbWl0aXZlRmllbGQoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkUHJpbWl0aXZlRmllbGRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZFByaW1pdGl2ZUZpZWxkKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZFByaW1pdGl2ZUZpZWxkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBSZXBlYXRlZFN0cmluZ0ZpZWxkTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFN0cmluZ0ZpZWxkXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU3RyaW5nRmllbGRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkU3RyaW5nRmllbGRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nRmllbGQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkU3RyaW5nRmllbGQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZFN0cmluZ0ZpZWxkKGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ0ZpZWxkX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZFN0cmluZ0ZpZWxkKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdGaWVsZF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkU3RyaW5nRmllbGQoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ0ZpZWxkXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkU3RyaW5nRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nRmllbGRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gUmVwZWF0ZWRFbnVtRmllbGRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkRW51bUZpZWxkXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRW51bUZpZWxkQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEVudW1GaWVsZENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBHZXRSZXBlYXRlZEVudW1GaWVsZChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRFbnVtRmllbGQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEVudW1GaWVsZChpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRW51bUZpZWxkX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEVudW1GaWVsZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEVudW1GaWVsZF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkRW51bUZpZWxkKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEVudW1GaWVsZF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEVudW1GaWVsZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRFbnVtRmllbGRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gUmVwZWF0ZWRNZXNzYWdlRmllbGRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkTWVzc2FnZUZpZWxkXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkTWVzc2FnZUZpZWxkQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZE1lc3NhZ2VGaWVsZENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBHZXRSZXBlYXRlZE1lc3NhZ2VGaWVsZChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRNZXNzYWdlRmllbGQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZE1lc3NhZ2VGaWVsZChpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VGaWVsZF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRNZXNzYWdlRmllbGQoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VGaWVsZF9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRNZXNzYWdlRmllbGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTWVzc2FnZUZpZWxkXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkTWVzc2FnZUZpZWxkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTWVzc2FnZUZpZWxkXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRNZXNzYWdlRmllbGQoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTWVzc2FnZUZpZWxkXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkTWVzc2FnZUZpZWxkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VGaWVsZF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkKGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZChzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gUmVwZWF0ZWRDb3JkRmllbGRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkQ29yZEZpZWxkXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkQ29yZEZpZWxkQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZENvcmRGaWVsZENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgR2V0UmVwZWF0ZWRDb3JkRmllbGQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkQ29yZEZpZWxkKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRDb3JkRmllbGQoaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQ29yZEZpZWxkX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZENvcmRGaWVsZChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQ29yZEZpZWxkXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRDb3JkRmllbGQoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZENvcmRGaWVsZF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZENvcmRGaWVsZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRDb3JkRmllbGRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0RmllbGRPcmRlcmluZ3MgOiBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8VGVzdEZpZWxkT3JkZXJpbmdzLCBUZXN0RmllbGRPcmRlcmluZ3MuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RGaWVsZE9yZGVyaW5ncygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0RmllbGRPcmRlcmluZ3MgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RGaWVsZE9yZGVyaW5ncygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdEZpZWxkT3JkZXJpbmdzRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJteV9mbG9hdCIsICJteV9pbnQiLCAibXlfc3RyaW5nIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RGaWVsZE9yZGVyaW5nc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4MTMsIDgsIDkwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZpZWxkT3JkZXJpbmdzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEZpZWxkT3JkZXJpbmdzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RGaWVsZE9yZGVyaW5ncyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGaWVsZE9yZGVyaW5nc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0RmllbGRPcmRlcmluZ3MsIFRlc3RGaWVsZE9yZGVyaW5ncy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RmllbGRPcmRlcmluZ3NfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE15U3RyaW5nRmllbGROdW1iZXIgPSAxMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc015U3RyaW5nOw0KKyAgICBwcml2YXRlIHN0cmluZyBteVN0cmluZ18gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzTXlTdHJpbmcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNNeVN0cmluZzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgTXlTdHJpbmcgew0KKyAgICAgIGdldCB7IHJldHVybiBteVN0cmluZ187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBNeUludEZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc015SW50Ow0KKyAgICBwcml2YXRlIGxvbmcgbXlJbnRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNNeUludCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc015SW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgTXlJbnQgew0KKyAgICAgIGdldCB7IHJldHVybiBteUludF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBNeUZsb2F0RmllbGROdW1iZXIgPSAxMDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNNeUZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IG15RmxvYXRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNNeUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTXlGbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBNeUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gbXlGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmICghRXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0RmllbGRPcmRlcmluZ3NGaWVsZE5hbWVzOw0KKyAgICAgIHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxUZXN0RmllbGRPcmRlcmluZ3MsIFRlc3RGaWVsZE9yZGVyaW5ncy5CdWlsZGVyPi5FeHRlbnNpb25Xcml0ZXIgZXh0ZW5zaW9uV3JpdGVyID0gQ3JlYXRlRXh0ZW5zaW9uV3JpdGVyKHRoaXMpOw0KKyAgICAgIGlmIChoYXNNeUludCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50NjQoMSwgZmllbGRfbmFtZXNbMV0sIE15SW50KTsNCisgICAgICB9DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoMTEsIG91dHB1dCk7DQorICAgICAgaWYgKGhhc015U3RyaW5nKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMTEsIGZpZWxkX25hbWVzWzJdLCBNeVN0cmluZyk7DQorICAgICAgfQ0KKyAgICAgIGV4dGVuc2lvbldyaXRlci5Xcml0ZVVudGlsKDEwMSwgb3V0cHV0KTsNCisgICAgICBpZiAoaGFzTXlGbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoMTAxLCBmaWVsZF9uYW1lc1swXSwgTXlGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzTXlTdHJpbmcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDExLCBNeVN0cmluZyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNNeUludCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZSgxLCBNeUludCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNNeUZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDEwMSwgTXlGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGaWVsZE9yZGVyaW5ncyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RmllbGRPcmRlcmluZ3MgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZpZWxkT3JkZXJpbmdzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RmllbGRPcmRlcmluZ3MgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGaWVsZE9yZGVyaW5ncyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RmllbGRPcmRlcmluZ3MgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZpZWxkT3JkZXJpbmdzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGaWVsZE9yZGVyaW5ncyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RmllbGRPcmRlcmluZ3MgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZpZWxkT3JkZXJpbmdzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RGaWVsZE9yZGVyaW5ncyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0RmllbGRPcmRlcmluZ3MgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkV4dGVuZGFibGVCdWlsZGVyPFRlc3RGaWVsZE9yZGVyaW5ncywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdEZpZWxkT3JkZXJpbmdzIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdEZpZWxkT3JkZXJpbmdzIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RGaWVsZE9yZGVyaW5ncyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RGaWVsZE9yZGVyaW5ncyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RGaWVsZE9yZGVyaW5ncygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEZpZWxkT3JkZXJpbmdzIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZpZWxkT3JkZXJpbmdzLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RGaWVsZE9yZGVyaW5ncyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RmllbGRPcmRlcmluZ3MuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RmllbGRPcmRlcmluZ3MgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RGaWVsZE9yZGVyaW5ncykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0RmllbGRPcmRlcmluZ3MpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0RmllbGRPcmRlcmluZ3Mgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RmllbGRPcmRlcmluZ3MuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzTXlTdHJpbmcpIHsNCisgICAgICAgICAgTXlTdHJpbmcgPSBvdGhlci5NeVN0cmluZzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNNeUludCkgew0KKyAgICAgICAgICBNeUludCA9IG90aGVyLk15SW50Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc015RmxvYXQpIHsNCisgICAgICAgICAgTXlGbG9hdCA9IG90aGVyLk15RmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICAgIHRoaXMuTWVyZ2VFeHRlbnNpb25GaWVsZHMob3RoZXIpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdEZpZWxkT3JkZXJpbmdzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RGaWVsZE9yZGVyaW5nc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTXlJbnQgPSBpbnB1dC5SZWFkSW50NjQocmVmIHJlc3VsdC5teUludF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgOTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNNeVN0cmluZyA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5teVN0cmluZ18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODEzOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTXlGbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0Lm15RmxvYXRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNNeVN0cmluZyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc015U3RyaW5nOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgTXlTdHJpbmcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5NeVN0cmluZzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TXlTdHJpbmcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE15U3RyaW5nKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTXlTdHJpbmcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm15U3RyaW5nXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTXlTdHJpbmcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc015U3RyaW5nID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubXlTdHJpbmdfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTXlJbnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNNeUludDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBNeUludCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk15SW50OyB9DQorICAgICAgICBzZXQgeyBTZXRNeUludCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TXlJbnQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNeUludCA9IHRydWU7DQorICAgICAgICByZXN1bHQubXlJbnRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJNeUludCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTXlJbnQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5teUludF8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNNeUZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTXlGbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgTXlGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk15RmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldE15RmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE15RmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTXlGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQubXlGbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck15RmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc015RmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5teUZsb2F0XyA9IDBGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0RmllbGRPcmRlcmluZ3MoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcywgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RFeHRyZW1lRGVmYXVsdFZhbHVlc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiY3BwX3RyaWdyYXBoIiwgImVzY2FwZWRfYnl0ZXMiLCAiaW5mX2RvdWJsZSIsICJpbmZfZmxvYXQiLCAibGFyZ2VfZmxvYXQiLCAibGFyZ2VfdWludDMyIiwgImxhcmdlX3VpbnQ2NCIsICJuYW5fZG91YmxlIiwgIm5hbl9mbG9hdCIsICJuZWdfaW5mX2RvdWJsZSIsICJuZWdfaW5mX2Zsb2F0IiwgIm5lZ2F0aXZlX2Zsb2F0IiwgIm5lZ2F0aXZlX29uZV9mbG9hdCIsICJvbmVfZmxvYXQiLCAic21hbGxfZmxvYXQiLCAic21hbGxfaW50MzIiLCAic21hbGxfaW50NjQiLCAic21hbGxfbmVnYXRpdmVfZmxvYXQiLCAidXRmOF9zdHJpbmciLCAiemVyb19mbG9hdCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTYyLCAxMCwgMTEzLCAxNDEsIDEwMSwgMTYsIDI0LCAxMjksIDE1NywgMTIxLCAxNDksIDkzLCA4NSwgNjksIDc3LCAzMiwgNDAsIDEwOSwgNTAsIDYxIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFeHRyZW1lRGVmYXVsdFZhbHVlc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMsIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEVzY2FwZWRCeXRlc0ZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0VzY2FwZWRCeXRlczsNCisgICAgcHJpdmF0ZSBwYjo6Qnl0ZVN0cmluZyBlc2NhcGVkQnl0ZXNfID0gKHBiOjpCeXRlU3RyaW5nKSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuRGVzY3JpcHRvci5GaWVsZHNbMF0uRGVmYXVsdFZhbHVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNFc2NhcGVkQnl0ZXMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNFc2NhcGVkQnl0ZXM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgRXNjYXBlZEJ5dGVzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZXNjYXBlZEJ5dGVzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IExhcmdlVWludDMyRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzTGFyZ2VVaW50MzI7DQorICAgIHByaXZhdGUgdWludCBsYXJnZVVpbnQzMl8gPSA0Mjk0OTY3Mjk1Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNMYXJnZVVpbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0xhcmdlVWludDMyOyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IExhcmdlVWludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gbGFyZ2VVaW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTGFyZ2VVaW50NjRGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNMYXJnZVVpbnQ2NDsNCisgICAgcHJpdmF0ZSB1bG9uZyBsYXJnZVVpbnQ2NF8gPSAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNMYXJnZVVpbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0xhcmdlVWludDY0OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBMYXJnZVVpbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGxhcmdlVWludDY0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFNtYWxsSW50MzJGaWVsZE51bWJlciA9IDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNTbWFsbEludDMyOw0KKyAgICBwcml2YXRlIGludCBzbWFsbEludDMyXyA9IC0yMTQ3NDgzNjQ3Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNTbWFsbEludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzU21hbGxJbnQzMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgU21hbGxJbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHNtYWxsSW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgU21hbGxJbnQ2NEZpZWxkTnVtYmVyID0gNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc1NtYWxsSW50NjQ7DQorICAgIHByaXZhdGUgbG9uZyBzbWFsbEludDY0XyA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3TDsNCisgICAgcHVibGljIGJvb2wgSGFzU21hbGxJbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1NtYWxsSW50NjQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBTbWFsbEludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gc21hbGxJbnQ2NF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVdGY4U3RyaW5nRmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzVXRmOFN0cmluZzsNCisgICAgcHJpdmF0ZSBzdHJpbmcgdXRmOFN0cmluZ18gPSAoc3RyaW5nKSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuRGVzY3JpcHRvci5GaWVsZHNbNV0uRGVmYXVsdFZhbHVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNVdGY4U3RyaW5nIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzVXRmOFN0cmluZzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgVXRmOFN0cmluZyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHV0ZjhTdHJpbmdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgWmVyb0Zsb2F0RmllbGROdW1iZXIgPSA3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzWmVyb0Zsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IHplcm9GbG9hdF87DQorICAgIHB1YmxpYyBib29sIEhhc1plcm9GbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1plcm9GbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBaZXJvRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiB6ZXJvRmxvYXRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT25lRmxvYXRGaWVsZE51bWJlciA9IDg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPbmVGbG9hdDsNCisgICAgcHJpdmF0ZSBmbG9hdCBvbmVGbG9hdF8gPSAxRjsNCisgICAgcHVibGljIGJvb2wgSGFzT25lRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPbmVGbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBPbmVGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9uZUZsb2F0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFNtYWxsRmxvYXRGaWVsZE51bWJlciA9IDk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNTbWFsbEZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IHNtYWxsRmxvYXRfID0gMS41RjsNCisgICAgcHVibGljIGJvb2wgSGFzU21hbGxGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1NtYWxsRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgU21hbGxGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHNtYWxsRmxvYXRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTmVnYXRpdmVPbmVGbG9hdEZpZWxkTnVtYmVyID0gMTA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOZWdhdGl2ZU9uZUZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IG5lZ2F0aXZlT25lRmxvYXRfID0gLTFGOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOZWdhdGl2ZU9uZUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmVnYXRpdmVPbmVGbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBOZWdhdGl2ZU9uZUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gbmVnYXRpdmVPbmVGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOZWdhdGl2ZUZsb2F0RmllbGROdW1iZXIgPSAxMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc05lZ2F0aXZlRmxvYXQ7DQorICAgIHByaXZhdGUgZmxvYXQgbmVnYXRpdmVGbG9hdF8gPSAtMS41RjsNCisgICAgcHVibGljIGJvb2wgSGFzTmVnYXRpdmVGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc05lZ2F0aXZlRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgTmVnYXRpdmVGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG5lZ2F0aXZlRmxvYXRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTGFyZ2VGbG9hdEZpZWxkTnVtYmVyID0gMTI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNMYXJnZUZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IGxhcmdlRmxvYXRfID0gMkUrMDhGOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNMYXJnZUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTGFyZ2VGbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBMYXJnZUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gbGFyZ2VGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBTbWFsbE5lZ2F0aXZlRmxvYXRGaWVsZE51bWJlciA9IDEzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzU21hbGxOZWdhdGl2ZUZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IHNtYWxsTmVnYXRpdmVGbG9hdF8gPSAtOEUtMjhGOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNTbWFsbE5lZ2F0aXZlRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNTbWFsbE5lZ2F0aXZlRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgU21hbGxOZWdhdGl2ZUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gc21hbGxOZWdhdGl2ZUZsb2F0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEluZkRvdWJsZUZpZWxkTnVtYmVyID0gMTQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNJbmZEb3VibGU7DQorICAgIHByaXZhdGUgZG91YmxlIGluZkRvdWJsZV8gPSBkb3VibGUuUG9zaXRpdmVJbmZpbml0eTsNCisgICAgcHVibGljIGJvb2wgSGFzSW5mRG91YmxlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzSW5mRG91YmxlOyB9DQorICAgIH0NCisgICAgcHVibGljIGRvdWJsZSBJbmZEb3VibGUgew0KKyAgICAgIGdldCB7IHJldHVybiBpbmZEb3VibGVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTmVnSW5mRG91YmxlRmllbGROdW1iZXIgPSAxNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc05lZ0luZkRvdWJsZTsNCisgICAgcHJpdmF0ZSBkb3VibGUgbmVnSW5mRG91YmxlXyA9IGRvdWJsZS5OZWdhdGl2ZUluZmluaXR5Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNOZWdJbmZEb3VibGUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNOZWdJbmZEb3VibGU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZG91YmxlIE5lZ0luZkRvdWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG5lZ0luZkRvdWJsZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOYW5Eb3VibGVGaWVsZE51bWJlciA9IDE2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzTmFuRG91YmxlOw0KKyAgICBwcml2YXRlIGRvdWJsZSBuYW5Eb3VibGVfID0gZG91YmxlLk5hTjsNCisgICAgcHVibGljIGJvb2wgSGFzTmFuRG91YmxlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmFuRG91YmxlOyB9DQorICAgIH0NCisgICAgcHVibGljIGRvdWJsZSBOYW5Eb3VibGUgew0KKyAgICAgIGdldCB7IHJldHVybiBuYW5Eb3VibGVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgSW5mRmxvYXRGaWVsZE51bWJlciA9IDE3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzSW5mRmxvYXQ7DQorICAgIHByaXZhdGUgZmxvYXQgaW5mRmxvYXRfID0gZmxvYXQuUG9zaXRpdmVJbmZpbml0eTsNCisgICAgcHVibGljIGJvb2wgSGFzSW5mRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNJbmZGbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBJbmZGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGluZkZsb2F0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE5lZ0luZkZsb2F0RmllbGROdW1iZXIgPSAxODsNCisgICAgcHJpdmF0ZSBib29sIGhhc05lZ0luZkZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IG5lZ0luZkZsb2F0XyA9IGZsb2F0Lk5lZ2F0aXZlSW5maW5pdHk7DQorICAgIHB1YmxpYyBib29sIEhhc05lZ0luZkZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmVnSW5mRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgTmVnSW5mRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBuZWdJbmZGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOYW5GbG9hdEZpZWxkTnVtYmVyID0gMTk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOYW5GbG9hdDsNCisgICAgcHJpdmF0ZSBmbG9hdCBuYW5GbG9hdF8gPSBmbG9hdC5OYU47DQorICAgIHB1YmxpYyBib29sIEhhc05hbkZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmFuRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgTmFuRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBuYW5GbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBDcHBUcmlncmFwaEZpZWxkTnVtYmVyID0gMjA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNDcHBUcmlncmFwaDsNCisgICAgcHJpdmF0ZSBzdHJpbmcgY3BwVHJpZ3JhcGhfID0gIj8gPyA/PyA/PyA/Pz8gPz8vID8/LSI7DQorICAgIHB1YmxpYyBib29sIEhhc0NwcFRyaWdyYXBoIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQ3BwVHJpZ3JhcGg7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIENwcFRyaWdyYXBoIHsNCisgICAgICBnZXQgeyByZXR1cm4gY3BwVHJpZ3JhcGhfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNFc2NhcGVkQnl0ZXMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKDEsIGZpZWxkX25hbWVzWzFdLCBFc2NhcGVkQnl0ZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTGFyZ2VVaW50MzIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQzMigyLCBmaWVsZF9uYW1lc1s1XSwgTGFyZ2VVaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTGFyZ2VVaW50NjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQ2NCgzLCBmaWVsZF9uYW1lc1s2XSwgTGFyZ2VVaW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU21hbGxJbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNCwgZmllbGRfbmFtZXNbMTVdLCBTbWFsbEludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1NtYWxsSW50NjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KDUsIGZpZWxkX25hbWVzWzE2XSwgU21hbGxJbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNVdGY4U3RyaW5nKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoNiwgZmllbGRfbmFtZXNbMThdLCBVdGY4U3RyaW5nKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1plcm9GbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoNywgZmllbGRfbmFtZXNbMTldLCBaZXJvRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT25lRmxvYXQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDgsIGZpZWxkX25hbWVzWzEzXSwgT25lRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU21hbGxGbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoOSwgZmllbGRfbmFtZXNbMTRdLCBTbWFsbEZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05lZ2F0aXZlT25lRmxvYXQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDEwLCBmaWVsZF9uYW1lc1sxMl0sIE5lZ2F0aXZlT25lRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTmVnYXRpdmVGbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoMTEsIGZpZWxkX25hbWVzWzExXSwgTmVnYXRpdmVGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNMYXJnZUZsb2F0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgxMiwgZmllbGRfbmFtZXNbNF0sIExhcmdlRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU21hbGxOZWdhdGl2ZUZsb2F0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgxMywgZmllbGRfbmFtZXNbMTddLCBTbWFsbE5lZ2F0aXZlRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSW5mRG91YmxlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGUoMTQsIGZpZWxkX25hbWVzWzJdLCBJbmZEb3VibGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTmVnSW5mRG91YmxlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGUoMTUsIGZpZWxkX25hbWVzWzldLCBOZWdJbmZEb3VibGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTmFuRG91YmxlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGUoMTYsIGZpZWxkX25hbWVzWzddLCBOYW5Eb3VibGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSW5mRmxvYXQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDE3LCBmaWVsZF9uYW1lc1szXSwgSW5mRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTmVnSW5mRmxvYXQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDE4LCBmaWVsZF9uYW1lc1sxMF0sIE5lZ0luZkZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05hbkZsb2F0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgxOSwgZmllbGRfbmFtZXNbOF0sIE5hbkZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0NwcFRyaWdyYXBoKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMjAsIGZpZWxkX25hbWVzWzBdLCBDcHBUcmlncmFwaCk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzRXNjYXBlZEJ5dGVzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplKDEsIEVzY2FwZWRCeXRlcyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNMYXJnZVVpbnQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQzMlNpemUoMiwgTGFyZ2VVaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTGFyZ2VVaW50NjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50NjRTaXplKDMsIExhcmdlVWludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1NtYWxsSW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNCwgU21hbGxJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNTbWFsbEludDY0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKDUsIFNtYWxsSW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzVXRmOFN0cmluZykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoNiwgVXRmOFN0cmluZyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNaZXJvRmxvYXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoNywgWmVyb0Zsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09uZUZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDgsIE9uZUZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1NtYWxsRmxvYXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoOSwgU21hbGxGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNOZWdhdGl2ZU9uZUZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDEwLCBOZWdhdGl2ZU9uZUZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05lZ2F0aXZlRmxvYXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoMTEsIE5lZ2F0aXZlRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTGFyZ2VGbG9hdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSgxMiwgTGFyZ2VGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNTbWFsbE5lZ2F0aXZlRmxvYXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoMTMsIFNtYWxsTmVnYXRpdmVGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNJbmZEb3VibGUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVEb3VibGVTaXplKDE0LCBJbmZEb3VibGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTmVnSW5mRG91YmxlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRG91YmxlU2l6ZSgxNSwgTmVnSW5mRG91YmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05hbkRvdWJsZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZURvdWJsZVNpemUoMTYsIE5hbkRvdWJsZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNJbmZGbG9hdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSgxNywgSW5mRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTmVnSW5mRmxvYXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoMTgsIE5lZ0luZkZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05hbkZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDE5LCBOYW5GbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNDcHBUcmlncmFwaCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMjAsIENwcFRyaWdyYXBoKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0VzY2FwZWRCeXRlcykgew0KKyAgICAgICAgICBFc2NhcGVkQnl0ZXMgPSBvdGhlci5Fc2NhcGVkQnl0ZXM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzTGFyZ2VVaW50MzIpIHsNCisgICAgICAgICAgTGFyZ2VVaW50MzIgPSBvdGhlci5MYXJnZVVpbnQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNMYXJnZVVpbnQ2NCkgew0KKyAgICAgICAgICBMYXJnZVVpbnQ2NCA9IG90aGVyLkxhcmdlVWludDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1NtYWxsSW50MzIpIHsNCisgICAgICAgICAgU21hbGxJbnQzMiA9IG90aGVyLlNtYWxsSW50MzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzU21hbGxJbnQ2NCkgew0KKyAgICAgICAgICBTbWFsbEludDY0ID0gb3RoZXIuU21hbGxJbnQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNVdGY4U3RyaW5nKSB7DQorICAgICAgICAgIFV0ZjhTdHJpbmcgPSBvdGhlci5VdGY4U3RyaW5nOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1plcm9GbG9hdCkgew0KKyAgICAgICAgICBaZXJvRmxvYXQgPSBvdGhlci5aZXJvRmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT25lRmxvYXQpIHsNCisgICAgICAgICAgT25lRmxvYXQgPSBvdGhlci5PbmVGbG9hdDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNTbWFsbEZsb2F0KSB7DQorICAgICAgICAgIFNtYWxsRmxvYXQgPSBvdGhlci5TbWFsbEZsb2F0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc05lZ2F0aXZlT25lRmxvYXQpIHsNCisgICAgICAgICAgTmVnYXRpdmVPbmVGbG9hdCA9IG90aGVyLk5lZ2F0aXZlT25lRmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzTmVnYXRpdmVGbG9hdCkgew0KKyAgICAgICAgICBOZWdhdGl2ZUZsb2F0ID0gb3RoZXIuTmVnYXRpdmVGbG9hdDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNMYXJnZUZsb2F0KSB7DQorICAgICAgICAgIExhcmdlRmxvYXQgPSBvdGhlci5MYXJnZUZsb2F0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1NtYWxsTmVnYXRpdmVGbG9hdCkgew0KKyAgICAgICAgICBTbWFsbE5lZ2F0aXZlRmxvYXQgPSBvdGhlci5TbWFsbE5lZ2F0aXZlRmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzSW5mRG91YmxlKSB7DQorICAgICAgICAgIEluZkRvdWJsZSA9IG90aGVyLkluZkRvdWJsZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNOZWdJbmZEb3VibGUpIHsNCisgICAgICAgICAgTmVnSW5mRG91YmxlID0gb3RoZXIuTmVnSW5mRG91YmxlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc05hbkRvdWJsZSkgew0KKyAgICAgICAgICBOYW5Eb3VibGUgPSBvdGhlci5OYW5Eb3VibGU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzSW5mRmxvYXQpIHsNCisgICAgICAgICAgSW5mRmxvYXQgPSBvdGhlci5JbmZGbG9hdDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNOZWdJbmZGbG9hdCkgew0KKyAgICAgICAgICBOZWdJbmZGbG9hdCA9IG90aGVyLk5lZ0luZkZsb2F0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc05hbkZsb2F0KSB7DQorICAgICAgICAgIE5hbkZsb2F0ID0gb3RoZXIuTmFuRmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzQ3BwVHJpZ3JhcGgpIHsNCisgICAgICAgICAgQ3BwVHJpZ3JhcGggPSBvdGhlci5DcHBUcmlncmFwaDsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RFeHRyZW1lRGVmYXVsdFZhbHVlc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNFc2NhcGVkQnl0ZXMgPSBpbnB1dC5SZWFkQnl0ZXMocmVmIHJlc3VsdC5lc2NhcGVkQnl0ZXNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTGFyZ2VVaW50MzIgPSBpbnB1dC5SZWFkVUludDMyKHJlZiByZXN1bHQubGFyZ2VVaW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTGFyZ2VVaW50NjQgPSBpbnB1dC5SZWFkVUludDY0KHJlZiByZXN1bHQubGFyZ2VVaW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzU21hbGxJbnQzMiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LnNtYWxsSW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzU21hbGxJbnQ2NCA9IGlucHV0LlJlYWRJbnQ2NChyZWYgcmVzdWx0LnNtYWxsSW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDUwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzVXRmOFN0cmluZyA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC51dGY4U3RyaW5nXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2MTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1plcm9GbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0Lnplcm9GbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjk6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPbmVGbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0Lm9uZUZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3Nzogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1NtYWxsRmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5zbWFsbEZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4NTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc05lZ2F0aXZlT25lRmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5uZWdhdGl2ZU9uZUZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA5Mzogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc05lZ2F0aXZlRmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5uZWdhdGl2ZUZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNMYXJnZUZsb2F0ID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQubGFyZ2VGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA5OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzU21hbGxOZWdhdGl2ZUZsb2F0ID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQuc21hbGxOZWdhdGl2ZUZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMTM6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNJbmZEb3VibGUgPSBpbnB1dC5SZWFkRG91YmxlKHJlZiByZXN1bHQuaW5mRG91YmxlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMjE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOZWdJbmZEb3VibGUgPSBpbnB1dC5SZWFkRG91YmxlKHJlZiByZXN1bHQubmVnSW5mRG91YmxlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMjk6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOYW5Eb3VibGUgPSBpbnB1dC5SZWFkRG91YmxlKHJlZiByZXN1bHQubmFuRG91YmxlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNDE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNJbmZGbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0LmluZkZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNDk6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOZWdJbmZGbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0Lm5lZ0luZkZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNTc6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOYW5GbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0Lm5hbkZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNDcHBUcmlncmFwaCA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5jcHBUcmlncmFwaF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0VzY2FwZWRCeXRlcyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0VzY2FwZWRCeXRlczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgRXNjYXBlZEJ5dGVzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRXNjYXBlZEJ5dGVzOyB9DQorICAgICAgICBzZXQgeyBTZXRFc2NhcGVkQnl0ZXModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEVzY2FwZWRCeXRlcyhwYjo6Qnl0ZVN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRXNjYXBlZEJ5dGVzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5lc2NhcGVkQnl0ZXNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJFc2NhcGVkQnl0ZXMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0VzY2FwZWRCeXRlcyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmVzY2FwZWRCeXRlc18gPSAocGI6OkJ5dGVTdHJpbmcpIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcy5EZXNjcmlwdG9yLkZpZWxkc1swXS5EZWZhdWx0VmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTGFyZ2VVaW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNMYXJnZVVpbnQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBMYXJnZVVpbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkxhcmdlVWludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXRMYXJnZVVpbnQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TGFyZ2VVaW50MzIodWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNMYXJnZVVpbnQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQubGFyZ2VVaW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJMYXJnZVVpbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTGFyZ2VVaW50MzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5sYXJnZVVpbnQzMl8gPSA0Mjk0OTY3Mjk1Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0xhcmdlVWludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTGFyZ2VVaW50NjQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIExhcmdlVWludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTGFyZ2VVaW50NjQ7IH0NCisgICAgICAgIHNldCB7IFNldExhcmdlVWludDY0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRMYXJnZVVpbnQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNMYXJnZVVpbnQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQubGFyZ2VVaW50NjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJMYXJnZVVpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTGFyZ2VVaW50NjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5sYXJnZVVpbnQ2NF8gPSAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1NtYWxsSW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNTbWFsbEludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgU21hbGxJbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlNtYWxsSW50MzI7IH0NCisgICAgICAgIHNldCB7IFNldFNtYWxsSW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFNtYWxsSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1NtYWxsSW50MzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnNtYWxsSW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTbWFsbEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTbWFsbEludDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuc21hbGxJbnQzMl8gPSAtMjE0NzQ4MzY0NzsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNTbWFsbEludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzU21hbGxJbnQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBTbWFsbEludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuU21hbGxJbnQ2NDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0U21hbGxJbnQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0U21hbGxJbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1NtYWxsSW50NjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnNtYWxsSW50NjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTbWFsbEludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTbWFsbEludDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuc21hbGxJbnQ2NF8gPSAtOTIyMzM3MjAzNjg1NDc3NTgwN0w7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzVXRmOFN0cmluZyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1V0ZjhTdHJpbmc7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBVdGY4U3RyaW5nIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVXRmOFN0cmluZzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0VXRmOFN0cmluZyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VXRmOFN0cmluZyhzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1V0ZjhTdHJpbmcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnV0ZjhTdHJpbmdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVdGY4U3RyaW5nKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNVdGY4U3RyaW5nID0gZmFsc2U7DQorICAgICAgICByZXN1bHQudXRmOFN0cmluZ18gPSAoc3RyaW5nKSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuRGVzY3JpcHRvci5GaWVsZHNbNV0uRGVmYXVsdFZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1plcm9GbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1plcm9GbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgWmVyb0Zsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuWmVyb0Zsb2F0OyB9DQorICAgICAgICBzZXQgeyBTZXRaZXJvRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFplcm9GbG9hdChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNaZXJvRmxvYXQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lnplcm9GbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclplcm9GbG9hdCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzWmVyb0Zsb2F0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuemVyb0Zsb2F0XyA9IDBGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09uZUZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT25lRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IE9uZUZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT25lRmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldE9uZUZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPbmVGbG9hdChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPbmVGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQub25lRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPbmVGbG9hdCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT25lRmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vbmVGbG9hdF8gPSAxRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNTbWFsbEZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzU21hbGxGbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgU21hbGxGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlNtYWxsRmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldFNtYWxsRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFNtYWxsRmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU21hbGxGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQuc21hbGxGbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclNtYWxsRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1NtYWxsRmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5zbWFsbEZsb2F0XyA9IDEuNUY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmVnYXRpdmVPbmVGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc05lZ2F0aXZlT25lRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IE5lZ2F0aXZlT25lRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OZWdhdGl2ZU9uZUZsb2F0OyB9DQorICAgICAgICBzZXQgeyBTZXROZWdhdGl2ZU9uZUZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROZWdhdGl2ZU9uZUZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05lZ2F0aXZlT25lRmxvYXQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm5lZ2F0aXZlT25lRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOZWdhdGl2ZU9uZUZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOZWdhdGl2ZU9uZUZsb2F0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubmVnYXRpdmVPbmVGbG9hdF8gPSAtMUY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmVnYXRpdmVGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc05lZ2F0aXZlRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IE5lZ2F0aXZlRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OZWdhdGl2ZUZsb2F0OyB9DQorICAgICAgICBzZXQgeyBTZXROZWdhdGl2ZUZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROZWdhdGl2ZUZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05lZ2F0aXZlRmxvYXQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm5lZ2F0aXZlRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOZWdhdGl2ZUZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOZWdhdGl2ZUZsb2F0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubmVnYXRpdmVGbG9hdF8gPSAtMS41RjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNMYXJnZUZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTGFyZ2VGbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgTGFyZ2VGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkxhcmdlRmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldExhcmdlRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldExhcmdlRmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTGFyZ2VGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQubGFyZ2VGbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckxhcmdlRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0xhcmdlRmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5sYXJnZUZsb2F0XyA9IDJFKzA4RjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNTbWFsbE5lZ2F0aXZlRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNTbWFsbE5lZ2F0aXZlRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IFNtYWxsTmVnYXRpdmVGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlNtYWxsTmVnYXRpdmVGbG9hdDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0U21hbGxOZWdhdGl2ZUZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRTbWFsbE5lZ2F0aXZlRmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU21hbGxOZWdhdGl2ZUZsb2F0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5zbWFsbE5lZ2F0aXZlRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTbWFsbE5lZ2F0aXZlRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1NtYWxsTmVnYXRpdmVGbG9hdCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnNtYWxsTmVnYXRpdmVGbG9hdF8gPSAtOEUtMjhGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0luZkRvdWJsZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0luZkRvdWJsZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZG91YmxlIEluZkRvdWJsZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkluZkRvdWJsZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0SW5mRG91YmxlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRJbmZEb3VibGUoZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0luZkRvdWJsZSA9IHRydWU7DQorICAgICAgICByZXN1bHQuaW5mRG91YmxlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFySW5mRG91YmxlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJbmZEb3VibGUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5pbmZEb3VibGVfID0gZG91YmxlLlBvc2l0aXZlSW5maW5pdHk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmVnSW5mRG91YmxlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTmVnSW5mRG91YmxlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBkb3VibGUgTmVnSW5mRG91YmxlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmVnSW5mRG91YmxlOyB9DQorICAgICAgICBzZXQgeyBTZXROZWdJbmZEb3VibGUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5lZ0luZkRvdWJsZShkb3VibGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmVnSW5mRG91YmxlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5uZWdJbmZEb3VibGVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOZWdJbmZEb3VibGUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05lZ0luZkRvdWJsZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5lZ0luZkRvdWJsZV8gPSBkb3VibGUuTmVnYXRpdmVJbmZpbml0eTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNOYW5Eb3VibGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOYW5Eb3VibGU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGRvdWJsZSBOYW5Eb3VibGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OYW5Eb3VibGU7IH0NCisgICAgICAgIHNldCB7IFNldE5hbkRvdWJsZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TmFuRG91YmxlKGRvdWJsZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOYW5Eb3VibGUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm5hbkRvdWJsZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5hbkRvdWJsZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmFuRG91YmxlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubmFuRG91YmxlXyA9IGRvdWJsZS5OYU47DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzSW5mRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNJbmZGbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgSW5mRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5JbmZGbG9hdDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0SW5mRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEluZkZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0luZkZsb2F0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5pbmZGbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckluZkZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJbmZGbG9hdCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmluZkZsb2F0XyA9IGZsb2F0LlBvc2l0aXZlSW5maW5pdHk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmVnSW5mRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOZWdJbmZGbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgTmVnSW5mRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OZWdJbmZGbG9hdDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TmVnSW5mRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5lZ0luZkZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05lZ0luZkZsb2F0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5uZWdJbmZGbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5lZ0luZkZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOZWdJbmZGbG9hdCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5lZ0luZkZsb2F0XyA9IGZsb2F0Lk5lZ2F0aXZlSW5maW5pdHk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmFuRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOYW5GbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgTmFuRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OYW5GbG9hdDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TmFuRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5hbkZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05hbkZsb2F0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5uYW5GbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5hbkZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOYW5GbG9hdCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5hbkZsb2F0XyA9IGZsb2F0Lk5hTjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNDcHBUcmlncmFwaCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0NwcFRyaWdyYXBoOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgQ3BwVHJpZ3JhcGggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5DcHBUcmlncmFwaDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Q3BwVHJpZ3JhcGgodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldENwcFRyaWdyYXBoKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQ3BwVHJpZ3JhcGggPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmNwcFRyaWdyYXBoXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQ3BwVHJpZ3JhcGgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0NwcFRyaWdyYXBoID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuY3BwVHJpZ3JhcGhfID0gIj8gPyA/PyA/PyA/Pz8gPz8vID8/LSI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgU3BhcnNlRW51bU1lc3NhZ2UgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxTcGFyc2VFbnVtTWVzc2FnZSwgU3BhcnNlRW51bU1lc3NhZ2UuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFNwYXJzZUVudW1NZXNzYWdlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNwYXJzZUVudW1NZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTcGFyc2VFbnVtTWVzc2FnZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfc3BhcnNlRW51bU1lc3NhZ2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInNwYXJzZV9lbnVtIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3NwYXJzZUVudW1NZXNzYWdlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDggfTsNCisgICAgcHVibGljIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFNwYXJzZUVudW1NZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNwYXJzZUVudW1NZXNzYWdlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfU3BhcnNlRW51bU1lc3NhZ2VfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8U3BhcnNlRW51bU1lc3NhZ2UsIFNwYXJzZUVudW1NZXNzYWdlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NwYXJzZUVudW1NZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBTcGFyc2VFbnVtRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzU3BhcnNlRW51bTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0U3BhcnNlRW51bSBzcGFyc2VFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RTcGFyc2VFbnVtLlNQQVJTRV9BOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNTcGFyc2VFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzU3BhcnNlRW51bTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0U3BhcnNlRW51bSBTcGFyc2VFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gc3BhcnNlRW51bV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3NwYXJzZUVudW1NZXNzYWdlRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzU3BhcnNlRW51bSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSgxLCBmaWVsZF9uYW1lc1swXSwgKGludCkgU3BhcnNlRW51bSwgU3BhcnNlRW51bSk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzU3BhcnNlRW51bSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDEsIChpbnQpIFNwYXJzZUVudW0pOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BhcnNlRW51bU1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFNwYXJzZUVudW1NZXNzYWdlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFNwYXJzZUVudW1NZXNzYWdlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFNwYXJzZUVudW1NZXNzYWdlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihTcGFyc2VFbnVtTWVzc2FnZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFNwYXJzZUVudW1NZXNzYWdlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFNwYXJzZUVudW1NZXNzYWdlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgU3BhcnNlRW51bU1lc3NhZ2Ugb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBTcGFyc2VFbnVtTWVzc2FnZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU3BhcnNlRW51bU1lc3NhZ2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGFyc2VFbnVtTWVzc2FnZS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTcGFyc2VFbnVtTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGFyc2VFbnVtTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNwYXJzZUVudW1NZXNzYWdlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBTcGFyc2VFbnVtTWVzc2FnZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChTcGFyc2VFbnVtTWVzc2FnZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFNwYXJzZUVudW1NZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BhcnNlRW51bU1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzU3BhcnNlRW51bSkgew0KKyAgICAgICAgICBTcGFyc2VFbnVtID0gb3RoZXIuU3BhcnNlRW51bTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3NwYXJzZUVudW1NZXNzYWdlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3NwYXJzZUVudW1NZXNzYWdlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5zcGFyc2VFbnVtXywgb3V0IHVua25vd24pKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNTcGFyc2VFbnVtID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgxLCAodWxvbmcpKGludCl1bmtub3duKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNTcGFyc2VFbnVtIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNTcGFyc2VFbnVtOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0U3BhcnNlRW51bSBTcGFyc2VFbnVtIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuU3BhcnNlRW51bTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0U3BhcnNlRW51bSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0U3BhcnNlRW51bShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0U3BhcnNlRW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTcGFyc2VFbnVtID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5zcGFyc2VFbnVtXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyU3BhcnNlRW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU3BhcnNlRW51bSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnNwYXJzZUVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFNwYXJzZUVudW0uU1BBUlNFX0E7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBPbmVTdHJpbmcgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxPbmVTdHJpbmcsIE9uZVN0cmluZy5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgT25lU3RyaW5nKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE9uZVN0cmluZyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgT25lU3RyaW5nKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9vbmVTdHJpbmdGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImRhdGEiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfb25lU3RyaW5nRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgT25lU3RyaW5nIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgT25lU3RyaW5nIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE9uZVN0cmluZyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09uZVN0cmluZ19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxPbmVTdHJpbmcsIE9uZVN0cmluZy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVTdHJpbmdfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERhdGFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEYXRhOw0KKyAgICBwcml2YXRlIHN0cmluZyBkYXRhXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEYXRhIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGF0YTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRGF0YSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRhdGFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9vbmVTdHJpbmdGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNEYXRhKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMSwgZmllbGRfbmFtZXNbMF0sIERhdGEpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0RhdGEpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDEsIERhdGEpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVTdHJpbmcgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lU3RyaW5nIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZVN0cmluZyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lU3RyaW5nIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVTdHJpbmcgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lU3RyaW5nIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZVN0cmluZyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVTdHJpbmcgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lU3RyaW5nIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZVN0cmluZyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBPbmVTdHJpbmcgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoT25lU3RyaW5nIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPE9uZVN0cmluZywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoT25lU3RyaW5nIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgT25lU3RyaW5nIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIE9uZVN0cmluZyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIE9uZVN0cmluZyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IE9uZVN0cmluZygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgT25lU3RyaW5nIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lU3RyaW5nLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIE9uZVN0cmluZyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVTdHJpbmcuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBPbmVTdHJpbmcgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIE9uZVN0cmluZykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChPbmVTdHJpbmcpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShPbmVTdHJpbmcgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVTdHJpbmcuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRGF0YSkgew0KKyAgICAgICAgICBEYXRhID0gb3RoZXIuRGF0YTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX29uZVN0cmluZ0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9vbmVTdHJpbmdGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEYXRhID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmRhdGFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEYXRhIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGF0YTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIERhdGEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EYXRhOyB9DQorICAgICAgICBzZXQgeyBTZXREYXRhKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREYXRhKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGF0YSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGF0YV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRhdGEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RhdGEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kYXRhXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBPbmVTdHJpbmcoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE9uZUJ5dGVzIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8T25lQnl0ZXMsIE9uZUJ5dGVzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBPbmVCeXRlcygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPbmVCeXRlcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgT25lQnl0ZXMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX29uZUJ5dGVzRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJkYXRhIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX29uZUJ5dGVzRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgT25lQnl0ZXMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBPbmVCeXRlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBPbmVCeXRlcyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09uZUJ5dGVzX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPE9uZUJ5dGVzLCBPbmVCeXRlcy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVCeXRlc19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGF0YUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RhdGE7DQorICAgIHByaXZhdGUgcGI6OkJ5dGVTdHJpbmcgZGF0YV8gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsNCisgICAgcHVibGljIGJvb2wgSGFzRGF0YSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RhdGE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgRGF0YSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRhdGFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9vbmVCeXRlc0ZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0RhdGEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKDEsIGZpZWxkX25hbWVzWzBdLCBEYXRhKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNEYXRhKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplKDEsIERhdGEpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVCeXRlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVCeXRlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVCeXRlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lQnl0ZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZUJ5dGVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZUJ5dGVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZUJ5dGVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZUJ5dGVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZUJ5dGVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZUJ5dGVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIE9uZUJ5dGVzIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKE9uZUJ5dGVzIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPE9uZUJ5dGVzLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihPbmVCeXRlcyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIE9uZUJ5dGVzIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIE9uZUJ5dGVzIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgT25lQnl0ZXMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBPbmVCeXRlcygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgT25lQnl0ZXMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVCeXRlcy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBPbmVCeXRlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVCeXRlcy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIE9uZUJ5dGVzIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBPbmVCeXRlcykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChPbmVCeXRlcykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKE9uZUJ5dGVzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lQnl0ZXMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRGF0YSkgew0KKyAgICAgICAgICBEYXRhID0gb3RoZXIuRGF0YTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX29uZUJ5dGVzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX29uZUJ5dGVzRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGF0YSA9IGlucHV0LlJlYWRCeXRlcyhyZWYgcmVzdWx0LmRhdGFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEYXRhIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGF0YTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgRGF0YSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRhdGE7IH0NCisgICAgICAgIHNldCB7IFNldERhdGEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERhdGEocGI6OkJ5dGVTdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RhdGEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRhdGFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEYXRhKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEYXRhID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGF0YV8gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgT25lQnl0ZXMoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RQYWNrZWRUeXBlcyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RQYWNrZWRUeXBlcywgVGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0UGFja2VkVHlwZXMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdFBhY2tlZFR5cGVzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0UGFja2VkVHlwZXMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RQYWNrZWRUeXBlc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAicGFja2VkX2Jvb2wiLCAicGFja2VkX2RvdWJsZSIsICJwYWNrZWRfZW51bSIsICJwYWNrZWRfZml4ZWQzMiIsICJwYWNrZWRfZml4ZWQ2NCIsICJwYWNrZWRfZmxvYXQiLCAicGFja2VkX2ludDMyIiwgInBhY2tlZF9pbnQ2NCIsICJwYWNrZWRfc2ZpeGVkMzIiLCAicGFja2VkX3NmaXhlZDY0IiwgInBhY2tlZF9zaW50MzIiLCAicGFja2VkX3NpbnQ2NCIsICJwYWNrZWRfdWludDMyIiwgInBhY2tlZF91aW50NjQiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFBhY2tlZFR5cGVzRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDgxOCwgODEwLCA4MjYsIDc3MCwgNzc4LCA4MDIsIDcyMiwgNzMwLCA3ODYsIDc5NCwgNzU0LCA3NjIsIDczOCwgNzQ2IH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFBhY2tlZFR5cGVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RQYWNrZWRUeXBlcyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRUeXBlc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0UGFja2VkVHlwZXMsIFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkVHlwZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEludDMyRmllbGROdW1iZXIgPSA5MDsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkSW50MzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gcGFja2VkSW50MzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBQYWNrZWRJbnQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkSW50MzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkSW50MzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZEludDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgR2V0UGFja2VkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZEludDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkSW50NjRGaWVsZE51bWJlciA9IDkxOw0KKyAgICBwcml2YXRlIGludCBwYWNrZWRJbnQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gcGFja2VkSW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGxvbmc+IFBhY2tlZEludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRJbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRJbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkSW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0UGFja2VkSW50NjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZEludDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkVWludDMyRmllbGROdW1iZXIgPSA5MjsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkVWludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PiBwYWNrZWRVaW50MzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1aW50PiBQYWNrZWRVaW50MzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZFVpbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRVaW50MzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZFVpbnQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgR2V0UGFja2VkVWludDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRVaW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRVaW50NjRGaWVsZE51bWJlciA9IDkzOw0KKyAgICBwcml2YXRlIGludCBwYWNrZWRVaW50NjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiBwYWNrZWRVaW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IFBhY2tlZFVpbnQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkVWludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZFVpbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkVWludDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgR2V0UGFja2VkVWludDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRVaW50NjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTaW50MzJGaWVsZE51bWJlciA9IDk0Ow0KKyAgICBwcml2YXRlIGludCBwYWNrZWRTaW50MzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gcGFja2VkU2ludDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gUGFja2VkU2ludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRTaW50MzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkU2ludDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRTaW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRQYWNrZWRTaW50MzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZFNpbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFNpbnQ2NEZpZWxkTnVtYmVyID0gOTU7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZFNpbnQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gcGFja2VkU2ludDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBQYWNrZWRTaW50NjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZFNpbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRTaW50NjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZFNpbnQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBHZXRQYWNrZWRTaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZFNpbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEZpeGVkMzJGaWVsZE51bWJlciA9IDk2Ow0KKyAgICBwcml2YXRlIGludCBwYWNrZWRGaXhlZDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PiBwYWNrZWRGaXhlZDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWludD4gUGFja2VkRml4ZWQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkRml4ZWQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRGaXhlZDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRGaXhlZDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBHZXRQYWNrZWRGaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRGaXhlZDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRml4ZWQ2NEZpZWxkTnVtYmVyID0gOTc7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZEZpeGVkNjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiBwYWNrZWRGaXhlZDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVsb25nPiBQYWNrZWRGaXhlZDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRGaXhlZDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZEZpeGVkNjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZEZpeGVkNjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBHZXRQYWNrZWRGaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRGaXhlZDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkU2ZpeGVkMzJGaWVsZE51bWJlciA9IDk4Ow0KKyAgICBwcml2YXRlIGludCBwYWNrZWRTZml4ZWQzMk1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiBwYWNrZWRTZml4ZWQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFBhY2tlZFNmaXhlZDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRTZml4ZWQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRTZml4ZWQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkU2ZpeGVkMzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRQYWNrZWRTZml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkU2ZpeGVkMzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTZml4ZWQ2NEZpZWxkTnVtYmVyID0gOTk7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZFNmaXhlZDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiBwYWNrZWRTZml4ZWQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gUGFja2VkU2ZpeGVkNjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZFNmaXhlZDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZFNmaXhlZDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRTZml4ZWQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBHZXRQYWNrZWRTZml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkU2ZpeGVkNjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRGbG9hdEZpZWxkTnVtYmVyID0gMTAwOw0KKyAgICBwcml2YXRlIGludCBwYWNrZWRGbG9hdE1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8ZmxvYXQ+IHBhY2tlZEZsb2F0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxmbG9hdD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8ZmxvYXQ+IFBhY2tlZEZsb2F0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRGbG9hdF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRGbG9hdENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkRmxvYXRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IEdldFBhY2tlZEZsb2F0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRGbG9hdF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZERvdWJsZUZpZWxkTnVtYmVyID0gMTAxOw0KKyAgICBwcml2YXRlIGludCBwYWNrZWREb3VibGVNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGRvdWJsZT4gcGFja2VkRG91YmxlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxkb3VibGU+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGRvdWJsZT4gUGFja2VkRG91YmxlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWREb3VibGVfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkRG91YmxlQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWREb3VibGVfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGRvdWJsZSBHZXRQYWNrZWREb3VibGUoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZERvdWJsZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEJvb2xGaWVsZE51bWJlciA9IDEwMjsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkQm9vbE1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Ym9vbD4gcGFja2VkQm9vbF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Ym9vbD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Ym9vbD4gUGFja2VkQm9vbExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkQm9vbF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRCb29sQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRCb29sXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEdldFBhY2tlZEJvb2woaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZEJvb2xfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRFbnVtRmllbGROdW1iZXIgPSAxMDM7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZEVudW1NZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiBwYWNrZWRFbnVtXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IFBhY2tlZEVudW1MaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZEVudW1fKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkRW51bUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkRW51bV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gR2V0UGFja2VkRW51bShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkRW51bV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFBhY2tlZFR5cGVzRmllbGROYW1lczsNCisgICAgICBpZiAocGFja2VkSW50MzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkSW50MzJBcnJheSg5MCwgZmllbGRfbmFtZXNbNl0sIHBhY2tlZEludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkSW50MzJfKTsNCisgICAgICB9DQorICAgICAgaWYgKHBhY2tlZEludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZEludDY0QXJyYXkoOTEsIGZpZWxkX25hbWVzWzddLCBwYWNrZWRJbnQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZEludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRVaW50MzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkVUludDMyQXJyYXkoOTIsIGZpZWxkX25hbWVzWzEyXSwgcGFja2VkVWludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkVWludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRVaW50NjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkVUludDY0QXJyYXkoOTMsIGZpZWxkX25hbWVzWzEzXSwgcGFja2VkVWludDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkVWludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRTaW50MzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkU0ludDMyQXJyYXkoOTQsIGZpZWxkX25hbWVzWzEwXSwgcGFja2VkU2ludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkU2ludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRTaW50NjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkU0ludDY0QXJyYXkoOTUsIGZpZWxkX25hbWVzWzExXSwgcGFja2VkU2ludDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkU2ludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRGaXhlZDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZEZpeGVkMzJBcnJheSg5NiwgZmllbGRfbmFtZXNbM10sIHBhY2tlZEZpeGVkMzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRGaXhlZDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRGaXhlZDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZEZpeGVkNjRBcnJheSg5NywgZmllbGRfbmFtZXNbNF0sIHBhY2tlZEZpeGVkNjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRGaXhlZDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRTZml4ZWQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRTRml4ZWQzMkFycmF5KDk4LCBmaWVsZF9uYW1lc1s4XSwgcGFja2VkU2ZpeGVkMzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRTZml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkU2ZpeGVkNjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkU0ZpeGVkNjRBcnJheSg5OSwgZmllbGRfbmFtZXNbOV0sIHBhY2tlZFNmaXhlZDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkU2ZpeGVkNjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHBhY2tlZEZsb2F0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZEZsb2F0QXJyYXkoMTAwLCBmaWVsZF9uYW1lc1s1XSwgcGFja2VkRmxvYXRNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRGbG9hdF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkRG91YmxlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZERvdWJsZUFycmF5KDEwMSwgZmllbGRfbmFtZXNbMV0sIHBhY2tlZERvdWJsZU1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZERvdWJsZV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkQm9vbF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRCb29sQXJyYXkoMTAyLCBmaWVsZF9uYW1lc1swXSwgcGFja2VkQm9vbE1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZEJvb2xfKTsNCisgICAgICB9DQorICAgICAgaWYgKHBhY2tlZEVudW1fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkRW51bUFycmF5KDEwMywgZmllbGRfbmFtZXNbMl0sIHBhY2tlZEVudW1NZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRFbnVtXyk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoaW50IGVsZW1lbnQgaW4gUGFja2VkSW50MzJMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZEludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkSW50MzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChsb25nIGVsZW1lbnQgaW4gUGFja2VkSW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZEludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkSW50NjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoICh1aW50IGVsZW1lbnQgaW4gUGFja2VkVWludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkVWludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkVWludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAodWxvbmcgZWxlbWVudCBpbiBQYWNrZWRVaW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRVaW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRVaW50NjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChpbnQgZWxlbWVudCBpbiBQYWNrZWRTaW50MzJMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRTaW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRTaW50MzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChsb25nIGVsZW1lbnQgaW4gUGFja2VkU2ludDY0TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQ2NFNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkU2ludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkU2ludDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogcGFja2VkRml4ZWQzMl8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZEZpeGVkMzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRGaXhlZDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogcGFja2VkRml4ZWQ2NF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZEZpeGVkNjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRGaXhlZDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogcGFja2VkU2ZpeGVkMzJfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRTZml4ZWQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZFNmaXhlZDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogcGFja2VkU2ZpeGVkNjRfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRTZml4ZWQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZFNmaXhlZDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogcGFja2VkRmxvYXRfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRGbG9hdF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZEZsb2F0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogcGFja2VkRG91YmxlXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkRG91YmxlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkRG91YmxlTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSAxICogcGFja2VkQm9vbF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZEJvb2xfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRCb29sTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKHBhY2tlZEVudW1fLkNvdW50ID4gMCkgew0KKyAgICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBlbGVtZW50IGluIHBhY2tlZEVudW1fKSB7DQorICAgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZU5vVGFnKChpbnQpIGVsZW1lbnQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICAgIHNpemUgKz0gMjsNCisgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZSgodWludCkgZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkRW51bU1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdFBhY2tlZFR5cGVzIE1ha2VSZWFkT25seSgpIHsNCisgICAgICBwYWNrZWRJbnQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkSW50NjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZFVpbnQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkVWludDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRTaW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZFNpbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkRml4ZWQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkRml4ZWQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkU2ZpeGVkMzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZFNmaXhlZDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRGbG9hdF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkRG91YmxlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRCb29sXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRFbnVtXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RQYWNrZWRUeXBlcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0UGFja2VkVHlwZXMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RQYWNrZWRUeXBlcyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RQYWNrZWRUeXBlcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0UGFja2VkVHlwZXMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0UGFja2VkVHlwZXMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0UGFja2VkVHlwZXMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RQYWNrZWRUeXBlcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRUeXBlcy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UGFja2VkVHlwZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZFR5cGVzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFBhY2tlZFR5cGVzIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0UGFja2VkVHlwZXMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdFBhY2tlZFR5cGVzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdFBhY2tlZFR5cGVzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZFR5cGVzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZEludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQzMl8uQWRkKG90aGVyLnBhY2tlZEludDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkSW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZEludDY0Xy5BZGQob3RoZXIucGFja2VkSW50NjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWRVaW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQzMl8uQWRkKG90aGVyLnBhY2tlZFVpbnQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZFVpbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkVWludDY0Xy5BZGQob3RoZXIucGFja2VkVWludDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkU2ludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRTaW50MzJfLkFkZChvdGhlci5wYWNrZWRTaW50MzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWRTaW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQ2NF8uQWRkKG90aGVyLnBhY2tlZFNpbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZEZpeGVkMzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZEZpeGVkMzJfLkFkZChvdGhlci5wYWNrZWRGaXhlZDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkRml4ZWQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkRml4ZWQ2NF8uQWRkKG90aGVyLnBhY2tlZEZpeGVkNjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWRTZml4ZWQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkU2ZpeGVkMzJfLkFkZChvdGhlci5wYWNrZWRTZml4ZWQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZFNmaXhlZDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQ2NF8uQWRkKG90aGVyLnBhY2tlZFNmaXhlZDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkRmxvYXRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZEZsb2F0Xy5BZGQob3RoZXIucGFja2VkRmxvYXRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWREb3VibGVfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZERvdWJsZV8uQWRkKG90aGVyLnBhY2tlZERvdWJsZV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZEJvb2xfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZEJvb2xfLkFkZChvdGhlci5wYWNrZWRCb29sXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkRW51bV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkRW51bV8uQWRkKG90aGVyLnBhY2tlZEVudW1fKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RQYWNrZWRUeXBlc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0UGFja2VkVHlwZXNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzIyOg0KKyAgICAgICAgICAgIGNhc2UgNzIwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWRJbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzMwOg0KKyAgICAgICAgICAgIGNhc2UgNzI4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWRJbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzM4Og0KKyAgICAgICAgICAgIGNhc2UgNzM2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkVUludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkVWludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NDY6DQorICAgICAgICAgICAgY2FzZSA3NDQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRVSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWRVaW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc1NDoNCisgICAgICAgICAgICBjYXNlIDc1Mjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZFNpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzYyOg0KKyAgICAgICAgICAgIGNhc2UgNzYwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ludDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkU2ludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NzA6DQorICAgICAgICAgICAgY2FzZSA3NzM6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkRml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzc4Og0KKyAgICAgICAgICAgIGNhc2UgNzc3OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRml4ZWQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZEZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc4NjoNCisgICAgICAgICAgICBjYXNlIDc4OTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNGaXhlZDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkU2ZpeGVkMzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc5NDoNCisgICAgICAgICAgICBjYXNlIDc5Mzogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNGaXhlZDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkU2ZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgwMjoNCisgICAgICAgICAgICBjYXNlIDgwNTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEZsb2F0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkRmxvYXRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgxMDoNCisgICAgICAgICAgICBjYXNlIDgwOTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZERvdWJsZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZERvdWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODE4Og0KKyAgICAgICAgICAgIGNhc2UgODE2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkQm9vbEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZEJvb2xfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgyNjoNCisgICAgICAgICAgICBjYXNlIDgyNDogew0KKyAgICAgICAgICAgICAgc2NnOjpJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd25JdGVtczsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXk8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZEVudW1fLCBvdXQgdW5rbm93bkl0ZW1zKTsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duSXRlbXMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCByYXdWYWx1ZSBpbiB1bmtub3duSXRlbXMpDQorICAgICAgICAgICAgICAgICAgaWYgKHJhd1ZhbHVlIGlzIGludCkNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgxMDMsICh1bG9uZykoaW50KXJhd1ZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gUGFja2VkSW50MzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZEludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZEludDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRJbnQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0UGFja2VkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZEludDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkSW50MzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkSW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZEludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZEludDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkSW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkSW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gUGFja2VkSW50NjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZEludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZEludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRJbnQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEdldFBhY2tlZEludDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRJbnQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZEludDY0KGludCBpbmRleCwgbG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkSW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZEludDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEludDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZEludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVpbnQ+IFBhY2tlZFVpbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkVWludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZFVpbnQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkVWludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgR2V0UGFja2VkVWludDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRVaW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRVaW50MzIoaW50IGluZGV4LCB1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkVWludDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkVWludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkVWludDMyKHNjZzo6SUVudW1lcmFibGU8dWludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRVaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVsb25nPiBQYWNrZWRVaW50NjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZFVpbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRVaW50NjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZFVpbnQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBHZXRQYWNrZWRVaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZFVpbnQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZFVpbnQ2NChpbnQgaW5kZXgsIHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkVWludDY0KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZFVpbnQ2NChzY2c6OklFbnVtZXJhYmxlPHVsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkVWludDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZFVpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkVWludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBQYWNrZWRTaW50MzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZFNpbnQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRTaW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZFNpbnQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0UGFja2VkU2ludDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRTaW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRTaW50MzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ludDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRTaW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZFNpbnQzMihzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRTaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGxvbmc+IFBhY2tlZFNpbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkU2ludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZFNpbnQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkU2ludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0UGFja2VkU2ludDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRTaW50NjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRTaW50NjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkU2ludDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkU2ludDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRTaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVpbnQ+IFBhY2tlZEZpeGVkMzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZEZpeGVkMzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkRml4ZWQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkRml4ZWQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1aW50IEdldFBhY2tlZEZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZEZpeGVkMzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRGaXhlZDMyKGludCBpbmRleCwgdWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGaXhlZDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRGaXhlZDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRml4ZWQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZEZpeGVkMzIoc2NnOjpJRW51bWVyYWJsZTx1aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRml4ZWQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRGaXhlZDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGaXhlZDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IFBhY2tlZEZpeGVkNjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZEZpeGVkNjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkRml4ZWQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkRml4ZWQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBHZXRQYWNrZWRGaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRGaXhlZDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkRml4ZWQ2NChpbnQgaW5kZXgsIHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZpeGVkNjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZEZpeGVkNjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRml4ZWQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZEZpeGVkNjQoc2NnOjpJRW51bWVyYWJsZTx1bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZpeGVkNjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkRml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRml4ZWQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gUGFja2VkU2ZpeGVkMzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZFNmaXhlZDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZFNmaXhlZDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRTZml4ZWQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0UGFja2VkU2ZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZFNmaXhlZDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkU2ZpeGVkMzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ZpeGVkMzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZFNmaXhlZDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZFNmaXhlZDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ZpeGVkMzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkU2ZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNmaXhlZDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gUGFja2VkU2ZpeGVkNjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZFNmaXhlZDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZFNmaXhlZDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRTZml4ZWQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEdldFBhY2tlZFNmaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRTZml4ZWQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZFNmaXhlZDY0KGludCBpbmRleCwgbG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkU2ZpeGVkNjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZFNmaXhlZDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNmaXhlZDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZFNmaXhlZDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGZsb2F0PiBQYWNrZWRGbG9hdExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkRmxvYXRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkRmxvYXRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZEZsb2F0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEdldFBhY2tlZEZsb2F0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRGbG9hdChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZEZsb2F0KGludCBpbmRleCwgZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRmxvYXRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZEZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZsb2F0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkRmxvYXQoc2NnOjpJRW51bWVyYWJsZTxmbG9hdD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZsb2F0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZEZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGbG9hdF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGRvdWJsZT4gUGFja2VkRG91YmxlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWREb3VibGVfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkRG91YmxlQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWREb3VibGVDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZG91YmxlIEdldFBhY2tlZERvdWJsZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkRG91YmxlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkRG91YmxlKGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZERvdWJsZV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkRG91YmxlKGRvdWJsZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWREb3VibGVfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWREb3VibGUoc2NnOjpJRW51bWVyYWJsZTxkb3VibGU+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWREb3VibGVfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkRG91YmxlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWREb3VibGVfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxib29sPiBQYWNrZWRCb29sTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRCb29sXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZEJvb2xDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZEJvb2xDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBHZXRQYWNrZWRCb29sKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRCb29sKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkQm9vbChpbnQgaW5kZXgsIGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkQm9vbF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkQm9vbChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEJvb2xfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRCb29sKHNjZzo6SUVudW1lcmFibGU8Ym9vbD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEJvb2xfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkQm9vbCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkQm9vbF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiBQYWNrZWRFbnVtTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRFbnVtXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZEVudW1Db3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZEVudW1Db3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gR2V0UGFja2VkRW51bShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkRW51bShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZEVudW0oaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRFbnVtX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRFbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEVudW1fLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRFbnVtKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRFbnVtXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZEVudW0oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEVudW1fLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RQYWNrZWRUeXBlcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFVucGFja2VkVHlwZXMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0VW5wYWNrZWRUeXBlcywgVGVzdFVucGFja2VkVHlwZXMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RVbnBhY2tlZFR5cGVzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RVbnBhY2tlZFR5cGVzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0VW5wYWNrZWRUeXBlcygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFVucGFja2VkVHlwZXNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInVucGFja2VkX2Jvb2wiLCAidW5wYWNrZWRfZG91YmxlIiwgInVucGFja2VkX2VudW0iLCAidW5wYWNrZWRfZml4ZWQzMiIsICJ1bnBhY2tlZF9maXhlZDY0IiwgInVucGFja2VkX2Zsb2F0IiwgInVucGFja2VkX2ludDMyIiwgInVucGFja2VkX2ludDY0IiwgInVucGFja2VkX3NmaXhlZDMyIiwgInVucGFja2VkX3NmaXhlZDY0IiwgInVucGFja2VkX3NpbnQzMiIsICJ1bnBhY2tlZF9zaW50NjQiLCAidW5wYWNrZWRfdWludDMyIiwgInVucGFja2VkX3VpbnQ2NCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0VW5wYWNrZWRUeXBlc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4MTYsIDgwOSwgODI0LCA3NzMsIDc3NywgODA1LCA3MjAsIDcyOCwgNzg5LCA3OTMsIDc1MiwgNzYwLCA3MzYsIDc0NCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFVucGFja2VkVHlwZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFVucGFja2VkVHlwZXMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0VW5wYWNrZWRUeXBlc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0VW5wYWNrZWRUeXBlcywgVGVzdFVucGFja2VkVHlwZXMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFVucGFja2VkVHlwZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkSW50MzJGaWVsZE51bWJlciA9IDkwOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gdW5wYWNrZWRJbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFVucGFja2VkSW50MzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHVucGFja2VkSW50MzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRJbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRJbnQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFVucGFja2VkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVucGFja2VkSW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEludDY0RmllbGROdW1iZXIgPSA5MTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiB1bnBhY2tlZEludDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBVbnBhY2tlZEludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZEludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkSW50NjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkSW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0VW5wYWNrZWRJbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRJbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkVWludDMyRmllbGROdW1iZXIgPSA5MjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PiB1bnBhY2tlZFVpbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVpbnQ+IFVucGFja2VkVWludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFVpbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFVpbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRVaW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IEdldFVucGFja2VkVWludDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZFVpbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkVWludDY0RmllbGROdW1iZXIgPSA5MzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4gdW5wYWNrZWRVaW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IFVucGFja2VkVWludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFVpbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFVpbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRVaW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBHZXRVbnBhY2tlZFVpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRVaW50NjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFNpbnQzMkZpZWxkTnVtYmVyID0gOTQ7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiB1bnBhY2tlZFNpbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFVucGFja2VkU2ludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFNpbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFNpbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRTaW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRVbnBhY2tlZFNpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRTaW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFNpbnQ2NEZpZWxkTnVtYmVyID0gOTU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gdW5wYWNrZWRTaW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGxvbmc+IFVucGFja2VkU2ludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFNpbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFNpbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRTaW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0VW5wYWNrZWRTaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVucGFja2VkU2ludDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRGaXhlZDMyRmllbGROdW1iZXIgPSA5NjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PiB1bnBhY2tlZEZpeGVkMzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1aW50PiBVbnBhY2tlZEZpeGVkMzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHVucGFja2VkRml4ZWQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZEZpeGVkMzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkRml4ZWQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgR2V0VW5wYWNrZWRGaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZEZpeGVkMzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEZpeGVkNjRGaWVsZE51bWJlciA9IDk3Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiB1bnBhY2tlZEZpeGVkNjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IFVucGFja2VkRml4ZWQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRGaXhlZDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkRml4ZWQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRGaXhlZDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgR2V0VW5wYWNrZWRGaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZEZpeGVkNjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFNmaXhlZDMyRmllbGROdW1iZXIgPSA5ODsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IHVucGFja2VkU2ZpeGVkMzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBVbnBhY2tlZFNmaXhlZDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFNmaXhlZDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkU2ZpeGVkMzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkU2ZpeGVkMzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRVbnBhY2tlZFNmaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZFNmaXhlZDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRTZml4ZWQ2NEZpZWxkTnVtYmVyID0gOTk7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gdW5wYWNrZWRTZml4ZWQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gVW5wYWNrZWRTZml4ZWQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRTZml4ZWQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFNmaXhlZDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZFNmaXhlZDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEdldFVucGFja2VkU2ZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVucGFja2VkU2ZpeGVkNjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEZsb2F0RmllbGROdW1iZXIgPSAxMDA7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8ZmxvYXQ+IHVucGFja2VkRmxvYXRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGZsb2F0PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxmbG9hdD4gVW5wYWNrZWRGbG9hdExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRGbG9hdF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZEZsb2F0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZEZsb2F0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBHZXRVbnBhY2tlZEZsb2F0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZEZsb2F0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWREb3VibGVGaWVsZE51bWJlciA9IDEwMTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxkb3VibGU+IHVucGFja2VkRG91YmxlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxkb3VibGU+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGRvdWJsZT4gVW5wYWNrZWREb3VibGVMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHVucGFja2VkRG91YmxlXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkRG91YmxlQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZERvdWJsZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZG91YmxlIEdldFVucGFja2VkRG91YmxlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZERvdWJsZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkQm9vbEZpZWxkTnVtYmVyID0gMTAyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGJvb2w+IHVucGFja2VkQm9vbF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Ym9vbD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Ym9vbD4gVW5wYWNrZWRCb29sTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZEJvb2xfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRCb29sQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZEJvb2xfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgR2V0VW5wYWNrZWRCb29sKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZEJvb2xfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEVudW1GaWVsZE51bWJlciA9IDEwMzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gdW5wYWNrZWRFbnVtXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IFVucGFja2VkRW51bUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRFbnVtXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkRW51bUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRFbnVtXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBHZXRVbnBhY2tlZEVudW0oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVucGFja2VkRW51bV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFVucGFja2VkVHlwZXNGaWVsZE5hbWVzOw0KKyAgICAgIGlmICh1bnBhY2tlZEludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyQXJyYXkoOTAsIGZpZWxkX25hbWVzWzZdLCB1bnBhY2tlZEludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1bnBhY2tlZEludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0QXJyYXkoOTEsIGZpZWxkX25hbWVzWzddLCB1bnBhY2tlZEludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1bnBhY2tlZFVpbnQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50MzJBcnJheSg5MiwgZmllbGRfbmFtZXNbMTJdLCB1bnBhY2tlZFVpbnQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRVaW50NjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlVUludDY0QXJyYXkoOTMsIGZpZWxkX25hbWVzWzEzXSwgdW5wYWNrZWRVaW50NjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHVucGFja2VkU2ludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNJbnQzMkFycmF5KDk0LCBmaWVsZF9uYW1lc1sxMF0sIHVucGFja2VkU2ludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1bnBhY2tlZFNpbnQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTSW50NjRBcnJheSg5NSwgZmllbGRfbmFtZXNbMTFdLCB1bnBhY2tlZFNpbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRGaXhlZDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkMzJBcnJheSg5NiwgZmllbGRfbmFtZXNbM10sIHVucGFja2VkRml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRGaXhlZDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkNjRBcnJheSg5NywgZmllbGRfbmFtZXNbNF0sIHVucGFja2VkRml4ZWQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRTZml4ZWQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQzMkFycmF5KDk4LCBmaWVsZF9uYW1lc1s4XSwgdW5wYWNrZWRTZml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQ2NEFycmF5KDk5LCBmaWVsZF9uYW1lc1s5XSwgdW5wYWNrZWRTZml4ZWQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRGbG9hdF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdEFycmF5KDEwMCwgZmllbGRfbmFtZXNbNV0sIHVucGFja2VkRmxvYXRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHVucGFja2VkRG91YmxlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZURvdWJsZUFycmF5KDEwMSwgZmllbGRfbmFtZXNbMV0sIHVucGFja2VkRG91YmxlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1bnBhY2tlZEJvb2xfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbEFycmF5KDEwMiwgZmllbGRfbmFtZXNbMF0sIHVucGFja2VkQm9vbF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW1BcnJheSgxMDMsIGZpZWxkX25hbWVzWzJdLCB1bnBhY2tlZEVudW1fKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChpbnQgZWxlbWVudCBpbiBVbnBhY2tlZEludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkSW50MzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAobG9uZyBlbGVtZW50IGluIFVucGFja2VkSW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRJbnQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoICh1aW50IGVsZW1lbnQgaW4gVW5wYWNrZWRVaW50MzJMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkVWludDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHVsb25nIGVsZW1lbnQgaW4gVW5wYWNrZWRVaW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkVWludDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIFVucGFja2VkU2ludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZFNpbnQzMl8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChsb25nIGVsZW1lbnQgaW4gVW5wYWNrZWRTaW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkU2ludDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHVucGFja2VkRml4ZWQzMl8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRGaXhlZDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHVucGFja2VkRml4ZWQ2NF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRGaXhlZDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHVucGFja2VkU2ZpeGVkMzJfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkU2ZpeGVkMzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogdW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDQgKiB1bnBhY2tlZEZsb2F0Xy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZEZsb2F0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHVucGFja2VkRG91YmxlXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZERvdWJsZV8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDEgKiB1bnBhY2tlZEJvb2xfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkQm9vbF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBpZiAodW5wYWNrZWRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gZWxlbWVudCBpbiB1bnBhY2tlZEVudW1fKSB7DQorICAgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZU5vVGFnKChpbnQpIGVsZW1lbnQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkRW51bV8uQ291bnQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRUeXBlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdFVucGFja2VkVHlwZXMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHVucGFja2VkSW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkSW50NjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkVWludDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB1bnBhY2tlZFVpbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRTaW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkU2ludDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB1bnBhY2tlZEZpeGVkMzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkRml4ZWQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRTZml4ZWQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRTZml4ZWQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRGbG9hdF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWREb3VibGVfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkQm9vbF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRFbnVtXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RVbnBhY2tlZFR5cGVzIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RVbnBhY2tlZFR5cGVzLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0VW5wYWNrZWRUeXBlcyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RVbnBhY2tlZFR5cGVzIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RVbnBhY2tlZFR5cGVzIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFVucGFja2VkVHlwZXMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0VW5wYWNrZWRUeXBlcygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFVucGFja2VkVHlwZXMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRUeXBlcy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0VW5wYWNrZWRUeXBlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRUeXBlcy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RVbnBhY2tlZFR5cGVzIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0VW5wYWNrZWRUeXBlcykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0VW5wYWNrZWRUeXBlcykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RVbnBhY2tlZFR5cGVzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkVHlwZXMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRJbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRJbnQzMl8uQWRkKG90aGVyLnVucGFja2VkSW50MzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZEludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZEludDY0Xy5BZGQob3RoZXIudW5wYWNrZWRJbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkVWludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZFVpbnQzMl8uQWRkKG90aGVyLnVucGFja2VkVWludDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRVaW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVucGFja2VkVWludDY0Xy5BZGQob3RoZXIudW5wYWNrZWRVaW50NjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZFNpbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50MzJfLkFkZChvdGhlci51bnBhY2tlZFNpbnQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkU2ludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZFNpbnQ2NF8uQWRkKG90aGVyLnVucGFja2VkU2ludDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRGaXhlZDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkMzJfLkFkZChvdGhlci51bnBhY2tlZEZpeGVkMzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZEZpeGVkNjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVucGFja2VkRml4ZWQ2NF8uQWRkKG90aGVyLnVucGFja2VkRml4ZWQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkU2ZpeGVkMzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVucGFja2VkU2ZpeGVkMzJfLkFkZChvdGhlci51bnBhY2tlZFNmaXhlZDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQ2NF8uQWRkKG90aGVyLnVucGFja2VkU2ZpeGVkNjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZEZsb2F0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZEZsb2F0Xy5BZGQob3RoZXIudW5wYWNrZWRGbG9hdF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkRG91YmxlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZERvdWJsZV8uQWRkKG90aGVyLnVucGFja2VkRG91YmxlXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRCb29sXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZEJvb2xfLkFkZChvdGhlci51bnBhY2tlZEJvb2xfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZEVudW1fLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVucGFja2VkRW51bV8uQWRkKG90aGVyLnVucGFja2VkRW51bV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdFVucGFja2VkVHlwZXNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFVucGFja2VkVHlwZXNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzIyOg0KKyAgICAgICAgICAgIGNhc2UgNzIwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZEludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3MzA6DQorICAgICAgICAgICAgY2FzZSA3Mjg6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRJbnQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkSW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDczODoNCisgICAgICAgICAgICBjYXNlIDczNjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFVJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkVWludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NDY6DQorICAgICAgICAgICAgY2FzZSA3NDQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRVSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZFVpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzU0Og0KKyAgICAgICAgICAgIGNhc2UgNzUyOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRTaW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc2MjoNCisgICAgICAgICAgICBjYXNlIDc2MDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNJbnQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkU2ludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NzA6DQorICAgICAgICAgICAgY2FzZSA3NzM6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRGaXhlZDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3Nzg6DQorICAgICAgICAgICAgY2FzZSA3Nzc6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRGaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3ODY6DQorICAgICAgICAgICAgY2FzZSA3ODk6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTRml4ZWQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkU2ZpeGVkMzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc5NDoNCisgICAgICAgICAgICBjYXNlIDc5Mzogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNGaXhlZDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRTZml4ZWQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODAyOg0KKyAgICAgICAgICAgIGNhc2UgODA1OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRmxvYXRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZEZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4MTA6DQorICAgICAgICAgICAgY2FzZSA4MDk6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWREb3VibGVBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZERvdWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODE4Og0KKyAgICAgICAgICAgIGNhc2UgODE2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkQm9vbEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkQm9vbF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODI2Og0KKyAgICAgICAgICAgIGNhc2UgODI0OiB7DQorICAgICAgICAgICAgICBzY2c6OklDb2xsZWN0aW9uPG9iamVjdD4gdW5rbm93bkl0ZW1zOw0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEVudW1BcnJheTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4odGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRFbnVtXywgb3V0IHVua25vd25JdGVtcyk7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkl0ZW1zICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgcmF3VmFsdWUgaW4gdW5rbm93bkl0ZW1zKQ0KKyAgICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZSBpcyBpbnQpDQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoMTAzLCAodWxvbmcpKGludClyYXdWYWx1ZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IFVucGFja2VkSW50MzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkSW50MzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRJbnQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRJbnQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0VW5wYWNrZWRJbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRJbnQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkSW50MzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRJbnQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRJbnQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRJbnQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkSW50MzIoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEludDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkSW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkSW50MzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBVbnBhY2tlZEludDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZEludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkSW50NjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkSW50NjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBHZXRVbnBhY2tlZEludDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZEludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRJbnQ2NChpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRJbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRJbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkSW50NjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZEludDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkSW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRJbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRJbnQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVpbnQ+IFVucGFja2VkVWludDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZFVpbnQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZFVpbnQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRVaW50MzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBHZXRVbnBhY2tlZFVpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRVaW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZFVpbnQzMihpbnQgaW5kZXgsIHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkVWludDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZFVpbnQzMihzY2c6OklFbnVtZXJhYmxlPHVpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFVpbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZFVpbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50MzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1bG9uZz4gVW5wYWNrZWRVaW50NjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkVWludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkVWludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbnBhY2tlZFVpbnQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBHZXRVbnBhY2tlZFVpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRVaW50NjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZFVpbnQ2NChpbnQgaW5kZXgsIHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkVWludDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZFVpbnQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFVpbnQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkVWludDY0KHNjZzo6SUVudW1lcmFibGU8dWxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFVpbnQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZFVpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50NjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IFVucGFja2VkU2ludDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZFNpbnQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZFNpbnQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRTaW50MzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFVucGFja2VkU2ludDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZFNpbnQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkU2ludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ludDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZFNpbnQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZFNpbnQzMihzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ludDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkU2ludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNpbnQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGxvbmc+IFVucGFja2VkU2ludDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZFNpbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZFNpbnQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRTaW50NjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBHZXRVbnBhY2tlZFNpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRTaW50NjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZFNpbnQ2NChpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50NjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkU2ludDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50NjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZFNpbnQ2NChzY2c6OklFbnVtZXJhYmxlPGxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNpbnQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZFNpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50NjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1aW50PiBVbnBhY2tlZEZpeGVkMzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkRml4ZWQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZEZpeGVkMzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkRml4ZWQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1aW50IEdldFVucGFja2VkRml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRGaXhlZDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRGaXhlZDMyKGludCBpbmRleCwgdWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkMzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkRml4ZWQzMih1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRml4ZWQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkRml4ZWQzMihzY2c6OklFbnVtZXJhYmxlPHVpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkMzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRGaXhlZDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkMzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1bG9uZz4gVW5wYWNrZWRGaXhlZDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZEZpeGVkNjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRGaXhlZDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbnBhY2tlZEZpeGVkNjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgR2V0VW5wYWNrZWRGaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZEZpeGVkNjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZEZpeGVkNjQoaW50IGluZGV4LCB1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkNjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkRml4ZWQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkNjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZEZpeGVkNjQoc2NnOjpJRW51bWVyYWJsZTx1bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRml4ZWQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZEZpeGVkNjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRml4ZWQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gVW5wYWNrZWRTZml4ZWQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRTZml4ZWQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZFNmaXhlZDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbnBhY2tlZFNmaXhlZDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXRVbnBhY2tlZFNmaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZFNmaXhlZDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRTZml4ZWQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNmaXhlZDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZFNmaXhlZDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNmaXhlZDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRTZml4ZWQzMihzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ZpeGVkMzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRTZml4ZWQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGxvbmc+IFVucGFja2VkU2ZpeGVkNjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkU2ZpeGVkNjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRTZml4ZWQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRTZml4ZWQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEdldFVucGFja2VkU2ZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkU2ZpeGVkNjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZFNmaXhlZDY0KGludCBpbmRleCwgbG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNmaXhlZDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZFNmaXhlZDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkU2ZpeGVkNjQoc2NnOjpJRW51bWVyYWJsZTxsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZFNmaXhlZDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNmaXhlZDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8ZmxvYXQ+IFVucGFja2VkRmxvYXRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkRmxvYXRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRGbG9hdENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRGbG9hdENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBHZXRVbnBhY2tlZEZsb2F0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZEZsb2F0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRGbG9hdChpbnQgaW5kZXgsIGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRmxvYXRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkRmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRGbG9hdF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkRmxvYXQoc2NnOjpJRW51bWVyYWJsZTxmbG9hdD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRmxvYXRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRGbG9hdCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRGbG9hdF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGRvdWJsZT4gVW5wYWNrZWREb3VibGVMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkRG91YmxlXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkRG91YmxlQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbnBhY2tlZERvdWJsZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBkb3VibGUgR2V0VW5wYWNrZWREb3VibGUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkRG91YmxlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWREb3VibGUoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWREb3VibGVfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkRG91YmxlKGRvdWJsZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZERvdWJsZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkRG91YmxlKHNjZzo6SUVudW1lcmFibGU8ZG91YmxlPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWREb3VibGVfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWREb3VibGUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRG91YmxlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Ym9vbD4gVW5wYWNrZWRCb29sTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZEJvb2xfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRCb29sQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbnBhY2tlZEJvb2xDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBHZXRVbnBhY2tlZEJvb2woaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkQm9vbChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkQm9vbChpbnQgaW5kZXgsIGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRCb29sX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZEJvb2woYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEJvb2xfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZEJvb2woc2NnOjpJRW51bWVyYWJsZTxib29sPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRCb29sXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkQm9vbCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRCb29sXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IFVucGFja2VkRW51bUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRFbnVtXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkRW51bUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRFbnVtQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEdldFVucGFja2VkRW51bShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRFbnVtKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRFbnVtKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRFbnVtX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRFbnVtXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRFbnVtKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEVudW1fLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRFbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEVudW1fLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0UGFja2VkRXh0ZW5zaW9ucyA6IHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxUZXN0UGFja2VkRXh0ZW5zaW9ucywgVGVzdFBhY2tlZEV4dGVuc2lvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RQYWNrZWRFeHRlbnNpb25zKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RQYWNrZWRFeHRlbnNpb25zIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0UGFja2VkRXh0ZW5zaW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFBhY2tlZEV4dGVuc2lvbnNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFBhY2tlZEV4dGVuc2lvbnNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UGFja2VkRXh0ZW5zaW9ucyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UGFja2VkRXh0ZW5zaW9ucyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRFeHRlbnNpb25zX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RQYWNrZWRFeHRlbnNpb25zLCBUZXN0UGFja2VkRXh0ZW5zaW9ucy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIUV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFBhY2tlZEV4dGVuc2lvbnNGaWVsZE5hbWVzOw0KKyAgICAgIHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxUZXN0UGFja2VkRXh0ZW5zaW9ucywgVGVzdFBhY2tlZEV4dGVuc2lvbnMuQnVpbGRlcj4uRXh0ZW5zaW9uV3JpdGVyIGV4dGVuc2lvbldyaXRlciA9IENyZWF0ZUV4dGVuc2lvbldyaXRlcih0aGlzKTsNCisgICAgICBleHRlbnNpb25Xcml0ZXIuV3JpdGVVbnRpbCg1MzY4NzA5MTIsIG91dHB1dCk7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHNpemUgKz0gRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkRXh0ZW5zaW9ucyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdFBhY2tlZEV4dGVuc2lvbnMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdFBhY2tlZEV4dGVuc2lvbnMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkV4dGVuZGFibGVCdWlsZGVyPFRlc3RQYWNrZWRFeHRlbnNpb25zLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0UGFja2VkRXh0ZW5zaW9ucyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RQYWNrZWRFeHRlbnNpb25zIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RQYWNrZWRFeHRlbnNpb25zIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0UGFja2VkRXh0ZW5zaW9ucygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFBhY2tlZEV4dGVuc2lvbnMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9ucy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UGFja2VkRXh0ZW5zaW9ucyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9ucy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RQYWNrZWRFeHRlbnNpb25zIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0UGFja2VkRXh0ZW5zaW9ucykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0UGFja2VkRXh0ZW5zaW9ucykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RQYWNrZWRFeHRlbnNpb25zIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgIHRoaXMuTWVyZ2VFeHRlbnNpb25GaWVsZHMob3RoZXIpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdFBhY2tlZEV4dGVuc2lvbnNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFBhY2tlZEV4dGVuc2lvbnNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0UGFja2VkRXh0ZW5zaW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdER5bmFtaWNFeHRlbnNpb25zIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdER5bmFtaWNFeHRlbnNpb25zLCBUZXN0RHluYW1pY0V4dGVuc2lvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3REeW5hbWljRXh0ZW5zaW9ucygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0RHluYW1pY0V4dGVuc2lvbnMgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3REeW5hbWljRXh0ZW5zaW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdER5bmFtaWNFeHRlbnNpb25zRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJkeW5hbWljX2VudW1fZXh0ZW5zaW9uIiwgImR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24iLCAiZW51bV9leHRlbnNpb24iLCAibWVzc2FnZV9leHRlbnNpb24iLCAicGFja2VkX2V4dGVuc2lvbiIsICJyZXBlYXRlZF9leHRlbnNpb24iLCAic2NhbGFyX2V4dGVuc2lvbiIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0RHluYW1pY0V4dGVuc2lvbnNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTYwMTYsIDE2MDM0LCAxNjAwOCwgMTYwMjYsIDE2MDUwLCAxNjA0MiwgMTYwMDUgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHluYW1pY0V4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RHluYW1pY0V4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdER5bmFtaWNFeHRlbnNpb25zIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3REeW5hbWljRXh0ZW5zaW9ucywgVGVzdER5bmFtaWNFeHRlbnNpb25zLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REeW5hbWljRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgICNyZWdpb24gTmVzdGVkIHR5cGVzDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7DQorICAgICAgcHVibGljIGVudW0gRHluYW1pY0VudW1UeXBlIHsNCisgICAgICAgIERZTkFNSUNfRk9PID0gMjIwMCwNCisgICAgICAgIERZTkFNSUNfQkFSID0gMjIwMSwNCisgICAgICAgIERZTkFNSUNfQkFaID0gMjIwMiwNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRHluYW1pY01lc3NhZ2VUeXBlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8RHluYW1pY01lc3NhZ2VUeXBlLCBEeW5hbWljTWVzc2FnZVR5cGUuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBEeW5hbWljTWVzc2FnZVR5cGUoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IER5bmFtaWNNZXNzYWdlVHlwZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgRHluYW1pY01lc3NhZ2VUeXBlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZHluYW1pY01lc3NhZ2VUeXBlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJkeW5hbWljX2ZpZWxkIiB9Ow0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9keW5hbWljTWVzc2FnZVR5cGVGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTY4MDAgfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2VUeXBlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIER5bmFtaWNNZXNzYWdlVHlwZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRHluYW1pY01lc3NhZ2VUeXBlIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHluYW1pY0V4dGVuc2lvbnNfRHluYW1pY01lc3NhZ2VUeXBlX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPER5bmFtaWNNZXNzYWdlVHlwZSwgRHluYW1pY01lc3NhZ2VUeXBlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHluYW1pY0V4dGVuc2lvbnNfRHluYW1pY01lc3NhZ2VUeXBlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBEeW5hbWljRmllbGRGaWVsZE51bWJlciA9IDIxMDA7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzRHluYW1pY0ZpZWxkOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgZHluYW1pY0ZpZWxkXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0R5bmFtaWNGaWVsZCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNEeW5hbWljRmllbGQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgRHluYW1pY0ZpZWxkIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGR5bmFtaWNGaWVsZF87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfZHluYW1pY01lc3NhZ2VUeXBlRmllbGROYW1lczsNCisgICAgICAgICAgaWYgKGhhc0R5bmFtaWNGaWVsZCkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIxMDAsIGZpZWxkX25hbWVzWzBdLCBEeW5hbWljRmllbGQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIGlmIChoYXNEeW5hbWljRmllbGQpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIxMDAsIER5bmFtaWNGaWVsZCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlVHlwZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZVR5cGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2VUeXBlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZVR5cGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlVHlwZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZVR5cGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2VUeXBlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlVHlwZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZVR5cGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2VUeXBlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIER5bmFtaWNNZXNzYWdlVHlwZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoRHluYW1pY01lc3NhZ2VUeXBlIHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8RHluYW1pY01lc3NhZ2VUeXBlLCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKER5bmFtaWNNZXNzYWdlVHlwZSBjbG9uZUZyb20pIHsNCisgICAgICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgICAgICBwcml2YXRlIER5bmFtaWNNZXNzYWdlVHlwZSByZXN1bHQ7DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIER5bmFtaWNNZXNzYWdlVHlwZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgRHluYW1pY01lc3NhZ2VUeXBlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IER5bmFtaWNNZXNzYWdlVHlwZSgpOw0KKyAgICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBEeW5hbWljTWVzc2FnZVR5cGUgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZS5EZXNjcmlwdG9yOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBEeW5hbWljTWVzc2FnZVR5cGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljTWVzc2FnZVR5cGUuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBEeW5hbWljTWVzc2FnZVR5cGUgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGlzIER5bmFtaWNNZXNzYWdlVHlwZSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRHluYW1pY01lc3NhZ2VUeXBlKSBvdGhlcik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKER5bmFtaWNNZXNzYWdlVHlwZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzRHluYW1pY0ZpZWxkKSB7DQorICAgICAgICAgICAgICBEeW5hbWljRmllbGQgPSBvdGhlci5EeW5hbWljRmllbGQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2R5bmFtaWNNZXNzYWdlVHlwZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX2R5bmFtaWNNZXNzYWdlVHlwZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDE2ODAwOiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R5bmFtaWNGaWVsZCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR5bmFtaWNGaWVsZF8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNEeW5hbWljRmllbGQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHluYW1pY0ZpZWxkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBEeW5hbWljRmllbGQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHluYW1pY0ZpZWxkOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RHluYW1pY0ZpZWxkKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldER5bmFtaWNGaWVsZChpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNEeW5hbWljRmllbGQgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5keW5hbWljRmllbGRfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEeW5hbWljRmllbGQoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRHluYW1pY0ZpZWxkID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmR5bmFtaWNGaWVsZF8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgRHluYW1pY01lc3NhZ2VUeXBlKCkgew0KKyAgICAgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFNjYWxhckV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMjAwMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc1NjYWxhckV4dGVuc2lvbjsNCisgICAgcHJpdmF0ZSB1aW50IHNjYWxhckV4dGVuc2lvbl87DQorICAgIHB1YmxpYyBib29sIEhhc1NjYWxhckV4dGVuc2lvbiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1NjYWxhckV4dGVuc2lvbjsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBTY2FsYXJFeHRlbnNpb24gew0KKyAgICAgIGdldCB7IHJldHVybiBzY2FsYXJFeHRlbnNpb25fOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMjAwMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0VudW1FeHRlbnNpb247DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gZW51bUV4dGVuc2lvbl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPTzsNCisgICAgcHVibGljIGJvb2wgSGFzRW51bUV4dGVuc2lvbiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0VudW1FeHRlbnNpb247IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gRW51bUV4dGVuc2lvbiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGVudW1FeHRlbnNpb25fOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHluYW1pY0VudW1FeHRlbnNpb25GaWVsZE51bWJlciA9IDIwMDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEeW5hbWljRW51bUV4dGVuc2lvbjsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY0VudW1UeXBlIGR5bmFtaWNFbnVtRXh0ZW5zaW9uXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljRW51bVR5cGUuRFlOQU1JQ19GT087DQorICAgIHB1YmxpYyBib29sIEhhc0R5bmFtaWNFbnVtRXh0ZW5zaW9uIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHluYW1pY0VudW1FeHRlbnNpb247IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNFbnVtVHlwZSBEeW5hbWljRW51bUV4dGVuc2lvbiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR5bmFtaWNFbnVtRXh0ZW5zaW9uXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE1lc3NhZ2VFeHRlbnNpb25GaWVsZE51bWJlciA9IDIwMDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNNZXNzYWdlRXh0ZW5zaW9uOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIG1lc3NhZ2VFeHRlbnNpb25fOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNNZXNzYWdlRXh0ZW5zaW9uIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTWVzc2FnZUV4dGVuc2lvbjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBNZXNzYWdlRXh0ZW5zaW9uIHsNCisgICAgICBnZXQgeyByZXR1cm4gbWVzc2FnZUV4dGVuc2lvbl8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHluYW1pY01lc3NhZ2VFeHRlbnNpb25GaWVsZE51bWJlciA9IDIwMDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbjsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlIGR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uXzsNCisgICAgcHVibGljIGJvb2wgSGFzRHluYW1pY01lc3NhZ2VFeHRlbnNpb24gew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlIER5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHluYW1pY01lc3NhZ2VFeHRlbnNpb25fID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljTWVzc2FnZVR5cGUuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRFeHRlbnNpb25GaWVsZE51bWJlciA9IDIwMDU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiByZXBlYXRlZEV4dGVuc2lvbl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxzdHJpbmc+IFJlcGVhdGVkRXh0ZW5zaW9uTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEV4dGVuc2lvbl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEV4dGVuc2lvbkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRFeHRlbnNpb25fLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZEV4dGVuc2lvbihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRFeHRlbnNpb25fW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRFeHRlbnNpb25GaWVsZE51bWJlciA9IDIwMDY7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZEV4dGVuc2lvbk1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiBwYWNrZWRFeHRlbnNpb25fID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBQYWNrZWRFeHRlbnNpb25MaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZEV4dGVuc2lvbl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRFeHRlbnNpb25Db3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZEV4dGVuc2lvbl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFBhY2tlZEV4dGVuc2lvbihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkRXh0ZW5zaW9uX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0RHluYW1pY0V4dGVuc2lvbnNGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNTY2FsYXJFeHRlbnNpb24pIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkMzIoMjAwMCwgZmllbGRfbmFtZXNbNl0sIFNjYWxhckV4dGVuc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNFbnVtRXh0ZW5zaW9uKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDIwMDEsIGZpZWxkX25hbWVzWzJdLCAoaW50KSBFbnVtRXh0ZW5zaW9uLCBFbnVtRXh0ZW5zaW9uKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R5bmFtaWNFbnVtRXh0ZW5zaW9uKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDIwMDIsIGZpZWxkX25hbWVzWzBdLCAoaW50KSBEeW5hbWljRW51bUV4dGVuc2lvbiwgRHluYW1pY0VudW1FeHRlbnNpb24pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTWVzc2FnZUV4dGVuc2lvbikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZSgyMDAzLCBmaWVsZF9uYW1lc1szXSwgTWVzc2FnZUV4dGVuc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZSgyMDA0LCBmaWVsZF9uYW1lc1sxXSwgRHluYW1pY01lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRFeHRlbnNpb25fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoMjAwNSwgZmllbGRfbmFtZXNbNV0sIHJlcGVhdGVkRXh0ZW5zaW9uXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRFeHRlbnNpb25fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkU0ludDMyQXJyYXkoMjAwNiwgZmllbGRfbmFtZXNbNF0sIHBhY2tlZEV4dGVuc2lvbk1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZEV4dGVuc2lvbl8pOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc1NjYWxhckV4dGVuc2lvbikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZpeGVkMzJTaXplKDIwMDAsIFNjYWxhckV4dGVuc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNFbnVtRXh0ZW5zaW9uKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoMjAwMSwgKGludCkgRW51bUV4dGVuc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEeW5hbWljRW51bUV4dGVuc2lvbikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDIwMDIsIChpbnQpIER5bmFtaWNFbnVtRXh0ZW5zaW9uKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc01lc3NhZ2VFeHRlbnNpb24pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgyMDAzLCBNZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMjAwNCwgRHluYW1pY01lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGVsZW1lbnQgaW4gUmVwZWF0ZWRFeHRlbnNpb25MaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkRXh0ZW5zaW9uXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIFBhY2tlZEV4dGVuc2lvbkxpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50MzJTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZEV4dGVuc2lvbl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZEV4dGVuc2lvbk1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER5bmFtaWNFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHluYW1pY0V4dGVuc2lvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER5bmFtaWNFeHRlbnNpb25zIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHluYW1pY0V4dGVuc2lvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER5bmFtaWNFeHRlbnNpb25zIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHluYW1pY0V4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdER5bmFtaWNFeHRlbnNpb25zIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXBlYXRlZEV4dGVuc2lvbl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkRXh0ZW5zaW9uXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3REeW5hbWljRXh0ZW5zaW9ucyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0RHluYW1pY0V4dGVuc2lvbnMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3REeW5hbWljRXh0ZW5zaW9ucyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3REeW5hbWljRXh0ZW5zaW9ucyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0RHluYW1pY0V4dGVuc2lvbnMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0RHluYW1pY0V4dGVuc2lvbnMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0RHluYW1pY0V4dGVuc2lvbnMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RHluYW1pY0V4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdER5bmFtaWNFeHRlbnNpb25zIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0RHluYW1pY0V4dGVuc2lvbnMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdER5bmFtaWNFeHRlbnNpb25zKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdER5bmFtaWNFeHRlbnNpb25zIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc1NjYWxhckV4dGVuc2lvbikgew0KKyAgICAgICAgICBTY2FsYXJFeHRlbnNpb24gPSBvdGhlci5TY2FsYXJFeHRlbnNpb247DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRW51bUV4dGVuc2lvbikgew0KKyAgICAgICAgICBFbnVtRXh0ZW5zaW9uID0gb3RoZXIuRW51bUV4dGVuc2lvbjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEeW5hbWljRW51bUV4dGVuc2lvbikgew0KKyAgICAgICAgICBEeW5hbWljRW51bUV4dGVuc2lvbiA9IG90aGVyLkR5bmFtaWNFbnVtRXh0ZW5zaW9uOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc01lc3NhZ2VFeHRlbnNpb24pIHsNCisgICAgICAgICAgTWVyZ2VNZXNzYWdlRXh0ZW5zaW9uKG90aGVyLk1lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uKSB7DQorICAgICAgICAgIE1lcmdlRHluYW1pY01lc3NhZ2VFeHRlbnNpb24ob3RoZXIuRHluYW1pY01lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkRXh0ZW5zaW9uXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEV4dGVuc2lvbl8uQWRkKG90aGVyLnJlcGVhdGVkRXh0ZW5zaW9uXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkRXh0ZW5zaW9uXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRFeHRlbnNpb25fLkFkZChvdGhlci5wYWNrZWRFeHRlbnNpb25fKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3REeW5hbWljRXh0ZW5zaW9uc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0RHluYW1pY0V4dGVuc2lvbnNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTYwMDU6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNTY2FsYXJFeHRlbnNpb24gPSBpbnB1dC5SZWFkRml4ZWQzMihyZWYgcmVzdWx0LnNjYWxhckV4dGVuc2lvbl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTYwMDg6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5lbnVtRXh0ZW5zaW9uXywgb3V0IHVua25vd24pKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNFbnVtRXh0ZW5zaW9uID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgyMDAxLCAodWxvbmcpKGludCl1bmtub3duKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2MDE2OiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQuZHluYW1pY0VudW1FeHRlbnNpb25fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R5bmFtaWNFbnVtRXh0ZW5zaW9uID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgyMDAyLCAodWxvbmcpKGludCl1bmtub3duKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2MDI2OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc01lc3NhZ2VFeHRlbnNpb24pIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oTWVzc2FnZUV4dGVuc2lvbik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBNZXNzYWdlRXh0ZW5zaW9uID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2MDM0OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljTWVzc2FnZVR5cGUuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbikgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShEeW5hbWljTWVzc2FnZUV4dGVuc2lvbik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBEeW5hbWljTWVzc2FnZUV4dGVuc2lvbiA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjA0Mjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkRXh0ZW5zaW9uXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjA1MDoNCisgICAgICAgICAgICBjYXNlIDE2MDQ4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkRXh0ZW5zaW9uXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzU2NhbGFyRXh0ZW5zaW9uIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzU2NhbGFyRXh0ZW5zaW9uOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1aW50IFNjYWxhckV4dGVuc2lvbiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlNjYWxhckV4dGVuc2lvbjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0U2NhbGFyRXh0ZW5zaW9uKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRTY2FsYXJFeHRlbnNpb24odWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTY2FsYXJFeHRlbnNpb24gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnNjYWxhckV4dGVuc2lvbl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclNjYWxhckV4dGVuc2lvbigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU2NhbGFyRXh0ZW5zaW9uID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuc2NhbGFyRXh0ZW5zaW9uXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRW51bUV4dGVuc2lvbiB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRW51bUV4dGVuc2lvbjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gRW51bUV4dGVuc2lvbiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkVudW1FeHRlbnNpb247IH0NCisgICAgICAgIHNldCB7IFNldEVudW1FeHRlbnNpb24odmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEVudW1FeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRW51bUV4dGVuc2lvbiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZW51bUV4dGVuc2lvbl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckVudW1FeHRlbnNpb24oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0VudW1FeHRlbnNpb24gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5lbnVtRXh0ZW5zaW9uXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtLkZPUkVJR05fRk9POw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0R5bmFtaWNFbnVtRXh0ZW5zaW9uIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEeW5hbWljRW51bUV4dGVuc2lvbjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNFbnVtVHlwZSBEeW5hbWljRW51bUV4dGVuc2lvbiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkR5bmFtaWNFbnVtRXh0ZW5zaW9uOyB9DQorICAgICAgICBzZXQgeyBTZXREeW5hbWljRW51bUV4dGVuc2lvbih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHluYW1pY0VudW1FeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNFbnVtVHlwZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEeW5hbWljRW51bUV4dGVuc2lvbiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHluYW1pY0VudW1FeHRlbnNpb25fID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEeW5hbWljRW51bUV4dGVuc2lvbigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHluYW1pY0VudW1FeHRlbnNpb24gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5keW5hbWljRW51bUV4dGVuc2lvbl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY0VudW1UeXBlLkRZTkFNSUNfRk9POw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc01lc3NhZ2VFeHRlbnNpb24gew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc01lc3NhZ2VFeHRlbnNpb247IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIE1lc3NhZ2VFeHRlbnNpb24gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5NZXNzYWdlRXh0ZW5zaW9uOyB9DQorICAgICAgICBzZXQgeyBTZXRNZXNzYWdlRXh0ZW5zaW9uKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRNZXNzYWdlRXh0ZW5zaW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNZXNzYWdlRXh0ZW5zaW9uID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5tZXNzYWdlRXh0ZW5zaW9uXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE1lc3NhZ2VFeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZUV4dGVuc2lvbiA9IHRydWU7DQorICAgICAgICByZXN1bHQubWVzc2FnZUV4dGVuc2lvbl8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU1lc3NhZ2VFeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNNZXNzYWdlRXh0ZW5zaW9uICYmDQorICAgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VFeHRlbnNpb25fICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5tZXNzYWdlRXh0ZW5zaW9uXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm1lc3NhZ2VFeHRlbnNpb25fKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VFeHRlbnNpb25fID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZUV4dGVuc2lvbiA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJNZXNzYWdlRXh0ZW5zaW9uKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNZXNzYWdlRXh0ZW5zaW9uID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubWVzc2FnZUV4dGVuc2lvbl8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0R5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZSBEeW5hbWljTWVzc2FnZUV4dGVuc2lvbiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uOyB9DQorICAgICAgICBzZXQgeyBTZXREeW5hbWljTWVzc2FnZUV4dGVuc2lvbih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHluYW1pY01lc3NhZ2VFeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHluYW1pY01lc3NhZ2VFeHRlbnNpb24gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldER5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljTWVzc2FnZVR5cGUuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHluYW1pY01lc3NhZ2VFeHRlbnNpb24gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlRHluYW1pY01lc3NhZ2VFeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0R5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uICYmDQorICAgICAgICAgICAgcmVzdWx0LmR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5keW5hbWljTWVzc2FnZUV4dGVuc2lvbl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5keW5hbWljTWVzc2FnZUV4dGVuc2lvbl8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbiA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEeW5hbWljTWVzc2FnZUV4dGVuc2lvbigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHluYW1pY01lc3NhZ2VFeHRlbnNpb24gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5keW5hbWljTWVzc2FnZUV4dGVuc2lvbl8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBSZXBlYXRlZEV4dGVuc2lvbkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRFeHRlbnNpb25fOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRFeHRlbnNpb25Db3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkRXh0ZW5zaW9uQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZEV4dGVuc2lvbihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRFeHRlbnNpb24oaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEV4dGVuc2lvbihpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRFeHRlbnNpb25fW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkRXh0ZW5zaW9uKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRFeHRlbnNpb25fLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEV4dGVuc2lvbihzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRXh0ZW5zaW9uXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRXh0ZW5zaW9uKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEV4dGVuc2lvbl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gUGFja2VkRXh0ZW5zaW9uTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRFeHRlbnNpb25fOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkRXh0ZW5zaW9uQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRFeHRlbnNpb25Db3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFBhY2tlZEV4dGVuc2lvbihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkRXh0ZW5zaW9uKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkRXh0ZW5zaW9uKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEV4dGVuc2lvbl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkRXh0ZW5zaW9uKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRFeHRlbnNpb25fLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRFeHRlbnNpb24oc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRFeHRlbnNpb25fLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkRXh0ZW5zaW9uKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRFeHRlbnNpb25fLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3REeW5hbWljRXh0ZW5zaW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcywgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInJlcGVhdGVkX2ZpeGVkMzIiLCAicmVwZWF0ZWRfZml4ZWQ2NCIsICJyZXBlYXRlZF9mbG9hdCIsICJyZXBlYXRlZF9pbnQzMiIsICJyZXBlYXRlZF9pbnQ2NCIsICJyZXBlYXRlZF91aW50NjQiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAxLCAxNjM2OSwgMjA5NzE0MSwgMTA0LCAxNjM3NiwgMjA5NzE0NCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcywgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRml4ZWQzMkZpZWxkTnVtYmVyID0gMTI7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4gcmVwZWF0ZWRGaXhlZDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWludD4gUmVwZWF0ZWRGaXhlZDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEZpeGVkMzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGaXhlZDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEZpeGVkMzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IEdldFJlcGVhdGVkRml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRGaXhlZDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbnQzMkZpZWxkTnVtYmVyID0gMTM7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiByZXBlYXRlZEludDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gUmVwZWF0ZWRJbnQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRJbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEludDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEludDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgR2V0UmVwZWF0ZWRJbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRJbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRml4ZWQ2NEZpZWxkTnVtYmVyID0gMjA0NjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4gcmVwZWF0ZWRGaXhlZDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVsb25nPiBSZXBlYXRlZEZpeGVkNjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkRml4ZWQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEZpeGVkNjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRml4ZWQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIEdldFJlcGVhdGVkRml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRGaXhlZDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbnQ2NEZpZWxkTnVtYmVyID0gMjA0NzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiByZXBlYXRlZEludDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBSZXBlYXRlZEludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW50NjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkSW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRJbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRJbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRmxvYXRGaWVsZE51bWJlciA9IDI2MjE0MjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxmbG9hdD4gcmVwZWF0ZWRGbG9hdF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8ZmxvYXQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGZsb2F0PiBSZXBlYXRlZEZsb2F0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEZsb2F0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRmxvYXRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRmxvYXRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IEdldFJlcGVhdGVkRmxvYXQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRmxvYXRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFVpbnQ2NEZpZWxkTnVtYmVyID0gMjYyMTQzOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiByZXBlYXRlZFVpbnQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1bG9uZz4gUmVwZWF0ZWRVaW50NjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkVWludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkVWludDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFVpbnQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIEdldFJlcGVhdGVkVWludDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFVpbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChyZXBlYXRlZEZpeGVkMzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQzMkFycmF5KDEyLCBmaWVsZF9uYW1lc1swXSwgcmVwZWF0ZWRGaXhlZDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyQXJyYXkoMTMsIGZpZWxkX25hbWVzWzNdLCByZXBlYXRlZEludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEZpeGVkNjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQ2NEFycmF5KDIwNDYsIGZpZWxkX25hbWVzWzFdLCByZXBlYXRlZEZpeGVkNjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkSW50NjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50NjRBcnJheSgyMDQ3LCBmaWVsZF9uYW1lc1s0XSwgcmVwZWF0ZWRJbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRGbG9hdF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdEFycmF5KDI2MjE0MiwgZmllbGRfbmFtZXNbMl0sIHJlcGVhdGVkRmxvYXRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkVWludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQ2NEFycmF5KDI2MjE0MywgZmllbGRfbmFtZXNbNV0sIHJlcGVhdGVkVWludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogcmVwZWF0ZWRGaXhlZDMyXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDEgKiByZXBlYXRlZEZpeGVkMzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoaW50IGVsZW1lbnQgaW4gUmVwZWF0ZWRJbnQzMkxpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDEgKiByZXBlYXRlZEludDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHJlcGVhdGVkRml4ZWQ2NF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRGaXhlZDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGxvbmcgZWxlbWVudCBpbiBSZXBlYXRlZEludDY0TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkSW50NjRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogcmVwZWF0ZWRGbG9hdF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAzICogcmVwZWF0ZWRGbG9hdF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoICh1bG9uZyBlbGVtZW50IGluIFJlcGVhdGVkVWludDY0TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQ2NFNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDMgKiByZXBlYXRlZFVpbnQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJlcGVhdGVkRml4ZWQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRJbnQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRGaXhlZDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEludDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEZsb2F0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZFVpbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkRml4ZWQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXy5BZGQob3RoZXIucmVwZWF0ZWRGaXhlZDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRJbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQzMl8uQWRkKG90aGVyLnJlcGVhdGVkSW50MzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEZpeGVkNjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQ2NF8uQWRkKG90aGVyLnJlcGVhdGVkRml4ZWQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkSW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50NjRfLkFkZChvdGhlci5yZXBlYXRlZEludDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRGbG9hdF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRGbG9hdF8uQWRkKG90aGVyLnJlcGVhdGVkRmxvYXRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFVpbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50NjRfLkFkZChvdGhlci5yZXBlYXRlZFVpbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgOTg6DQorICAgICAgICAgICAgY2FzZSAxMDE6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDY6DQorICAgICAgICAgICAgY2FzZSAxMDQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkSW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2MzcwOg0KKyAgICAgICAgICAgIGNhc2UgMTYzNjk6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjM3ODoNCisgICAgICAgICAgICBjYXNlIDE2Mzc2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMDk3MTM4Og0KKyAgICAgICAgICAgIGNhc2UgMjA5NzE0MTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEZsb2F0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjA5NzE0NjoNCisgICAgICAgICAgICBjYXNlIDIwOTcxNDQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRVSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZFVpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWludD4gUmVwZWF0ZWRGaXhlZDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEZpeGVkMzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGaXhlZDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEZpeGVkMzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBHZXRSZXBlYXRlZEZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRml4ZWQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkRml4ZWQzMihpbnQgaW5kZXgsIHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEZpeGVkMzIodWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkMzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEZpeGVkMzIoc2NnOjpJRW51bWVyYWJsZTx1aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRml4ZWQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBSZXBlYXRlZEludDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkSW50MzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkSW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEludDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IFJlcGVhdGVkRml4ZWQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRGaXhlZDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRml4ZWQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRGaXhlZDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEdldFJlcGVhdGVkRml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRGaXhlZDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRGaXhlZDY0KGludCBpbmRleCwgdWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEZpeGVkNjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRGaXhlZDY0KHNjZzo6SUVudW1lcmFibGU8dWxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkNjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRGaXhlZDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkNjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBSZXBlYXRlZEludDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW50NjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkSW50NjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBHZXRSZXBlYXRlZEludDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRJbnQ2NChpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRJbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50NjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEludDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRJbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGZsb2F0PiBSZXBlYXRlZEZsb2F0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEZsb2F0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRmxvYXRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkRmxvYXRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgR2V0UmVwZWF0ZWRGbG9hdChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRGbG9hdChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkRmxvYXQoaW50IGluZGV4LCBmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRmxvYXRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEZsb2F0KHNjZzo6SUVudW1lcmFibGU8ZmxvYXQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRmxvYXRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1bG9uZz4gUmVwZWF0ZWRVaW50NjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkVWludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkVWludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFVpbnQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBHZXRSZXBlYXRlZFVpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRVaW50NjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZFVpbnQ2NChpbnQgaW5kZXgsIHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZFVpbnQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkVWludDY0KHNjZzo6SUVudW1lcmFibGU8dWxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZFVpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50NjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBGb29SZXF1ZXN0IDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8Rm9vUmVxdWVzdCwgRm9vUmVxdWVzdC5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgRm9vUmVxdWVzdCgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGb29SZXF1ZXN0IGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBGb29SZXF1ZXN0KCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9mb29SZXF1ZXN0RmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2Zvb1JlcXVlc3RGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVxdWVzdCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEZvb1JlcXVlc3QgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRm9vUmVxdWVzdCBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0Zvb1JlcXVlc3RfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Rm9vUmVxdWVzdCwgRm9vUmVxdWVzdC5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXF1ZXN0X19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2Zvb1JlcXVlc3RGaWVsZE5hbWVzOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXF1ZXN0IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1JlcXVlc3QgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVxdWVzdCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVxdWVzdCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVxdWVzdCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXF1ZXN0IFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1JlcXVlc3QgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVxdWVzdCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXF1ZXN0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1JlcXVlc3QgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgRm9vUmVxdWVzdCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihGb29SZXF1ZXN0IHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPEZvb1JlcXVlc3QsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEZvb1JlcXVlc3QgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBGb29SZXF1ZXN0IHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIEZvb1JlcXVlc3QgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBGb29SZXF1ZXN0IG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgRm9vUmVxdWVzdCgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRm9vUmVxdWVzdCBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvb1JlcXVlc3QuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRm9vUmVxdWVzdCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0LkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRm9vUmVxdWVzdCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgRm9vUmVxdWVzdCkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChGb29SZXF1ZXN0KSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRm9vUmVxdWVzdCBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvb1JlcXVlc3QuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9mb29SZXF1ZXN0RmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2Zvb1JlcXVlc3RGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBGb29SZXF1ZXN0KCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBGb29SZXNwb25zZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPEZvb1Jlc3BvbnNlLCBGb29SZXNwb25zZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgRm9vUmVzcG9uc2UoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRm9vUmVzcG9uc2UgZGVmYXVsdEluc3RhbmNlID0gbmV3IEZvb1Jlc3BvbnNlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9mb29SZXNwb25zZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9mb29SZXNwb25zZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAgfTsNCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEZvb1Jlc3BvbnNlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZvb1Jlc3BvbnNlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9vUmVzcG9uc2VfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Rm9vUmVzcG9uc2UsIEZvb1Jlc3BvbnNlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0Zvb1Jlc3BvbnNlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2Zvb1Jlc3BvbnNlRmllbGROYW1lczsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVzcG9uc2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1Jlc3BvbnNlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBGb29SZXNwb25zZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihGb29SZXNwb25zZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxGb29SZXNwb25zZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoRm9vUmVzcG9uc2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBGb29SZXNwb25zZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBGb29SZXNwb25zZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEZvb1Jlc3BvbnNlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgRm9vUmVzcG9uc2UoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZvb1Jlc3BvbnNlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRm9vUmVzcG9uc2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBGb29SZXNwb25zZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgRm9vUmVzcG9uc2UpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRm9vUmVzcG9uc2UpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShGb29SZXNwb25zZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvb1Jlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfZm9vUmVzcG9uc2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfZm9vUmVzcG9uc2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBGb29SZXNwb25zZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQmFyUmVxdWVzdCA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPEJhclJlcXVlc3QsIEJhclJlcXVlc3QuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEJhclJlcXVlc3QoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQmFyUmVxdWVzdCBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQmFyUmVxdWVzdCgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfYmFyUmVxdWVzdEZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9iYXJSZXF1ZXN0RmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlcXVlc3QgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBCYXJSZXF1ZXN0IERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJhclJlcXVlc3QgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXF1ZXN0X19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEJhclJlcXVlc3QsIEJhclJlcXVlc3QuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQmFyUmVxdWVzdF9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9iYXJSZXF1ZXN0RmllbGROYW1lczsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVxdWVzdCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXF1ZXN0IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlcXVlc3QgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlcXVlc3QgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlcXVlc3QgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVxdWVzdCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXF1ZXN0IFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlcXVlc3QgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVxdWVzdCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXF1ZXN0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIEJhclJlcXVlc3QgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQmFyUmVxdWVzdCBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxCYXJSZXF1ZXN0LCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihCYXJSZXF1ZXN0IGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQmFyUmVxdWVzdCByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBCYXJSZXF1ZXN0IFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgQmFyUmVxdWVzdCBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEJhclJlcXVlc3QoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJhclJlcXVlc3QgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXF1ZXN0LkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJhclJlcXVlc3QgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQmFyUmVxdWVzdC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJhclJlcXVlc3QgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEJhclJlcXVlc3QpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoQmFyUmVxdWVzdCkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEJhclJlcXVlc3Qgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXF1ZXN0LkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfYmFyUmVxdWVzdEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9iYXJSZXF1ZXN0RmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgQmFyUmVxdWVzdCgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQmFyUmVzcG9uc2UgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxCYXJSZXNwb25zZSwgQmFyUmVzcG9uc2UuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEJhclJlc3BvbnNlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEJhclJlc3BvbnNlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBCYXJSZXNwb25zZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfYmFyUmVzcG9uc2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfYmFyUmVzcG9uc2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBCYXJSZXNwb25zZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBCYXJSZXNwb25zZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0JhclJlc3BvbnNlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEJhclJlc3BvbnNlLCBCYXJSZXNwb25zZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9iYXJSZXNwb25zZUZpZWxkTmFtZXM7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlc3BvbnNlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlc3BvbnNlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlc3BvbnNlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXNwb25zZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgQmFyUmVzcG9uc2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQmFyUmVzcG9uc2UgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8QmFyUmVzcG9uc2UsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEJhclJlc3BvbnNlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQmFyUmVzcG9uc2UgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgQmFyUmVzcG9uc2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBCYXJSZXNwb25zZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEJhclJlc3BvbnNlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCYXJSZXNwb25zZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJhclJlc3BvbnNlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQmFyUmVzcG9uc2UgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEJhclJlc3BvbnNlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEJhclJlc3BvbnNlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oQmFyUmVzcG9uc2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXNwb25zZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2JhclJlc3BvbnNlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2JhclJlc3BvbnNlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgQmFyUmVzcG9uc2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCisgICNyZWdpb24gU2VydmljZXMNCisgIC8qDQorICAqIFNlcnZpY2UgZ2VuZXJhdGlvbiBpcyBub3cgZGlzYWJsZWQgYnkgZGVmYXVsdCwgdXNlIHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGVuYWJsZToNCisgICogb3B0aW9uIChnb29nbGUucHJvdG9idWYuY3NoYXJwX2ZpbGVfb3B0aW9ucykuc2VydmljZV9nZW5lcmF0b3JfdHlwZSA9IEdFTkVSSUM7DQorICAqLw0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorfQ0KKw0KKyNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RScGNJbnRlcm9wLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0UnBjSW50ZXJvcC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzZkY2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0UnBjSW50ZXJvcC5jcwpAQCAtMCwwICsxLDE0NjcgQEAKKy8vIEdlbmVyYXRlZCBieSBQcm90b0dlbiwgVmVyc2lvbj0yLjQuMS41NTUsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49NTVmNzEyNTIzNGJlYjU4OS4gIERPIE5PVCBFRElUIQ0KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjENCisjcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQorDQordXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM7DQordXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KK3VzaW5nIHBiZCA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCit1c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3Mgew0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXRUZXN0UnBjSW50ZXJvcCB7DQorICANCisgICAgI3JlZ2lvbiBFeHRlbnNpb24gcmVnaXN0cmF0aW9uDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3RlckFsbEV4dGVuc2lvbnMocGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIFN0YXRpYyB2YXJpYWJsZXMNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19TZWFyY2hSZXF1ZXN0X19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXF1ZXN0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXF1ZXN0LkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfU2VhcmNoUmVxdWVzdF9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX1NlYXJjaFJlc3BvbnNlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19TZWFyY2hSZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX1NlYXJjaFJlc3BvbnNlX1Jlc3VsdEl0ZW1fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLlR5cGVzLlJlc3VsdEl0ZW0sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLlR5cGVzLlJlc3VsdEl0ZW0uQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19TZWFyY2hSZXNwb25zZV9SZXN1bHRJdGVtX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfUmVmaW5lU2VhcmNoUmVxdWVzdF9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVmaW5lU2VhcmNoUmVxdWVzdCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVmaW5lU2VhcmNoUmVxdWVzdC5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX1JlZmluZVNlYXJjaFJlcXVlc3RfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIERlc2NyaXB0b3INCisgICAgcHVibGljIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOw0KKyAgICANCisgICAgc3RhdGljIFVuaXRUZXN0UnBjSW50ZXJvcCgpIHsNCisgICAgICBieXRlW10gZGVzY3JpcHRvckRhdGEgPSBnbG9iYWw6OlN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoDQorICAgICAgICAgIHN0cmluZy5Db25jYXQoDQorICAgICAgICAgICAgIkNpRmxlSFJsYzNRdmRXNXBkSFJsYzNSZmNuQmpYMmx1ZEdWeWIzQXVjSEp2ZEc4YUpHZHZiMmRzWlM5dyIsIA0KKyAgICAgICAgICAgICJjbTkwYjJKMVppOWpjMmhoY25CZmIzQjBhVzl1Y3k1d2NtOTBieUloQ2cxVFpXRnlZMmhTWlhGMVpYTjAiLCANCisgICAgICAgICAgICAiRWhBS0NFTnlhWFJsY21saEdBRWdBeWdKSW1ZS0RsTmxZWEpqYUZKbGMzQnZibk5sRWlzS0IzSmxjM1ZzIiwgDQorICAgICAgICAgICAgImRITVlBU0FES0FzeUdpNVRaV0Z5WTJoU1pYTndiMjV6WlM1U1pYTjFiSFJKZEdWdEdpY0tDbEpsYzNWcyIsIA0KKyAgICAgICAgICAgICJkRWwwWlcwU0N3b0RkWEpzR0FFZ0FpZ0pFZ3dLQkc1aGJXVVlBaUFCS0FraVVnb1RVbVZtYVc1bFUyVmgiLCANCisgICAgICAgICAgICAiY21Ob1VtVnhkV1Z6ZEJJUUNnaERjbWwwWlhKcFlSZ0JJQU1vQ1JJcENoQndjbVYyYVc5MWMxOXlaWE4xIiwgDQorICAgICAgICAgICAgImJIUnpHQUlnQWlnTE1nOHVVMlZoY21Ob1VtVnpjRzl1YzJVeWNRb05VMlZoY21Ob1UyVnlkbWxqWlJJcCIsIA0KKyAgICAgICAgICAgICJDZ1pUWldGeVkyZ1NEaTVUWldGeVkyaFNaWEYxWlhOMEdnOHVVMlZoY21Ob1VtVnpjRzl1YzJVU05Rb00iLCANCisgICAgICAgICAgICAiVW1WbWFXNWxVMlZoY21Ob0VoUXVVbVZtYVc1bFUyVmhjbU5vVW1WeGRXVnpkQm9QTGxObFlYSmphRkpsIiwgDQorICAgICAgICAgICAgImMzQnZibk5sUWo5SUFjSStPZ29oUjI5dloyeGxMbEJ5YjNSdlkyOXNRblZtWm1WeWN5NVVaWE4wVUhKdiIsIA0KKyAgICAgICAgICAiZEc5ekVoSlZibWwwVkdWemRGSndZMGx1ZEdWeWIzQ0lEZ009IikpOw0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgYXNzaWduZXIgPSBkZWxlZ2F0ZShwYmQ6OkZpbGVEZXNjcmlwdG9yIHJvb3QpIHsNCisgICAgICAgIGRlc2NyaXB0b3IgPSByb290Ow0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19TZWFyY2hSZXF1ZXN0X19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX1NlYXJjaFJlcXVlc3RfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlcXVlc3QsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlcXVlc3QuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19TZWFyY2hSZXF1ZXN0X19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQ3JpdGVyaWEiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfU2VhcmNoUmVzcG9uc2VfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfU2VhcmNoUmVzcG9uc2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX1NlYXJjaFJlc3BvbnNlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiUmVzdWx0cyIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19TZWFyY2hSZXNwb25zZV9SZXN1bHRJdGVtX19EZXNjcmlwdG9yID0gaW50ZXJuYWxfX3N0YXRpY19TZWFyY2hSZXNwb25zZV9fRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfU2VhcmNoUmVzcG9uc2VfUmVzdWx0SXRlbV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuVHlwZXMuUmVzdWx0SXRlbSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuVHlwZXMuUmVzdWx0SXRlbS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX1NlYXJjaFJlc3BvbnNlX1Jlc3VsdEl0ZW1fX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJVcmwiLCAiTmFtZSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19SZWZpbmVTZWFyY2hSZXF1ZXN0X19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMl07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX1JlZmluZVNlYXJjaFJlcXVlc3RfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJlZmluZVNlYXJjaFJlcXVlc3QsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJlZmluZVNlYXJjaFJlcXVlc3QuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19SZWZpbmVTZWFyY2hSZXF1ZXN0X19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQ3JpdGVyaWEiLCAiUHJldmlvdXNSZXN1bHRzIiwgfSk7DQorICAgICAgICBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICByZXR1cm4gcmVnaXN0cnk7DQorICAgICAgfTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbShkZXNjcmlwdG9yRGF0YSwNCisgICAgICAgICAgbmV3IHBiZDo6RmlsZURlc2NyaXB0b3JbXSB7DQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuRGVzY3JpcHRvciwgDQorICAgICAgICAgIH0sIGFzc2lnbmVyKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgfQ0KKyAgI3JlZ2lvbiBNZXNzYWdlcw0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBTZWFyY2hSZXF1ZXN0IDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8U2VhcmNoUmVxdWVzdCwgU2VhcmNoUmVxdWVzdC5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgU2VhcmNoUmVxdWVzdCgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTZWFyY2hSZXF1ZXN0IGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTZWFyY2hSZXF1ZXN0KCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9zZWFyY2hSZXF1ZXN0RmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJDcml0ZXJpYSIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9zZWFyY2hSZXF1ZXN0RmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVxdWVzdCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFNlYXJjaFJlcXVlc3QgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU2VhcmNoUmVxdWVzdCBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFJwY0ludGVyb3AuaW50ZXJuYWxfX3N0YXRpY19TZWFyY2hSZXF1ZXN0X19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFNlYXJjaFJlcXVlc3QsIFNlYXJjaFJlcXVlc3QuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UnBjSW50ZXJvcC5pbnRlcm5hbF9fc3RhdGljX1NlYXJjaFJlcXVlc3RfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IENyaXRlcmlhRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gY3JpdGVyaWFfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBDcml0ZXJpYUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoY3JpdGVyaWFfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgQ3JpdGVyaWFDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGNyaXRlcmlhXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgR2V0Q3JpdGVyaWEoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGNyaXRlcmlhX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9zZWFyY2hSZXF1ZXN0RmllbGROYW1lczsNCisgICAgICBpZiAoY3JpdGVyaWFfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoMSwgZmllbGRfbmFtZXNbMF0sIGNyaXRlcmlhXyk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGVsZW1lbnQgaW4gQ3JpdGVyaWFMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMSAqIGNyaXRlcmlhXy5Db3VudDsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVxdWVzdCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZWFyY2hSZXF1ZXN0IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlcXVlc3QgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlcXVlc3QgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlcXVlc3QgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVxdWVzdCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZWFyY2hSZXF1ZXN0IFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlcXVlc3QgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVxdWVzdCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZWFyY2hSZXF1ZXN0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFNlYXJjaFJlcXVlc3QgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIGNyaXRlcmlhXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFNlYXJjaFJlcXVlc3QgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8U2VhcmNoUmVxdWVzdCwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoU2VhcmNoUmVxdWVzdCBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFNlYXJjaFJlcXVlc3QgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgU2VhcmNoUmVxdWVzdCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFNlYXJjaFJlcXVlc3Qgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBTZWFyY2hSZXF1ZXN0KCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBTZWFyY2hSZXF1ZXN0IE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVxdWVzdC5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTZWFyY2hSZXF1ZXN0IERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlcXVlc3QuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTZWFyY2hSZXF1ZXN0IEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBTZWFyY2hSZXF1ZXN0KSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFNlYXJjaFJlcXVlc3QpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShTZWFyY2hSZXF1ZXN0IG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVxdWVzdC5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5jcml0ZXJpYV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQuY3JpdGVyaWFfLkFkZChvdGhlci5jcml0ZXJpYV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfc2VhcmNoUmVxdWVzdEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9zZWFyY2hSZXF1ZXN0RmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU3RyaW5nQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuY3JpdGVyaWFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gQ3JpdGVyaWFMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmNyaXRlcmlhXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IENyaXRlcmlhQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Dcml0ZXJpYUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgR2V0Q3JpdGVyaWEoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldENyaXRlcmlhKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Q3JpdGVyaWEoaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmNyaXRlcmlhX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRDcml0ZXJpYShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmNyaXRlcmlhXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlQ3JpdGVyaWEoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5jcml0ZXJpYV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJDcml0ZXJpYSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuY3JpdGVyaWFfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFNlYXJjaFJlcXVlc3QoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFJwY0ludGVyb3AuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBTZWFyY2hSZXNwb25zZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFNlYXJjaFJlc3BvbnNlLCBTZWFyY2hSZXNwb25zZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgU2VhcmNoUmVzcG9uc2UoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU2VhcmNoUmVzcG9uc2UgZGVmYXVsdEluc3RhbmNlID0gbmV3IFNlYXJjaFJlc3BvbnNlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9zZWFyY2hSZXNwb25zZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAicmVzdWx0cyIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9zZWFyY2hSZXNwb25zZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlc3BvbnNlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgU2VhcmNoUmVzcG9uc2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU2VhcmNoUmVzcG9uc2UgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RScGNJbnRlcm9wLmludGVybmFsX19zdGF0aWNfU2VhcmNoUmVzcG9uc2VfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8U2VhcmNoUmVzcG9uc2UsIFNlYXJjaFJlc3BvbnNlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFJwY0ludGVyb3AuaW50ZXJuYWxfX3N0YXRpY19TZWFyY2hSZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgICNyZWdpb24gTmVzdGVkIHR5cGVzDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgUmVzdWx0SXRlbSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFJlc3VsdEl0ZW0sIFJlc3VsdEl0ZW0uQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBSZXN1bHRJdGVtKCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSZXN1bHRJdGVtIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBSZXN1bHRJdGVtKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfcmVzdWx0SXRlbUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAibmFtZSIsICJ1cmwiIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Jlc3VsdEl0ZW1GaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTgsIDEwIH07DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlc3VsdEl0ZW0gRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmVzdWx0SXRlbSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgUmVzdWx0SXRlbSBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UnBjSW50ZXJvcC5pbnRlcm5hbF9fc3RhdGljX1NlYXJjaFJlc3BvbnNlX1Jlc3VsdEl0ZW1fX0Rlc2NyaXB0b3I7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8UmVzdWx0SXRlbSwgUmVzdWx0SXRlbS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UnBjSW50ZXJvcC5pbnRlcm5hbF9fc3RhdGljX1NlYXJjaFJlc3BvbnNlX1Jlc3VsdEl0ZW1fX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IFVybEZpZWxkTnVtYmVyID0gMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNVcmw7DQorICAgICAgICBwcml2YXRlIHN0cmluZyB1cmxfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNVcmwgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzVXJsOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIFVybCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB1cmxfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTmFtZUZpZWxkTnVtYmVyID0gMjsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNOYW1lOw0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgbmFtZV8gPSAiIjsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc05hbWUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzTmFtZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIG5hbWVfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGlmICghaGFzVXJsKSByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfcmVzdWx0SXRlbUZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNVcmwpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMSwgZmllbGRfbmFtZXNbMV0sIFVybCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc05hbWUpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMiwgZmllbGRfbmFtZXNbMF0sIE5hbWUpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIGlmIChoYXNVcmwpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxLCBVcmwpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNOYW1lKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMiwgTmFtZSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlc3VsdEl0ZW0gUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0SXRlbSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXN1bHRJdGVtIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXN1bHRJdGVtIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXN1bHRJdGVtIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlc3VsdEl0ZW0gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0SXRlbSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXN1bHRJdGVtIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlc3VsdEl0ZW0gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0SXRlbSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpdmF0ZSBSZXN1bHRJdGVtIE1ha2VSZWFkT25seSgpIHsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihSZXN1bHRJdGVtIHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8UmVzdWx0SXRlbSwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihSZXN1bHRJdGVtIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgUmVzdWx0SXRlbSByZXN1bHQ7DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIFJlc3VsdEl0ZW0gUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIFJlc3VsdEl0ZW0gb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUmVzdWx0SXRlbSgpOw0KKyAgICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBSZXN1bHRJdGVtIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLlR5cGVzLlJlc3VsdEl0ZW0uRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmVzdWx0SXRlbSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuVHlwZXMuUmVzdWx0SXRlbS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIFJlc3VsdEl0ZW0gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGlzIFJlc3VsdEl0ZW0pIHsNCisgICAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFJlc3VsdEl0ZW0pIG90aGVyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oUmVzdWx0SXRlbSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzVXJsKSB7DQorICAgICAgICAgICAgICBVcmwgPSBvdGhlci5Vcmw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNOYW1lKSB7DQorICAgICAgICAgICAgICBOYW1lID0gb3RoZXIuTmFtZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfcmVzdWx0SXRlbUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX3Jlc3VsdEl0ZW1GaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNVcmwgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQudXJsXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAxODogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0Lm5hbWVfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICANCisgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzVXJsIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1VybDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgVXJsIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVybDsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldFVybCh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVcmwoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNVcmwgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC51cmxfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVcmwoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzVXJsID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LnVybF8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzTmFtZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOYW1lOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk5hbWU7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXROYW1lKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5hbWUoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQubmFtZV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5hbWUoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzTmFtZSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5uYW1lXyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgUmVzdWx0SXRlbSgpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFJwY0ludGVyb3AuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVzdWx0c0ZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtPiByZXN1bHRzXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtPiBSZXN1bHRzTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdHNfOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXN1bHRzQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXN1bHRzXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtIEdldFJlc3VsdHMoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlc3VsdHNfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLlR5cGVzLlJlc3VsdEl0ZW0gZWxlbWVudCBpbiBSZXN1bHRzTGlzdCkgew0KKyAgICAgICAgICBpZiAoIWVsZW1lbnQuSXNJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfc2VhcmNoUmVzcG9uc2VGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChyZXN1bHRzXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSgxLCBmaWVsZF9uYW1lc1swXSwgcmVzdWx0c18pOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuVHlwZXMuUmVzdWx0SXRlbSBlbGVtZW50IGluIFJlc3VsdHNMaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMSwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlc3BvbnNlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlc3BvbnNlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlc3BvbnNlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZWFyY2hSZXNwb25zZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVzcG9uc2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVzcG9uc2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVzcG9uc2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVzcG9uc2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgU2VhcmNoUmVzcG9uc2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJlc3VsdHNfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoU2VhcmNoUmVzcG9uc2UgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8U2VhcmNoUmVzcG9uc2UsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFNlYXJjaFJlc3BvbnNlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgU2VhcmNoUmVzcG9uc2UgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgU2VhcmNoUmVzcG9uc2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBTZWFyY2hSZXNwb25zZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFNlYXJjaFJlc3BvbnNlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBTZWFyY2hSZXNwb25zZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNlYXJjaFJlc3BvbnNlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgU2VhcmNoUmVzcG9uc2UgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFNlYXJjaFJlc3BvbnNlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFNlYXJjaFJlc3BvbnNlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oU2VhcmNoUmVzcG9uc2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5yZXN1bHRzXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXN1bHRzXy5BZGQob3RoZXIucmVzdWx0c18pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfc2VhcmNoUmVzcG9uc2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfc2VhcmNoUmVzcG9uc2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVzdWx0c18sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLlR5cGVzLlJlc3VsdEl0ZW0uRGVmYXVsdEluc3RhbmNlLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtPiBSZXN1bHRzTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXN1bHRzXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlc3VsdHNDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlc3VsdHNDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuVHlwZXMuUmVzdWx0SXRlbSBHZXRSZXN1bHRzKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXN1bHRzKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVzdWx0cyhpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLlR5cGVzLlJlc3VsdEl0ZW0gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlc3VsdHNfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlc3VsdHMoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlc3VsdHNfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlc3VsdHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuVHlwZXMuUmVzdWx0SXRlbSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVzdWx0c18uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXN1bHRzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLlR5cGVzLlJlc3VsdEl0ZW0uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVzdWx0c18uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlc3VsdHMoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVzdWx0c18uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXN1bHRzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXN1bHRzXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBTZWFyY2hSZXNwb25zZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UnBjSW50ZXJvcC5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFJlZmluZVNlYXJjaFJlcXVlc3QgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxSZWZpbmVTZWFyY2hSZXF1ZXN0LCBSZWZpbmVTZWFyY2hSZXF1ZXN0LkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBSZWZpbmVTZWFyY2hSZXF1ZXN0KCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJlZmluZVNlYXJjaFJlcXVlc3QgZGVmYXVsdEluc3RhbmNlID0gbmV3IFJlZmluZVNlYXJjaFJlcXVlc3QoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3JlZmluZVNlYXJjaFJlcXVlc3RGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIkNyaXRlcmlhIiwgInByZXZpb3VzX3Jlc3VsdHMiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfcmVmaW5lU2VhcmNoUmVxdWVzdEZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCwgMTggfTsNCisgICAgcHVibGljIHN0YXRpYyBSZWZpbmVTZWFyY2hSZXF1ZXN0IERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgUmVmaW5lU2VhcmNoUmVxdWVzdCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBSZWZpbmVTZWFyY2hSZXF1ZXN0IFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UnBjSW50ZXJvcC5pbnRlcm5hbF9fc3RhdGljX1JlZmluZVNlYXJjaFJlcXVlc3RfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8UmVmaW5lU2VhcmNoUmVxdWVzdCwgUmVmaW5lU2VhcmNoUmVxdWVzdC5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RScGNJbnRlcm9wLmludGVybmFsX19zdGF0aWNfUmVmaW5lU2VhcmNoUmVxdWVzdF9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQ3JpdGVyaWFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiBjcml0ZXJpYV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxzdHJpbmc+IENyaXRlcmlhTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShjcml0ZXJpYV8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBDcml0ZXJpYUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gY3JpdGVyaWFfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBHZXRDcml0ZXJpYShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gY3JpdGVyaWFfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQcmV2aW91c1Jlc3VsdHNGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNQcmV2aW91c1Jlc3VsdHM7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UgcHJldmlvdXNSZXN1bHRzXzsNCisgICAgcHVibGljIGJvb2wgSGFzUHJldmlvdXNSZXN1bHRzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzUHJldmlvdXNSZXN1bHRzOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlIFByZXZpb3VzUmVzdWx0cyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHByZXZpb3VzUmVzdWx0c18gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIWhhc1ByZXZpb3VzUmVzdWx0cykgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgaWYgKCFQcmV2aW91c1Jlc3VsdHMuSXNJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfcmVmaW5lU2VhcmNoUmVxdWVzdEZpZWxkTmFtZXM7DQorICAgICAgaWYgKGNyaXRlcmlhXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZ0FycmF5KDEsIGZpZWxkX25hbWVzWzBdLCBjcml0ZXJpYV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzUHJldmlvdXNSZXN1bHRzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDIsIGZpZWxkX25hbWVzWzFdLCBQcmV2aW91c1Jlc3VsdHMpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIENyaXRlcmlhTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDEgKiBjcml0ZXJpYV8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNQcmV2aW91c1Jlc3VsdHMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgyLCBQcmV2aW91c1Jlc3VsdHMpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSZWZpbmVTZWFyY2hSZXF1ZXN0IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlZmluZVNlYXJjaFJlcXVlc3QgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVmaW5lU2VhcmNoUmVxdWVzdCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVmaW5lU2VhcmNoUmVxdWVzdCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVmaW5lU2VhcmNoUmVxdWVzdCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSZWZpbmVTZWFyY2hSZXF1ZXN0IFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlZmluZVNlYXJjaFJlcXVlc3QgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVmaW5lU2VhcmNoUmVxdWVzdCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSZWZpbmVTZWFyY2hSZXF1ZXN0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlZmluZVNlYXJjaFJlcXVlc3QgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgUmVmaW5lU2VhcmNoUmVxdWVzdCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgY3JpdGVyaWFfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoUmVmaW5lU2VhcmNoUmVxdWVzdCBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxSZWZpbmVTZWFyY2hSZXF1ZXN0LCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihSZWZpbmVTZWFyY2hSZXF1ZXN0IGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgUmVmaW5lU2VhcmNoUmVxdWVzdCByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBSZWZpbmVTZWFyY2hSZXF1ZXN0IFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgUmVmaW5lU2VhcmNoUmVxdWVzdCBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFJlZmluZVNlYXJjaFJlcXVlc3QoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFJlZmluZVNlYXJjaFJlcXVlc3QgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZWZpbmVTZWFyY2hSZXF1ZXN0LkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFJlZmluZVNlYXJjaFJlcXVlc3QgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVmaW5lU2VhcmNoUmVxdWVzdC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFJlZmluZVNlYXJjaFJlcXVlc3QgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFJlZmluZVNlYXJjaFJlcXVlc3QpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoUmVmaW5lU2VhcmNoUmVxdWVzdCkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFJlZmluZVNlYXJjaFJlcXVlc3Qgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZWZpbmVTZWFyY2hSZXF1ZXN0LkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLmNyaXRlcmlhXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5jcml0ZXJpYV8uQWRkKG90aGVyLmNyaXRlcmlhXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzUHJldmlvdXNSZXN1bHRzKSB7DQorICAgICAgICAgIE1lcmdlUHJldmlvdXNSZXN1bHRzKG90aGVyLlByZXZpb3VzUmVzdWx0cyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9yZWZpbmVTZWFyY2hSZXF1ZXN0RmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3JlZmluZVNlYXJjaFJlcXVlc3RGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTdHJpbmdBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5jcml0ZXJpYV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTg6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzUHJldmlvdXNSZXN1bHRzKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKFByZXZpb3VzUmVzdWx0cyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBQcmV2aW91c1Jlc3VsdHMgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBDcml0ZXJpYUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuY3JpdGVyaWFfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgQ3JpdGVyaWFDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkNyaXRlcmlhQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBHZXRDcml0ZXJpYShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0Q3JpdGVyaWEoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRDcml0ZXJpYShpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuY3JpdGVyaWFfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZENyaXRlcmlhKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuY3JpdGVyaWFfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VDcml0ZXJpYShzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmNyaXRlcmlhXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckNyaXRlcmlhKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5jcml0ZXJpYV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNQcmV2aW91c1Jlc3VsdHMgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1ByZXZpb3VzUmVzdWx0czsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UgUHJldmlvdXNSZXN1bHRzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUHJldmlvdXNSZXN1bHRzOyB9DQorICAgICAgICBzZXQgeyBTZXRQcmV2aW91c1Jlc3VsdHModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFByZXZpb3VzUmVzdWx0cyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzUHJldmlvdXNSZXN1bHRzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5wcmV2aW91c1Jlc3VsdHNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UHJldmlvdXNSZXN1bHRzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ByZXZpb3VzUmVzdWx0cyA9IHRydWU7DQorICAgICAgICByZXN1bHQucHJldmlvdXNSZXN1bHRzXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlUHJldmlvdXNSZXN1bHRzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzUHJldmlvdXNSZXN1bHRzICYmDQorICAgICAgICAgICAgcmVzdWx0LnByZXZpb3VzUmVzdWx0c18gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LnByZXZpb3VzUmVzdWx0c18gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5DcmVhdGVCdWlsZGVyKHJlc3VsdC5wcmV2aW91c1Jlc3VsdHNfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0LnByZXZpb3VzUmVzdWx0c18gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNQcmV2aW91c1Jlc3VsdHMgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUHJldmlvdXNSZXN1bHRzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNQcmV2aW91c1Jlc3VsdHMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5wcmV2aW91c1Jlc3VsdHNfID0gbnVsbDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgUmVmaW5lU2VhcmNoUmVxdWVzdCgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UnBjSW50ZXJvcC5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCisgICNyZWdpb24gU2VydmljZXMNCisgIHB1YmxpYyBwYXJ0aWFsIGludGVyZmFjZSBJU2VhcmNoU2VydmljZSB7DQorICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlIFNlYXJjaChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpOw0KKyAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZSBSZWZpbmVTZWFyY2goZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVmaW5lU2VhcmNoUmVxdWVzdCByZWZpbmVTZWFyY2hSZXF1ZXN0KTsNCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHBhcnRpYWwgY2xhc3MgU2VhcmNoU2VydmljZSA6IElTZWFyY2hTZXJ2aWNlLCBwYjo6SVJwY0Rpc3BhdGNoLCBnbG9iYWw6OlN5c3RlbS5JRGlzcG9zYWJsZSB7DQorICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBkaXNwb3NlOw0KKyAgICBwcml2YXRlIHJlYWRvbmx5IHBiOjpJUnBjRGlzcGF0Y2ggZGlzcGF0Y2g7DQorICAgIHB1YmxpYyBTZWFyY2hTZXJ2aWNlKHBiOjpJUnBjRGlzcGF0Y2ggZGlzcGF0Y2gpIDogdGhpcyhkaXNwYXRjaCwgdHJ1ZSkgew0KKyAgICB9DQorICAgIHB1YmxpYyBTZWFyY2hTZXJ2aWNlKHBiOjpJUnBjRGlzcGF0Y2ggZGlzcGF0Y2gsIGJvb2wgZGlzcG9zZSkgew0KKyAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh0aGlzLmRpc3BhdGNoID0gZGlzcGF0Y2gsICJkaXNwYXRjaCIpOw0KKyAgICAgIHRoaXMuZGlzcG9zZSA9IGRpc3Bvc2UgJiYgZGlzcGF0Y2ggaXMgZ2xvYmFsOjpTeXN0ZW0uSURpc3Bvc2FibGU7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKSB7DQorICAgICAgaWYgKGRpc3Bvc2UpICgoZ2xvYmFsOjpTeXN0ZW0uSURpc3Bvc2FibGUpZGlzcGF0Y2gpLkRpc3Bvc2UoKTsNCisgICAgfQ0KKyAgICANCisgICAgVE1lc3NhZ2UgcGI6OklScGNEaXNwYXRjaC5DYWxsTWV0aG9kPFRNZXNzYWdlLCBUQnVpbGRlcj4oc3RyaW5nIG1ldGhvZCwgcGI6OklNZXNzYWdlTGl0ZSByZXF1ZXN0LCBwYjo6SUJ1aWxkZXJMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gcmVzcG9uc2UpIHsNCisgICAgICByZXR1cm4gZGlzcGF0Y2guQ2FsbE1ldGhvZChtZXRob2QsIHJlcXVlc3QsIHJlc3BvbnNlKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlIFNlYXJjaChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpIHsNCisgICAgICAgcmV0dXJuIGRpc3BhdGNoLkNhbGxNZXRob2QoIlNlYXJjaCIsIHNlYXJjaFJlcXVlc3QsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLkNyZWF0ZUJ1aWxkZXIoKSk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZSBSZWZpbmVTZWFyY2goZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVmaW5lU2VhcmNoUmVxdWVzdCByZWZpbmVTZWFyY2hSZXF1ZXN0KSB7DQorICAgICAgIHJldHVybiBkaXNwYXRjaC5DYWxsTWV0aG9kKCJSZWZpbmVTZWFyY2giLCByZWZpbmVTZWFyY2hSZXF1ZXN0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5DcmVhdGVCdWlsZGVyKCkpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHBhcnRpYWwgY2xhc3MgRGlzcGF0Y2ggOiBwYjo6SVJwY0Rpc3BhdGNoLCBnbG9iYWw6OlN5c3RlbS5JRGlzcG9zYWJsZSB7DQorICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIGRpc3Bvc2U7DQorICAgICAgcHJpdmF0ZSByZWFkb25seSBJU2VhcmNoU2VydmljZSBpbXBsZW1lbnRhdGlvbjsNCisgICAgICBwdWJsaWMgRGlzcGF0Y2goSVNlYXJjaFNlcnZpY2UgaW1wbGVtZW50YXRpb24pIDogdGhpcyhpbXBsZW1lbnRhdGlvbiwgdHJ1ZSkgew0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgRGlzcGF0Y2goSVNlYXJjaFNlcnZpY2UgaW1wbGVtZW50YXRpb24sIGJvb2wgZGlzcG9zZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHRoaXMuaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvbiwgImltcGxlbWVudGF0aW9uIik7DQorICAgICAgICB0aGlzLmRpc3Bvc2UgPSBkaXNwb3NlICYmIGltcGxlbWVudGF0aW9uIGlzIGdsb2JhbDo6U3lzdGVtLklEaXNwb3NhYmxlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkgew0KKyAgICAgICAgaWYgKGRpc3Bvc2UpICgoZ2xvYmFsOjpTeXN0ZW0uSURpc3Bvc2FibGUpaW1wbGVtZW50YXRpb24pLkRpc3Bvc2UoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIFRNZXNzYWdlIENhbGxNZXRob2Q8VE1lc3NhZ2UsIFRCdWlsZGVyPihzdHJpbmcgbWV0aG9kTmFtZSwgcGI6OklNZXNzYWdlTGl0ZSByZXF1ZXN0LCBwYjo6SUJ1aWxkZXJMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gcmVzcG9uc2UpDQorICAgICAgICB3aGVyZSBUTWVzc2FnZSA6IHBiOjpJTWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVEJ1aWxkZXIgOiBwYjo6SUJ1aWxkZXJMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gew0KKyAgICAgICAgc3dpdGNoKG1ldGhvZE5hbWUpIHsNCisgICAgICAgICAgY2FzZSAiU2VhcmNoIjogcmV0dXJuIHJlc3BvbnNlLk1lcmdlRnJvbShpbXBsZW1lbnRhdGlvbi5TZWFyY2goKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlcXVlc3QpcmVxdWVzdCkpLkJ1aWxkKCk7DQorICAgICAgICAgIGNhc2UgIlJlZmluZVNlYXJjaCI6IHJldHVybiByZXNwb25zZS5NZXJnZUZyb20oaW1wbGVtZW50YXRpb24uUmVmaW5lU2VhcmNoKChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZWZpbmVTZWFyY2hSZXF1ZXN0KXJlcXVlc3QpKS5CdWlsZCgpOw0KKyAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBwYjo6VGhyb3dIZWxwZXIuQ3JlYXRlTWlzc2luZ01ldGhvZCh0eXBlb2YoSVNlYXJjaFNlcnZpY2UpLCBtZXRob2ROYW1lKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBwYXJ0aWFsIGNsYXNzIFNlcnZlclN0dWIgOiBwYjo6SVJwY1NlcnZlclN0dWIsIGdsb2JhbDo6U3lzdGVtLklEaXNwb3NhYmxlIHsNCisgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgZGlzcG9zZTsNCisgICAgICBwcml2YXRlIHJlYWRvbmx5IHBiOjpJUnBjRGlzcGF0Y2ggaW1wbGVtZW50YXRpb247DQorICAgICAgcHVibGljIFNlcnZlclN0dWIoSVNlYXJjaFNlcnZpY2UgaW1wbGVtZW50YXRpb24pIDogdGhpcyhpbXBsZW1lbnRhdGlvbiwgdHJ1ZSkgew0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgU2VydmVyU3R1YihJU2VhcmNoU2VydmljZSBpbXBsZW1lbnRhdGlvbiwgYm9vbCBkaXNwb3NlKSA6IHRoaXMobmV3IERpc3BhdGNoKGltcGxlbWVudGF0aW9uLCBkaXNwb3NlKSwgZGlzcG9zZSkgew0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgU2VydmVyU3R1YihwYjo6SVJwY0Rpc3BhdGNoIGltcGxlbWVudGF0aW9uKSA6IHRoaXMoaW1wbGVtZW50YXRpb24sIHRydWUpIHsNCisgICAgICB9DQorICAgICAgcHVibGljIFNlcnZlclN0dWIocGI6OklScGNEaXNwYXRjaCBpbXBsZW1lbnRhdGlvbiwgYm9vbCBkaXNwb3NlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodGhpcy5pbXBsZW1lbnRhdGlvbiA9IGltcGxlbWVudGF0aW9uLCAiaW1wbGVtZW50YXRpb24iKTsNCisgICAgICAgIHRoaXMuZGlzcG9zZSA9IGRpc3Bvc2UgJiYgaW1wbGVtZW50YXRpb24gaXMgZ2xvYmFsOjpTeXN0ZW0uSURpc3Bvc2FibGU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKSB7DQorICAgICAgICBpZiAoZGlzcG9zZSkgKChnbG9iYWw6OlN5c3RlbS5JRGlzcG9zYWJsZSlpbXBsZW1lbnRhdGlvbikuRGlzcG9zZSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGI6OklNZXNzYWdlTGl0ZSBDYWxsTWV0aG9kKHN0cmluZyBtZXRob2ROYW1lLCBwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgew0KKyAgICAgICAgc3dpdGNoKG1ldGhvZE5hbWUpIHsNCisgICAgICAgICAgY2FzZSAiU2VhcmNoIjogcmV0dXJuIGltcGxlbWVudGF0aW9uLkNhbGxNZXRob2QobWV0aG9kTmFtZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVxdWVzdC5QYXJzZUZyb20oaW5wdXQsIHJlZ2lzdHJ5KSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuQ3JlYXRlQnVpbGRlcigpKTsNCisgICAgICAgICAgY2FzZSAiUmVmaW5lU2VhcmNoIjogcmV0dXJuIGltcGxlbWVudGF0aW9uLkNhbGxNZXRob2QobWV0aG9kTmFtZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVmaW5lU2VhcmNoUmVxdWVzdC5QYXJzZUZyb20oaW5wdXQsIHJlZ2lzdHJ5KSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuQ3JlYXRlQnVpbGRlcigpKTsNCisgICAgICAgICAgZGVmYXVsdDogdGhyb3cgcGI6OlRocm93SGVscGVyLkNyZWF0ZU1pc3NpbmdNZXRob2QodHlwZW9mKElTZWFyY2hTZXJ2aWNlKSwgbWV0aG9kTmFtZSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICAjZW5kcmVnaW9uDQorICANCit9DQorDQorI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzNWM5MQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLmNzCkBAIC0wLDAgKzEsMjI5MiBAQAorLy8gR2VuZXJhdGVkIGJ5IFByb3RvR2VuLCBWZXJzaW9uPTIuNC4xLjU1NSwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj01NWY3MTI1MjM0YmViNTg5LiAgRE8gTk9UIEVESVQhDQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQ0KKyNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCisNCit1c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVyczsNCit1c2luZyBwYmMgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnM7DQordXNpbmcgcGJkID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcyB7DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZSB7DQorICANCisgICAgI3JlZ2lvbiBFeHRlbnNpb24gcmVnaXN0cmF0aW9uDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3RlckFsbEV4dGVuc2lvbnMocGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uRW51bSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uVGV4dCk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uTnVtYmVyKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25NZXNzYWdlKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gRXh0ZW5zaW9ucw0KKyAgICBwdWJsaWMgY29uc3QgaW50IEV4dGVuc2lvbkVudW1GaWVsZE51bWJlciA9IDEwMTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5FbnVtT3B0aW9ucz4gRXh0ZW5zaW9uRW51bTsNCisgICAgcHVibGljIGNvbnN0IGludCBFeHRlbnNpb25UZXh0RmllbGROdW1iZXIgPSAxMDI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c3RyaW5nPiBFeHRlbnNpb25UZXh0Ow0KKyAgICBwdWJsaWMgY29uc3QgaW50IEV4dGVuc2lvbk51bWJlckZpZWxkTnVtYmVyID0gMTAzOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8aW50Pj4gRXh0ZW5zaW9uTnVtYmVyOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IEV4dGVuc2lvbk1lc3NhZ2VGaWVsZE51bWJlciA9IDE5OTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sRXh0ZW5zaW9uPiBFeHRlbnNpb25NZXNzYWdlOw0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICAjcmVnaW9uIFN0YXRpYyB2YXJpYWJsZXMNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0WG1sQ2hpbGRfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxDaGlsZCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbENoaWxkLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFhtbENoaWxkX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFhtbE5vRmllbGRzX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTm9GaWVsZHMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxOb0ZpZWxkcy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxOb0ZpZWxkc19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxSZXNjdXJzaXZlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sUmVzY3Vyc2l2ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbFJlc2N1cnNpdmUuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0WG1sUmVzY3Vyc2l2ZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbE1lc3NhZ2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0WG1sTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxNZXNzYWdlX0NoaWxkcmVuX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbE1lc3NhZ2UuVHlwZXMuQ2hpbGRyZW4uQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0WG1sTWVzc2FnZV9DaGlsZHJlbl9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxFeHRlbnNpb25fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxFeHRlbnNpb24sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxFeHRlbnNpb24uQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0WG1sRXh0ZW5zaW9uX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBEZXNjcmlwdG9yDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIHByaXZhdGUgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsNCisgICAgDQorICAgIHN0YXRpYyBVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlKCkgew0KKyAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygNCisgICAgICAgICAgc3RyaW5nLkNvbmNhdCgNCisgICAgICAgICAgICAiQ2lSbGVIUmxjM1F2ZFc1cGRIUmxjM1JmWlhoMGNtRnpYM2h0YkhSbGMzUXVjSEp2ZEc4U0YzQnliM1J2IiwgDQorICAgICAgICAgICAgIlluVm1YM1Z1YVhSMFpYTjBYMlY0ZEhKaEdpUm5iMjluYkdVdmNISnZkRzlpZFdZdlkzTm9ZWEp3WDI5dyIsIA0KKyAgICAgICAgICAgICJkR2x2Ym5NdWNISnZkRzhpVlFvTVZHVnpkRmh0YkVOb2FXeGtFalVLQjI5d2RHbHZibk1ZQXlBREtBNHkiLCANCisgICAgICAgICAgICAiSkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEY5bGVIUnlZUzVGYm5WdFQzQjBhVzl1Y3hJT0NnWmlhVzVoIiwgDQorICAgICAgICAgICAgImNua1lCQ0FCS0F3aUVRb1BWR1Z6ZEZodGJFNXZSbWxsYkdSeklrNEtFVlJsYzNSWWJXeFNaWE5qZFhKeiIsIA0KKyAgICAgICAgICAgICJhWFpsRWprS0JXTm9hV3hrR0FFZ0FTZ0xNaW91Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1JmWlhoMGNtRXUiLCANCisgICAgICAgICAgICAiVkdWemRGaHRiRkpsYzJOMWNuTnBkbVVpdHdJS0RsUmxjM1JZYld4TlpYTnpZV2RsRWc0S0JtNTFiV0psIiwgDQorICAgICAgICAgICAgImNoZ0dJQUVvQXhJUENnZHVkVzFpWlhKekdBSWdBeWdGRWd3S0JIUmxlSFFZQXlBQktBa1NFZ29KZEdWNCIsIA0KKyAgICAgICAgICAgICJkR3hwYm1WekdMd0ZJQU1vQ1JJTkNnVjJZV3hwWkJnRklBRW9DQkkwQ2dWamFHbHNaQmdCSUFFb0N6SWwiLCANCisgICAgICAgICAgICAiTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wWDJWNGRISmhMbFJsYzNSWWJXeERhR2xzWkJKRENnaGphR2xzIiwgDQorICAgICAgICAgICAgIlpISmxiaGlSQXlBREtBb3lNQzV3Y205MGIySjFabDkxYm1sMGRHVnpkRjlsZUhSeVlTNVVaWE4wV0cxcyIsIA0KKyAgICAgICAgICAgICJUV1Z6YzJGblpTNURhR2xzWkhKbGJocFJDZ2hEYUdsc1pISmxiaEkxQ2dkdmNIUnBiMjV6R0FNZ0F5Z08iLCANCisgICAgICAgICAgICAiTWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNSZlpYaDBjbUV1Ulc1MWJVOXdkR2x2Ym5NU0Rnb0dZbWx1IiwgDQorICAgICAgICAgICAgIllYSjVHQVFnQVNnTUtnVUlaQkRJQVNJaUNoQlVaWE4wV0cxc1JYaDBaVzV6YVc5dUVnNEtCbTUxYldKbCIsIA0KKyAgICAgICAgICAgICJjaGdCSUFJb0JTb3FDZ3RGYm5WdFQzQjBhVzl1Y3hJSENnTlBUa1VRQUJJSENnTlVWMDhRQVJJSkNnVlUiLCANCisgICAgICAgICAgICAiU0ZKRlJSQUNPbVVLRG1WNGRHVnVjMmx2Ymw5bGJuVnRFaWN1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1JmIiwgDQorICAgICAgICAgICAgIlpYaDBjbUV1VkdWemRGaHRiRTFsYzNOaFoyVVlaU0FCS0E0eUpDNXdjbTkwYjJKMVpsOTFibWwwZEdWeiIsIA0KKyAgICAgICAgICAgICJkRjlsZUhSeVlTNUZiblZ0VDNCMGFXOXVjem8vQ2c1bGVIUmxibk5wYjI1ZmRHVjRkQkluTG5CeWIzUnYiLCANCisgICAgICAgICAgICAiWW5WbVgzVnVhWFIwWlhOMFgyVjRkSEpoTGxSbGMzUlliV3hOWlhOellXZGxHR1lnQVNnSk9rVUtFR1Y0IiwgDQorICAgICAgICAgICAgImRHVnVjMmx2Ymw5dWRXMWlaWElTSnk1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEY5bGVIUnlZUzVVWlhOMCIsIA0KKyAgICAgICAgICAgICJXRzFzVFdWemMyRm5aUmhuSUFNb0JVSUNFQUU2YmdvUlpYaDBaVzV6YVc5dVgyMWxjM05oWjJVU0p5NXciLCANCisgICAgICAgICAgICAiY205MGIySjFabDkxYm1sMGRHVnpkRjlsZUhSeVlTNVVaWE4wV0cxc1RXVnpjMkZuWlJqSEFTQUJLQXN5IiwgDQorICAgICAgICAgICAgIktTNXdjbTkwYjJKMVpsOTFibWwwZEdWemRGOWxlSFJ5WVM1VVpYTjBXRzFzUlhoMFpXNXphVzl1UWs1SSIsIA0KKyAgICAgICAgICAgICJBY0krU1FvaFIyOXZaMnhsTGxCeWIzUnZZMjlzUW5WbVptVnljeTVVWlhOMFVISnZkRzl6RWlKVmJtbDAiLCANCisgICAgICAgICAgIlZHVnpkRmh0YkZObGNtbGhiR2w2WlhKVVpYTjBVSEp2ZEc5R2FXeGxTQUU9IikpOw0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgYXNzaWduZXIgPSBkZWxlZ2F0ZShwYmQ6OkZpbGVEZXNjcmlwdG9yIHJvb3QpIHsNCisgICAgICAgIGRlc2NyaXB0b3IgPSByb290Ow0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0WG1sQ2hpbGRfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFhtbENoaWxkX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sQ2hpbGQsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxDaGlsZC5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxDaGlsZF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIk9wdGlvbnMiLCAiQmluYXJ5IiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxOb0ZpZWxkc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0WG1sTm9GaWVsZHNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxOb0ZpZWxkcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbE5vRmllbGRzLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFhtbE5vRmllbGRzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFhtbFJlc2N1cnNpdmVfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFhtbFJlc2N1cnNpdmVfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxSZXNjdXJzaXZlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sUmVzY3Vyc2l2ZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxSZXNjdXJzaXZlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQ2hpbGQiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFhtbE1lc3NhZ2VfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1szXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFhtbE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTWVzc2FnZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxNZXNzYWdlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiTnVtYmVyIiwgIk51bWJlcnMiLCAiVGV4dCIsICJUZXh0bGluZXMiLCAiVmFsaWQiLCAiQ2hpbGQiLCAiQ2hpbGRyZW4iLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFhtbE1lc3NhZ2VfQ2hpbGRyZW5fX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxNZXNzYWdlX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0WG1sTWVzc2FnZV9DaGlsZHJlbl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbE1lc3NhZ2UuVHlwZXMuQ2hpbGRyZW4sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxNZXNzYWdlLlR5cGVzLkNoaWxkcmVuLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFhtbE1lc3NhZ2VfQ2hpbGRyZW5fX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJPcHRpb25zIiwgIkJpbmFyeSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0WG1sRXh0ZW5zaW9uX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbNF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxFeHRlbnNpb25fX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxFeHRlbnNpb24sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxFeHRlbnNpb24uQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0WG1sRXh0ZW5zaW9uX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiTnVtYmVyIiwgfSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvbkVudW0gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkVudW1PcHRpb25zPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1swXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvblRleHQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25OdW1iZXIgPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25NZXNzYWdlID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sRXh0ZW5zaW9uPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szXSk7DQorICAgICAgICBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICByZXR1cm4gcmVnaXN0cnk7DQorICAgICAgfTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbShkZXNjcmlwdG9yRGF0YSwNCisgICAgICAgICAgbmV3IHBiZDo6RmlsZURlc2NyaXB0b3JbXSB7DQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuRGVzY3JpcHRvciwgDQorICAgICAgICAgIH0sIGFzc2lnbmVyKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgfQ0KKyAgI3JlZ2lvbiBFbnVtcw0KKyAgcHVibGljIGVudW0gRW51bU9wdGlvbnMgew0KKyAgICBPTkUgPSAwLA0KKyAgICBUV08gPSAxLA0KKyAgICBUSFJFRSA9IDIsDQorICB9DQorICANCisgICNlbmRyZWdpb24NCisgIA0KKyAgI3JlZ2lvbiBNZXNzYWdlcw0KKyAgW2dsb2JhbDo6U3lzdGVtLlNlcmlhbGl6YWJsZUF0dHJpYnV0ZSgpXQ0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0WG1sQ2hpbGQgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0WG1sQ2hpbGQsIFRlc3RYbWxDaGlsZC5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdFhtbENoaWxkKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RYbWxDaGlsZCBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFhtbENoaWxkKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0WG1sQ2hpbGRGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImJpbmFyeSIsICJvcHRpb25zIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RYbWxDaGlsZEZpZWxkVGFncyA9IG5ldyB1aW50W10geyAzNCwgMjQgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sQ2hpbGQgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0WG1sQ2hpbGQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFhtbENoaWxkIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0WG1sQ2hpbGRfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdFhtbENoaWxkLCBUZXN0WG1sQ2hpbGQuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0WG1sQ2hpbGRfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbnNGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRW51bU9wdGlvbnM+IG9wdGlvbnNfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkVudW1PcHRpb25zPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5FbnVtT3B0aW9ucz4gT3B0aW9uc0xpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkob3B0aW9uc18pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBPcHRpb25zQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25zXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5FbnVtT3B0aW9ucyBHZXRPcHRpb25zKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBvcHRpb25zX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQmluYXJ5RmllbGROdW1iZXIgPSA0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzQmluYXJ5Ow0KKyAgICBwcml2YXRlIHBiOjpCeXRlU3RyaW5nIGJpbmFyeV8gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsNCisgICAgcHVibGljIGJvb2wgSGFzQmluYXJ5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQmluYXJ5OyB9DQorICAgIH0NCisgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIEJpbmFyeSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGJpbmFyeV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RYbWxDaGlsZEZpZWxkTmFtZXM7DQorICAgICAgaWYgKG9wdGlvbnNfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bUFycmF5KDMsIGZpZWxkX25hbWVzWzFdLCBvcHRpb25zXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNCaW5hcnkpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKDQsIGZpZWxkX25hbWVzWzBdLCBCaW5hcnkpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGlmIChvcHRpb25zXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRW51bU9wdGlvbnMgZWxlbWVudCBpbiBvcHRpb25zXykgew0KKyAgICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemVOb1RhZygoaW50KSBlbGVtZW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICBzaXplICs9IDEgKiBvcHRpb25zXy5Db3VudDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKGhhc0JpbmFyeSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJ5dGVzU2l6ZSg0LCBCaW5hcnkpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sQ2hpbGQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbENoaWxkIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxDaGlsZCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbENoaWxkIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sQ2hpbGQgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbENoaWxkIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxDaGlsZCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sQ2hpbGQgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbENoaWxkIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxDaGlsZCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0WG1sQ2hpbGQgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIG9wdGlvbnNfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdFhtbENoaWxkIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uU2VyaWFsaXphYmxlQXR0cmlidXRlKCldDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdFhtbENoaWxkLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0WG1sQ2hpbGQgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0WG1sQ2hpbGQgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdFhtbENoaWxkIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFhtbENoaWxkIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFhtbENoaWxkKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0WG1sQ2hpbGQgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sQ2hpbGQuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFhtbENoaWxkIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxDaGlsZC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RYbWxDaGlsZCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFhtbENoaWxkKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RYbWxDaGlsZCkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RYbWxDaGlsZCBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxDaGlsZC5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5vcHRpb25zXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5vcHRpb25zXy5BZGQob3RoZXIub3B0aW9uc18pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0JpbmFyeSkgew0KKyAgICAgICAgICBCaW5hcnkgPSBvdGhlci5CaW5hcnk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0WG1sQ2hpbGRGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFhtbENoaWxkRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI2Og0KKyAgICAgICAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgICAgICAgIHNjZzo6SUNvbGxlY3Rpb248b2JqZWN0PiB1bmtub3duSXRlbXM7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRW51bUFycmF5PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkVudW1PcHRpb25zPih0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5vcHRpb25zXywgb3V0IHVua25vd25JdGVtcyk7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkl0ZW1zICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgcmF3VmFsdWUgaW4gdW5rbm93bkl0ZW1zKQ0KKyAgICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZSBpcyBpbnQpDQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoMywgKHVsb25nKShpbnQpcmF3VmFsdWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNCaW5hcnkgPSBpbnB1dC5SZWFkQnl0ZXMocmVmIHJlc3VsdC5iaW5hcnlfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkVudW1PcHRpb25zPiBPcHRpb25zTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5vcHRpb25zXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IE9wdGlvbnNDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbnNDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRW51bU9wdGlvbnMgR2V0T3B0aW9ucyhpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0T3B0aW9ucyhpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbnMoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5FbnVtT3B0aW9ucyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25zX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRPcHRpb25zKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkVudW1PcHRpb25zIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbnNfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VPcHRpb25zKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRW51bU9wdGlvbnM+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25zXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbnMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbnNfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQmluYXJ5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQmluYXJ5OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBCaW5hcnkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5CaW5hcnk7IH0NCisgICAgICAgIHNldCB7IFNldEJpbmFyeSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QmluYXJ5KHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNCaW5hcnkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmJpbmFyeV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckJpbmFyeSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmluYXJ5ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuYmluYXJ5XyA9IHBiOjpCeXRlU3RyaW5nLkVtcHR5Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0WG1sQ2hpbGQoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGVBdHRyaWJ1dGUoKV0NCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFhtbE5vRmllbGRzIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdFhtbE5vRmllbGRzLCBUZXN0WG1sTm9GaWVsZHMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RYbWxOb0ZpZWxkcygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0WG1sTm9GaWVsZHMgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RYbWxOb0ZpZWxkcygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFhtbE5vRmllbGRzRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RYbWxOb0ZpZWxkc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyAgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sTm9GaWVsZHMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0WG1sTm9GaWVsZHMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFhtbE5vRmllbGRzIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0WG1sTm9GaWVsZHNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdFhtbE5vRmllbGRzLCBUZXN0WG1sTm9GaWVsZHMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0WG1sTm9GaWVsZHNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFhtbE5vRmllbGRzRmllbGROYW1lczsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbE5vRmllbGRzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxOb0ZpZWxkcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sTm9GaWVsZHMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxOb0ZpZWxkcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbE5vRmllbGRzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxOb0ZpZWxkcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sTm9GaWVsZHMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbE5vRmllbGRzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxOb0ZpZWxkcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sTm9GaWVsZHMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdFhtbE5vRmllbGRzIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RYbWxOb0ZpZWxkcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLlNlcmlhbGl6YWJsZUF0dHJpYnV0ZSgpXQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RYbWxOb0ZpZWxkcywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdFhtbE5vRmllbGRzIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdFhtbE5vRmllbGRzIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RYbWxOb0ZpZWxkcyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RYbWxOb0ZpZWxkcyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RYbWxOb0ZpZWxkcygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFhtbE5vRmllbGRzIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbE5vRmllbGRzLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RYbWxOb0ZpZWxkcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTm9GaWVsZHMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0WG1sTm9GaWVsZHMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RYbWxOb0ZpZWxkcykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0WG1sTm9GaWVsZHMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0WG1sTm9GaWVsZHMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTm9GaWVsZHMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0WG1sTm9GaWVsZHNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFhtbE5vRmllbGRzRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdFhtbE5vRmllbGRzKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uU2VyaWFsaXphYmxlQXR0cmlidXRlKCldDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RYbWxSZXNjdXJzaXZlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdFhtbFJlc2N1cnNpdmUsIFRlc3RYbWxSZXNjdXJzaXZlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0WG1sUmVzY3Vyc2l2ZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0WG1sUmVzY3Vyc2l2ZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFhtbFJlc2N1cnNpdmUoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RYbWxSZXNjdXJzaXZlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJjaGlsZCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0WG1sUmVzY3Vyc2l2ZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxSZXNjdXJzaXZlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFhtbFJlc2N1cnNpdmUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFhtbFJlc2N1cnNpdmUgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxSZXNjdXJzaXZlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RYbWxSZXNjdXJzaXZlLCBUZXN0WG1sUmVzY3Vyc2l2ZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxSZXNjdXJzaXZlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBDaGlsZEZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0NoaWxkOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxSZXNjdXJzaXZlIGNoaWxkXzsNCisgICAgcHVibGljIGJvb2wgSGFzQ2hpbGQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNDaGlsZDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sUmVzY3Vyc2l2ZSBDaGlsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGNoaWxkXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sUmVzY3Vyc2l2ZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RYbWxSZXNjdXJzaXZlRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzQ2hpbGQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMSwgZmllbGRfbmFtZXNbMF0sIENoaWxkKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNDaGlsZCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIENoaWxkKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbFJlc2N1cnNpdmUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbFJlc2N1cnNpdmUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbFJlc2N1cnNpdmUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxSZXNjdXJzaXZlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sUmVzY3Vyc2l2ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sUmVzY3Vyc2l2ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sUmVzY3Vyc2l2ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sUmVzY3Vyc2l2ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sUmVzY3Vyc2l2ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sUmVzY3Vyc2l2ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0WG1sUmVzY3Vyc2l2ZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0WG1sUmVzY3Vyc2l2ZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLlNlcmlhbGl6YWJsZUF0dHJpYnV0ZSgpXQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RYbWxSZXNjdXJzaXZlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0WG1sUmVzY3Vyc2l2ZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RYbWxSZXNjdXJzaXZlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RYbWxSZXNjdXJzaXZlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFhtbFJlc2N1cnNpdmUgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0WG1sUmVzY3Vyc2l2ZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFhtbFJlc2N1cnNpdmUgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sUmVzY3Vyc2l2ZS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0WG1sUmVzY3Vyc2l2ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sUmVzY3Vyc2l2ZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RYbWxSZXNjdXJzaXZlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0WG1sUmVzY3Vyc2l2ZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0WG1sUmVzY3Vyc2l2ZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RYbWxSZXNjdXJzaXZlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbFJlc2N1cnNpdmUuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzQ2hpbGQpIHsNCisgICAgICAgICAgTWVyZ2VDaGlsZChvdGhlci5DaGlsZCk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0WG1sUmVzY3Vyc2l2ZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0WG1sUmVzY3Vyc2l2ZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbFJlc2N1cnNpdmUuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbFJlc2N1cnNpdmUuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNDaGlsZCkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShDaGlsZCk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBDaGlsZCA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQ2hpbGQgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0NoaWxkOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sUmVzY3Vyc2l2ZSBDaGlsZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkNoaWxkOyB9DQorICAgICAgICBzZXQgeyBTZXRDaGlsZCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Q2hpbGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbFJlc2N1cnNpdmUgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0NoaWxkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5jaGlsZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRDaGlsZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sUmVzY3Vyc2l2ZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDaGlsZCA9IHRydWU7DQorICAgICAgICByZXN1bHQuY2hpbGRfID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VDaGlsZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sUmVzY3Vyc2l2ZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc0NoaWxkICYmDQorICAgICAgICAgICAgcmVzdWx0LmNoaWxkXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sUmVzY3Vyc2l2ZS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQuY2hpbGRfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbFJlc2N1cnNpdmUuQ3JlYXRlQnVpbGRlcihyZXN1bHQuY2hpbGRfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0LmNoaWxkXyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc0NoaWxkID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckNoaWxkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDaGlsZCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmNoaWxkXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RYbWxSZXNjdXJzaXZlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uU2VyaWFsaXphYmxlQXR0cmlidXRlKCldDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RYbWxNZXNzYWdlIDogcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RYbWxNZXNzYWdlLCBUZXN0WG1sTWVzc2FnZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdFhtbE1lc3NhZ2UoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdFhtbE1lc3NhZ2UgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RYbWxNZXNzYWdlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0WG1sTWVzc2FnZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiY2hpbGQiLCAiY2hpbGRyZW4iLCAibnVtYmVyIiwgIm51bWJlcnMiLCAidGV4dCIsICJ0ZXh0bGluZXMiLCAidmFsaWQiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFhtbE1lc3NhZ2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAsIDMyMTEsIDQ4LCAxNiwgMjYsIDU2MDIsIDQwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0WG1sTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0WG1sTWVzc2FnZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFhtbE1lc3NhZ2VfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdFhtbE1lc3NhZ2UsIFRlc3RYbWxNZXNzYWdlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFhtbE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgew0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGVBdHRyaWJ1dGUoKV0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBDaGlsZHJlbiA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPENoaWxkcmVuLCBDaGlsZHJlbi5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIENoaWxkcmVuKCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDaGlsZHJlbiBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQ2hpbGRyZW4oKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9jaGlsZHJlbkZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYmluYXJ5IiwgIm9wdGlvbnMiIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2NoaWxkcmVuRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDM0LCAyNCB9Ow0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDaGlsZHJlbiBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDaGlsZHJlbiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQ2hpbGRyZW4gVGhpc01lc3NhZ2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdFhtbE1lc3NhZ2VfQ2hpbGRyZW5fX0Rlc2NyaXB0b3I7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Q2hpbGRyZW4sIENoaWxkcmVuLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxNZXNzYWdlX0NoaWxkcmVuX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25zRmllbGROdW1iZXIgPSAzOw0KKyAgICAgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5FbnVtT3B0aW9ucz4gb3B0aW9uc18gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRW51bU9wdGlvbnM+KCk7DQorICAgICAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5FbnVtT3B0aW9ucz4gT3B0aW9uc0xpc3Qgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KG9wdGlvbnNfKTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBPcHRpb25zQ291bnQgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uc18uQ291bnQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5FbnVtT3B0aW9ucyBHZXRPcHRpb25zKGludCBpbmRleCkgew0KKyAgICAgICAgICByZXR1cm4gb3B0aW9uc19baW5kZXhdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEJpbmFyeUZpZWxkTnVtYmVyID0gNDsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNCaW5hcnk7DQorICAgICAgICBwcml2YXRlIHBiOjpCeXRlU3RyaW5nIGJpbmFyeV8gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0JpbmFyeSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNCaW5hcnk7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBCaW5hcnkgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gYmluYXJ5XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9jaGlsZHJlbkZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChvcHRpb25zXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVFbnVtQXJyYXkoMywgZmllbGRfbmFtZXNbMV0sIG9wdGlvbnNfKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzQmluYXJ5KSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlQnl0ZXMoNCwgZmllbGRfbmFtZXNbMF0sIEJpbmFyeSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgIA0KKyAgICAgICAgICBzaXplID0gMDsNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICAgICAgaWYgKG9wdGlvbnNfLkNvdW50ID4gMCkgew0KKyAgICAgICAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRW51bU9wdGlvbnMgZWxlbWVudCBpbiBvcHRpb25zXykgew0KKyAgICAgICAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplTm9UYWcoKGludCkgZWxlbWVudCk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICAgICAgc2l6ZSArPSAxICogb3B0aW9uc18uQ291bnQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNCaW5hcnkpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplKDQsIEJpbmFyeSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIENoaWxkcmVuIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIENoaWxkcmVuIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIENoaWxkcmVuIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDaGlsZHJlbiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hpbGRyZW4gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hpbGRyZW4gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hpbGRyZW4gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hpbGRyZW4gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hpbGRyZW4gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hpbGRyZW4gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgQ2hpbGRyZW4gTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICBvcHRpb25zXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihDaGlsZHJlbiBwcm90b3R5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPENoaWxkcmVuLCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKENoaWxkcmVuIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgQ2hpbGRyZW4gcmVzdWx0Ow0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBDaGlsZHJlbiBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgQ2hpbGRyZW4gb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQ2hpbGRyZW4oKTsNCisgICAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQ2hpbGRyZW4gTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbE1lc3NhZ2UuVHlwZXMuQ2hpbGRyZW4uRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ2hpbGRyZW4gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxNZXNzYWdlLlR5cGVzLkNoaWxkcmVuLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ2hpbGRyZW4gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGlzIENoaWxkcmVuKSB7DQorICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChDaGlsZHJlbikgb3RoZXIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShDaGlsZHJlbiBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbi5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgaWYgKG90aGVyLm9wdGlvbnNfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zXy5BZGQob3RoZXIub3B0aW9uc18pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzQmluYXJ5KSB7DQorICAgICAgICAgICAgICBCaW5hcnkgPSBvdGhlci5CaW5hcnk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2NoaWxkcmVuRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgICAgICB0YWcgPSBfY2hpbGRyZW5GaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAyNjoNCisgICAgICAgICAgICAgICAgY2FzZSAyNDogew0KKyAgICAgICAgICAgICAgICAgIHNjZzo6SUNvbGxlY3Rpb248b2JqZWN0PiB1bmtub3duSXRlbXM7DQorICAgICAgICAgICAgICAgICAgaW5wdXQuUmVhZEVudW1BcnJheTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5FbnVtT3B0aW9ucz4odGFnLCBmaWVsZF9uYW1lLCByZXN1bHQub3B0aW9uc18sIG91dCB1bmtub3duSXRlbXMpOw0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duSXRlbXMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgcmF3VmFsdWUgaW4gdW5rbm93bkl0ZW1zKQ0KKyAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3VmFsdWUgaXMgaW50KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgzLCAodWxvbmcpKGludClyYXdWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzQmluYXJ5ID0gaW5wdXQuUmVhZEJ5dGVzKHJlZiByZXN1bHQuYmluYXJ5Xyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRW51bU9wdGlvbnM+IE9wdGlvbnNMaXN0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5vcHRpb25zXzsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgT3B0aW9uc0NvdW50IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbnNDb3VudDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5FbnVtT3B0aW9ucyBHZXRPcHRpb25zKGludCBpbmRleCkgew0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuR2V0T3B0aW9ucyhpbmRleCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9ucyhpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkVudW1PcHRpb25zIHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uc19baW5kZXhdID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkT3B0aW9ucyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5FbnVtT3B0aW9ucyB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnNfLkFkZCh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VPcHRpb25zKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRW51bU9wdGlvbnM+IHZhbHVlcykgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnNfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9ucygpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zXy5DbGVhcigpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNCaW5hcnkgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQmluYXJ5OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIEJpbmFyeSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5CaW5hcnk7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRCaW5hcnkodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QmluYXJ5KHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNCaW5hcnkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5iaW5hcnlfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJCaW5hcnkoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQmluYXJ5ID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmJpbmFyeV8gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIENoaWxkcmVuKCkgew0KKyAgICAgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTnVtYmVyRmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzTnVtYmVyOw0KKyAgICBwcml2YXRlIGxvbmcgbnVtYmVyXzsNCisgICAgcHVibGljIGJvb2wgSGFzTnVtYmVyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTnVtYmVyOyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgTnVtYmVyIHsNCisgICAgICBnZXQgeyByZXR1cm4gbnVtYmVyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE51bWJlcnNGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiBudW1iZXJzXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gTnVtYmVyc0xpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkobnVtYmVyc18pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBOdW1iZXJzQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBudW1iZXJzXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgR2V0TnVtYmVycyhpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gbnVtYmVyc19baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFRleHRGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNUZXh0Ow0KKyAgICBwcml2YXRlIHN0cmluZyB0ZXh0XyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNUZXh0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzVGV4dDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgVGV4dCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRleHRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVGV4dGxpbmVzRmllbGROdW1iZXIgPSA3MDA7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiB0ZXh0bGluZXNfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBUZXh0bGluZXNMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHRleHRsaW5lc18pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBUZXh0bGluZXNDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRleHRsaW5lc18uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEdldFRleHRsaW5lcyhpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdGV4dGxpbmVzX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVmFsaWRGaWVsZE51bWJlciA9IDU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNWYWxpZDsNCisgICAgcHJpdmF0ZSBib29sIHZhbGlkXzsNCisgICAgcHVibGljIGJvb2wgSGFzVmFsaWQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNWYWxpZDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIFZhbGlkIHsNCisgICAgICBnZXQgeyByZXR1cm4gdmFsaWRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQ2hpbGRGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNDaGlsZDsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sQ2hpbGQgY2hpbGRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNDaGlsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0NoaWxkOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxDaGlsZCBDaGlsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGNoaWxkXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sQ2hpbGQuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQ2hpbGRyZW5GaWVsZE51bWJlciA9IDQwMTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbj4gY2hpbGRyZW5fID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxNZXNzYWdlLlR5cGVzLkNoaWxkcmVuPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbj4gQ2hpbGRyZW5MaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gY2hpbGRyZW5fOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBDaGlsZHJlbkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gY2hpbGRyZW5fLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxNZXNzYWdlLlR5cGVzLkNoaWxkcmVuIEdldENoaWxkcmVuKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBjaGlsZHJlbl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaWYgKCFFeHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RYbWxNZXNzYWdlRmllbGROYW1lczsNCisgICAgICBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8VGVzdFhtbE1lc3NhZ2UsIFRlc3RYbWxNZXNzYWdlLkJ1aWxkZXI+LkV4dGVuc2lvbldyaXRlciBleHRlbnNpb25Xcml0ZXIgPSBDcmVhdGVFeHRlbnNpb25Xcml0ZXIodGhpcyk7DQorICAgICAgaWYgKGhhc0NoaWxkKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDEsIGZpZWxkX25hbWVzWzBdLCBDaGlsZCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChudW1iZXJzXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyQXJyYXkoMiwgZmllbGRfbmFtZXNbM10sIG51bWJlcnNfKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1RleHQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygzLCBmaWVsZF9uYW1lc1s0XSwgVGV4dCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNWYWxpZCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCg1LCBmaWVsZF9uYW1lc1s2XSwgVmFsaWQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTnVtYmVyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NCg2LCBmaWVsZF9uYW1lc1syXSwgTnVtYmVyKTsNCisgICAgICB9DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoMjAwLCBvdXRwdXQpOw0KKyAgICAgIGlmIChjaGlsZHJlbl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVHcm91cEFycmF5KDQwMSwgZmllbGRfbmFtZXNbMV0sIGNoaWxkcmVuXyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh0ZXh0bGluZXNfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoNzAwLCBmaWVsZF9uYW1lc1s1XSwgdGV4dGxpbmVzXyk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzTnVtYmVyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKDYsIE51bWJlcik7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChpbnQgZWxlbWVudCBpbiBOdW1iZXJzTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMSAqIG51bWJlcnNfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzVGV4dCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMywgVGV4dCk7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChzdHJpbmcgZWxlbWVudCBpbiBUZXh0bGluZXNMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHRleHRsaW5lc18uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNWYWxpZCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDUsIFZhbGlkKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0NoaWxkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMSwgQ2hpbGQpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbiBlbGVtZW50IGluIENoaWxkcmVuTGlzdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUdyb3VwU2l6ZSg0MDEsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IEV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZTsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sTWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbE1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RYbWxNZXNzYWdlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICBudW1iZXJzXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB0ZXh0bGluZXNfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIGNoaWxkcmVuXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RYbWxNZXNzYWdlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uU2VyaWFsaXphYmxlQXR0cmlidXRlKCldDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkV4dGVuZGFibGVCdWlsZGVyPFRlc3RYbWxNZXNzYWdlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0WG1sTWVzc2FnZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RYbWxNZXNzYWdlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RYbWxNZXNzYWdlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFhtbE1lc3NhZ2Ugb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0WG1sTWVzc2FnZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFhtbE1lc3NhZ2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTWVzc2FnZS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0WG1sTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RYbWxNZXNzYWdlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0WG1sTWVzc2FnZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0WG1sTWVzc2FnZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RYbWxNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzTnVtYmVyKSB7DQorICAgICAgICAgIE51bWJlciA9IG90aGVyLk51bWJlcjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5udW1iZXJzXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5udW1iZXJzXy5BZGQob3RoZXIubnVtYmVyc18pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1RleHQpIHsNCisgICAgICAgICAgVGV4dCA9IG90aGVyLlRleHQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudGV4dGxpbmVzXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC50ZXh0bGluZXNfLkFkZChvdGhlci50ZXh0bGluZXNfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNWYWxpZCkgew0KKyAgICAgICAgICBWYWxpZCA9IG90aGVyLlZhbGlkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0NoaWxkKSB7DQorICAgICAgICAgIE1lcmdlQ2hpbGQob3RoZXIuQ2hpbGQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLmNoaWxkcmVuXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5jaGlsZHJlbl8uQWRkKG90aGVyLmNoaWxkcmVuXyk7DQorICAgICAgICB9DQorICAgICAgICAgIHRoaXMuTWVyZ2VFeHRlbnNpb25GaWVsZHMob3RoZXIpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdFhtbE1lc3NhZ2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFhtbE1lc3NhZ2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxDaGlsZC5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sQ2hpbGQuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNDaGlsZCkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShDaGlsZCk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBDaGlsZCA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODoNCisgICAgICAgICAgICBjYXNlIDE2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5udW1iZXJzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1RleHQgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQudGV4dF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNWYWxpZCA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQudmFsaWRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQ4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTnVtYmVyID0gaW5wdXQuUmVhZEludDY0KHJlZiByZXN1bHQubnVtYmVyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzMjExOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkR3JvdXBBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5jaGlsZHJlbl8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxNZXNzYWdlLlR5cGVzLkNoaWxkcmVuLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTYwMjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnRleHRsaW5lc18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc051bWJlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc051bWJlcjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBOdW1iZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OdW1iZXI7IH0NCisgICAgICAgIHNldCB7IFNldE51bWJlcih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TnVtYmVyKGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTnVtYmVyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5udW1iZXJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOdW1iZXIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc051bWJlciA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm51bWJlcl8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gTnVtYmVyc0xpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkubnVtYmVyc187IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBOdW1iZXJzQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OdW1iZXJzQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXROdW1iZXJzKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXROdW1iZXJzKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TnVtYmVycyhpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5udW1iZXJzX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGROdW1iZXJzKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5udW1iZXJzXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlTnVtYmVycyhzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lm51bWJlcnNfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTnVtYmVycygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubnVtYmVyc18uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNUZXh0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzVGV4dDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIFRleHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5UZXh0OyB9DQorICAgICAgICBzZXQgeyBTZXRUZXh0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRUZXh0KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzVGV4dCA9IHRydWU7DQorICAgICAgICByZXN1bHQudGV4dF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclRleHQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1RleHQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC50ZXh0XyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBUZXh0bGluZXNMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnRleHRsaW5lc187IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBUZXh0bGluZXNDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlRleHRsaW5lc0NvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgR2V0VGV4dGxpbmVzKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRUZXh0bGluZXMoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRUZXh0bGluZXMoaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnRleHRsaW5lc19baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVGV4dGxpbmVzKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudGV4dGxpbmVzXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVGV4dGxpbmVzKHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudGV4dGxpbmVzXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclRleHRsaW5lcygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudGV4dGxpbmVzXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1ZhbGlkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzVmFsaWQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgVmFsaWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5WYWxpZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0VmFsaWQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFZhbGlkKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzVmFsaWQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnZhbGlkXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVmFsaWQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ZhbGlkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQudmFsaWRfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQ2hpbGQgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0NoaWxkOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sQ2hpbGQgQ2hpbGQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5DaGlsZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Q2hpbGQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldENoaWxkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxDaGlsZCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQ2hpbGQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmNoaWxkXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldENoaWxkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxDaGlsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDaGlsZCA9IHRydWU7DQorICAgICAgICByZXN1bHQuY2hpbGRfID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VDaGlsZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sQ2hpbGQgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNDaGlsZCAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5jaGlsZF8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbENoaWxkLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5jaGlsZF8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sQ2hpbGQuQ3JlYXRlQnVpbGRlcihyZXN1bHQuY2hpbGRfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0LmNoaWxkXyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc0NoaWxkID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckNoaWxkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDaGlsZCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmNoaWxkXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbj4gQ2hpbGRyZW5MaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmNoaWxkcmVuXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IENoaWxkcmVuQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5DaGlsZHJlbkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbiBHZXRDaGlsZHJlbihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0Q2hpbGRyZW4oaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRDaGlsZHJlbihpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxNZXNzYWdlLlR5cGVzLkNoaWxkcmVuIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5jaGlsZHJlbl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Q2hpbGRyZW4oaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbi5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5jaGlsZHJlbl9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkQ2hpbGRyZW4oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbE1lc3NhZ2UuVHlwZXMuQ2hpbGRyZW4gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmNoaWxkcmVuXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZENoaWxkcmVuKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RYbWxNZXNzYWdlLlR5cGVzLkNoaWxkcmVuLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmNoaWxkcmVuXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlQ2hpbGRyZW4oc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbj4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmNoaWxkcmVuXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckNoaWxkcmVuKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5jaGlsZHJlbl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdFhtbE1lc3NhZ2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGVBdHRyaWJ1dGUoKV0NCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFhtbEV4dGVuc2lvbiA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RYbWxFeHRlbnNpb24sIFRlc3RYbWxFeHRlbnNpb24uQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RYbWxFeHRlbnNpb24oKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdFhtbEV4dGVuc2lvbiBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFhtbEV4dGVuc2lvbigpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFhtbEV4dGVuc2lvbkZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAibnVtYmVyIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RYbWxFeHRlbnNpb25GaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxFeHRlbnNpb24gRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0WG1sRXh0ZW5zaW9uIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RYbWxFeHRlbnNpb24gVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxFeHRlbnNpb25fX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdFhtbEV4dGVuc2lvbiwgVGVzdFhtbEV4dGVuc2lvbi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RYbWxFeHRlbnNpb25fX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE51bWJlckZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc051bWJlcjsNCisgICAgcHJpdmF0ZSBpbnQgbnVtYmVyXzsNCisgICAgcHVibGljIGJvb2wgSGFzTnVtYmVyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTnVtYmVyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBOdW1iZXIgew0KKyAgICAgIGdldCB7IHJldHVybiBudW1iZXJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIWhhc051bWJlcikgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFhtbEV4dGVuc2lvbkZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc051bWJlcikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIE51bWJlcik7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzTnVtYmVyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIE51bWJlcik7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxFeHRlbnNpb24gUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbEV4dGVuc2lvbiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sRXh0ZW5zaW9uIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sRXh0ZW5zaW9uIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sRXh0ZW5zaW9uIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxFeHRlbnNpb24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbEV4dGVuc2lvbiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0WG1sRXh0ZW5zaW9uIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RYbWxFeHRlbnNpb24gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFhtbEV4dGVuc2lvbiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0WG1sRXh0ZW5zaW9uIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RYbWxFeHRlbnNpb24gcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGVBdHRyaWJ1dGUoKV0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0WG1sRXh0ZW5zaW9uLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0WG1sRXh0ZW5zaW9uIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdFhtbEV4dGVuc2lvbiByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0WG1sRXh0ZW5zaW9uIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFhtbEV4dGVuc2lvbiBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RYbWxFeHRlbnNpb24oKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RYbWxFeHRlbnNpb24gTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sRXh0ZW5zaW9uLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RYbWxFeHRlbnNpb24gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFhtbEV4dGVuc2lvbi5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RYbWxFeHRlbnNpb24gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RYbWxFeHRlbnNpb24pIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdFhtbEV4dGVuc2lvbikgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RYbWxFeHRlbnNpb24gb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0WG1sRXh0ZW5zaW9uLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc051bWJlcikgew0KKyAgICAgICAgICBOdW1iZXIgPSBvdGhlci5OdW1iZXI7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0WG1sRXh0ZW5zaW9uRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RYbWxFeHRlbnNpb25GaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc051bWJlciA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0Lm51bWJlcl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc051bWJlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc051bWJlcjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IE51bWJlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk51bWJlcjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TnVtYmVyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROdW1iZXIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc051bWJlciA9IHRydWU7DQorICAgICAgICByZXN1bHQubnVtYmVyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTnVtYmVyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOdW1iZXIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5udW1iZXJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdFhtbEV4dGVuc2lvbigpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorfQ0KKw0KKyNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RSZWFkZXJGb3JVcmxFbmNvZGVkLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UmVhZGVyRm9yVXJsRW5jb2RlZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzQzZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UmVhZGVyRm9yVXJsRW5jb2RlZC5jcwpAQCAtMCwwICsxLDg0IEBACit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLklPOw0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uSHR0cDsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIFRlc3RSZWFkZXJGb3JVcmxFbmNvZGVkDQorICAgIHsNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRXhhbXBsZV9Gcm9tUXVlcnlTdHJpbmcoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFVyaSBzYW1wbGVVcmkgPSBuZXcgVXJpKCJodHRwOi8vc2FtcGxlLmNvbS9QYXRoL0ZpbGUuZXh0P3RleHQ9dHdvK3RocmVlJTIwZm91ciZ2YWxpZD10cnVlJm51bWJlcnM9MSZudW1iZXJzPTIiLCBVcmlLaW5kLkFic29sdXRlKTsNCisNCisgICAgICAgICAgICBJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IEZvcm1VcmxFbmNvZGVkUmVhZGVyLkNyZWF0ZUluc3RhbmNlKHNhbXBsZVVyaS5RdWVyeSk7DQorDQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0gVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuTWVyZ2VGcm9tKGlucHV0KTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBtZXNzYWdlID0gYnVpbGRlci5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0cnVlLCBtZXNzYWdlLlZhbGlkKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInR3byB0aHJlZSBmb3VyIiwgbWVzc2FnZS5UZXh0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5OdW1iZXJzQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBtZXNzYWdlLk51bWJlcnNMaXN0WzBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5OdW1iZXJzTGlzdFsxXSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEV4YW1wbGVfRnJvbUZvcm1EYXRhKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBTdHJlYW0gcmF3UG9zdCA9IG5ldyBNZW1vcnlTdHJlYW0oRW5jb2RpbmcuVVRGOC5HZXRCeXRlcygidGV4dD10d28rdGhyZWUlMjBmb3VyJnZhbGlkPXRydWUmbnVtYmVycz0xJm51bWJlcnM9MiIpLCBmYWxzZSk7DQorDQorICAgICAgICAgICAgSUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBGb3JtVXJsRW5jb2RlZFJlYWRlci5DcmVhdGVJbnN0YW5jZShyYXdQb3N0KTsNCisNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgYnVpbGRlci5NZXJnZUZyb20oaW5wdXQpOw0KKw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsIG1lc3NhZ2UuVmFsaWQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgidHdvIHRocmVlIGZvdXIiLCBtZXNzYWdlLlRleHQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLk51bWJlcnNDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG1lc3NhZ2UuTnVtYmVyc0xpc3RbMF0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLk51bWJlcnNMaXN0WzFdKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEVtcHR5VmFsdWVzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IEZvcm1VcmxFbmNvZGVkUmVhZGVyLkNyZWF0ZUluc3RhbmNlKCJ2YWxpZD10cnVlJnRleHQ9Jm51bWJlcnM9MSIpOw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBidWlsZGVyLk1lcmdlRnJvbShpbnB1dCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShidWlsZGVyLlZhbGlkKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGJ1aWxkZXIuSGFzVGV4dCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIiLCBidWlsZGVyLlRleHQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBidWlsZGVyLk51bWJlcnNDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGJ1aWxkZXIuTnVtYmVyc0xpc3RbMF0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0Tm9WYWx1ZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgSUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBGb3JtVXJsRW5jb2RlZFJlYWRlci5DcmVhdGVJbnN0YW5jZSgidmFsaWQ9dHJ1ZSZ0ZXh0Jm51bWJlcnM9MSIpOw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBidWlsZGVyLk1lcmdlRnJvbShpbnB1dCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShidWlsZGVyLlZhbGlkKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGJ1aWxkZXIuSGFzVGV4dCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIiLCBidWlsZGVyLlRleHQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBidWlsZGVyLk51bWJlcnNDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGJ1aWxkZXIuTnVtYmVyc0xpc3RbMF0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihOb3RTdXBwb3J0ZWRFeGNlcHRpb24pKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIEZvcm1VcmxFbmNvZGVkUmVhZGVyRG9lc05vdFN1cHBvcnRDaGlsZHJlbigpDQorICAgICAgICB7DQorICAgICAgICAgICAgSUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBGb3JtVXJsRW5jb2RlZFJlYWRlci5DcmVhdGVJbnN0YW5jZSgiY2hpbGQ9dWgwIik7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCk7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UmVzb3VyY2VzLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UmVzb3VyY2VzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NzhjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RSZXNvdXJjZXMuY3MKQEAgLTAsMCArMSwyOTQgQEAKK++7v25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBpbnRlcm5hbCBjbGFzcyBUZXN0UmVzb3VyY2VzDQorICAgIHsNCisgICAgICAgICNyZWdpb24gZ29sZGVuX21lc3NhZ2UNCisgICAgICAgIGludGVybmFsIHN0YXRpYyBieXRlW10gZ29sZGVuX21lc3NhZ2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKEAiDQorQ0dVUVpoaG5JR2dvMGdFdzFBRTlhd0FBQUVGc0FBQUFBQUFBQUUxdEFBQUFVVzRBQUFBQUFBQUFYUUFBM2tKaEFBQUFBQUFBWEVCbw0KK0FYSURNVEUxZWdNeE1UYURBWWdCZFlRQmtnRUNDSGFhQVFJSWQ2SUJBZ2g0cUFFRHNBRUd1QUVKd2dFRE1USTB5Z0VETVRJMStBSEoNCitBZmdCclFLQUFzb0JnQUt1QW9nQ3l3R0lBcThDa0FMTUFaQUNzQUtZQXBvRG1BTGlCS0FDbkFPZ0F1UUVyUUxQQUFBQXJRSXpBUUFBDQorc1FMUUFBQUFBQUFBQUxFQ05BRUFBQUFBQUFDOUF0RUFBQUM5QWpVQkFBREJBdElBQUFBQUFBQUF3UUkyQVFBQUFBQUFBTTBDQUFCVA0KK1E4MENBSUNiUTlFQ0FBQUFBQUNBYWtEUkFnQUFBQUFBZ0hOQTJBSUIyQUlBNGdJRE1qRTE0Z0lETXpFMTZnSURNakUyNmdJRE16RTINCis4d0w0QXRrQjlBTHpBdmdDdlFMMEFvSURBd2phQVlJREF3aStBb29EQXdqYkFZb0RBd2kvQXBJREF3amNBWklEQXdqQUFwZ0RBcGdEDQorQTZBREJhQURCcWdEQ0tnRENiSURBekl5TkxJREF6TXlOTG9EQXpJeU5ib0RBek15TmVnRGtRUHdBNUlEK0FPVEE0QUVsQU9JQktvRw0KK2tBU3NCcDBFbHdFQUFLRUVtQUVBQUFBQUFBQ3RCSmtCQUFDeEJKb0JBQUFBQUFBQXZRUUFnTTFEd1FRQUFBQUFBTUI1UU1nRUFOSUUNCitBelF4TmRvRUF6UXhOb2dGQVpBRkJKZ0ZCNklGQXpReU5Lb0ZBelF5TlE9PQ0KKyIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgICNyZWdpb24gZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZQ0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJ5dGVbXSBnb2xkZW5fcGFja2VkX2ZpZWxkc19tZXNzYWdlDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhAIg0KKzBnVUUyUVM5QmRvRkJOb0V2Z1hpQlFUYkJMOEY2Z1VFM0FUQUJmSUZCTG9KZ2d2NkJRUzhDWVFMZ2dZSVh3SUFBTU1DQUFDS0JoQmcNCitBZ0FBQUFBQUFNUUNBQUFBQUFBQWtnWUlZUUlBQU1VQ0FBQ2FCaEJpQWdBQUFBQUFBTVlDQUFBQUFBQUFvZ1lJQU1BWVJBREFNVVNxDQorQmhBQUFBQUFBQ0NEUUFBQUFBQUFRSVpBc2dZQ0FRQzZCZ0lGQmc9PQ0KKyIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgICNyZWdpb24gdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YQ0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyB0ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gQCINCitvcHRpb25hbF9pbnQzMjogMTAxDQorb3B0aW9uYWxfaW50NjQ6IDEwMg0KK29wdGlvbmFsX3VpbnQzMjogMTAzDQorb3B0aW9uYWxfdWludDY0OiAxMDQNCitvcHRpb25hbF9zaW50MzI6IDEwNQ0KK29wdGlvbmFsX3NpbnQ2NDogMTA2DQorb3B0aW9uYWxfZml4ZWQzMjogMTA3DQorb3B0aW9uYWxfZml4ZWQ2NDogMTA4DQorb3B0aW9uYWxfc2ZpeGVkMzI6IDEwOQ0KK29wdGlvbmFsX3NmaXhlZDY0OiAxMTANCitvcHRpb25hbF9mbG9hdDogMTExDQorb3B0aW9uYWxfZG91YmxlOiAxMTINCitvcHRpb25hbF9ib29sOiB0cnVlDQorb3B0aW9uYWxfc3RyaW5nOiAiIjExNSIiDQorb3B0aW9uYWxfYnl0ZXM6ICIiMTE2IiINCitPcHRpb25hbEdyb3VwIHsNCisgIGE6IDExNw0KK30NCitvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7DQorICBiYjogMTE4DQorfQ0KK29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSB7DQorICBjOiAxMTkNCit9DQorb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2Ugew0KKyAgZDogMTIwDQorfQ0KK29wdGlvbmFsX25lc3RlZF9lbnVtOiBCQVoNCitvcHRpb25hbF9mb3JlaWduX2VudW06IEZPUkVJR05fQkFaDQorb3B0aW9uYWxfaW1wb3J0X2VudW06IElNUE9SVF9CQVoNCitvcHRpb25hbF9zdHJpbmdfcGllY2U6ICIiMTI0IiINCitvcHRpb25hbF9jb3JkOiAiIjEyNSIiDQorcmVwZWF0ZWRfaW50MzI6IDIwMQ0KK3JlcGVhdGVkX2ludDMyOiAzMDENCityZXBlYXRlZF9pbnQ2NDogMjAyDQorcmVwZWF0ZWRfaW50NjQ6IDMwMg0KK3JlcGVhdGVkX3VpbnQzMjogMjAzDQorcmVwZWF0ZWRfdWludDMyOiAzMDMNCityZXBlYXRlZF91aW50NjQ6IDIwNA0KK3JlcGVhdGVkX3VpbnQ2NDogMzA0DQorcmVwZWF0ZWRfc2ludDMyOiAyMDUNCityZXBlYXRlZF9zaW50MzI6IDMwNQ0KK3JlcGVhdGVkX3NpbnQ2NDogMjA2DQorcmVwZWF0ZWRfc2ludDY0OiAzMDYNCityZXBlYXRlZF9maXhlZDMyOiAyMDcNCityZXBlYXRlZF9maXhlZDMyOiAzMDcNCityZXBlYXRlZF9maXhlZDY0OiAyMDgNCityZXBlYXRlZF9maXhlZDY0OiAzMDgNCityZXBlYXRlZF9zZml4ZWQzMjogMjA5DQorcmVwZWF0ZWRfc2ZpeGVkMzI6IDMwOQ0KK3JlcGVhdGVkX3NmaXhlZDY0OiAyMTANCityZXBlYXRlZF9zZml4ZWQ2NDogMzEwDQorcmVwZWF0ZWRfZmxvYXQ6IDIxMQ0KK3JlcGVhdGVkX2Zsb2F0OiAzMTENCityZXBlYXRlZF9kb3VibGU6IDIxMg0KK3JlcGVhdGVkX2RvdWJsZTogMzEyDQorcmVwZWF0ZWRfYm9vbDogdHJ1ZQ0KK3JlcGVhdGVkX2Jvb2w6IGZhbHNlDQorcmVwZWF0ZWRfc3RyaW5nOiAiIjIxNSIiDQorcmVwZWF0ZWRfc3RyaW5nOiAiIjMxNSIiDQorcmVwZWF0ZWRfYnl0ZXM6ICIiMjE2IiINCityZXBlYXRlZF9ieXRlczogIiIzMTYiIg0KK1JlcGVhdGVkR3JvdXAgew0KKyAgYTogMjE3DQorfQ0KK1JlcGVhdGVkR3JvdXAgew0KKyAgYTogMzE3DQorfQ0KK3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsNCisgIGJiOiAyMTgNCit9DQorcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Ugew0KKyAgYmI6IDMxOA0KK30NCityZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Ugew0KKyAgYzogMjE5DQorfQ0KK3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSB7DQorICBjOiAzMTkNCit9DQorcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Ugew0KKyAgZDogMjIwDQorfQ0KK3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIHsNCisgIGQ6IDMyMA0KK30NCityZXBlYXRlZF9uZXN0ZWRfZW51bTogQkFSDQorcmVwZWF0ZWRfbmVzdGVkX2VudW06IEJBWg0KK3JlcGVhdGVkX2ZvcmVpZ25fZW51bTogRk9SRUlHTl9CQVINCityZXBlYXRlZF9mb3JlaWduX2VudW06IEZPUkVJR05fQkFaDQorcmVwZWF0ZWRfaW1wb3J0X2VudW06IElNUE9SVF9CQVINCityZXBlYXRlZF9pbXBvcnRfZW51bTogSU1QT1JUX0JBWg0KK3JlcGVhdGVkX3N0cmluZ19waWVjZTogIiIyMjQiIg0KK3JlcGVhdGVkX3N0cmluZ19waWVjZTogIiIzMjQiIg0KK3JlcGVhdGVkX2NvcmQ6ICIiMjI1IiINCityZXBlYXRlZF9jb3JkOiAiIjMyNSIiDQorZGVmYXVsdF9pbnQzMjogNDAxDQorZGVmYXVsdF9pbnQ2NDogNDAyDQorZGVmYXVsdF91aW50MzI6IDQwMw0KK2RlZmF1bHRfdWludDY0OiA0MDQNCitkZWZhdWx0X3NpbnQzMjogNDA1DQorZGVmYXVsdF9zaW50NjQ6IDQwNg0KK2RlZmF1bHRfZml4ZWQzMjogNDA3DQorZGVmYXVsdF9maXhlZDY0OiA0MDgNCitkZWZhdWx0X3NmaXhlZDMyOiA0MDkNCitkZWZhdWx0X3NmaXhlZDY0OiA0MTANCitkZWZhdWx0X2Zsb2F0OiA0MTENCitkZWZhdWx0X2RvdWJsZTogNDEyDQorZGVmYXVsdF9ib29sOiBmYWxzZQ0KK2RlZmF1bHRfc3RyaW5nOiAiIjQxNSIiDQorZGVmYXVsdF9ieXRlczogIiI0MTYiIg0KK2RlZmF1bHRfbmVzdGVkX2VudW06IEZPTw0KK2RlZmF1bHRfZm9yZWlnbl9lbnVtOiBGT1JFSUdOX0ZPTw0KK2RlZmF1bHRfaW1wb3J0X2VudW06IElNUE9SVF9GT08NCitkZWZhdWx0X3N0cmluZ19waWVjZTogIiI0MjQiIg0KK2RlZmF1bHRfY29yZDogIiI0MjUiIg0KKw0KKyI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgI3JlZ2lvbiB0ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGENCisgICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgdGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gQCINCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXTogMTAxDQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbl06IDEwMg0KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uXTogMTAzDQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb25dOiAxMDQNCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl06IDEwNQ0KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uXTogMTA2DQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uXTogMTA3DQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uXTogMTA4DQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbl06IDEwOQ0KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb25dOiAxMTANCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uXTogMTExDQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb25dOiAxMTINCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfYm9vbF9leHRlbnNpb25dOiB0cnVlDQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25dOiAiIjExNSIiDQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl06ICIiMTE2IiINCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxncm91cF9leHRlbnNpb25dIHsNCisgIGE6IDExNw0KK30NCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXSB7DQorICBiYjogMTE4DQorfQ0KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uXSB7DQorICBjOiAxMTkNCit9DQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0gew0KKyAgZDogMTIwDQorfQ0KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25dOiBCQVoNCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl06IEZPUkVJR05fQkFaDQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl06IElNUE9SVF9CQVoNCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl06ICIiMTI0IiINCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfY29yZF9leHRlbnNpb25dOiAiIjEyNSIiDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl06IDIwMQ0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dOiAzMDENCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uXTogMjAyDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl06IDMwMg0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uXTogMjAzDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25dOiAzMDMNCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl06IDIwNA0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uXTogMzA0DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25dOiAyMDUNCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl06IDMwNQ0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uXTogMjA2DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25dOiAzMDYNCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25dOiAyMDcNCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25dOiAzMDcNCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25dOiAyMDgNCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25dOiAzMDgNCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uXTogMjA5DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl06IDMwOQ0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25dOiAyMTANCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uXTogMzEwDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl06IDIxMQ0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mbG9hdF9leHRlbnNpb25dOiAzMTENCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl06IDIxMg0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uXTogMzEyDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uXTogdHJ1ZQ0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9ib29sX2V4dGVuc2lvbl06IGZhbHNlDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25dOiAiIjIxNSIiDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25dOiAiIjMxNSIiDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl06ICIiMjE2IiINCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uXTogIiIzMTYiIg0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl0gew0KKyAgYTogMjE3DQorfQ0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl0gew0KKyAgYTogMzE3DQorfQ0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dIHsNCisgIGJiOiAyMTgNCit9DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0gew0KKyAgYmI6IDMxOA0KK30NCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl0gew0KKyAgYzogMjE5DQorfQ0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uXSB7DQorICBjOiAzMTkNCit9DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0gew0KKyAgZDogMjIwDQorfQ0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25dIHsNCisgIGQ6IDMyMA0KK30NCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXTogQkFSDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl06IEJBWg0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uXTogRk9SRUlHTl9CQVINCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl06IEZPUkVJR05fQkFaDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl06IElNUE9SVF9CQVINCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXTogSU1QT1JUX0JBWg0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXTogIiIyMjQiIg0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXTogIiIzMjQiIg0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9jb3JkX2V4dGVuc2lvbl06ICIiMjI1IiINCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfY29yZF9leHRlbnNpb25dOiAiIjMyNSIiDQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uXTogNDAxDQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uXTogNDAyDQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl06IDQwMw0KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3VpbnQ2NF9leHRlbnNpb25dOiA0MDQNCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uXTogNDA1DQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbl06IDQwNg0KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uXTogNDA3DQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25dOiA0MDgNCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb25dOiA0MDkNCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25dOiA0MTANCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9mbG9hdF9leHRlbnNpb25dOiA0MTENCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uXTogNDEyDQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfYm9vbF9leHRlbnNpb25dOiBmYWxzZQ0KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3N0cmluZ19leHRlbnNpb25dOiAiIjQxNSIiDQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uXTogIiI0MTYiIg0KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl06IEZPTw0KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb25dOiBGT1JFSUdOX0ZPTw0KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbl06IElNUE9SVF9GT08NCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXTogIiI0MjQiIg0KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2NvcmRfZXh0ZW5zaW9uXTogIiI0MjUiIg0KKyI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFJwY0Zvck1pbWVUeXBlcy5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFJwY0Zvck1pbWVUeXBlcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGNiOTNkCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0UnBjRm9yTWltZVR5cGVzLmNzCkBAIC0wLDAgKzEsMzg2IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLkh0dHA7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zOw0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb247DQordXNpbmcgU3lzdGVtLlRleHQ7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFRoaXMgY2xhc3MgdmVyaWZpZXMgdGhlIGNvcnJlY3QgY29kZSBpcyBnZW5lcmF0ZWQgZnJvbSB1bml0dGVzdF9ycGNfaW50ZXJvcC5wcm90byBhbmQgcHJvdmlkZXMgYSBzbWFsbCBkZW1vbnN0cmF0aW9uDQorICAgIC8vLyBvZiB1c2luZyB0aGUgbmV3IElScGNEaXNwYXRjaCB0byB3cml0ZSBhIGNsaWVudC9zZXJ2ZXINCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIFRlc3RScGNGb3JNaW1lVHlwZXMNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEEgc2FtcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJU2VhcmNoU2VydmljZSBmb3IgdGVzdGluZw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgY2xhc3MgRXhhbXBsZVNlYXJjaEltcGwgOiBJU2VhcmNoU2VydmljZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFNlYXJjaFJlc3BvbnNlIElTZWFyY2hTZXJ2aWNlLlNlYXJjaChTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoc2VhcmNoUmVxdWVzdC5Dcml0ZXJpYUNvdW50ID09IDApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiTm8gY3JpdGVyaWEgc3BlY2lmaWVkLiIsIG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIFNlYXJjaFJlc3BvbnNlLkJ1aWxkZXIgcmVzcCA9IFNlYXJjaFJlc3BvbnNlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGNyaXRlcmlhIGluIHNlYXJjaFJlcXVlc3QuQ3JpdGVyaWFMaXN0KQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXNwLkFkZFJlc3VsdHMoDQorICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoUmVzcG9uc2UuVHlwZXMuUmVzdWx0SXRlbS5DcmVhdGVCdWlsZGVyKCkuU2V0TmFtZShjcml0ZXJpYSkuU2V0VXJsKCJodHRwOi8vc2VhcmNoLmNvbSIpLg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZCgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzcC5CdWlsZCgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBTZWFyY2hSZXNwb25zZSBJU2VhcmNoU2VydmljZS5SZWZpbmVTZWFyY2goUmVmaW5lU2VhcmNoUmVxdWVzdCByZWZpbmVTZWFyY2hSZXF1ZXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgU2VhcmNoUmVzcG9uc2UuQnVpbGRlciByZXNwID0gcmVmaW5lU2VhcmNoUmVxdWVzdC5QcmV2aW91c1Jlc3VsdHMuVG9CdWlsZGVyKCk7DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBjcml0ZXJpYSBpbiByZWZpbmVTZWFyY2hSZXF1ZXN0LkNyaXRlcmlhTGlzdCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmVzcC5BZGRSZXN1bHRzKA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaFJlc3BvbnNlLlR5cGVzLlJlc3VsdEl0ZW0uQ3JlYXRlQnVpbGRlcigpLlNldE5hbWUoY3JpdGVyaWEpLlNldFVybCgiaHR0cDovL3JlZmluZS5jb20iKS4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGQoKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3AuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQW4gZXhhbXBsZSBleHRyYWN0aW9uIG9mIHRoZSB3aXJlIHByb3RvY29sDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBpbnRlcmZhY2UgSUh0dHBUcmFuc2Zlcg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZvaWQgRXhlY3V0ZShzdHJpbmcgbWV0aG9kLCBzdHJpbmcgY29udGVudFR5cGUsIFN0cmVhbSBpbnB1dCwgc3RyaW5nIGFjY2VwdFR5cGUsIFN0cmVhbSBvdXRwdXQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFuIGV4YW1wbGUgb2YgYSBzZXJ2ZXIgcmVzcG9uZGluZyB0byBhIHdlYi9odHRwIHJlcXVlc3QNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIGNsYXNzIEV4YW1wbGVIdHRwU2VydmVyIDogSUh0dHBUcmFuc2Zlcg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHB1YmxpYyByZWFkb25seSBNZXNzYWdlRm9ybWF0T3B0aW9ucyBPcHRpb25zID0NCisgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VGb3JtYXRPcHRpb25zDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHksDQorICAgICAgICAgICAgICAgICAgICBGb3JtYXR0ZWRPdXRwdXQgPSB0cnVlLA0KKyAgICAgICAgICAgICAgICAgICAgWG1sUmVhZGVyT3B0aW9ucyA9IFhtbFJlYWRlck9wdGlvbnMuUmVhZE5lc3RlZEFycmF5cywNCisgICAgICAgICAgICAgICAgICAgIFhtbFJlYWRlclJvb3RFbGVtZW50TmFtZSA9ICJyZXF1ZXN0IiwNCisgICAgICAgICAgICAgICAgICAgIFhtbFdyaXRlck9wdGlvbnMgPSBYbWxXcml0ZXJPcHRpb25zLk91dHB1dE5lc3RlZEFycmF5cywNCisgICAgICAgICAgICAgICAgICAgIFhtbFdyaXRlclJvb3RFbGVtZW50TmFtZSA9ICJyZXNwb25zZSINCisgICAgICAgICAgICAgICAgfTsNCisNCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElScGNTZXJ2ZXJTdHViIF9zdHViOw0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBFeGFtcGxlSHR0cFNlcnZlcihJU2VhcmNoU2VydmljZSBpbXBsZW1lbnRhdGlvbikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vb24gdGhlIHNlcnZlciwgd2UgY3JlYXRlIGEgZGlzcGF0Y2ggdG8gY2FsbCB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kIGJ5IG5hbWUNCisgICAgICAgICAgICAgICAgSVJwY0Rpc3BhdGNoIGRpc3BhdGNoID0gbmV3IFNlYXJjaFNlcnZpY2UuRGlzcGF0Y2goaW1wbGVtZW50YXRpb24pOw0KKyAgICAgICAgICAgICAgICAvL3dlIHRoZW4gd3JhcCB0aGF0IGRpc3BhdGNoIGluIGEgc2VydmVyIHN0dWIgd2hpY2ggd2lsbCBkZXNlcmlhbGl6ZSB0aGUgd2lyZSBieXRlcyB0byB0aGUgbWVzc2FnZQ0KKyAgICAgICAgICAgICAgICAvL3R5cGUgYXBwcm9wcmlhdGUgZm9yIHRoZSBtZXRob2QgbmFtZSBiZWluZyBpbnZva2VkLg0KKyAgICAgICAgICAgICAgICBfc3R1YiA9IG5ldyBTZWFyY2hTZXJ2aWNlLlNlcnZlclN0dWIoZGlzcGF0Y2gpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICB2b2lkIElIdHRwVHJhbnNmZXIuRXhlY3V0ZShzdHJpbmcgbWV0aG9kLCBzdHJpbmcgY29udGVudFR5cGUsIFN0cmVhbSBpbnB1dCwgc3RyaW5nIGFjY2VwdFR5cGUsIFN0cmVhbSBvdXRwdXQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLzMuNTogX3N0dWIuSHR0cENhbGxNZXRob2QoDQorICAgICAgICAgICAgICAgIEV4dGVuc2lvbnMuSHR0cENhbGxNZXRob2QoX3N0dWIsDQorICAgICAgICAgICAgICAgICAgICBtZXRob2QsIE9wdGlvbnMsDQorICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSwgaW5wdXQsDQorICAgICAgICAgICAgICAgICAgICBhY2NlcHRUeXBlLCBvdXRwdXQNCisgICAgICAgICAgICAgICAgICAgICk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFuIGV4YW1wbGUgb2YgYSBjbGllbnQgc2VuZGluZyBhIHdpcmUgcmVxdWVzdA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgY2xhc3MgRXhhbXBsZUNsaWVudCA6IElScGNEaXNwYXRjaA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHB1YmxpYyByZWFkb25seSBNZXNzYWdlRm9ybWF0T3B0aW9ucyBPcHRpb25zID0NCisgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VGb3JtYXRPcHRpb25zDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHksDQorICAgICAgICAgICAgICAgICAgICBGb3JtYXR0ZWRPdXRwdXQgPSB0cnVlLA0KKyAgICAgICAgICAgICAgICAgICAgWG1sUmVhZGVyT3B0aW9ucyA9IFhtbFJlYWRlck9wdGlvbnMuUmVhZE5lc3RlZEFycmF5cywNCisgICAgICAgICAgICAgICAgICAgIFhtbFJlYWRlclJvb3RFbGVtZW50TmFtZSA9ICJyZXNwb25zZSIsDQorICAgICAgICAgICAgICAgICAgICBYbWxXcml0ZXJPcHRpb25zID0gWG1sV3JpdGVyT3B0aW9ucy5PdXRwdXROZXN0ZWRBcnJheXMsDQorICAgICAgICAgICAgICAgICAgICBYbWxXcml0ZXJSb290RWxlbWVudE5hbWUgPSAicmVxdWVzdCINCisgICAgICAgICAgICAgICAgfTsNCisNCisNCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElIdHRwVHJhbnNmZXIgX3dpcmU7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX21pbWVUeXBlOw0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBFeGFtcGxlQ2xpZW50KElIdHRwVHJhbnNmZXIgd2lyZSwgc3RyaW5nIG1pbWVUeXBlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgX3dpcmUgPSB3aXJlOw0KKyAgICAgICAgICAgICAgICBfbWltZVR5cGUgPSBtaW1lVHlwZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgVE1lc3NhZ2UgSVJwY0Rpc3BhdGNoLkNhbGxNZXRob2Q8VE1lc3NhZ2UsIFRCdWlsZGVyPihzdHJpbmcgbWV0aG9kLCBJTWVzc2FnZUxpdGUgcmVxdWVzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCdWlsZGVyTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+IHJlc3BvbnNlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgTWVtb3J5U3RyZWFtIGlucHV0ID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKyAgICAgICAgICAgICAgICBNZW1vcnlTdHJlYW0gb3V0cHV0ID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKw0KKyAgICAgICAgICAgICAgICAvL1dyaXRlIHRvIF9taW1lVHlwZSBmb3JtYXQNCisgICAgICAgICAgICAgICAgRXh0ZW5zaW9ucy5Xcml0ZVRvKHJlcXVlc3QsIE9wdGlvbnMsIF9taW1lVHlwZSwgaW5wdXQpOw0KKw0KKyAgICAgICAgICAgICAgICBpbnB1dC5Qb3NpdGlvbiA9IDA7DQorICAgICAgICAgICAgICAgIF93aXJlLkV4ZWN1dGUobWV0aG9kLCBfbWltZVR5cGUsIGlucHV0LCBfbWltZVR5cGUsIG91dHB1dCk7DQorDQorICAgICAgICAgICAgICAgIC8vUmVhZCBmcm9tIF9taW1lVHlwZSBmb3JtYXQNCisgICAgICAgICAgICAgICAgb3V0cHV0LlBvc2l0aW9uID0gMDsNCisgICAgICAgICAgICAgICAgRXh0ZW5zaW9ucy5NZXJnZUZyb20ocmVzcG9uc2UsIE9wdGlvbnMsIF9taW1lVHlwZSwgb3V0cHV0KTsNCisgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5CdWlsZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUZXN0IHNlbmRpbmcgYW5kIHJlY2lldmluZyBtZXNzYWdlcyB2aWEgdGV4dC9qc29uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0Q2xpZW50U2VydmVyV2l0aEpzb25Gb3JtYXQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEV4YW1wbGVIdHRwU2VydmVyIHNlcnZlciA9IG5ldyBFeGFtcGxlSHR0cFNlcnZlcihuZXcgRXhhbXBsZVNlYXJjaEltcGwoKSk7DQorICAgICAgICAgICAgLy9vYnZpb3VzbHkgaWYgdGhpcyB3YXMgYSAncmVhbCcgdHJhbnNwb3J0IHdlIHdvdWxkIG5vdCB1c2UgdGhlIHNlcnZlciwgcmF0aGVyIHRoZSBzZXJ2ZXIgd291bGQgYmUgbGlzdGVuaW5nLCB0aGUgY2xpZW50IHRyYW5zbWl0dGluZw0KKyAgICAgICAgICAgIElIdHRwVHJhbnNmZXIgd2lyZSA9IHNlcnZlcjsNCisNCisgICAgICAgICAgICBJU2VhcmNoU2VydmljZSBjbGllbnQgPSBuZXcgU2VhcmNoU2VydmljZShuZXcgRXhhbXBsZUNsaWVudCh3aXJlLCAidGV4dC9qc29uIikpOw0KKyAgICAgICAgICAgIC8vbm93IHRoZSBjbGllbnQgaGFzIGEgcmVhbCwgdHlwZWQsIGludGVyZmFjZSB0byB3b3JrIHdpdGg6DQorICAgICAgICAgICAgU2VhcmNoUmVzcG9uc2UgcmVzdWx0ID0gY2xpZW50LlNlYXJjaChTZWFyY2hSZXF1ZXN0LkNyZWF0ZUJ1aWxkZXIoKS5BZGRDcml0ZXJpYSgiVGVzdCIpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCByZXN1bHQuUmVzdWx0c0NvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlRlc3QiLCByZXN1bHQuUmVzdWx0c0xpc3RbMF0uTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJodHRwOi8vc2VhcmNoLmNvbSIsIHJlc3VsdC5SZXN1bHRzTGlzdFswXS5VcmwpOw0KKw0KKyAgICAgICAgICAgIC8vVGhlIHRlc3QgcGFydCBvZiB0aGlzLCBjYWxsIHRoZSBvbmx5IG90aGVyIG1ldGhvZA0KKyAgICAgICAgICAgIHJlc3VsdCA9DQorICAgICAgICAgICAgICAgIGNsaWVudC5SZWZpbmVTZWFyY2goDQorICAgICAgICAgICAgICAgICAgICBSZWZpbmVTZWFyY2hSZXF1ZXN0LkNyZWF0ZUJ1aWxkZXIoKS5TZXRQcmV2aW91c1Jlc3VsdHMocmVzdWx0KS5BZGRDcml0ZXJpYSgiUmVmaW5lIikuQnVpbGQoKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdC5SZXN1bHRzQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGVzdCIsIHJlc3VsdC5SZXN1bHRzTGlzdFswXS5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImh0dHA6Ly9zZWFyY2guY29tIiwgcmVzdWx0LlJlc3VsdHNMaXN0WzBdLlVybCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJSZWZpbmUiLCByZXN1bHQuUmVzdWx0c0xpc3RbMV0uTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJodHRwOi8vcmVmaW5lLmNvbSIsIHJlc3VsdC5SZXN1bHRzTGlzdFsxXS5VcmwpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRlc3Qgc2VuZGluZyBhbmQgcmVjaWV2aW5nIG1lc3NhZ2VzIHZpYSB0ZXh0L2pzb24NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RDbGllbnRTZXJ2ZXJXaXRoWG1sRm9ybWF0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBFeGFtcGxlSHR0cFNlcnZlciBzZXJ2ZXIgPSBuZXcgRXhhbXBsZUh0dHBTZXJ2ZXIobmV3IEV4YW1wbGVTZWFyY2hJbXBsKCkpOw0KKyAgICAgICAgICAgIC8vb2J2aW91c2x5IGlmIHRoaXMgd2FzIGEgJ3JlYWwnIHRyYW5zcG9ydCB3ZSB3b3VsZCBub3QgdXNlIHRoZSBzZXJ2ZXIsIHJhdGhlciB0aGUgc2VydmVyIHdvdWxkIGJlIGxpc3RlbmluZywgdGhlIGNsaWVudCB0cmFuc21pdHRpbmcNCisgICAgICAgICAgICBJSHR0cFRyYW5zZmVyIHdpcmUgPSBzZXJ2ZXI7DQorDQorICAgICAgICAgICAgSVNlYXJjaFNlcnZpY2UgY2xpZW50ID0gbmV3IFNlYXJjaFNlcnZpY2UobmV3IEV4YW1wbGVDbGllbnQod2lyZSwgInRleHQveG1sIikpOw0KKyAgICAgICAgICAgIC8vbm93IHRoZSBjbGllbnQgaGFzIGEgcmVhbCwgdHlwZWQsIGludGVyZmFjZSB0byB3b3JrIHdpdGg6DQorICAgICAgICAgICAgU2VhcmNoUmVzcG9uc2UgcmVzdWx0ID0gY2xpZW50LlNlYXJjaChTZWFyY2hSZXF1ZXN0LkNyZWF0ZUJ1aWxkZXIoKS5BZGRDcml0ZXJpYSgiVGVzdCIpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCByZXN1bHQuUmVzdWx0c0NvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlRlc3QiLCByZXN1bHQuUmVzdWx0c0xpc3RbMF0uTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJodHRwOi8vc2VhcmNoLmNvbSIsIHJlc3VsdC5SZXN1bHRzTGlzdFswXS5VcmwpOw0KKw0KKyAgICAgICAgICAgIC8vVGhlIHRlc3QgcGFydCBvZiB0aGlzLCBjYWxsIHRoZSBvbmx5IG90aGVyIG1ldGhvZA0KKyAgICAgICAgICAgIHJlc3VsdCA9DQorICAgICAgICAgICAgICAgIGNsaWVudC5SZWZpbmVTZWFyY2goDQorICAgICAgICAgICAgICAgICAgICBSZWZpbmVTZWFyY2hSZXF1ZXN0LkNyZWF0ZUJ1aWxkZXIoKS5TZXRQcmV2aW91c1Jlc3VsdHMocmVzdWx0KS5BZGRDcml0ZXJpYSgiUmVmaW5lIikuQnVpbGQoKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdC5SZXN1bHRzQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGVzdCIsIHJlc3VsdC5SZXN1bHRzTGlzdFswXS5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImh0dHA6Ly9zZWFyY2guY29tIiwgcmVzdWx0LlJlc3VsdHNMaXN0WzBdLlVybCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJSZWZpbmUiLCByZXN1bHQuUmVzdWx0c0xpc3RbMV0uTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJodHRwOi8vcmVmaW5lLmNvbSIsIHJlc3VsdC5SZXN1bHRzTGlzdFsxXS5VcmwpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRlc3Qgc2VuZGluZyBhbmQgcmVjaWV2aW5nIG1lc3NhZ2VzIHZpYSB0ZXh0L2pzb24NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RDbGllbnRTZXJ2ZXJXaXRoUHJvdG9Gb3JtYXQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEV4YW1wbGVIdHRwU2VydmVyIHNlcnZlciA9IG5ldyBFeGFtcGxlSHR0cFNlcnZlcihuZXcgRXhhbXBsZVNlYXJjaEltcGwoKSk7DQorICAgICAgICAgICAgLy9vYnZpb3VzbHkgaWYgdGhpcyB3YXMgYSAncmVhbCcgdHJhbnNwb3J0IHdlIHdvdWxkIG5vdCB1c2UgdGhlIHNlcnZlciwgcmF0aGVyIHRoZSBzZXJ2ZXIgd291bGQgYmUgbGlzdGVuaW5nLCB0aGUgY2xpZW50IHRyYW5zbWl0dGluZw0KKyAgICAgICAgICAgIElIdHRwVHJhbnNmZXIgd2lyZSA9IHNlcnZlcjsNCisNCisgICAgICAgICAgICBJU2VhcmNoU2VydmljZSBjbGllbnQgPSBuZXcgU2VhcmNoU2VydmljZShuZXcgRXhhbXBsZUNsaWVudCh3aXJlLCAiYXBwbGljYXRpb24veC1wcm90b2J1ZiIpKTsNCisgICAgICAgICAgICAvL25vdyB0aGUgY2xpZW50IGhhcyBhIHJlYWwsIHR5cGVkLCBpbnRlcmZhY2UgdG8gd29yayB3aXRoOg0KKyAgICAgICAgICAgIFNlYXJjaFJlc3BvbnNlIHJlc3VsdCA9IGNsaWVudC5TZWFyY2goU2VhcmNoUmVxdWVzdC5DcmVhdGVCdWlsZGVyKCkuQWRkQ3JpdGVyaWEoIlRlc3QiKS5CdWlsZCgpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0LlJlc3VsdHNDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0IiwgcmVzdWx0LlJlc3VsdHNMaXN0WzBdLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaHR0cDovL3NlYXJjaC5jb20iLCByZXN1bHQuUmVzdWx0c0xpc3RbMF0uVXJsKTsNCisNCisgICAgICAgICAgICAvL1RoZSB0ZXN0IHBhcnQgb2YgdGhpcywgY2FsbCB0aGUgb25seSBvdGhlciBtZXRob2QNCisgICAgICAgICAgICByZXN1bHQgPQ0KKyAgICAgICAgICAgICAgICBjbGllbnQuUmVmaW5lU2VhcmNoKA0KKyAgICAgICAgICAgICAgICAgICAgUmVmaW5lU2VhcmNoUmVxdWVzdC5DcmVhdGVCdWlsZGVyKCkuU2V0UHJldmlvdXNSZXN1bHRzKHJlc3VsdCkuQWRkQ3JpdGVyaWEoIlJlZmluZSIpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByZXN1bHQuUmVzdWx0c0NvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlRlc3QiLCByZXN1bHQuUmVzdWx0c0xpc3RbMF0uTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJodHRwOi8vc2VhcmNoLmNvbSIsIHJlc3VsdC5SZXN1bHRzTGlzdFswXS5VcmwpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiUmVmaW5lIiwgcmVzdWx0LlJlc3VsdHNMaXN0WzFdLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaHR0cDovL3JlZmluZS5jb20iLCByZXN1bHQuUmVzdWx0c0xpc3RbMV0uVXJsKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUZXN0IHNlbmRpbmcgYW5kIHJlY2lldmluZyBtZXNzYWdlcyB2aWEgdGV4dC9qc29uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0Q2xpZW50U2VydmVyV2l0aEN1c3RvbUZvcm1hdCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgRXhhbXBsZUh0dHBTZXJ2ZXIgc2VydmVyID0gbmV3IEV4YW1wbGVIdHRwU2VydmVyKG5ldyBFeGFtcGxlU2VhcmNoSW1wbCgpKTsNCisgICAgICAgICAgICAvL1NldHVwIG91ciBjdXN0b20gbWltZS10eXBlIGZvcm1hdCBhcyB0aGUgb25seSBmb3JtYXQgc3VwcG9ydGVkOg0KKyAgICAgICAgICAgIHNlcnZlci5PcHRpb25zLk1pbWVJbnB1dFR5cGVzLkNsZWFyKCk7DQorICAgICAgICAgICAgc2VydmVyLk9wdGlvbnMuTWltZUlucHV0VHlwZXMuQWRkKCJmb28vYmFyIiwgQ29kZWRJbnB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZSk7DQorICAgICAgICAgICAgc2VydmVyLk9wdGlvbnMuTWltZU91dHB1dFR5cGVzLkNsZWFyKCk7DQorICAgICAgICAgICAgc2VydmVyLk9wdGlvbnMuTWltZU91dHB1dFR5cGVzLkFkZCgiZm9vL2JhciIsIENvZGVkT3V0cHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKTsNCisNCisgICAgICAgICAgICAvL29idmlvdXNseSBpZiB0aGlzIHdhcyBhICdyZWFsJyB0cmFuc3BvcnQgd2Ugd291bGQgbm90IHVzZSB0aGUgc2VydmVyLCByYXRoZXIgdGhlIHNlcnZlciB3b3VsZCBiZSBsaXN0ZW5pbmcsIHRoZSBjbGllbnQgdHJhbnNtaXR0aW5nDQorICAgICAgICAgICAgSUh0dHBUcmFuc2ZlciB3aXJlID0gc2VydmVyOw0KKw0KKyAgICAgICAgICAgIEV4YW1wbGVDbGllbnQgZXhjbGllbnQgPSBuZXcgRXhhbXBsZUNsaWVudCh3aXJlLCAiZm9vL2JhciIpOw0KKyAgICAgICAgICAgIC8vQWRkIG91ciBjdXN0b20gbWltZS10eXBlIGZvcm1hdA0KKyAgICAgICAgICAgIGV4Y2xpZW50Lk9wdGlvbnMuTWltZUlucHV0VHlwZXMuQWRkKCJmb28vYmFyIiwgQ29kZWRJbnB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZSk7DQorICAgICAgICAgICAgZXhjbGllbnQuT3B0aW9ucy5NaW1lT3V0cHV0VHlwZXMuQWRkKCJmb28vYmFyIiwgQ29kZWRPdXRwdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UpOw0KKyAgICAgICAgICAgIElTZWFyY2hTZXJ2aWNlIGNsaWVudCA9IG5ldyBTZWFyY2hTZXJ2aWNlKGV4Y2xpZW50KTsNCisNCisgICAgICAgICAgICAvL25vdyB0aGUgY2xpZW50IGhhcyBhIHJlYWwsIHR5cGVkLCBpbnRlcmZhY2UgdG8gd29yayB3aXRoOg0KKyAgICAgICAgICAgIFNlYXJjaFJlc3BvbnNlIHJlc3VsdCA9IGNsaWVudC5TZWFyY2goU2VhcmNoUmVxdWVzdC5DcmVhdGVCdWlsZGVyKCkuQWRkQ3JpdGVyaWEoIlRlc3QiKS5CdWlsZCgpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0LlJlc3VsdHNDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0IiwgcmVzdWx0LlJlc3VsdHNMaXN0WzBdLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaHR0cDovL3NlYXJjaC5jb20iLCByZXN1bHQuUmVzdWx0c0xpc3RbMF0uVXJsKTsNCisNCisgICAgICAgICAgICAvL1RoZSB0ZXN0IHBhcnQgb2YgdGhpcywgY2FsbCB0aGUgb25seSBvdGhlciBtZXRob2QNCisgICAgICAgICAgICByZXN1bHQgPQ0KKyAgICAgICAgICAgICAgICBjbGllbnQuUmVmaW5lU2VhcmNoKA0KKyAgICAgICAgICAgICAgICAgICAgUmVmaW5lU2VhcmNoUmVxdWVzdC5DcmVhdGVCdWlsZGVyKCkuU2V0UHJldmlvdXNSZXN1bHRzKHJlc3VsdCkuQWRkQ3JpdGVyaWEoIlJlZmluZSIpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByZXN1bHQuUmVzdWx0c0NvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlRlc3QiLCByZXN1bHQuUmVzdWx0c0xpc3RbMF0uTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJodHRwOi8vc2VhcmNoLmNvbSIsIHJlc3VsdC5SZXN1bHRzTGlzdFswXS5VcmwpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiUmVmaW5lIiwgcmVzdWx0LlJlc3VsdHNMaXN0WzFdLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaHR0cDovL3JlZmluZS5jb20iLCByZXN1bHQuUmVzdWx0c0xpc3RbMV0uVXJsKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUZXN0IHNlbmRpbmcgYW5kIHJlY2lldmluZyBtZXNzYWdlcyB2aWEgdGV4dC9qc29uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0U2VydmVyV2l0aFVyaUZvcm1hdCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgRXhhbXBsZUh0dHBTZXJ2ZXIgc2VydmVyID0gbmV3IEV4YW1wbGVIdHRwU2VydmVyKG5ldyBFeGFtcGxlU2VhcmNoSW1wbCgpKTsNCisgICAgICAgICAgICAvL29idmlvdXNseSBpZiB0aGlzIHdhcyBhICdyZWFsJyB0cmFuc3BvcnQgd2Ugd291bGQgbm90IHVzZSB0aGUgc2VydmVyLCByYXRoZXIgdGhlIHNlcnZlciB3b3VsZCBiZSBsaXN0ZW5pbmcsIHRoZSBjbGllbnQgdHJhbnNtaXR0aW5nDQorICAgICAgICAgICAgSUh0dHBUcmFuc2ZlciB3aXJlID0gc2VydmVyOw0KKw0KKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBpbnB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oRW5jb2RpbmcuVVRGOC5HZXRCeXRlcygiP0NyaXRlcmlhPVRlc3QmQ3JpdGVyaWE9VGVzdCtvZiUyMFVSSSIpKTsNCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gb3V0cHV0ID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKw0KKyAgICAgICAgICAgIC8vQ2FsbCB0aGUgc2VydmVyDQorICAgICAgICAgICAgd2lyZS5FeGVjdXRlKCJTZWFyY2giLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0T3B0aW9ucy5Db250ZW50Rm9ybVVybEVuY29kZWQsIGlucHV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0T3B0aW9ucy5Db250ZW50VHlwZVByb3RvQnVmZmVyLCBvdXRwdXQNCisgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCisNCisgICAgICAgICAgICBTZWFyY2hSZXNwb25zZSByZXN1bHQgPSBTZWFyY2hSZXNwb25zZS5QYXJzZUZyb20ob3V0cHV0LlRvQXJyYXkoKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdC5SZXN1bHRzQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGVzdCIsIHJlc3VsdC5SZXN1bHRzTGlzdFswXS5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImh0dHA6Ly9zZWFyY2guY29tIiwgcmVzdWx0LlJlc3VsdHNMaXN0WzBdLlVybCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0IG9mIFVSSSIsIHJlc3VsdC5SZXN1bHRzTGlzdFsxXS5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImh0dHA6Ly9zZWFyY2guY29tIiwgcmVzdWx0LlJlc3VsdHNMaXN0WzFdLlVybCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGVzdCBzZW5kaW5nIGFuZCByZWNpZXZpbmcgbWVzc2FnZXMgdmlhIHRleHQvanNvbg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKSldDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0SW52YWxpZE1pbWVUeXBlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBFeGFtcGxlSHR0cFNlcnZlciBzZXJ2ZXIgPSBuZXcgRXhhbXBsZUh0dHBTZXJ2ZXIobmV3IEV4YW1wbGVTZWFyY2hJbXBsKCkpOw0KKyAgICAgICAgICAgIC8vb2J2aW91c2x5IGlmIHRoaXMgd2FzIGEgJ3JlYWwnIHRyYW5zcG9ydCB3ZSB3b3VsZCBub3QgdXNlIHRoZSBzZXJ2ZXIsIHJhdGhlciB0aGUgc2VydmVyIHdvdWxkIGJlIGxpc3RlbmluZywgdGhlIGNsaWVudCB0cmFuc21pdHRpbmcNCisgICAgICAgICAgICBJSHR0cFRyYW5zZmVyIHdpcmUgPSBzZXJ2ZXI7DQorDQorICAgICAgICAgICAgTWVtb3J5U3RyZWFtIGlucHV0ID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBvdXRwdXQgPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorDQorICAgICAgICAgICAgLy9DYWxsIHRoZSBzZXJ2ZXINCisgICAgICAgICAgICB3aXJlLkV4ZWN1dGUoIlNlYXJjaCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQvbWltZSIsIGlucHV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0T3B0aW9ucy5Db250ZW50VHlwZVByb3RvQnVmZmVyLCBvdXRwdXQNCisgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCisgICAgICAgICAgICBBc3NlcnQuRmFpbCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRlc3Qgc2VuZGluZyBhbmQgcmVjaWV2aW5nIG1lc3NhZ2VzIHZpYSB0ZXh0L2pzb24NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3REZWZhdWx0TWltZVR5cGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEV4YW1wbGVIdHRwU2VydmVyIHNlcnZlciA9IG5ldyBFeGFtcGxlSHR0cFNlcnZlcihuZXcgRXhhbXBsZVNlYXJjaEltcGwoKSk7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgLy9vYnZpb3VzbHkgaWYgdGhpcyB3YXMgYSAncmVhbCcgdHJhbnNwb3J0IHdlIHdvdWxkIG5vdCB1c2UgdGhlIHNlcnZlciwgcmF0aGVyIHRoZSBzZXJ2ZXIgd291bGQgYmUgbGlzdGVuaW5nLCB0aGUgY2xpZW50IHRyYW5zbWl0dGluZw0KKyAgICAgICAgICAgIElIdHRwVHJhbnNmZXIgd2lyZSA9IHNlcnZlcjsNCisNCisNCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gaW5wdXQgPSBuZXcgTWVtb3J5U3RyZWFtKG5ldyBTZWFyY2hSZXF1ZXN0LkJ1aWxkZXIoKS5BZGRDcml0ZXJpYSgiVGVzdCIpLkJ1aWxkKCkuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICAgICAgTWVtb3J5U3RyZWFtIG91dHB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsNCisNCisgICAgICAgICAgICAvL1dpdGggdGhpcyBkZWZhdWx0IHNldCwgYW55IGludmFsaWQvdW5rbm93biBtaW1lLXR5cGUgd2lsbCBiZSBtYXBwZWQgdG8gdXNlIHRoYXQgZm9ybWF0DQorICAgICAgICAgICAgc2VydmVyLk9wdGlvbnMuRGVmYXVsdENvbnRlbnRUeXBlID0gTWVzc2FnZUZvcm1hdE9wdGlvbnMuQ29udGVudFR5cGVQcm90b0J1ZmZlcjsNCisNCisgICAgICAgICAgICB3aXJlLkV4ZWN1dGUoIlNlYXJjaCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICJmb28iLCBpbnB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgImJhciIsIG91dHB1dA0KKyAgICAgICAgICAgICAgICAgICAgICAgICApOw0KKw0KKyAgICAgICAgICAgIFNlYXJjaFJlc3BvbnNlIHJlc3VsdCA9IFNlYXJjaFJlc3BvbnNlLlBhcnNlRnJvbShvdXRwdXQuVG9BcnJheSgpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0LlJlc3VsdHNDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0IiwgcmVzdWx0LlJlc3VsdHNMaXN0WzBdLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaHR0cDovL3NlYXJjaC5jb20iLCByZXN1bHQuUmVzdWx0c0xpc3RbMF0uVXJsKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RScGNHZW5lcmF0b3IuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RScGNHZW5lcmF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1MzJkNgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFJwY0dlbmVyYXRvci5jcwpAQCAtMCwwICsxLDE3MSBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvczsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gVGhpcyBjbGFzcyB2ZXJpZmllcyB0aGUgY29ycmVjdCBjb2RlIGlzIGdlbmVyYXRlZCBmcm9tIHVuaXR0ZXN0X3JwY19pbnRlcm9wLnByb3RvIGFuZCBwcm92aWRlcyBhIHNtYWxsIGRlbW9uc3RyYXRpb24NCisgICAgLy8vIG9mIHVzaW5nIHRoZSBuZXcgSVJwY0Rpc3BhdGNoIHRvIHdyaXRlIGEgY2xpZW50L3NlcnZlcg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdFJwY0dlbmVyYXRvcg0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQSBzYW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIElTZWFyY2hTZXJ2aWNlIGZvciB0ZXN0aW5nDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBFeGFtcGxlU2VhcmNoSW1wbCA6IElTZWFyY2hTZXJ2aWNlDQorICAgICAgICB7DQorICAgICAgICAgICAgU2VhcmNoUmVzcG9uc2UgSVNlYXJjaFNlcnZpY2UuU2VhcmNoKFNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChzZWFyY2hSZXF1ZXN0LkNyaXRlcmlhQ291bnQgPT0gMCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjcml0ZXJpYSBzcGVjaWZpZWQuIiwgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgU2VhcmNoUmVzcG9uc2UuQnVpbGRlciByZXNwID0gU2VhcmNoUmVzcG9uc2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgY3JpdGVyaWEgaW4gc2VhcmNoUmVxdWVzdC5Dcml0ZXJpYUxpc3QpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJlc3AuQWRkUmVzdWx0cygNCisgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtLkNyZWF0ZUJ1aWxkZXIoKS5TZXROYW1lKGNyaXRlcmlhKS5TZXRVcmwoImh0dHA6Ly9zZWFyY2guY29tIikuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiByZXNwLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIFNlYXJjaFJlc3BvbnNlIElTZWFyY2hTZXJ2aWNlLlJlZmluZVNlYXJjaChSZWZpbmVTZWFyY2hSZXF1ZXN0IHJlZmluZVNlYXJjaFJlcXVlc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBTZWFyY2hSZXNwb25zZS5CdWlsZGVyIHJlc3AgPSByZWZpbmVTZWFyY2hSZXF1ZXN0LlByZXZpb3VzUmVzdWx0cy5Ub0J1aWxkZXIoKTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGNyaXRlcmlhIGluIHJlZmluZVNlYXJjaFJlcXVlc3QuQ3JpdGVyaWFMaXN0KQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXNwLkFkZFJlc3VsdHMoDQorICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoUmVzcG9uc2UuVHlwZXMuUmVzdWx0SXRlbS5DcmVhdGVCdWlsZGVyKCkuU2V0TmFtZShjcml0ZXJpYSkuU2V0VXJsKCJodHRwOi8vcmVmaW5lLmNvbSIpLg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZCgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzcC5CdWlsZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBbiBleGFtcGxlIGV4dHJhY3Rpb24gb2YgdGhlIHdpcmUgcHJvdG9jb2wNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIGludGVyZmFjZSBJV2lyZVRyYW5zZmVyDQorICAgICAgICB7DQorICAgICAgICAgICAgYnl0ZVtdIEV4ZWN1dGUoc3RyaW5nIG1ldGhvZCwgYnl0ZVtdIG1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFuIGV4YW1wbGUgb2YgYSBzZXJ2ZXIgcmVzcG9uZGluZyB0byBhIHdpcmUgcmVxdWVzdA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgY2xhc3MgRXhhbXBsZVNlcnZlckhvc3QgOiBJV2lyZVRyYW5zZmVyDQorICAgICAgICB7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJUnBjU2VydmVyU3R1YiBfc3R1YjsNCisNCisgICAgICAgICAgICBwdWJsaWMgRXhhbXBsZVNlcnZlckhvc3QoSVNlYXJjaFNlcnZpY2UgaW1wbGVtZW50YXRpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvL29uIHRoZSBzZXJ2ZXIsIHdlIGNyZWF0ZSBhIGRpc3BhdGNoIHRvIGNhbGwgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCBieSBuYW1lDQorICAgICAgICAgICAgICAgIElScGNEaXNwYXRjaCBkaXNwYXRjaCA9IG5ldyBTZWFyY2hTZXJ2aWNlLkRpc3BhdGNoKGltcGxlbWVudGF0aW9uKTsNCisgICAgICAgICAgICAgICAgLy93ZSB0aGVuIHdyYXAgdGhhdCBkaXNwYXRjaCBpbiBhIHNlcnZlciBzdHViIHdoaWNoIHdpbGwgZGVzZXJpYWxpemUgdGhlIHdpcmUgYnl0ZXMgdG8gdGhlIG1lc3NhZ2UNCisgICAgICAgICAgICAgICAgLy90eXBlIGFwcHJvcHJpYXRlIGZvciB0aGUgbWV0aG9kIG5hbWUgYmVpbmcgaW52b2tlZC4NCisgICAgICAgICAgICAgICAgX3N0dWIgPSBuZXcgU2VhcmNoU2VydmljZS5TZXJ2ZXJTdHViKGRpc3BhdGNoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgYnl0ZVtdIElXaXJlVHJhbnNmZXIuRXhlY3V0ZShzdHJpbmcgbWV0aG9kLCBieXRlW10gbWVzc2FnZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vbm93IHdoZW4gd2UgcmVjaWV2ZSBhIHdpcmUgdHJhbnNtaXNzaW9uIHRvIGludm9rZSBhIG1ldGhvZCBieSBuYW1lIHdpdGggYSBieXRlW10gb3Igc3RyZWFtIHBheWxvYWQNCisgICAgICAgICAgICAgICAgLy93ZSBqdXN0IHNpbXBseSBjYWxsIHRoZSBzdWI6DQorICAgICAgICAgICAgICAgIElNZXNzYWdlTGl0ZSByZXNwb25zZSA9IF9zdHViLkNhbGxNZXRob2QobWV0aG9kLCBDb2RlZElucHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKG1lc3NhZ2UpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICAgICAgICAgICAgLy9ub3cgd2UgcmV0dXJuIHRoZSBleHBlY3RlZCByZXNwb25zZSBtZXNzYWdlOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuVG9CeXRlQXJyYXkoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQW4gZXhhbXBsZSBvZiBhIGNsaWVudCBzZW5kaW5nIGEgd2lyZSByZXF1ZXN0DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBFeGFtcGxlQ2xpZW50IDogSVJwY0Rpc3BhdGNoDQorICAgICAgICB7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJV2lyZVRyYW5zZmVyIF93aXJlOw0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBFeGFtcGxlQ2xpZW50KElXaXJlVHJhbnNmZXIgd2lyZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF93aXJlID0gd2lyZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgVE1lc3NhZ2UgSVJwY0Rpc3BhdGNoLkNhbGxNZXRob2Q8VE1lc3NhZ2UsIFRCdWlsZGVyPihzdHJpbmcgbWV0aG9kLCBJTWVzc2FnZUxpdGUgcmVxdWVzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCdWlsZGVyTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+IHJlc3BvbnNlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYnl0ZVtdIHJhd1Jlc3BvbnNlID0gX3dpcmUuRXhlY3V0ZShtZXRob2QsIHJlcXVlc3QuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICAgICAgICAgIHJlc3BvbnNlLk1lcmdlRnJvbShyYXdSZXNwb25zZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5CdWlsZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQdXQgaXQgYWxsIHRvZ2V0aGVyIHRvIGNyZWF0ZSBvbmUgc2VhbWxlc3MgY2xpZW50L3NlcnZlciBleHBlcmllbmNlIGZ1bGwgb2YgcmljaC10eXBlIGdvb2RuZXNzIDspDQorICAgICAgICAvLy8gQWxsIHlvdSBuZWVkIHRvIGRvIGlzIHNlbmQvcmVjaWV2ZSB0aGUgbWV0aG9kIG5hbWUgYW5kIG1lc3NhZ2UgYnl0ZXMgYWNyb3NzIHRoZSB3aXJlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdENsaWVudFNlcnZlckRpc3BhdGNoKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBFeGFtcGxlU2VydmVySG9zdCBzZXJ2ZXIgPSBuZXcgRXhhbXBsZVNlcnZlckhvc3QobmV3IEV4YW1wbGVTZWFyY2hJbXBsKCkpOw0KKyAgICAgICAgICAgIC8vb2J2aW91c2x5IGlmIHRoaXMgd2FzIGEgJ3JlYWwnIHRyYW5zcG9ydCB3ZSB3b3VsZCBub3QgdXNlIHRoZSBzZXJ2ZXIsIHJhdGhlciB0aGUgc2VydmVyIHdvdWxkIGJlIGxpc3RlbmluZywgdGhlIGNsaWVudCB0cmFuc21pdHRpbmcNCisgICAgICAgICAgICBJV2lyZVRyYW5zZmVyIHdpcmUgPSBzZXJ2ZXI7DQorDQorICAgICAgICAgICAgSVNlYXJjaFNlcnZpY2UgY2xpZW50ID0gbmV3IFNlYXJjaFNlcnZpY2UobmV3IEV4YW1wbGVDbGllbnQod2lyZSkpOw0KKyAgICAgICAgICAgIC8vbm93IHRoZSBjbGllbnQgaGFzIGEgcmVhbCwgdHlwZWQsIGludGVyZmFjZSB0byB3b3JrIHdpdGg6DQorICAgICAgICAgICAgU2VhcmNoUmVzcG9uc2UgcmVzdWx0ID0gY2xpZW50LlNlYXJjaChTZWFyY2hSZXF1ZXN0LkNyZWF0ZUJ1aWxkZXIoKS5BZGRDcml0ZXJpYSgiVGVzdCIpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCByZXN1bHQuUmVzdWx0c0NvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlRlc3QiLCByZXN1bHQuUmVzdWx0c0xpc3RbMF0uTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJodHRwOi8vc2VhcmNoLmNvbSIsIHJlc3VsdC5SZXN1bHRzTGlzdFswXS5VcmwpOw0KKw0KKyAgICAgICAgICAgIC8vVGhlIHRlc3QgcGFydCBvZiB0aGlzLCBjYWxsIHRoZSBvbmx5IG90aGVyIG1ldGhvZA0KKyAgICAgICAgICAgIHJlc3VsdCA9DQorICAgICAgICAgICAgICAgIGNsaWVudC5SZWZpbmVTZWFyY2goDQorICAgICAgICAgICAgICAgICAgICBSZWZpbmVTZWFyY2hSZXF1ZXN0LkNyZWF0ZUJ1aWxkZXIoKS5TZXRQcmV2aW91c1Jlc3VsdHMocmVzdWx0KS5BZGRDcml0ZXJpYSgiUmVmaW5lIikuQnVpbGQoKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdC5SZXN1bHRzQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGVzdCIsIHJlc3VsdC5SZXN1bHRzTGlzdFswXS5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImh0dHA6Ly9zZWFyY2guY29tIiwgcmVzdWx0LlJlc3VsdHNMaXN0WzBdLlVybCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJSZWZpbmUiLCByZXN1bHQuUmVzdWx0c0xpc3RbMV0uTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJodHRwOi8vcmVmaW5lLmNvbSIsIHJlc3VsdC5SZXN1bHRzTGlzdFsxXS5VcmwpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFV0aWwuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RVdGlsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzBkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RVdGlsLmNzCkBAIC0wLDAgKzEsMTgxMiBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlRleHQ7DQordXNpbmcgU3lzdGVtLlRocmVhZGluZzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3M7DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBUZXN0VXRpbA0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIGdvbGRlbk1lc3NhZ2UgPSBudWxsOw0KKw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEJ5dGVTdHJpbmcgR29sZGVuTWVzc2FnZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGdvbGRlbk1lc3NhZ2UgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZ29sZGVuTWVzc2FnZSA9IEJ5dGVTdHJpbmcuQ29weUZyb20oVGVzdFJlc291cmNlcy5nb2xkZW5fbWVzc2FnZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGdvbGRlbk1lc3NhZ2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBnb2xkZW5QYWNrZWRGaWVsZHNNZXNzYWdlID0gbnVsbDsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXQgdGhlIGJ5dGVzIG9mIHRoZSAiZ29sZGVuIHBhY2tlZCBmaWVsZHMgbWVzc2FnZSIuICBUaGlzIGlzIGEgc2VyaWFsaXplZA0KKyAgICAgICAgLy8vIFRlc3RQYWNrZWRUeXBlcyB3aXRoIGFsbCBmaWVsZHMgc2V0IGFzIHRoZXkgd291bGQgYmUgYnkgU2V0UGFja2VkRmllbGRzLA0KKyAgICAgICAgLy8vIGJ1dCBpdCBpcyBsb2FkZWQgZnJvbSBhIGZpbGUgb24gZGlzayByYXRoZXIgdGhhbiBnZW5lcmF0ZWQgZHluYW1pY2FsbHkuDQorICAgICAgICAvLy8gVGhlIGZpbGUgaXMgYWN0dWFsbHkgZ2VuZXJhdGVkIGJ5IEMrKyBjb2RlLCBzbyB0ZXN0aW5nIGFnYWluc3QgaXQgdmVyaWZpZXMgY29tcGF0aWJpbGl0eQ0KKyAgICAgICAgLy8vIHdpdGggQysrLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBHZXRHb2xkZW5QYWNrZWRGaWVsZHNNZXNzYWdlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZ29sZGVuUGFja2VkRmllbGRzTWVzc2FnZSA9PSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZ29sZGVuUGFja2VkRmllbGRzTWVzc2FnZSA9IEJ5dGVTdHJpbmcuQ29weUZyb20oVGVzdFJlc291cmNlcy5nb2xkZW5fcGFja2VkX2ZpZWxkc19tZXNzYWdlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGdvbGRlblBhY2tlZEZpZWxkc01lc3NhZ2U7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhbiB1bm1vZGlmaWFibGUgRXh0ZW5zaW9uUmVnaXN0cnkgY29udGFpbmluZyBhbGwgdGhlIGV4dGVuc2lvbnMNCisgICAgICAgIC8vLyBvZiBUZXN0QWxsRXh0ZW5zaW9ucy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEV4dGVuc2lvblJlZ2lzdHJ5IENyZWF0ZUV4dGVuc2lvblJlZ2lzdHJ5KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICAgICAgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgICAgICByZXR1cm4gcmVnaXN0cnkuQXNSZWFkT25seSgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlZ2lzdGVycyBhbGwgb2YgdGhlIGV4dGVuc2lvbnMgaW4gVGVzdEFsbEV4dGVuc2lvbnMgd2l0aCB0aGUgZ2l2ZW4NCisgICAgICAgIC8vLyBFeHRlbnNpb25SZWdpc3RyeS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBSZWdpc3RlckFsbEV4dGVuc2lvbnMoRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEludDY0RXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxVaW50MzJFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFVpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTaW50NjRFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZpeGVkNjRFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRmxvYXRFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbERvdWJsZUV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQm9vbEV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxCeXRlc0V4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsR3JvdXBFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbENvcmRFeHRlbnNpb24pOw0KKw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkVWludDMyRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRVaW50NjRFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNpbnQzMkV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZsb2F0RXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWREb3VibGVFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEJvb2xFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ0V4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQnl0ZXNFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEdyb3VwRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRDb3JkRXh0ZW5zaW9uKTsNCisNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEludDMyRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEludDY0RXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFVpbnQzMkV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRVaW50NjRFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ludDMyRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZpeGVkNjRFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0RmxvYXRFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0RG91YmxlRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEJvb2xFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U3RyaW5nRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEJ5dGVzRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRDb3JkRXh0ZW5zaW9uKTsNCisNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkSW50MzJFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRJbnQ2NEV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFVpbnQzMkV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFVpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFNpbnQzMkV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFNpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGaXhlZDY0RXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LkFkZChVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEZsb2F0RXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRG91YmxlRXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZWdpc3RyeS5BZGQoVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkQm9vbEV4dGVuc2lvbik7DQorICAgICAgICAgICAgcmVnaXN0cnkuQWRkKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEVudW1FeHRlbnNpb24pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEhlbHBlciB0byBjb252ZXJ0IGEgU3RyaW5nIHRvIEJ5dGVTdHJpbmcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEJ5dGVTdHJpbmcgVG9CeXRlcyhTdHJpbmcgc3RyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBCeXRlU3RyaW5nLkNvcHlGcm9tKEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoc3RyKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgVGVzdEFsbFR5cGVzIEdldEFsbFNldCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgU2V0QWxsRmllbGRzKGJ1aWxkZXIpOw0KKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLkJ1aWxkKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gU2V0cyBldmVyeSBmaWVsZCBvZiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgdG8gdGhlIHZhbHVlcyBleHBlY3RlZCBieQ0KKyAgICAgICAgLy8vIEFzc2VydEFsbEZpZWxkc1NldC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBTZXRBbGxGaWVsZHMoVGVzdEFsbFR5cGVzLkJ1aWxkZXIgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBtZXNzYWdlLlNldE9wdGlvbmFsSW50MzIoMTAxKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldE9wdGlvbmFsSW50NjQoMTAyKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldE9wdGlvbmFsVWludDMyKDEwMyk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRPcHRpb25hbFVpbnQ2NCgxMDQpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0T3B0aW9uYWxTaW50MzIoMTA1KTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldE9wdGlvbmFsU2ludDY0KDEwNik7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRPcHRpb25hbEZpeGVkMzIoMTA3KTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldE9wdGlvbmFsRml4ZWQ2NCgxMDgpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0T3B0aW9uYWxTZml4ZWQzMigxMDkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0T3B0aW9uYWxTZml4ZWQ2NCgxMTApOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0T3B0aW9uYWxGbG9hdCgxMTEpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0T3B0aW9uYWxEb3VibGUoMTEyKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldE9wdGlvbmFsQm9vbCh0cnVlKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldE9wdGlvbmFsU3RyaW5nKCIxMTUiKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldE9wdGlvbmFsQnl0ZXMoVG9CeXRlcygiMTE2IikpOw0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0T3B0aW9uYWxHcm91cChUZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5DcmVhdGVCdWlsZGVyKCkuU2V0QSgxMTcpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRCYigxMTgpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0QygxMTkpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0T3B0aW9uYWxJbXBvcnRNZXNzYWdlKEltcG9ydE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEQoMTIwKS5CdWlsZCgpKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLlNldE9wdGlvbmFsTmVzdGVkRW51bShUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5CQVopOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0T3B0aW9uYWxGb3JlaWduRW51bShGb3JlaWduRW51bS5GT1JFSUdOX0JBWik7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRPcHRpb25hbEltcG9ydEVudW0oSW1wb3J0RW51bS5JTVBPUlRfQkFaKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLlNldE9wdGlvbmFsU3RyaW5nUGllY2UoIjEyNCIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0T3B0aW9uYWxDb3JkKCIxMjUiKTsNCisNCisgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWRJbnQzMigyMDEpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWRJbnQ2NCgyMDIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWRVaW50MzIoMjAzKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkVWludDY0KDIwNCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZFNpbnQzMigyMDUpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWRTaW50NjQoMjA2KTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkRml4ZWQzMigyMDcpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWRGaXhlZDY0KDIwOCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZFNmaXhlZDMyKDIwOSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZFNmaXhlZDY0KDIxMCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZEZsb2F0KDIxMSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZERvdWJsZSgyMTIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWRCb29sKHRydWUpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWRTdHJpbmcoIjIxNSIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWRCeXRlcyhUb0J5dGVzKCIyMTYiKSk7DQorDQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZEdyb3VwKFRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwLkNyZWF0ZUJ1aWxkZXIoKS5TZXRBKDIxNykuQnVpbGQoKSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEJiKDIxOCkuQnVpbGQoKSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRDKDIxOSkuQnVpbGQoKSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZEltcG9ydE1lc3NhZ2UoSW1wb3J0TWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0RCgyMjApLkJ1aWxkKCkpOw0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWROZXN0ZWRFbnVtKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkJBUik7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZEZvcmVpZ25FbnVtKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkSW1wb3J0RW51bShJbXBvcnRFbnVtLklNUE9SVF9CQVIpOw0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWRTdHJpbmdQaWVjZSgiMjI0Iik7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZENvcmQoIjIyNSIpOw0KKw0KKyAgICAgICAgICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4NCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkSW50MzIoMzAxKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkSW50NjQoMzAyKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkVWludDMyKDMwMyk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZFVpbnQ2NCgzMDQpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWRTaW50MzIoMzA1KTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkU2ludDY0KDMwNik7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZEZpeGVkMzIoMzA3KTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkRml4ZWQ2NCgzMDgpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWRTZml4ZWQzMigzMDkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWRTZml4ZWQ2NCgzMTApOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWRGbG9hdCgzMTEpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWREb3VibGUoMzEyKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkQm9vbChmYWxzZSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZFN0cmluZygiMzE1Iik7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZEJ5dGVzKFRvQnl0ZXMoIjMxNiIpKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkR3JvdXAoVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAuQ3JlYXRlQnVpbGRlcigpLlNldEEoMzE3KS5CdWlsZCgpKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZShUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0QmIoMzE4KS5CdWlsZCgpKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEMoMzE5KS5CdWlsZCgpKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkSW1wb3J0TWVzc2FnZShJbXBvcnRNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXREKDMyMCkuQnVpbGQoKSk7DQorDQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uQkFaKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkRm9yZWlnbkVudW0oRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUmVwZWF0ZWRJbXBvcnRFbnVtKEltcG9ydEVudW0uSU1QT1JUX0JBWik7DQorDQorICAgICAgICAgICAgbWVzc2FnZS5BZGRSZXBlYXRlZFN0cmluZ1BpZWNlKCIzMjQiKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFJlcGVhdGVkQ29yZCgiMzI1Iik7DQorDQorICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisgICAgICAgICAgICBtZXNzYWdlLlNldERlZmF1bHRJbnQzMig0MDEpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RGVmYXVsdEludDY0KDQwMik7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXREZWZhdWx0VWludDMyKDQwMyk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXREZWZhdWx0VWludDY0KDQwNCk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXREZWZhdWx0U2ludDMyKDQwNSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXREZWZhdWx0U2ludDY0KDQwNik7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXREZWZhdWx0Rml4ZWQzMig0MDcpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RGVmYXVsdEZpeGVkNjQoNDA4KTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldERlZmF1bHRTZml4ZWQzMig0MDkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RGVmYXVsdFNmaXhlZDY0KDQxMCk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXREZWZhdWx0RmxvYXQoNDExKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldERlZmF1bHREb3VibGUoNDEyKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldERlZmF1bHRCb29sKGZhbHNlKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldERlZmF1bHRTdHJpbmcoIjQxNSIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RGVmYXVsdEJ5dGVzKFRvQnl0ZXMoIjQxNiIpKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLlNldERlZmF1bHROZXN0ZWRFbnVtKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZPTyk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXREZWZhdWx0Rm9yZWlnbkVudW0oRm9yZWlnbkVudW0uRk9SRUlHTl9GT08pOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RGVmYXVsdEltcG9ydEVudW0oSW1wb3J0RW51bS5JTVBPUlRfRk9PKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLlNldERlZmF1bHRTdHJpbmdQaWVjZSgiNDI0Iik7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXREZWZhdWx0Q29yZCgiNDI1Iik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQXNzZXJ0cyB0aGF0IGFsbCBmaWVsZHMgb2YgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFyZSBzZXQgdG8gdGhlIHZhbHVlcw0KKyAgICAgICAgLy8vIGFzc2lnbmVkIGJ5IFNldEFsbEZpZWxkcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBBc3NlcnRBbGxGaWVsZHNTZXQoVGVzdEFsbFR5cGVzIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc09wdGlvbmFsSW50MzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNPcHRpb25hbEludDY0KTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzT3B0aW9uYWxVaW50MzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNPcHRpb25hbFVpbnQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc09wdGlvbmFsU2ludDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzT3B0aW9uYWxTaW50NjQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNPcHRpb25hbEZpeGVkMzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNPcHRpb25hbEZpeGVkNjQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNPcHRpb25hbFNmaXhlZDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzT3B0aW9uYWxTZml4ZWQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc09wdGlvbmFsRmxvYXQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNPcHRpb25hbERvdWJsZSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc09wdGlvbmFsQm9vbCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc09wdGlvbmFsU3RyaW5nKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzT3B0aW9uYWxCeXRlcyk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc09wdGlvbmFsR3JvdXApOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuT3B0aW9uYWxHcm91cC5IYXNBKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuT3B0aW9uYWxOZXN0ZWRNZXNzYWdlLkhhc0JiKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuT3B0aW9uYWxGb3JlaWduTWVzc2FnZS5IYXNDKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuT3B0aW9uYWxJbXBvcnRNZXNzYWdlLkhhc0QpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNPcHRpb25hbE5lc3RlZEVudW0pOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNPcHRpb25hbEZvcmVpZ25FbnVtKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzT3B0aW9uYWxJbXBvcnRFbnVtKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzT3B0aW9uYWxTdHJpbmdQaWVjZSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc09wdGlvbmFsQ29yZCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwMSwgbWVzc2FnZS5PcHRpb25hbEludDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAyLCBtZXNzYWdlLk9wdGlvbmFsSW50NjQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDN1LCBtZXNzYWdlLk9wdGlvbmFsVWludDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTA0dSwgbWVzc2FnZS5PcHRpb25hbFVpbnQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwNSwgbWVzc2FnZS5PcHRpb25hbFNpbnQzMik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwNiwgbWVzc2FnZS5PcHRpb25hbFNpbnQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwN3UsIG1lc3NhZ2UuT3B0aW9uYWxGaXhlZDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTA4dSwgbWVzc2FnZS5PcHRpb25hbEZpeGVkNjQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDksIG1lc3NhZ2UuT3B0aW9uYWxTZml4ZWQzMik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDExMCwgbWVzc2FnZS5PcHRpb25hbFNmaXhlZDY0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTExLCBtZXNzYWdlLk9wdGlvbmFsRmxvYXQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMTIsIG1lc3NhZ2UuT3B0aW9uYWxEb3VibGUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0cnVlLCBtZXNzYWdlLk9wdGlvbmFsQm9vbCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMTUiLCBtZXNzYWdlLk9wdGlvbmFsU3RyaW5nKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9CeXRlcygiMTE2IiksIG1lc3NhZ2UuT3B0aW9uYWxCeXRlcyk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDExNywgbWVzc2FnZS5PcHRpb25hbEdyb3VwLkEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMTgsIG1lc3NhZ2UuT3B0aW9uYWxOZXN0ZWRNZXNzYWdlLkJiKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTE5LCBtZXNzYWdlLk9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UuQyk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMCwgbWVzc2FnZS5PcHRpb25hbEltcG9ydE1lc3NhZ2UuRCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkJBWiwgbWVzc2FnZS5PcHRpb25hbE5lc3RlZEVudW0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduRW51bS5GT1JFSUdOX0JBWiwgbWVzc2FnZS5PcHRpb25hbEZvcmVpZ25FbnVtKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoSW1wb3J0RW51bS5JTVBPUlRfQkFaLCBtZXNzYWdlLk9wdGlvbmFsSW1wb3J0RW51bSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMjQiLCBtZXNzYWdlLk9wdGlvbmFsU3RyaW5nUGllY2UpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTI1IiwgbWVzc2FnZS5PcHRpb25hbENvcmQpOw0KKw0KKyAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRJbnQzMkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5SZXBlYXRlZEludDY0Q291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkVWludDMyQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkVWludDY0Q291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkU2ludDMyQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkU2ludDY0Q291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkRml4ZWQzMkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5SZXBlYXRlZEZpeGVkNjRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRTZml4ZWQzMkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5SZXBlYXRlZFNmaXhlZDY0Q291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkRmxvYXRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWREb3VibGVDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRCb29sQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkU3RyaW5nQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkQnl0ZXNDb3VudCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRHcm91cENvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5SZXBlYXRlZE5lc3RlZE1lc3NhZ2VDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5SZXBlYXRlZEltcG9ydE1lc3NhZ2VDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWROZXN0ZWRFbnVtQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkRm9yZWlnbkVudW1Db3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRJbXBvcnRFbnVtQ291bnQpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkU3RyaW5nUGllY2VDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRDb3JkQ291bnQpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDEsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRJbnQzMigwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwMiwgbWVzc2FnZS5HZXRSZXBlYXRlZEludDY0KDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjAzdSwgbWVzc2FnZS5HZXRSZXBlYXRlZFVpbnQzMigwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwNHUsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRVaW50NjQoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDUsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRTaW50MzIoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDYsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRTaW50NjQoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDd1LCBtZXNzYWdlLkdldFJlcGVhdGVkRml4ZWQzMigwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwOHUsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaXhlZDY0KDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjA5LCBtZXNzYWdlLkdldFJlcGVhdGVkU2ZpeGVkMzIoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRTZml4ZWQ2NCgwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIxMSwgbWVzc2FnZS5HZXRSZXBlYXRlZEZsb2F0KDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjEyLCBtZXNzYWdlLkdldFJlcGVhdGVkRG91YmxlKDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSwgbWVzc2FnZS5HZXRSZXBlYXRlZEJvb2woMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMjE1IiwgbWVzc2FnZS5HZXRSZXBlYXRlZFN0cmluZygwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRvQnl0ZXMoIjIxNiIpLCBtZXNzYWdlLkdldFJlcGVhdGVkQnl0ZXMoMCkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTcsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRHcm91cCgwKS5BKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjE4LCBtZXNzYWdlLkdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgwKS5CYik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIxOSwgbWVzc2FnZS5HZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDApLkMpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMjAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlKDApLkQpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5CQVIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWROZXN0ZWRFbnVtKDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGb3JlaWduRW51bSgwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEltcG9ydEVudW0uSU1QT1JUX0JBUiwgbWVzc2FnZS5HZXRSZXBlYXRlZEltcG9ydEVudW0oMCkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMjI0IiwgbWVzc2FnZS5HZXRSZXBlYXRlZFN0cmluZ1BpZWNlKDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjIyNSIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRDb3JkKDApKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzAxLCBtZXNzYWdlLkdldFJlcGVhdGVkSW50MzIoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMDIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRJbnQ2NCgxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMwM3UsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRVaW50MzIoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMDR1LCBtZXNzYWdlLkdldFJlcGVhdGVkVWludDY0KDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzA1LCBtZXNzYWdlLkdldFJlcGVhdGVkU2ludDMyKDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzA2LCBtZXNzYWdlLkdldFJlcGVhdGVkU2ludDY0KDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzA3dSwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpeGVkMzIoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMDh1LCBtZXNzYWdlLkdldFJlcGVhdGVkRml4ZWQ2NCgxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMwOSwgbWVzc2FnZS5HZXRSZXBlYXRlZFNmaXhlZDMyKDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzEwLCBtZXNzYWdlLkdldFJlcGVhdGVkU2ZpeGVkNjQoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMTEsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGbG9hdCgxKSwgMC4wKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzEyLCBtZXNzYWdlLkdldFJlcGVhdGVkRG91YmxlKDEpLCAwLjApOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmYWxzZSwgbWVzc2FnZS5HZXRSZXBlYXRlZEJvb2woMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMzE1IiwgbWVzc2FnZS5HZXRSZXBlYXRlZFN0cmluZygxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRvQnl0ZXMoIjMxNiIpLCBtZXNzYWdlLkdldFJlcGVhdGVkQnl0ZXMoMSkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMTcsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRHcm91cCgxKS5BKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzE4LCBtZXNzYWdlLkdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgxKS5CYik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMxOSwgbWVzc2FnZS5HZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDEpLkMpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMjAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlKDEpLkQpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5CQVosIG1lc3NhZ2UuR2V0UmVwZWF0ZWROZXN0ZWRFbnVtKDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGb3JlaWduRW51bSgxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEltcG9ydEVudW0uSU1QT1JUX0JBWiwgbWVzc2FnZS5HZXRSZXBlYXRlZEltcG9ydEVudW0oMSkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMzI0IiwgbWVzc2FnZS5HZXRSZXBlYXRlZFN0cmluZ1BpZWNlKDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjMyNSIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRDb3JkKDEpKTsNCisNCisgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNEZWZhdWx0SW50MzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNEZWZhdWx0SW50NjQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNEZWZhdWx0VWludDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRGVmYXVsdFVpbnQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0RlZmF1bHRTaW50MzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNEZWZhdWx0U2ludDY0KTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRGVmYXVsdEZpeGVkMzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNEZWZhdWx0Rml4ZWQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0RlZmF1bHRTZml4ZWQzMik7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0RlZmF1bHRTZml4ZWQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0RlZmF1bHRGbG9hdCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0RlZmF1bHREb3VibGUpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNEZWZhdWx0Qm9vbCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0RlZmF1bHRTdHJpbmcpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNEZWZhdWx0Qnl0ZXMpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNEZWZhdWx0TmVzdGVkRW51bSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0RlZmF1bHRGb3JlaWduRW51bSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0RlZmF1bHRJbXBvcnRFbnVtKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRGVmYXVsdFN0cmluZ1BpZWNlKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRGVmYXVsdENvcmQpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MDEsIG1lc3NhZ2UuRGVmYXVsdEludDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDAyLCBtZXNzYWdlLkRlZmF1bHRJbnQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQwM3UsIG1lc3NhZ2UuRGVmYXVsdFVpbnQzMik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQwNHUsIG1lc3NhZ2UuRGVmYXVsdFVpbnQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQwNSwgbWVzc2FnZS5EZWZhdWx0U2ludDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDA2LCBtZXNzYWdlLkRlZmF1bHRTaW50NjQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MDd1LCBtZXNzYWdlLkRlZmF1bHRGaXhlZDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDA4dSwgbWVzc2FnZS5EZWZhdWx0Rml4ZWQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQwOSwgbWVzc2FnZS5EZWZhdWx0U2ZpeGVkMzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MTAsIG1lc3NhZ2UuRGVmYXVsdFNmaXhlZDY0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDExLCBtZXNzYWdlLkRlZmF1bHRGbG9hdCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQxMiwgbWVzc2FnZS5EZWZhdWx0RG91YmxlKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZmFsc2UsIG1lc3NhZ2UuRGVmYXVsdEJvb2wpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiNDE1IiwgbWVzc2FnZS5EZWZhdWx0U3RyaW5nKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9CeXRlcygiNDE2IiksIG1lc3NhZ2UuRGVmYXVsdEJ5dGVzKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uRk9PLCBtZXNzYWdlLkRlZmF1bHROZXN0ZWRFbnVtKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRm9yZWlnbkVudW0uRk9SRUlHTl9GT08sIG1lc3NhZ2UuRGVmYXVsdEZvcmVpZ25FbnVtKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoSW1wb3J0RW51bS5JTVBPUlRfRk9PLCBtZXNzYWdlLkRlZmF1bHRJbXBvcnRFbnVtKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjQyNCIsIG1lc3NhZ2UuRGVmYXVsdFN0cmluZ1BpZWNlKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjQyNSIsIG1lc3NhZ2UuRGVmYXVsdENvcmQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgQXNzZXJ0Q2xlYXIoVGVzdEFsbFR5cGVzIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gSGFzQmxhaCgpIHNob3VsZCBpbml0aWFsbHkgYmUgZmFsc2UgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMuDQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNPcHRpb25hbEludDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc09wdGlvbmFsSW50NjQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzT3B0aW9uYWxVaW50MzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzT3B0aW9uYWxVaW50NjQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzT3B0aW9uYWxTaW50MzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzT3B0aW9uYWxTaW50NjQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzT3B0aW9uYWxGaXhlZDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc09wdGlvbmFsRml4ZWQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNPcHRpb25hbFNmaXhlZDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc09wdGlvbmFsU2ZpeGVkNjQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzT3B0aW9uYWxGbG9hdCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNPcHRpb25hbERvdWJsZSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNPcHRpb25hbEJvb2wpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzT3B0aW9uYWxTdHJpbmcpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzT3B0aW9uYWxCeXRlcyk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNPcHRpb25hbEdyb3VwKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNPcHRpb25hbE5lc3RlZEVudW0pOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzT3B0aW9uYWxGb3JlaWduRW51bSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNPcHRpb25hbEltcG9ydEVudW0pOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzT3B0aW9uYWxTdHJpbmdQaWVjZSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNPcHRpb25hbENvcmQpOw0KKw0KKyAgICAgICAgICAgIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gemVybyBvciBzb21ldGhpbmcgbGlrZSBpdC4NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5PcHRpb25hbEludDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5PcHRpb25hbEludDY0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHUsIG1lc3NhZ2UuT3B0aW9uYWxVaW50MzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwdSwgbWVzc2FnZS5PcHRpb25hbFVpbnQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuT3B0aW9uYWxTaW50MzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLk9wdGlvbmFsU2ludDY0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHUsIG1lc3NhZ2UuT3B0aW9uYWxGaXhlZDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHUsIG1lc3NhZ2UuT3B0aW9uYWxGaXhlZDY0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5PcHRpb25hbFNmaXhlZDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5PcHRpb25hbFNmaXhlZDY0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5PcHRpb25hbEZsb2F0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5PcHRpb25hbERvdWJsZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZhbHNlLCBtZXNzYWdlLk9wdGlvbmFsQm9vbCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIiLCBtZXNzYWdlLk9wdGlvbmFsU3RyaW5nKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQnl0ZVN0cmluZy5FbXB0eSwgbWVzc2FnZS5PcHRpb25hbEJ5dGVzKTsNCisNCisgICAgICAgICAgICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4NCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLk9wdGlvbmFsR3JvdXAuSGFzQSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5PcHRpb25hbE5lc3RlZE1lc3NhZ2UuSGFzQmIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuT3B0aW9uYWxGb3JlaWduTWVzc2FnZS5IYXNDKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLk9wdGlvbmFsSW1wb3J0TWVzc2FnZS5IYXNEKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5PcHRpb25hbEdyb3VwLkEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLk9wdGlvbmFsTmVzdGVkTWVzc2FnZS5CYik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuT3B0aW9uYWxGb3JlaWduTWVzc2FnZS5DKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5PcHRpb25hbEltcG9ydE1lc3NhZ2UuRCk7DQorDQorICAgICAgICAgICAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uRk9PLCBtZXNzYWdlLk9wdGlvbmFsTmVzdGVkRW51bSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PLCBtZXNzYWdlLk9wdGlvbmFsRm9yZWlnbkVudW0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChJbXBvcnRFbnVtLklNUE9SVF9GT08sIG1lc3NhZ2UuT3B0aW9uYWxJbXBvcnRFbnVtKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiIsIG1lc3NhZ2UuT3B0aW9uYWxTdHJpbmdQaWVjZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIiLCBtZXNzYWdlLk9wdGlvbmFsQ29yZCk7DQorDQorICAgICAgICAgICAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5SZXBlYXRlZEludDMyQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLlJlcGVhdGVkSW50NjRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRVaW50MzJDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRVaW50NjRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRTaW50MzJDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRTaW50NjRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRGaXhlZDMyQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLlJlcGVhdGVkRml4ZWQ2NENvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5SZXBlYXRlZFNmaXhlZDMyQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLlJlcGVhdGVkU2ZpeGVkNjRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRGbG9hdENvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5SZXBlYXRlZERvdWJsZUNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5SZXBlYXRlZEJvb2xDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRTdHJpbmdDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRCeXRlc0NvdW50KTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5SZXBlYXRlZEdyb3VwQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLlJlcGVhdGVkTmVzdGVkTWVzc2FnZUNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5SZXBlYXRlZEZvcmVpZ25NZXNzYWdlQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLlJlcGVhdGVkSW1wb3J0TWVzc2FnZUNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5SZXBlYXRlZE5lc3RlZEVudW1Db3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRGb3JlaWduRW51bUNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5SZXBlYXRlZEltcG9ydEVudW1Db3VudCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRTdHJpbmdQaWVjZUNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5SZXBlYXRlZENvcmRDb3VudCk7DQorDQorICAgICAgICAgICAgLy8gSGFzQmxhaCgpIHNob3VsZCBhbHNvIGJlIGZhbHNlIGZvciBhbGwgZGVmYXVsdCBmaWVsZHMuDQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNEZWZhdWx0SW50MzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRGVmYXVsdEludDY0KTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0RlZmF1bHRVaW50MzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRGVmYXVsdFVpbnQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNEZWZhdWx0U2ludDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0RlZmF1bHRTaW50NjQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRGVmYXVsdEZpeGVkMzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRGVmYXVsdEZpeGVkNjQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRGVmYXVsdFNmaXhlZDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0RlZmF1bHRTZml4ZWQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNEZWZhdWx0RmxvYXQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRGVmYXVsdERvdWJsZSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNEZWZhdWx0Qm9vbCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNEZWZhdWx0U3RyaW5nKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0RlZmF1bHRCeXRlcyk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNEZWZhdWx0TmVzdGVkRW51bSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNEZWZhdWx0Rm9yZWlnbkVudW0pOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRGVmYXVsdEltcG9ydEVudW0pOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRGVmYXVsdFN0cmluZ1BpZWNlKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0RlZmF1bHRDb3JkKTsNCisNCisgICAgICAgICAgICAvLyBGaWVsZHMgd2l0aCBkZWZhdWx0cyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzIChkdWgpLg0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MSwgbWVzc2FnZS5EZWZhdWx0SW50MzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MiwgbWVzc2FnZS5EZWZhdWx0SW50NjQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0M3UsIG1lc3NhZ2UuRGVmYXVsdFVpbnQzMik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQ0dSwgbWVzc2FnZS5EZWZhdWx0VWludDY0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTQ1LCBtZXNzYWdlLkRlZmF1bHRTaW50MzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0NiwgbWVzc2FnZS5EZWZhdWx0U2ludDY0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDd1LCBtZXNzYWdlLkRlZmF1bHRGaXhlZDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDh1LCBtZXNzYWdlLkRlZmF1bHRGaXhlZDY0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDksIG1lc3NhZ2UuRGVmYXVsdFNmaXhlZDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTUwLCBtZXNzYWdlLkRlZmF1bHRTZml4ZWQ2NCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUxLjUsIG1lc3NhZ2UuRGVmYXVsdEZsb2F0LCAwLjApOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MmUzLCBtZXNzYWdlLkRlZmF1bHREb3VibGUsIDAuMCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsIG1lc3NhZ2UuRGVmYXVsdEJvb2wpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaGVsbG8iLCBtZXNzYWdlLkRlZmF1bHRTdHJpbmcpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb0J5dGVzKCJ3b3JsZCIpLCBtZXNzYWdlLkRlZmF1bHRCeXRlcyk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkJBUiwgbWVzc2FnZS5EZWZhdWx0TmVzdGVkRW51bSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLCBtZXNzYWdlLkRlZmF1bHRGb3JlaWduRW51bSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEltcG9ydEVudW0uSU1QT1JUX0JBUiwgbWVzc2FnZS5EZWZhdWx0SW1wb3J0RW51bSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJhYmMiLCBtZXNzYWdlLkRlZmF1bHRTdHJpbmdQaWVjZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMjMiLCBtZXNzYWdlLkRlZmF1bHRDb3JkKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXQgYSBUZXN0QWxsRXh0ZW5zaW9ucyB3aXRoIGFsbCBmaWVsZHMgc2V0IGFzIHRoZXkgd291bGQgYmUgYnkNCisgICAgICAgIC8vLyBTZXRBbGxFeHRlbnNpb25zKFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIpLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBHZXRBbGxFeHRlbnNpb25zU2V0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgU2V0QWxsRXh0ZW5zaW9ucyhidWlsZGVyKTsNCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXMgR2V0UGFja2VkU2V0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0UGFja2VkVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdFBhY2tlZFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBTZXRQYWNrZWRGaWVsZHMoYnVpbGRlcik7DQorICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuQnVpbGQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgR2V0UGFja2VkRXh0ZW5zaW9uc1NldCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdFBhY2tlZEV4dGVuc2lvbnMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIFNldFBhY2tlZEV4dGVuc2lvbnMoYnVpbGRlcik7DQorICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuQnVpbGQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXRzIGV2ZXJ5IGZpZWxkIG9mIHRoZSBzcGVjaWZpZWQgYnVpbGRlciB0byB0aGUgdmFsdWVzIGV4cGVjdGVkIGJ5DQorICAgICAgICAvLy8gQXNzZXJ0QWxsRXh0ZW5zaW9uc1NldC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBTZXRBbGxFeHRlbnNpb25zKFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uLCAxMDEpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50NjRFeHRlbnNpb24sIDEwMkwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsVWludDMyRXh0ZW5zaW9uLCAxMDNVKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFVpbnQ2NEV4dGVuc2lvbiwgMTA0VUwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uLCAxMDUpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uLCAxMDZMKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZpeGVkMzJFeHRlbnNpb24sIDEwN1UpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbiwgMTA4VUwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb24sIDEwOSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbiwgMTEwTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGbG9hdEV4dGVuc2lvbiwgMTExRik7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxEb3VibGVFeHRlbnNpb24sIDExMkQpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQm9vbEV4dGVuc2lvbiwgdHJ1ZSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdFeHRlbnNpb24sICIxMTUiKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEJ5dGVzRXh0ZW5zaW9uLCBUb0J5dGVzKCIxMTYiKSk7DQorDQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxHcm91cEV4dGVuc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbi5DcmVhdGVCdWlsZGVyKCkuU2V0QSgxMTcpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0QmIoMTE4KS5CdWlsZCgpKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcmVpZ25NZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRDKDExOSkuQnVpbGQoKSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEQoMTIwKS5CdWlsZCgpKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24sIFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkJBWik7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbiwgRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbiwgSW1wb3J0RW51bS5JTVBPUlRfQkFaKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAiMTI0Iik7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxDb3JkRXh0ZW5zaW9uLCAiMTI1Iik7DQorDQorICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uLCAyMDEpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW50NjRFeHRlbnNpb24sIDIwMkwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkVWludDMyRXh0ZW5zaW9uLCAyMDNVKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiwgMjA0VUwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uLCAyMDUpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uLCAyMDZMKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24sIDIwN1UpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiwgMjA4VUwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24sIDIwOSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMjEwTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiwgMjExRik7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWREb3VibGVFeHRlbnNpb24sIDIxMkQpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQm9vbEV4dGVuc2lvbiwgdHJ1ZSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24sICIyMTUiKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uLCBUb0J5dGVzKCIyMTYiKSk7DQorDQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRHcm91cEV4dGVuc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5DcmVhdGVCdWlsZGVyKCkuU2V0QSgyMTcpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0QmIoMjE4KS5CdWlsZCgpKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcmVpZ25NZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRDKDIxOSkuQnVpbGQoKSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEQoMjIwKS5CdWlsZCgpKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24sIFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkJBUik7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiwgSW1wb3J0RW51bS5JTVBPUlRfQkFSKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAiMjI0Iik7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRDb3JkRXh0ZW5zaW9uLCAiMjI1Iik7DQorDQorICAgICAgICAgICAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLg0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDMwMSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiwgMzAyTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRVaW50MzJFeHRlbnNpb24sIDMwM1UpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkVWludDY0RXh0ZW5zaW9uLCAzMDRVTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTaW50MzJFeHRlbnNpb24sIDMwNSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTaW50NjRFeHRlbnNpb24sIDMwNkwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiwgMzA3VSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uLCAzMDhVTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbiwgMzA5KTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uLCAzMTBMKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZsb2F0RXh0ZW5zaW9uLCAzMTFGKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbiwgMzEyRCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRCb29sRXh0ZW5zaW9uLCBmYWxzZSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24sICIzMTUiKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uLCBUb0J5dGVzKCIzMTYiKSk7DQorDQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRHcm91cEV4dGVuc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5DcmVhdGVCdWlsZGVyKCkuU2V0QSgzMTcpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0QmIoMzE4KS5CdWlsZCgpKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcmVpZ25NZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRDKDMxOSkuQnVpbGQoKSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEQoMzIwKS5CdWlsZCgpKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24sIFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkJBWik7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiwgSW1wb3J0RW51bS5JTVBPUlRfQkFaKTsNCisNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAiMzI0Iik7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRDb3JkRXh0ZW5zaW9uLCAiMzI1Iik7DQorDQorICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW50MzJFeHRlbnNpb24sIDQwMSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEludDY0RXh0ZW5zaW9uLCA0MDJMKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0VWludDMyRXh0ZW5zaW9uLCA0MDNVKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0VWludDY0RXh0ZW5zaW9uLCA0MDRVTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNpbnQzMkV4dGVuc2lvbiwgNDA1KTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ludDY0RXh0ZW5zaW9uLCA0MDZMKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbiwgNDA3VSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZpeGVkNjRFeHRlbnNpb24sIDQwOFVMKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb24sIDQwOSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uLCA0MTBMKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0RmxvYXRFeHRlbnNpb24sIDQxMUYpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHREb3VibGVFeHRlbnNpb24sIDQxMkQpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRCb29sRXh0ZW5zaW9uLCBmYWxzZSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFN0cmluZ0V4dGVuc2lvbiwgIjQxNSIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRCeXRlc0V4dGVuc2lvbiwgVG9CeXRlcygiNDE2IikpOw0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uLCBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5GT08pOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbiwgRm9yZWlnbkVudW0uRk9SRUlHTl9GT08pOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uLCBJbXBvcnRFbnVtLklNUE9SVF9GT08pOw0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgIjQyNCIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRDb3JkRXh0ZW5zaW9uLCAiNDI1Iik7DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBNb2RpZnlSZXBlYXRlZEZpZWxkcyhUZXN0QWxsVHlwZXMuQnVpbGRlciBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0UmVwZWF0ZWRJbnQzMigxLCA1MDEpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0UmVwZWF0ZWRJbnQ2NCgxLCA1MDIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0UmVwZWF0ZWRVaW50MzIoMSwgNTAzKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldFJlcGVhdGVkVWludDY0KDEsIDUwNCk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRSZXBlYXRlZFNpbnQzMigxLCA1MDUpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0UmVwZWF0ZWRTaW50NjQoMSwgNTA2KTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldFJlcGVhdGVkRml4ZWQzMigxLCA1MDcpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0UmVwZWF0ZWRGaXhlZDY0KDEsIDUwOCk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRSZXBlYXRlZFNmaXhlZDMyKDEsIDUwOSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRSZXBlYXRlZFNmaXhlZDY0KDEsIDUxMCk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRSZXBlYXRlZEZsb2F0KDEsIDUxMSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRSZXBlYXRlZERvdWJsZSgxLCA1MTIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0UmVwZWF0ZWRCb29sKDEsIHRydWUpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0UmVwZWF0ZWRTdHJpbmcoMSwgIjUxNSIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0UmVwZWF0ZWRCeXRlcygxLCBUb0J5dGVzKCI1MTYiKSk7DQorDQorICAgICAgICAgICAgbWVzc2FnZS5TZXRSZXBlYXRlZEdyb3VwKDEsIFRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwLkNyZWF0ZUJ1aWxkZXIoKS5TZXRBKDUxNykuQnVpbGQoKSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoMSwgVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEJiKDUxOCkuQnVpbGQoKSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDEsIEZvcmVpZ25NZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRDKDUxOSkuQnVpbGQoKSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2UoMSwgSW1wb3J0TWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0RCg1MjApLkJ1aWxkKCkpOw0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0UmVwZWF0ZWROZXN0ZWRFbnVtKDEsIFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZPTyk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRSZXBlYXRlZEZvcmVpZ25FbnVtKDEsIEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldFJlcGVhdGVkSW1wb3J0RW51bSgxLCBJbXBvcnRFbnVtLklNUE9SVF9GT08pOw0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0UmVwZWF0ZWRTdHJpbmdQaWVjZSgxLCAiNTI0Iik7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRSZXBlYXRlZENvcmQoMSwgIjUyNSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgQXNzZXJ0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZChUZXN0QWxsVHlwZXMgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBNb2RpZnlSZXBlYXRlZEZpZWxkcyBvbmx5IHNldHMgdGhlIHNlY29uZCByZXBlYXRlZCBlbGVtZW50IG9mIGVhY2gNCisgICAgICAgICAgICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdA0KKyAgICAgICAgICAgIC8vIGVsZW1lbnQgYW5kIHNpemUgd2VyZSAqbm90KiBtb2RpZmllZC4NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5SZXBlYXRlZEludDMyQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkSW50NjRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRVaW50MzJDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRVaW50NjRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRTaW50MzJDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRTaW50NjRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRGaXhlZDMyQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkRml4ZWQ2NENvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5SZXBlYXRlZFNmaXhlZDMyQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkU2ZpeGVkNjRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRGbG9hdENvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5SZXBlYXRlZERvdWJsZUNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5SZXBlYXRlZEJvb2xDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRTdHJpbmdDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRCeXRlc0NvdW50KTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5SZXBlYXRlZEdyb3VwQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkTmVzdGVkTWVzc2FnZUNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5SZXBlYXRlZEZvcmVpZ25NZXNzYWdlQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlJlcGVhdGVkSW1wb3J0TWVzc2FnZUNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5SZXBlYXRlZE5lc3RlZEVudW1Db3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRGb3JlaWduRW51bUNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5SZXBlYXRlZEltcG9ydEVudW1Db3VudCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUmVwZWF0ZWRTdHJpbmdQaWVjZUNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5SZXBlYXRlZENvcmRDb3VudCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwMSwgbWVzc2FnZS5HZXRSZXBlYXRlZEludDMyKDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjAyTCwgbWVzc2FnZS5HZXRSZXBlYXRlZEludDY0KDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjAzVSwgbWVzc2FnZS5HZXRSZXBlYXRlZFVpbnQzMigwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwNFVMLCBtZXNzYWdlLkdldFJlcGVhdGVkVWludDY0KDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjA1LCBtZXNzYWdlLkdldFJlcGVhdGVkU2ludDMyKDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjA2TCwgbWVzc2FnZS5HZXRSZXBlYXRlZFNpbnQ2NCgwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwN1UsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaXhlZDMyKDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjA4VUwsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGaXhlZDY0KDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjA5LCBtZXNzYWdlLkdldFJlcGVhdGVkU2ZpeGVkMzIoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTBMLCBtZXNzYWdlLkdldFJlcGVhdGVkU2ZpeGVkNjQoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTFGLCBtZXNzYWdlLkdldFJlcGVhdGVkRmxvYXQoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTJELCBtZXNzYWdlLkdldFJlcGVhdGVkRG91YmxlKDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSwgbWVzc2FnZS5HZXRSZXBlYXRlZEJvb2woMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMjE1IiwgbWVzc2FnZS5HZXRSZXBlYXRlZFN0cmluZygwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRvQnl0ZXMoIjIxNiIpLCBtZXNzYWdlLkdldFJlcGVhdGVkQnl0ZXMoMCkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTcsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRHcm91cCgwKS5BKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjE4LCBtZXNzYWdlLkdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgwKS5CYik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIxOSwgbWVzc2FnZS5HZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDApLkMpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMjAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlKDApLkQpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5CQVIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWROZXN0ZWRFbnVtKDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGb3JlaWduRW51bSgwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEltcG9ydEVudW0uSU1QT1JUX0JBUiwgbWVzc2FnZS5HZXRSZXBlYXRlZEltcG9ydEVudW0oMCkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMjI0IiwgbWVzc2FnZS5HZXRSZXBlYXRlZFN0cmluZ1BpZWNlKDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjIyNSIsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRDb3JkKDApKTsNCisNCisgICAgICAgICAgICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTAxLCBtZXNzYWdlLkdldFJlcGVhdGVkSW50MzIoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDJMLCBtZXNzYWdlLkdldFJlcGVhdGVkSW50NjQoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDNVLCBtZXNzYWdlLkdldFJlcGVhdGVkVWludDMyKDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTA0VUwsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRVaW50NjQoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDUsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRTaW50MzIoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDZMLCBtZXNzYWdlLkdldFJlcGVhdGVkU2ludDY0KDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTA3VSwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpeGVkMzIoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDhVTCwgbWVzc2FnZS5HZXRSZXBlYXRlZEZpeGVkNjQoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDksIG1lc3NhZ2UuR2V0UmVwZWF0ZWRTZml4ZWQzMigxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUxMEwsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRTZml4ZWQ2NCgxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUxMUYsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRGbG9hdCgxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUxMkQsIG1lc3NhZ2UuR2V0UmVwZWF0ZWREb3VibGUoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0cnVlLCBtZXNzYWdlLkdldFJlcGVhdGVkQm9vbCgxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI1MTUiLCBtZXNzYWdlLkdldFJlcGVhdGVkU3RyaW5nKDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9CeXRlcygiNTE2IiksIG1lc3NhZ2UuR2V0UmVwZWF0ZWRCeXRlcygxKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUxNywgbWVzc2FnZS5HZXRSZXBlYXRlZEdyb3VwKDEpLkEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MTgsIG1lc3NhZ2UuR2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlKDEpLkJiKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTE5LCBtZXNzYWdlLkdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMSkuQyk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUyMCwgbWVzc2FnZS5HZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2UoMSkuRCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZPTywgbWVzc2FnZS5HZXRSZXBlYXRlZE5lc3RlZEVudW0oMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduRW51bS5GT1JFSUdOX0ZPTywgbWVzc2FnZS5HZXRSZXBlYXRlZEZvcmVpZ25FbnVtKDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoSW1wb3J0RW51bS5JTVBPUlRfRk9PLCBtZXNzYWdlLkdldFJlcGVhdGVkSW1wb3J0RW51bSgxKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI1MjQiLCBtZXNzYWdlLkdldFJlcGVhdGVkU3RyaW5nUGllY2UoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiNTI1IiwgbWVzc2FnZS5HZXRSZXBlYXRlZENvcmQoMSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEhlbHBlciB0byBhc3NlcnQgdGhhdCBzZXF1ZW5jZXMgYXJlIGVxdWFsLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEFzc2VydEVxdWFsPFQ+KElFbnVtZXJhYmxlPFQ+IGZpcnN0LCBJRW51bWVyYWJsZTxUPiBzZWNvbmQpDQorICAgICAgICB7DQorICAgICAgICAgICAgdXNpbmcgKElFbnVtZXJhdG9yPFQ+IGZpcnN0RW51bWVyYXRvciA9IGZpcnN0LkdldEVudW1lcmF0b3IoKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKFQgc2Vjb25kRWxlbWVudCBpbiBzZWNvbmQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoZmlyc3RFbnVtZXJhdG9yLk1vdmVOZXh0KCksICJGaXJzdCBlbnVtZXJhdG9yIHJhbiBvdXQgb2YgZWxlbWVudHMgdG9vIGVhcmx5LiIpOw0KKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZpcnN0RW51bWVyYXRvci5DdXJyZW50LCBzZWNvbmRFbGVtZW50KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShmaXJzdEVudW1lcmF0b3IuTW92ZU5leHQoKSwgIlNlY29uZCBlbnVtZXJhdG9yIHJhbiBvdXQgb2YgZWxlbWVudHMgdG9vIGVhcmx5LiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEFzc2VydEVxdWFsQnl0ZXMoYnl0ZVtdIGV4cGVjdGVkLCBieXRlW10gYWN0dWFsKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChCeXRlU3RyaW5nLkNvcHlGcm9tKGV4cGVjdGVkKSwgQnl0ZVN0cmluZy5Db3B5RnJvbShhY3R1YWwpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEFzc2VydEFsbEV4dGVuc2lvbnNTZXQoVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsVWludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFVpbnQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTaW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZpeGVkMzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGbG9hdEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxEb3VibGVFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQm9vbEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQnl0ZXNFeHRlbnNpb24pKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsR3JvdXBFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEdyb3VwRXh0ZW5zaW9uKS5IYXNBKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbikuSGFzQmIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbikuSGFzQyk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb24pLkhhc0QpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb24pKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQ29yZEV4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAyTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbnQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDNVLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFVpbnQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDRVTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxVaW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTA1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFNpbnQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDZMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFNpbnQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDdVLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZpeGVkMzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTA4VUwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTEwTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMTFGLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZsb2F0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDExMkQsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQm9vbEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9CeXRlcygiMTE2IiksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQnl0ZXNFeHRlbnNpb24pKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEdyb3VwRXh0ZW5zaW9uKS5BKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24pLkJiKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKS5DKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb24pLkQpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5CQVosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduRW51bS5GT1JFSUdOX0JBWiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChJbXBvcnRFbnVtLklNUE9SVF9CQVosIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTI0IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxDb3JkRXh0ZW5zaW9uKSk7DQorDQorICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkVWludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRVaW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNpbnQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZsb2F0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWREb3VibGVFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEJvb2xFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ0V4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQnl0ZXNFeHRlbnNpb24pKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEdyb3VwRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24pKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRDb3JkRXh0ZW5zaW9uKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwMSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDJMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEludDY0RXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwM1UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkVWludDMyRXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwNFVMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDUsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwNkwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwN1UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDhVTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTBMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIxMUYsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRmxvYXRFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjEyRCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWREb3VibGVFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRCb29sRXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb0J5dGVzKCIyMTYiKSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiwgMCkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkR3JvdXBFeHRlbnNpb24sIDApLkEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiwgMCkuQmIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sIDApLkMpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiwgMCkuRCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkJBUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEltcG9ydEVudW0uSU1QT1JUX0JBUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uLCAwKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyMjQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyMjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZENvcmRFeHRlbnNpb24sIDApKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzAxLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMwMkwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW50NjRFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzAzVSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRVaW50MzJFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzA0VUwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkVWludDY0RXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMwNSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTaW50MzJFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzA2TCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTaW50NjRFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzA3VSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMwOFVMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzA5LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMxMEwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzExRiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMTJELCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmYWxzZSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRCb29sRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIzMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb0J5dGVzKCIzMTYiKSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiwgMSkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMTcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkR3JvdXBFeHRlbnNpb24sIDEpLkEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiwgMSkuQmIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sIDEpLkMpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiwgMSkuRCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkJBWiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEltcG9ydEVudW0uSU1QT1JUX0JBWiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uLCAxKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIzMjQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIzMjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZENvcmRFeHRlbnNpb24sIDEpKTsNCisNCisgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRVaW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRVaW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTaW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTaW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGbG9hdEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdERvdWJsZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEJvb2xFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRCeXRlc0V4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb24pKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdENvcmRFeHRlbnNpb24pKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDAxLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDAyTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEludDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQwM1UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRVaW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDA0VUwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRVaW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDA1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQwNkwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTaW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDA3VSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZpeGVkMzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDA4VUwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQwOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQxMEwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MTFGLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0RmxvYXRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDEyRCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdERvdWJsZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmYWxzZSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEJvb2xFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjQxNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9CeXRlcygiNDE2IiksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRCeXRlc0V4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5GT08sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoSW1wb3J0RW51bS5JTVBPUlRfRk9PLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiNDI0IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI0MjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Q29yZEV4dGVuc2lvbikpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE1vZGlmaWVzIHRoZSByZXBlYXRlZCBleHRlbnNpb25zIG9mIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGNvbnRhaW4gdGhlIHZhbHVlcw0KKyAgICAgICAgLy8vIGV4cGVjdGVkIGJ5IEFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIE1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9ucyhUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiwgMSwgNTAxKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEludDY0RXh0ZW5zaW9uLCAxLCA1MDJMKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiwgMSwgNTAzVSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRVaW50NjRFeHRlbnNpb24sIDEsIDUwNFVMKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiwgMSwgNTA1KTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiwgMSwgNTA2TCk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uLCAxLCA1MDdVKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24sIDEsIDUwOFVMKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uLCAxLCA1MDkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24sIDEsIDUxMEwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRmxvYXRFeHRlbnNpb24sIDEsIDUxMUYpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uLCAxLCA1MTJEKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEJvb2xFeHRlbnNpb24sIDEsIHRydWUpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uLCAxLCAiNTE1Iik7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiwgMSwgVG9CeXRlcygiNTE2IikpOw0KKw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkR3JvdXBFeHRlbnNpb24sIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24uQ3JlYXRlQnVpbGRlcigpLlNldEEoNTE3KS5CdWlsZCgpKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24sIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEJiKDUxOCkuQnVpbGQoKSk7DQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JlaWduTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0Qyg1MTkpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBvcnRNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXREKDUyMCkuQnVpbGQoKSk7DQorDQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uLCAxLCBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5GT08pOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24sIDEsIEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PKTsNCisgICAgICAgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24sIDEsIEltcG9ydEVudW0uSU1QT1JUX0ZPTyk7DQorDQorICAgICAgICAgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgMSwgIjUyNCIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQ29yZEV4dGVuc2lvbiwgMSwgIjUyNSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFzc2VydHMgdGhhdCBhbGwgcmVwZWF0ZWQgZXh0ZW5zaW9ucyBhcmUgc2V0IHRvIHRoZSB2YWx1ZXMgYXNzaWduZWQgYnkNCisgICAgICAgIC8vLyBTZXRBbGxFeHRlbnNpb25zIGZvbGx3ZWQgYnkgTW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gTW9kaWZ5UmVwZWF0ZWRGaWVsZHMgb25seSBzZXRzIHRoZSBzZWNvbmQgcmVwZWF0ZWQgZWxlbWVudCBvZiBlYWNoDQorICAgICAgICAgICAgLy8gZmllbGQuICBJbiBhZGRpdGlvbiB0byB2ZXJpZnlpbmcgdGhpcywgd2UgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgZmlyc3QNCisgICAgICAgICAgICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkVWludDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTaW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGbG9hdEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRCb29sRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRHcm91cEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQ29yZEV4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjAyTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDNVLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDRVTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRVaW50NjRFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjA1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDZMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDdVLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjA4VUwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMDksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjEwTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTFGLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZsb2F0RXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIxMkQsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQm9vbEV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMjE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9CeXRlcygiMjE2IiksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQnl0ZXNFeHRlbnNpb24sIDApKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEdyb3VwRXh0ZW5zaW9uLCAwKS5BKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24sIDApLkJiKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLCAwKS5DKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24sIDApLkQpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5CQVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduRW51bS5GT1JFSUdOX0JBUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChJbXBvcnRFbnVtLklNUE9SVF9CQVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiwgMCkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMjI0IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMjI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRDb3JkRXh0ZW5zaW9uLCAwKSk7DQorDQorICAgICAgICAgICAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUwMSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDJMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEludDY0RXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUwM1UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkVWludDMyRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUwNFVMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDUsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUwNkwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUwN1UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDhVTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUwOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MTBMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUxMUYsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRmxvYXRFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTEyRCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWREb3VibGVFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRCb29sRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI1MTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb0J5dGVzKCI1MTYiKSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiwgMSkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MTcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkR3JvdXBFeHRlbnNpb24sIDEpLkEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiwgMSkuQmIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sIDEpLkMpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiwgMSkuRCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZPTywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEltcG9ydEVudW0uSU1QT1JUX0ZPTywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uLCAxKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI1MjQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI1MjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZENvcmRFeHRlbnNpb24sIDEpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEFzc2VydEV4dGVuc2lvbnNDbGVhcihUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIEhhc0JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLg0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEludDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxVaW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFVpbnQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTaW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZpeGVkMzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZpeGVkNjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRmxvYXRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbERvdWJsZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQm9vbEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxCeXRlc0V4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsR3JvdXBFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbENvcmRFeHRlbnNpb24pKTsNCisNCisgICAgICAgICAgICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMEwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMFUsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsVWludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDBVTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxVaW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTaW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMEwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDBVLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZpeGVkMzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMFVMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZpeGVkNjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwRiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGbG9hdEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwRCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxEb3VibGVFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZmFsc2UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQm9vbEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQnl0ZVN0cmluZy5FbXB0eSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxCeXRlc0V4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIC8vIEVtYmVkZGVkIG1lc3NhZ2VzIHNob3VsZCBhbHNvIGJlIGNsZWFyLg0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsR3JvdXBFeHRlbnNpb24pLkhhc0EpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbikuSGFzQmIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pLkhhc0MpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbikuSGFzRCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsR3JvdXBFeHRlbnNpb24pLkEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24pLkJiKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbikuQyk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbikuRCk7DQorDQorICAgICAgICAgICAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uRk9PLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRm9yZWlnbkVudW0uRk9SRUlHTl9GT08sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoSW1wb3J0RW51bS5JTVBPUlRfRk9PLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb24pKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQ29yZEV4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFVpbnQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkVWludDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTaW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGbG9hdEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRCb29sRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRHcm91cEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQ29yZEV4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIC8vIEhhc0JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLg0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRJbnQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRJbnQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRVaW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0VWludDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNpbnQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTaW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZsb2F0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdERvdWJsZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRCb29sRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFN0cmluZ0V4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRCeXRlc0V4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWVzc2FnZS5IYXNFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb24pKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZXNzYWdlLkhhc0V4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Q29yZEV4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQxLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDJMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDNVLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0VWludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQ0VUwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRVaW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTQ1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQ2TCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNpbnQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0N1UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQ4VUwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQ5LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTUwTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUxLjVGLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0RmxvYXRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTJlM0QsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHREb3VibGVFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEJvb2xFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImhlbGxvIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFN0cmluZ0V4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb0J5dGVzKCJ3b3JsZCIpLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Qnl0ZXNFeHRlbnNpb24pKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uQkFSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduRW51bS5GT1JFSUdOX0JBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEltcG9ydEVudW0uSU1QT1JUX0JBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb24pKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImFiYyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTIzIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdENvcmRFeHRlbnNpb24pKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXQgZXZlcnkgZmllbGQgb2YgdGhlIHNwZWNpZmllZCBtZXNzYWdlIHRvIGEgdW5pcXVlIHZhbHVlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBTZXRQYWNrZWRGaWVsZHMoVGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXIgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFBhY2tlZEludDMyKDYwMSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRQYWNrZWRJbnQ2NCg2MDIpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUGFja2VkVWludDMyKDYwMyk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRQYWNrZWRVaW50NjQoNjA0KTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFBhY2tlZFNpbnQzMig2MDUpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUGFja2VkU2ludDY0KDYwNik7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRQYWNrZWRGaXhlZDMyKDYwNyk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRQYWNrZWRGaXhlZDY0KDYwOCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRQYWNrZWRTZml4ZWQzMig2MDkpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUGFja2VkU2ZpeGVkNjQoNjEwKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFBhY2tlZEZsb2F0KDYxMSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRQYWNrZWREb3VibGUoNjEyKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFBhY2tlZEJvb2wodHJ1ZSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRQYWNrZWRFbnVtKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSKTsNCisgICAgICAgICAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuDQorICAgICAgICAgICAgbWVzc2FnZS5BZGRQYWNrZWRJbnQzMig3MDEpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUGFja2VkSW50NjQoNzAyKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFBhY2tlZFVpbnQzMig3MDMpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUGFja2VkVWludDY0KDcwNCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRQYWNrZWRTaW50MzIoNzA1KTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFBhY2tlZFNpbnQ2NCg3MDYpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUGFja2VkRml4ZWQzMig3MDcpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUGFja2VkRml4ZWQ2NCg3MDgpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUGFja2VkU2ZpeGVkMzIoNzA5KTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFBhY2tlZFNmaXhlZDY0KDcxMCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRQYWNrZWRGbG9hdCg3MTEpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkUGFja2VkRG91YmxlKDcxMik7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRQYWNrZWRCb29sKGZhbHNlKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZFBhY2tlZEVudW0oRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFzc2VydHMgdGhhdCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYXJlIHNldCB0byB0aGUgdmFsdWVzIGFzc2lnbmVkDQorICAgICAgICAvLy8gaW4gU2V0UGFja2VkRmllbGRzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBc3NlcnRQYWNrZWRGaWVsZHNTZXQoVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUGFja2VkSW50MzJDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUGFja2VkSW50NjRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUGFja2VkVWludDMyQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlBhY2tlZFVpbnQ2NENvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5QYWNrZWRTaW50MzJDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUGFja2VkU2ludDY0Q291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlBhY2tlZEZpeGVkMzJDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUGFja2VkRml4ZWQ2NENvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5QYWNrZWRTZml4ZWQzMkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5QYWNrZWRTZml4ZWQ2NENvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5QYWNrZWRGbG9hdENvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5QYWNrZWREb3VibGVDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuUGFja2VkQm9vbENvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5QYWNrZWRFbnVtQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MDEsIG1lc3NhZ2UuR2V0UGFja2VkSW50MzIoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MDIsIG1lc3NhZ2UuR2V0UGFja2VkSW50NjQoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MDN1LCBtZXNzYWdlLkdldFBhY2tlZFVpbnQzMigwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwNHUsIG1lc3NhZ2UuR2V0UGFja2VkVWludDY0KDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjA1LCBtZXNzYWdlLkdldFBhY2tlZFNpbnQzMigwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwNiwgbWVzc2FnZS5HZXRQYWNrZWRTaW50NjQoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MDd1LCBtZXNzYWdlLkdldFBhY2tlZEZpeGVkMzIoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MDh1LCBtZXNzYWdlLkdldFBhY2tlZEZpeGVkNjQoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MDksIG1lc3NhZ2UuR2V0UGFja2VkU2ZpeGVkMzIoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MTAsIG1lc3NhZ2UuR2V0UGFja2VkU2ZpeGVkNjQoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MTEsIG1lc3NhZ2UuR2V0UGFja2VkRmxvYXQoMCksIDAuMCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYxMiwgbWVzc2FnZS5HZXRQYWNrZWREb3VibGUoMCksIDAuMCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsIG1lc3NhZ2UuR2V0UGFja2VkQm9vbCgwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLCBtZXNzYWdlLkdldFBhY2tlZEVudW0oMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDEsIG1lc3NhZ2UuR2V0UGFja2VkSW50MzIoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDIsIG1lc3NhZ2UuR2V0UGFja2VkSW50NjQoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDN1LCBtZXNzYWdlLkdldFBhY2tlZFVpbnQzMigxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcwNHUsIG1lc3NhZ2UuR2V0UGFja2VkVWludDY0KDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzA1LCBtZXNzYWdlLkdldFBhY2tlZFNpbnQzMigxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcwNiwgbWVzc2FnZS5HZXRQYWNrZWRTaW50NjQoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDd1LCBtZXNzYWdlLkdldFBhY2tlZEZpeGVkMzIoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDh1LCBtZXNzYWdlLkdldFBhY2tlZEZpeGVkNjQoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDksIG1lc3NhZ2UuR2V0UGFja2VkU2ZpeGVkMzIoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MTAsIG1lc3NhZ2UuR2V0UGFja2VkU2ZpeGVkNjQoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MTEsIG1lc3NhZ2UuR2V0UGFja2VkRmxvYXQoMSksIDAuMCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcxMiwgbWVzc2FnZS5HZXRQYWNrZWREb3VibGUoMSksIDAuMCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZhbHNlLCBtZXNzYWdlLkdldFBhY2tlZEJvb2woMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduRW51bS5GT1JFSUdOX0JBWiwgbWVzc2FnZS5HZXRQYWNrZWRFbnVtKDEpKTsNCisgICAgICAgIH0NCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBc3NlcnRzIHRoYXQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZA0KKyAgICAgICAgLy8vIGluIFNldFBhY2tlZEZpZWxkcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQXNzZXJ0VW5wYWNrZWRGaWVsZHNTZXQoVGVzdFVucGFja2VkVHlwZXMgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5VbnBhY2tlZEludDMyQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlVucGFja2VkSW50NjRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuVW5wYWNrZWRVaW50MzJDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuVW5wYWNrZWRVaW50NjRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuVW5wYWNrZWRTaW50MzJDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuVW5wYWNrZWRTaW50NjRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuVW5wYWNrZWRGaXhlZDMyQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlVucGFja2VkRml4ZWQ2NENvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5VbnBhY2tlZFNmaXhlZDMyQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLlVucGFja2VkU2ZpeGVkNjRDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuVW5wYWNrZWRGbG9hdENvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5VbnBhY2tlZERvdWJsZUNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5VbnBhY2tlZEJvb2xDb3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuVW5wYWNrZWRFbnVtQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MDEsIG1lc3NhZ2UuR2V0VW5wYWNrZWRJbnQzMigwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwMiwgbWVzc2FnZS5HZXRVbnBhY2tlZEludDY0KDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjAzdSwgbWVzc2FnZS5HZXRVbnBhY2tlZFVpbnQzMigwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwNHUsIG1lc3NhZ2UuR2V0VW5wYWNrZWRVaW50NjQoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MDUsIG1lc3NhZ2UuR2V0VW5wYWNrZWRTaW50MzIoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MDYsIG1lc3NhZ2UuR2V0VW5wYWNrZWRTaW50NjQoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MDd1LCBtZXNzYWdlLkdldFVucGFja2VkRml4ZWQzMigwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwOHUsIG1lc3NhZ2UuR2V0VW5wYWNrZWRGaXhlZDY0KDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjA5LCBtZXNzYWdlLkdldFVucGFja2VkU2ZpeGVkMzIoMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MTAsIG1lc3NhZ2UuR2V0VW5wYWNrZWRTZml4ZWQ2NCgwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYxMSwgbWVzc2FnZS5HZXRVbnBhY2tlZEZsb2F0KDApLCAwLjApOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MTIsIG1lc3NhZ2UuR2V0VW5wYWNrZWREb3VibGUoMCksIDAuMCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsIG1lc3NhZ2UuR2V0VW5wYWNrZWRCb29sKDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsIG1lc3NhZ2UuR2V0VW5wYWNrZWRFbnVtKDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzAxLCBtZXNzYWdlLkdldFVucGFja2VkSW50MzIoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDIsIG1lc3NhZ2UuR2V0VW5wYWNrZWRJbnQ2NCgxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcwM3UsIG1lc3NhZ2UuR2V0VW5wYWNrZWRVaW50MzIoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDR1LCBtZXNzYWdlLkdldFVucGFja2VkVWludDY0KDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzA1LCBtZXNzYWdlLkdldFVucGFja2VkU2ludDMyKDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzA2LCBtZXNzYWdlLkdldFVucGFja2VkU2ludDY0KDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzA3dSwgbWVzc2FnZS5HZXRVbnBhY2tlZEZpeGVkMzIoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDh1LCBtZXNzYWdlLkdldFVucGFja2VkRml4ZWQ2NCgxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcwOSwgbWVzc2FnZS5HZXRVbnBhY2tlZFNmaXhlZDMyKDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzEwLCBtZXNzYWdlLkdldFVucGFja2VkU2ZpeGVkNjQoMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MTEsIG1lc3NhZ2UuR2V0VW5wYWNrZWRGbG9hdCgxKSwgMC4wKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzEyLCBtZXNzYWdlLkdldFVucGFja2VkRG91YmxlKDEpLCAwLjApOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmYWxzZSwgbWVzc2FnZS5HZXRVbnBhY2tlZEJvb2woMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduRW51bS5GT1JFSUdOX0JBWiwgbWVzc2FnZS5HZXRVbnBhY2tlZEVudW0oMSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFNldFBhY2tlZEV4dGVuc2lvbnMoVGVzdFBhY2tlZEV4dGVuc2lvbnMuQnVpbGRlciBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEludDMyRXh0ZW5zaW9uLCA2MDEpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEludDY0RXh0ZW5zaW9uLCA2MDJMKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRVaW50MzJFeHRlbnNpb24sIDYwM1UpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFVpbnQ2NEV4dGVuc2lvbiwgNjA0VUwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFNpbnQzMkV4dGVuc2lvbiwgNjA1KTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTaW50NjRFeHRlbnNpb24sIDYwNkwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEZpeGVkMzJFeHRlbnNpb24sIDYwN1UpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEZpeGVkNjRFeHRlbnNpb24sIDYwOFVMKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTZml4ZWQzMkV4dGVuc2lvbiwgNjA5KTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbiwgNjEwTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRmxvYXRFeHRlbnNpb24sIDYxMUYpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZERvdWJsZUV4dGVuc2lvbiwgNjEyRCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkQm9vbEV4dGVuc2lvbiwgdHJ1ZSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRW51bUV4dGVuc2lvbiwgRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIpOw0KKyAgICAgICAgICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4NCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRJbnQzMkV4dGVuc2lvbiwgNzAxKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRJbnQ2NEV4dGVuc2lvbiwgNzAyTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkVWludDMyRXh0ZW5zaW9uLCA3MDNVKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRVaW50NjRFeHRlbnNpb24sIDcwNFVMKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTaW50MzJFeHRlbnNpb24sIDcwNSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ludDY0RXh0ZW5zaW9uLCA3MDZMKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGaXhlZDMyRXh0ZW5zaW9uLCA3MDdVKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGaXhlZDY0RXh0ZW5zaW9uLCA3MDhVTCk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ZpeGVkMzJFeHRlbnNpb24sIDcwOSk7DQorICAgICAgICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ZpeGVkNjRFeHRlbnNpb24sIDcxMEwpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEZsb2F0RXh0ZW5zaW9uLCA3MTFGKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWREb3VibGVFeHRlbnNpb24sIDcxMkQpOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEJvb2xFeHRlbnNpb24sIGZhbHNlKTsNCisgICAgICAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRFbnVtRXh0ZW5zaW9uLCBGb3JlaWduRW51bS5GT1JFSUdOX0JBWik7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQXNzZXJ0UGFja2VkRXh0ZW5zaW9uc1NldChUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkSW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRVaW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRVaW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTaW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTaW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGaXhlZDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRml4ZWQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ZpeGVkNjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGbG9hdEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZERvdWJsZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEJvb2xFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRFbnVtRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwMSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkSW50MzJFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjAyTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkSW50NjRFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjAzdSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkVWludDMyRXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwNHVMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRVaW50NjRFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjA1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTaW50MzJFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjA2TCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ludDY0RXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwN3UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEZpeGVkMzJFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjA4dUwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEZpeGVkNjRFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjA5LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTZml4ZWQzMkV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MTBMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MTFGLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGbG9hdEV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MTJELCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWREb3VibGVFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkQm9vbEV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduRW51bS5GT1JFSUdOX0JBUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRW51bUV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEludDMyRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcwMkwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEludDY0RXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcwM3UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFVpbnQzMkV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDR1TCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkVWludDY0RXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcwNSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ludDMyRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcwNkwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFNpbnQ2NEV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDd1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGaXhlZDMyRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcwOHVMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGaXhlZDY0RXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcwOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ZpeGVkMzJFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzEwTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ZpeGVkNjRFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzExRiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRmxvYXRFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzEyRCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRG91YmxlRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZhbHNlLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRCb29sRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5QYWNrZWRFbnVtRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQXNzZXJ0VW5wYWNrZWRFeHRlbnNpb25zU2V0KFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRJbnQ2NEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkVWludDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRVaW50NjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZFNpbnQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkU2ludDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRGaXhlZDMyRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRGaXhlZDY0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRTZml4ZWQzMkV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtZXNzYWdlLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkU2ZpeGVkNjRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEZsb2F0RXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWREb3VibGVFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEJvb2xFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbWVzc2FnZS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEVudW1FeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjAxLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEludDMyRXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwMkwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkSW50NjRFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjAzdSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRVaW50MzJFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjA0dUwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkVWludDY0RXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwNSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRTaW50MzJFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjA2TCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRTaW50NjRFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjA3dSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRGaXhlZDMyRXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYwOHVMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEZpeGVkNjRFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjA5LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYxMEwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkU2ZpeGVkNjRFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjExRiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRGbG9hdEV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2MTJELCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZERvdWJsZUV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0cnVlLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEJvb2xFeHRlbnNpb24sIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVW5wYWNrZWRFeHRlbnNpb25zRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkRW51bUV4dGVuc2lvbiwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkSW50MzJFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzAyTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRJbnQ2NEV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDN1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZFVpbnQzMkV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDR1TCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRVaW50NjRFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzA1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZFNpbnQzMkV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDZMLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZFNpbnQ2NEV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDd1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEZpeGVkMzJFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzA4dUwsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkRml4ZWQ2NEV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MDksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkU2ZpeGVkMzJFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzEwTCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RFeHRyYXNQcm90b0ZpbGUuVW5wYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3MTFGLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEZsb2F0RXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcxMkQsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkRG91YmxlRXh0ZW5zaW9uLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZhbHNlLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVbml0VGVzdEV4dHJhc1Byb3RvRmlsZS5VbnBhY2tlZEJvb2xFeHRlbnNpb24sIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVW5wYWNrZWRFeHRlbnNpb25zRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0RXh0cmFzUHJvdG9GaWxlLlVucGFja2VkRW51bUV4dGVuc2lvbiwgMSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gVGVzdEN1bHR1cmVzID0geyJlbi1VUyIsICJlbi1HQiIsICJmci1GUiIsICJkZS1ERSJ9Ow0KKw0KKyAgICAgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgQ3VsdHVyZUFjdGlvbigpOw0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFRlc3RJbk11bHRpcGxlQ3VsdHVyZXMoQ3VsdHVyZUFjdGlvbiB0ZXN0KQ0KKyAgICAgICAgew0KKyNpZiBDT01QQUNUX0ZSQU1FV09SSw0KKyAgICAgICAgICAgIHRlc3QoKTsNCisjZWxzZQ0KKyAgICAgICAgICAgIEN1bHR1cmVJbmZvIG9yaWdpbmFsQ3VsdHVyZSA9IFRocmVhZC5DdXJyZW50VGhyZWFkLkN1cnJlbnRDdWx0dXJlOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBjdWx0dXJlIGluIFRlc3RDdWx0dXJlcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBUaHJlYWQuQ3VycmVudFRocmVhZC5DdXJyZW50Q3VsdHVyZSA9IG5ldyBDdWx0dXJlSW5mbyhjdWx0dXJlKTsNCisgICAgICAgICAgICAgICAgICAgIHRlc3QoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmaW5hbGx5DQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5DdXJyZW50VGhyZWFkLkN1cnJlbnRDdWx0dXJlID0gb3JpZ2luYWxDdWx0dXJlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEhlbHBlciB0byBjb25zdHJ1Y3QgYSBieXRlIGFycmF5IGZyb20gYSBidW5jaCBvZiBieXRlcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIEJ5dGVzKHBhcmFtcyBieXRlW10gYnl0ZXNBc0ludHMpDQorICAgICAgICB7DQorICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYnl0ZXNBc0ludHMuTGVuZ3RoXTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzQXNJbnRzLkxlbmd0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYnl0ZXNbaV0gPSAoYnl0ZSkgYnl0ZXNBc0ludHNbaV07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBieXRlczsNCisgICAgICAgIH0NCisNCisNCisgICAgICAgIGludGVybmFsIGRlbGVnYXRlIHZvaWQgQWN0aW9uKCk7DQorDQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBBc3NlcnROb3RTdXBwb3J0ZWQoQWN0aW9uIGFjdGlvbikNCisgICAgICAgIHsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGFjdGlvbigpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuRmFpbCgiRXhwZWN0ZWQgTm90U3VwcG9ydGVkRXhjZXB0aW9uIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChOb3RTdXBwb3J0ZWRFeGNlcHRpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZA0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEFzc2VydEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihBY3Rpb24gYWN0aW9uKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYWN0aW9uKCk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5GYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgLy8gTm90IGEgZ2VuZXJhbCBjYXNlLCBob3dldmVyLCBDb21wYWN0IEZyYW1ld29yayB2MiBkb2VzIHVzZSBJbnZva2UNCisgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLlJlZmxlY3Rpb24uVGFyZ2V0SW52b2NhdGlvbkV4Y2VwdGlvbiB0ZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmICh0ZS5Jbm5lckV4Y2VwdGlvbi5HZXRUeXBlKCkgIT0gdHlwZW9mKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikpDQorICAgICAgICAgICAgICAgICAgICB0aHJvdzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgLy8gTm9ybWFsbHkgZXhwZWN0ZWQgZXhjZXB0aW9uDQorICAgICAgICAgICAgY2F0Y2ggKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBBc3NlcnRCeXRlc0VxdWFsKGJ5dGVbXSBhLCBieXRlW11iKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsPG9iamVjdD4oYSwgYik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChhLkxlbmd0aCwgYi5MZW5ndGgsICJUaGUgYnl0ZVtdIGlzIG5vdCBvZiB0aGUgZXhwZWN0ZWQgbGVuZ3RoLiIpOw0KKw0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuTGVuZ3RoOyBpKyspDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChhW2ldICE9IGJbaV0pDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGFbaV0sIGJbaV0sICJCeXRlW10gZGlmZmVycyBhdCBpbmRleCAiICsgaSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0V3JpdGVyRm9ybWF0SnNvbi5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFdyaXRlckZvcm1hdEpzb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1NDNhZgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGVzdFdyaXRlckZvcm1hdEpzb24uY3MKQEAgLTAsMCArMSw0OTggQEAKK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlRleHQ7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbjsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3M7DQordXNpbmcgRW51bU9wdGlvbnMgPSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRW51bU9wdGlvbnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIFtUZXN0Q2xhc3NdDQorICAgIHB1YmxpYyBjbGFzcyBUZXN0V3JpdGVyRm9ybWF0SnNvbg0KKyAgICB7DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEV4YW1wbGVfRnJvbUpzb24oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKTsNCisNCisgICAgICAgICAgICAvLzMuNTogYnVpbGRlci5NZXJnZUZyb21Kc29uKEAieyIidmFsaWQiIjp0cnVlfSIpOw0KKyAgICAgICAgICAgIEV4dGVuc2lvbnMuTWVyZ2VGcm9tSnNvbihidWlsZGVyLCBAInsiInZhbGlkIiI6dHJ1ZX0iKTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBtZXNzYWdlID0gYnVpbGRlci5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0cnVlLCBtZXNzYWdlLlZhbGlkKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRXhhbXBsZV9Ub0pzb24oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIG1lc3NhZ2UgPSANCisgICAgICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRWYWxpZCh0cnVlKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICAvLzMuNTogc3RyaW5nIGpzb24gPSBtZXNzYWdlLlRvSnNvbigpOw0KKyAgICAgICAgICAgIHN0cmluZyBqc29uID0gRXh0ZW5zaW9ucy5Ub0pzb24obWVzc2FnZSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEAieyIidmFsaWQiIjp0cnVlfSIsIGpzb24pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBFeGFtcGxlX1dyaXRlSnNvblVzaW5nSUNvZGVkT3V0cHV0U3RyZWFtKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBtZXNzYWdlID0NCisgICAgICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRWYWxpZCh0cnVlKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICB1c2luZyAoVGV4dFdyaXRlciBvdXRwdXQgPSBuZXcgU3RyaW5nV3JpdGVyKCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBJQ29kZWRPdXRwdXRTdHJlYW0gd3JpdGVyID0gSnNvbkZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZShvdXRwdXQpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVNZXNzYWdlU3RhcnQoKTsgICAgICAvL21hbnVhbGx5IGJlZ2luIHRoZSBtZXNzYWdlLCBvdXRwdXQgaXMgJ3snDQorICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICB3cml0ZXIuRmx1c2goKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ7Iiwgb3V0cHV0LlRvU3RyaW5nKCkpOw0KKw0KKyAgICAgICAgICAgICAgICBJQ29kZWRPdXRwdXRTdHJlYW0gc3RyZWFtID0gd3JpdGVyOw0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLldyaXRlVG8oc3RyZWFtKTsgICAgLy93cml0ZSB0aGUgbWVzc2FnZSBub3JtYWxseQ0KKw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuRmx1c2goKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEAieyIidmFsaWQiIjp0cnVlIiwgb3V0cHV0LlRvU3RyaW5nKCkpOw0KKw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVNZXNzYWdlRW5kKCk7ICAgICAgICAvL21hbnVhbGx5IHdyaXRlIHRoZSBlbmQgbWVzc2FnZSAnfScNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEAieyIidmFsaWQiIjp0cnVlfSIsIG91dHB1dC5Ub1N0cmluZygpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEV4YW1wbGVfUmVhZEpzb25Vc2luZ0lDb2RlZElucHV0U3RyZWFtKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgSUNvZGVkSW5wdXRTdHJlYW0gcmVhZGVyID0gSnNvbkZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZShAInsiInZhbGlkIiI6dHJ1ZX0iKTsNCisNCisgICAgICAgICAgICByZWFkZXIuUmVhZE1lc3NhZ2VTdGFydCgpOyAgLy9tYW51YWxseSByZWFkIHRoZSBiZWdpbiB0aGUgbWVzc2FnZSAneycNCisNCisgICAgICAgICAgICBidWlsZGVyLk1lcmdlRnJvbShyZWFkZXIpOyAgLy93cml0ZSB0aGUgbWVzc2FnZSBub3JtYWxseQ0KKw0KKyAgICAgICAgICAgIHJlYWRlci5SZWFkTWVzc2FnZUVuZCgpOyAgICAvL21hbnVhbGx5IHJlYWQgdGhlIGVuZCBtZXNzYWdlICd9Jw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBDb250ZW50Ow0KKyAgICAgICAgW1N5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlXQ0KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgRm9ybWF0dGVyQXNzZXJ0PFRNZXNzYWdlPihUTWVzc2FnZSBtZXNzYWdlLCBwYXJhbXMgc3RyaW5nW10gZXhwZWN0aW5nKSB3aGVyZSBUTWVzc2FnZSA6IElNZXNzYWdlTGl0ZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCisgICAgICAgICAgICBKc29uRm9ybWF0V3JpdGVyLkNyZWF0ZUluc3RhbmNlKHN3KS5Xcml0ZU1lc3NhZ2UobWVzc2FnZSk7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgQ29udGVudCA9IHN3LlRvU3RyaW5nKCk7DQorDQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisNCisgICAgICAgICAgICBJTWVzc2FnZUxpdGUgY29weSA9IA0KKyAgICAgICAgICAgICAgICBKc29uRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKENvbnRlbnQpDQorICAgICAgICAgICAgICAgIC5NZXJnZShtZXNzYWdlLldlYWtDcmVhdGVCdWlsZGVyRm9yVHlwZSgpLCByZWdpc3RyeSkuV2Vha0J1aWxkKCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHR5cGVvZihUTWVzc2FnZSksIGNvcHkuR2V0VHlwZSgpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZSwgY29weSk7DQorICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGV4cGVjdCBpbiBleHBlY3RpbmcpDQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoQ29udGVudC5JbmRleE9mKGV4cGVjdCkgPj0gMCwgIkV4cGVjdGVkIHRvIGZpbmQgY29udGVudCAnezB9JyBpbjogXHJcbnsxfSIsIGV4cGVjdCwgQ29udGVudCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RUb0pzb25QYXJzZUZyb21Kc29uKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgbXNnID0gbmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyKCkuU2V0RGVmYXVsdEJvb2wodHJ1ZSkuQnVpbGQoKTsNCisgICAgICAgICAgICBzdHJpbmcganNvbiA9IEV4dGVuc2lvbnMuVG9Kc29uKG1zZyk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ7XCJkZWZhdWx0X2Jvb2xcIjp0cnVlfSIsIGpzb24pOw0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBjb3B5ID0gRXh0ZW5zaW9ucy5NZXJnZUZyb21Kc29uKG5ldyBUZXN0QWxsVHlwZXMuQnVpbGRlcigpLCBqc29uKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoY29weS5IYXNEZWZhdWx0Qm9vbCAmJiBjb3B5LkRlZmF1bHRCb29sKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobXNnLCBjb3B5KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFRvSnNvblBhcnNlRnJvbUpzb25SZWFkZXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzLkJ1aWxkZXIoKS5TZXREZWZhdWx0Qm9vbCh0cnVlKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIHN0cmluZyBqc29uID0gRXh0ZW5zaW9ucy5Ub0pzb24obXNnKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIntcImRlZmF1bHRfYm9vbFwiOnRydWV9IiwganNvbik7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIGNvcHkgPSBFeHRlbnNpb25zLk1lcmdlRnJvbUpzb24obmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyKCksIG5ldyBTdHJpbmdSZWFkZXIoanNvbikpLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjb3B5Lkhhc0RlZmF1bHRCb29sICYmIGNvcHkuRGVmYXVsdEJvb2wpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtc2csIGNvcHkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0SnNvbkZvcm1hdHRlZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UgbWVzc2FnZSA9IFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0VmFsaWQodHJ1ZSkNCisgICAgICAgICAgICAgICAgLlNldE51bWJlcigweDEwMTApDQorICAgICAgICAgICAgICAgIC5BZGRDaGlsZHJlbihUZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbi5DcmVhdGVCdWlsZGVyKCkpDQorICAgICAgICAgICAgICAgIC5BZGRDaGlsZHJlbihUZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbi5DcmVhdGVCdWlsZGVyKCkuQWRkT3B0aW9ucyhFbnVtT3B0aW9ucy5PTkUpKQ0KKyAgICAgICAgICAgICAgICAuQWRkQ2hpbGRyZW4oVGVzdFhtbE1lc3NhZ2UuVHlwZXMuQ2hpbGRyZW4uQ3JlYXRlQnVpbGRlcigpLkFkZE9wdGlvbnMoRW51bU9wdGlvbnMuT05FKS5BZGRPcHRpb25zKEVudW1PcHRpb25zLlRXTykpDQorICAgICAgICAgICAgICAgIC5BZGRDaGlsZHJlbihUZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbi5DcmVhdGVCdWlsZGVyKCkuU2V0QmluYXJ5KEJ5dGVTdHJpbmcuQ29weUZyb21VdGY4KCJhYmMiKSkpDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCisgICAgICAgICAgICBKc29uRm9ybWF0V3JpdGVyLkNyZWF0ZUluc3RhbmNlKHN3KS5Gb3JtYXR0ZWQoKQ0KKyAgICAgICAgICAgICAgICAuV3JpdGVNZXNzYWdlKG1lc3NhZ2UpOw0KKw0KKyAgICAgICAgICAgIHN0cmluZyBqc29uID0gc3cuVG9TdHJpbmcoKTsNCisNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBjb3B5ID0gSnNvbkZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZShqc29uKQ0KKyAgICAgICAgICAgICAgICAuTWVyZ2UoVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBjb3B5KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEVtcHR5TWVzc2FnZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgRm9ybWF0dGVyQXNzZXJ0KA0KKyAgICAgICAgICAgICAgICBUZXN0WG1sQ2hpbGQuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpLA0KKyAgICAgICAgICAgICAgICBAInt9Ig0KKyAgICAgICAgICAgICAgICApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RSZXBlYXRlZEZpZWxkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBGb3JtYXR0ZXJBc3NlcnQoDQorICAgICAgICAgICAgICAgIFRlc3RYbWxDaGlsZC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLkFkZE9wdGlvbnMoRW51bU9wdGlvbnMuT05FKQ0KKyAgICAgICAgICAgICAgICAuQWRkT3B0aW9ucyhFbnVtT3B0aW9ucy5UV08pDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpLA0KKyAgICAgICAgICAgICAgICBAInsiIm9wdGlvbnMiIjpbIiJPTkUiIiwiIlRXTyIiXX0iDQorICAgICAgICAgICAgICAgICk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE5lc3RlZEVtcHR5TWVzc2FnZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgRm9ybWF0dGVyQXNzZXJ0KA0KKyAgICAgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldENoaWxkKFRlc3RYbWxDaGlsZC5DcmVhdGVCdWlsZGVyKCkuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCksDQorICAgICAgICAgICAgICAgIEAieyIiY2hpbGQiIjp7fX0iDQorICAgICAgICAgICAgICAgICk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE5lc3RlZE1lc3NhZ2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEZvcm1hdHRlckFzc2VydCgNCisgICAgICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRDaGlsZChUZXN0WG1sQ2hpbGQuQ3JlYXRlQnVpbGRlcigpLkFkZE9wdGlvbnMoRW51bU9wdGlvbnMuVFdPKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKSwNCisgICAgICAgICAgICAgICAgQCJ7IiJjaGlsZCIiOnsiIm9wdGlvbnMiIjpbIiJUV08iIl19fSINCisgICAgICAgICAgICAgICAgKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0Qm9vbGVhblR5cGVzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBGb3JtYXR0ZXJBc3NlcnQoDQorICAgICAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0VmFsaWQodHJ1ZSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCksDQorICAgICAgICAgICAgICAgIEAieyIidmFsaWQiIjp0cnVlfSINCisgICAgICAgICAgICAgICAgKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0RnVsbE1lc3NhZ2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEZvcm1hdHRlckFzc2VydCgNCisgICAgICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRWYWxpZCh0cnVlKQ0KKyAgICAgICAgICAgICAgICAuU2V0VGV4dCgidGV4dCIpDQorICAgICAgICAgICAgICAgIC5BZGRUZXh0bGluZXMoImEiKQ0KKyAgICAgICAgICAgICAgICAuQWRkVGV4dGxpbmVzKCJiIikNCisgICAgICAgICAgICAgICAgLkFkZFRleHRsaW5lcygiYyIpDQorICAgICAgICAgICAgICAgIC5TZXROdW1iZXIoMHgxMDEwMTAxMDEwKQ0KKyAgICAgICAgICAgICAgICAuQWRkTnVtYmVycygxKQ0KKyAgICAgICAgICAgICAgICAuQWRkTnVtYmVycygyKQ0KKyAgICAgICAgICAgICAgICAuQWRkTnVtYmVycygzKQ0KKyAgICAgICAgICAgICAgICAuU2V0Q2hpbGQoVGVzdFhtbENoaWxkLkNyZWF0ZUJ1aWxkZXIoKS5BZGRPcHRpb25zKEVudW1PcHRpb25zLk9ORSkuU2V0QmluYXJ5KEJ5dGVTdHJpbmcuQ29weUZyb20obmV3IGJ5dGVbMV0pKSkNCisgICAgICAgICAgICAgICAgLkFkZENoaWxkcmVuKFRlc3RYbWxNZXNzYWdlLlR5cGVzLkNoaWxkcmVuLkNyZWF0ZUJ1aWxkZXIoKS5BZGRPcHRpb25zKEVudW1PcHRpb25zLlRXTykuU2V0QmluYXJ5KEJ5dGVTdHJpbmcuQ29weUZyb20obmV3IGJ5dGVbMl0pKSkNCisgICAgICAgICAgICAgICAgLkFkZENoaWxkcmVuKFRlc3RYbWxNZXNzYWdlLlR5cGVzLkNoaWxkcmVuLkNyZWF0ZUJ1aWxkZXIoKS5BZGRPcHRpb25zKEVudW1PcHRpb25zLlRIUkVFKS5TZXRCaW5hcnkoQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVszXSkpKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKSwNCisgICAgICAgICAgICAgICAgQCIiInRleHQiIjoiInRleHQiIiIsDQorICAgICAgICAgICAgICAgIEAiWyIiYSIiLCIiYiIiLCIiYyIiXSIsDQorICAgICAgICAgICAgICAgIEAiWzEsMiwzXSIsDQorICAgICAgICAgICAgICAgIEAiIiJjaGlsZCIiOnsiLA0KKyAgICAgICAgICAgICAgICBAIiIiY2hpbGRyZW4iIjpbeyIsDQorICAgICAgICAgICAgICAgIEAiQUE9PSIsDQorICAgICAgICAgICAgICAgIEAiQUFBPSIsDQorICAgICAgICAgICAgICAgIEAiQUFBQSIsDQorICAgICAgICAgICAgICAgIDB4MTAxMDEwMTAxMEwuVG9TdHJpbmcoKQ0KKyAgICAgICAgICAgICAgICApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RNZXNzYWdlV2l0aFhtbFRleHQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEZvcm1hdHRlckFzc2VydCgNCisgICAgICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRUZXh0KCI8dGV4dD48L3RleHQ+IikNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCksDQorICAgICAgICAgICAgICAgIEAieyIidGV4dCIiOiIiPHRleHQ+PFwvdGV4dD4iIn0iDQorICAgICAgICAgICAgICAgICk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFdpdGhFc2NhcGVDaGFycygpDQorICAgICAgICB7DQorICAgICAgICAgICAgRm9ybWF0dGVyQXNzZXJ0KA0KKyAgICAgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldFRleHQoIiBcdCA8LSBcImxlYWRpbmcgc3BhY2UgYW5kIHRyYWlsaW5nXCIgLT4gXFwgXHhlZjU0IFx4MDAwMCBceEZGIFx4RkZGRiBcYiBcZiBcciBcbiBcdCAiKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKSwNCisgICAgICAgICAgICAgICAgIntcInRleHRcIjpcIiBcXHQgPC0gXFxcImxlYWRpbmcgc3BhY2UgYW5kIHRyYWlsaW5nXFxcIiAtPiBcXFxcIFxcdWVmNTQgXFx1MDAwMCBcXHUwMGZmIFxcdWZmZmYgXFxiIFxcZiBcXHIgXFxuIFxcdCBcIn0iDQorICAgICAgICAgICAgICAgICk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFdpdGhFeHRlbnNpb25UZXh0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBGb3JtYXR0ZXJBc3NlcnQoDQorICAgICAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0VmFsaWQoZmFsc2UpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25UZXh0LCAiIGV4dGVuc2lvbiB0ZXh0IHZhbHVlICEgIikNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCksDQorICAgICAgICAgICAgICAgIEAieyIidmFsaWQiIjpmYWxzZSwiImV4dGVuc2lvbl90ZXh0IiI6IiIgZXh0ZW5zaW9uIHRleHQgdmFsdWUgISAiIn0iDQorICAgICAgICAgICAgICAgICk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFdpdGhFeHRlbnNpb25OdW1iZXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEZvcm1hdHRlckFzc2VydCgNCisgICAgICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25NZXNzYWdlLA0KKyAgICAgICAgICAgICAgICBuZXcgVGVzdFhtbEV4dGVuc2lvbi5CdWlsZGVyKCkuU2V0TnVtYmVyKDQyKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKSwNCisgICAgICAgICAgICAgICAgQCJ7IiJudW1iZXIiIjo0Mn0iDQorICAgICAgICAgICAgICAgICk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFdpdGhFeHRlbnNpb25BcnJheSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgRm9ybWF0dGVyQXNzZXJ0KA0KKyAgICAgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvbk51bWJlciwgMTAwKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uTnVtYmVyLCAxMDEpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25OdW1iZXIsIDEwMikNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCksDQorICAgICAgICAgICAgICAgIEAieyIiZXh0ZW5zaW9uX251bWJlciIiOlsxMDAsMTAxLDEwMl19Ig0KKyAgICAgICAgICAgICAgICApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RXaXRoRXh0ZW5zaW9uRW51bSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgRm9ybWF0dGVyQXNzZXJ0KA0KKyAgICAgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvbkVudW0sIEVudW1PcHRpb25zLk9ORSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCksDQorICAgICAgICAgICAgICAgIEAieyIiZXh0ZW5zaW9uX2VudW0iIjoiIk9ORSIifSINCisgICAgICAgICAgICAgICAgKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TWVzc2FnZVdpdGhFeHRlbnNpb25zKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBGb3JtYXR0ZXJBc3NlcnQoDQorICAgICAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0VmFsaWQodHJ1ZSkNCisgICAgICAgICAgICAgICAgLlNldFRleHQoInRleHQiKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uVGV4dCwgImV4dGVuc2lvbiB0ZXh0IikNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvbk1lc3NhZ2UsIG5ldyBUZXN0WG1sRXh0ZW5zaW9uLkJ1aWxkZXIoKS5TZXROdW1iZXIoNDIpLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25OdW1iZXIsIDEwMCkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvbk51bWJlciwgMTAxKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uTnVtYmVyLCAxMDIpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25FbnVtLCBFbnVtT3B0aW9ucy5PTkUpDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpLA0KKyAgICAgICAgICAgICAgICBAIiIidGV4dCIiOiIidGV4dCIiIiwNCisgICAgICAgICAgICAgICAgQCIiInZhbGlkIiI6dHJ1ZSIsDQorICAgICAgICAgICAgICAgIEAiIiJleHRlbnNpb25fZW51bSIiOiIiT05FIiIiLA0KKyAgICAgICAgICAgICAgICBAIiIiZXh0ZW5zaW9uX3RleHQiIjoiImV4dGVuc2lvbiB0ZXh0IiIiLA0KKyAgICAgICAgICAgICAgICBAIiIiZXh0ZW5zaW9uX251bWJlciIiOlsxMDAsMTAxLDEwMl0iLA0KKyAgICAgICAgICAgICAgICBAIiIiZXh0ZW5zaW9uX21lc3NhZ2UiIjp7IiJudW1iZXIiIjo0Mn0iDQorICAgICAgICAgICAgICAgICk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE1lc3NhZ2VNaXNzaW5nRXh0ZW5zaW9ucygpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2Ugb3JpZ2luYWwgPSBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldFZhbGlkKHRydWUpDQorICAgICAgICAgICAgICAgIC5TZXRUZXh0KCJ0ZXh0IikNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvblRleHQsICIgZXh0ZW5zaW9uIHRleHQgdmFsdWUgISAiKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uTWVzc2FnZSwgbmV3IFRlc3RYbWxFeHRlbnNpb24uQnVpbGRlcigpLlNldE51bWJlcig0MikuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvbk51bWJlciwgMTAwKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uTnVtYmVyLCAxMDEpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25OdW1iZXIsIDEwMikNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvbkVudW0sIEVudW1PcHRpb25zLk9ORSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UgbWVzc2FnZSA9IG9yaWdpbmFsLlRvQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5DbGVhckV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvblRleHQpDQorICAgICAgICAgICAgICAgIC5DbGVhckV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvbk1lc3NhZ2UpDQorICAgICAgICAgICAgICAgIC5DbGVhckV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvbk51bWJlcikNCisgICAgICAgICAgICAgICAgLkNsZWFyRXh0ZW5zaW9uKFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uRW51bSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgSnNvbkZvcm1hdFdyaXRlciB3cml0ZXIgPSBKc29uRm9ybWF0V3JpdGVyLkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlTWVzc2FnZShvcmlnaW5hbCk7DQorICAgICAgICAgICAgQ29udGVudCA9IHdyaXRlci5Ub1N0cmluZygpOw0KKw0KKyAgICAgICAgICAgIElNZXNzYWdlTGl0ZSBjb3B5ID0gSnNvbkZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZShDb250ZW50KQ0KKyAgICAgICAgICAgICAgICAuTWVyZ2UobWVzc2FnZS5DcmVhdGVCdWlsZGVyRm9yVHlwZSgpKS5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbChvcmlnaW5hbCwgbWVzc2FnZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdEVxdWFsKG9yaWdpbmFsLCBjb3B5KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZSwgY29weSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE1lcmdlRmllbGRzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgYnVpbGRlci5NZXJnZUZyb20oSnNvbkZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZSgiXCJ2YWxpZFwiOiB0cnVlIikpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuTWVyZ2VGcm9tKEpzb25Gb3JtYXRSZWFkZXIuQ3JlYXRlSW5zdGFuY2UoIlwidGV4dFwiOiBcInRleHRcIiwgXCJudW1iZXJcIjogXCI0MTFcIiIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSwgYnVpbGRlci5WYWxpZCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ0ZXh0IiwgYnVpbGRlci5UZXh0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDExLCBidWlsZGVyLk51bWJlcik7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE1lc3NhZ2VBcnJheSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgSnNvbkZvcm1hdFdyaXRlciB3cml0ZXIgPSBKc29uRm9ybWF0V3JpdGVyLkNyZWF0ZUluc3RhbmNlKCkuRm9ybWF0dGVkKCk7DQorICAgICAgICAgICAgdXNpbmcgKHdyaXRlci5TdGFydEFycmF5KCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVNZXNzYWdlKFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXROdW1iZXIoMSkuQWRkVGV4dGxpbmVzKCJhIikuQnVpbGQoKSk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZU1lc3NhZ2UoVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldE51bWJlcigyKS5BZGRUZXh0bGluZXMoImIiKS5CdWlsZCgpKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTWVzc2FnZShUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0TnVtYmVyKDMpLkFkZFRleHRsaW5lcygiYyIpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzdHJpbmcganNvbiA9IHdyaXRlci5Ub1N0cmluZygpOw0KKyAgICAgICAgICAgIEpzb25Gb3JtYXRSZWFkZXIgcmVhZGVyID0gSnNvbkZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZShqc29uKTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgaW50IG9yZGluYWwgPSAwOw0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEpzb25Gb3JtYXRSZWFkZXIgciBpbiByZWFkZXIuRW51bWVyYXRlQXJyYXkoKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHIuTWVyZ2UoYnVpbGRlcik7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgrK29yZGluYWwsIGJ1aWxkZXIuTnVtYmVyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIG9yZGluYWwpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBidWlsZGVyLlRleHRsaW5lc0NvdW50KTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TmVzdGVkTWVzc2FnZUFycmF5KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBKc29uRm9ybWF0V3JpdGVyIHdyaXRlciA9IEpzb25Gb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgICAgICB1c2luZyAod3JpdGVyLlN0YXJ0QXJyYXkoKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHVzaW5nICh3cml0ZXIuU3RhcnRBcnJheSgpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVNZXNzYWdlKFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXROdW1iZXIoMSkuQWRkVGV4dGxpbmVzKCJhIikuQnVpbGQoKSk7DQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVNZXNzYWdlKFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXROdW1iZXIoMikuQWRkVGV4dGxpbmVzKCJiIikuQnVpbGQoKSk7DQorICAgICAgICAgICAgICAgIH0gDQorICAgICAgICAgICAgICAgIHVzaW5nICh3cml0ZXIuU3RhcnRBcnJheSgpKQ0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTWVzc2FnZShUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuU2V0TnVtYmVyKDMpLkFkZFRleHRsaW5lcygiYyIpLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzdHJpbmcganNvbiA9IHdyaXRlci5Ub1N0cmluZygpOw0KKyAgICAgICAgICAgIEpzb25Gb3JtYXRSZWFkZXIgcmVhZGVyID0gSnNvbkZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZShqc29uKTsNCisNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgaW50IG9yZGluYWwgPSAwOw0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEpzb25Gb3JtYXRSZWFkZXIgciBpbiByZWFkZXIuRW51bWVyYXRlQXJyYXkoKSkNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoSnNvbkZvcm1hdFJlYWRlciByMiBpbiByLkVudW1lcmF0ZUFycmF5KCkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHIyLk1lcmdlKGJ1aWxkZXIpOw0KKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCsrb3JkaW5hbCwgYnVpbGRlci5OdW1iZXIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIG9yZGluYWwpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBidWlsZGVyLlRleHRsaW5lc0NvdW50KTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UmVhZFdyaXRlSnNvbldpdGhvdXRSb290KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UgbWVzc2FnZSA9IGJ1aWxkZXIuU2V0VGV4dCgiYWJjIikuU2V0TnVtYmVyKDEyMykuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBzdHJpbmcgSnNvbjsNCisgICAgICAgICAgICB1c2luZyAoU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgSUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IEpzb25Gb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2Uoc3cpOw0KKw0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLldyaXRlVG8ob3V0cHV0KTsNCisgICAgICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7DQorICAgICAgICAgICAgICAgIEpzb24gPSBzdy5Ub1N0cmluZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQCIiInRleHQiIjoiImFiYyIiLCIibnVtYmVyIiI6MTIzIiwgSnNvbik7DQorDQorICAgICAgICAgICAgSUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBKc29uRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKEpzb24pOw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIGNvcHkgPSBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KS5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBjb3B5KTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW1Rlc3RNZXRob2QsRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFJlY3Vyc2lvbkxpbWl0RXhjZWVkZWRFeGNlcHRpb24pKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RSZWN1cnNpdmVMaW1pdCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDgxOTIpOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODA7IGkrKykNCisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ7XCJjaGlsZFwiOiIpOw0KKyAgICAgICAgICAgIFRlc3RYbWxSZXNjdXJzaXZlIG1zZyA9IEV4dGVuc2lvbnMuTWVyZ2VGcm9tSnNvbihuZXcgVGVzdFhtbFJlc2N1cnNpdmUuQnVpbGRlcigpLCBzYi5Ub1N0cmluZygpKS5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihGb3JtYXRFeGNlcHRpb24pKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIEZhaWxXaXRoRW1wdHlUZXh0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBKc29uRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKCIiKQ0KKyAgICAgICAgICAgICAgICAuTWVyZ2UoVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihGb3JtYXRFeGNlcHRpb24pKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIEZhaWxXaXRoVW5leHBlY3RlZFZhbHVlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBKc29uRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKCJ7e319IikNCisgICAgICAgICAgICAgICAgLk1lcmdlKFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRm9ybWF0RXhjZXB0aW9uKSldDQorICAgICAgICBwdWJsaWMgdm9pZCBGYWlsV2l0aFVuUXVvdGVkTmFtZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgSnNvbkZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZSgie25hbWU6e319IikNCisgICAgICAgICAgICAgICAgLk1lcmdlKFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRm9ybWF0RXhjZXB0aW9uKSldDQorICAgICAgICBwdWJsaWMgdm9pZCBGYWlsV2l0aFVuZXhwZWN0ZWRUeXBlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBKc29uRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKCJ7XCJ2YWxpZFwiOnt9fSIpDQorICAgICAgICAgICAgICAgIC5NZXJnZShUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gU2VlIGlzc3VlIDY0IGZvciBiYWNrZ3JvdW5kLg0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUb0pzb25SZXF1aXJpbmdCdWZmZXJFeHBhbnNpb24oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyBzID0gbmV3IHN0cmluZygnLicsIDQwODYpOw0KKyAgICAgICAgICAgIHZhciBvcHRzID0gRmlsZURlc2NyaXB0b3JQcm90by5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAuU2V0TmFtZShzKQ0KKyAgICAgICAgICAgICAgIC5TZXRQYWNrYWdlKCJwYWNrYWdlIikNCisgICAgICAgICAgICAgICAuQnVpbGRQYXJ0aWFsKCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChFeHRlbnNpb25zLlRvSnNvbihvcHRzKSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0V3JpdGVyRm9ybWF0WG1sLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9UZXN0V3JpdGVyRm9ybWF0WG1sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWEwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1Rlc3RXcml0ZXJGb3JtYXRYbWwuY3MKQEAgLTAsMCArMSw0NTUgQEAKK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlRleHQ7DQordXNpbmcgU3lzdGVtLlhtbDsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb247DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdFdyaXRlckZvcm1hdFhtbA0KKyAgICB7DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEV4YW1wbGVfRnJvbVhtbCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0gVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKw0KKyAgICAgICAgICAgIFhtbFJlYWRlciByZHIgPSBYbWxSZWFkZXIuQ3JlYXRlKG5ldyBTdHJpbmdSZWFkZXIoQCI8cm9vdD48dmFsaWQ+dHJ1ZTwvdmFsaWQ+PC9yb290PiIpKTsNCisgICAgICAgICAgICAvLzMuNTogYnVpbGRlci5NZXJnZUZyb21YbWwocmRyKTsNCisgICAgICAgICAgICBFeHRlbnNpb25zLk1lcmdlRnJvbVhtbChidWlsZGVyLCByZHIpOw0KKw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsIG1lc3NhZ2UuVmFsaWQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBFeGFtcGxlX1RvWG1sKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBtZXNzYWdlID0NCisgICAgICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRWYWxpZCh0cnVlKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICAvLzMuNTogc3RyaW5nIFhtbCA9IG1lc3NhZ2UuVG9YbWwoKTsNCisgICAgICAgICAgICBzdHJpbmcgWG1sID0gRXh0ZW5zaW9ucy5Ub1htbChtZXNzYWdlKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQCI8cm9vdD48dmFsaWQ+dHJ1ZTwvdmFsaWQ+PC9yb290PiIsIFhtbCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEV4YW1wbGVfV3JpdGVYbWxVc2luZ0lDb2RlZE91dHB1dFN0cmVhbSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UgbWVzc2FnZSA9DQorICAgICAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0VmFsaWQodHJ1ZSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgdXNpbmcgKFRleHRXcml0ZXIgb3V0cHV0ID0gbmV3IFN0cmluZ1dyaXRlcigpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgSUNvZGVkT3V0cHV0U3RyZWFtIHdyaXRlciA9IFhtbEZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZShvdXRwdXQpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVNZXNzYWdlU3RhcnQoKTsgICAgICAvL21hbnVhbGx5IGJlZ2luIHRoZSBtZXNzYWdlLCBvdXRwdXQgaXMgJ3snDQorDQorICAgICAgICAgICAgICAgIElDb2RlZE91dHB1dFN0cmVhbSBzdHJlYW0gPSB3cml0ZXI7DQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuV3JpdGVUbyhzdHJlYW0pOyAgICAgICAgIC8vd3JpdGUgdGhlIG1lc3NhZ2Ugbm9ybWFsbHkNCisNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTWVzc2FnZUVuZCgpOyAgICAgICAgLy9tYW51YWxseSB3cml0ZSB0aGUgZW5kIG1lc3NhZ2UgJ30nDQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChAIjxyb290Pjx2YWxpZD50cnVlPC92YWxpZD48L3Jvb3Q+Iiwgb3V0cHV0LlRvU3RyaW5nKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRXhhbXBsZV9SZWFkWG1sVXNpbmdJQ29kZWRJbnB1dFN0cmVhbSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0gVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIElDb2RlZElucHV0U3RyZWFtIHJlYWRlciA9IFhtbEZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZShAIjxyb290Pjx2YWxpZD50cnVlPC92YWxpZD48L3Jvb3Q+Iik7DQorDQorICAgICAgICAgICAgcmVhZGVyLlJlYWRNZXNzYWdlU3RhcnQoKTsgIC8vbWFudWFsbHkgcmVhZCB0aGUgYmVnaW4gdGhlIG1lc3NhZ2UgJ3snDQorDQorICAgICAgICAgICAgYnVpbGRlci5NZXJnZUZyb20ocmVhZGVyKTsgIC8vcmVhZCB0aGUgbWVzc2FnZSBub3JtYWxseQ0KKw0KKyAgICAgICAgICAgIHJlYWRlci5SZWFkTWVzc2FnZUVuZCgpOyAgICAvL21hbnVhbGx5IHJlYWQgdGhlIGVuZCBtZXNzYWdlICd9Jw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0VG9YbWxQYXJzZUZyb21YbWwoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzLkJ1aWxkZXIoKS5TZXREZWZhdWx0Qm9vbCh0cnVlKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIHN0cmluZyB4bWwgPSBFeHRlbnNpb25zLlRvWG1sKG1zZyk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI8cm9vdD48ZGVmYXVsdF9ib29sPnRydWU8L2RlZmF1bHRfYm9vbD48L3Jvb3Q+IiwgeG1sKTsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgY29weSA9IEV4dGVuc2lvbnMuTWVyZ2VGcm9tWG1sKG5ldyBUZXN0QWxsVHlwZXMuQnVpbGRlcigpLCBYbWxSZWFkZXIuQ3JlYXRlKG5ldyBTdHJpbmdSZWFkZXIoeG1sKSkpLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjb3B5Lkhhc0RlZmF1bHRCb29sICYmIGNvcHkuRGVmYXVsdEJvb2wpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtc2csIGNvcHkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0VG9YbWxQYXJzZUZyb21YbWxXaXRoUm9vdE5hbWUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzLkJ1aWxkZXIoKS5TZXREZWZhdWx0Qm9vbCh0cnVlKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIHN0cmluZyB4bWwgPSBFeHRlbnNpb25zLlRvWG1sKG1zZywgIm1lc3NhZ2UiKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjxtZXNzYWdlPjxkZWZhdWx0X2Jvb2w+dHJ1ZTwvZGVmYXVsdF9ib29sPjwvbWVzc2FnZT4iLCB4bWwpOw0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBjb3B5ID0gRXh0ZW5zaW9ucy5NZXJnZUZyb21YbWwobmV3IFRlc3RBbGxUeXBlcy5CdWlsZGVyKCksICJtZXNzYWdlIiwgWG1sUmVhZGVyLkNyZWF0ZShuZXcgU3RyaW5nUmVhZGVyKHhtbCkpKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoY29weS5IYXNEZWZhdWx0Qm9vbCAmJiBjb3B5LkRlZmF1bHRCb29sKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobXNnLCBjb3B5KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEVtcHR5TWVzc2FnZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbENoaWxkIG1lc3NhZ2UgPSBUZXN0WG1sQ2hpbGQuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCisgICAgICAgICAgICBYbWxXcml0ZXIgeHcgPSBYbWxXcml0ZXIuQ3JlYXRlKHN3KTsNCisNCisgICAgICAgICAgICAvL1doZW4gd2UgY2FsbCBtZXNzYWdlLldyaXRlVG8sIHdlIGFyZSByZXNwb25zaWJsZSBmb3IgdGhlIHJvb3QgZWxlbWVudA0KKyAgICAgICAgICAgIHh3LldyaXRlU3RhcnRFbGVtZW50KCJyb290Iik7DQorICAgICAgICAgICAgbWVzc2FnZS5Xcml0ZVRvKFhtbEZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZSh4dykpOw0KKyAgICAgICAgICAgIHh3LldyaXRlRW5kRWxlbWVudCgpOw0KKyAgICAgICAgICAgIHh3LkZsdXNoKCk7DQorDQorICAgICAgICAgICAgc3RyaW5nIHhtbCA9IHN3LlRvU3RyaW5nKCk7DQorICAgICAgICAgICAgWG1sRm9ybWF0UmVhZGVyIHJkciA9IFhtbEZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZSh4bWwpOw0KKyAgICAgICAgICAgIFRlc3RYbWxDaGlsZCBjb3B5ID0gcmRyLk1lcmdlKFRlc3RYbWxDaGlsZC5DcmVhdGVCdWlsZGVyKCkpLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UsIGNvcHkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UmVwZWF0ZWRGaWVsZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbENoaWxkIG1lc3NhZ2UgPSBUZXN0WG1sQ2hpbGQuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5BZGRPcHRpb25zKEVudW1PcHRpb25zLk9ORSkNCisgICAgICAgICAgICAgICAgLkFkZE9wdGlvbnMoRW51bU9wdGlvbnMuVFdPKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICAvL0FsbG93IHRoZSB3cml0ZXIgdG8gd3JpdGUgdGhlIHJvb3QgZWxlbWVudA0KKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCisgICAgICAgICAgICBYbWxGb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2Uoc3cpLldyaXRlTWVzc2FnZSgicm9vdCIsIG1lc3NhZ2UpOw0KKw0KKyAgICAgICAgICAgIHN0cmluZyB4bWwgPSBzdy5Ub1N0cmluZygpOw0KKyAgICAgICAgICAgIFhtbEZvcm1hdFJlYWRlciByZHIgPSBYbWxGb3JtYXRSZWFkZXIuQ3JlYXRlSW5zdGFuY2UoeG1sKTsNCisgICAgICAgICAgICBUZXN0WG1sQ2hpbGQgY29weSA9IHJkci5NZXJnZShUZXN0WG1sQ2hpbGQuQ3JlYXRlQnVpbGRlcigpKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBjb3B5KTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE5lc3RlZEVtcHR5TWVzc2FnZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UgbWVzc2FnZSA9IFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0Q2hpbGQoVGVzdFhtbENoaWxkLkNyZWF0ZUJ1aWxkZXIoKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQorICAgICAgICAgICAgWG1sRm9ybWF0V3JpdGVyLkNyZWF0ZUluc3RhbmNlKHN3KS5Xcml0ZU1lc3NhZ2UoInJvb3QiLCBtZXNzYWdlKTsNCisNCisgICAgICAgICAgICBzdHJpbmcgeG1sID0gc3cuVG9TdHJpbmcoKTsNCisgICAgICAgICAgICBYbWxGb3JtYXRSZWFkZXIgcmRyID0gWG1sRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKHhtbCk7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UgY29weSA9IHJkci5NZXJnZShUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkpLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UsIGNvcHkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TmVzdGVkTWVzc2FnZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UgbWVzc2FnZSA9IFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0Q2hpbGQoVGVzdFhtbENoaWxkLkNyZWF0ZUJ1aWxkZXIoKS5BZGRPcHRpb25zKEVudW1PcHRpb25zLlRXTykuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KKyAgICAgICAgICAgIFhtbEZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZShzdykuV3JpdGVNZXNzYWdlKCJyb290IiwgbWVzc2FnZSk7DQorDQorICAgICAgICAgICAgc3RyaW5nIHhtbCA9IHN3LlRvU3RyaW5nKCk7DQorICAgICAgICAgICAgWG1sRm9ybWF0UmVhZGVyIHJkciA9IFhtbEZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZSh4bWwpOw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIGNvcHkgPSByZHIuTWVyZ2UoVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBjb3B5KTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEJvb2xlYW5UeXBlcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UgbWVzc2FnZSA9IFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0VmFsaWQodHJ1ZSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KKyAgICAgICAgICAgIFhtbEZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZShzdykuV3JpdGVNZXNzYWdlKCJyb290IiwgbWVzc2FnZSk7DQorDQorICAgICAgICAgICAgc3RyaW5nIHhtbCA9IHN3LlRvU3RyaW5nKCk7DQorICAgICAgICAgICAgWG1sRm9ybWF0UmVhZGVyIHJkciA9IFhtbEZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZSh4bWwpOw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIGNvcHkgPSByZHIuTWVyZ2UoVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBjb3B5KTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEZ1bGxNZXNzYWdlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBtZXNzYWdlID0gVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRWYWxpZCh0cnVlKQ0KKyAgICAgICAgICAgICAgICAuU2V0VGV4dCgidGV4dCIpDQorICAgICAgICAgICAgICAgIC5BZGRUZXh0bGluZXMoImEiKQ0KKyAgICAgICAgICAgICAgICAuQWRkVGV4dGxpbmVzKCJiIikNCisgICAgICAgICAgICAgICAgLkFkZFRleHRsaW5lcygiYyIpDQorICAgICAgICAgICAgICAgIC5TZXROdW1iZXIoMHgxMDEwMTAxMDEwKQ0KKyAgICAgICAgICAgICAgICAuQWRkTnVtYmVycygxKQ0KKyAgICAgICAgICAgICAgICAuQWRkTnVtYmVycygyKQ0KKyAgICAgICAgICAgICAgICAuQWRkTnVtYmVycygzKQ0KKyAgICAgICAgICAgICAgICAuU2V0Q2hpbGQoVGVzdFhtbENoaWxkLkNyZWF0ZUJ1aWxkZXIoKS5BZGRPcHRpb25zKEVudW1PcHRpb25zLk9ORSkuU2V0QmluYXJ5KEJ5dGVTdHJpbmcuQ29weUZyb20obmV3IGJ5dGVbMV0pKSkNCisgICAgICAgICAgICAgICAgLkFkZENoaWxkcmVuKFRlc3RYbWxNZXNzYWdlLlR5cGVzLkNoaWxkcmVuLkNyZWF0ZUJ1aWxkZXIoKS5BZGRPcHRpb25zKEVudW1PcHRpb25zLlRXTykuU2V0QmluYXJ5KEJ5dGVTdHJpbmcuQ29weUZyb20obmV3IGJ5dGVbMl0pKSkNCisgICAgICAgICAgICAgICAgLkFkZENoaWxkcmVuKFRlc3RYbWxNZXNzYWdlLlR5cGVzLkNoaWxkcmVuLkNyZWF0ZUJ1aWxkZXIoKS5BZGRPcHRpb25zKEVudW1PcHRpb25zLlRIUkVFKS5TZXRCaW5hcnkoQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVszXSkpKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQorICAgICAgICAgICAgWG1sV3JpdGVyIHh3dHIgPSBYbWxXcml0ZXIuQ3JlYXRlKHN3LCBuZXcgWG1sV3JpdGVyU2V0dGluZ3Mge0luZGVudCA9IHRydWUsIEluZGVudENoYXJzID0gIiAgIn0pOw0KKw0KKyAgICAgICAgICAgIFhtbEZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZSh4d3RyKS5Xcml0ZU1lc3NhZ2UoInJvb3QiLCBtZXNzYWdlKTsNCisNCisgICAgICAgICAgICBzdHJpbmcgeG1sID0gc3cuVG9TdHJpbmcoKTsNCisNCisgICAgICAgICAgICBYbWxGb3JtYXRSZWFkZXIgcmRyID0gWG1sRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKHhtbCk7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UgY29weSA9IHJkci5NZXJnZShUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkpLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UsIGNvcHkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0RnVsbE1lc3NhZ2VXaXRoUmljaFR5cGVzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBtZXNzYWdlID0gVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRWYWxpZCh0cnVlKQ0KKyAgICAgICAgICAgICAgICAuU2V0VGV4dCgidGV4dCIpDQorICAgICAgICAgICAgICAgIC5BZGRUZXh0bGluZXMoImEiKQ0KKyAgICAgICAgICAgICAgICAuQWRkVGV4dGxpbmVzKCJiIikNCisgICAgICAgICAgICAgICAgLkFkZFRleHRsaW5lcygiYyIpDQorICAgICAgICAgICAgICAgIC5TZXROdW1iZXIoMHgxMDEwMTAxMDEwKQ0KKyAgICAgICAgICAgICAgICAuQWRkTnVtYmVycygxKQ0KKyAgICAgICAgICAgICAgICAuQWRkTnVtYmVycygyKQ0KKyAgICAgICAgICAgICAgICAuQWRkTnVtYmVycygzKQ0KKyAgICAgICAgICAgICAgICAuU2V0Q2hpbGQoVGVzdFhtbENoaWxkLkNyZWF0ZUJ1aWxkZXIoKS5BZGRPcHRpb25zKEVudW1PcHRpb25zLk9ORSkuU2V0QmluYXJ5KEJ5dGVTdHJpbmcuQ29weUZyb20obmV3IGJ5dGVbMV0pKSkNCisgICAgICAgICAgICAgICAgLkFkZENoaWxkcmVuKFRlc3RYbWxNZXNzYWdlLlR5cGVzLkNoaWxkcmVuLkNyZWF0ZUJ1aWxkZXIoKS5BZGRPcHRpb25zKEVudW1PcHRpb25zLlRXTykuU2V0QmluYXJ5KEJ5dGVTdHJpbmcuQ29weUZyb20obmV3IGJ5dGVbMl0pKSkNCisgICAgICAgICAgICAgICAgLkFkZENoaWxkcmVuKFRlc3RYbWxNZXNzYWdlLlR5cGVzLkNoaWxkcmVuLkNyZWF0ZUJ1aWxkZXIoKS5BZGRPcHRpb25zKEVudW1PcHRpb25zLlRIUkVFKS5TZXRCaW5hcnkoQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVszXSkpKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQorICAgICAgICAgICAgWG1sV3JpdGVyIHh3dHIgPSBYbWxXcml0ZXIuQ3JlYXRlKHN3LCBuZXcgWG1sV3JpdGVyU2V0dGluZ3MgeyBJbmRlbnQgPSB0cnVlLCBJbmRlbnRDaGFycyA9ICIgICIgfSk7DQorDQorICAgICAgICAgICAgWG1sRm9ybWF0V3JpdGVyLkNyZWF0ZUluc3RhbmNlKHh3dHIpDQorICAgICAgICAgICAgICAgIC5TZXRPcHRpb25zKFhtbFdyaXRlck9wdGlvbnMuT3V0cHV0TmVzdGVkQXJyYXlzIHwgWG1sV3JpdGVyT3B0aW9ucy5PdXRwdXRFbnVtVmFsdWVzKQ0KKyAgICAgICAgICAgICAgICAuV3JpdGVNZXNzYWdlKCJyb290IiwgbWVzc2FnZSk7DQorDQorICAgICAgICAgICAgc3RyaW5nIHhtbCA9IHN3LlRvU3RyaW5nKCk7DQorDQorICAgICAgICAgICAgWG1sRm9ybWF0UmVhZGVyIHJkciA9IFhtbEZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZSh4bWwpOw0KKyAgICAgICAgICAgIHJkci5PcHRpb25zID0gWG1sUmVhZGVyT3B0aW9ucy5SZWFkTmVzdGVkQXJyYXlzOw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIGNvcHkgPSByZHIuTWVyZ2UoVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBjb3B5KTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEZ1bGxNZXNzYWdlV2l0aFVua25vd25GaWVsZHMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIG9yaWdpYWwgPSBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgIC5TZXRWYWxpZCh0cnVlKQ0KKyAgICAgICAgICAgICAgICAgICAgLlNldFRleHQoInRleHQiKQ0KKyAgICAgICAgICAgICAgICAgICAgLkFkZFRleHRsaW5lcygiYSIpDQorICAgICAgICAgICAgICAgICAgICAuQWRkVGV4dGxpbmVzKCJiIikNCisgICAgICAgICAgICAgICAgICAgIC5BZGRUZXh0bGluZXMoImMiKQ0KKyAgICAgICAgICAgICAgICAgICAgLlNldE51bWJlcigweDEwMTAxMDEwMTApDQorICAgICAgICAgICAgICAgICAgICAuQWRkTnVtYmVycygxKQ0KKyAgICAgICAgICAgICAgICAgICAgLkFkZE51bWJlcnMoMikNCisgICAgICAgICAgICAgICAgICAgIC5BZGROdW1iZXJzKDMpDQorICAgICAgICAgICAgICAgICAgICAuU2V0Q2hpbGQoVGVzdFhtbENoaWxkLkNyZWF0ZUJ1aWxkZXIoKS5BZGRPcHRpb25zKEVudW1PcHRpb25zLk9ORSkuU2V0QmluYXJ5KEJ5dGVTdHJpbmcuQ29weUZyb20obmV3IGJ5dGVbMV0pKSkNCisgICAgICAgICAgICAgICAgICAgIC5BZGRDaGlsZHJlbihUZXN0WG1sTWVzc2FnZS5UeXBlcy5DaGlsZHJlbi5DcmVhdGVCdWlsZGVyKCkuQWRkT3B0aW9ucyhFbnVtT3B0aW9ucy5UV08pLlNldEJpbmFyeShCeXRlU3RyaW5nLkNvcHlGcm9tKG5ldyBieXRlWzJdKSkpDQorICAgICAgICAgICAgICAgICAgICAuQWRkQ2hpbGRyZW4oVGVzdFhtbE1lc3NhZ2UuVHlwZXMuQ2hpbGRyZW4uQ3JlYXRlQnVpbGRlcigpLkFkZE9wdGlvbnMoRW51bU9wdGlvbnMuVEhSRUUpLlNldEJpbmFyeShCeXRlU3RyaW5nLkNvcHlGcm9tKG5ldyBieXRlWzNdKSkpDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKyAgICAgICAgICAgIFRlc3RYbWxOb0ZpZWxkcyBtZXNzYWdlID0gVGVzdFhtbE5vRmllbGRzLkNyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20ob3JpZ2lhbC5Ub0J5dGVBcnJheSgpKS5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLkFsbEZpZWxkcy5Db3VudCk7DQorDQorICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KKyAgICAgICAgICAgIFhtbEZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZShzdykNCisgICAgICAgICAgICAgICAgLlNldE9wdGlvbnMoWG1sV3JpdGVyT3B0aW9ucy5PdXRwdXROZXN0ZWRBcnJheXMgfCBYbWxXcml0ZXJPcHRpb25zLk91dHB1dEVudW1WYWx1ZXMpDQorICAgICAgICAgICAgICAgIC5Xcml0ZU1lc3NhZ2UoInJvb3QiLCBtZXNzYWdlKTsNCisNCisgICAgICAgICAgICBzdHJpbmcgeG1sID0gc3cuVG9TdHJpbmcoKTsNCisNCisgICAgICAgICAgICB1c2luZyAoWG1sUmVhZGVyIHggPSBYbWxSZWFkZXIuQ3JlYXRlKG5ldyBTdHJpbmdSZWFkZXIoeG1sKSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB4Lk1vdmVUb0NvbnRlbnQoKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFhtbE5vZGVUeXBlLkVsZW1lbnQsIHguTm9kZVR5cGUpOw0KKyAgICAgICAgICAgICAgICAvL3Nob3VsZCBhbHdheXMgYmUgZW1wdHkNCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh4LklzRW1wdHlFbGVtZW50IHx8DQorICAgICAgICAgICAgICAgICAgICAoeC5SZWFkKCkgJiYgeC5Ob2RlVHlwZSA9PSBYbWxOb2RlVHlwZS5FbmRFbGVtZW50KQ0KKyAgICAgICAgICAgICAgICAgICAgKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgWG1sRm9ybWF0UmVhZGVyIHJkciA9IFhtbEZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZSh4bWwpOw0KKyAgICAgICAgICAgIHJkci5PcHRpb25zID0gWG1sUmVhZGVyT3B0aW9ucy5SZWFkTmVzdGVkQXJyYXlzOw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIGNvcHkgPSByZHIuTWVyZ2UoVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0WG1sTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UsIGNvcHkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TWVzc2FnZVdpdGhYbWxUZXh0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBtZXNzYWdlID0gVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRUZXh0KCI8dGV4dD4iKS5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCisgICAgICAgICAgICBYbWxGb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2Uoc3cpLldyaXRlTWVzc2FnZSgicm9vdCIsIG1lc3NhZ2UpOw0KKw0KKyAgICAgICAgICAgIHN0cmluZyB4bWwgPSBzdy5Ub1N0cmluZygpOw0KKw0KKyAgICAgICAgICAgIFhtbEZvcm1hdFJlYWRlciByZHIgPSBYbWxGb3JtYXRSZWFkZXIuQ3JlYXRlSW5zdGFuY2UoeG1sKTsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBjb3B5ID0gcmRyLk1lcmdlKFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKSkuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZSwgY29weSk7DQorICAgICAgICB9DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RYbWxXaXRoV2hpdGVzcGFjZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UgbWVzc2FnZSA9IFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0VGV4dCgiIFx0IDwtIGxlYWRpbmcgc3BhY2UgYW5kIHRyYWlsaW5nIC0+IFxyXG5cdCIpLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KKyAgICAgICAgICAgIFhtbEZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZShzdykuV3JpdGVNZXNzYWdlKCJyb290IiwgbWVzc2FnZSk7DQorDQorICAgICAgICAgICAgc3RyaW5nIHhtbCA9IHN3LlRvU3RyaW5nKCk7DQorDQorICAgICAgICAgICAgWG1sRm9ybWF0UmVhZGVyIHJkciA9IFhtbEZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZSh4bWwpOw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIGNvcHkgPSByZHIuTWVyZ2UoVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBjb3B5KTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFhtbFdpdGhFeHRlbnNpb25UZXh0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBtZXNzYWdlID0gVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25UZXh0LCAiIGV4dGVuc2lvbiB0ZXh0IHZhbHVlICEgIikNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KKyAgICAgICAgICAgIFhtbEZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZShzdykuV3JpdGVNZXNzYWdlKCJyb290IiwgbWVzc2FnZSk7DQorDQorICAgICAgICAgICAgc3RyaW5nIHhtbCA9IHN3LlRvU3RyaW5nKCk7DQorDQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisNCisgICAgICAgICAgICBYbWxGb3JtYXRSZWFkZXIgcmRyID0gWG1sRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKHhtbCk7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UgY29weSA9IHJkci5NZXJnZShUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCksIHJlZ2lzdHJ5KS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBjb3B5KTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFhtbFdpdGhFeHRlbnNpb25NZXNzYWdlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBtZXNzYWdlID0gVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25NZXNzYWdlLA0KKyAgICAgICAgICAgICAgICBuZXcgVGVzdFhtbEV4dGVuc2lvbi5CdWlsZGVyKCkuU2V0TnVtYmVyKDQyKS5CdWlsZCgpKS5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCisgICAgICAgICAgICBYbWxGb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2Uoc3cpLldyaXRlTWVzc2FnZSgicm9vdCIsIG1lc3NhZ2UpOw0KKw0KKyAgICAgICAgICAgIHN0cmluZyB4bWwgPSBzdy5Ub1N0cmluZygpOw0KKw0KKyAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgICAgICBVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorDQorICAgICAgICAgICAgWG1sRm9ybWF0UmVhZGVyIHJkciA9IFhtbEZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZSh4bWwpOw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIGNvcHkgPSByZHIuTWVyZ2UoVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLCByZWdpc3RyeSkuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZSwgY29weSk7DQorICAgICAgICB9DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RYbWxXaXRoRXh0ZW5zaW9uQXJyYXkoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIG1lc3NhZ2UgPSBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLkV4dGVuc2lvbk51bWJlciwgMTAwKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuRXh0ZW5zaW9uTnVtYmVyLCAxMDEpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25OdW1iZXIsIDEwMikNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KKyAgICAgICAgICAgIFhtbEZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZShzdykuV3JpdGVNZXNzYWdlKCJyb290IiwgbWVzc2FnZSk7DQorDQorICAgICAgICAgICAgc3RyaW5nIHhtbCA9IHN3LlRvU3RyaW5nKCk7DQorDQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFVuaXRUZXN0WG1sU2VyaWFsaXplclRlc3RQcm90b0ZpbGUuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisNCisgICAgICAgICAgICBYbWxGb3JtYXRSZWFkZXIgcmRyID0gWG1sRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKHhtbCk7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UgY29weSA9IHJkci5NZXJnZShUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCksIHJlZ2lzdHJ5KS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBjb3B5KTsNCisgICAgICAgIH0NCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFhtbFdpdGhFeHRlbnNpb25FbnVtKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBtZXNzYWdlID0gVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZS5FeHRlbnNpb25FbnVtLCBFbnVtT3B0aW9ucy5PTkUpDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCisgICAgICAgICAgICBYbWxGb3JtYXRXcml0ZXIuQ3JlYXRlSW5zdGFuY2Uoc3cpLldyaXRlTWVzc2FnZSgicm9vdCIsIG1lc3NhZ2UpOw0KKw0KKyAgICAgICAgICAgIHN0cmluZyB4bWwgPSBzdy5Ub1N0cmluZygpOw0KKw0KKyAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgICAgICBVbml0VGVzdFhtbFNlcmlhbGl6ZXJUZXN0UHJvdG9GaWxlLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorDQorICAgICAgICAgICAgWG1sRm9ybWF0UmVhZGVyIHJkciA9IFhtbEZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZSh4bWwpOw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIGNvcHkgPSByZHIuTWVyZ2UoVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLCByZWdpc3RyeSkuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZSwgY29weSk7DQorICAgICAgICB9DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RYbWxSZWFkRW1wdHlSb290KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0WG1sTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgSUNvZGVkSW5wdXRTdHJlYW0gcmVhZGVyID0gWG1sRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKEAiPHJvb3QvPiIpOw0KKw0KKyAgICAgICAgICAgIHJlYWRlci5SZWFkTWVzc2FnZVN0YXJ0KCk7ICAvL21hbnVhbGx5IHJlYWQgdGhlIGJlZ2luIHRoZSBtZXNzYWdlICd7Jw0KKw0KKyAgICAgICAgICAgIGJ1aWxkZXIuTWVyZ2VGcm9tKHJlYWRlcik7ICAvL3dyaXRlIHRoZSBtZXNzYWdlIG5vcm1hbGx5DQorDQorICAgICAgICAgICAgcmVhZGVyLlJlYWRNZXNzYWdlRW5kKCk7ICAgIC8vbWFudWFsbHkgcmVhZCB0aGUgZW5kIG1lc3NhZ2UgJ30nDQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RYbWxSZWFkRW1wdHlDaGlsZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0gVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIElDb2RlZElucHV0U3RyZWFtIHJlYWRlciA9IFhtbEZvcm1hdFJlYWRlci5DcmVhdGVJbnN0YW5jZShAIjxyb290Pjx0ZXh0IC8+PC9yb290PiIpOw0KKw0KKyAgICAgICAgICAgIHJlYWRlci5SZWFkTWVzc2FnZVN0YXJ0KCk7ICAvL21hbnVhbGx5IHJlYWQgdGhlIGJlZ2luIHRoZSBtZXNzYWdlICd7Jw0KKw0KKyAgICAgICAgICAgIGJ1aWxkZXIuTWVyZ2VGcm9tKHJlYWRlcik7ICAvL3dyaXRlIHRoZSBtZXNzYWdlIG5vcm1hbGx5DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShidWlsZGVyLkhhc1RleHQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChTdHJpbmcuRW1wdHksIGJ1aWxkZXIuVGV4dCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RYbWxSZWFkV3JpdGVXaXRob3V0Um9vdCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFhtbE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0gVGVzdFhtbE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIFRlc3RYbWxNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLlNldFRleHQoImFiYyIpLlNldE51bWJlcigxMjMpLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgc3RyaW5nIHhtbDsNCisgICAgICAgICAgICB1c2luZyAoU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgSUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IFhtbEZvcm1hdFdyaXRlci5DcmVhdGVJbnN0YW5jZSgNCisgICAgICAgICAgICAgICAgICAgIFhtbFdyaXRlci5DcmVhdGUoc3csIG5ldyBYbWxXcml0ZXJTZXR0aW5ncygpIHsgQ29uZm9ybWFuY2VMZXZlbCA9IENvbmZvcm1hbmNlTGV2ZWwuRnJhZ21lbnQgfSkpOw0KKw0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLldyaXRlVG8ob3V0cHV0KTsNCisgICAgICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7DQorICAgICAgICAgICAgICAgIHhtbCA9IHN3LlRvU3RyaW5nKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiPHRleHQ+YWJjPC90ZXh0PjxudW1iZXI+MTIzPC9udW1iZXI+IiwgeG1sKTsNCisNCisgICAgICAgICAgICBUZXN0WG1sTWVzc2FnZSBjb3B5Ow0KKyAgICAgICAgICAgIHVzaW5nIChYbWxSZWFkZXIgeHIgPSBYbWxSZWFkZXIuQ3JlYXRlKG5ldyBTdHJpbmdSZWFkZXIoeG1sKSwgbmV3IFhtbFJlYWRlclNldHRpbmdzKCkgeyBDb25mb3JtYW5jZUxldmVsID0gQ29uZm9ybWFuY2VMZXZlbC5GcmFnbWVudCB9KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIElDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gWG1sRm9ybWF0UmVhZGVyLkNyZWF0ZUluc3RhbmNlKHhyKTsNCisgICAgICAgICAgICAgICAgY29weSA9IFRlc3RYbWxNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBjb3B5KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoUmVjdXJzaW9uTGltaXRFeGNlZWRlZEV4Y2VwdGlvbikpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFJlY3Vyc2l2ZUxpbWl0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoODE5Mik7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4MDsgaSsrKQ0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIjxjaGlsZD4iKTsNCisgICAgICAgICAgICBUZXN0WG1sUmVzY3Vyc2l2ZSBtc2cgPSBFeHRlbnNpb25zLk1lcmdlRnJvbVhtbChuZXcgVGVzdFhtbFJlc2N1cnNpdmUuQnVpbGRlcigpLCAiY2hpbGQiLCBYbWxSZWFkZXIuQ3JlYXRlKG5ldyBTdHJpbmdSZWFkZXIoc2IuVG9TdHJpbmcoKSkpKS5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVGV4dEZvcm1hdFRlc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1RleHRGb3JtYXRUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YTQxOTIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy5UZXN0L1RleHRGb3JtYXRUZXN0LmNzCkBAIC0wLDAgKzEsNTg2IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3M7DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247DQordXNpbmcgU3lzdGVtLlRocmVhZGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIFRleHRGb3JtYXRUZXN0DQorICAgIHsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZyBBbGxGaWVsZHNTZXRUZXh0ID0gVGVzdFJlc291cmNlcy50ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nIEFsbEV4dGVuc2lvbnNTZXRUZXh0ID0gVGVzdFJlc291cmNlcy50ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGE7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvIHRoZSBKYXZhIC0gMTIzLjAgYmVjb21lcyAxMjMsIGFuZCAxLjIzRTE3IGJlY29tZXMgMS4yM0UrMTcuDQorICAgICAgICAvLy8gQm90aCBvZiB0aGVzZSBkaWZmZXJlbmNlcyBjYW4gYmUgcGFyc2VkIGJ5IHRoZSBKYXZhIGFuZCB0aGUgQysrLCBhbmQgd2UgY2FuIHBhcnNlIHRoZWlyIG91dHB1dCB0b28uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgRXhvdGljVGV4dCA9DQorICAgICAgICAgICAgInJlcGVhdGVkX2ludDMyOiAtMVxuIiArDQorICAgICAgICAgICAgInJlcGVhdGVkX2ludDMyOiAtMjE0NzQ4MzY0OFxuIiArDQorICAgICAgICAgICAgInJlcGVhdGVkX2ludDY0OiAtMVxuIiArDQorICAgICAgICAgICAgInJlcGVhdGVkX2ludDY0OiAtOTIyMzM3MjAzNjg1NDc3NTgwOFxuIiArDQorICAgICAgICAgICAgInJlcGVhdGVkX3VpbnQzMjogNDI5NDk2NzI5NVxuIiArDQorICAgICAgICAgICAgInJlcGVhdGVkX3VpbnQzMjogMjE0NzQ4MzY0OFxuIiArDQorICAgICAgICAgICAgInJlcGVhdGVkX3VpbnQ2NDogMTg0NDY3NDQwNzM3MDk1NTE2MTVcbiIgKw0KKyAgICAgICAgICAgICJyZXBlYXRlZF91aW50NjQ6IDkyMjMzNzIwMzY4NTQ3NzU4MDhcbiIgKw0KKyAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IDEyM1xuIiArDQorICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMTIzLjVcbiIgKw0KKyAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IDAuMTI1XG4iICsNCisgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzRSsxN1xuIiArDQorICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzVFKzIyXG4iICsNCisgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNUUtMThcbiIgKw0KKyAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IDEyMy40NTY3ODlcbiIgKw0KKyAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IEluZmluaXR5XG4iICsNCisgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiAtSW5maW5pdHlcbiIgKw0KKyAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IE5hTlxuIiArDQorICAgICAgICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJcXDAwMFxcMDAxXFxhXFxiXFxmXFxuXFxyXFx0XFx2XFxcXFxcJ1xcXCIiICsNCisgICAgICAgICAgICAiXFwzNDFcXDIxMFxcMjY0XCJcbiIgKw0KKyAgICAgICAgICAgICJyZXBlYXRlZF9ieXRlczogXCJcXDAwMFxcMDAxXFxhXFxiXFxmXFxuXFxyXFx0XFx2XFxcXFxcJ1xcXCJcXDM3NlwiXG4iOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgTWVzc2FnZVNldFRleHQgPQ0KKyAgICAgICAgICAgICJbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xXSB7XG4iICsNCisgICAgICAgICAgICAiICBpOiAxMjNcbiIgKw0KKyAgICAgICAgICAgICJ9XG4iICsNCisgICAgICAgICAgICAiW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMl0ge1xuIiArDQorICAgICAgICAgICAgIiAgc3RyOiBcImZvb1wiXG4iICsNCisgICAgICAgICAgICAifVxuIjsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQcmludCBUZXN0QWxsVHlwZXMgYW5kIGNvbXBhcmUgd2l0aCBnb2xkZW4gZmlsZS4gDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQcmludE1lc3NhZ2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RVdGlsLlRlc3RJbk11bHRpcGxlQ3VsdHVyZXMoKCkgPT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gVGV4dEZvcm1hdC5QcmludFRvU3RyaW5nKFRlc3RVdGlsLkdldEFsbFNldCgpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEFsbEZpZWxkc1NldFRleHQuUmVwbGFjZSgiXHJcbiIsICJcbiIpLlRyaW0oKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuUmVwbGFjZSgiXHJcbiIsICJcbiIpLlRyaW0oKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGVzdHMgdGhhdCBhIGJ1aWxkZXIgcHJpbnRzIHRoZSBzYW1lIHdheSBhcyBhIG1lc3NhZ2UuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQcmludEJ1aWxkZXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RVdGlsLlRlc3RJbk11bHRpcGxlQ3VsdHVyZXMoKCkgPT4NCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHN0cmluZyBtZXNzYWdlVGV4dCA9IFRleHRGb3JtYXQuUHJpbnRUb1N0cmluZyhUZXN0VXRpbC5HZXRBbGxTZXQoKSk7DQorICAgICAgICAgICAgICAgIHN0cmluZyBidWlsZGVyVGV4dCA9IFRleHRGb3JtYXQuUHJpbnRUb1N0cmluZyhUZXN0VXRpbC5HZXRBbGxTZXQoKS5Ub0J1aWxkZXIoKSk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlVGV4dCwgYnVpbGRlclRleHQpOw0KKyAgICAgICAgICAgIH0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFByaW50IFRlc3RBbGxFeHRlbnNpb25zIGFuZCBjb21wYXJlIHdpdGggZ29sZGVuIGZpbGUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQcmludEV4dGVuc2lvbnMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gVGV4dEZvcm1hdC5QcmludFRvU3RyaW5nKFRlc3RVdGlsLkdldEFsbEV4dGVuc2lvbnNTZXQoKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEFsbEV4dGVuc2lvbnNTZXRUZXh0LlJlcGxhY2UoIlxyXG4iLCAiXG4iKS5UcmltKCksIHRleHQuUmVwbGFjZSgiXHJcbiIsICJcbiIpLlRyaW0oKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGVzdCBwcmludGluZyBvZiB1bmtub3duIGZpZWxkcyBpbiBhIG1lc3NhZ2UuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQcmludFVua25vd25GaWVsZHMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZSA9DQorICAgICAgICAgICAgICAgIFRlc3RFbXB0eU1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAuU2V0VW5rbm93bkZpZWxkcygNCisgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRGaWVsZCg1LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRWYXJpbnQoMSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkRml4ZWQzMigyKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRGaXhlZDY0KDMpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZExlbmd0aERlbGltaXRlZChCeXRlU3RyaW5nLkNvcHlGcm9tVXRmOCgiNCIpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRHcm91cCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZEZpZWxkKDEwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZFZhcmludCg1KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkRmllbGQoOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkVmFyaW50KDEpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZFZhcmludCgyKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRWYXJpbnQoMykNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZEZpZWxkKDE1LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRWYXJpbnQoMHhBQkNERUYxMjM0NTY3ODkwTCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkRml4ZWQzMigweEFCQ0QxMjM0KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRGaXhlZDY0KDB4QUJDREVGMTIzNDU2Nzg5MEwpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKA0KKyAgICAgICAgICAgICAgICAiNTogMVxuIiArDQorICAgICAgICAgICAgICAgICI1OiAweDAwMDAwMDAyXG4iICsNCisgICAgICAgICAgICAgICAgIjU6IDB4MDAwMDAwMDAwMDAwMDAwM1xuIiArDQorICAgICAgICAgICAgICAgICI1OiBcIjRcIlxuIiArDQorICAgICAgICAgICAgICAgICI1IHtcbiIgKw0KKyAgICAgICAgICAgICAgICAiICAxMDogNVxuIiArDQorICAgICAgICAgICAgICAgICJ9XG4iICsNCisgICAgICAgICAgICAgICAgIjg6IDFcbiIgKw0KKyAgICAgICAgICAgICAgICAiODogMlxuIiArDQorICAgICAgICAgICAgICAgICI4OiAzXG4iICsNCisgICAgICAgICAgICAgICAgIjE1OiAxMjM3OTgxMzgxMjE3Nzg5MzUyMFxuIiArDQorICAgICAgICAgICAgICAgICIxNTogMHhhYmNkMTIzNFxuIiArDQorICAgICAgICAgICAgICAgICIxNTogMHhhYmNkZWYxMjM0NTY3ODkwXG4iLA0KKyAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0LlByaW50VG9TdHJpbmcobWVzc2FnZSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEhlbHBlciB0byBjb25zdHJ1Y3QgYSBCeXRlU3RyaW5nIGZyb20gYSBzdHJpbmcgY29udGFpbmluZyBvbmx5IDgtYml0DQorICAgICAgICAvLy8gY2hhcmFjdGVycy4gVGhlIGNoYXJhY3RlcnMgYXJlIGNvbnZlcnRlZCBkaXJlY3RseSB0byBieXRlcywgKm5vdCoNCisgICAgICAgIC8vLyBlbmNvZGVkIHVzaW5nIFVURi04Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgQnl0ZXMoc3RyaW5nIHN0cikNCisgICAgICAgIHsNCisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtzdHIuTGVuZ3RoXTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLkxlbmd0aDsgaSsrKQ0KKyAgICAgICAgICAgICAgICBieXRlc1tpXSA9IChieXRlKXN0cltpXTsNCisgICAgICAgICAgICByZXR1cm4gQnl0ZVN0cmluZy5Db3B5RnJvbShieXRlcyk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFByaW50RXhvdGljKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJTWVzc2FnZSBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAvLyBTaWduZWQgdnMuIHVuc2lnbmVkIG51bWJlcnMuDQorICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZEludDMyKC0xKQ0KKyAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWRVaW50MzIodWludC5NYXhWYWx1ZSkNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkSW50NjQoLTEpDQorICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZFVpbnQ2NCh1bG9uZy5NYXhWYWx1ZSkNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkSW50MzIoMSA8PCAzMSkNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkVWludDMyKDFVIDw8IDMxKQ0KKyAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWRJbnQ2NCgxTCA8PCA2MykNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkVWludDY0KDFVTCA8PCA2MykNCisNCisgICAgICAgICAgICAgICAgLy8gRmxvYXRzIG9mIHZhcmlvdXMgcHJlY2lzaW9ucyBhbmQgZXhwb25lbnRzLg0KKyAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWREb3VibGUoMTIzKQ0KKyAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWREb3VibGUoMTIzLjUpDQorICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZERvdWJsZSgwLjEyNSkNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkRG91YmxlKDEyM2UxNSkNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkRG91YmxlKDEyMy41ZTIwKQ0KKyAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWREb3VibGUoMTIzLjVlLTIwKQ0KKyAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWREb3VibGUoMTIzLjQ1Njc4OSkNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkRG91YmxlKERvdWJsZS5Qb3NpdGl2ZUluZmluaXR5KQ0KKyAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWREb3VibGUoRG91YmxlLk5lZ2F0aXZlSW5maW5pdHkpDQorICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZERvdWJsZShEb3VibGUuTmFOKQ0KKw0KKyAgICAgICAgICAgICAgICAvLyBTdHJpbmdzIGFuZCBieXRlcyB0aGF0IG5lZWRpbmcgZXNjYXBpbmcuDQorICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZFN0cmluZygiXDBcdTAwMDFcdTAwMDdcYlxmXG5cclx0XHZcXFwnXCJcdTEyMzQiKQ0KKyAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWRCeXRlcyhCeXRlcygiXDBcdTAwMDFcdTAwMDdcYlxmXG5cclx0XHZcXFwnXCJcdTAwZmUiKSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEV4b3RpY1RleHQsIG1lc3NhZ2UuVG9TdHJpbmcoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFByaW50TWVzc2FnZVNldCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdE1lc3NhZ2VTZXQgbWVzc2FnZVNldCA9DQorICAgICAgICAgICAgICAgIFRlc3RNZXNzYWdlU2V0LkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbigNCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEuTWVzc2FnZVNldEV4dGVuc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEuQ3JlYXRlQnVpbGRlcigpLlNldEkoMTIzKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbigNCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIuTWVzc2FnZVNldEV4dGVuc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIuQ3JlYXRlQnVpbGRlcigpLlNldFN0cigiZm9vIikuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChNZXNzYWdlU2V0VGV4dCwgbWVzc2FnZVNldC5Ub1N0cmluZygpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0VXRpbC5UZXN0SW5NdWx0aXBsZUN1bHR1cmVzKCgpID0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC5NZXJnZShBbGxGaWVsZHNTZXRUZXh0LCBidWlsZGVyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QWxsRmllbGRzU2V0KGJ1aWxkZXIuQnVpbGQoKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlUmVhZGVyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBUZXh0Rm9ybWF0Lk1lcmdlKG5ldyBTdHJpbmdSZWFkZXIoQWxsRmllbGRzU2V0VGV4dCksIGJ1aWxkZXIpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFsbEZpZWxkc1NldChidWlsZGVyLkJ1aWxkKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZUV4dGVuc2lvbnMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBUZXh0Rm9ybWF0Lk1lcmdlKEFsbEV4dGVuc2lvbnNTZXRUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuQ3JlYXRlRXh0ZW5zaW9uUmVnaXN0cnkoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFsbEV4dGVuc2lvbnNTZXQoYnVpbGRlci5CdWlsZCgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUGFyc2VDb21wYXRpYmlsaXR5KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdHJpbmcgb3JpZ2luYWwgPSAicmVwZWF0ZWRfZmxvYXQ6IGluZlxuIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAtaW5mXG4iICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IG5hblxuIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBpbmZmXG4iICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IC1pbmZmXG4iICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IG5hbmZcbiIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogMS4wZlxuIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBpbmZpbml0eWZcbiIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogLUluZmluaXR5ZlxuIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogaW5maW5pdHlcbiIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IC1pbmZpbml0eVxuIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogbmFuXG4iOw0KKyAgICAgICAgICAgIHN0cmluZyBjYW5vbmljYWwgPSAicmVwZWF0ZWRfZmxvYXQ6IEluZmluaXR5XG4iICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAtSW5maW5pdHlcbiIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IE5hTlxuIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogSW5maW5pdHlcbiIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IC1JbmZpbml0eVxuIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogTmFOXG4iICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAxXG4iICsgLy8gSmF2YSBoYXMgMS4wOyB0aGlzIGlzIGZpbmUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBJbmZpbml0eVxuIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogLUluZmluaXR5XG4iICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogSW5maW5pdHlcbiIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiAtSW5maW5pdHlcbiIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiBOYU5cbiI7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgVGV4dEZvcm1hdC5NZXJnZShvcmlnaW5hbCwgYnVpbGRlcik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGNhbm9uaWNhbCwgYnVpbGRlci5CdWlsZCgpLlRvU3RyaW5nKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZUV4b3RpYygpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgVGV4dEZvcm1hdC5NZXJnZShFeG90aWNUZXh0LCBidWlsZGVyKTsNCisNCisgICAgICAgICAgICAvLyBUb28gbGF6eSB0byBjaGVjayB0aGluZ3MgaW5kaXZpZHVhbGx5LiAgRG9uJ3QgdHJ5IHRvIGRlYnVnIHRoaXMNCisgICAgICAgICAgICAvLyBpZiB0ZXN0UHJpbnRFeG90aWMoKSBpcyBBc3NlcnQuRmFpbGluZy4NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRXhvdGljVGV4dCwgYnVpbGRlci5CdWlsZCgpLlRvU3RyaW5nKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZU1lc3NhZ2VTZXQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeS5BZGQoVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLk1lc3NhZ2VTZXRFeHRlbnNpb24pOw0KKyAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5LkFkZChUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIuTWVzc2FnZVNldEV4dGVuc2lvbik7DQorDQorICAgICAgICAgICAgVGVzdE1lc3NhZ2VTZXQuQnVpbGRlciBidWlsZGVyID0gVGVzdE1lc3NhZ2VTZXQuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIFRleHRGb3JtYXQuTWVyZ2UoTWVzc2FnZVNldFRleHQsIGV4dGVuc2lvblJlZ2lzdHJ5LCBidWlsZGVyKTsNCisgICAgICAgICAgICBUZXN0TWVzc2FnZVNldCBtZXNzYWdlU2V0ID0gYnVpbGRlci5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVzc2FnZVNldC5IYXNFeHRlbnNpb24oVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLk1lc3NhZ2VTZXRFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBtZXNzYWdlU2V0LkdldEV4dGVuc2lvbihUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEuTWVzc2FnZVNldEV4dGVuc2lvbikuSSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZXNzYWdlU2V0Lkhhc0V4dGVuc2lvbihUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIuTWVzc2FnZVNldEV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiZm9vIiwgbWVzc2FnZVNldC5HZXRFeHRlbnNpb24oVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLk1lc3NhZ2VTZXRFeHRlbnNpb24pLlN0cik7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlTnVtZXJpY0VudW0oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIFRleHRGb3JtYXQuTWVyZ2UoIm9wdGlvbmFsX25lc3RlZF9lbnVtOiAyIiwgYnVpbGRlcik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkJBUiwgYnVpbGRlci5PcHRpb25hbE5lc3RlZEVudW0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZUFuZ2xlQnJhY2tldHMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIFRleHRGb3JtYXQuTWVyZ2UoIk9wdGlvbmFsR3JvdXA6IDwgYTogMSA+IiwgYnVpbGRlcik7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShidWlsZGVyLkhhc09wdGlvbmFsR3JvdXApOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBidWlsZGVyLk9wdGlvbmFsR3JvdXAuQSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlQ29tbWVudCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgVGV4dEZvcm1hdC5NZXJnZSgNCisgICAgICAgICAgICAgICAgIiMgdGhpcyBpcyBhIGNvbW1lbnRcbiIgKw0KKyAgICAgICAgICAgICAgICAib3B0aW9uYWxfaW50MzI6IDEgICMgYW5vdGhlciBjb21tZW50XG4iICsNCisgICAgICAgICAgICAgICAgIm9wdGlvbmFsX2ludDY0OiAyXG4iICsNCisgICAgICAgICAgICAgICAgIiMgRU9GIGNvbW1lbnQiLCBidWlsZGVyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgYnVpbGRlci5PcHRpb25hbEludDMyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgYnVpbGRlci5PcHRpb25hbEludDY0KTsNCisgICAgICAgIH0NCisNCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXNzZXJ0UGFyc2VFcnJvcihzdHJpbmcgZXJyb3IsIHN0cmluZyB0ZXh0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC5NZXJnZSh0ZXh0LCBUZXN0VXRpbC5DcmVhdGVFeHRlbnNpb25SZWdpc3RyeSgpLCBidWlsZGVyKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIkV4cGVjdGVkIHBhcnNlIGV4Y2VwdGlvbi4iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbiBlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGVycm9yLCBlLk1lc3NhZ2UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUGFyc2VFcnJvcnMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydFBhcnNlRXJyb3IoDQorICAgICAgICAgICAgICAgICIxOjE2OiBFeHBlY3RlZCBcIjpcIi4iLA0KKyAgICAgICAgICAgICAgICAib3B0aW9uYWxfaW50MzIgMTIzIik7DQorICAgICAgICAgICAgQXNzZXJ0UGFyc2VFcnJvcigNCisgICAgICAgICAgICAgICAgIjE6MjM6IEV4cGVjdGVkIGlkZW50aWZpZXIuIiwNCisgICAgICAgICAgICAgICAgIm9wdGlvbmFsX25lc3RlZF9lbnVtOiA/Iik7DQorICAgICAgICAgICAgQXNzZXJ0UGFyc2VFcnJvcigNCisgICAgICAgICAgICAgICAgIjE6MTg6IENvdWxkbid0IHBhcnNlIGludGVnZXI6IE51bWJlciBtdXN0IGJlIHBvc2l0aXZlOiAtMSIsDQorICAgICAgICAgICAgICAgICJvcHRpb25hbF91aW50MzI6IC0xIik7DQorICAgICAgICAgICAgQXNzZXJ0UGFyc2VFcnJvcigNCisgICAgICAgICAgICAgICAgIjE6MTc6IENvdWxkbid0IHBhcnNlIGludGVnZXI6IE51bWJlciBvdXQgb2YgcmFuZ2UgZm9yIDMyLWJpdCBzaWduZWQgIiArDQorICAgICAgICAgICAgICAgICJpbnRlZ2VyOiA4MjMwMTQ4MTI5MDg0OTAxMjM4NTIzMDE1NyIsDQorICAgICAgICAgICAgICAgICJvcHRpb25hbF9pbnQzMjogODIzMDE0ODEyOTA4NDkwMTIzODUyMzAxNTciKTsNCisgICAgICAgICAgICBBc3NlcnRQYXJzZUVycm9yKA0KKyAgICAgICAgICAgICAgICAiMToxNjogRXhwZWN0ZWQgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiLiIsDQorICAgICAgICAgICAgICAgICJvcHRpb25hbF9ib29sOiBtYXliZSIpOw0KKyAgICAgICAgICAgIEFzc2VydFBhcnNlRXJyb3IoDQorICAgICAgICAgICAgICAgICIxOjE4OiBFeHBlY3RlZCBzdHJpbmcuIiwNCisgICAgICAgICAgICAgICAgIm9wdGlvbmFsX3N0cmluZzogMTIzIik7DQorICAgICAgICAgICAgQXNzZXJ0UGFyc2VFcnJvcigNCisgICAgICAgICAgICAgICAgIjE6MTg6IFN0cmluZyBtaXNzaW5nIGVuZGluZyBxdW90ZS4iLA0KKyAgICAgICAgICAgICAgICAib3B0aW9uYWxfc3RyaW5nOiBcInVlb2F1YW9lIik7DQorICAgICAgICAgICAgQXNzZXJ0UGFyc2VFcnJvcigNCisgICAgICAgICAgICAgICAgIjE6MTg6IFN0cmluZyBtaXNzaW5nIGVuZGluZyBxdW90ZS4iLA0KKyAgICAgICAgICAgICAgICAib3B0aW9uYWxfc3RyaW5nOiBcInVlb2F1YW9lXG4iICsNCisgICAgICAgICAgICAgICAgIm9wdGlvbmFsX2ludDMyOiAxMjMiKTsNCisgICAgICAgICAgICBBc3NlcnRQYXJzZUVycm9yKA0KKyAgICAgICAgICAgICAgICAiMToxODogSW52YWxpZCBlc2NhcGUgc2VxdWVuY2U6ICdcXHonIiwNCisgICAgICAgICAgICAgICAgIm9wdGlvbmFsX3N0cmluZzogXCJcXHpcIiIpOw0KKyAgICAgICAgICAgIEFzc2VydFBhcnNlRXJyb3IoDQorICAgICAgICAgICAgICAgICIxOjE4OiBTdHJpbmcgbWlzc2luZyBlbmRpbmcgcXVvdGUuIiwNCisgICAgICAgICAgICAgICAgIm9wdGlvbmFsX3N0cmluZzogXCJ1ZW9hdWFvZVxuIiArDQorICAgICAgICAgICAgICAgICJvcHRpb25hbF9pbnQzMjogMTIzIik7DQorICAgICAgICAgICAgQXNzZXJ0UGFyc2VFcnJvcigNCisgICAgICAgICAgICAgICAgIjE6MjogRXh0ZW5zaW9uIFwibm9zdWNoZXh0XCIgbm90IGZvdW5kIGluIHRoZSBFeHRlbnNpb25SZWdpc3RyeS4iLA0KKyAgICAgICAgICAgICAgICAiW25vc3VjaGV4dF06IDEyMyIpOw0KKyAgICAgICAgICAgIEFzc2VydFBhcnNlRXJyb3IoDQorICAgICAgICAgICAgICAgICIxOjIwOiBFeHRlbnNpb24gXCJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25cIiAiICsNCisgICAgICAgICAgICAgICAgIm5vdCBmb3VuZCBpbiB0aGUgRXh0ZW5zaW9uUmVnaXN0cnkuIiwNCisgICAgICAgICAgICAgICAgIltwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dOiAxMjMiKTsNCisgICAgICAgICAgICBBc3NlcnRQYXJzZUVycm9yKA0KKyAgICAgICAgICAgICAgICAiMToxOiBNZXNzYWdlIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcIiBoYXMgbm8gZmllbGQgIiArDQorICAgICAgICAgICAgICAgICJuYW1lZCBcIm5vc3VjaGZpZWxkXCIuIiwNCisgICAgICAgICAgICAgICAgIm5vc3VjaGZpZWxkOiAxMjMiKTsNCisgICAgICAgICAgICBBc3NlcnRQYXJzZUVycm9yKA0KKyAgICAgICAgICAgICAgICAiMToyMTogRXhwZWN0ZWQgXCI+XCIuIiwNCisgICAgICAgICAgICAgICAgIk9wdGlvbmFsR3JvdXAgPCBhOiAxIik7DQorICAgICAgICAgICAgQXNzZXJ0UGFyc2VFcnJvcigNCisgICAgICAgICAgICAgICAgIjE6MjM6IEVudW0gdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtXCIgaGFzIG5vICIgKw0KKyAgICAgICAgICAgICAgICAidmFsdWUgbmFtZWQgXCJOT19TVUNIX1ZBTFVFXCIuIiwNCisgICAgICAgICAgICAgICAgIm9wdGlvbmFsX25lc3RlZF9lbnVtOiBOT19TVUNIX1ZBTFVFIik7DQorICAgICAgICAgICAgQXNzZXJ0UGFyc2VFcnJvcigNCisgICAgICAgICAgICAgICAgIjE6MjM6IEVudW0gdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtXCIgaGFzIG5vICIgKw0KKyAgICAgICAgICAgICAgICAidmFsdWUgd2l0aCBudW1iZXIgMTIzLiIsDQorICAgICAgICAgICAgICAgICJvcHRpb25hbF9uZXN0ZWRfZW51bTogMTIzIik7DQorDQorICAgICAgICAgICAgLy8gRGVsaW1pdGVycyBtdXN0IG1hdGNoLg0KKyAgICAgICAgICAgIEFzc2VydFBhcnNlRXJyb3IoDQorICAgICAgICAgICAgICAgICIxOjIyOiBFeHBlY3RlZCBpZGVudGlmaWVyLiIsDQorICAgICAgICAgICAgICAgICJPcHRpb25hbEdyb3VwIDwgYTogMSB9Iik7DQorICAgICAgICAgICAgQXNzZXJ0UGFyc2VFcnJvcigNCisgICAgICAgICAgICAgICAgIjE6MjI6IEV4cGVjdGVkIGlkZW50aWZpZXIuIiwNCisgICAgICAgICAgICAgICAgIk9wdGlvbmFsR3JvdXAgeyBhOiAxID4iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIEJ5dGVzKHBhcmFtcyBieXRlW10gYnl0ZXMpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcuQ29weUZyb20oYnl0ZXMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBkZWxlZ2F0ZSB2b2lkIEZvcm1hdHRpbmdBY3Rpb24oKTsNCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXNzZXJ0Rm9ybWF0RXhjZXB0aW9uKEZvcm1hdHRpbmdBY3Rpb24gYWN0aW9uKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYWN0aW9uKCk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5GYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gc3VjY2Vzcw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRXNjYXBlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBFc2NhcGUgc2VxdWVuY2VzLg0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiXFwwMDBcXDAwMVxcYVxcYlxcZlxcblxcclxcdFxcdlxcXFxcXCdcXFwiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC5Fc2NhcGVCeXRlcyhCeXRlcygiXDBcdTAwMDFcdTAwMDdcYlxmXG5cclx0XHZcXFwnXCIiKSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiXFwwMDBcXDAwMVxcYVxcYlxcZlxcblxcclxcdFxcdlxcXFxcXCdcXFwiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC5Fc2NhcGVUZXh0KCJcMFx1MDAwMVx1MDAwN1xiXGZcblxyXHRcdlxcXCdcIiIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQnl0ZXMoIlwwXHUwMDAxXHUwMDA3XGJcZlxuXHJcdFx2XFxcJ1wiIiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRGb3JtYXQuVW5lc2NhcGVCeXRlcygiXFwwMDBcXDAwMVxcYVxcYlxcZlxcblxcclxcdFxcdlxcXFxcXCdcXFwiIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiXDBcdTAwMDFcdTAwMDdcYlxmXG5cclx0XHZcXFwnXCIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0LlVuZXNjYXBlVGV4dCgiXFwwMDBcXDAwMVxcYVxcYlxcZlxcblxcclxcdFxcdlxcXFxcXCdcXFwiIikpOw0KKw0KKyAgICAgICAgICAgIC8vIFVuaWNvZGUgaGFuZGxpbmcuDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJcXDM0MVxcMjEwXFwyNjQiLCBUZXh0Rm9ybWF0LkVzY2FwZVRleHQoIlx1MTIzNCIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlxcMzQxXFwyMTBcXDI2NCIsIFRleHRGb3JtYXQuRXNjYXBlQnl0ZXMoQnl0ZXMoMHhlMSwgMHg4OCwgMHhiNCkpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlx1MTIzNCIsIFRleHRGb3JtYXQuVW5lc2NhcGVUZXh0KCJcXDM0MVxcMjEwXFwyNjQiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEJ5dGVzKDB4ZTEsIDB4ODgsIDB4YjQpLCBUZXh0Rm9ybWF0LlVuZXNjYXBlQnl0ZXMoIlxcMzQxXFwyMTBcXDI2NCIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlx1MTIzNCIsIFRleHRGb3JtYXQuVW5lc2NhcGVUZXh0KCJcXHhlMVxceDg4XFx4YjQiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEJ5dGVzKDB4ZTEsIDB4ODgsIDB4YjQpLCBUZXh0Rm9ybWF0LlVuZXNjYXBlQnl0ZXMoIlxceGUxXFx4ODhcXHhiNCIpKTsNCisNCisgICAgICAgICAgICAvLyBFcnJvcnMuDQorICAgICAgICAgICAgQXNzZXJ0Rm9ybWF0RXhjZXB0aW9uKCgpID0+IFRleHRGb3JtYXQuVW5lc2NhcGVUZXh0KCJcXHgiKSk7DQorICAgICAgICAgICAgQXNzZXJ0Rm9ybWF0RXhjZXB0aW9uKCgpID0+IFRleHRGb3JtYXQuVW5lc2NhcGVUZXh0KCJcXHoiKSk7DQorICAgICAgICAgICAgQXNzZXJ0Rm9ybWF0RXhjZXB0aW9uKCgpID0+IFRleHRGb3JtYXQuVW5lc2NhcGVUZXh0KCJcXCIpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUGFyc2VJbnRlZ2VyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgVGV4dEZvcm1hdC5QYXJzZUludDMyKCIwIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBUZXh0Rm9ybWF0LlBhcnNlSW50MzIoIjEiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0xLCBUZXh0Rm9ybWF0LlBhcnNlSW50MzIoIi0xIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjM0NSwgVGV4dEZvcm1hdC5QYXJzZUludDMyKCIxMjM0NSIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTEyMzQ1LCBUZXh0Rm9ybWF0LlBhcnNlSW50MzIoIi0xMjM0NSIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjE0NzQ4MzY0NywgVGV4dEZvcm1hdC5QYXJzZUludDMyKCIyMTQ3NDgzNjQ3IikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMjE0NzQ4MzY0OCwgVGV4dEZvcm1hdC5QYXJzZUludDMyKCItMjE0NzQ4MzY0OCIpKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHUsIFRleHRGb3JtYXQuUGFyc2VVSW50MzIoIjAiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDF1LCBUZXh0Rm9ybWF0LlBhcnNlVUludDMyKCIxIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjM0NXUsIFRleHRGb3JtYXQuUGFyc2VVSW50MzIoIjEyMzQ1IikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMTQ3NDgzNjQ3dSwgVGV4dEZvcm1hdC5QYXJzZVVJbnQzMigiMjE0NzQ4MzY0NyIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjE0NzQ4MzY0OFUsIFRleHRGb3JtYXQuUGFyc2VVSW50MzIoIjIxNDc0ODM2NDgiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQyOTQ5NjcyOTVVLCBUZXh0Rm9ybWF0LlBhcnNlVUludDMyKCI0Mjk0OTY3Mjk1IikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwTCwgVGV4dEZvcm1hdC5QYXJzZUludDY0KCIwIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxTCwgVGV4dEZvcm1hdC5QYXJzZUludDY0KCIxIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMUwsIFRleHRGb3JtYXQuUGFyc2VJbnQ2NCgiLTEiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMzQ1TCwgVGV4dEZvcm1hdC5QYXJzZUludDY0KCIxMjM0NSIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTEyMzQ1TCwgVGV4dEZvcm1hdC5QYXJzZUludDY0KCItMTIzNDUiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIxNDc0ODM2NDdMLCBUZXh0Rm9ybWF0LlBhcnNlSW50NjQoIjIxNDc0ODM2NDciKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0yMTQ3NDgzNjQ4TCwgVGV4dEZvcm1hdC5QYXJzZUludDY0KCItMjE0NzQ4MzY0OCIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDI5NDk2NzI5NUwsIFRleHRGb3JtYXQuUGFyc2VJbnQ2NCgiNDI5NDk2NzI5NSIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDI5NDk2NzI5NkwsIFRleHRGb3JtYXQuUGFyc2VJbnQ2NCgiNDI5NDk2NzI5NiIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIFRleHRGb3JtYXQuUGFyc2VJbnQ2NCgiOTIyMzM3MjAzNjg1NDc3NTgwNyIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTkyMjMzNzIwMzY4NTQ3NzU4MDhMLCBUZXh0Rm9ybWF0LlBhcnNlSW50NjQoIi05MjIzMzcyMDM2ODU0Nzc1ODA4IikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwdUwsIFRleHRGb3JtYXQuUGFyc2VVSW50NjQoIjAiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDF1TCwgVGV4dEZvcm1hdC5QYXJzZVVJbnQ2NCgiMSIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzNDV1TCwgVGV4dEZvcm1hdC5QYXJzZVVJbnQ2NCgiMTIzNDUiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIxNDc0ODM2NDd1TCwgVGV4dEZvcm1hdC5QYXJzZVVJbnQ2NCgiMjE0NzQ4MzY0NyIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDI5NDk2NzI5NXVMLCBUZXh0Rm9ybWF0LlBhcnNlVUludDY0KCI0Mjk0OTY3Mjk1IikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0Mjk0OTY3Mjk2dUwsIFRleHRGb3JtYXQuUGFyc2VVSW50NjQoIjQyOTQ5NjcyOTYiKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDkyMjMzNzIwMzY4NTQ3NzU4MDdVTCwgVGV4dEZvcm1hdC5QYXJzZVVJbnQ2NCgiOTIyMzM3MjAzNjg1NDc3NTgwNyIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoOTIyMzM3MjAzNjg1NDc3NTgwOFVMLCBUZXh0Rm9ybWF0LlBhcnNlVUludDY0KCI5MjIzMzcyMDM2ODU0Nzc1ODA4IikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxODQ0Njc0NDA3MzcwOTU1MTYxNVVMLCBUZXh0Rm9ybWF0LlBhcnNlVUludDY0KCIxODQ0Njc0NDA3MzcwOTU1MTYxNSIpKTsNCisNCisgICAgICAgICAgICAvLyBIZXgNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHgxMjM0YWJjZCwgVGV4dEZvcm1hdC5QYXJzZUludDMyKCIweDEyMzRhYmNkIikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMHgxMjM0YWJjZCwgVGV4dEZvcm1hdC5QYXJzZUludDMyKCItMHgxMjM0YWJjZCIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHhmZmZmZmZmZmZmZmZmZmZmVUwsIFRleHRGb3JtYXQuUGFyc2VVSW50NjQoIjB4ZmZmZmZmZmZmZmZmZmZmZiIpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHg3ZmZmZmZmZmZmZmZmZmZmTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC5QYXJzZUludDY0KCIweDdmZmZmZmZmZmZmZmZmZmYiKSk7DQorDQorICAgICAgICAgICAgLy8gT2N0YWwNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzQyMzkxLCBUZXh0Rm9ybWF0LlBhcnNlSW50MzIoIjAxMjM0NTY3IikpOw0KKw0KKyAgICAgICAgICAgIC8vIE91dC1vZi1yYW5nZQ0KKyAgICAgICAgICAgIEFzc2VydEZvcm1hdEV4Y2VwdGlvbigoKSA9PiBUZXh0Rm9ybWF0LlBhcnNlSW50MzIoIjIxNDc0ODM2NDgiKSk7DQorICAgICAgICAgICAgQXNzZXJ0Rm9ybWF0RXhjZXB0aW9uKCgpID0+IFRleHRGb3JtYXQuUGFyc2VJbnQzMigiLTIxNDc0ODM2NDkiKSk7DQorICAgICAgICAgICAgQXNzZXJ0Rm9ybWF0RXhjZXB0aW9uKCgpID0+IFRleHRGb3JtYXQuUGFyc2VVSW50MzIoIjQyOTQ5NjcyOTYiKSk7DQorICAgICAgICAgICAgQXNzZXJ0Rm9ybWF0RXhjZXB0aW9uKCgpID0+IFRleHRGb3JtYXQuUGFyc2VVSW50MzIoIi0xIikpOw0KKyAgICAgICAgICAgIEFzc2VydEZvcm1hdEV4Y2VwdGlvbigoKSA9PiBUZXh0Rm9ybWF0LlBhcnNlSW50NjQoIjkyMjMzNzIwMzY4NTQ3NzU4MDgiKSk7DQorICAgICAgICAgICAgQXNzZXJ0Rm9ybWF0RXhjZXB0aW9uKCgpID0+IFRleHRGb3JtYXQuUGFyc2VJbnQ2NCgiLTkyMjMzNzIwMzY4NTQ3NzU4MDkiKSk7DQorICAgICAgICAgICAgQXNzZXJ0Rm9ybWF0RXhjZXB0aW9uKCgpID0+IFRleHRGb3JtYXQuUGFyc2VVSW50NjQoIjE4NDQ2NzQ0MDczNzA5NTUxNjE2IikpOw0KKyAgICAgICAgICAgIEFzc2VydEZvcm1hdEV4Y2VwdGlvbigoKSA9PiBUZXh0Rm9ybWF0LlBhcnNlVUludDY0KCItMSIpKTsNCisgICAgICAgICAgICBBc3NlcnRGb3JtYXRFeGNlcHRpb24oKCkgPT4gVGV4dEZvcm1hdC5QYXJzZUludDMyKCJhYmNkIikpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZUxvbmdTdHJpbmcoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyBsb25nVGV4dCA9DQorICAgICAgICAgICAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsNCisgICAgICAgICAgICAgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIgKw0KKyAgICAgICAgICAgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArDQorICAgICAgICAgICAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsNCisgICAgICAgICAgICAgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIgKw0KKyAgICAgICAgICAgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArDQorICAgICAgICAgICAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsNCisgICAgICAgICAgICAgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIgKw0KKyAgICAgICAgICAgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArDQorICAgICAgICAgICAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsNCisgICAgICAgICAgICAgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIgKw0KKyAgICAgICAgICAgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArDQorICAgICAgICAgICAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsNCisgICAgICAgICAgICAgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIgKw0KKyAgICAgICAgICAgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiArDQorICAgICAgICAgICAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiOw0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIFRleHRGb3JtYXQuTWVyZ2UoIm9wdGlvbmFsX3N0cmluZzogXCIiICsgbG9uZ1RleHQgKyAiXCIiLCBidWlsZGVyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobG9uZ1RleHQsIGJ1aWxkZXIuT3B0aW9uYWxTdHJpbmcpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVW5rbm93bkZpZWxkU2V0VGVzdC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvVW5rbm93bkZpZWxkU2V0VGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWJmZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9Vbmtub3duRmllbGRTZXRUZXN0LmNzCkBAIC0wLDAgKzEsNDMzIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zOw0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgVW5rbm93bkZpZWxkU2V0VGVzdA0KKyAgICB7DQorICAgICAgICBwcml2YXRlIE1lc3NhZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3I7DQorICAgICAgICBwcml2YXRlIFRlc3RBbGxUeXBlcyBhbGxGaWVsZHM7DQorICAgICAgICBwcml2YXRlIEJ5dGVTdHJpbmcgYWxsRmllbGRzRGF0YTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBbiBlbXB0eSBtZXNzYWdlIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZyb20gYWxsRmllbGRzRGF0YS4gIFNvLCBpdCBoYXMNCisgICAgICAgIC8vLyB1bmtub3duIGZpZWxkcyBvZiBldmVyeSB0eXBlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgVGVzdEVtcHR5TWVzc2FnZSBlbXB0eU1lc3NhZ2U7DQorDQorICAgICAgICBwcml2YXRlIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzOw0KKw0KKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQ0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0VXAoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcjsNCisgICAgICAgICAgICBhbGxGaWVsZHMgPSBUZXN0VXRpbC5HZXRBbGxTZXQoKTsNCisgICAgICAgICAgICBhbGxGaWVsZHNEYXRhID0gYWxsRmllbGRzLlRvQnl0ZVN0cmluZygpOw0KKyAgICAgICAgICAgIGVtcHR5TWVzc2FnZSA9IFRlc3RFbXB0eU1lc3NhZ2UuUGFyc2VGcm9tKGFsbEZpZWxkc0RhdGEpOw0KKyAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBlbXB0eU1lc3NhZ2UuVW5rbm93bkZpZWxkczsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgVW5rbm93bkZpZWxkIEdldEZpZWxkKFN0cmluZyBuYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGRlc2NyaXB0b3IuRmluZERlc2NyaXB0b3I8RmllbGREZXNjcmlwdG9yPihuYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKGZpZWxkKTsNCisgICAgICAgICAgICByZXR1cm4gdW5rbm93bkZpZWxkcy5GaWVsZERpY3Rpb25hcnlbZmllbGQuRmllbGROdW1iZXJdOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYSBwcm90b2NvbCBidWZmZXIgd2hpY2ggY29udGFpbnMgZmllbGRzIHdpdGggYWxsIHRoZSBzYW1lDQorICAgICAgICAvLy8gbnVtYmVycyBhcyBhbGxGaWVsZHNEYXRhIGV4Y2VwdCB0aGF0IGVhY2ggZmllbGQgaXMgc29tZSBvdGhlciB3aXJlDQorICAgICAgICAvLy8gdHlwZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIEJ5dGVTdHJpbmcgR2V0Qml6YXJyb0RhdGEoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5CdWlsZGVyIGJpemFycm9GaWVsZHMgPSBVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcigpOw0KKw0KKyAgICAgICAgICAgIFVua25vd25GaWVsZCB2YXJpbnRGaWVsZCA9IFVua25vd25GaWVsZC5DcmVhdGVCdWlsZGVyKCkuQWRkVmFyaW50KDEpLkJ1aWxkKCk7DQorICAgICAgICAgICAgVW5rbm93bkZpZWxkIGZpeGVkMzJGaWVsZCA9IFVua25vd25GaWVsZC5DcmVhdGVCdWlsZGVyKCkuQWRkRml4ZWQzMigxKS5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxpbnQsIFVua25vd25GaWVsZD4gZW50cnkgaW4gdW5rbm93bkZpZWxkcy5GaWVsZERpY3Rpb25hcnkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuVmFsdWUuVmFyaW50TGlzdC5Db3VudCA9PSAwKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAvLyBPcmlnaW5hbCBmaWVsZCBpcyBub3QgYSB2YXJpbnQsIHNvIHVzZSBhIHZhcmludC4NCisgICAgICAgICAgICAgICAgICAgIGJpemFycm9GaWVsZHMuQWRkRmllbGQoZW50cnkuS2V5LCB2YXJpbnRGaWVsZCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAvLyBPcmlnaW5hbCBmaWVsZCAqaXMqIGEgdmFyaW50LCBzbyB1c2Ugc29tZXRoaW5nIGVsc2UuDQorICAgICAgICAgICAgICAgICAgICBiaXphcnJvRmllbGRzLkFkZEZpZWxkKGVudHJ5LktleSwgZml4ZWQzMkZpZWxkKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICByZXR1cm4gYml6YXJyb0ZpZWxkcy5CdWlsZCgpLlRvQnl0ZVN0cmluZygpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVmFyaW50KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBVbmtub3duRmllbGQgZmllbGQgPSBHZXRGaWVsZCgib3B0aW9uYWxfaW50MzIiKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgZmllbGQuVmFyaW50TGlzdC5Db3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGFsbEZpZWxkcy5PcHRpb25hbEludDMyLCAobG9uZykgZmllbGQuVmFyaW50TGlzdFswXSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEZpeGVkMzIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFVua25vd25GaWVsZCBmaWVsZCA9IEdldEZpZWxkKCJvcHRpb25hbF9maXhlZDMyIik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGZpZWxkLkZpeGVkMzJMaXN0LkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWw8bG9uZz4oYWxsRmllbGRzLk9wdGlvbmFsRml4ZWQzMiwgKGludCkgZmllbGQuRml4ZWQzMkxpc3RbMF0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBGaXhlZDY0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBVbmtub3duRmllbGQgZmllbGQgPSBHZXRGaWVsZCgib3B0aW9uYWxfZml4ZWQ2NCIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBmaWVsZC5GaXhlZDY0TGlzdC5Db3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKChsb25nKWFsbEZpZWxkcy5PcHRpb25hbEZpeGVkNjQsIChsb25nKWZpZWxkLkZpeGVkNjRMaXN0WzBdKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgTGVuZ3RoRGVsaW1pdGVkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBVbmtub3duRmllbGQgZmllbGQgPSBHZXRGaWVsZCgib3B0aW9uYWxfYnl0ZXMiKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgZmllbGQuTGVuZ3RoRGVsaW1pdGVkTGlzdC5Db3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGFsbEZpZWxkcy5PcHRpb25hbEJ5dGVzLCBmaWVsZC5MZW5ndGhEZWxpbWl0ZWRMaXN0WzBdKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgR3JvdXAoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBuZXN0ZWRGaWVsZERlc2NyaXB0b3IgPQ0KKyAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5EZXNjcmlwdG9yLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oImEiKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKG5lc3RlZEZpZWxkRGVzY3JpcHRvcik7DQorDQorICAgICAgICAgICAgVW5rbm93bkZpZWxkIGZpZWxkID0gR2V0RmllbGQoIm9wdGlvbmFsZ3JvdXAiKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgZmllbGQuR3JvdXBMaXN0LkNvdW50KTsNCisNCisgICAgICAgICAgICBVbmtub3duRmllbGRTZXQgZ3JvdXAgPSBmaWVsZC5Hcm91cExpc3RbMF07DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGdyb3VwLkZpZWxkRGljdGlvbmFyeS5Db3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShncm91cC5IYXNGaWVsZChuZXN0ZWRGaWVsZERlc2NyaXB0b3IuRmllbGROdW1iZXIpKTsNCisNCisgICAgICAgICAgICBVbmtub3duRmllbGQgbmVzdGVkRmllbGQgPSBncm91cFtuZXN0ZWRGaWVsZERlc2NyaXB0b3IuRmllbGROdW1iZXJdOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBuZXN0ZWRGaWVsZC5WYXJpbnRMaXN0LkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYWxsRmllbGRzLk9wdGlvbmFsR3JvdXAuQSwgKGxvbmcpIG5lc3RlZEZpZWxkLlZhcmludExpc3RbMF0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBTZXJpYWxpemUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgc2VyaWFsaXppbmcgdGhlIFVua25vd25GaWVsZFNldCBwcm9kdWNlcyB0aGUgb3JpZ2luYWwgZGF0YSBhZ2Fpbi4NCisgICAgICAgICAgICBCeXRlU3RyaW5nIGRhdGEgPSBlbXB0eU1lc3NhZ2UuVG9CeXRlU3RyaW5nKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGFsbEZpZWxkc0RhdGEsIGRhdGEpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBDb3B5RnJvbSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlID0NCisgICAgICAgICAgICAgICAgVGVzdEVtcHR5TWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGVtcHR5TWVzc2FnZSkuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZW1wdHlNZXNzYWdlLlRvU3RyaW5nKCksIG1lc3NhZ2UuVG9TdHJpbmcoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEVtcHR5TWVzc2FnZSBzb3VyY2UgPQ0KKyAgICAgICAgICAgICAgICBUZXN0RW1wdHlNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgLlNldFVua25vd25GaWVsZHMoDQorICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkRmllbGQoMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkVmFyaW50KDIpLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRGaWVsZCgzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRWYXJpbnQoNCkuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisgICAgICAgICAgICBUZXN0RW1wdHlNZXNzYWdlIGRlc3RpbmF0aW9uID0NCisgICAgICAgICAgICAgICAgVGVzdEVtcHR5TWVzc2FnZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgIC5TZXRVbmtub3duRmllbGRzKA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZEZpZWxkKDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGQuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZFZhcmludCgxKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkRmllbGQoMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkVmFyaW50KDMpLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgLk1lcmdlRnJvbShzb3VyY2UpDQorICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoDQorICAgICAgICAgICAgICAgICIxOiAxXG4iICsNCisgICAgICAgICAgICAgICAgIjI6IDJcbiIgKw0KKyAgICAgICAgICAgICAgICAiMzogM1xuIiArDQorICAgICAgICAgICAgICAgICIzOiA0XG4iLA0KKyAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5Ub1N0cmluZygpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFVua25vd25GaWVsZFNldCBmaWVsZHMgPQ0KKyAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbSh1bmtub3duRmllbGRzKS5DbGVhcigpLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIGZpZWxkcy5GaWVsZERpY3Rpb25hcnkuQ291bnQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhck1lc3NhZ2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZSA9DQorICAgICAgICAgICAgICAgIFRlc3RFbXB0eU1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShlbXB0eU1lc3NhZ2UpLkNsZWFyKCkuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5TZXJpYWxpemVkU2l6ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlS25vd25BbmRVbmtub3duKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBUZXN0IG1peGluZyBrbm93biBhbmQgdW5rbm93biBmaWVsZHMgd2hlbiBwYXJzaW5nLg0KKw0KKyAgICAgICAgICAgIFVua25vd25GaWVsZFNldCBmaWVsZHMgPQ0KKyAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih1bmtub3duRmllbGRzKQ0KKyAgICAgICAgICAgICAgICAgICAgLkFkZEZpZWxkKDEyMzQ1NiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGQuQ3JlYXRlQnVpbGRlcigpLkFkZFZhcmludCg2NTQzMjEpLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBCeXRlU3RyaW5nIGRhdGEgPSBmaWVsZHMuVG9CeXRlU3RyaW5nKCk7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIGRlc3RpbmF0aW9uID0gVGVzdEFsbFR5cGVzLlBhcnNlRnJvbShkYXRhKTsNCisNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRBbGxGaWVsZHNTZXQoZGVzdGluYXRpb24pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBkZXN0aW5hdGlvbi5Vbmtub3duRmllbGRzLkZpZWxkRGljdGlvbmFyeS5Db3VudCk7DQorDQorICAgICAgICAgICAgVW5rbm93bkZpZWxkIGZpZWxkID0gZGVzdGluYXRpb24uVW5rbm93bkZpZWxkc1sxMjM0NTZdOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBmaWVsZC5WYXJpbnRMaXN0LkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNjU0MzIxLCAobG9uZykgZmllbGQuVmFyaW50TGlzdFswXSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyb25nVHlwZVRyZWF0ZWRBc1Vua25vd24oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIFRlc3QgdGhhdCBmaWVsZHMgb2YgdGhlIHdyb25nIHdpcmUgdHlwZSBhcmUgdHJlYXRlZCBsaWtlIHVua25vd24gZmllbGRzDQorICAgICAgICAgICAgLy8gd2hlbiBwYXJzaW5nLg0KKw0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgYml6YXJyb0RhdGEgPSBHZXRCaXphcnJvRGF0YSgpOw0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBhbGxUeXBlc01lc3NhZ2UgPSBUZXN0QWxsVHlwZXMuUGFyc2VGcm9tKGJpemFycm9EYXRhKTsNCisgICAgICAgICAgICBUZXN0RW1wdHlNZXNzYWdlIGVtcHR5TWVzc2FnZSA9IFRlc3RFbXB0eU1lc3NhZ2UuUGFyc2VGcm9tKGJpemFycm9EYXRhKTsNCisNCisgICAgICAgICAgICAvLyBBbGwgZmllbGRzIHNob3VsZCBoYXZlIGJlZW4gaW50ZXJwcmV0ZWQgYXMgdW5rbm93biwgc28gdGhlIGRlYnVnIHN0cmluZ3MNCisgICAgICAgICAgICAvLyBzaG91bGQgYmUgdGhlIHNhbWUuDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGVtcHR5TWVzc2FnZS5Ub1N0cmluZygpLCBhbGxUeXBlc01lc3NhZ2UuVG9TdHJpbmcoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFVua25vd25FeHRlbnNpb25zKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgZmllbGRzIGFyZSBwcm9wZXJseSBwYXJzZWQgdG8gdGhlIFVua25vd25GaWVsZFNldCBldmVuIHdoZW4NCisgICAgICAgICAgICAvLyB0aGV5IGFyZSBkZWNsYXJlZCBhcyBleHRlbnNpb24gbnVtYmVycy4NCisNCisgICAgICAgICAgICBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgbWVzc2FnZSA9DQorICAgICAgICAgICAgICAgIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucy5QYXJzZUZyb20oYWxsRmllbGRzRGF0YSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHVua25vd25GaWVsZHMuRmllbGREaWN0aW9uYXJ5LkNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlVua25vd25GaWVsZHMuRmllbGREaWN0aW9uYXJ5LkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYWxsRmllbGRzRGF0YSwgbWVzc2FnZS5Ub0J5dGVTdHJpbmcoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyb25nRXh0ZW5zaW9uVHlwZVRyZWF0ZWRBc1Vua25vd24oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIFRlc3QgdGhhdCBmaWVsZHMgb2YgdGhlIHdyb25nIHdpcmUgdHlwZSBhcmUgdHJlYXRlZCBsaWtlIHVua25vd24gZmllbGRzDQorICAgICAgICAgICAgLy8gd2hlbiBwYXJzaW5nIGV4dGVuc2lvbnMuDQorDQorICAgICAgICAgICAgQnl0ZVN0cmluZyBiaXphcnJvRGF0YSA9IEdldEJpemFycm9EYXRhKCk7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMgYWxsRXh0ZW5zaW9uc01lc3NhZ2UgPSBUZXN0QWxsRXh0ZW5zaW9ucy5QYXJzZUZyb20oYml6YXJyb0RhdGEpOw0KKyAgICAgICAgICAgIFRlc3RFbXB0eU1lc3NhZ2UgZW1wdHlNZXNzYWdlID0gVGVzdEVtcHR5TWVzc2FnZS5QYXJzZUZyb20oYml6YXJyb0RhdGEpOw0KKw0KKyAgICAgICAgICAgIC8vIEFsbCBmaWVsZHMgc2hvdWxkIGhhdmUgYmVlbiBpbnRlcnByZXRlZCBhcyB1bmtub3duLCBzbyB0aGUgZGVidWcgc3RyaW5ncw0KKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSB0aGUgc2FtZS4NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZW1wdHlNZXNzYWdlLlRvU3RyaW5nKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbEV4dGVuc2lvbnNNZXNzYWdlLlRvU3RyaW5nKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZVVua25vd25FbnVtVmFsdWUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBzaW5ndWxhckZpZWxkID0NCisgICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IuRmluZERlc2NyaXB0b3I8RmllbGREZXNjcmlwdG9yPigib3B0aW9uYWxfbmVzdGVkX2VudW0iKTsNCisgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IgcmVwZWF0ZWRGaWVsZCA9DQorICAgICAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oInJlcGVhdGVkX25lc3RlZF9lbnVtIik7DQorICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChzaW5ndWxhckZpZWxkKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlcGVhdGVkRmllbGQpOw0KKw0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgZGF0YSA9DQorICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgIC5BZGRGaWVsZChzaW5ndWxhckZpZWxkLkZpZWxkTnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZFZhcmludCgoaW50KSBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5CQVIpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRWYXJpbnQoNSkgLy8gbm90IHZhbGlkDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgLkFkZEZpZWxkKHJlcGVhdGVkRmllbGQuRmllbGROdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkVmFyaW50KChpbnQpIFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZPTykNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZFZhcmludCg0KSAvLyBub3QgdmFsaWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZFZhcmludCgoaW50KSBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5CQVopDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRWYXJpbnQoNikgLy8gbm90IHZhbGlkDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCkNCisgICAgICAgICAgICAgICAgICAgIC5Ub0J5dGVTdHJpbmcoKTsNCisNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLlBhcnNlRnJvbShkYXRhKTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkJBUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuT3B0aW9uYWxOZXN0ZWRFbnVtKTsNCisgICAgICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0RXF1YWwobmV3W10ge1Rlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZPTywgVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uQkFafSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5SZXBlYXRlZE5lc3RlZEVudW1MaXN0KTsNCisgICAgICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0RXF1YWwobmV3W10gezVVTH0sIG1lc3NhZ2UuVW5rbm93bkZpZWxkc1tzaW5ndWxhckZpZWxkLkZpZWxkTnVtYmVyXS5WYXJpbnRMaXN0KTsNCisgICAgICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0RXF1YWwobmV3W10gezRVTCwgNlVMfSwgbWVzc2FnZS5Vbmtub3duRmllbGRzW3JlcGVhdGVkRmllbGQuRmllbGROdW1iZXJdLlZhcmludExpc3QpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPQ0KKyAgICAgICAgICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMuUGFyc2VGcm9tKGRhdGEsIFRlc3RVdGlsLkNyZWF0ZUV4dGVuc2lvblJlZ2lzdHJ5KCkpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uQkFSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uKSk7DQorICAgICAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEVxdWFsKG5ld1tdIHtUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5GT08sIFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkJBWn0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRFcXVhbChuZXdbXSB7NVVMfSwgbWVzc2FnZS5Vbmtub3duRmllbGRzW3Npbmd1bGFyRmllbGQuRmllbGROdW1iZXJdLlZhcmludExpc3QpOw0KKyAgICAgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRFcXVhbChuZXdbXSB7NFVMLCA2VUx9LCBtZXNzYWdlLlVua25vd25GaWVsZHNbcmVwZWF0ZWRGaWVsZC5GaWVsZE51bWJlcl0uVmFyaW50TGlzdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBMYXJnZVZhcmludCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQnl0ZVN0cmluZyBkYXRhID0NCisgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgLkFkZEZpZWxkKDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkVmFyaW50KDB4N0ZGRkZGRkZGRkZGRkZGRkwpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCkNCisgICAgICAgICAgICAgICAgICAgIC5Ub0J5dGVTdHJpbmcoKTsNCisgICAgICAgICAgICBVbmtub3duRmllbGRTZXQgcGFyc2VkID0gVW5rbm93bkZpZWxkU2V0LlBhcnNlRnJvbShkYXRhKTsNCisgICAgICAgICAgICBVbmtub3duRmllbGQgZmllbGQgPSBwYXJzZWRbMV07DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGZpZWxkLlZhcmludExpc3QuQ291bnQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgweDdGRkZGRkZGRkZGRkZGRkZVTCwgZmllbGQuVmFyaW50TGlzdFswXSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEVxdWFsc0FuZEhhc2hDb2RlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBVbmtub3duRmllbGQgZml4ZWQzMkZpZWxkID0gVW5rbm93bkZpZWxkLkNyZWF0ZUJ1aWxkZXIoKS5BZGRGaXhlZDMyKDEpLkJ1aWxkKCk7DQorICAgICAgICAgICAgVW5rbm93bkZpZWxkIGZpeGVkNjRGaWVsZCA9IFVua25vd25GaWVsZC5DcmVhdGVCdWlsZGVyKCkuQWRkRml4ZWQ2NCgxKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIFVua25vd25GaWVsZCB2YXJJbnRGaWVsZCA9IFVua25vd25GaWVsZC5DcmVhdGVCdWlsZGVyKCkuQWRkVmFyaW50KDEpLkJ1aWxkKCk7DQorICAgICAgICAgICAgVW5rbm93bkZpZWxkIGxlbmd0aERlbGltaXRlZEZpZWxkID0NCisgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkLkNyZWF0ZUJ1aWxkZXIoKS5BZGRMZW5ndGhEZWxpbWl0ZWQoQnl0ZVN0cmluZy5FbXB0eSkuQnVpbGQoKTsNCisgICAgICAgICAgICBVbmtub3duRmllbGQgZ3JvdXBGaWVsZCA9IFVua25vd25GaWVsZC5DcmVhdGVCdWlsZGVyKCkuQWRkR3JvdXAodW5rbm93bkZpZWxkcykuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBVbmtub3duRmllbGRTZXQgYSA9IFVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKCkuQWRkRmllbGQoMSwgZml4ZWQzMkZpZWxkKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIFVua25vd25GaWVsZFNldCBiID0gVW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIoKS5BZGRGaWVsZCgxLCBmaXhlZDY0RmllbGQpLkJ1aWxkKCk7DQorICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0IGMgPSBVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcigpLkFkZEZpZWxkKDEsIHZhckludEZpZWxkKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIFVua25vd25GaWVsZFNldCBkID0gVW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIoKS5BZGRGaWVsZCgxLCBsZW5ndGhEZWxpbWl0ZWRGaWVsZCkuQnVpbGQoKTsNCisgICAgICAgICAgICBVbmtub3duRmllbGRTZXQgZSA9IFVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKCkuQWRkRmllbGQoMSwgZ3JvdXBGaWVsZCkuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBDaGVja0VxdWFsc0lzQ29uc2lzdGVudChhKTsNCisgICAgICAgICAgICBDaGVja0VxdWFsc0lzQ29uc2lzdGVudChiKTsNCisgICAgICAgICAgICBDaGVja0VxdWFsc0lzQ29uc2lzdGVudChjKTsNCisgICAgICAgICAgICBDaGVja0VxdWFsc0lzQ29uc2lzdGVudChkKTsNCisgICAgICAgICAgICBDaGVja0VxdWFsc0lzQ29uc2lzdGVudChlKTsNCisNCisgICAgICAgICAgICBDaGVja05vdEVxdWFsKGEsIGIpOw0KKyAgICAgICAgICAgIENoZWNrTm90RXF1YWwoYSwgYyk7DQorICAgICAgICAgICAgQ2hlY2tOb3RFcXVhbChhLCBkKTsNCisgICAgICAgICAgICBDaGVja05vdEVxdWFsKGEsIGUpOw0KKyAgICAgICAgICAgIENoZWNrTm90RXF1YWwoYiwgYyk7DQorICAgICAgICAgICAgQ2hlY2tOb3RFcXVhbChiLCBkKTsNCisgICAgICAgICAgICBDaGVja05vdEVxdWFsKGIsIGUpOw0KKyAgICAgICAgICAgIENoZWNrTm90RXF1YWwoYywgZCk7DQorICAgICAgICAgICAgQ2hlY2tOb3RFcXVhbChjLCBlKTsNCisgICAgICAgICAgICBDaGVja05vdEVxdWFsKGQsIGUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gZmllbGQgc2V0cyBhcmUgbm90IGVxdWFsIGFuZCBoYXZlIGRpZmZlcmVudA0KKyAgICAgICAgLy8vIGhhc2ggY29kZXMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPg0KKyAgICAgICAgLy8vIEl0J3MgdmFsaWQgZm9yIG5vbi1lcXVhbCBvYmplY3RzIHRvIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2RlLCBzbw0KKyAgICAgICAgLy8vIHRoaXMgdGVzdCBpcyBzdHJpY3RlciB0aGFuIGl0IG5lZWRzIHRvIGJlLiBIb3dldmVyLCB0aGlzIHNob3VsZCBoYXBwZW4NCisgICAgICAgIC8vLyByZWxhdGl2ZWx5IHJhcmVseS4NCisgICAgICAgIC8vLyA8L3JlbWFya3M+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InMxIj48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzMiI+PC9wYXJhbT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ2hlY2tOb3RFcXVhbChVbmtub3duRmllbGRTZXQgczEsIFVua25vd25GaWVsZFNldCBzMikNCisgICAgICAgIHsNCisgICAgICAgICAgICBTdHJpbmcgZXF1YWxzRXJyb3IgPSBzdHJpbmcuRm9ybWF0KCJ7MH0gc2hvdWxkIG5vdCBiZSBlcXVhbCB0byB7MX0iLCBzMSwgczIpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHMxLkVxdWFscyhzMiksIGVxdWFsc0Vycm9yKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShzMi5FcXVhbHMoczEpLCBlcXVhbHNFcnJvcik7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoczEuR2V0SGFzaENvZGUoKSA9PSBzMi5HZXRIYXNoQ29kZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoInswfSBzaG91bGQgaGF2ZSBhIGRpZmZlcmVudCBoYXNoIGNvZGUgZnJvbSB7MX0iLCBzMSwgczIpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8qKg0KKyAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGZpZWxkIHNldHMgYXJlIGVxdWFsIGFuZCBoYXZlIGlkZW50aWNhbCBoYXNoIGNvZGVzLg0KKyAgICAgKi8NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoVW5rbm93bkZpZWxkU2V0IHNldCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBPYmplY3Qgc2hvdWxkIGJlIGVxdWFsIHRvIGl0c2VsZi4NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoc2V0LCBzZXQpOw0KKw0KKyAgICAgICAgICAgIC8vIE9iamVjdCBzaG91bGQgYmUgZXF1YWwgdG8gYSBjb3B5IG9mIGl0c2VsZi4NCisgICAgICAgICAgICBVbmtub3duRmllbGRTZXQgY29weSA9IFVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHNldCkuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoc2V0LCBjb3B5KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoY29weSwgc2V0KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoc2V0LkdldEhhc2hDb2RlKCksIGNvcHkuR2V0SGFzaENvZGUoKSk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuVGVzdC9XaXJlRm9ybWF0VGVzdC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvV2lyZUZvcm1hdFRlc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUyYzA3NwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLlRlc3QvV2lyZUZvcm1hdFRlc3QuY3MKQEAgLTAsMCArMSwzMTIgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3M7DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIFtUZXN0Q2xhc3NdDQorICAgIHB1YmxpYyBjbGFzcyBXaXJlRm9ybWF0VGVzdA0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gS2VlcHMgdGhlIGF0dHJpYnV0ZXMgb24gRmllbGRUeXBlIGFuZCB0aGUgc3dpdGNoIHN0YXRlbWVudCBpbiBXaXJlRm9ybWF0IGluIHN5bmMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBGaWVsZFR5cGVUb1dpcmVUeXBlTWFwcGluZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoRmllbGRJbmZvIGZpZWxkIGluIHR5cGVvZihGaWVsZFR5cGUpLkdldEZpZWxkcyhCaW5kaW5nRmxhZ3MuU3RhdGljIHwgQmluZGluZ0ZsYWdzLlB1YmxpYykpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBGaWVsZFR5cGUgZmllbGRUeXBlID0gKEZpZWxkVHlwZSkgZmllbGQuR2V0VmFsdWUobnVsbCk7DQorICAgICAgICAgICAgICAgIEZpZWxkTWFwcGluZ0F0dHJpYnV0ZSBtYXBwaW5nID0NCisgICAgICAgICAgICAgICAgICAgIChGaWVsZE1hcHBpbmdBdHRyaWJ1dGUpIGZpZWxkLkdldEN1c3RvbUF0dHJpYnV0ZXModHlwZW9mKEZpZWxkTWFwcGluZ0F0dHJpYnV0ZSksIGZhbHNlKVswXTsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1hcHBpbmcuV2lyZVR5cGUsIFdpcmVGb3JtYXQuR2V0V2lyZVR5cGUoZmllbGRUeXBlKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBTZXJpYWxpemF0aW9uKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLkdldEFsbFNldCgpOw0KKw0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLlRvQnl0ZVN0cmluZygpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChyYXdCeXRlcy5MZW5ndGgsIG1lc3NhZ2UuU2VyaWFsaXplZFNpemUpOw0KKw0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5QYXJzZUZyb20ocmF3Qnl0ZXMpOw0KKw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFsbEZpZWxkc1NldChtZXNzYWdlMik7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFNlcmlhbGl6YXRpb25QYWNrZWQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuR2V0UGFja2VkU2V0KCk7DQorICAgICAgICAgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UuVG9CeXRlU3RyaW5nKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHJhd0J5dGVzLkxlbmd0aCwgbWVzc2FnZS5TZXJpYWxpemVkU2l6ZSk7DQorICAgICAgICAgICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UyID0gVGVzdFBhY2tlZFR5cGVzLlBhcnNlRnJvbShyYXdCeXRlcyk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0UGFja2VkRmllbGRzU2V0KG1lc3NhZ2UyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgU2VyaWFsaXplRXh0ZW5zaW9ucygpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gVGVzdEFsbFR5cGVzIGFuZCBUZXN0QWxsRXh0ZW5zaW9ucyBzaG91bGQgaGF2ZSBjb21wYXRpYmxlIHdpcmUgZm9ybWF0cywNCisgICAgICAgICAgICAvLyBzbyBpZiB3ZSBzZXJpYWxpemUgYSBUZXN0QWxsRXh0ZW5zaW9ucyB0aGVuIHBhcnNlIGl0IGFzIFRlc3RBbGxUeXBlcw0KKyAgICAgICAgICAgIC8vIGl0IHNob3VsZCB3b3JrLg0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPSBUZXN0VXRpbC5HZXRBbGxFeHRlbnNpb25zU2V0KCk7DQorICAgICAgICAgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UuVG9CeXRlU3RyaW5nKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHJhd0J5dGVzLkxlbmd0aCwgbWVzc2FnZS5TZXJpYWxpemVkU2l6ZSk7DQorDQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UyID0gVGVzdEFsbFR5cGVzLlBhcnNlRnJvbShyYXdCeXRlcyk7DQorDQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgU2VyaWFsaXplUGFja2VkRXh0ZW5zaW9ucygpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gVGVzdFBhY2tlZFR5cGVzIGFuZCBUZXN0UGFja2VkRXh0ZW5zaW9ucyBzaG91bGQgaGF2ZSBjb21wYXRpYmxlIHdpcmUNCisgICAgICAgICAgICAvLyBmb3JtYXRzOyBjaGVjayB0aGF0IHRoZXkgc2VyaWFsaXplIHRvIHRoZSBzYW1lIHN0cmluZy4NCisgICAgICAgICAgICBUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlID0gVGVzdFV0aWwuR2V0UGFja2VkRXh0ZW5zaW9uc1NldCgpOw0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLlRvQnl0ZVN0cmluZygpOw0KKw0KKyAgICAgICAgICAgIFRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlMiA9IFRlc3RVdGlsLkdldFBhY2tlZFNldCgpOw0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMyID0gbWVzc2FnZTIuVG9CeXRlU3RyaW5nKCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHJhd0J5dGVzLCByYXdCeXRlczIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBTZXJpYWxpemVEZWxpbWl0ZWQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuR2V0QWxsU2V0KCkuV3JpdGVEZWxpbWl0ZWRUbyhzdHJlYW0pOw0KKyAgICAgICAgICAgIHN0cmVhbS5Xcml0ZUJ5dGUoMTIpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkdldFBhY2tlZFNldCgpLldyaXRlRGVsaW1pdGVkVG8oc3RyZWFtKTsNCisgICAgICAgICAgICBzdHJlYW0uV3JpdGVCeXRlKDM0KTsNCisNCisgICAgICAgICAgICBzdHJlYW0uUG9zaXRpb24gPSAwOw0KKw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEFsbEZpZWxkc1NldChUZXN0QWxsVHlwZXMuUGFyc2VEZWxpbWl0ZWRGcm9tKHN0cmVhbSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMiwgc3RyZWFtLlJlYWRCeXRlKCkpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydFBhY2tlZEZpZWxkc1NldChUZXN0UGFja2VkVHlwZXMuUGFyc2VEZWxpbWl0ZWRGcm9tKHN0cmVhbSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzNCwgc3RyZWFtLlJlYWRCeXRlKCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMSwgc3RyZWFtLlJlYWRCeXRlKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZUV4dGVuc2lvbnMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIFRlc3RBbGxUeXBlcyBhbmQgVGVzdEFsbEV4dGVuc2lvbnMgc2hvdWxkIGhhdmUgY29tcGF0aWJsZSB3aXJlIGZvcm1hdHMsDQorICAgICAgICAgICAgLy8gc28gaWYgd2Ugc2VyZWFsaXplIGEgVGVzdEFsbFR5cGVzIHRoZW4gcGFyc2UgaXQgYXMgVGVzdEFsbEV4dGVuc2lvbnMNCisgICAgICAgICAgICAvLyBpdCBzaG91bGQgd29yay4NCisNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLkdldEFsbFNldCgpOw0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLlRvQnl0ZVN0cmluZygpOw0KKw0KKyAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgICAgIHJlZ2lzdHJ5ID0gcmVnaXN0cnkuQXNSZWFkT25seSgpOw0KKw0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UyID0gVGVzdEFsbEV4dGVuc2lvbnMuUGFyc2VGcm9tKHJhd0J5dGVzLCByZWdpc3RyeSk7DQorDQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlUGFja2VkRXh0ZW5zaW9ucygpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgcGFja2VkIGV4dGVuc2lvbnMgY2FuIGJlIHByb3Blcmx5IHBhcnNlZC4NCisgICAgICAgICAgICBUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlID0gVGVzdFV0aWwuR2V0UGFja2VkRXh0ZW5zaW9uc1NldCgpOw0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLlRvQnl0ZVN0cmluZygpOw0KKw0KKyAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gVGVzdFV0aWwuQ3JlYXRlRXh0ZW5zaW9uUmVnaXN0cnkoKTsNCisNCisgICAgICAgICAgICBUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlMiA9IFRlc3RQYWNrZWRFeHRlbnNpb25zLlBhcnNlRnJvbShyYXdCeXRlcywgcmVnaXN0cnkpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydFBhY2tlZEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBFeHRlbnNpb25zU2VyaWFsaXplZFNpemUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0VXRpbC5HZXRBbGxTZXQoKS5TZXJpYWxpemVkU2l6ZSwgVGVzdFV0aWwuR2V0QWxsRXh0ZW5zaW9uc1NldCgpLlNlcmlhbGl6ZWRTaXplKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXNzZXJ0RmllbGRzSW5PcmRlcihCeXRlU3RyaW5nIGRhdGEpDQorICAgICAgICB7DQorICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IGRhdGEuQ3JlYXRlQ29kZWRJbnB1dCgpOw0KKyAgICAgICAgICAgIHVpbnQgcHJldmlvdXNUYWcgPSAwOw0KKw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBuYW1lOw0KKyAgICAgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBuYW1lKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodGFnID4gcHJldmlvdXNUYWcpOw0KKyAgICAgICAgICAgICAgICBwcmV2aW91c1RhZyA9IHRhZzsNCisgICAgICAgICAgICAgICAgaW5wdXQuU2tpcEZpZWxkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBJbnRlcmxlYXZlZEZpZWxkc0FuZEV4dGVuc2lvbnMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIFRlc3RzIHRoYXQgZmllbGRzIGFyZSB3cml0dGVuIGluIG9yZGVyIGV2ZW4gd2hlbiBleHRlbnNpb24gcmFuZ2VzDQorICAgICAgICAgICAgLy8gYXJlIGludGVybGVhdmVkIHdpdGggZmllbGQgbnVtYmVycy4NCisgICAgICAgICAgICBCeXRlU3RyaW5nIGRhdGEgPQ0KKyAgICAgICAgICAgICAgICBUZXN0RmllbGRPcmRlcmluZ3MuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAuU2V0TXlJbnQoMSkNCisgICAgICAgICAgICAgICAgICAgIC5TZXRNeVN0cmluZygiZm9vIikNCisgICAgICAgICAgICAgICAgICAgIC5TZXRNeUZsb2F0KDEuMEYpDQorICAgICAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk15RXh0ZW5zaW9uSW50LCAyMykNCisgICAgICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RQcm90b0ZpbGUuTXlFeHRlbnNpb25TdHJpbmcsICJiYXIiKQ0KKyAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCkuVG9CeXRlU3RyaW5nKCk7DQorICAgICAgICAgICAgQXNzZXJ0RmllbGRzSW5PcmRlcihkYXRhKTsNCisNCisgICAgICAgICAgICBNZXNzYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdEZpZWxkT3JkZXJpbmdzLkRlc2NyaXB0b3I7DQorICAgICAgICAgICAgQnl0ZVN0cmluZyBkeW5hbWljX2RhdGEgPQ0KKyAgICAgICAgICAgICAgICBEeW5hbWljTWVzc2FnZS5DcmVhdGVCdWlsZGVyKFRlc3RGaWVsZE9yZGVyaW5ncy5EZXNjcmlwdG9yKQ0KKyAgICAgICAgICAgICAgICAgICAgLlNldEZpZWxkKGRlc2NyaXB0b3IuRmluZERlc2NyaXB0b3I8RmllbGREZXNjcmlwdG9yPigibXlfaW50IiksIDFMKQ0KKyAgICAgICAgICAgICAgICAgICAgLlNldEZpZWxkKGRlc2NyaXB0b3IuRmluZERlc2NyaXB0b3I8RmllbGREZXNjcmlwdG9yPigibXlfc3RyaW5nIiksICJmb28iKQ0KKyAgICAgICAgICAgICAgICAgICAgLlNldEZpZWxkKGRlc2NyaXB0b3IuRmluZERlc2NyaXB0b3I8RmllbGREZXNjcmlwdG9yPigibXlfZmxvYXQiKSwgMS4wRikNCisgICAgICAgICAgICAgICAgICAgIC5TZXRGaWVsZChVbml0VGVzdFByb3RvRmlsZS5NeUV4dGVuc2lvbkludC5EZXNjcmlwdG9yLCAyMykNCisgICAgICAgICAgICAgICAgICAgIC5TZXRGaWVsZChVbml0VGVzdFByb3RvRmlsZS5NeUV4dGVuc2lvblN0cmluZy5EZXNjcmlwdG9yLCAiYmFyIikNCisgICAgICAgICAgICAgICAgICAgIC5XZWFrQnVpbGQoKS5Ub0J5dGVTdHJpbmcoKTsNCisgICAgICAgICAgICBBc3NlcnRGaWVsZHNJbk9yZGVyKGR5bmFtaWNfZGF0YSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBVbmtub3duVHlwZUlkID0gMTU1MDA1NTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGludCBUeXBlSWQxID0gVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1swXS5GaWVsZE51bWJlcjsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGludCBUeXBlSWQyID0gVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1swXS5GaWVsZE51bWJlcjsNCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgU2VyaWFsaXplTWVzc2FnZVNldCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gU2V0IHVwIGEgVGVzdE1lc3NhZ2VTZXQgd2l0aCB0d28ga25vd24gbWVzc2FnZXMgYW5kIGFuIHVua25vd24gb25lLg0KKyAgICAgICAgICAgIFRlc3RNZXNzYWdlU2V0IG1lc3NhZ2VTZXQgPQ0KKyAgICAgICAgICAgICAgICBUZXN0TWVzc2FnZVNldC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oDQorICAgICAgICAgICAgICAgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLk1lc3NhZ2VTZXRFeHRlbnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLkNyZWF0ZUJ1aWxkZXIoKS5TZXRJKDEyMykuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oDQorICAgICAgICAgICAgICAgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLk1lc3NhZ2VTZXRFeHRlbnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLkNyZWF0ZUJ1aWxkZXIoKS5TZXRTdHIoImZvbyIpLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgICAgICAuU2V0VW5rbm93bkZpZWxkcygNCisgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRGaWVsZChVbmtub3duVHlwZUlkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRMZW5ndGhEZWxpbWl0ZWQoQnl0ZVN0cmluZy5Db3B5RnJvbVV0ZjgoImJhciIpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgZGF0YSA9IG1lc3NhZ2VTZXQuVG9CeXRlU3RyaW5nKCk7DQorDQorICAgICAgICAgICAgLy8gUGFyc2UgYmFjayB1c2luZyBSYXdNZXNzYWdlU2V0IGFuZCBjaGVjayB0aGUgY29udGVudHMuDQorICAgICAgICAgICAgUmF3TWVzc2FnZVNldCByYXcgPSBSYXdNZXNzYWdlU2V0LlBhcnNlRnJvbShkYXRhKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgcmF3LlVua25vd25GaWVsZHMuRmllbGREaWN0aW9uYXJ5LkNvdW50KTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgcmF3Lkl0ZW1Db3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFR5cGVJZDEsIHJhdy5JdGVtTGlzdFswXS5UeXBlSWQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUeXBlSWQyLCByYXcuSXRlbUxpc3RbMV0uVHlwZUlkKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVW5rbm93blR5cGVJZCwgcmF3Lkl0ZW1MaXN0WzJdLlR5cGVJZCk7DQorDQorICAgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIG1lc3NhZ2UxID0gVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLlBhcnNlRnJvbShyYXcuR2V0SXRlbSgwKS5NZXNzYWdlLlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIG1lc3NhZ2UxLkkpOw0KKw0KKyAgICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBtZXNzYWdlMiA9IFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5QYXJzZUZyb20ocmF3LkdldEl0ZW0oMSkuTWVzc2FnZS5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImZvbyIsIG1lc3NhZ2UyLlN0cik7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJiYXIiLCByYXcuR2V0SXRlbSgyKS5NZXNzYWdlLlRvU3RyaW5nVXRmOCgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUGFyc2VNZXNzYWdlU2V0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnkuQWRkKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5NZXNzYWdlU2V0RXh0ZW5zaW9uKTsNCisgICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeS5BZGQoVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLk1lc3NhZ2VTZXRFeHRlbnNpb24pOw0KKw0KKyAgICAgICAgICAgIC8vIFNldCB1cCBhIFJhd01lc3NhZ2VTZXQgd2l0aCB0d28ga25vd24gbWVzc2FnZXMgYW5kIGFuIHVua25vd24gb25lLg0KKyAgICAgICAgICAgIFJhd01lc3NhZ2VTZXQgcmF3ID0NCisgICAgICAgICAgICAgICAgUmF3TWVzc2FnZVNldC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgIC5BZGRJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFJhd01lc3NhZ2VTZXQuVHlwZXMuSXRlbS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNldFR5cGVJZChUeXBlSWQxKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2V0TWVzc2FnZSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2V0SSgxMjMpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCkuVG9CeXRlU3RyaW5nKCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgLkFkZEl0ZW0oDQorICAgICAgICAgICAgICAgICAgICAgICAgUmF3TWVzc2FnZVNldC5UeXBlcy5JdGVtLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2V0VHlwZUlkKFR5cGVJZDIpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRNZXNzYWdlKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRTdHIoImZvbyIpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCkuVG9CeXRlU3RyaW5nKCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgLkFkZEl0ZW0oDQorICAgICAgICAgICAgICAgICAgICAgICAgUmF3TWVzc2FnZVNldC5UeXBlcy5JdGVtLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2V0VHlwZUlkKFVua25vd25UeXBlSWQpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRNZXNzYWdlKEJ5dGVTdHJpbmcuQ29weUZyb21VdGY4KCJiYXIiKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBCeXRlU3RyaW5nIGRhdGEgPSByYXcuVG9CeXRlU3RyaW5nKCk7DQorDQorICAgICAgICAgICAgLy8gUGFyc2UgYXMgYSBUZXN0TWVzc2FnZVNldCBhbmQgY2hlY2sgdGhlIGNvbnRlbnRzLg0KKyAgICAgICAgICAgIFRlc3RNZXNzYWdlU2V0IG1lc3NhZ2VTZXQgPQ0KKyAgICAgICAgICAgICAgICBUZXN0TWVzc2FnZVNldC5QYXJzZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIG1lc3NhZ2VTZXQuR2V0RXh0ZW5zaW9uKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5NZXNzYWdlU2V0RXh0ZW5zaW9uKS5JKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImZvbyIsIG1lc3NhZ2VTZXQuR2V0RXh0ZW5zaW9uKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5NZXNzYWdlU2V0RXh0ZW5zaW9uKS5TdHIpOw0KKw0KKyAgICAgICAgICAgIC8vIENoZWNrIGZvciB1bmtub3duIGZpZWxkIHdpdGggdHlwZSBMRU5HVEhfREVMSU1JVEVELA0KKyAgICAgICAgICAgIC8vICAgbnVtYmVyIFVOS05PV05fVFlQRV9JRCwgYW5kIGNvbnRlbnRzICJiYXIiLg0KKyAgICAgICAgICAgIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzID0gbWVzc2FnZVNldC5Vbmtub3duRmllbGRzOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCB1bmtub3duRmllbGRzLkZpZWxkRGljdGlvbmFyeS5Db3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh1bmtub3duRmllbGRzLkhhc0ZpZWxkKFVua25vd25UeXBlSWQpKTsNCisNCisgICAgICAgICAgICBVbmtub3duRmllbGQgZmllbGQgPSB1bmtub3duRmllbGRzW1Vua25vd25UeXBlSWRdOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBmaWVsZC5MZW5ndGhEZWxpbWl0ZWRMaXN0LkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImJhciIsIGZpZWxkLkxlbmd0aERlbGltaXRlZExpc3RbMF0uVG9TdHJpbmdVdGY4KCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLnNsbiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzQxNzc3Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMuc2xuCkBAIC0wLDAgKzEsMjE1IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMA0KKyMgVmlzdWFsIFN0dWRpbyAyMDEyDQorUHJvamVjdCgiezIxNTBFMzMzLThGREMtNDJBMy05NDc0LTFBMzk1NkQ0NkRFOH0iKSA9ICJwcm90byIsICJwcm90byIsICJ7MUY4OTZENUMtNUZDMi00NjcxLTkyMTYtNzgxQ0I4MTg3RUM3fSINCisJUHJvamVjdFNlY3Rpb24oU29sdXRpb25JdGVtcykgPSBwcmVQcm9qZWN0DQorCQkuLlxwcm90b3NcdHV0b3JpYWxcYWRkcmVzc2Jvb2sucHJvdG8gPSAuLlxwcm90b3NcdHV0b3JpYWxcYWRkcmVzc2Jvb2sucHJvdG8NCisJCS4uXHByb3Rvc1xnb29nbGVccHJvdG9idWZcY3NoYXJwX29wdGlvbnMucHJvdG8gPSAuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXGNzaGFycF9vcHRpb25zLnByb3RvDQorCQkuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXGRlc2NyaXB0b3IucHJvdG8gPSAuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXGRlc2NyaXB0b3IucHJvdG8NCisJCS4uXHByb3Rvc1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJccGx1Z2luLnByb3RvID0gLi5ccHJvdG9zXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxwbHVnaW4ucHJvdG8NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezIxNTBFMzMzLThGREMtNDJBMy05NDc0LTFBMzk1NkQ0NkRFOH0iKSA9ICJ1bml0dGVzdCIsICJ1bml0dGVzdCIsICJ7QzhEMzAxNUEtRUEzOS00RjAzLUFFRUMtM0ZGMUYyMDg3QTEyfSINCisJUHJvamVjdFNlY3Rpb24oU29sdXRpb25JdGVtcykgPSBwcmVQcm9qZWN0DQorCQkuLlxwcm90b3NcZ29vZ2xlXHRlc3RcZ29vZ2xlX3NpemUucHJvdG8gPSAuLlxwcm90b3NcZ29vZ2xlXHRlc3RcZ29vZ2xlX3NpemUucHJvdG8NCisJCS4uXHByb3Rvc1xnb29nbGVcdGVzdFxnb29nbGVfc3BlZWQucHJvdG8gPSAuLlxwcm90b3NcZ29vZ2xlXHRlc3RcZ29vZ2xlX3NwZWVkLnByb3RvDQorCQkuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0LnByb3RvID0gLi5ccHJvdG9zXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdC5wcm90bw0KKwkJLi5ccHJvdG9zXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9jc2hhcnBfb3B0aW9ucy5wcm90byA9IC4uXHByb3Rvc1xnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfY3NoYXJwX29wdGlvbnMucHJvdG8NCisJCS4uXHByb3Rvc1xnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8gPSAuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvDQorCQkuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90byA9IC4uXHByb3Rvc1xnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnByb3RvDQorCQkuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2VtcHR5LnByb3RvID0gLi5ccHJvdG9zXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9lbXB0eS5wcm90bw0KKwkJLi5ccHJvdG9zXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnByb3RvID0gLi5ccHJvdG9zXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnByb3RvDQorCQkuLlxwcm90b3NcZXh0ZXN0XHVuaXR0ZXN0X2V4dHJhcy5wcm90byA9IC4uXHByb3Rvc1xleHRlc3RcdW5pdHRlc3RfZXh0cmFzLnByb3RvDQorCQkuLlxwcm90b3NcZXh0ZXN0XHVuaXR0ZXN0X2V4dHJhc19mdWxsLnByb3RvID0gLi5ccHJvdG9zXGV4dGVzdFx1bml0dGVzdF9leHRyYXNfZnVsbC5wcm90bw0KKwkJLi5ccHJvdG9zXGV4dGVzdFx1bml0dGVzdF9leHRyYXNfbGl0ZS5wcm90byA9IC4uXHByb3Rvc1xleHRlc3RcdW5pdHRlc3RfZXh0cmFzX2xpdGUucHJvdG8NCisJCS4uXHByb3Rvc1xleHRlc3RcdW5pdHRlc3RfZXh0cmFzX3htbHRlc3QucHJvdG8gPSAuLlxwcm90b3NcZXh0ZXN0XHVuaXR0ZXN0X2V4dHJhc194bWx0ZXN0LnByb3RvDQorCQkuLlxwcm90b3NcZXh0ZXN0XHVuaXR0ZXN0X2dlbmVyaWNfc2VydmljZXMucHJvdG8gPSAuLlxwcm90b3NcZXh0ZXN0XHVuaXR0ZXN0X2dlbmVyaWNfc2VydmljZXMucHJvdG8NCisJCS4uXHByb3Rvc1xnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfaW1wb3J0LnByb3RvID0gLi5ccHJvdG9zXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9pbXBvcnQucHJvdG8NCisJCS4uXHByb3Rvc1xnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8gPSAuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvDQorCQkuLlxwcm90b3NcZXh0ZXN0XHVuaXR0ZXN0X2lzc3Vlcy5wcm90byA9IC4uXHByb3Rvc1xleHRlc3RcdW5pdHRlc3RfaXNzdWVzLnByb3RvDQorCQkuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2xpdGUucHJvdG8gPSAuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2xpdGUucHJvdG8NCisJCS4uXHByb3Rvc1xnb29nbGVccHJvdG9idWZcdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8gPSAuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnByb3RvDQorCQkuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X21zZXQucHJvdG8gPSAuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X21zZXQucHJvdG8NCisJCS4uXHByb3Rvc1xnb29nbGVccHJvdG9idWZcdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wcm90byA9IC4uXHByb3Rvc1xnb29nbGVccHJvdG9idWZcdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wcm90bw0KKwkJLi5ccHJvdG9zXGdvb2dsZVxwcm90b2J1Zlx1bml0dGVzdF9vcHRpbWl6ZV9mb3IucHJvdG8gPSAuLlxwcm90b3NcZ29vZ2xlXHByb3RvYnVmXHVuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90bw0KKwkJLi5ccHJvdG9zXGV4dGVzdFx1bml0dGVzdF9ycGNfaW50ZXJvcC5wcm90byA9IC4uXHByb3Rvc1xleHRlc3RcdW5pdHRlc3RfcnBjX2ludGVyb3AucHJvdG8NCisJCS4uXHByb3Rvc1xleHRlc3RcdW5pdHRlc3RfcnBjX2ludGVyb3BfbGl0ZS5wcm90byA9IC4uXHByb3Rvc1xleHRlc3RcdW5pdHRlc3RfcnBjX2ludGVyb3BfbGl0ZS5wcm90bw0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVycyIsICJQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzLmNzcHJvaiIsICJ7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnMuVGVzdCIsICJQcm90b2NvbEJ1ZmZlcnMuVGVzdFxQcm90b2NvbEJ1ZmZlcnMuVGVzdC5jc3Byb2oiLCAie0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9HZW4iLCAiUHJvdG9HZW5cUHJvdG9HZW4uY3Nwcm9qIiwgInsyNTBBREUzNC04MkZELTRCQUUtODZENS05ODVGQkU1ODlDNEF9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvR2VuLlRlc3QiLCAiUHJvdG9HZW4uVGVzdFxQcm90b0dlbi5UZXN0LmNzcHJvaiIsICJ7QzI2OERBNEMtNDAwNC00N0RBLUFGMjMtNDRDOTgzMjgxQTY4fSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJBZGRyZXNzQm9vayIsICJBZGRyZXNzQm9va1xBZGRyZXNzQm9vay5jc3Byb2oiLCAie0EzMUY1RkIyLTRGRjMtNDMyQS1CMzVCLTVDRDIwMzYwNjMxMX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9NdW5nZSIsICJQcm90b011bmdlXFByb3RvTXVuZ2UuY3Nwcm9qIiwgIns4RjA5QUY3Mi0zMzI3LTRGQTctQkMwOS0wNzBCODAyMjFBQjl9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvQmVuY2giLCAiUHJvdG9CZW5jaFxQcm90b0JlbmNoLmNzcHJvaiIsICJ7QzdBNEE0MzUtMjgxMy00MUM4LUFBODctQkQ5MTRCQTUyMjNEfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b0R1bXAiLCAiUHJvdG9EdW1wXFByb3RvRHVtcC5jc3Byb2oiLCAie0Q3MjgyRTk5LTJEQzMtNDA1Qi05NDZGLTE3N0RCMkZEMkFFMn0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZSIsICJQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzTGl0ZS5jc3Byb2oiLCAiezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0IiwgIlByb3RvY29sQnVmZmVyc0xpdGUuVGVzdFxQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QuY3Nwcm9qIiwgIntFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0IiwgIlByb3RvY29sQnVmZmVyc0xpdGUuVGVzdFxQcm90b2NvbEJ1ZmZlcnNMaXRlTWl4ZWQuVGVzdC5jc3Byb2oiLCAie0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoInsyMTUwRTMzMy04RkRDLTQyQTMtOTQ3NC0xQTM5NTZENDZERTh9IikgPSAiYnVpbGQiLCAiYnVpbGQiLCAiezY2RUQxOTUwLUFEMjctNDJENy04OEY4LTk0MzU1QUVDODIyNX0iDQorCVByb2plY3RTZWN0aW9uKFNvbHV0aW9uSXRlbXMpID0gcHJlUHJvamVjdA0KKwkJLi5cYnVpbGRcYnVpbGQuYmF0ID0gLi5cYnVpbGRcYnVpbGQuYmF0DQorCQkuLlxidWlsZFxidWlsZC5jc3Byb2ogPSAuLlxidWlsZFxidWlsZC5jc3Byb2oNCisJCS4uXGJ1aWxkXEJ1aWxkQWxsLmJhdCA9IC4uXGJ1aWxkXEJ1aWxkQWxsLmJhdA0KKwkJLi5cYnVpbGRcQ29tbW9uLnRhcmdldHMgPSAuLlxidWlsZFxDb21tb24udGFyZ2V0cw0KKwkJLi5cYnVpbGRcR2VuZXJhdGVQcm9qZWN0cy5iYXQgPSAuLlxidWlsZFxHZW5lcmF0ZVByb2plY3RzLmJhdA0KKwkJLi5cYnVpbGRcR2VuZXJhdGVTb3VyY2UuYmF0ID0gLi5cYnVpbGRcR2VuZXJhdGVTb3VyY2UuYmF0DQorCQkuLlxidWlsZFxHb29nbGUuUHJvdG9jb2xCdWZmZXJzLm51c3BlYyA9IC4uXGJ1aWxkXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMubnVzcGVjDQorCQkuLlxidWlsZFxHb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5udXNwZWMgPSAuLlxidWlsZFxHb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5udXNwZWMNCisJCS4uXGJ1aWxkXHB1Ymxpc2guY3Nwcm9qID0gLi5cYnVpbGRccHVibGlzaC5jc3Byb2oNCisJCS4uXGJ1aWxkXFB1Ymxpc2hUb29sLmJhdCA9IC4uXGJ1aWxkXFB1Ymxpc2hUb29sLmJhdA0KKwkJLi5cYnVpbGRcUnVuQmVuY2htYXJrcy5iYXQgPSAuLlxidWlsZFxSdW5CZW5jaG1hcmtzLmJhdA0KKwkJLi5cYnVpbGRcdGFyZ2V0LmNzcHJvaiA9IC4uXGJ1aWxkXHRhcmdldC5jc3Byb2oNCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbiIsICJQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5jc3Byb2oiLCAiezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uIiwgIlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXFByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5jc3Byb2oiLCAie0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoInsyMTUwRTMzMy04RkRDLTQyQTMtOTQ3NC0xQTM5NTZENDZERTh9IikgPSAiVG9vbHMiLCAiVG9vbHMiLCAiezBEN0NEQThGLTFCQkYtNEUwRi04RDM1LTMxQUVBMjFBOTZFNn0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoInsyMTUwRTMzMy04RkRDLTQyQTMtOTQ3NC0xQTM5NTZENDZERTh9IikgPSAiVGVzdHMiLCAiVGVzdHMiLCAie0M3QjY5Njc0LTdBNTEtNEFDNi04Njc0LTAzMzBCQTc0MkNFNH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoInsyMTUwRTMzMy04RkRDLTQyQTMtOTQ3NC0xQTM5NTZENDZERTh9IikgPSAiU2FtcGxlcyIsICJTYW1wbGVzIiwgIns3NUQ1RDI1QS0wMUE2LTQ1OTQtOTU3Ri01OTkzRkI4M0Y0NTB9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7MjE1MEUzMzMtOEZEQy00MkEzLTk0NzQtMUEzOTU2RDQ2REU4fSIpID0gImJlbmNobWFya3MiLCAiYmVuY2htYXJrcyIsICJ7RkE5RjUyNTAtRkREQy00OEI4LTgzMkUtOTZFMDQ2NEEwMkU2fSINCisJUHJvamVjdFNlY3Rpb24oU29sdXRpb25JdGVtcykgPSBwcmVQcm9qZWN0DQorCQkuLlxwcm90b3NcYmVuY2htYXJrc1xnb29nbGVfc2l6ZS5wcm90byA9IC4uXHByb3Rvc1xiZW5jaG1hcmtzXGdvb2dsZV9zaXplLnByb3RvDQorCQkuLlxwcm90b3NcYmVuY2htYXJrc1xnb29nbGVfc3BlZWQucHJvdG8gPSAuLlxwcm90b3NcYmVuY2htYXJrc1xnb29nbGVfc3BlZWQucHJvdG8NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJwcm90b2MtZ2VuLWNzIiwgIlByb3RvR2VuXHByb3RvYy1nZW4tY3MuY3Nwcm9qIiwgInsyNTBBREUzNC04MkZELTRCQUUtODZENS05ODVGQkU1ODlDNEJ9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gInByb3RvYy1nZW4tY3MuVGVzdCIsICJQcm90b0dlbi5UZXN0XHByb3RvYy1nZW4tY3MuVGVzdC5jc3Byb2oiLCAie0MxMDI0QzlDLTgxNzYtNDhDMy1CNTQ3LUI5RjZERjZCODBBNn0iDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWdfU2lsdmVybGlnaHR8QW55IENQVSA9IERlYnVnX1NpbHZlcmxpZ2h0fEFueSBDUFUNCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVDQorCQlSZWxlYXNlX1NpbHZlcmxpZ2h0fEFueSBDUFUgPSBSZWxlYXNlX1NpbHZlcmxpZ2h0fEFueSBDUFUNCisJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQorCQl7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5EZWJ1Z19TaWx2ZXJsaWdodHxBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXs2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZV9TaWx2ZXJsaWdodHxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnX1NpbHZlcmxpZ2h0fEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlX1NpbHZlcmxpZ2h0fEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezI1MEFERTM0LTgyRkQtNEJBRS04NkQ1LTk4NUZCRTU4OUM0QX0uRGVidWdfU2lsdmVybGlnaHR8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7MjUwQURFMzQtODJGRC00QkFFLTg2RDUtOTg1RkJFNTg5QzRBfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXsyNTBBREUzNC04MkZELTRCQUUtODZENS05ODVGQkU1ODlDNEF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXsyNTBBREUzNC04MkZELTRCQUUtODZENS05ODVGQkU1ODlDNEF9LlJlbGVhc2VfU2lsdmVybGlnaHR8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXsyNTBBREUzNC04MkZELTRCQUUtODZENS05ODVGQkU1ODlDNEF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXsyNTBBREUzNC04MkZELTRCQUUtODZENS05ODVGQkU1ODlDNEF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7QzI2OERBNEMtNDAwNC00N0RBLUFGMjMtNDRDOTgzMjgxQTY4fS5EZWJ1Z19TaWx2ZXJsaWdodHxBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtDMjY4REE0Qy00MDA0LTQ3REEtQUYyMy00NEM5ODMyODFBNjh9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0MyNjhEQTRDLTQwMDQtNDdEQS1BRjIzLTQ0Qzk4MzI4MUE2OH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0MyNjhEQTRDLTQwMDQtNDdEQS1BRjIzLTQ0Qzk4MzI4MUE2OH0uUmVsZWFzZV9TaWx2ZXJsaWdodHxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0MyNjhEQTRDLTQwMDQtNDdEQS1BRjIzLTQ0Qzk4MzI4MUE2OH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0MyNjhEQTRDLTQwMDQtNDdEQS1BRjIzLTQ0Qzk4MzI4MUE2OH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtBMzFGNUZCMi00RkYzLTQzMkEtQjM1Qi01Q0QyMDM2MDYzMTF9LkRlYnVnX1NpbHZlcmxpZ2h0fEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0EzMUY1RkIyLTRGRjMtNDMyQS1CMzVCLTVDRDIwMzYwNjMxMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7QTMxRjVGQjItNEZGMy00MzJBLUIzNUItNUNEMjAzNjA2MzExfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7QTMxRjVGQjItNEZGMy00MzJBLUIzNUItNUNEMjAzNjA2MzExfS5SZWxlYXNlX1NpbHZlcmxpZ2h0fEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7QTMxRjVGQjItNEZGMy00MzJBLUIzNUItNUNEMjAzNjA2MzExfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7QTMxRjVGQjItNEZGMy00MzJBLUIzNUItNUNEMjAzNjA2MzExfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezhGMDlBRjcyLTMzMjctNEZBNy1CQzA5LTA3MEI4MDIyMUFCOX0uRGVidWdfU2lsdmVybGlnaHR8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7OEYwOUFGNzItMzMyNy00RkE3LUJDMDktMDcwQjgwMjIxQUI5fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXs4RjA5QUY3Mi0zMzI3LTRGQTctQkMwOS0wNzBCODAyMjFBQjl9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXs4RjA5QUY3Mi0zMzI3LTRGQTctQkMwOS0wNzBCODAyMjFBQjl9LlJlbGVhc2VfU2lsdmVybGlnaHR8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXs4RjA5QUY3Mi0zMzI3LTRGQTctQkMwOS0wNzBCODAyMjFBQjl9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXs4RjA5QUY3Mi0zMzI3LTRGQTctQkMwOS0wNzBCODAyMjFBQjl9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7QzdBNEE0MzUtMjgxMy00MUM4LUFBODctQkQ5MTRCQTUyMjNEfS5EZWJ1Z19TaWx2ZXJsaWdodHxBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtDN0E0QTQzNS0yODEzLTQxQzgtQUE4Ny1CRDkxNEJBNTIyM0R9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0M3QTRBNDM1LTI4MTMtNDFDOC1BQTg3LUJEOTE0QkE1MjIzRH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0M3QTRBNDM1LTI4MTMtNDFDOC1BQTg3LUJEOTE0QkE1MjIzRH0uUmVsZWFzZV9TaWx2ZXJsaWdodHxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0M3QTRBNDM1LTI4MTMtNDFDOC1BQTg3LUJEOTE0QkE1MjIzRH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0M3QTRBNDM1LTI4MTMtNDFDOC1BQTg3LUJEOTE0QkE1MjIzRH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtENzI4MkU5OS0yREMzLTQwNUItOTQ2Ri0xNzdEQjJGRDJBRTJ9LkRlYnVnX1NpbHZlcmxpZ2h0fEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0Q3MjgyRTk5LTJEQzMtNDA1Qi05NDZGLTE3N0RCMkZEMkFFMn0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RDcyODJFOTktMkRDMy00MDVCLTk0NkYtMTc3REIyRkQyQUUyfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RDcyODJFOTktMkRDMy00MDVCLTk0NkYtMTc3REIyRkQyQUUyfS5SZWxlYXNlX1NpbHZlcmxpZ2h0fEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RDcyODJFOTktMkRDMy00MDVCLTk0NkYtMTc3REIyRkQyQUUyfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RDcyODJFOTktMkRDMy00MDVCLTk0NkYtMTc3REIyRkQyQUUyfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWdfU2lsdmVybGlnaHR8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LlJlbGVhc2VfU2lsdmVybGlnaHR8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z19TaWx2ZXJsaWdodHxBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZV9TaWx2ZXJsaWdodHxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnX1NpbHZlcmxpZ2h0fEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlX1NpbHZlcmxpZ2h0fEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uRGVidWdfU2lsdmVybGlnaHR8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LlJlbGVhc2VfU2lsdmVybGlnaHR8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfS5EZWJ1Z19TaWx2ZXJsaWdodHxBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uUmVsZWFzZV9TaWx2ZXJsaWdodHxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXsyNTBBREUzNC04MkZELTRCQUUtODZENS05ODVGQkU1ODlDNEJ9LkRlYnVnX1NpbHZlcmxpZ2h0fEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezI1MEFERTM0LTgyRkQtNEJBRS04NkQ1LTk4NUZCRTU4OUM0Qn0uRGVidWdfU2lsdmVybGlnaHR8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezI1MEFERTM0LTgyRkQtNEJBRS04NkQ1LTk4NUZCRTU4OUM0Qn0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7MjUwQURFMzQtODJGRC00QkFFLTg2RDUtOTg1RkJFNTg5QzRCfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7MjUwQURFMzQtODJGRC00QkFFLTg2RDUtOTg1RkJFNTg5QzRCfS5SZWxlYXNlX1NpbHZlcmxpZ2h0fEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7MjUwQURFMzQtODJGRC00QkFFLTg2RDUtOTg1RkJFNTg5QzRCfS5SZWxlYXNlX1NpbHZlcmxpZ2h0fEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezI1MEFERTM0LTgyRkQtNEJBRS04NkQ1LTk4NUZCRTU4OUM0Qn0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezI1MEFERTM0LTgyRkQtNEJBRS04NkQ1LTk4NUZCRTU4OUM0Qn0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtDMTAyNEM5Qy04MTc2LTQ4QzMtQjU0Ny1COUY2REY2QjgwQTZ9LkRlYnVnX1NpbHZlcmxpZ2h0fEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0MxMDI0QzlDLTgxNzYtNDhDMy1CNTQ3LUI5RjZERjZCODBBNn0uRGVidWdfU2lsdmVybGlnaHR8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0MxMDI0QzlDLTgxNzYtNDhDMy1CNTQ3LUI5RjZERjZCODBBNn0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7QzEwMjRDOUMtODE3Ni00OEMzLUI1NDctQjlGNkRGNkI4MEE2fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7QzEwMjRDOUMtODE3Ni00OEMzLUI1NDctQjlGNkRGNkI4MEE2fS5SZWxlYXNlX1NpbHZlcmxpZ2h0fEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7QzEwMjRDOUMtODE3Ni00OEMzLUI1NDctQjlGNkRGNkI4MEE2fS5SZWxlYXNlX1NpbHZlcmxpZ2h0fEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0MxMDI0QzlDLTgxNzYtNDhDMy1CNTQ3LUI5RjZERjZCODBBNn0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0MxMDI0QzlDLTgxNzYtNDhDMy1CNTQ3LUI5RjZERjZCODBBNn0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihOZXN0ZWRQcm9qZWN0cykgPSBwcmVTb2x1dGlvbg0KKwkJe0M4RDMwMTVBLUVBMzktNEYwMy1BRUVDLTNGRjFGMjA4N0ExMn0gPSB7MUY4OTZENUMtNUZDMi00NjcxLTkyMTYtNzgxQ0I4MTg3RUM3fQ0KKwkJe0ZBOUY1MjUwLUZEREMtNDhCOC04MzJFLTk2RTA0NjRBMDJFNn0gPSB7MUY4OTZENUMtNUZDMi00NjcxLTkyMTYtNzgxQ0I4MTg3RUM3fQ0KKwkJe0MyNjhEQTRDLTQwMDQtNDdEQS1BRjIzLTQ0Qzk4MzI4MUE2OH0gPSB7QzdCNjk2NzQtN0E1MS00QUM2LTg2NzQtMDMzMEJBNzQyQ0U0fQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0gPSB7QzdCNjk2NzQtN0E1MS00QUM2LTg2NzQtMDMzMEJBNzQyQ0U0fQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0gPSB7QzdCNjk2NzQtN0E1MS00QUM2LTg2NzQtMDMzMEJBNzQyQ0U0fQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0gPSB7QzdCNjk2NzQtN0E1MS00QUM2LTg2NzQtMDMzMEJBNzQyQ0U0fQ0KKwkJe0MxMDI0QzlDLTgxNzYtNDhDMy1CNTQ3LUI5RjZERjZCODBBNn0gPSB7QzdCNjk2NzQtN0E1MS00QUM2LTg2NzQtMDMzMEJBNzQyQ0U0fQ0KKwkJe0EzMUY1RkIyLTRGRjMtNDMyQS1CMzVCLTVDRDIwMzYwNjMxMX0gPSB7NzVENUQyNUEtMDFBNi00NTk0LTk1N0YtNTk5M0ZCODNGNDUwfQ0KKwkJe0M3QTRBNDM1LTI4MTMtNDFDOC1BQTg3LUJEOTE0QkE1MjIzRH0gPSB7MEQ3Q0RBOEYtMUJCRi00RTBGLThEMzUtMzFBRUEyMUE5NkU2fQ0KKwkJe0Q3MjgyRTk5LTJEQzMtNDA1Qi05NDZGLTE3N0RCMkZEMkFFMn0gPSB7MEQ3Q0RBOEYtMUJCRi00RTBGLThEMzUtMzFBRUEyMUE5NkU2fQ0KKwkJezhGMDlBRjcyLTMzMjctNEZBNy1CQzA5LTA3MEI4MDIyMUFCOX0gPSB7MEQ3Q0RBOEYtMUJCRi00RTBGLThEMzUtMzFBRUEyMUE5NkU2fQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQWJzdHJhY3RCdWlsZGVyLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQWJzdHJhY3RCdWlsZGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YTQxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9BYnN0cmFjdEJ1aWxkZXIuY3MKQEAgLTAsMCArMSwyNjYgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBub24tZ2VuZXJpYyBJTWVzc2FnZSBpbnRlcmZhY2UgYXMgZmFyIGFzIHBvc3NpYmxlLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyBBYnN0cmFjdEJ1aWxkZXI8VE1lc3NhZ2UsIFRCdWlsZGVyPiA6IEFic3RyYWN0QnVpbGRlckxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJ1aWxkZXI8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVE1lc3NhZ2UgOiBBYnN0cmFjdE1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVEJ1aWxkZXIgOiBBYnN0cmFjdEJ1aWxkZXI8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICB7DQorICAgICAgICAjcmVnaW9uIFVuaW1wbGVtZW50ZWQgbWVtYmVycyBvZiBJQnVpbGRlcg0KKw0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFVua25vd25GaWVsZFNldCBVbmtub3duRmllbGRzIHsgZ2V0OyBzZXQ7IH0NCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBJRGljdGlvbmFyeTxGaWVsZERlc2NyaXB0b3IsIG9iamVjdD4gQWxsRmllbGRzIHsgZ2V0OyB9DQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IHRoaXNbRmllbGREZXNjcmlwdG9yIGZpZWxkXSB7IGdldDsgc2V0OyB9DQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgTWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgeyBnZXQ7IH0NCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgR2V0UmVwZWF0ZWRGaWVsZENvdW50KEZpZWxkRGVzY3JpcHRvciBmaWVsZCk7DQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IHRoaXNbRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXhdIHsgZ2V0OyBzZXQ7IH0NCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIEhhc0ZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCk7DQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSUJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvckZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCk7DQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVEJ1aWxkZXIgQ2xlYXJGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpOw0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRCdWlsZGVyIEFkZFJlcGVhdGVkRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkLCBvYmplY3QgdmFsdWUpOw0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgcHVibGljIFRCdWlsZGVyIFNldFVua25vd25GaWVsZHMoVW5rbm93bkZpZWxkU2V0IGZpZWxkcykNCisgICAgICAgIHsNCisgICAgICAgICAgICBVbmtub3duRmllbGRzID0gZmllbGRzOw0KKyAgICAgICAgICAgIHJldHVybiBUaGlzQnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUQnVpbGRlciBDbGVhcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoRmllbGREZXNjcmlwdG9yIGZpZWxkIGluIEFsbEZpZWxkcy5LZXlzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ2xlYXJGaWVsZChmaWVsZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBUaGlzQnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzZWFsZWQgVEJ1aWxkZXIgTWVyZ2VGcm9tKElNZXNzYWdlTGl0ZSBvdGhlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgaXMgSU1lc3NhZ2UpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChJTWVzc2FnZSkgb3RoZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIk1lcmdlRnJvbShNZXNzYWdlKSBjYW4gb25seSBtZXJnZSBtZXNzYWdlcyBvZiB0aGUgc2FtZSB0eXBlLiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE1lcmdlIHRoZSBzcGVjaWZpZWQgb3RoZXIgbWVzc2FnZSBpbnRvIHRoZSBtZXNzYWdlIGJlaW5nDQorICAgICAgICAvLy8gYnVpbHQuIE1lcmdpbmcgb2NjdXJzIGFzIGZvbGxvd3MuIEZvciBlYWNoIGZpZWxkOg0KKyAgICAgICAgLy8vIEZvciBzaW5ndWxhciBwcmltaXRpdmUgZmllbGRzLCBpZiB0aGUgZmllbGQgaXMgc2V0IGluIDxwYXJhbXJlZiBuYW1lPSJvdGhlciIvPiwNCisgICAgICAgIC8vLyB0aGVuIDxwYXJhbXJlZiBuYW1lPSJvdGhlciIvPidzIHZhbHVlIG92ZXJ3cml0ZXMgdGhlIHZhbHVlIGluIHRoaXMgbWVzc2FnZS4NCisgICAgICAgIC8vLyBGb3Igc2luZ3VsYXIgbWVzc2FnZSBmaWVsZHMsIGlmIHRoZSBmaWVsZCBpcyBzZXQgaW4gPHBhcmFtcmVmIG5hbWU9Im90aGVyIi8+LA0KKyAgICAgICAgLy8vIGl0IGlzIG1lcmdlZCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIHN1Yi1tZXNzYWdlIG9mIHRoaXMgbWVzc2FnZSB1c2luZyB0aGUgc2FtZQ0KKyAgICAgICAgLy8vIG1lcmdpbmcgcnVsZXMuDQorICAgICAgICAvLy8gRm9yIHJlcGVhdGVkIGZpZWxkcywgdGhlIGVsZW1lbnRzIGluIDxwYXJhbXJlZiBuYW1lPSJvdGhlciIvPiBhcmUgY29uY2F0ZW5hdGVkDQorICAgICAgICAvLy8gd2l0aCB0aGUgZWxlbWVudHMgaW4gdGhpcyBtZXNzYWdlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3RoZXIiPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRCdWlsZGVyIE1lcmdlRnJvbShUTWVzc2FnZSBvdGhlcik7DQorDQorICAgICAgICBwdWJsaWMgdmlydHVhbCBUQnVpbGRlciBNZXJnZUZyb20oSU1lc3NhZ2Ugb3RoZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKG90aGVyLkRlc2NyaXB0b3JGb3JUeXBlICE9IERlc2NyaXB0b3JGb3JUeXBlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJNZXJnZUZyb20oSU1lc3NhZ2UpIGNhbiBvbmx5IG1lcmdlIG1lc3NhZ2VzIG9mIHRoZSBzYW1lIHR5cGUuIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vIE5vdGU6ICBXZSBkb24ndCBhdHRlbXB0IHRvIHZlcmlmeSB0aGF0IG90aGVyJ3MgZmllbGRzIGhhdmUgdmFsaWQNCisgICAgICAgICAgICAvLyAgIHR5cGVzLiAgRG9pbmcgc28gd291bGQgYmUgYSBsb3NpbmcgYmF0dGxlLiAgV2UnZCBoYXZlIHRvIHZlcmlmeQ0KKyAgICAgICAgICAgIC8vICAgYWxsIHN1Yi1tZXNzYWdlcyBhcyB3ZWxsLCBhbmQgd2UnZCBoYXZlIHRvIG1ha2UgY29waWVzIG9mIGFsbCBvZg0KKyAgICAgICAgICAgIC8vICAgdGhlbSB0byBpbnN1cmUgdGhhdCB0aGV5IGRvbid0IGNoYW5nZSBhZnRlciB2ZXJpZmljYXRpb24gKHNpbmNlDQorICAgICAgICAgICAgLy8gICB0aGUgTWVzc2FnZSBpbnRlcmZhY2UgaXRzZWxmIGNhbm5vdCBlbmZvcmNlIGltbXV0YWJpbGl0eSBvZg0KKyAgICAgICAgICAgIC8vICAgaW1wbGVtZW50YXRpb25zKS4NCisgICAgICAgICAgICAvLyBUT0RPKGpvbnNrZWV0KTogIFByb3ZpZGUgYSBmdW5jdGlvbiBzb21ld2hlcmUgY2FsbGVkIE1ha2VEZWVwQ29weSgpDQorICAgICAgICAgICAgLy8gICB3aGljaCBhbGxvd3MgcGVvcGxlIHRvIG1ha2Ugc2VjdXJlIGRlZXAgY29waWVzIG9mIG1lc3NhZ2VzLg0KKyAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxGaWVsZERlc2NyaXB0b3IsIG9iamVjdD4gZW50cnkgaW4gb3RoZXIuQWxsRmllbGRzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZW50cnkuS2V5Ow0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gQ29uY2F0ZW5hdGUgcmVwZWF0ZWQgZmllbGRzDQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgZWxlbWVudCBpbiAoSUVudW1lcmFibGUpIGVudHJ5LlZhbHVlKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZFJlcGVhdGVkRmllbGQoZmllbGQsIGVsZW1lbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkLk1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5NZXNzYWdlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAvLyBNZXJnZSBzaW5ndWxhciBtZXNzYWdlcw0KKyAgICAgICAgICAgICAgICAgICAgSU1lc3NhZ2VMaXRlIGV4aXN0aW5nVmFsdWUgPSAoSU1lc3NhZ2VMaXRlKSB0aGlzW2ZpZWxkXTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1ZhbHVlID09IGV4aXN0aW5nVmFsdWUuV2Vha0RlZmF1bHRJbnN0YW5jZUZvclR5cGUpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tmaWVsZF0gPSBlbnRyeS5WYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGV4aXN0aW5nVmFsdWUuV2Vha0NyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldlYWtNZXJnZUZyb20oZXhpc3RpbmdWYWx1ZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLldlYWtNZXJnZUZyb20oKElNZXNzYWdlTGl0ZSkgZW50cnkuVmFsdWUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XZWFrQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIC8vIE92ZXJ3cml0ZSBzaW1wbGUgdmFsdWVzDQorICAgICAgICAgICAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGVudHJ5LlZhbHVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vRml4IGZvciB1bmtub3duIGZpZWxkcyBub3QgbWVyZ2luZywgc2VlIGphdmEncyBBYnN0cmFjdE1lc3NhZ2UuQnVpbGRlcjxUPiBsaW5lIDIzNg0KKyAgICAgICAgICAgIE1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisNCisgICAgICAgICAgICByZXR1cm4gVGhpc0J1aWxkZXI7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVEJ1aWxkZXIgTWVyZ2VGcm9tKElDb2RlZElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIoVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0aGlzKTsNCisgICAgICAgICAgICBVbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgIHJldHVybiBUaGlzQnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFRCdWlsZGVyIE1lcmdlVW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcykNCisgICAgICAgIHsNCisgICAgICAgICAgICBVbmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIoVW5rbm93bkZpZWxkcykNCisgICAgICAgICAgICAgICAgLk1lcmdlRnJvbSh1bmtub3duRmllbGRzKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisgICAgICAgICAgICByZXR1cm4gVGhpc0J1aWxkZXI7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdmlydHVhbCBJQnVpbGRlciBTZXRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aGlzW2ZpZWxkXSA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiBUaGlzQnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElCdWlsZGVyIFNldFJlcGVhdGVkRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXgsIG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aGlzW2ZpZWxkLCBpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gVGhpc0J1aWxkZXI7DQorICAgICAgICB9DQorDQorICAgICAgICAjcmVnaW9uIEV4cGxpY2l0IEltcGxlbWVudGF0aW9ucw0KKw0KKyAgICAgICAgSU1lc3NhZ2UgSUJ1aWxkZXIuV2Vha0J1aWxkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQnVpbGQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIElCdWlsZGVyIElCdWlsZGVyLldlYWtBZGRSZXBlYXRlZEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgb2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBBZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBJQnVpbGRlciBJQnVpbGRlci5XZWFrQ2xlYXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBDbGVhcigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgSUJ1aWxkZXIgSUJ1aWxkZXIuV2Vha01lcmdlRnJvbShJTWVzc2FnZSBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20obWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBJQnVpbGRlciBJQnVpbGRlci5XZWFrTWVyZ2VGcm9tKElDb2RlZElucHV0U3RyZWFtIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgSUJ1aWxkZXIgSUJ1aWxkZXIuV2Vha01lcmdlRnJvbShJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcmVnaXN0cnkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgSUJ1aWxkZXIgSUJ1aWxkZXIuV2Vha01lcmdlRnJvbShCeXRlU3RyaW5nIGRhdGEpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShkYXRhKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIElCdWlsZGVyIElCdWlsZGVyLldlYWtNZXJnZUZyb20oQnl0ZVN0cmluZyBkYXRhLCBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGRhdGEsIHJlZ2lzdHJ5KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIElNZXNzYWdlIElCdWlsZGVyLldlYWtCdWlsZFBhcnRpYWwoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBCdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIElCdWlsZGVyIElCdWlsZGVyLldlYWtDbG9uZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENsb25lKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBJTWVzc2FnZSBJQnVpbGRlci5XZWFrRGVmYXVsdEluc3RhbmNlRm9yVHlwZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBJQnVpbGRlciBJQnVpbGRlci5XZWFrQ2xlYXJGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENsZWFyRmllbGQoZmllbGQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnZlcnRzIHRoaXMgYnVpbGRlciB0byBhIHN0cmluZyB1c2luZyA8c2VlIGNyZWY9IlRleHRGb3JtYXQiIC8+Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz4NCisgICAgICAgIC8vLyBUaGlzIG1ldGhvZCBpcyBub3Qgc2VhbGVkIChpbiB0aGUgd2F5IHRoYXQgaXQgaXMgaW4gPHNlZSBjcmVmPSJBYnN0cmFjdE1lc3NhZ2V7VE1lc3NhZ2UsIFRCdWlsZGVyfSIgLz4NCisgICAgICAgIC8vLyBhcyBpdCB3YXMgYWRkZWQgYWZ0ZXIgZWFybGllciByZWxlYXNlczsgc29tZSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IGFscmVhZHkgYmUgb3ZlcnJpZGluZyB0aGUNCisgICAgICAgIC8vLyBtZXRob2QuDQorICAgICAgICAvLy8gPC9yZW1hcmtzPg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIFRleHRGb3JtYXQuUHJpbnRUb1N0cmluZyh0aGlzKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9BYnN0cmFjdEJ1aWxkZXJMaXRlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQWJzdHJhY3RCdWlsZGVyTGl0ZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2ZlZGVhCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQWJzdHJhY3RCdWlsZGVyTGl0ZS5jcwpAQCAtMCwwICsxLDI2NCBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uSU87DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBub24tZ2VuZXJpYyBJTWVzc2FnZSBpbnRlcmZhY2UgYXMgZmFyIGFzIHBvc3NpYmxlLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyBBYnN0cmFjdEJ1aWxkZXJMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gOiBJQnVpbGRlckxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVE1lc3NhZ2UgOiBBYnN0cmFjdE1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgIHdoZXJlIFRCdWlsZGVyIDogQWJzdHJhY3RCdWlsZGVyTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgIHsNCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUQnVpbGRlciBUaGlzQnVpbGRlciB7IGdldDsgfQ0KKw0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2wgSXNJbml0aWFsaXplZCB7IGdldDsgfQ0KKw0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRCdWlsZGVyIENsZWFyKCk7DQorDQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVEJ1aWxkZXIgQ2xvbmUoKTsNCisNCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUTWVzc2FnZSBCdWlsZCgpOw0KKw0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRNZXNzYWdlIEJ1aWxkUGFydGlhbCgpOw0KKw0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRCdWlsZGVyIE1lcmdlRnJvbShJTWVzc2FnZUxpdGUgb3RoZXIpOw0KKw0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRCdWlsZGVyIE1lcmdlRnJvbShJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKw0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgeyBnZXQ7IH0NCisNCisgICAgICAgICNyZWdpb24gSUJ1aWxkZXJMaXRlPFRNZXNzYWdlLFRCdWlsZGVyPiBNZW1iZXJzDQorDQorICAgICAgICBwdWJsaWMgdmlydHVhbCBUQnVpbGRlciBNZXJnZUZyb20oSUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgVEJ1aWxkZXIgTWVyZ2VEZWxpbWl0ZWRGcm9tKFN0cmVhbSBpbnB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBUQnVpbGRlciBNZXJnZURlbGltaXRlZEZyb20oU3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpIENvZGVkSW5wdXRTdHJlYW0uUmVhZFJhd1ZhcmludDMyKGlucHV0KTsNCisgICAgICAgICAgICBTdHJlYW0gbGltaXRlZFN0cmVhbSA9IG5ldyBMaW1pdGVkSW5wdXRTdHJlYW0oaW5wdXQsIHNpemUpOw0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20obGltaXRlZFN0cmVhbSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIFRCdWlsZGVyIE1lcmdlRnJvbShCeXRlU3RyaW5nIGRhdGEpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShkYXRhLCBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBUQnVpbGRlciBNZXJnZUZyb20oQnl0ZVN0cmluZyBkYXRhLCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gZGF0YS5DcmVhdGVDb2RlZElucHV0KCk7DQorICAgICAgICAgICAgTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgaW5wdXQuQ2hlY2tMYXN0VGFnV2FzKDApOw0KKyAgICAgICAgICAgIHJldHVybiBUaGlzQnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBUQnVpbGRlciBNZXJnZUZyb20oYnl0ZVtdIGRhdGEpDQorICAgICAgICB7DQorICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoZGF0YSk7DQorICAgICAgICAgICAgTWVyZ2VGcm9tKGlucHV0KTsNCisgICAgICAgICAgICBpbnB1dC5DaGVja0xhc3RUYWdXYXMoMCk7DQorICAgICAgICAgICAgcmV0dXJuIFRoaXNCdWlsZGVyOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIFRCdWlsZGVyIE1lcmdlRnJvbShieXRlW10gZGF0YSwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoZGF0YSk7DQorICAgICAgICAgICAgTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgaW5wdXQuQ2hlY2tMYXN0VGFnV2FzKDApOw0KKyAgICAgICAgICAgIHJldHVybiBUaGlzQnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBUQnVpbGRlciBNZXJnZUZyb20oU3RyZWFtIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRJbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoaW5wdXQpOw0KKyAgICAgICAgICAgIE1lcmdlRnJvbShjb2RlZElucHV0KTsNCisgICAgICAgICAgICBjb2RlZElucHV0LkNoZWNrTGFzdFRhZ1dhcygwKTsNCisgICAgICAgICAgICByZXR1cm4gVGhpc0J1aWxkZXI7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgVEJ1aWxkZXIgTWVyZ2VGcm9tKFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZElucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShpbnB1dCk7DQorICAgICAgICAgICAgTWVyZ2VGcm9tKGNvZGVkSW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICBjb2RlZElucHV0LkNoZWNrTGFzdFRhZ1dhcygwKTsNCisgICAgICAgICAgICByZXR1cm4gVGhpc0J1aWxkZXI7DQorICAgICAgICB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAjcmVnaW9uIEV4cGxpY2l0IGRlZmluaXRpb25zDQorDQorICAgICAgICBJQnVpbGRlckxpdGUgSUJ1aWxkZXJMaXRlLldlYWtDbGVhcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENsZWFyKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBJQnVpbGRlckxpdGUgSUJ1aWxkZXJMaXRlLldlYWtNZXJnZUZyb20oSU1lc3NhZ2VMaXRlIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShtZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIElCdWlsZGVyTGl0ZSBJQnVpbGRlckxpdGUuV2Vha01lcmdlRnJvbShCeXRlU3RyaW5nIGRhdGEpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShkYXRhKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIElCdWlsZGVyTGl0ZSBJQnVpbGRlckxpdGUuV2Vha01lcmdlRnJvbShCeXRlU3RyaW5nIGRhdGEsIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oZGF0YSwgcmVnaXN0cnkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgSUJ1aWxkZXJMaXRlIElCdWlsZGVyTGl0ZS5XZWFrTWVyZ2VGcm9tKElDb2RlZElucHV0U3RyZWFtIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgSUJ1aWxkZXJMaXRlIElCdWlsZGVyTGl0ZS5XZWFrTWVyZ2VGcm9tKElDb2RlZElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCByZWdpc3RyeSk7DQorICAgICAgICB9DQorDQorICAgICAgICBJTWVzc2FnZUxpdGUgSUJ1aWxkZXJMaXRlLldlYWtCdWlsZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEJ1aWxkKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBJTWVzc2FnZUxpdGUgSUJ1aWxkZXJMaXRlLldlYWtCdWlsZFBhcnRpYWwoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBCdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIElCdWlsZGVyTGl0ZSBJQnVpbGRlckxpdGUuV2Vha0Nsb25lKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ2xvbmUoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIElNZXNzYWdlTGl0ZSBJQnVpbGRlckxpdGUuV2Vha0RlZmF1bHRJbnN0YW5jZUZvclR5cGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlRm9yVHlwZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgI3JlZ2lvbiBMaW1pdGVkSW5wdXRTdHJlYW0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTdHJlYW0gaW1wbGVtZW50YXRpb24gd2hpY2ggcHJveGllcyBhbm90aGVyIHN0cmVhbSwgb25seSBhbGxvd2luZyBhIGNlcnRhaW4gYW1vdW50DQorICAgICAgICAvLy8gb2YgZGF0YSB0byBiZSByZWFkLiBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHVzZWQgdG8gcmVhZCBkZWxpbWl0ZWQgc3RyZWFtcywgc28gaXQNCisgICAgICAgIC8vLyBkb2Vzbid0IGF0dGVtcHQgdG8gaW1wbGVtZW50IGV2ZXJ5dGhpbmcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBMaW1pdGVkSW5wdXRTdHJlYW0gOiBTdHJlYW0NCisgICAgICAgIHsNCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFN0cmVhbSBwcm94aWVkOw0KKyAgICAgICAgICAgIHByaXZhdGUgaW50IGJ5dGVzTGVmdDsNCisNCisgICAgICAgICAgICBpbnRlcm5hbCBMaW1pdGVkSW5wdXRTdHJlYW0oU3RyZWFtIHByb3hpZWQsIGludCBzaXplKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhpcy5wcm94aWVkID0gcHJveGllZDsNCisgICAgICAgICAgICAgICAgYnl0ZXNMZWZ0ID0gc2l6ZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuUmVhZA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRydWU7IH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuU2Vlaw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhbldyaXRlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgTGVuZ3RoDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZXQgeyB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7IH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUG9zaXRpb24NCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGdldCB7IHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsgfQ0KKyAgICAgICAgICAgICAgICBzZXQgeyB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7IH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChieXRlc0xlZnQgPiAwKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gcHJveGllZC5SZWFkKGJ1ZmZlciwgb2Zmc2V0LCBNYXRoLk1pbihieXRlc0xlZnQsIGNvdW50KSk7DQorICAgICAgICAgICAgICAgICAgICBieXRlc0xlZnQgLT0gYnl0ZXNSZWFkOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVzUmVhZDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgU2Vlayhsb25nIG9mZnNldCwgU2Vla09yaWdpbiBvcmlnaW4pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNldExlbmd0aChsb25nIHZhbHVlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Fic3RyYWN0TWVzc2FnZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Fic3RyYWN0TWVzc2FnZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmM4Yzc4Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQWJzdHJhY3RNZXNzYWdlLmNzCkBAIC0wLDAgKzEsMjkxIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBub24tZ2VuZXJpYyBJTWVzc2FnZSBpbnRlcmZhY2UgYXMgZmFyIGFzIHBvc3NpYmxlLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyBBYnN0cmFjdE1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPiA6IEFic3RyYWN0TWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVE1lc3NhZ2UgOiBBYnN0cmFjdE1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVEJ1aWxkZXIgOiBBYnN0cmFjdEJ1aWxkZXI8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIHNlcmlhbGl6ZWQgc2l6ZSBpZiBpdCdzIGFscmVhZHkgYmVlbiBjb21wdXRlZCwgb3IgbnVsbA0KKyAgICAgICAgLy8vIGlmIHdlIGhhdmVuJ3QgY29tcHV0ZWQgaXQgeWV0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgaW50PyBtZW1vaXplZFNpemUgPSBudWxsOw0KKw0KKyAgICAgICAgI3JlZ2lvbiBVbmltcGxlbWVudGVkIG1lbWJlcnMgb2YgSU1lc3NhZ2UNCisNCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7IGdldDsgfQ0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IElEaWN0aW9uYXJ5PEZpZWxkRGVzY3JpcHRvciwgb2JqZWN0PiBBbGxGaWVsZHMgeyBnZXQ7IH0NCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIEhhc0ZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCk7DQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IHRoaXNbRmllbGREZXNjcmlwdG9yIGZpZWxkXSB7IGdldDsgfQ0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBHZXRSZXBlYXRlZEZpZWxkQ291bnQoRmllbGREZXNjcmlwdG9yIGZpZWxkKTsNCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBvYmplY3QgdGhpc1tGaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBpbmRleF0geyBnZXQ7IH0NCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBVbmtub3duRmllbGRTZXQgVW5rbm93bkZpZWxkcyB7IGdldDsgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZmYgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBhbmQgYWxsIGVtYmVkZGVkDQorICAgICAgICAvLy8gbWVzc2FnZXMgYXJlIHNldC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQuDQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBmaWVsZCBpbiBEZXNjcmlwdG9yRm9yVHlwZS5GaWVsZHMpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Jc1JlcXVpcmVkICYmICFIYXNGaWVsZChmaWVsZCkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgZW1iZWRkZWQgbWVzc2FnZXMgYXJlIGluaXRpYWxpemVkLg0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChLZXlWYWx1ZVBhaXI8RmllbGREZXNjcmlwdG9yLCBvYmplY3Q+IGVudHJ5IGluIEFsbEZpZWxkcykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZW50cnkuS2V5Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLk1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5NZXNzYWdlKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Jc1JlcGVhdGVkKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Uga25vdyBpdCdzIGFuIElMaXN0PFQ+LCBidXQgbm90IHRoZSBleGFjdCB0eXBlIC0gc28NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSUVudW1lcmFibGUgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvLiAoQyMgZ2VuZXJpY3MgYXJlbid0IGNvdmFyaWFudCB5ZXQuKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChJTWVzc2FnZUxpdGUgZWxlbWVudCBpbiAoSUVudW1lcmFibGUpIGVudHJ5LlZhbHVlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuSXNJbml0aWFsaXplZCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoKElNZXNzYWdlTGl0ZSkgZW50cnkuVmFsdWUpLklzSW5pdGlhbGl6ZWQpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2VhbGVkIHN0cmluZyBUb1N0cmluZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIFRleHRGb3JtYXQuUHJpbnRUb1N0cmluZyh0aGlzKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzZWFsZWQgdm9pZCBQcmludFRvKFRleHRXcml0ZXIgd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRleHRGb3JtYXQuUHJpbnQodGhpcywgd3JpdGVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIGFuZCB3cml0ZXMgaXQgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uDQorICAgICAgICAvLy8gVGhpcyBkb2VzIG5vdCBmbHVzaCBvciBjbG9zZSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz4NCisgICAgICAgIC8vLyBQcm90b2NvbCBCdWZmZXJzIGFyZSBub3Qgc2VsZi1kZWxpbWl0aW5nLiBUaGVyZWZvcmUsIGlmIHlvdSB3cml0ZQ0KKyAgICAgICAgLy8vIGFueSBtb3JlIGRhdGEgdG8gdGhlIHN0cmVhbSBhZnRlciB0aGUgbWVzc2FnZSwgeW91IG11c3Qgc29tZWhvdyBlbnN1cmUNCisgICAgICAgIC8vLyB0aGF0IHRoZSBwYXJzZXIgb24gdGhlIHJlY2VpdmluZyBlbmQgZG9lcyBub3QgaW50ZXJwcmV0IHRoaXMgYXMgYmVpbmcNCisgICAgICAgIC8vLyBwYXJ0IG9mIHRoZSBwcm90b2NvbCBtZXNzYWdlLiBPbmUgd2F5IG9mIGRvaW5nIHRoaXMgaXMgYnkgd3JpdGluZyB0aGUgc2l6ZQ0KKyAgICAgICAgLy8vIG9mIHRoZSBtZXNzYWdlIGJlZm9yZSB0aGUgZGF0YSwgdGhlbiBtYWtpbmcgc3VyZSB5b3UgbGltaXQgdGhlIGlucHV0IHRvDQorICAgICAgICAvLy8gdGhhdCBzaXplIHdoZW4gcmVjZWl2aW5nIHRoZSBkYXRhLiBBbHRlcm5hdGl2ZWx5LCB1c2UgV3JpdGVEZWxpbWl0ZWRUbyhTdHJlYW0pLg0KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8oSUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoIChLZXlWYWx1ZVBhaXI8RmllbGREZXNjcmlwdG9yLCBvYmplY3Q+IGVudHJ5IGluIEFsbEZpZWxkcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGVudHJ5LktleTsNCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzUmVwZWF0ZWQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgaXQncyBhbiBJTGlzdDxUPiwgYnV0IG5vdCB0aGUgZXhhY3QgdHlwZSAtIHNvDQorICAgICAgICAgICAgICAgICAgICAvLyBJRW51bWVyYWJsZSBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8uIChDIyBnZW5lcmljcyBhcmVuJ3QgY292YXJpYW50IHlldC4pDQorICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZSB2YWx1ZUxpc3QgPSAoSUVudW1lcmFibGUpIGVudHJ5LlZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzUGFja2VkKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZEFycmF5KGZpZWxkLkZpZWxkVHlwZSwgZmllbGQuRmllbGROdW1iZXIsIGZpZWxkLk5hbWUsIHZhbHVlTGlzdCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlQXJyYXkoZmllbGQuRmllbGRUeXBlLCBmaWVsZC5GaWVsZE51bWJlciwgZmllbGQuTmFtZSwgdmFsdWVMaXN0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZUZpZWxkKGZpZWxkLkZpZWxkVHlwZSwgZmllbGQuRmllbGROdW1iZXIsIGZpZWxkLk5hbWUsIGVudHJ5LlZhbHVlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcyA9IFVua25vd25GaWVsZHM7DQorICAgICAgICAgICAgaWYgKERlc2NyaXB0b3JGb3JUeXBlLk9wdGlvbnMuTWVzc2FnZVNldFdpcmVGb3JtYXQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLldyaXRlQXNNZXNzYWdlU2V0VG8ob3V0cHV0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBlbmNvZGUgdGhpcyBtZXNzYWdlLg0KKyAgICAgICAgLy8vIFRoZSByZXN1bHQgaXMgb25seSBjb21wdXRlZCBvbiB0aGUgZmlyc3QgY2FsbCBhbmQgbWVtb2l6ZWQgYWZ0ZXIgdGhhdC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAobWVtb2l6ZWRTaXplICE9IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1vaXplZFNpemUuVmFsdWU7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgaW50IHNpemUgPSAwOw0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChLZXlWYWx1ZVBhaXI8RmllbGREZXNjcmlwdG9yLCBvYmplY3Q+IGVudHJ5IGluIEFsbEZpZWxkcykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZW50cnkuS2V5Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzUmVwZWF0ZWQpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGUgdmFsdWVMaXN0ID0gKElFbnVtZXJhYmxlKSBlbnRyeS5WYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNQYWNrZWQpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgZWxlbWVudCBpbiB2YWx1ZUxpc3QpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplICs9IENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGaWVsZFNpemVOb1RhZyhmaWVsZC5GaWVsZFR5cGUsIGVsZW1lbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVRhZ1NpemUoZmllbGQuRmllbGROdW1iZXIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVSYXdWYXJpbnQzMlNpemUoKHVpbnQpIGRhdGFTaXplKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IGVsZW1lbnQgaW4gdmFsdWVMaXN0KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGaWVsZFNpemUoZmllbGQuRmllbGRUeXBlLCBmaWVsZC5GaWVsZE51bWJlciwgZWxlbWVudCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmllbGRTaXplKGZpZWxkLkZpZWxkVHlwZSwgZmllbGQuRmllbGROdW1iZXIsIGVudHJ5LlZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcyA9IFVua25vd25GaWVsZHM7DQorICAgICAgICAgICAgICAgIGlmIChEZXNjcmlwdG9yRm9yVHlwZS5PcHRpb25zLk1lc3NhZ2VTZXRXaXJlRm9ybWF0KQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBzaXplICs9IHVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBzaXplICs9IHVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgbWVtb2l6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdpdGggdGhpcyBtZXNzYWdlIGZvciBlcXVhbGl0eS4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBtZXNzYWdlIG9mIHRoZSBzYW1lIHR5cGUNCisgICAgICAgIC8vLyAoYXMgZGVmaW5lZCBieSBEZXNjcmlwdG9yRm9yVHlwZSkgYW5kIGhhcyBpZGVudGljYWwgdmFsdWVzDQorICAgICAgICAvLy8gZm9yIGFsbCBpdHMgZmllbGRzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKG90aGVyID09IHRoaXMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgSU1lc3NhZ2Ugb3RoZXJNZXNzYWdlID0gb3RoZXIgYXMgSU1lc3NhZ2U7DQorICAgICAgICAgICAgaWYgKG90aGVyTWVzc2FnZSA9PSBudWxsIHx8IG90aGVyTWVzc2FnZS5EZXNjcmlwdG9yRm9yVHlwZSAhPSBEZXNjcmlwdG9yRm9yVHlwZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIERpY3Rpb25hcmllcy5FcXVhbHMoQWxsRmllbGRzLCBvdGhlck1lc3NhZ2UuQWxsRmllbGRzKSAmJg0KKyAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRzLkVxdWFscyhvdGhlck1lc3NhZ2UuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG1lc3NhZ2UuDQorICAgICAgICAvLy8gVE9ETyhqb25za2VldCk6IFNwZWNpZnkgdGhlIGhhc2ggYWxnb3JpdGhtLCBidXQgYmV0dGVyIHRoYW4gdGhlIEphdmEgb25lIQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGludCBoYXNoID0gNDE7DQorICAgICAgICAgICAgaGFzaCA9ICgxOSpoYXNoKSArIERlc2NyaXB0b3JGb3JUeXBlLkdldEhhc2hDb2RlKCk7DQorICAgICAgICAgICAgaGFzaCA9ICg1MypoYXNoKSArIERpY3Rpb25hcmllcy5HZXRIYXNoQ29kZShBbGxGaWVsZHMpOw0KKyAgICAgICAgICAgIGhhc2ggPSAoMjkqaGFzaCkgKyBVbmtub3duRmllbGRzLkdldEhhc2hDb2RlKCk7DQorICAgICAgICAgICAgcmV0dXJuIGhhc2g7DQorICAgICAgICB9DQorDQorICAgICAgICAjcmVnaW9uIEV4cGxpY2l0IE1lbWJlcnMNCisNCisgICAgICAgIElCdWlsZGVyIElNZXNzYWdlLldlYWtDcmVhdGVCdWlsZGVyRm9yVHlwZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBJQnVpbGRlciBJTWVzc2FnZS5XZWFrVG9CdWlsZGVyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gVG9CdWlsZGVyKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBJTWVzc2FnZSBJTWVzc2FnZS5XZWFrRGVmYXVsdEluc3RhbmNlRm9yVHlwZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQWJzdHJhY3RNZXNzYWdlTGl0ZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Fic3RyYWN0TWVzc2FnZUxpdGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNkZWFkMgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Fic3RyYWN0TWVzc2FnZUxpdGUuY3MKQEAgLTAsMCArMSwxNDAgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW0uSU87DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBub24tZ2VuZXJpYyBJTWVzc2FnZSBpbnRlcmZhY2UgYXMgZmFyIGFzIHBvc3NpYmxlLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyBBYnN0cmFjdE1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gOiBJTWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVE1lc3NhZ2UgOiBBYnN0cmFjdE1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgIHdoZXJlIFRCdWlsZGVyIDogQWJzdHJhY3RCdWlsZGVyTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgIHsNCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpOw0KKw0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRCdWlsZGVyIFRvQnVpbGRlcigpOw0KKw0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgeyBnZXQ7IH0NCisNCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIElzSW5pdGlhbGl6ZWQgeyBnZXQ7IH0NCisNCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlVG8oSUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCk7DQorDQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IFNlcmlhbGl6ZWRTaXplIHsgZ2V0OyB9DQorDQorICAgICAgICAvL3B1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsNCisgICAgICAgIC8vfQ0KKw0KKyAgICAgICAgLy9wdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgew0KKyAgICAgICAgLy99DQorDQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBQcmludFRvKFRleHRXcml0ZXIgd3JpdGVyKTsNCisNCisgICAgICAgICNyZWdpb24gSU1lc3NhZ2VMaXRlPFRNZXNzYWdlLFRCdWlsZGVyPiBNZW1iZXJzDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBhIEJ5dGVTdHJpbmcuIFRoaXMgaXMgYSB0cml2aWFsIHdyYXBwZXINCisgICAgICAgIC8vLyBhcm91bmQgV3JpdGVUbyhJQ29kZWRPdXRwdXRTdHJlYW0pLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBCeXRlU3RyaW5nIFRvQnl0ZVN0cmluZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgQnl0ZVN0cmluZy5Db2RlZEJ1aWxkZXIgb3V0cHV0ID0gbmV3IEJ5dGVTdHJpbmcuQ29kZWRCdWlsZGVyKFNlcmlhbGl6ZWRTaXplKTsNCisgICAgICAgICAgICBXcml0ZVRvKG91dHB1dC5Db2RlZE91dHB1dCk7DQorICAgICAgICAgICAgcmV0dXJuIG91dHB1dC5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYSBieXRlIGFycmF5LiBUaGlzIGlzIGEgdHJpdmlhbCB3cmFwcGVyDQorICAgICAgICAvLy8gYXJvdW5kIFdyaXRlVG8oSUNvZGVkT3V0cHV0U3RyZWFtKS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgYnl0ZVtdIFRvQnl0ZUFycmF5KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbU2VyaWFsaXplZFNpemVdOw0KKyAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKHJlc3VsdCk7DQorICAgICAgICAgICAgV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgICAgIG91dHB1dC5DaGVja05vU3BhY2VMZWZ0KCk7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIGFuZCB3cml0ZXMgaXQgdG8gdGhlIGdpdmVuIHN0cmVhbS4NCisgICAgICAgIC8vLyBUaGlzIGlzIGp1c3QgYSB3cmFwcGVyIGFyb3VuZCBXcml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtKS4gVGhpcw0KKyAgICAgICAgLy8vIGRvZXMgbm90IGZsdXNoIG9yIGNsb3NlIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdXRwdXQiPjwvcGFyYW0+DQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKFN0cmVhbSBvdXRwdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRPdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShvdXRwdXQpOw0KKyAgICAgICAgICAgIFdyaXRlVG8oY29kZWRPdXRwdXQpOw0KKyAgICAgICAgICAgIGNvZGVkT3V0cHV0LkZsdXNoKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTGlrZSBXcml0ZVRvKFN0cmVhbSkgYnV0IHdyaXRlcyB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSBhcyBhIHZhcmludCBiZWZvcmUNCisgICAgICAgIC8vLyB3cml0aW5nIHRoZSBkYXRhLiBUaGlzIGFsbG93cyBtb3JlIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgc3RyZWFtIGFmdGVyIHRoZQ0KKyAgICAgICAgLy8vIG1lc3NhZ2Ugd2l0aG91dCB0aGUgbmVlZCB0byBkZWxpbWl0IHRoZSBtZXNzYWdlIGRhdGEgeW91cnNlbGYuIFVzZSANCisgICAgICAgIC8vLyBJQnVpbGRlci5NZXJnZURlbGltaXRlZEZyb20oU3RyZWFtKSBvciB0aGUgc3RhdGljIG1ldGhvZA0KKyAgICAgICAgLy8vIFlvdXJNZXNzYWdlVHlwZS5QYXJzZURlbGltaXRlZEZyb20oU3RyZWFtKSB0byBwYXJzZSBtZXNzYWdlcyB3cml0dGVuIGJ5IHRoaXMgbWV0aG9kLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0Ij48L3BhcmFtPg0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVEZWxpbWl0ZWRUbyhTdHJlYW0gb3V0cHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkT3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2Uob3V0cHV0KTsNCisgICAgICAgICAgICBjb2RlZE91dHB1dC5Xcml0ZVJhd1ZhcmludDMyKCh1aW50KSBTZXJpYWxpemVkU2l6ZSk7DQorICAgICAgICAgICAgV3JpdGVUbyhjb2RlZE91dHB1dCk7DQorICAgICAgICAgICAgY29kZWRPdXRwdXQuRmx1c2goKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIElCdWlsZGVyTGl0ZSBJTWVzc2FnZUxpdGUuV2Vha0NyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlckZvclR5cGUoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIElCdWlsZGVyTGl0ZSBJTWVzc2FnZUxpdGUuV2Vha1RvQnVpbGRlcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIFRvQnVpbGRlcigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgSU1lc3NhZ2VMaXRlIElNZXNzYWdlTGl0ZS5XZWFrRGVmYXVsdEluc3RhbmNlRm9yVHlwZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQnl0ZUFycmF5LmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQnl0ZUFycmF5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTFiN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9CeXRlQXJyYXkuY3MKQEAgLTAsMCArMSw5MiBAQAor77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gUHJvdmlkZXMgYSB1dGlsaXR5IHJvdXRpbmUgdG8gY29weSBzbWFsbCBhcnJheXMgbXVjaCBtb3JlIHF1aWNrbHkgdGhhbiBCdWZmZXIuQmxvY2tDb3B5DQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBCeXRlQXJyYXkNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSB0aHJlc2hvbGQgYWJvdmUgd2hpY2ggeW91IHNob3VsZCB1c2UgQnVmZmVyLkJsb2NrQ29weSByYXRoZXIgdGhhbiBCeXRlQXJyYXkuQ29weQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IENvcHlUaHJlc2hvbGQgPSAxMjsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBEZXRlcm1pbmVzIHdoaWNoIGNvcHkgcm91dGluZSB0byB1c2UgYmFzZWQgb24gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIENvcHkoYnl0ZVtdIHNyYywgaW50IHNyY09mZnNldCwgYnl0ZVtdIGRzdCwgaW50IGRzdE9mZnNldCwgaW50IGNvdW50KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChjb3VudCA+IENvcHlUaHJlc2hvbGQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBCdWZmZXIuQmxvY2tDb3B5KHNyYywgc3JjT2Zmc2V0LCBkc3QsIGRzdE9mZnNldCwgY291bnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBCeXRlQ29weShzcmMsIHNyY09mZnNldCwgZHN0LCBkc3RPZmZzZXQsIGNvdW50KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29weSB0aGUgYnl0ZXMgcHJvdmlkZWQgd2l0aCBhIGZvciBsb29wLCBmYXN0ZXIgd2hlbiB0aGVyZSBhcmUgb25seSBhIGZldyBieXRlcyB0byBjb3B5DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEJ5dGVDb3B5KGJ5dGVbXSBzcmMsIGludCBzcmNPZmZzZXQsIGJ5dGVbXSBkc3QsIGludCBkc3RPZmZzZXQsIGludCBjb3VudCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgc3RvcCA9IHNyY09mZnNldCArIGNvdW50Ow0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBzcmNPZmZzZXQ7IGkgPCBzdG9wOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBkc3RbZHN0T2Zmc2V0KytdID0gc3JjW2ldOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXZlcnNlcyB0aGUgb3JkZXIgb2YgYnl0ZXMgaW4gdGhlIGFycmF5DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJldmVyc2UoYnl0ZVtdIGJ5dGVzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJ5dGUgdGVtcDsNCisgICAgICAgICAgICBmb3IgKGludCBmaXJzdCA9IDAsIGxhc3QgPSBieXRlcy5MZW5ndGggLSAxOyBmaXJzdCA8IGxhc3Q7IGZpcnN0KyssIGxhc3QtLSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRlbXAgPSBieXRlc1tmaXJzdF07DQorICAgICAgICAgICAgICAgIGJ5dGVzW2ZpcnN0XSA9IGJ5dGVzW2xhc3RdOw0KKyAgICAgICAgICAgICAgICBieXRlc1tsYXN0XSA9IHRlbXA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0J5dGVTdHJpbmcuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9CeXRlU3RyaW5nLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNDg2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9CeXRlU3RyaW5nLmNzCkBAIC0wLDAgKzEsMzA1IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlRleHQ7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEltbXV0YWJsZSBhcnJheSBvZiBieXRlcy4NCisgICAgLy8vIFRPRE8oam9uc2tlZXQpOiBJbXBsZW1lbnQgdGhlIGNvbW1vbiBjb2xsZWN0aW9uIGludGVyZmFjZXM/DQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgQnl0ZVN0cmluZyA6IElFbnVtZXJhYmxlPGJ5dGU+LCBJRXF1YXRhYmxlPEJ5dGVTdHJpbmc+DQorICAgIHsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEJ5dGVTdHJpbmcgZW1wdHkgPSBuZXcgQnl0ZVN0cmluZyhuZXcgYnl0ZVswXSk7DQorDQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBieXRlczsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVbnNhZmUgb3BlcmF0aW9ucyB0aGF0IGNhbiBjYXVzZSBJTyBGYWlsdXJlIGFuZC9vciBvdGhlciBjYXRlc3Ryb3BoaWMgc2lkZS1lZmZlY3RzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVW5zYWZlDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgbmV3IEJ5dGVTdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBhcnJheS4gVGhlIGFycmF5IGlzDQorICAgICAgICAgICAgLy8vICpub3QqIGNvcGllZCwgYW5kIG11c3Qgbm90IGJlIG1vZGlmaWVkIGFmdGVyIHRoaXMgY29uc3RydWN0b3IgaXMgY2FsbGVkLg0KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIEZyb21CeXRlcyhieXRlW10gYnl0ZXMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVTdHJpbmcoYnl0ZXMpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAgICAgLy8vIFByb3ZpZGVzIGRpcmVjdCwgdW5yZXN0cmljdGVkIGFjY2VzcyB0byB0aGUgYnl0ZXMgY29udGFpbmVkIGluIHRoaXMgaW5zdGFuY2UuDQorICAgICAgICAgICAgLy8vIFlvdSBtdXN0IG5vdCBtb2RpZnkgb3IgcmVzaXplIHRoZSBieXRlIGFycmF5IHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLg0KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gR2V0QnVmZmVyKEJ5dGVTdHJpbmcgYnl0ZXMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXMuYnl0ZXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEludGVybmFsIHVzZSBvbmx5LiAgRW5zdXJlIHRoYXQgdGhlIHByb3ZpZGVkIGFycmF5IGlzIG5vdCBtdXRhdGVkIGFuZCBiZWxvbmdzIHRvIHRoaXMgaW5zdGFuY2UuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEJ5dGVTdHJpbmcgQXR0YWNoQnl0ZXMoYnl0ZVtdIGJ5dGVzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZVN0cmluZyhieXRlcyk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29uc3RydWN0cyBhIG5ldyBCeXRlU3RyaW5nIGZyb20gdGhlIGdpdmVuIGJ5dGUgYXJyYXkuIFRoZSBhcnJheSBpcw0KKyAgICAgICAgLy8vICpub3QqIGNvcGllZCwgYW5kIG11c3Qgbm90IGJlIG1vZGlmaWVkIGFmdGVyIHRoaXMgY29uc3RydWN0b3IgaXMgY2FsbGVkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgQnl0ZVN0cmluZyhieXRlW10gYnl0ZXMpDQorICAgICAgICB7DQorICAgICAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgYW4gZW1wdHkgQnl0ZVN0cmluZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgRW1wdHkNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZW1wdHk7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyBCeXRlU3RyaW5nIGluIGJ5dGVzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBpbnQgTGVuZ3RoDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGJ5dGVzLkxlbmd0aDsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGJvb2wgSXNFbXB0eQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBMZW5ndGggPT0gMDsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGJ5dGVbXSBUb0J5dGVBcnJheSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIChieXRlW10pIGJ5dGVzLkNsb25lKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RyaW5nIFRvQmFzZTY0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ29udmVydC5Ub0Jhc2U2NFN0cmluZyhieXRlcyk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29uc3RydWN0cyBhIEJ5dGVTdHJpbmcgZnJvbSB0aGUgQmFzZTY0IEVuY29kZWQgU3RyaW5nLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBGcm9tQmFzZTY0KHN0cmluZyBieXRlcykNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBCeSBoYW5kbGluZyB0aGUgZW1wdHkgc3RyaW5nIGV4cGxpY2l0bHksIHdlIG5vdCBvbmx5IG9wdGltaXplIGJ1dCB3ZSBmaXggYQ0KKyAgICAgICAgICAgIC8vIHByb2JsZW0gb24gQ0YgMi4wLiBTZWUgaXNzdWUgNjEgZm9yIGRldGFpbHMuDQorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzID09ICIiID8gRW1wdHkgOiBuZXcgQnl0ZVN0cmluZyhDb252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoYnl0ZXMpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgQnl0ZVN0cmluZyBmcm9tIHRoZSBnaXZlbiBhcnJheS4gVGhlIGNvbnRlbnRzDQorICAgICAgICAvLy8gYXJlIGNvcGllZCwgc28gZnVydGhlciBtb2RpZmljYXRpb25zIHRvIHRoZSBhcnJheSB3aWxsIG5vdA0KKyAgICAgICAgLy8vIGJlIHJlZmxlY3RlZCBpbiB0aGUgcmV0dXJuZWQgQnl0ZVN0cmluZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgQ29weUZyb20oYnl0ZVtdIGJ5dGVzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZVN0cmluZygoYnl0ZVtdKSBieXRlcy5DbG9uZSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgQnl0ZVN0cmluZyBmcm9tIGEgcG9ydGlvbiBvZiBhIGJ5dGUgYXJyYXkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIENvcHlGcm9tKGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCwgaW50IGNvdW50KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJ5dGVbXSBwb3J0aW9uID0gbmV3IGJ5dGVbY291bnRdOw0KKyAgICAgICAgICAgIEJ5dGVBcnJheS5Db3B5KGJ5dGVzLCBvZmZzZXQsIHBvcnRpb24sIDAsIGNvdW50KTsNCisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVTdHJpbmcocG9ydGlvbik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyBCeXRlU3RyaW5nIGJ5IGVuY29kaW5nIHRoZSBzcGVjaWZpZWQgdGV4dCB3aXRoDQorICAgICAgICAvLy8gdGhlIGdpdmVuIGVuY29kaW5nLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBDb3B5RnJvbShzdHJpbmcgdGV4dCwgRW5jb2RpbmcgZW5jb2RpbmcpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlU3RyaW5nKGVuY29kaW5nLkdldEJ5dGVzKHRleHQpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDcmVhdGVzIGEgbmV3IEJ5dGVTdHJpbmcgYnkgZW5jb2RpbmcgdGhlIHNwZWNpZmllZCB0ZXh0IGluIFVURi04Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBDb3B5RnJvbVV0Zjgoc3RyaW5nIHRleHQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENvcHlGcm9tKHRleHQsIEVuY29kaW5nLlVURjgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVucyB0aGUgYnl0ZSBhdCB0aGUgZ2l2ZW4gaW5kZXguDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGJ5dGUgdGhpc1tpbnQgaW5kZXhdDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGJ5dGVzW2luZGV4XTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0cmluZyBUb1N0cmluZyhFbmNvZGluZyBlbmNvZGluZykNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gZW5jb2RpbmcuR2V0U3RyaW5nKGJ5dGVzLCAwLCBieXRlcy5MZW5ndGgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0cmluZyBUb1N0cmluZ1V0ZjgoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBUb1N0cmluZyhFbmNvZGluZy5VVEY4KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBJRW51bWVyYXRvcjxieXRlPiBHZXRFbnVtZXJhdG9yKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gKChJRW51bWVyYWJsZTxieXRlPikgYnl0ZXMpLkdldEVudW1lcmF0b3IoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBHZXRFbnVtZXJhdG9yKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIENvZGVkSW5wdXRTdHJlYW0gZnJvbSB0aGlzIEJ5dGVTdHJpbmcncyBkYXRhLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBDb2RlZElucHV0U3RyZWFtIENyZWF0ZUNvZGVkSW5wdXQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIFdlIHRydXN0IENvZGVkSW5wdXRTdHJlYW0gbm90IHRvIHJldmVhbCB0aGUgcHJvdmlkZWQgYnl0ZSBhcnJheSBvciBtb2RpZnkgaXQNCisgICAgICAgICAgICByZXR1cm4gQ29kZWRJbnB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShieXRlcyk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLyBUT0RPKGpvbnNrZWV0KTogQ29weVRvIGlmIGl0IHR1cm5zIG91dCB0byBiZSByZXF1aXJlZA0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopDQorICAgICAgICB7DQorICAgICAgICAgICAgQnl0ZVN0cmluZyBvdGhlciA9IG9iaiBhcyBCeXRlU3RyaW5nOw0KKyAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIEVxdWFscyhvdGhlcik7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgcmV0ID0gMjM7DQorICAgICAgICAgICAgZm9yZWFjaCAoYnl0ZSBiIGluIGJ5dGVzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0ID0gKHJldCA8PCA4KSB8IGI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXQ7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBFcXVhbHMoQnl0ZVN0cmluZyBvdGhlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAob3RoZXIuYnl0ZXMuTGVuZ3RoICE9IGJ5dGVzLkxlbmd0aCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5MZW5ndGg7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChvdGhlci5ieXRlc1tpXSAhPSBieXRlc1tpXSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEJ1aWxkZXIgZm9yIEJ5dGVTdHJpbmdzIHdoaWNoIGFsbG93cyB0aGVtIHRvIGJlIGNyZWF0ZWQgd2l0aG91dCBleHRyYQ0KKyAgICAgICAgLy8vIGNvcHlpbmcgYmVpbmcgaW52b2x2ZWQuIFRoaXMgaGFzIHRvIGJlIGEgbmVzdGVkIHR5cGUgaW4gb3JkZXIgdG8gaGF2ZSBhY2Nlc3MNCisgICAgICAgIC8vLyB0byB0aGUgcHJpdmF0ZSBCeXRlU3RyaW5nIGNvbnN0cnVjdG9yLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIHNlYWxlZCBjbGFzcyBDb2RlZEJ1aWxkZXINCisgICAgICAgIHsNCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dDsNCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBidWZmZXI7DQorDQorICAgICAgICAgICAgaW50ZXJuYWwgQ29kZWRCdWlsZGVyKGludCBzaXplKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07DQorICAgICAgICAgICAgICAgIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKGJ1ZmZlcik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGludGVybmFsIEJ5dGVTdHJpbmcgQnVpbGQoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgb3V0cHV0LkNoZWNrTm9TcGFjZUxlZnQoKTsNCisNCisgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGJlIGNvbmZpZGVudCB0aGF0IHRoZSBDb2RlZE91dHB1dFN0cmVhbSB3aWxsIG5vdCBtb2RpZnkgdGhlDQorICAgICAgICAgICAgICAgIC8vIHVuZGVybHlpbmcgYnl0ZXMgYW55bW9yZSBiZWNhdXNlIGl0IGFscmVhZHkgd3JvdGUgYWxsIG9mIHRoZW0uICBTbywNCisgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBtYWtlIGEgY29weS4NCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlU3RyaW5nKGJ1ZmZlcik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGludGVybmFsIENvZGVkT3V0cHV0U3RyZWFtIENvZGVkT3V0cHV0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gb3V0cHV0OyB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFVzZWQgaW50ZXJuYWxseSBieSBDb2RlZE91dHB1dFN0cmVhbSB0byBhdm9pZCBjcmVhdGluZyBhIGNvcHkgZm9yIHRoZSB3cml0ZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIHZvaWQgV3JpdGVSYXdCeXRlc1RvKENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBvdXRwdXRTdHJlYW0uV3JpdGVSYXdCeXRlcyhieXRlcywgMCwgYnl0ZXMuTGVuZ3RoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb3BpZXMgdGhlIGVudGlyZSBieXRlIGFycmF5IHRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheSBwcm92aWRlZCBhdCB0aGUgb2Zmc2V0IHNwZWNpZmllZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG8oYnl0ZVtdIGFycmF5LCBpbnQgcG9zaXRpb24pDQorICAgICAgICB7DQorICAgICAgICAgICAgQnl0ZUFycmF5LkNvcHkoYnl0ZXMsIDAsIGFycmF5LCBwb3NpdGlvbiwgYnl0ZXMuTGVuZ3RoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgdGhlIGVudGlyZSBieXRlIGFycmF5IHRvIHRoZSBwcm92aWRlZCBzdHJlYW0NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKFN0cmVhbSBvdXRwdXRTdHJlYW0pDQorICAgICAgICB7DQorICAgICAgICAgICAgb3V0cHV0U3RyZWFtLldyaXRlKGJ5dGVzLCAwLCBieXRlcy5MZW5ndGgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0NvZGVkSW5wdXRTdHJlYW0uY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Db2RlZElucHV0U3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3M2U4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Db2RlZElucHV0U3RyZWFtLmNzCkBAIC0wLDAgKzEsMTg2NCBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlRleHQ7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gUmVhZGluZ3MgYW5kIGRlY29kZXMgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZHMuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIC8vLyA8cmVtYXJrcz4NCisgICAgLy8vIFRoaXMgY2xhc3MgY29udGFpbnMgdHdvIGtpbmRzIG9mIG1ldGhvZHM6ICBtZXRob2RzIHRoYXQgcmVhZCBzcGVjaWZpYw0KKyAgICAvLy8gcHJvdG9jb2wgbWVzc2FnZSBjb25zdHJ1Y3RzIGFuZCBmaWVsZCB0eXBlcyAoZS5nLiBSZWFkVGFnIGFuZA0KKyAgICAvLy8gUmVhZEludDMyKSBhbmQgbWV0aG9kcyB0aGF0IHJlYWQgbG93LWxldmVsIHZhbHVlcyAoZS5nLg0KKyAgICAvLy8gUmVhZFJhd1ZhcmludDMyIGFuZCBSZWFkUmF3Qnl0ZXMpLiAgSWYgeW91IGFyZSByZWFkaW5nIGVuY29kZWQgcHJvdG9jb2wNCisgICAgLy8vIG1lc3NhZ2VzLCB5b3Ugc2hvdWxkIHVzZSB0aGUgZm9ybWVyIG1ldGhvZHMsIGJ1dCBpZiB5b3UgYXJlIHJlYWRpbmcgc29tZQ0KKyAgICAvLy8gb3RoZXIgZm9ybWF0IG9mIHlvdXIgb3duIGRlc2lnbiwgdXNlIHRoZSBsYXR0ZXIuIFRoZSBuYW1lcyBvZiB0aGUgZm9ybWVyDQorICAgIC8vLyBtZXRob2RzIGFyZSB0YWtlbiBmcm9tIHRoZSBwcm90b2NvbCBidWZmZXIgdHlwZSBuYW1lcywgbm90IC5ORVQgdHlwZXMuDQorICAgIC8vLyAoSGVuY2UgUmVhZEZsb2F0IGluc3RlYWQgb2YgUmVhZFNpbmdsZSwgYW5kIFJlYWRCb29sIGluc3RlYWQgb2YgUmVhZEJvb2xlYW4uKQ0KKyAgICAvLy8gDQorICAgIC8vLyBUT0RPKGpvbnNrZWV0KTogQ29uc2lkZXIgd2hldGhlciByZWN1cnNpb24gYW5kIHNpemUgbGltaXRzIHNob3VsZG4ndCBiZSByZWFkb25seSwNCisgICAgLy8vIHNldCBhdCBjb25zdHJ1Y3Rpb24gdGltZS4NCisgICAgLy8vIDwvcmVtYXJrcz4NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBDb2RlZElucHV0U3RyZWFtIDogSUNvZGVkSW5wdXRTdHJlYW0NCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gYnVmZmVyOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgYnVmZmVyU2l6ZTsNCisgICAgICAgIHByaXZhdGUgaW50IGJ1ZmZlclNpemVBZnRlckxpbWl0ID0gMDsNCisgICAgICAgIHByaXZhdGUgaW50IGJ1ZmZlclBvcyA9IDA7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFN0cmVhbSBpbnB1dDsNCisgICAgICAgIHByaXZhdGUgdWludCBsYXN0VGFnID0gMDsNCisNCisgICAgICAgIHByaXZhdGUgdWludCBuZXh0VGFnID0gMDsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNOZXh0VGFnID0gZmFsc2U7DQorDQorICAgICAgICBpbnRlcm5hbCBjb25zdCBpbnQgRGVmYXVsdFJlY3Vyc2lvbkxpbWl0ID0gNjQ7DQorICAgICAgICBpbnRlcm5hbCBjb25zdCBpbnQgRGVmYXVsdFNpemVMaW1pdCA9IDY0IDw8IDIwOyAvLyA2NE1CDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEJ1ZmZlclNpemUgPSA0MDk2Ow0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBiZWZvcmUgdGhlIGN1cnJlbnQgYnVmZmVyLiBUaGUNCisgICAgICAgIC8vLyB0b3RhbCBieXRlcyByZWFkIHVwIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGNhbiBiZSBjb21wdXRlZCBhcw0KKyAgICAgICAgLy8vIHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyUG9zLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgaW50IHRvdGFsQnl0ZXNSZXRpcmVkID0gMDsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUaGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBtZXNzYWdlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gDQorICAgICAgICBwcml2YXRlIGludCBjdXJyZW50TGltaXQgPSBpbnQuTWF4VmFsdWU7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gPHNlZSBjcmVmPSJTZXRSZWN1cnNpb25MaW1pdCIvPg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgaW50IHJlY3Vyc2lvbkRlcHRoID0gMDsNCisNCisgICAgICAgIHByaXZhdGUgaW50IHJlY3Vyc2lvbkxpbWl0ID0gRGVmYXVsdFJlY3Vyc2lvbkxpbWl0Ow0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxzZWUgY3JlZj0iU2V0U2l6ZUxpbWl0Ii8+DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBpbnQgc2l6ZUxpbWl0ID0gRGVmYXVsdFNpemVMaW1pdDsNCisNCisgICAgICAgICNyZWdpb24gQ29uc3RydWN0aW9uDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyBDb2RlZElucHV0U3RyZWFtIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBnaXZlbg0KKyAgICAgICAgLy8vIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIENvZGVkSW5wdXRTdHJlYW0gQ3JlYXRlSW5zdGFuY2UoU3RyZWFtIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29kZWRJbnB1dFN0cmVhbShpbnB1dCk7DQorICAgICAgICB9DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyBDb2RlZElucHV0U3RyZWFtIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBnaXZlbg0KKyAgICAgICAgLy8vIHN0cmVhbSBhbmQgYSBwcmUtYWxsb2NhdGVkIG1lbW9yeSBidWZmZXIuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDb2RlZElucHV0U3RyZWFtIENyZWF0ZUluc3RhbmNlKFN0cmVhbSBpbnB1dCwgYnl0ZVtdIGJ1ZmZlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IENvZGVkSW5wdXRTdHJlYW0oaW5wdXQsIGJ1ZmZlcik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyBDb2RlZElucHV0U3RyZWFtIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBnaXZlbg0KKyAgICAgICAgLy8vIGJ5dGUgYXJyYXkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDb2RlZElucHV0U3RyZWFtIENyZWF0ZUluc3RhbmNlKGJ5dGVbXSBidWYpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2RlZElucHV0U3RyZWFtKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyBDb2RlZElucHV0U3RyZWFtIHRoYXQgcmVhZHMgZnJvbSB0aGUgZ2l2ZW4NCisgICAgICAgIC8vLyBieXRlIGFycmF5IHNsaWNlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29kZWRJbnB1dFN0cmVhbSBDcmVhdGVJbnN0YW5jZShieXRlW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29kZWRJbnB1dFN0cmVhbShidWYsIG9mZnNldCwgbGVuZ3RoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgQ29kZWRJbnB1dFN0cmVhbShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOw0KKyAgICAgICAgICAgIHRoaXMuYnVmZmVyUG9zID0gb2Zmc2V0Ow0KKyAgICAgICAgICAgIHRoaXMuYnVmZmVyU2l6ZSA9IG9mZnNldCArIGxlbmd0aDsNCisgICAgICAgICAgICB0aGlzLmlucHV0ID0gbnVsbDsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgQ29kZWRJbnB1dFN0cmVhbShTdHJlYW0gaW5wdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgYnl0ZVtCdWZmZXJTaXplXTsNCisgICAgICAgICAgICB0aGlzLmJ1ZmZlclNpemUgPSAwOw0KKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgQ29kZWRJbnB1dFN0cmVhbShTdHJlYW0gaW5wdXQsIGJ5dGVbXSBidWZmZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7DQorICAgICAgICAgICAgdGhpcy5idWZmZXJTaXplID0gMDsNCisgICAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7DQorICAgICAgICB9DQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgc3RyZWFtLCBvciB0aGUgcG9zaXRpb24gaW4gdGhlIGlucHV0IGJ1ZmZlcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBsb25nIFBvc2l0aW9uIA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5Qb3NpdGlvbiAtICgoYnVmZmVyU2l6ZSArIGJ1ZmZlclNpemVBZnRlckxpbWl0KSAtIGJ1ZmZlclBvcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclBvczsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorDQorICAgICAgICB2b2lkIElDb2RlZElucHV0U3RyZWFtLlJlYWRNZXNzYWdlU3RhcnQoKSB7IH0NCisgICAgICAgIHZvaWQgSUNvZGVkSW5wdXRTdHJlYW0uUmVhZE1lc3NhZ2VFbmQoKSB7IH0NCisNCisgICAgICAgICNyZWdpb24gVmFsaWRhdGlvbg0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFZlcmlmaWVzIHRoYXQgdGhlIGxhc3QgY2FsbCB0byBSZWFkVGFnKCkgcmV0dXJuZWQgdGhlIGdpdmVuIHRhZyB2YWx1ZS4NCisgICAgICAgIC8vLyBUaGlzIGlzIHVzZWQgdG8gdmVyaWZ5IHRoYXQgYSBuZXN0ZWQgZ3JvdXAgZW5kZWQgd2l0aCB0aGUgY29ycmVjdA0KKyAgICAgICAgLy8vIGVuZCB0YWcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIj5UaGUgbGFzdA0KKyAgICAgICAgLy8vIHRhZyByZWFkIHdhcyBub3QgdGhlIG9uZSBzcGVjaWZpZWQ8L2V4Y2VwdGlvbj4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgQ2hlY2tMYXN0VGFnV2FzKHVpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGxhc3RUYWcgIT0gdmFsdWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZEVuZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgICNyZWdpb24gUmVhZGluZyBvZiB0YWdzIGV0Yw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEF0dGVtcHQgdG8gcGVlayBhdCB0aGUgbmV4dCBmaWVsZCB0YWcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgYm9vbCBQZWVrTmV4dFRhZyhvdXQgdWludCBmaWVsZFRhZywgb3V0IHN0cmluZyBmaWVsZE5hbWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGhhc05leHRUYWcpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBmaWVsZE5hbWUgPSBudWxsOw0KKyAgICAgICAgICAgICAgICBmaWVsZFRhZyA9IG5leHRUYWc7DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICB1aW50IHNhdmVkTGFzdCA9IGxhc3RUYWc7DQorICAgICAgICAgICAgaGFzTmV4dFRhZyA9IFJlYWRUYWcob3V0IG5leHRUYWcsIG91dCBmaWVsZE5hbWUpOw0KKyAgICAgICAgICAgIGxhc3RUYWcgPSBzYXZlZExhc3Q7DQorICAgICAgICAgICAgZmllbGRUYWcgPSBuZXh0VGFnOw0KKyAgICAgICAgICAgIHJldHVybiBoYXNOZXh0VGFnOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEF0dGVtcHQgdG8gcmVhZCBhIGZpZWxkIHRhZywgcmV0dXJuaW5nIGZhbHNlIGlmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kDQorICAgICAgICAvLy8gb2YgdGhlIGlucHV0IGRhdGEuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWVsZFRhZyI+VGhlICd0YWcnIG9mIHRoZSBmaWVsZCAoaWQgKiA4ICsgd2lyZS1mb3JtYXQpPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmllbGROYW1lIj5Ob3QgU3VwcG9ydGVkIC0gRm9yIHByb3RvYnVmZmVyIHN0cmVhbXMsIHRoaXMgcGFyYW1ldGVyIGlzIGFsd2F5cyBudWxsPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cmV0dXJucz50cnVlIGlmIHRoZSBuZXh0IGZpZWxkVGFnIHdhcyByZWFkPC9yZXR1cm5zPg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgYm9vbCBSZWFkVGFnKG91dCB1aW50IGZpZWxkVGFnLCBvdXQgc3RyaW5nIGZpZWxkTmFtZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmaWVsZE5hbWUgPSBudWxsOw0KKw0KKyAgICAgICAgICAgIGlmIChoYXNOZXh0VGFnKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZmllbGRUYWcgPSBuZXh0VGFnOw0KKyAgICAgICAgICAgICAgICBsYXN0VGFnID0gZmllbGRUYWc7DQorICAgICAgICAgICAgICAgIGhhc05leHRUYWcgPSBmYWxzZTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmIChJc0F0RW5kKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZmllbGRUYWcgPSAwOw0KKyAgICAgICAgICAgICAgICBsYXN0VGFnID0gZmllbGRUYWc7DQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZmllbGRUYWcgPSBSZWFkUmF3VmFyaW50MzIoKTsNCisgICAgICAgICAgICBsYXN0VGFnID0gZmllbGRUYWc7DQorICAgICAgICAgICAgaWYgKGxhc3RUYWcgPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIElmIHdlIGFjdHVhbGx5IHJlYWQgemVybywgdGhhdCdzIG5vdCBhIHZhbGlkIHRhZy4NCisgICAgICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZCBhIGRvdWJsZSBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGJvb2wgUmVhZERvdWJsZShyZWYgZG91YmxlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhbHVlID0gRnJhbWV3b3JrUG9ydGFiaWxpdHkuSW50NjRUb0RvdWJsZSgobG9uZykgUmVhZFJhd0xpdHRsZUVuZGlhbjY0KCkpOw0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWQgYSBmbG9hdCBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGJvb2wgUmVhZEZsb2F0KHJlZiBmbG9hdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoQml0Q29udmVydGVyLklzTGl0dGxlRW5kaWFuICYmIDQgPD0gYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhbHVlID0gQml0Q29udmVydGVyLlRvU2luZ2xlKGJ1ZmZlciwgYnVmZmVyUG9zKTsNCisgICAgICAgICAgICAgICAgYnVmZmVyUG9zICs9IDQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJ5dGVbXSByYXdCeXRlcyA9IFJlYWRSYXdCeXRlcyg0KTsNCisgICAgICAgICAgICAgICAgaWYgKCFCaXRDb252ZXJ0ZXIuSXNMaXR0bGVFbmRpYW4pDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheS5SZXZlcnNlKHJhd0J5dGVzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IEJpdENvbnZlcnRlci5Ub1NpbmdsZShyYXdCeXRlcywgMCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWQgYSB1aW50NjQgZmllbGQgZnJvbSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIGJvb2wgUmVhZFVJbnQ2NChyZWYgdWxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgdmFsdWUgPSBSZWFkUmF3VmFyaW50NjQoKTsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkIGFuIGludDY0IGZpZWxkIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgYm9vbCBSZWFkSW50NjQocmVmIGxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgdmFsdWUgPSAobG9uZykgUmVhZFJhd1ZhcmludDY0KCk7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZCBhbiBpbnQzMiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGJvb2wgUmVhZEludDMyKHJlZiBpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgdmFsdWUgPSAoaW50KSBSZWFkUmF3VmFyaW50MzIoKTsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkIGEgZml4ZWQ2NCBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgYm9vbCBSZWFkRml4ZWQ2NChyZWYgdWxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgdmFsdWUgPSBSZWFkUmF3TGl0dGxlRW5kaWFuNjQoKTsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkIGEgZml4ZWQzMiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgYm9vbCBSZWFkRml4ZWQzMihyZWYgdWludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YWx1ZSA9IFJlYWRSYXdMaXR0bGVFbmRpYW4zMigpOw0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWQgYSBib29sIGZpZWxkIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgYm9vbCBSZWFkQm9vbChyZWYgYm9vbCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YWx1ZSA9IFJlYWRSYXdWYXJpbnQzMigpICE9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYSBzdHJpbmcgZmllbGQgZnJvbSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBib29sIFJlYWRTdHJpbmcocmVmIHN0cmluZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpIFJlYWRSYXdWYXJpbnQzMigpOw0KKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gcmVhZCBhbnkgZGF0YSBmb3IgYW4gZW1wdHkgc3RyaW5nLg0KKyAgICAgICAgICAgIGlmIChzaXplID09IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHNpemUgPD0gYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogIFdlIGFscmVhZHkgaGF2ZSB0aGUgYnl0ZXMgaW4gYSBjb250aWd1b3VzIGJ1ZmZlciwgc28NCisgICAgICAgICAgICAgICAgLy8gICBqdXN0IGNvcHkgZGlyZWN0bHkgZnJvbSBpdC4NCisgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IEVuY29kaW5nLlVURjguR2V0U3RyaW5nKGJ1ZmZlciwgYnVmZmVyUG9zLCBzaXplKTsNCisgICAgICAgICAgICAgICAgYnVmZmVyUG9zICs9IHNpemU7DQorICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgLy8gU2xvdyBwYXRoOiBCdWlsZCBhIGJ5dGUgYXJyYXkgZmlyc3QgdGhlbiBjb3B5IGl0Lg0KKyAgICAgICAgICAgIHZhbHVlID0gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoUmVhZFJhd0J5dGVzKHNpemUpLCAwLCBzaXplKTsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBhIGdyb3VwIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+ICAgIA0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZEdyb3VwKGludCBmaWVsZE51bWJlciwgSUJ1aWxkZXJMaXRlIGJ1aWxkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHJlY3Vyc2lvbkRlcHRoID49IHJlY3Vyc2lvbkxpbWl0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLlJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgKytyZWN1cnNpb25EZXB0aDsNCisgICAgICAgICAgICBidWlsZGVyLldlYWtNZXJnZUZyb20odGhpcywgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgIENoZWNrTGFzdFRhZ1dhcyhXaXJlRm9ybWF0Lk1ha2VUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRW5kR3JvdXApKTsNCisgICAgICAgICAgICAtLXJlY3Vyc2lvbkRlcHRoOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGEgZ3JvdXAgZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtIGFuZCBtZXJnZXMgaXQgaW50byB0aGUgZ2l2ZW4NCisgICAgICAgIC8vLyBVbmtub3duRmllbGRTZXQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgIA0KKyAgICAgICAgW09ic29sZXRlXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZFVua25vd25Hcm91cChpbnQgZmllbGROdW1iZXIsIElCdWlsZGVyTGl0ZSBidWlsZGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChyZWN1cnNpb25EZXB0aCA+PSByZWN1cnNpb25MaW1pdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5SZWN1cnNpb25MaW1pdEV4Y2VlZGVkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICsrcmVjdXJzaW9uRGVwdGg7DQorICAgICAgICAgICAgYnVpbGRlci5XZWFrTWVyZ2VGcm9tKHRoaXMpOw0KKyAgICAgICAgICAgIENoZWNrTGFzdFRhZ1dhcyhXaXJlRm9ybWF0Lk1ha2VUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRW5kR3JvdXApKTsNCisgICAgICAgICAgICAtLXJlY3Vyc2lvbkRlcHRoOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGFuIGVtYmVkZGVkIG1lc3NhZ2UgZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gICANCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRNZXNzYWdlKElCdWlsZGVyTGl0ZSBidWlsZGVyLCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gKGludCkgUmVhZFJhd1ZhcmludDMyKCk7DQorICAgICAgICAgICAgaWYgKHJlY3Vyc2lvbkRlcHRoID49IHJlY3Vyc2lvbkxpbWl0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLlJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaW50IG9sZExpbWl0ID0gUHVzaExpbWl0KGxlbmd0aCk7DQorICAgICAgICAgICAgKytyZWN1cnNpb25EZXB0aDsNCisgICAgICAgICAgICBidWlsZGVyLldlYWtNZXJnZUZyb20odGhpcywgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgIENoZWNrTGFzdFRhZ1dhcygwKTsNCisgICAgICAgICAgICAtLXJlY3Vyc2lvbkRlcHRoOw0KKyAgICAgICAgICAgIFBvcExpbWl0KG9sZExpbWl0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBhIGJ5dGVzIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+ICAgDQorICAgICAgICBwdWJsaWMgYm9vbCBSZWFkQnl0ZXMocmVmIEJ5dGVTdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KSBSZWFkUmF3VmFyaW50MzIoKTsNCisgICAgICAgICAgICBpZiAoc2l6ZSA8PSBidWZmZXJTaXplIC0gYnVmZmVyUG9zICYmIHNpemUgPiAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gRmFzdCBwYXRoOiAgV2UgYWxyZWFkeSBoYXZlIHRoZSBieXRlcyBpbiBhIGNvbnRpZ3VvdXMgYnVmZmVyLCBzbw0KKyAgICAgICAgICAgICAgICAvLyAgIGp1c3QgY29weSBkaXJlY3RseSBmcm9tIGl0Lg0KKyAgICAgICAgICAgICAgICBCeXRlU3RyaW5nIHJlc3VsdCA9IEJ5dGVTdHJpbmcuQ29weUZyb20oYnVmZmVyLCBidWZmZXJQb3MsIHNpemUpOw0KKyAgICAgICAgICAgICAgICBidWZmZXJQb3MgKz0gc2l6ZTsNCisgICAgICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQ7DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBTbG93IHBhdGg6ICBCdWlsZCBhIGJ5dGUgYXJyYXkgYW5kIGF0dGFjaCBpdCB0byBhIG5ldyBCeXRlU3RyaW5nLg0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IEJ5dGVTdHJpbmcuQXR0YWNoQnl0ZXMoUmVhZFJhd0J5dGVzKHNpemUpKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGEgdWludDMyIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+ICAgDQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyBib29sIFJlYWRVSW50MzIocmVmIHVpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgdmFsdWUgPSBSZWFkUmF3VmFyaW50MzIoKTsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBhbiBlbnVtIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQ0KKyAgICAgICAgLy8vIGZvciBjb252ZXJ0aW5nIHRoZSBudW1lcmljIHZhbHVlIHRvIGFuIGFjdHVhbCBlbnVtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gICANCisgICAgICAgIHB1YmxpYyBib29sIFJlYWRFbnVtKHJlZiBJRW51bUxpdGUgdmFsdWUsIG91dCBvYmplY3QgdW5rbm93biwgSUVudW1MaXRlTWFwIG1hcHBpbmcpDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50IHJhd1ZhbHVlID0gKGludCkgUmVhZFJhd1ZhcmludDMyKCk7DQorDQorICAgICAgICAgICAgdmFsdWUgPSBtYXBwaW5nLkZpbmRWYWx1ZUJ5TnVtYmVyKHJhd1ZhbHVlKTsNCisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHVua25vd24gPSBudWxsOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdW5rbm93biA9IHJhd1ZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBhbiBlbnVtIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gSWYgdGhlIGVudW0gaXMgdmFsaWQgZm9yIHR5cGUgVCwNCisgICAgICAgIC8vLyB0aGVuIHRoZSByZWYgdmFsdWUgaXMgc2V0IGFuZCBpdCByZXR1cm5zIHRydWUuICBPdGhlcndpc2UgdGhlIHVua25vd24gb3V0cHV0DQorICAgICAgICAvLy8gdmFsdWUgaXMgc2V0IGFuZCB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gICANCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIGJvb2wgUmVhZEVudW08VD4ocmVmIFQgdmFsdWUsIG91dCBvYmplY3QgdW5rbm93bikNCisgICAgICAgICAgICB3aGVyZSBUIDogc3RydWN0LCBJQ29tcGFyYWJsZSwgSUZvcm1hdHRhYmxlDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50IG51bWJlciA9IChpbnQpIFJlYWRSYXdWYXJpbnQzMigpOw0KKyAgICAgICAgICAgIGlmIChFbnVtUGFyc2VyPFQ+LlRyeUNvbnZlcnQobnVtYmVyLCByZWYgdmFsdWUpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdW5rbm93biA9IG51bGw7DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB1bmtub3duID0gbnVtYmVyOw0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBhbiBzZml4ZWQzMiBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgIA0KKyAgICAgICAgcHVibGljIGJvb2wgUmVhZFNGaXhlZDMyKHJlZiBpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgdmFsdWUgPSAoaW50KSBSZWFkUmF3TGl0dGxlRW5kaWFuMzIoKTsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBhbiBzZml4ZWQ2NCBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgIA0KKyAgICAgICAgcHVibGljIGJvb2wgUmVhZFNGaXhlZDY0KHJlZiBsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhbHVlID0gKGxvbmcpIFJlYWRSYXdMaXR0bGVFbmRpYW42NCgpOw0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGFuIHNpbnQzMiBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgIA0KKyAgICAgICAgcHVibGljIGJvb2wgUmVhZFNJbnQzMihyZWYgaW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhbHVlID0gRGVjb2RlWmlnWmFnMzIoUmVhZFJhd1ZhcmludDMyKCkpOw0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGFuIHNpbnQ2NCBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgIA0KKyAgICAgICAgcHVibGljIGJvb2wgUmVhZFNJbnQ2NChyZWYgbG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YWx1ZSA9IERlY29kZVppZ1phZzY0KFJlYWRSYXdWYXJpbnQ2NCgpKTsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgYm9vbCBCZWdpbkFycmF5KHVpbnQgZmllbGRUYWcsIG91dCBib29sIGlzUGFja2VkLCBvdXQgaW50IG9sZExpbWl0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlzUGFja2VkID0gV2lyZUZvcm1hdC5HZXRUYWdXaXJlVHlwZShmaWVsZFRhZykgPT0gV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQ7DQorDQorICAgICAgICAgICAgaWYgKGlzUGFja2VkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpIChSZWFkUmF3VmFyaW50MzIoKSAmIGludC5NYXhWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBvbGRMaW1pdCA9IFB1c2hMaW1pdChsZW5ndGgpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgb2xkTGltaXQgPSAtMTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvL3BhY2tlZCBidXQgZW1wdHkNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgb2xkTGltaXQgPSAtMTsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIG5leHQgdGFnIGlzIGFsc28gcGFydCBvZiB0aGUgc2FtZSB1bnBhY2tlZCBhcnJheS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIGJvb2wgQ29udGludWVBcnJheSh1aW50IGN1cnJlbnRUYWcpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIGlnbm9yZTsNCisgICAgICAgICAgICB1aW50IG5leHQ7DQorICAgICAgICAgICAgaWYgKFBlZWtOZXh0VGFnKG91dCBuZXh0LCBvdXQgaWdub3JlKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChuZXh0ID09IGN1cnJlbnRUYWcpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGhhc05leHRUYWcgPSBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIG5leHQgdGFnIGlzIGFsc28gcGFydCBvZiB0aGUgc2FtZSBhcnJheSwgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgcGFja2VkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgYm9vbCBDb250aW51ZUFycmF5KHVpbnQgY3VycmVudFRhZywgYm9vbCBwYWNrZWQsIGludCBvbGRMaW1pdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAocGFja2VkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKFJlYWNoZWRMaW1pdCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgUG9wTGltaXQob2xkTGltaXQpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBzdHJpbmcgaWdub3JlOw0KKyAgICAgICAgICAgIHVpbnQgbmV4dDsNCisgICAgICAgICAgICBpZiAoUGVla05leHRUYWcob3V0IG5leHQsIG91dCBpZ25vcmUpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gY3VycmVudFRhZykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaGFzTmV4dFRhZyA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkUHJpbWl0aXZlQXJyYXkoRmllbGRUeXBlIGZpZWxkVHlwZSwgdWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248b2JqZWN0PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdpcmVGb3JtYXQuV2lyZVR5cGUgbm9ybWFsID0gV2lyZUZvcm1hdC5HZXRXaXJlVHlwZShmaWVsZFR5cGUpOw0KKyAgICAgICAgICAgIFdpcmVGb3JtYXQuV2lyZVR5cGUgd2Zvcm1hdCA9IFdpcmVGb3JtYXQuR2V0VGFnV2lyZVR5cGUoZmllbGRUYWcpOw0KKw0KKyAgICAgICAgICAgIC8vIDIuMyBhbGxvd3MgcGFja2VkIGZvcm0gZXZlbiBpZiB0aGUgZmllbGQgaXMgbm90IGRlY2xhcmVkIHBhY2tlZC4NCisgICAgICAgICAgICBpZiAobm9ybWFsICE9IHdmb3JtYXQgJiYgd2Zvcm1hdCA9PSBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSAoaW50KSAoUmVhZFJhd1ZhcmludDMyKCkgJiBpbnQuTWF4VmFsdWUpOw0KKyAgICAgICAgICAgICAgICBpbnQgbGltaXQgPSBQdXNoTGltaXQobGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgd2hpbGUgKCFSZWFjaGVkTGltaXQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7DQorICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZFByaW1pdGl2ZUZpZWxkKGZpZWxkVHlwZSwgcmVmIHZhbHVlKSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZCh2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgUG9wTGltaXQobGltaXQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOw0KKyAgICAgICAgICAgICAgICBkbw0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZFByaW1pdGl2ZUZpZWxkKGZpZWxkVHlwZSwgcmVmIHZhbHVlKSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZCh2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKENvbnRpbnVlQXJyYXkoZmllbGRUYWcpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRTdHJpbmdBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxzdHJpbmc+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIHRtcCA9IG51bGw7DQorICAgICAgICAgICAgZG8NCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFJlYWRTdHJpbmcocmVmIHRtcCk7DQorICAgICAgICAgICAgICAgIGxpc3QuQWRkKHRtcCk7DQorICAgICAgICAgICAgfSB3aGlsZSAoQ29udGludWVBcnJheShmaWVsZFRhZykpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkQnl0ZXNBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxCeXRlU3RyaW5nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgdG1wID0gbnVsbDsNCisgICAgICAgICAgICBkbw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgUmVhZEJ5dGVzKHJlZiB0bXApOw0KKyAgICAgICAgICAgICAgICBsaXN0LkFkZCh0bXApOw0KKyAgICAgICAgICAgIH0gd2hpbGUgKENvbnRpbnVlQXJyYXkoZmllbGRUYWcpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZEJvb2xBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxib29sPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJvb2wgaXNQYWNrZWQ7DQorICAgICAgICAgICAgaW50IGhvbGRMaW1pdDsNCisgICAgICAgICAgICBpZiAoQmVnaW5BcnJheShmaWVsZFRhZywgb3V0IGlzUGFja2VkLCBvdXQgaG9sZExpbWl0KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJvb2wgdG1wID0gZmFsc2U7DQorICAgICAgICAgICAgICAgIGRvDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFJlYWRCb29sKHJlZiB0bXApOw0KKyAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQodG1wKTsNCisgICAgICAgICAgICAgICAgfSB3aGlsZSAoQ29udGludWVBcnJheShmaWVsZFRhZywgaXNQYWNrZWQsIGhvbGRMaW1pdCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZEludDMyQXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248aW50PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJvb2wgaXNQYWNrZWQ7DQorICAgICAgICAgICAgaW50IGhvbGRMaW1pdDsNCisgICAgICAgICAgICBpZiAoQmVnaW5BcnJheShmaWVsZFRhZywgb3V0IGlzUGFja2VkLCBvdXQgaG9sZExpbWl0KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGludCB0bXAgPSAwOw0KKyAgICAgICAgICAgICAgICBkbw0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBSZWFkSW50MzIocmVmIHRtcCk7DQorICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZCh0bXApOw0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChDb250aW51ZUFycmF5KGZpZWxkVGFnLCBpc1BhY2tlZCwgaG9sZExpbWl0KSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkU0ludDMyQXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248aW50PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJvb2wgaXNQYWNrZWQ7DQorICAgICAgICAgICAgaW50IGhvbGRMaW1pdDsNCisgICAgICAgICAgICBpZiAoQmVnaW5BcnJheShmaWVsZFRhZywgb3V0IGlzUGFja2VkLCBvdXQgaG9sZExpbWl0KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGludCB0bXAgPSAwOw0KKyAgICAgICAgICAgICAgICBkbw0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBSZWFkU0ludDMyKHJlZiB0bXApOw0KKyAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQodG1wKTsNCisgICAgICAgICAgICAgICAgfSB3aGlsZSAoQ29udGludWVBcnJheShmaWVsZFRhZywgaXNQYWNrZWQsIGhvbGRMaW1pdCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZFVJbnQzMkFycmF5KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPHVpbnQ+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgYm9vbCBpc1BhY2tlZDsNCisgICAgICAgICAgICBpbnQgaG9sZExpbWl0Ow0KKyAgICAgICAgICAgIGlmIChCZWdpbkFycmF5KGZpZWxkVGFnLCBvdXQgaXNQYWNrZWQsIG91dCBob2xkTGltaXQpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdWludCB0bXAgPSAwOw0KKyAgICAgICAgICAgICAgICBkbw0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBSZWFkVUludDMyKHJlZiB0bXApOw0KKyAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQodG1wKTsNCisgICAgICAgICAgICAgICAgfSB3aGlsZSAoQ29udGludWVBcnJheShmaWVsZFRhZywgaXNQYWNrZWQsIGhvbGRMaW1pdCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZEZpeGVkMzJBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjx1aW50PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJvb2wgaXNQYWNrZWQ7DQorICAgICAgICAgICAgaW50IGhvbGRMaW1pdDsNCisgICAgICAgICAgICBpZiAoQmVnaW5BcnJheShmaWVsZFRhZywgb3V0IGlzUGFja2VkLCBvdXQgaG9sZExpbWl0KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHVpbnQgdG1wID0gMDsNCisgICAgICAgICAgICAgICAgZG8NCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgUmVhZEZpeGVkMzIocmVmIHRtcCk7DQorICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZCh0bXApOw0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChDb250aW51ZUFycmF5KGZpZWxkVGFnLCBpc1BhY2tlZCwgaG9sZExpbWl0KSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkU0ZpeGVkMzJBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxpbnQ+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgYm9vbCBpc1BhY2tlZDsNCisgICAgICAgICAgICBpbnQgaG9sZExpbWl0Ow0KKyAgICAgICAgICAgIGlmIChCZWdpbkFycmF5KGZpZWxkVGFnLCBvdXQgaXNQYWNrZWQsIG91dCBob2xkTGltaXQpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW50IHRtcCA9IDA7DQorICAgICAgICAgICAgICAgIGRvDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFJlYWRTRml4ZWQzMihyZWYgdG1wKTsNCisgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKHRtcCk7DQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKENvbnRpbnVlQXJyYXkoZmllbGRUYWcsIGlzUGFja2VkLCBob2xkTGltaXQpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRJbnQ2NEFycmF5KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPGxvbmc+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgYm9vbCBpc1BhY2tlZDsNCisgICAgICAgICAgICBpbnQgaG9sZExpbWl0Ow0KKyAgICAgICAgICAgIGlmIChCZWdpbkFycmF5KGZpZWxkVGFnLCBvdXQgaXNQYWNrZWQsIG91dCBob2xkTGltaXQpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbG9uZyB0bXAgPSAwOw0KKyAgICAgICAgICAgICAgICBkbw0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBSZWFkSW50NjQocmVmIHRtcCk7DQorICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZCh0bXApOw0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChDb250aW51ZUFycmF5KGZpZWxkVGFnLCBpc1BhY2tlZCwgaG9sZExpbWl0KSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkU0ludDY0QXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248bG9uZz4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBib29sIGlzUGFja2VkOw0KKyAgICAgICAgICAgIGludCBob2xkTGltaXQ7DQorICAgICAgICAgICAgaWYgKEJlZ2luQXJyYXkoZmllbGRUYWcsIG91dCBpc1BhY2tlZCwgb3V0IGhvbGRMaW1pdCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBsb25nIHRtcCA9IDA7DQorICAgICAgICAgICAgICAgIGRvDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFJlYWRTSW50NjQocmVmIHRtcCk7DQorICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZCh0bXApOw0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChDb250aW51ZUFycmF5KGZpZWxkVGFnLCBpc1BhY2tlZCwgaG9sZExpbWl0KSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkVUludDY0QXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248dWxvbmc+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgYm9vbCBpc1BhY2tlZDsNCisgICAgICAgICAgICBpbnQgaG9sZExpbWl0Ow0KKyAgICAgICAgICAgIGlmIChCZWdpbkFycmF5KGZpZWxkVGFnLCBvdXQgaXNQYWNrZWQsIG91dCBob2xkTGltaXQpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdWxvbmcgdG1wID0gMDsNCisgICAgICAgICAgICAgICAgZG8NCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgUmVhZFVJbnQ2NChyZWYgdG1wKTsNCisgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKHRtcCk7DQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKENvbnRpbnVlQXJyYXkoZmllbGRUYWcsIGlzUGFja2VkLCBob2xkTGltaXQpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRGaXhlZDY0QXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248dWxvbmc+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgYm9vbCBpc1BhY2tlZDsNCisgICAgICAgICAgICBpbnQgaG9sZExpbWl0Ow0KKyAgICAgICAgICAgIGlmIChCZWdpbkFycmF5KGZpZWxkVGFnLCBvdXQgaXNQYWNrZWQsIG91dCBob2xkTGltaXQpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdWxvbmcgdG1wID0gMDsNCisgICAgICAgICAgICAgICAgZG8NCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgUmVhZEZpeGVkNjQocmVmIHRtcCk7DQorICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZCh0bXApOw0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChDb250aW51ZUFycmF5KGZpZWxkVGFnLCBpc1BhY2tlZCwgaG9sZExpbWl0KSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkU0ZpeGVkNjRBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxsb25nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJvb2wgaXNQYWNrZWQ7DQorICAgICAgICAgICAgaW50IGhvbGRMaW1pdDsNCisgICAgICAgICAgICBpZiAoQmVnaW5BcnJheShmaWVsZFRhZywgb3V0IGlzUGFja2VkLCBvdXQgaG9sZExpbWl0KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGxvbmcgdG1wID0gMDsNCisgICAgICAgICAgICAgICAgZG8NCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgUmVhZFNGaXhlZDY0KHJlZiB0bXApOw0KKyAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQodG1wKTsNCisgICAgICAgICAgICAgICAgfSB3aGlsZSAoQ29udGludWVBcnJheShmaWVsZFRhZywgaXNQYWNrZWQsIGhvbGRMaW1pdCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZERvdWJsZUFycmF5KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPGRvdWJsZT4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBib29sIGlzUGFja2VkOw0KKyAgICAgICAgICAgIGludCBob2xkTGltaXQ7DQorICAgICAgICAgICAgaWYgKEJlZ2luQXJyYXkoZmllbGRUYWcsIG91dCBpc1BhY2tlZCwgb3V0IGhvbGRMaW1pdCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBkb3VibGUgdG1wID0gMDsNCisgICAgICAgICAgICAgICAgZG8NCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgUmVhZERvdWJsZShyZWYgdG1wKTsNCisgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKHRtcCk7DQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKENvbnRpbnVlQXJyYXkoZmllbGRUYWcsIGlzUGFja2VkLCBob2xkTGltaXQpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRGbG9hdEFycmF5KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPGZsb2F0PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJvb2wgaXNQYWNrZWQ7DQorICAgICAgICAgICAgaW50IGhvbGRMaW1pdDsNCisgICAgICAgICAgICBpZiAoQmVnaW5BcnJheShmaWVsZFRhZywgb3V0IGlzUGFja2VkLCBvdXQgaG9sZExpbWl0KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGZsb2F0IHRtcCA9IDA7DQorICAgICAgICAgICAgICAgIGRvDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFJlYWRGbG9hdChyZWYgdG1wKTsNCisgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKHRtcCk7DQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKENvbnRpbnVlQXJyYXkoZmllbGRUYWcsIGlzUGFja2VkLCBob2xkTGltaXQpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRFbnVtQXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248SUVudW1MaXRlPiBsaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgSUNvbGxlY3Rpb248b2JqZWN0PiB1bmtub3duLCBJRW51bUxpdGVNYXAgbWFwcGluZykNCisgICAgICAgIHsNCisgICAgICAgICAgICB1bmtub3duID0gbnVsbDsNCisgICAgICAgICAgICBvYmplY3QgdW5rdmFsOw0KKyAgICAgICAgICAgIElFbnVtTGl0ZSB2YWx1ZSA9IG51bGw7DQorICAgICAgICAgICAgV2lyZUZvcm1hdC5XaXJlVHlwZSB3Zm9ybWF0ID0gV2lyZUZvcm1hdC5HZXRUYWdXaXJlVHlwZShmaWVsZFRhZyk7DQorDQorICAgICAgICAgICAgLy8gMi4zIGFsbG93cyBwYWNrZWQgZm9ybSBldmVuIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVjbGFyZWQgcGFja2VkLg0KKyAgICAgICAgICAgIGlmICh3Zm9ybWF0ID09IFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpIChSZWFkUmF3VmFyaW50MzIoKSAmIGludC5NYXhWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGludCBsaW1pdCA9IFB1c2hMaW1pdChsZW5ndGgpOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoIVJlYWNoZWRMaW1pdCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWRFbnVtKHJlZiB2YWx1ZSwgb3V0IHVua3ZhbCwgbWFwcGluZykpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQodmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duID0gbmV3IExpc3Q8b2JqZWN0PigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duLkFkZCh1bmt2YWwpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIFBvcExpbWl0KGxpbWl0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZG8NCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWRFbnVtKHJlZiB2YWx1ZSwgb3V0IHVua3ZhbCwgbWFwcGluZykpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQodmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duID0gbmV3IExpc3Q8b2JqZWN0PigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duLkFkZCh1bmt2YWwpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChDb250aW51ZUFycmF5KGZpZWxkVGFnKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkRW51bUFycmF5PFQ+KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPFQ+IGxpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd24pDQorICAgICAgICAgICAgd2hlcmUgVCA6IHN0cnVjdCwgSUNvbXBhcmFibGUsIElGb3JtYXR0YWJsZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHVua25vd24gPSBudWxsOw0KKyAgICAgICAgICAgIG9iamVjdCB1bmt2YWw7DQorICAgICAgICAgICAgVCB2YWx1ZSA9IGRlZmF1bHQoVCk7DQorICAgICAgICAgICAgV2lyZUZvcm1hdC5XaXJlVHlwZSB3Zm9ybWF0ID0gV2lyZUZvcm1hdC5HZXRUYWdXaXJlVHlwZShmaWVsZFRhZyk7DQorDQorICAgICAgICAgICAgLy8gMi4zIGFsbG93cyBwYWNrZWQgZm9ybSBldmVuIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVjbGFyZWQgcGFja2VkLg0KKyAgICAgICAgICAgIGlmICh3Zm9ybWF0ID09IFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpIChSZWFkUmF3VmFyaW50MzIoKSAmIGludC5NYXhWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGludCBsaW1pdCA9IFB1c2hMaW1pdChsZW5ndGgpOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoIVJlYWNoZWRMaW1pdCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWRFbnVtPFQ+KHJlZiB2YWx1ZSwgb3V0IHVua3ZhbCkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQodmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duID0gbmV3IExpc3Q8b2JqZWN0PigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duLkFkZCh1bmt2YWwpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIFBvcExpbWl0KGxpbWl0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZG8NCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWRFbnVtKHJlZiB2YWx1ZSwgb3V0IHVua3ZhbCkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQodmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duID0gbmV3IExpc3Q8b2JqZWN0PigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duLkFkZCh1bmt2YWwpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChDb250aW51ZUFycmF5KGZpZWxkVGFnKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkTWVzc2FnZUFycmF5PFQ+KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPFQ+IGxpc3QsIFQgbWVzc2FnZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB3aGVyZSBUIDogSU1lc3NhZ2VMaXRlDQorICAgICAgICB7DQorICAgICAgICAgICAgZG8NCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIElCdWlsZGVyTGl0ZSBidWlsZGVyID0gbWVzc2FnZVR5cGUuV2Vha0NyZWF0ZUJ1aWxkZXJGb3JUeXBlKCk7DQorICAgICAgICAgICAgICAgIFJlYWRNZXNzYWdlKGJ1aWxkZXIsIHJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgbGlzdC5BZGQoKFQpIGJ1aWxkZXIuV2Vha0J1aWxkUGFydGlhbCgpKTsNCisgICAgICAgICAgICB9IHdoaWxlIChDb250aW51ZUFycmF5KGZpZWxkVGFnKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRHcm91cEFycmF5PFQ+KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPFQ+IGxpc3QsIFQgbWVzc2FnZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgd2hlcmUgVCA6IElNZXNzYWdlTGl0ZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGRvDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBJQnVpbGRlckxpdGUgYnVpbGRlciA9IG1lc3NhZ2VUeXBlLldlYWtDcmVhdGVCdWlsZGVyRm9yVHlwZSgpOw0KKyAgICAgICAgICAgICAgICBSZWFkR3JvdXAoV2lyZUZvcm1hdC5HZXRUYWdGaWVsZE51bWJlcihmaWVsZFRhZyksIGJ1aWxkZXIsIHJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgbGlzdC5BZGQoKFQpIGJ1aWxkZXIuV2Vha0J1aWxkUGFydGlhbCgpKTsNCisgICAgICAgICAgICB9IHdoaWxlIChDb250aW51ZUFycmF5KGZpZWxkVGFnKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYSBmaWVsZCBvZiBhbnkgcHJpbWl0aXZlIHR5cGUuIEVudW1zLCBncm91cHMgYW5kIGVtYmVkZGVkDQorICAgICAgICAvLy8gbWVzc2FnZXMgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoaXMgbWV0aG9kLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBib29sIFJlYWRQcmltaXRpdmVGaWVsZChGaWVsZFR5cGUgZmllbGRUeXBlLCByZWYgb2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRG91YmxlOg0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0bXAgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWFkRG91YmxlKHJlZiB0bXApKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0bXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZsb2F0Og0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRtcCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWRGbG9hdChyZWYgdG1wKSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG1wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRtcCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWRJbnQ2NChyZWYgdG1wKSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG1wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50NjQ6DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdWxvbmcgdG1wID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZFVJbnQ2NChyZWYgdG1wKSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG1wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG1wID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZEludDMyKHJlZiB0bXApKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0bXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkNjQ6DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdWxvbmcgdG1wID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZEZpeGVkNjQocmVmIHRtcCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRtcDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRml4ZWQzMjoNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50IHRtcCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWRGaXhlZDMyKHJlZiB0bXApKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0bXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkJvb2w6DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0bXAgPSBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZEJvb2wocmVmIHRtcCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRtcDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU3RyaW5nOg0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0bXAgPSBudWxsOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWFkU3RyaW5nKHJlZiB0bXApKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0bXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkJ5dGVzOg0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcgdG1wID0gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZEJ5dGVzKHJlZiB0bXApKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0bXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50IHRtcCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWRVSW50MzIocmVmIHRtcCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRtcDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRtcCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWRTRml4ZWQzMihyZWYgdG1wKSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG1wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TRml4ZWQ2NDoNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRtcCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWRTRml4ZWQ2NChyZWYgdG1wKSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG1wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TSW50MzI6DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRtcCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWRTSW50MzIocmVmIHRtcCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRtcDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ludDY0Og0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdG1wID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZFNJbnQ2NChyZWYgdG1wKSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG1wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Hcm91cDoNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiUmVhZFByaW1pdGl2ZUZpZWxkKCkgY2Fubm90IGhhbmRsZSBuZXN0ZWQgZ3JvdXBzLiIpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5NZXNzYWdlOg0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJSZWFkUHJpbWl0aXZlRmllbGQoKSBjYW5ub3QgaGFuZGxlIGVtYmVkZGVkIG1lc3NhZ2VzLiIpOw0KKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGFuZGxlIGVudW1zIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGlmIHRoZQ0KKyAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgbm90IHJlY29nbml6ZWQuDQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkVudW06DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlJlYWRQcmltaXRpdmVGaWVsZCgpIGNhbm5vdCBoYW5kbGUgZW51bXMuIik7DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJJbnZhbGlkIGZpZWxkIHR5cGUgIiArIGZpZWxkVHlwZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgI3JlZ2lvbiBVbmRlcmx5aW5nIHJlYWRpbmcgcHJpbWl0aXZlcw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNhbWUgY29kZSBhcyBSZWFkUmF3VmFyaW50MzIsIGJ1dCByZWFkIGVhY2ggYnl0ZSBpbmRpdmlkdWFsbHksIGNoZWNraW5nIGZvcg0KKyAgICAgICAgLy8vIGJ1ZmZlciBvdmVyZmxvdy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHVpbnQgU2xvd1JlYWRSYXdWYXJpbnQzMigpDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50IHRtcCA9IFJlYWRSYXdCeXRlKCk7DQorICAgICAgICAgICAgaWYgKHRtcCA8IDEyOCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiAodWludCkgdG1wOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gdG1wICYgMHg3ZjsNCisgICAgICAgICAgICBpZiAoKHRtcCA9IFJlYWRSYXdCeXRlKCkpIDwgMTI4KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0IHw9IHRtcCA8PCA3Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHRtcCAmIDB4N2YpIDw8IDc7DQorICAgICAgICAgICAgICAgIGlmICgodG1wID0gUmVhZFJhd0J5dGUoKSkgPCAxMjgpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSB0bXAgPDwgMTQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHRtcCAmIDB4N2YpIDw8IDE0Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0bXAgPSBSZWFkUmF3Qnl0ZSgpKSA8IDEyOCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gdG1wIDw8IDIxOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAodG1wICYgMHg3ZikgPDwgMjE7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh0bXAgPSBSZWFkUmF3Qnl0ZSgpKSA8PCAyODsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID49IDEyOCkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgdXBwZXIgMzIgYml0cy4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWFkUmF3Qnl0ZSgpIDwgMTI4KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludCkgcmVzdWx0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5NYWxmb3JtZWRWYXJpbnQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuICh1aW50KSByZXN1bHQ7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZCBhIHJhdyBWYXJpbnQgZnJvbSB0aGUgc3RyZWFtLiAgSWYgbGFyZ2VyIHRoYW4gMzIgYml0cywgZGlzY2FyZCB0aGUgdXBwZXIgYml0cy4NCisgICAgICAgIC8vLyBUaGlzIG1ldGhvZCBpcyBvcHRpbWlzZWQgZm9yIHRoZSBjYXNlIHdoZXJlIHdlJ3ZlIGdvdCBsb3RzIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlci4NCisgICAgICAgIC8vLyBUaGF0IG1lYW5zIHdlIGNhbiBjaGVjayB0aGUgc2l6ZSBqdXN0IG9uY2UsIHRoZW4ganVzdCByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGJ1ZmZlcg0KKyAgICAgICAgLy8vIHdpdGhvdXQgY29uc3RhbnQgcmVjaGVja2luZyBvZiB0aGUgYnVmZmVyIGxlbmd0aC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB1aW50IFJlYWRSYXdWYXJpbnQzMigpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGJ1ZmZlclBvcyArIDUgPiBidWZmZXJTaXplKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFNsb3dSZWFkUmF3VmFyaW50MzIoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaW50IHRtcCA9IGJ1ZmZlcltidWZmZXJQb3MrK107DQorICAgICAgICAgICAgaWYgKHRtcCA8IDEyOCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiAodWludCkgdG1wOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gdG1wICYgMHg3ZjsNCisgICAgICAgICAgICBpZiAoKHRtcCA9IGJ1ZmZlcltidWZmZXJQb3MrK10pIDwgMTI4KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0IHw9IHRtcCA8PCA3Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHRtcCAmIDB4N2YpIDw8IDc7DQorICAgICAgICAgICAgICAgIGlmICgodG1wID0gYnVmZmVyW2J1ZmZlclBvcysrXSkgPCAxMjgpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSB0bXAgPDwgMTQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHRtcCAmIDB4N2YpIDw8IDE0Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0bXAgPSBidWZmZXJbYnVmZmVyUG9zKytdKSA8IDEyOCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gdG1wIDw8IDIxOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAodG1wICYgMHg3ZikgPDwgMjE7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh0bXAgPSBidWZmZXJbYnVmZmVyUG9zKytdKSA8PCAyODsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID49IDEyOCkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgdXBwZXIgMzIgYml0cy4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgaGFzIHRvIHVzZSBSZWFkUmF3Qnl0ZSgpIGFzIHdlIG9ubHkgZW5zdXJlIHdlJ3ZlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvdCBhdCBsZWFzdCA1IGJ5dGVzIGF0IHRoZSBzdGFydCBvZiB0aGUgbWV0aG9kLiBUaGlzIGxldHMgdXMNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBmYXN0IHBhdGggaW4gbW9yZSBjYXNlcywgYW5kIHdlIHJhcmVseSBoaXQgdGhpcyBzZWN0aW9uIG9mIGNvZGUuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZFJhd0J5dGUoKSA8IDEyOCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHVpbnQpIHJlc3VsdDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uTWFsZm9ybWVkVmFyaW50KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiAodWludCkgcmVzdWx0Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGEgdmFyaW50IGZyb20gdGhlIGlucHV0IG9uZSBieXRlIGF0IGEgdGltZSwgc28gdGhhdCBpdCBkb2VzIG5vdA0KKyAgICAgICAgLy8vIHJlYWQgYW55IGJ5dGVzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHZhcmludC4gSWYgeW91IHNpbXBseSB3cmFwcGVkIHRoZQ0KKyAgICAgICAgLy8vIHN0cmVhbSBpbiBhIENvZGVkSW5wdXRTdHJlYW0gYW5kIHVzZWQgUmVhZFJhd1ZhcmludDMyKFN0cmVhbSl9DQorICAgICAgICAvLy8gdGhlbiB5b3Ugd291bGQgcHJvYmFibHkgZW5kIHVwIHJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSB2YXJpbnQgc2luY2UNCisgICAgICAgIC8vLyBDb2RlZElucHV0U3RyZWFtIGJ1ZmZlcnMgaXRzIGlucHV0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXQiPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgc3RhdGljIHVpbnQgUmVhZFJhd1ZhcmludDMyKFN0cmVhbSBpbnB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gMDsNCisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsNCisgICAgICAgICAgICBmb3IgKDsgb2Zmc2V0IDwgMzI7IG9mZnNldCArPSA3KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW50IGIgPSBpbnB1dC5SZWFkQnl0ZSgpOw0KKyAgICAgICAgICAgICAgICBpZiAoYiA9PSAtMSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLlRydW5jYXRlZE1lc3NhZ2UoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gKGIgJiAweDdmKSA8PCBvZmZzZXQ7DQorICAgICAgICAgICAgICAgIGlmICgoYiAmIDB4ODApID09IDApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludCkgcmVzdWx0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIC8vIEtlZXAgcmVhZGluZyB1cCB0byA2NCBiaXRzLg0KKyAgICAgICAgICAgIGZvciAoOyBvZmZzZXQgPCA2NDsgb2Zmc2V0ICs9IDcpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpbnQgYiA9IGlucHV0LlJlYWRCeXRlKCk7DQorICAgICAgICAgICAgICAgIGlmIChiID09IC0xKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uVHJ1bmNhdGVkTWVzc2FnZSgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmICgoYiAmIDB4ODApID09IDApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludCkgcmVzdWx0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5NYWxmb3JtZWRWYXJpbnQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkIGEgcmF3IHZhcmludCBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdWxvbmcgUmVhZFJhd1ZhcmludDY0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgc2hpZnQgPSAwOw0KKyAgICAgICAgICAgIHVsb25nIHJlc3VsdCA9IDA7DQorICAgICAgICAgICAgd2hpbGUgKHNoaWZ0IDwgNjQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBieXRlIGIgPSBSZWFkUmF3Qnl0ZSgpOw0KKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHVsb25nKSAoYiAmIDB4N0YpIDw8IHNoaWZ0Ow0KKyAgICAgICAgICAgICAgICBpZiAoKGIgJiAweDgwKSA9PSAwKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDc7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5NYWxmb3JtZWRWYXJpbnQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkIGEgMzItYml0IGxpdHRsZS1lbmRpYW4gaW50ZWdlciBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdWludCBSZWFkUmF3TGl0dGxlRW5kaWFuMzIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHVpbnQgYjEgPSBSZWFkUmF3Qnl0ZSgpOw0KKyAgICAgICAgICAgIHVpbnQgYjIgPSBSZWFkUmF3Qnl0ZSgpOw0KKyAgICAgICAgICAgIHVpbnQgYjMgPSBSZWFkUmF3Qnl0ZSgpOw0KKyAgICAgICAgICAgIHVpbnQgYjQgPSBSZWFkUmF3Qnl0ZSgpOw0KKyAgICAgICAgICAgIHJldHVybiBiMSB8IChiMiA8PCA4KSB8IChiMyA8PCAxNikgfCAoYjQgPDwgMjQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWQgYSA2NC1iaXQgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB1bG9uZyBSZWFkUmF3TGl0dGxlRW5kaWFuNjQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHVsb25nIGIxID0gUmVhZFJhd0J5dGUoKTsNCisgICAgICAgICAgICB1bG9uZyBiMiA9IFJlYWRSYXdCeXRlKCk7DQorICAgICAgICAgICAgdWxvbmcgYjMgPSBSZWFkUmF3Qnl0ZSgpOw0KKyAgICAgICAgICAgIHVsb25nIGI0ID0gUmVhZFJhd0J5dGUoKTsNCisgICAgICAgICAgICB1bG9uZyBiNSA9IFJlYWRSYXdCeXRlKCk7DQorICAgICAgICAgICAgdWxvbmcgYjYgPSBSZWFkUmF3Qnl0ZSgpOw0KKyAgICAgICAgICAgIHVsb25nIGI3ID0gUmVhZFJhd0J5dGUoKTsNCisgICAgICAgICAgICB1bG9uZyBiOCA9IFJlYWRSYXdCeXRlKCk7DQorICAgICAgICAgICAgcmV0dXJuIGIxIHwgKGIyIDw8IDgpIHwgKGIzIDw8IDE2KSB8IChiNCA8PCAyNCkNCisgICAgICAgICAgICAgICAgICAgfCAoYjUgPDwgMzIpIHwgKGI2IDw8IDQwKSB8IChiNyA8PCA0OCkgfCAoYjggPDwgNTYpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIERlY29kZSBhIDMyLWJpdCB2YWx1ZSB3aXRoIFppZ1phZyBlbmNvZGluZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+DQorICAgICAgICAvLy8gWmlnWmFnIGVuY29kZXMgc2lnbmVkIGludGVnZXJzIGludG8gdmFsdWVzIHRoYXQgY2FuIGJlIGVmZmljaWVudGx5DQorICAgICAgICAvLy8gZW5jb2RlZCB3aXRoIHZhcmludC4gIChPdGhlcndpc2UsIG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIA0KKyAgICAgICAgLy8vIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cyB0byBiZSB2YXJpbnQgZW5jb2RlZCwgdGh1cyBhbHdheXMgdGFraW5nDQorICAgICAgICAvLy8gMTAgYnl0ZXMgb24gdGhlIHdpcmUuKQ0KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgRGVjb2RlWmlnWmFnMzIodWludCBuKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiAoaW50KSAobiA+PiAxKSBeIC0oaW50KSAobiAmIDEpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIERlY29kZSBhIDMyLWJpdCB2YWx1ZSB3aXRoIFppZ1phZyBlbmNvZGluZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+DQorICAgICAgICAvLy8gWmlnWmFnIGVuY29kZXMgc2lnbmVkIGludGVnZXJzIGludG8gdmFsdWVzIHRoYXQgY2FuIGJlIGVmZmljaWVudGx5DQorICAgICAgICAvLy8gZW5jb2RlZCB3aXRoIHZhcmludC4gIChPdGhlcndpc2UsIG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIA0KKyAgICAgICAgLy8vIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cyB0byBiZSB2YXJpbnQgZW5jb2RlZCwgdGh1cyBhbHdheXMgdGFraW5nDQorICAgICAgICAvLy8gMTAgYnl0ZXMgb24gdGhlIHdpcmUuKQ0KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBsb25nIERlY29kZVppZ1phZzY0KHVsb25nIG4pDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIChsb25nKSAobiA+PiAxKSBeIC0obG9uZykgKG4gJiAxKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXQgdGhlIG1heGltdW0gbWVzc2FnZSByZWN1cnNpb24gZGVwdGguDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPg0KKyAgICAgICAgLy8vIEluIG9yZGVyIHRvIHByZXZlbnQgbWFsaWNpb3VzDQorICAgICAgICAvLy8gbWVzc2FnZXMgZnJvbSBjYXVzaW5nIHN0YWNrIG92ZXJmbG93cywgQ29kZWRJbnB1dFN0cmVhbSBsaW1pdHMNCisgICAgICAgIC8vLyBob3cgZGVlcGx5IG1lc3NhZ2VzIG1heSBiZSBuZXN0ZWQuICBUaGUgZGVmYXVsdCBsaW1pdCBpcyA2NC4NCisgICAgICAgIC8vLyA8L3JlbWFya3M+DQorICAgICAgICBwdWJsaWMgaW50IFNldFJlY3Vyc2lvbkxpbWl0KGludCBsaW1pdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAobGltaXQgPCAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiUmVjdXJzaW9uIGxpbWl0IGNhbm5vdCBiZSBuZWdhdGl2ZTogIiArIGxpbWl0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaW50IG9sZExpbWl0ID0gcmVjdXJzaW9uTGltaXQ7DQorICAgICAgICAgICAgcmVjdXJzaW9uTGltaXQgPSBsaW1pdDsNCisgICAgICAgICAgICByZXR1cm4gb2xkTGltaXQ7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gU2V0IHRoZSBtYXhpbXVtIG1lc3NhZ2Ugc2l6ZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+DQorICAgICAgICAvLy8gSW4gb3JkZXIgdG8gcHJldmVudCBtYWxpY2lvdXMgbWVzc2FnZXMgZnJvbSBleGhhdXN0aW5nIG1lbW9yeSBvcg0KKyAgICAgICAgLy8vIGNhdXNpbmcgaW50ZWdlciBvdmVyZmxvd3MsIENvZGVkSW5wdXRTdHJlYW0gbGltaXRzIGhvdyBsYXJnZSBhIG1lc3NhZ2UgbWF5IGJlLg0KKyAgICAgICAgLy8vIFRoZSBkZWZhdWx0IGxpbWl0IGlzIDY0TUIuICBZb3Ugc2hvdWxkIHNldCB0aGlzIGxpbWl0IGFzIHNtYWxsDQorICAgICAgICAvLy8gYXMgeW91IGNhbiB3aXRob3V0IGhhcm1pbmcgeW91ciBhcHAncyBmdW5jdGlvbmFsaXR5LiAgTm90ZSB0aGF0DQorICAgICAgICAvLy8gc2l6ZSBsaW1pdHMgb25seSBhcHBseSB3aGVuIHJlYWRpbmcgZnJvbSBhbiBJbnB1dFN0cmVhbSwgbm90DQorICAgICAgICAvLy8gd2hlbiBjb25zdHJ1Y3RlZCBhcm91bmQgYSByYXcgYnl0ZSBhcnJheSAobm9yIHdpdGggQnl0ZVN0cmluZy5OZXdDb2RlZElucHV0KS4NCisgICAgICAgIC8vLyBJZiB5b3Ugd2FudCB0byByZWFkIHNldmVyYWwgbWVzc2FnZXMgZnJvbSBhIHNpbmdsZSBDb2RlZElucHV0U3RyZWFtLCB5b3UNCisgICAgICAgIC8vLyBjYW4gY2FsbCBSZXNldFNpemVDb3VudGVyKCkgYWZ0ZXIgZWFjaCBtZXNzYWdlIHRvIGF2b2lkIGhpdHRpbmcgdGhlDQorICAgICAgICAvLy8gc2l6ZSBsaW1pdC4NCisgICAgICAgIC8vLyA8L3JlbWFya3M+DQorICAgICAgICBwdWJsaWMgaW50IFNldFNpemVMaW1pdChpbnQgbGltaXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGxpbWl0IDwgMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlNpemUgbGltaXQgY2Fubm90IGJlIG5lZ2F0aXZlOiAiICsgbGltaXQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpbnQgb2xkTGltaXQgPSBzaXplTGltaXQ7DQorICAgICAgICAgICAgc2l6ZUxpbWl0ID0gbGltaXQ7DQorICAgICAgICAgICAgcmV0dXJuIG9sZExpbWl0Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI3JlZ2lvbiBJbnRlcm5hbCByZWFkaW5nIGFuZCBidWZmZXIgbWFuYWdlbWVudA0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlc2V0cyB0aGUgY3VycmVudCBzaXplIGNvdW50ZXIgdG8gemVybyAoc2VlIFNldFNpemVMaW1pdCkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgUmVzZXRTaXplQ291bnRlcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgdG90YWxCeXRlc1JldGlyZWQgPSAwOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNldHMgY3VycmVudExpbWl0IHRvIChjdXJyZW50IHBvc2l0aW9uKSArIGJ5dGVMaW1pdC4gVGhpcyBpcyBjYWxsZWQNCisgICAgICAgIC8vLyB3aGVuIGRlc2NlbmRpbmcgaW50byBhIGxlbmd0aC1kZWxpbWl0ZWQgZW1iZWRkZWQgbWVzc2FnZS4gVGhlIHByZXZpb3VzDQorICAgICAgICAvLy8gbGltaXQgaXMgcmV0dXJuZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBvbGQgbGltaXQuPC9yZXR1cm5zPg0KKyAgICAgICAgcHVibGljIGludCBQdXNoTGltaXQoaW50IGJ5dGVMaW1pdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoYnl0ZUxpbWl0IDwgMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5OZWdhdGl2ZVNpemUoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnl0ZUxpbWl0ICs9IHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyUG9zOw0KKyAgICAgICAgICAgIGludCBvbGRMaW1pdCA9IGN1cnJlbnRMaW1pdDsNCisgICAgICAgICAgICBpZiAoYnl0ZUxpbWl0ID4gb2xkTGltaXQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uVHJ1bmNhdGVkTWVzc2FnZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjdXJyZW50TGltaXQgPSBieXRlTGltaXQ7DQorDQorICAgICAgICAgICAgUmVjb21wdXRlQnVmZmVyU2l6ZUFmdGVyTGltaXQoKTsNCisNCisgICAgICAgICAgICByZXR1cm4gb2xkTGltaXQ7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHZvaWQgUmVjb21wdXRlQnVmZmVyU2l6ZUFmdGVyTGltaXQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJ1ZmZlclNpemUgKz0gYnVmZmVyU2l6ZUFmdGVyTGltaXQ7DQorICAgICAgICAgICAgaW50IGJ1ZmZlckVuZCA9IHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyU2l6ZTsNCisgICAgICAgICAgICBpZiAoYnVmZmVyRW5kID4gY3VycmVudExpbWl0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gTGltaXQgaXMgaW4gY3VycmVudCBidWZmZXIuDQorICAgICAgICAgICAgICAgIGJ1ZmZlclNpemVBZnRlckxpbWl0ID0gYnVmZmVyRW5kIC0gY3VycmVudExpbWl0Ow0KKyAgICAgICAgICAgICAgICBidWZmZXJTaXplIC09IGJ1ZmZlclNpemVBZnRlckxpbWl0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBidWZmZXJTaXplQWZ0ZXJMaW1pdCA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIERpc2NhcmRzIHRoZSBjdXJyZW50IGxpbWl0LCByZXR1cm5pbmcgdGhlIHByZXZpb3VzIGxpbWl0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFBvcExpbWl0KGludCBvbGRMaW1pdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBjdXJyZW50TGltaXQgPSBvbGRMaW1pdDsNCisgICAgICAgICAgICBSZWNvbXB1dGVCdWZmZXJTaXplQWZ0ZXJMaW1pdCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgd2hldGhlciBvciBub3QgYWxsIHRoZSBkYXRhIGJlZm9yZSB0aGUgbGltaXQgaGFzIGJlZW4gcmVhZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgcHVibGljIGJvb2wgUmVhY2hlZExpbWl0DQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudExpbWl0ID09IGludC5NYXhWYWx1ZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGludCBjdXJyZW50QWJzb2x1dGVQb3NpdGlvbiA9IHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyUG9zOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEFic29sdXRlUG9zaXRpb24gPj0gY3VycmVudExpbWl0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyB0aGUNCisgICAgICAgIC8vLyBjYXNlIGlmIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB1bmRlcmx5aW5nIGlucHV0IHNvdXJjZSBoYXMgYmVlbiByZWFjaGVkIG9yDQorICAgICAgICAvLy8gdGhlIHN0cmVhbSBoYXMgcmVhY2hlZCBhIGxpbWl0IGNyZWF0ZWQgdXNpbmcgUHVzaExpbWl0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBib29sIElzQXRFbmQNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gYnVmZmVyUG9zID09IGJ1ZmZlclNpemUgJiYgIVJlZmlsbEJ1ZmZlcihmYWxzZSk7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDYWxsZWQgd2hlbiBidWZmZXIgaXMgZW1wdHkgdG8gcmVhZCBtb3JlIGJ5dGVzIGZyb20gdGhlDQorICAgICAgICAvLy8gaW5wdXQuICBJZiA8cGFyYW1yZWYgbmFtZT0ibXVzdFN1Y2NlZWQiLz4gaXMgdHJ1ZSwgUmVmaWxsQnVmZmVyKCkgZ3VyYW50ZWVzIHRoYXQNCisgICAgICAgIC8vLyBlaXRoZXIgdGhlcmUgd2lsbCBiZSBhdCBsZWFzdCBvbmUgYnl0ZSBpbiB0aGUgYnVmZmVyIHdoZW4gaXQgcmV0dXJucw0KKyAgICAgICAgLy8vIG9yIGl0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLiAgSWYgPHBhcmFtcmVmIG5hbWU9Im11c3RTdWNjZWVkIi8+IGlzIGZhbHNlLA0KKyAgICAgICAgLy8vIFJlZmlsbEJ1ZmZlcigpIHJldHVybnMgZmFsc2UgaWYgbm8gbW9yZSBieXRlcyB3ZXJlIGF2YWlsYWJsZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im11c3RTdWNjZWVkIj48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIHByaXZhdGUgYm9vbCBSZWZpbGxCdWZmZXIoYm9vbCBtdXN0U3VjY2VlZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoYnVmZmVyUG9zIDwgYnVmZmVyU2l6ZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJSZWZpbGxCdWZmZXIoKSBjYWxsZWQgd2hlbiBidWZmZXIgd2Fzbid0IGVtcHR5LiIpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAodG90YWxCeXRlc1JldGlyZWQgKyBidWZmZXJTaXplID09IGN1cnJlbnRMaW1pdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIE9vcHMsIHdlIGhpdCBhIGxpbWl0Lg0KKyAgICAgICAgICAgICAgICBpZiAobXVzdFN1Y2NlZWQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5UcnVuY2F0ZWRNZXNzYWdlKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgdG90YWxCeXRlc1JldGlyZWQgKz0gYnVmZmVyU2l6ZTsNCisNCisgICAgICAgICAgICBidWZmZXJQb3MgPSAwOw0KKyAgICAgICAgICAgIGJ1ZmZlclNpemUgPSAoaW5wdXQgPT0gbnVsbCkgPyAwIDogaW5wdXQuUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpOw0KKyAgICAgICAgICAgIGlmIChidWZmZXJTaXplIDwgMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJTdHJlYW0uUmVhZCByZXR1cm5lZCBhIG5lZ2F0aXZlIGNvdW50Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChidWZmZXJTaXplID09IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAobXVzdFN1Y2NlZWQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5UcnVuY2F0ZWRNZXNzYWdlKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgUmVjb21wdXRlQnVmZmVyU2l6ZUFmdGVyTGltaXQoKTsNCisgICAgICAgICAgICAgICAgaW50IHRvdGFsQnl0ZXNSZWFkID0NCisgICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyU2l6ZSArIGJ1ZmZlclNpemVBZnRlckxpbWl0Ow0KKyAgICAgICAgICAgICAgICBpZiAodG90YWxCeXRlc1JlYWQgPiBzaXplTGltaXQgfHwgdG90YWxCeXRlc1JlYWQgPCAwKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uU2l6ZUxpbWl0RXhjZWVkZWQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZCBvbmUgYnl0ZSBmcm9tIHRoZSBpbnB1dC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24iPg0KKyAgICAgICAgLy8vIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBvciB0aGUgY3VycmVudCBsaW1pdCB3YXMgcmVhY2hlZA0KKyAgICAgICAgLy8vIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgcHVibGljIGJ5dGUgUmVhZFJhd0J5dGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChidWZmZXJQb3MgPT0gYnVmZmVyU2l6ZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFJlZmlsbEJ1ZmZlcih0cnVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcltidWZmZXJQb3MrK107DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZCBhIGZpeGVkIHNpemUgb2YgYnl0ZXMgZnJvbSB0aGUgaW5wdXQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIj4NCisgICAgICAgIC8vLyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gb3IgdGhlIGN1cnJlbnQgbGltaXQgd2FzIHJlYWNoZWQNCisgICAgICAgIC8vLyA8L2V4Y2VwdGlvbj4NCisgICAgICAgIHB1YmxpYyBieXRlW10gUmVhZFJhd0J5dGVzKGludCBzaXplKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChzaXplIDwgMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5OZWdhdGl2ZVNpemUoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyUG9zICsgc2l6ZSA+IGN1cnJlbnRMaW1pdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIFJlYWQgdG8gdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGFueXdheS4NCisgICAgICAgICAgICAgICAgU2tpcFJhd0J5dGVzKGN1cnJlbnRMaW1pdCAtIHRvdGFsQnl0ZXNSZXRpcmVkIC0gYnVmZmVyUG9zKTsNCisgICAgICAgICAgICAgICAgLy8gVGhlbiBmYWlsLg0KKyAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uVHJ1bmNhdGVkTWVzc2FnZSgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAoc2l6ZSA8PSBidWZmZXJTaXplIC0gYnVmZmVyUG9zKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbGwgdGhlIGJ5dGVzIHdlIG5lZWQgYWxyZWFkeS4NCisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbc2l6ZV07DQorICAgICAgICAgICAgICAgIEJ5dGVBcnJheS5Db3B5KGJ1ZmZlciwgYnVmZmVyUG9zLCBieXRlcywgMCwgc2l6ZSk7DQorICAgICAgICAgICAgICAgIGJ1ZmZlclBvcyArPSBzaXplOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPCBidWZmZXIuTGVuZ3RoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gUmVhZGluZyBtb3JlIGJ5dGVzIHRoYW4gYXJlIGluIHRoZSBidWZmZXIsIGJ1dCBub3QgYW4gZXhjZXNzaXZlIG51bWJlcg0KKyAgICAgICAgICAgICAgICAvLyBvZiBieXRlcy4gIFdlIGNhbiBzYWZlbHkgYWxsb2NhdGUgdGhlIHJlc3VsdGluZyBhcnJheSBhaGVhZCBvZiB0aW1lLg0KKw0KKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBjb3B5IHdoYXQgd2UgaGF2ZS4NCisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbc2l6ZV07DQorICAgICAgICAgICAgICAgIGludCBwb3MgPSBidWZmZXJTaXplIC0gYnVmZmVyUG9zOw0KKyAgICAgICAgICAgICAgICBCeXRlQXJyYXkuQ29weShidWZmZXIsIGJ1ZmZlclBvcywgYnl0ZXMsIDAsIHBvcyk7DQorICAgICAgICAgICAgICAgIGJ1ZmZlclBvcyA9IGJ1ZmZlclNpemU7DQorDQorICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gdXNlIFJlZmlsbEJ1ZmZlcigpIGFuZCB0aGVuIGNvcHkgZnJvbSB0aGUgYnVmZmVyIGludG8gb3VyDQorICAgICAgICAgICAgICAgIC8vIGJ5dGUgYXJyYXkgcmF0aGVyIHRoYW4gcmVhZGluZyBkaXJlY3RseSBpbnRvIG91ciBieXRlIGFycmF5IGJlY2F1c2UNCisgICAgICAgICAgICAgICAgLy8gdGhlIGlucHV0IG1heSBiZSB1bmJ1ZmZlcmVkLg0KKyAgICAgICAgICAgICAgICBSZWZpbGxCdWZmZXIodHJ1ZSk7DQorDQorICAgICAgICAgICAgICAgIHdoaWxlIChzaXplIC0gcG9zID4gYnVmZmVyU2l6ZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgQnVmZmVyLkJsb2NrQ29weShidWZmZXIsIDAsIGJ5dGVzLCBwb3MsIGJ1ZmZlclNpemUpOw0KKyAgICAgICAgICAgICAgICAgICAgcG9zICs9IGJ1ZmZlclNpemU7DQorICAgICAgICAgICAgICAgICAgICBidWZmZXJQb3MgPSBidWZmZXJTaXplOw0KKyAgICAgICAgICAgICAgICAgICAgUmVmaWxsQnVmZmVyKHRydWUpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIEJ5dGVBcnJheS5Db3B5KGJ1ZmZlciwgMCwgYnl0ZXMsIHBvcywgc2l6ZSAtIHBvcyk7DQorICAgICAgICAgICAgICAgIGJ1ZmZlclBvcyA9IHNpemUgLSBwb3M7DQorDQorICAgICAgICAgICAgICAgIHJldHVybiBieXRlczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gVGhlIHNpemUgaXMgdmVyeSBsYXJnZS4gIEZvciBzZWN1cml0eSByZWFzb25zLCB3ZSBjYW4ndCBhbGxvY2F0ZSB0aGUNCisgICAgICAgICAgICAgICAgLy8gZW50aXJlIGJ5dGUgYXJyYXkgeWV0LiAgVGhlIHNpemUgY29tZXMgZGlyZWN0bHkgZnJvbSB0aGUgaW5wdXQsIHNvIGENCisgICAgICAgICAgICAgICAgLy8gbWFsaWNpb3VzbHktY3JhZnRlZCBtZXNzYWdlIGNvdWxkIHByb3ZpZGUgYSBib2d1cyB2ZXJ5IGxhcmdlIHNpemUgaW4NCisgICAgICAgICAgICAgICAgLy8gb3JkZXIgdG8gdHJpY2sgdGhlIGFwcCBpbnRvIGFsbG9jYXRpbmcgYSBsb3Qgb2YgbWVtb3J5LiAgV2UgYXZvaWQgdGhpcw0KKyAgICAgICAgICAgICAgICAvLyBieSBhbGxvY2F0aW5nIGFuZCByZWFkaW5nIG9ubHkgYSBzbWFsbCBjaHVuayBhdCBhIHRpbWUsIHNvIHRoYXQgdGhlDQorICAgICAgICAgICAgICAgIC8vIG1hbGljaW91cyBtZXNzYWdlIG11c3QgYWN0dWFsbHkgKmJlKiBleHRyZW1lbHkgbGFyZ2UgdG8gY2F1c2UNCisgICAgICAgICAgICAgICAgLy8gcHJvYmxlbXMuICBNZWFud2hpbGUsIHdlIGxpbWl0IHRoZSBhbGxvd2VkIHNpemUgb2YgYSBtZXNzYWdlIGVsc2V3aGVyZS4NCisNCisgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhlIGJ1ZmZlciBtYXJrZXJzIHNpbmNlIHdlJ2xsIGhhdmUgdG8gY29weSB0aGUgYnl0ZXMgb3V0IG9mDQorICAgICAgICAgICAgICAgIC8vIGl0IGxhdGVyLg0KKyAgICAgICAgICAgICAgICBpbnQgb3JpZ2luYWxCdWZmZXJQb3MgPSBidWZmZXJQb3M7DQorICAgICAgICAgICAgICAgIGludCBvcmlnaW5hbEJ1ZmZlclNpemUgPSBidWZmZXJTaXplOw0KKw0KKyAgICAgICAgICAgICAgICAvLyBNYXJrIHRoZSBjdXJyZW50IGJ1ZmZlciBjb25zdW1lZC4NCisgICAgICAgICAgICAgICAgdG90YWxCeXRlc1JldGlyZWQgKz0gYnVmZmVyU2l6ZTsNCisgICAgICAgICAgICAgICAgYnVmZmVyUG9zID0gMDsNCisgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSA9IDA7DQorDQorICAgICAgICAgICAgICAgIC8vIFJlYWQgYWxsIHRoZSByZXN0IG9mIHRoZSBieXRlcyB3ZSBuZWVkLg0KKyAgICAgICAgICAgICAgICBpbnQgc2l6ZUxlZnQgPSBzaXplIC0gKG9yaWdpbmFsQnVmZmVyU2l6ZSAtIG9yaWdpbmFsQnVmZmVyUG9zKTsNCisgICAgICAgICAgICAgICAgTGlzdDxieXRlW10+IGNodW5rcyA9IG5ldyBMaXN0PGJ5dGVbXT4oKTsNCisNCisgICAgICAgICAgICAgICAgd2hpbGUgKHNpemVMZWZ0ID4gMCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGNodW5rID0gbmV3IGJ5dGVbTWF0aC5NaW4oc2l6ZUxlZnQsIGJ1ZmZlci5MZW5ndGgpXTsNCisgICAgICAgICAgICAgICAgICAgIGludCBwb3MgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGNodW5rLkxlbmd0aCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IChpbnB1dCA9PSBudWxsKSA/IC0xIDogaW5wdXQuUmVhZChjaHVuaywgcG9zLCBjaHVuay5MZW5ndGggLSBwb3MpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuIDw9IDApDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uVHJ1bmNhdGVkTWVzc2FnZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmV0aXJlZCArPSBuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSBuOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgc2l6ZUxlZnQgLT0gY2h1bmsuTGVuZ3RoOw0KKyAgICAgICAgICAgICAgICAgICAgY2h1bmtzLkFkZChjaHVuayk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgLy8gT0ssIGdvdCBldmVyeXRoaW5nLiAgTm93IGNvbmNhdGVuYXRlIGl0IGFsbCBpbnRvIG9uZSBidWZmZXIuDQorICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW3NpemVdOw0KKw0KKyAgICAgICAgICAgICAgICAvLyBTdGFydCBieSBjb3B5aW5nIHRoZSBsZWZ0b3ZlciBieXRlcyBmcm9tIHRoaXMuYnVmZmVyLg0KKyAgICAgICAgICAgICAgICBpbnQgbmV3UG9zID0gb3JpZ2luYWxCdWZmZXJTaXplIC0gb3JpZ2luYWxCdWZmZXJQb3M7DQorICAgICAgICAgICAgICAgIEJ5dGVBcnJheS5Db3B5KGJ1ZmZlciwgb3JpZ2luYWxCdWZmZXJQb3MsIGJ5dGVzLCAwLCBuZXdQb3MpOw0KKw0KKyAgICAgICAgICAgICAgICAvLyBBbmQgbm93IGFsbCB0aGUgY2h1bmtzLg0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChieXRlW10gY2h1bmsgaW4gY2h1bmtzKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBCdWZmZXIuQmxvY2tDb3B5KGNodW5rLCAwLCBieXRlcywgbmV3UG9zLCBjaHVuay5MZW5ndGgpOw0KKyAgICAgICAgICAgICAgICAgICAgbmV3UG9zICs9IGNodW5rLkxlbmd0aDsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAvLyBEb25lLg0KKyAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGFuZCBkaXNjYXJkcyBhIHNpbmdsZSBmaWVsZCwgZ2l2ZW4gaXRzIHRhZyB2YWx1ZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJldHVybnM+ZmFsc2UgaWYgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAgdGFnLCBpbiB3aGljaCBjYXNlDQorICAgICAgICAvLy8gbm90aGluZyBpcyBza2lwcGVkLiBPdGhlcndpc2UsIHJldHVybnMgdHJ1ZS48L3JldHVybnM+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyBib29sIFNraXBGaWVsZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgdWludCB0YWcgPSBsYXN0VGFnOw0KKyAgICAgICAgICAgIHN3aXRjaCAoV2lyZUZvcm1hdC5HZXRUYWdXaXJlVHlwZSh0YWcpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldpcmVUeXBlLlZhcmludDoNCisgICAgICAgICAgICAgICAgICAgIFJlYWRSYXdWYXJpbnQ2NCgpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XaXJlVHlwZS5GaXhlZDY0Og0KKyAgICAgICAgICAgICAgICAgICAgUmVhZFJhd0xpdHRsZUVuZGlhbjY0KCk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZDoNCisgICAgICAgICAgICAgICAgICAgIFNraXBSYXdCeXRlcygoaW50KSBSZWFkUmF3VmFyaW50MzIoKSk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldpcmVUeXBlLlN0YXJ0R3JvdXA6DQorICAgICAgICAgICAgICAgICAgICBTa2lwTWVzc2FnZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgQ2hlY2tMYXN0VGFnV2FzKA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXQuTWFrZVRhZyhXaXJlRm9ybWF0LkdldFRhZ0ZpZWxkTnVtYmVyKHRhZyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXQuV2lyZVR5cGUuRW5kR3JvdXApKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgICBjYXNlIFdpcmVGb3JtYXQuV2lyZVR5cGUuRW5kR3JvdXA6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XaXJlVHlwZS5GaXhlZDMyOg0KKyAgICAgICAgICAgICAgICAgICAgUmVhZFJhd0xpdHRsZUVuZGlhbjMyKCk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkV2lyZVR5cGUoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYW5kIGRpc2NhcmRzIGFuIGVudGlyZSBtZXNzYWdlLiAgVGhpcyB3aWxsIHJlYWQgZWl0aGVyIHVudGlsIEVPRg0KKyAgICAgICAgLy8vIG9yIHVudGlsIGFuIGVuZGdyb3VwIHRhZywgd2hpY2hldmVyIGNvbWVzIGZpcnN0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFNraXBNZXNzYWdlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgbmFtZTsNCisgICAgICAgICAgICB3aGlsZSAoUmVhZFRhZyhvdXQgdGFnLCBvdXQgbmFtZSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoIVNraXBGaWVsZCgpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYW5kIGRpc2NhcmRzIDxwYXJhbXJlZiBuYW1lPSJzaXplIi8+IGJ5dGVzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiI+dGhlIGVuZCBvZiB0aGUgc3RyZWFtDQorICAgICAgICAvLy8gb3IgdGhlIGN1cnJlbnQgbGltaXQgd2FzIHJlYWNoZWQ8L2V4Y2VwdGlvbj4NCisgICAgICAgIHB1YmxpYyB2b2lkIFNraXBSYXdCeXRlcyhpbnQgc2l6ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoc2l6ZSA8IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uTmVnYXRpdmVTaXplKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmICh0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvcyArIHNpemUgPiBjdXJyZW50TGltaXQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBSZWFkIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBhbnl3YXkuDQorICAgICAgICAgICAgICAgIFNraXBSYXdCeXRlcyhjdXJyZW50TGltaXQgLSB0b3RhbEJ5dGVzUmV0aXJlZCAtIGJ1ZmZlclBvcyk7DQorICAgICAgICAgICAgICAgIC8vIFRoZW4gZmFpbC4NCisgICAgICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLlRydW5jYXRlZE1lc3NhZ2UoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHNpemUgPD0gYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYWxsIHRoZSBieXRlcyB3ZSBuZWVkIGFscmVhZHkuDQorICAgICAgICAgICAgICAgIGJ1ZmZlclBvcyArPSBzaXplOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBTa2lwcGluZyBtb3JlIGJ5dGVzIHRoYW4gYXJlIGluIHRoZSBidWZmZXIuICBGaXJzdCBza2lwIHdoYXQgd2UgaGF2ZS4NCisgICAgICAgICAgICAgICAgaW50IHBvcyA9IGJ1ZmZlclNpemUgLSBidWZmZXJQb3M7DQorDQorICAgICAgICAgICAgICAgIC8vIFJPSyA1LzcvMjAxMyBJc3N1ZSAjNTQ6IHNob3VsZCByZXRpcmUgYWxsIGJ5dGVzIGluIGJ1ZmZlciAoYnVmZmVyU2l6ZSkNCisgICAgICAgICAgICAgICAgLy8gdG90YWxCeXRlc1JldGlyZWQgKz0gcG9zOw0KKyAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmV0aXJlZCArPSBidWZmZXJTaXplOw0KKyAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgYnVmZmVyUG9zID0gMDsNCisgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSA9IDA7DQorDQorICAgICAgICAgICAgICAgIC8vIFRoZW4gc2tpcCBkaXJlY3RseSBmcm9tIHRoZSBJbnB1dFN0cmVhbSBmb3IgdGhlIHJlc3QuDQorICAgICAgICAgICAgICAgIGlmIChwb3MgPCBzaXplKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uVHJ1bmNhdGVkTWVzc2FnZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgU2tpcEltcGwoc2l6ZSAtIHBvcyk7DQorICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmV0aXJlZCArPSBzaXplIC0gcG9zOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFic3RyYWN0aW9uIG9mIHNraXBwaW5nIHRvIGNvcGUgd2l0aCBzdHJlYW1zIHdoaWNoIGNhbid0IHJlYWxseSBza2lwLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgdm9pZCBTa2lwSW1wbChpbnQgYW1vdW50VG9Ta2lwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChpbnB1dC5DYW5TZWVrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbG9uZyBwcmV2aW91c1Bvc2l0aW9uID0gaW5wdXQuUG9zaXRpb247DQorICAgICAgICAgICAgICAgIGlucHV0LlBvc2l0aW9uICs9IGFtb3VudFRvU2tpcDsNCisgICAgICAgICAgICAgICAgaWYgKGlucHV0LlBvc2l0aW9uICE9IHByZXZpb3VzUG9zaXRpb24gKyBhbW91bnRUb1NraXApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5UcnVuY2F0ZWRNZXNzYWdlKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYnl0ZVtdIHNraXBCdWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsNCisgICAgICAgICAgICAgICAgd2hpbGUgKGFtb3VudFRvU2tpcCA+IDApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSBpbnB1dC5SZWFkKHNraXBCdWZmZXIsIDAsIHNraXBCdWZmZXIuTGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPD0gMCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uVHJ1bmNhdGVkTWVzc2FnZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9Ta2lwIC09IGJ5dGVzUmVhZDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgICNlbmRyZWdpb24NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Db2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU2l6ZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0NvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTaXplLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjY2MmEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Db2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU2l6ZS5jcwpAQCAtMCwwICsxLDY1MyBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLyBUaGlzIHBhcnQgb2YgQ29kZWRPdXRwdXRTdHJlYW0gcHJvdmlkZXMgYWxsIHRoZSBzdGF0aWMgZW50cnkgcG9pbnRzIHRoYXQgYXJlIHVzZWQNCisgICAgLy8gYnkgZ2VuZXJhdGVkIGNvZGUgYW5kIGludGVybmFsbHkgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBtZXNzYWdlcyBwcmlvciB0byBiZWluZw0KKyAgICAvLyB3cml0dGVuIHRvIGFuIGluc3RhbmNlIG9mIENvZGVkT3V0cHV0U3RyZWFtLg0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW0NCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgTGl0dGxlRW5kaWFuNjRTaXplID0gODsNCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IExpdHRsZUVuZGlhbjMyU2l6ZSA9IDQ7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhDQorICAgICAgICAvLy8gZG91YmxlIGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlRG91YmxlU2l6ZShpbnQgZmllbGROdW1iZXIsIGRvdWJsZSB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgTGl0dGxlRW5kaWFuNjRTaXplOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQ0KKyAgICAgICAgLy8vIGZsb2F0IGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlRmxvYXRTaXplKGludCBmaWVsZE51bWJlciwgZmxvYXQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIExpdHRsZUVuZGlhbjMyU2l6ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGENCisgICAgICAgIC8vLyB1aW50NjQgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZVVJbnQ2NFNpemUoaW50IGZpZWxkTnVtYmVyLCB1bG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgQ29tcHV0ZVJhd1ZhcmludDY0U2l6ZSh2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbg0KKyAgICAgICAgLy8vIGludDY0IGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlSW50NjRTaXplKGludCBmaWVsZE51bWJlciwgbG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgQ29tcHV0ZVJhd1ZhcmludDY0U2l6ZSgodWxvbmcpIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuDQorICAgICAgICAvLy8gaW50MzIgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVJbnQzMlNpemUoaW50IGZpZWxkTnVtYmVyLCBpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHZhbHVlID49IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZSgodWludCkgdmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBNdXN0IHNpZ24tZXh0ZW5kLg0KKyAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgMTA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQ0KKyAgICAgICAgLy8vIGZpeGVkNjQgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZUZpeGVkNjRTaXplKGludCBmaWVsZE51bWJlciwgdWxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIExpdHRsZUVuZGlhbjY0U2l6ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGENCisgICAgICAgIC8vLyBmaXhlZDMyIGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVGaXhlZDMyU2l6ZShpbnQgZmllbGROdW1iZXIsIHVpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIExpdHRsZUVuZGlhbjMyU2l6ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGENCisgICAgICAgIC8vLyBib29sIGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlQm9vbFNpemUoaW50IGZpZWxkTnVtYmVyLCBib29sIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBDb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyAxOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQ0KKyAgICAgICAgLy8vIHN0cmluZyBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZVN0cmluZ1NpemUoaW50IGZpZWxkTnVtYmVyLCBTdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50IGJ5dGVBcnJheVNpemUgPSBFbmNvZGluZy5VVEY4LkdldEJ5dGVDb3VudCh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArDQorICAgICAgICAgICAgICAgICAgIENvbXB1dGVSYXdWYXJpbnQzMlNpemUoKHVpbnQpIGJ5dGVBcnJheVNpemUpICsNCisgICAgICAgICAgICAgICAgICAgYnl0ZUFycmF5U2l6ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGENCisgICAgICAgIC8vLyBncm91cCBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZUdyb3VwU2l6ZShpbnQgZmllbGROdW1iZXIsIElNZXNzYWdlTGl0ZSB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpKjIgKyB2YWx1ZS5TZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGENCisgICAgICAgIC8vLyBncm91cCBmaWVsZCByZXByZXNlbnRlZCBieSBhbiBVbmtub3duRmllbGRTZXQsIGluY2x1ZGluZyB0aGUgdGFnLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtPYnNvbGV0ZV0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVVbmtub3duR3JvdXBTaXplKGludCBmaWVsZE51bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNZXNzYWdlTGl0ZSB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpKjIgKyB2YWx1ZS5TZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuDQorICAgICAgICAvLy8gZW1iZWRkZWQgbWVzc2FnZSBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZU1lc3NhZ2VTaXplKGludCBmaWVsZE51bWJlciwgSU1lc3NhZ2VMaXRlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGludCBzaXplID0gdmFsdWUuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIENvbXB1dGVSYXdWYXJpbnQzMlNpemUoKHVpbnQpIHNpemUpICsgc2l6ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGENCisgICAgICAgIC8vLyBieXRlcyBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZUJ5dGVzU2l6ZShpbnQgZmllbGROdW1iZXIsIEJ5dGVTdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArDQorICAgICAgICAgICAgICAgICAgIENvbXB1dGVSYXdWYXJpbnQzMlNpemUoKHVpbnQpIHZhbHVlLkxlbmd0aCkgKw0KKyAgICAgICAgICAgICAgICAgICB2YWx1ZS5MZW5ndGg7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhDQorICAgICAgICAvLy8gdWludDMyIGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVVSW50MzJTaXplKGludCBmaWVsZE51bWJlciwgdWludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZSh2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhDQorICAgICAgICAvLy8gZW51bSBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yDQorICAgICAgICAvLy8gY29udmVydGluZyB0aGUgZW51bSB2YWx1ZSB0byBpdHMgbnVtZXJpYyB2YWx1ZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlRW51bVNpemUoaW50IGZpZWxkTnVtYmVyLCBpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIENvbXB1dGVFbnVtU2l6ZU5vVGFnKHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuDQorICAgICAgICAvLy8gc2ZpeGVkMzIgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVTRml4ZWQzMlNpemUoaW50IGZpZWxkTnVtYmVyLCBpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIExpdHRsZUVuZGlhbjMyU2l6ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuDQorICAgICAgICAvLy8gc2ZpeGVkNjQgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVTRml4ZWQ2NFNpemUoaW50IGZpZWxkTnVtYmVyLCBsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBDb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBMaXR0bGVFbmRpYW42NFNpemU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbg0KKyAgICAgICAgLy8vIHNpbnQzMiBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZVNJbnQzMlNpemUoaW50IGZpZWxkTnVtYmVyLCBpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIENvbXB1dGVSYXdWYXJpbnQzMlNpemUoRW5jb2RlWmlnWmFnMzIodmFsdWUpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuDQorICAgICAgICAvLy8gc2ludDY0IGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlU0ludDY0U2l6ZShpbnQgZmllbGROdW1iZXIsIGxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIENvbXB1dGVSYXdWYXJpbnQ2NFNpemUoRW5jb2RlWmlnWmFnNjQodmFsdWUpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGENCisgICAgICAgIC8vLyBkb3VibGUgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVEb3VibGVTaXplTm9UYWcoZG91YmxlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBMaXR0bGVFbmRpYW42NFNpemU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhDQorICAgICAgICAvLy8gZmxvYXQgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVGbG9hdFNpemVOb1RhZyhmbG9hdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTGl0dGxlRW5kaWFuMzJTaXplOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQ0KKyAgICAgICAgLy8vIHVpbnQ2NCBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlVUludDY0U2l6ZU5vVGFnKHVsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBDb21wdXRlUmF3VmFyaW50NjRTaXplKHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuDQorICAgICAgICAvLy8gaW50NjQgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVJbnQ2NFNpemVOb1RhZyhsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBDb21wdXRlUmF3VmFyaW50NjRTaXplKCh1bG9uZykgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4NCisgICAgICAgIC8vLyBpbnQzMiBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAodmFsdWUgPj0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlUmF3VmFyaW50MzJTaXplKCh1aW50KSB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIE11c3Qgc2lnbi1leHRlbmQuDQorICAgICAgICAgICAgICAgIHJldHVybiAxMDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhDQorICAgICAgICAvLy8gZml4ZWQ2NCBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlRml4ZWQ2NFNpemVOb1RhZyh1bG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTGl0dGxlRW5kaWFuNjRTaXplOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQ0KKyAgICAgICAgLy8vIGZpeGVkMzIgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZUZpeGVkMzJTaXplTm9UYWcodWludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTGl0dGxlRW5kaWFuMzJTaXplOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQ0KKyAgICAgICAgLy8vIGJvb2wgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVCb29sU2l6ZU5vVGFnKGJvb2wgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhDQorICAgICAgICAvLy8gc3RyaW5nIGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlU3RyaW5nU2l6ZU5vVGFnKFN0cmluZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgYnl0ZUFycmF5U2l6ZSA9IEVuY29kaW5nLlVURjguR2V0Qnl0ZUNvdW50KHZhbHVlKTsNCisgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZSgodWludCkgYnl0ZUFycmF5U2l6ZSkgKw0KKyAgICAgICAgICAgICAgICAgICBieXRlQXJyYXlTaXplOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQ0KKyAgICAgICAgLy8vIGdyb3VwIGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlR3JvdXBTaXplTm9UYWcoSU1lc3NhZ2VMaXRlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZS5TZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGENCisgICAgICAgIC8vLyBncm91cCBmaWVsZCByZXByZXNlbnRlZCBieSBhbiBVbmtub3duRmllbGRTZXQsIGluY2x1ZGluZyB0aGUgdGFnLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtPYnNvbGV0ZV0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVVbmtub3duR3JvdXBTaXplTm9UYWcoSU1lc3NhZ2VMaXRlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZS5TZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuDQorICAgICAgICAvLy8gZW1iZWRkZWQgbWVzc2FnZSBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZU1lc3NhZ2VTaXplTm9UYWcoSU1lc3NhZ2VMaXRlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGludCBzaXplID0gdmFsdWUuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVSYXdWYXJpbnQzMlNpemUoKHVpbnQpIHNpemUpICsgc2l6ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGENCisgICAgICAgIC8vLyBieXRlcyBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZUJ5dGVzU2l6ZU5vVGFnKEJ5dGVTdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVSYXdWYXJpbnQzMlNpemUoKHVpbnQpIHZhbHVlLkxlbmd0aCkgKw0KKyAgICAgICAgICAgICAgICAgICB2YWx1ZS5MZW5ndGg7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhDQorICAgICAgICAvLy8gdWludDMyIGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVVSW50MzJTaXplTm9UYWcodWludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZSh2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhDQorICAgICAgICAvLy8gZW51bSBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yDQorICAgICAgICAvLy8gY29udmVydGluZyB0aGUgZW51bSB2YWx1ZSB0byBpdHMgbnVtZXJpYyB2YWx1ZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlRW51bVNpemVOb1RhZyhpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVJbnQzMlNpemVOb1RhZyh2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbg0KKyAgICAgICAgLy8vIHNmaXhlZDMyIGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlU0ZpeGVkMzJTaXplTm9UYWcoaW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBMaXR0bGVFbmRpYW4zMlNpemU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbg0KKyAgICAgICAgLy8vIHNmaXhlZDY0IGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlU0ZpeGVkNjRTaXplTm9UYWcobG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTGl0dGxlRW5kaWFuNjRTaXplOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4NCisgICAgICAgIC8vLyBzaW50MzIgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVTSW50MzJTaXplTm9UYWcoaW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBDb21wdXRlUmF3VmFyaW50MzJTaXplKEVuY29kZVppZ1phZzMyKHZhbHVlKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbg0KKyAgICAgICAgLy8vIHNpbnQ2NCBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZVNJbnQ2NFNpemVOb1RhZyhsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBDb21wdXRlUmF3VmFyaW50NjRTaXplKEVuY29kZVppZ1phZzY0KHZhbHVlKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvKg0KKyAgICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGENCisgICAgICogTWVzc2FnZVNldCBleHRlbnNpb24gdG8gdGhlIHN0cmVhbS4gIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsDQorICAgICAqIHRoZSB3aXJlIGZvcm1hdCBkaWZmZXJzIGZyb20gbm9ybWFsIGZpZWxkcy4NCisgICAgICovDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhDQorICAgICAgICAvLy8gTWVzc2FnZVNldCBleHRlbnNpb24gdG8gdGhlIHN0cmVhbS4gRm9yIGhpc3RvcmljYWwgcmVhc29ucywNCisgICAgICAgIC8vLyB0aGUgd2lyZSBmb3JtYXQgZGlmZmVycyBmcm9tIG5vcm1hbCBmaWVsZHMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZU1lc3NhZ2VTZXRFeHRlbnNpb25TaXplKGludCBmaWVsZE51bWJlciwgSU1lc3NhZ2VMaXRlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBDb21wdXRlVGFnU2l6ZShXaXJlRm9ybWF0Lk1lc3NhZ2VTZXRGaWVsZC5JdGVtKSoyICsNCisgICAgICAgICAgICAgICAgICAgQ29tcHV0ZVVJbnQzMlNpemUoV2lyZUZvcm1hdC5NZXNzYWdlU2V0RmllbGQuVHlwZUlELCAodWludCkgZmllbGROdW1iZXIpICsNCisgICAgICAgICAgICAgICAgICAgQ29tcHV0ZU1lc3NhZ2VTaXplKFdpcmVGb3JtYXQuTWVzc2FnZVNldEZpZWxkLk1lc3NhZ2UsIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuDQorICAgICAgICAvLy8gdW5wYXJzZWQgTWVzc2FnZVNldCBleHRlbnNpb24gZmllbGQgdG8gdGhlIHN0cmVhbS4gRm9yDQorICAgICAgICAvLy8gaGlzdG9yaWNhbCByZWFzb25zLCB0aGUgd2lyZSBmb3JtYXQgZGlmZmVycyBmcm9tIG5vcm1hbCBmaWVsZHMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZVJhd01lc3NhZ2VTZXRFeHRlbnNpb25TaXplKGludCBmaWVsZE51bWJlciwgQnl0ZVN0cmluZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVRhZ1NpemUoV2lyZUZvcm1hdC5NZXNzYWdlU2V0RmllbGQuSXRlbSkqMiArDQorICAgICAgICAgICAgICAgICAgIENvbXB1dGVVSW50MzJTaXplKFdpcmVGb3JtYXQuTWVzc2FnZVNldEZpZWxkLlR5cGVJRCwgKHVpbnQpIGZpZWxkTnVtYmVyKSArDQorICAgICAgICAgICAgICAgICAgIENvbXB1dGVCeXRlc1NpemUoV2lyZUZvcm1hdC5NZXNzYWdlU2V0RmllbGQuTWVzc2FnZSwgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYSB2YXJpbnQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlUmF3VmFyaW50MzJTaXplKHVpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmIDw8IDcpKSA9PSAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZiA8PCAxNCkpID09IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmIDw8IDIxKSkgPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiAzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmYgPDwgMjgpKSA9PSAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiA1Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYSB2YXJpbnQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlUmF3VmFyaW50NjRTaXplKHVsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCA3KSkgPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgMTQpKSA9PSAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCAyMSkpID09IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gMzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8IDI4KSkgPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiA0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgMzUpKSA9PSAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCA0MikpID09IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gNjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8IDQ5KSkgPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiA3Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgNTYpKSA9PSAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCA2MykpID09IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gOTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIDEwOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQ0KKyAgICAgICAgLy8vIGZpZWxkIG9mIGFyYml0cmFyeSB0eXBlLCBpbmNsdWRpbmcgdGhlIHRhZywgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlRmllbGRTaXplKEZpZWxkVHlwZSBmaWVsZFR5cGUsIGludCBmaWVsZE51bWJlciwgT2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRG91YmxlOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVEb3VibGVTaXplKGZpZWxkTnVtYmVyLCAoZG91YmxlKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZsb2F0Og0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVGbG9hdFNpemUoZmllbGROdW1iZXIsIChmbG9hdCkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlSW50NjRTaXplKGZpZWxkTnVtYmVyLCAobG9uZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50NjQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVVJbnQ2NFNpemUoZmllbGROdW1iZXIsICh1bG9uZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlSW50MzJTaXplKGZpZWxkTnVtYmVyLCAoaW50KSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkNjQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZUZpeGVkNjRTaXplKGZpZWxkTnVtYmVyLCAodWxvbmcpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRml4ZWQzMjoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlRml4ZWQzMlNpemUoZmllbGROdW1iZXIsICh1aW50KSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkJvb2w6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZUJvb2xTaXplKGZpZWxkTnVtYmVyLCAoYm9vbCkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TdHJpbmc6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVN0cmluZ1NpemUoZmllbGROdW1iZXIsIChzdHJpbmcpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuR3JvdXA6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZUdyb3VwU2l6ZShmaWVsZE51bWJlciwgKElNZXNzYWdlTGl0ZSkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5NZXNzYWdlOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVNZXNzYWdlU2l6ZShmaWVsZE51bWJlciwgKElNZXNzYWdlTGl0ZSkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5CeXRlczoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlQnl0ZXNTaXplKGZpZWxkTnVtYmVyLCAoQnl0ZVN0cmluZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50MzI6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVVJbnQzMlNpemUoZmllbGROdW1iZXIsICh1aW50KSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNGaXhlZDMyOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVTRml4ZWQzMlNpemUoZmllbGROdW1iZXIsIChpbnQpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkNjQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVNGaXhlZDY0U2l6ZShmaWVsZE51bWJlciwgKGxvbmcpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ludDMyOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVTSW50MzJTaXplKGZpZWxkTnVtYmVyLCAoaW50KSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlU0ludDY0U2l6ZShmaWVsZE51bWJlciwgKGxvbmcpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRW51bToNCisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpcyBFbnVtKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlRW51bVNpemUoZmllbGROdW1iZXIsIENvbnZlcnQuVG9JbnQzMih2YWx1ZSkpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlRW51bVNpemUoZmllbGROdW1iZXIsICgoSUVudW1MaXRlKSB2YWx1ZSkuTnVtYmVyKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkludmFsaWQgZmllbGQgdHlwZSAiICsgZmllbGRUeXBlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhDQorICAgICAgICAvLy8gZmllbGQgb2YgYXJiaXRyYXJ5IHR5cGUsIGV4Y2x1ZGluZyB0aGUgdGFnLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVGaWVsZFNpemVOb1RhZyhGaWVsZFR5cGUgZmllbGRUeXBlLCBPYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Eb3VibGU6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZURvdWJsZVNpemVOb1RhZygoZG91YmxlKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZsb2F0Og0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVGbG9hdFNpemVOb1RhZygoZmxvYXQpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuSW50NjQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZUludDY0U2l6ZU5vVGFnKChsb25nKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlVUludDY0U2l6ZU5vVGFnKCh1bG9uZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlSW50MzJTaXplTm9UYWcoKGludCkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GaXhlZDY0Og0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVGaXhlZDY0U2l6ZU5vVGFnKCh1bG9uZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GaXhlZDMyOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVGaXhlZDMyU2l6ZU5vVGFnKCh1aW50KSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkJvb2w6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZUJvb2xTaXplTm9UYWcoKGJvb2wpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU3RyaW5nOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVTdHJpbmdTaXplTm9UYWcoKHN0cmluZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Hcm91cDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlR3JvdXBTaXplTm9UYWcoKElNZXNzYWdlTGl0ZSkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5NZXNzYWdlOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVNZXNzYWdlU2l6ZU5vVGFnKChJTWVzc2FnZUxpdGUpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuQnl0ZXM6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZUJ5dGVzU2l6ZU5vVGFnKChCeXRlU3RyaW5nKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlVUludDMyU2l6ZU5vVGFnKCh1aW50KSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNGaXhlZDMyOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVTRml4ZWQzMlNpemVOb1RhZygoaW50KSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNGaXhlZDY0Og0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVTRml4ZWQ2NFNpemVOb1RhZygobG9uZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TSW50MzI6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVNJbnQzMlNpemVOb1RhZygoaW50KSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlU0ludDY0U2l6ZU5vVGFnKChsb25nKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkVudW06DQorICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaXMgRW51bSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcHV0ZUVudW1TaXplTm9UYWcoQ29udmVydC5Ub0ludDMyKHZhbHVlKSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVFbnVtU2l6ZU5vVGFnKCgoSUVudW1MaXRlKSB2YWx1ZSkuTnVtYmVyKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkludmFsaWQgZmllbGQgdHlwZSAiICsgZmllbGRUeXBlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhIHRhZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlVGFnU2l6ZShpbnQgZmllbGROdW1iZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVSYXdWYXJpbnQzMlNpemUoV2lyZUZvcm1hdC5NYWtlVGFnKGZpZWxkTnVtYmVyLCAwKSk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQ29kZWRPdXRwdXRTdHJlYW0uY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Db2RlZE91dHB1dFN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjY3Yjc1Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQ29kZWRPdXRwdXRTdHJlYW0uY3MKQEAgLTAsMCArMSwxMzQxIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlRleHQ7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBFbmNvZGVzIGFuZCB3cml0ZXMgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZHMuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIC8vLyA8cmVtYXJrcz4NCisgICAgLy8vIFRoaXMgY2xhc3MgY29udGFpbnMgdHdvIGtpbmRzIG9mIG1ldGhvZHM6ICBtZXRob2RzIHRoYXQgd3JpdGUgc3BlY2lmaWMNCisgICAgLy8vIHByb3RvY29sIG1lc3NhZ2UgY29uc3RydWN0cyBhbmQgZmllbGQgdHlwZXMgKGUuZy4gV3JpdGVUYWcgYW5kDQorICAgIC8vLyBXcml0ZUludDMyKSBhbmQgbWV0aG9kcyB0aGF0IHdyaXRlIGxvdy1sZXZlbCB2YWx1ZXMgKGUuZy4NCisgICAgLy8vIFdyaXRlUmF3VmFyaW50MzIgYW5kIFdyaXRlUmF3Qnl0ZXMpLiAgSWYgeW91IGFyZSB3cml0aW5nIGVuY29kZWQgcHJvdG9jb2wNCisgICAgLy8vIG1lc3NhZ2VzLCB5b3Ugc2hvdWxkIHVzZSB0aGUgZm9ybWVyIG1ldGhvZHMsIGJ1dCBpZiB5b3UgYXJlIHdyaXRpbmcgc29tZQ0KKyAgICAvLy8gb3RoZXIgZm9ybWF0IG9mIHlvdXIgb3duIGRlc2lnbiwgdXNlIHRoZSBsYXR0ZXIuIFRoZSBuYW1lcyBvZiB0aGUgZm9ybWVyDQorICAgIC8vLyBtZXRob2RzIGFyZSB0YWtlbiBmcm9tIHRoZSBwcm90b2NvbCBidWZmZXIgdHlwZSBuYW1lcywgbm90IC5ORVQgdHlwZXMuDQorICAgIC8vLyAoSGVuY2UgV3JpdGVGbG9hdCBpbnN0ZWFkIG9mIFdyaXRlU2luZ2xlLCBhbmQgV3JpdGVCb29sIGluc3RlYWQgb2YgV3JpdGVCb29sZWFuLikNCisgICAgLy8vIDwvcmVtYXJrcz4NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIENvZGVkT3V0cHV0U3RyZWFtIDogSUNvZGVkT3V0cHV0U3RyZWFtDQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUaGUgYnVmZmVyIHNpemUgdXNlZCBieSBDcmVhdGVJbnN0YW5jZShTdHJlYW0pLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaW50IERlZmF1bHRCdWZmZXJTaXplID0gNDA5NjsNCisNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIGJ1ZmZlcjsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IGxpbWl0Ow0KKyAgICAgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb247DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFN0cmVhbSBvdXRwdXQ7DQorDQorICAgICAgICAjcmVnaW9uIENvbnN0cnVjdGlvbg0KKw0KKyAgICAgICAgcHJpdmF0ZSBDb2RlZE91dHB1dFN0cmVhbShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRoaXMub3V0cHV0ID0gbnVsbDsNCisgICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsNCisgICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gb2Zmc2V0Ow0KKyAgICAgICAgICAgIHRoaXMubGltaXQgPSBvZmZzZXQgKyBsZW5ndGg7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIENvZGVkT3V0cHV0U3RyZWFtKFN0cmVhbSBvdXRwdXQsIGJ5dGVbXSBidWZmZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7DQorICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7DQorICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IDA7DQorICAgICAgICAgICAgdGhpcy5saW1pdCA9IGJ1ZmZlci5MZW5ndGg7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyBDb2RlZE91dHB1dFN0cmVhbSB3aGljaCB3cml0ZSB0byB0aGUgZ2l2ZW4gc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29kZWRPdXRwdXRTdHJlYW0gQ3JlYXRlSW5zdGFuY2UoU3RyZWFtIG91dHB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlSW5zdGFuY2Uob3V0cHV0LCBEZWZhdWx0QnVmZmVyU2l6ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyBDb2RlZE91dHB1dFN0cmVhbSB3aGljaCB3cml0ZSB0byB0aGUgZ2l2ZW4gc3RyZWFtIGFuZCB1c2VzDQorICAgICAgICAvLy8gdGhlIHNwZWNpZmllZCBidWZmZXIgc2l6ZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIENvZGVkT3V0cHV0U3RyZWFtIENyZWF0ZUluc3RhbmNlKFN0cmVhbSBvdXRwdXQsIGludCBidWZmZXJTaXplKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29kZWRPdXRwdXRTdHJlYW0ob3V0cHV0LCBuZXcgYnl0ZVtidWZmZXJTaXplXSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyBDb2RlZE91dHB1dFN0cmVhbSB0aGF0IHdyaXRlcyBkaXJlY3RseSB0byB0aGUgZ2l2ZW4NCisgICAgICAgIC8vLyBieXRlIGFycmF5LiBJZiBtb3JlIGJ5dGVzIGFyZSB3cml0dGVuIHRoYW4gZml0IGluIHRoZSBhcnJheSwNCisgICAgICAgIC8vLyBPdXRPZlNwYWNlRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29kZWRPdXRwdXRTdHJlYW0gQ3JlYXRlSW5zdGFuY2UoYnl0ZVtdIGZsYXRBcnJheSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlSW5zdGFuY2UoZmxhdEFycmF5LCAwLCBmbGF0QXJyYXkuTGVuZ3RoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDcmVhdGVzIGEgbmV3IENvZGVkT3V0cHV0U3RyZWFtIHRoYXQgd3JpdGVzIGRpcmVjdGx5IHRvIHRoZSBnaXZlbg0KKyAgICAgICAgLy8vIGJ5dGUgYXJyYXkgc2xpY2UuIElmIG1vcmUgYnl0ZXMgYXJlIHdyaXR0ZW4gdGhhbiBmaXQgaW4gdGhlIGFycmF5LA0KKyAgICAgICAgLy8vIE91dE9mU3BhY2VFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDb2RlZE91dHB1dFN0cmVhbSBDcmVhdGVJbnN0YW5jZShieXRlW10gZmxhdEFycmF5LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29kZWRPdXRwdXRTdHJlYW0oZmxhdEFycmF5LCBvZmZzZXQsIGxlbmd0aCk7DQorICAgICAgICB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLCBvciB0aGUgcG9zaXRpb24gaW4gdGhlIG91dHB1dCBidWZmZXINCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgbG9uZyBQb3NpdGlvbg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0LlBvc2l0aW9uICsgcG9zaXRpb247DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgSUNvZGVkT3V0cHV0U3RyZWFtLldyaXRlTWVzc2FnZVN0YXJ0KCkgeyB9DQorICAgICAgICB2b2lkIElDb2RlZE91dHB1dFN0cmVhbS5Xcml0ZU1lc3NhZ2VFbmQoKSB7IEZsdXNoKCk7IH0NCisNCisgICAgICAgICNyZWdpb24gV3JpdGluZyBvZiB1bmtub3duIGZpZWxkcw0KKw0KKyAgICAgICAgW09ic29sZXRlXQ0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVVbmtub3duR3JvdXAoaW50IGZpZWxkTnVtYmVyLCBJTWVzc2FnZUxpdGUgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuU3RhcnRHcm91cCk7DQorICAgICAgICAgICAgdmFsdWUuV3JpdGVUbyh0aGlzKTsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5FbmRHcm91cCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVVua25vd25CeXRlcyhpbnQgZmllbGROdW1iZXIsIEJ5dGVTdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVCeXRlcyhmaWVsZE51bWJlciwgbnVsbCAvKm5vdCB1c2VkKi8sIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVVbmtub3duRmllbGQoaW50IGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlIHdpcmVUeXBlLCB1bG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAod2lyZVR5cGUgPT0gV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBXcml0ZVVJbnQ2NChmaWVsZE51bWJlciwgbnVsbCAvKm5vdCB1c2VkKi8sIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZiAod2lyZVR5cGUgPT0gV2lyZUZvcm1hdC5XaXJlVHlwZS5GaXhlZDMyKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVGaXhlZDMyKGZpZWxkTnVtYmVyLCBudWxsIC8qbm90IHVzZWQqLywgKHVpbnQpIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZiAod2lyZVR5cGUgPT0gV2lyZUZvcm1hdC5XaXJlVHlwZS5GaXhlZDY0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVGaXhlZDY0KGZpZWxkTnVtYmVyLCBudWxsIC8qbm90IHVzZWQqLywgdmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFdpcmVUeXBlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgI3JlZ2lvbiBXcml0aW5nIG9mIHRhZ3MgYW5kIGZpZWxkcw0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVGaWVsZChGaWVsZFR5cGUgZmllbGRUeXBlLCBpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlN0cmluZzoNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RyaW5nKGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsIChzdHJpbmcpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5NZXNzYWdlOg0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVNZXNzYWdlKGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsIChJTWVzc2FnZUxpdGUpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Hcm91cDoNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlR3JvdXAoZmllbGROdW1iZXIsIGZpZWxkTmFtZSwgKElNZXNzYWdlTGl0ZSkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkJ5dGVzOg0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVCeXRlcyhmaWVsZE51bWJlciwgZmllbGROYW1lLCAoQnl0ZVN0cmluZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkJvb2w6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZUJvb2woZmllbGROdW1iZXIsIGZpZWxkTmFtZSwgKGJvb2wpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5FbnVtOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGlzIEVudW0pDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVFbnVtKGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsIChpbnQpIHZhbHVlLCBudWxsIC8qbm90IHVzZWQqLyk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVFbnVtKGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsICgoSUVudW1MaXRlKSB2YWx1ZSkuTnVtYmVyLCBudWxsIC8qbm90IHVzZWQqLyk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuSW50MzI6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZUludDMyKGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsIChpbnQpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlSW50NjQoZmllbGROdW1iZXIsIGZpZWxkTmFtZSwgKGxvbmcpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50MzI6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZVVJbnQzMihmaWVsZE51bWJlciwgZmllbGROYW1lLCAodWludCkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlVUludDY0KGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsICh1bG9uZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlU0ludDMyKGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsIChpbnQpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TSW50NjQ6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZVNJbnQ2NChmaWVsZE51bWJlciwgZmllbGROYW1lLCAobG9uZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZUZpeGVkMzIoZmllbGROdW1iZXIsIGZpZWxkTmFtZSwgKHVpbnQpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GaXhlZDY0Og0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVGaXhlZDY0KGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsICh1bG9uZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNGaXhlZDMyOg0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVTRml4ZWQzMihmaWVsZE51bWJlciwgZmllbGROYW1lLCAoaW50KSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkNjQ6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZVNGaXhlZDY0KGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsIChsb25nKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRG91YmxlOg0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVEb3VibGUoZmllbGROdW1iZXIsIGZpZWxkTmFtZSwgKGRvdWJsZSkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZsb2F0Og0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVGbG9hdChmaWVsZE51bWJlciwgZmllbGROYW1lLCAoZmxvYXQpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBkb3VibGUgZmllbGQgdmFsdWUsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVEb3VibGUoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBkb3VibGUgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQ2NCk7DQorICAgICAgICAgICAgV3JpdGVEb3VibGVOb1RhZyh2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgZmxvYXQgZmllbGQgdmFsdWUsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVGbG9hdChpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGZsb2F0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkZpeGVkMzIpOw0KKyAgICAgICAgICAgIFdyaXRlRmxvYXROb1RhZyh2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgdWludDY0IGZpZWxkIHZhbHVlLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVVSW50NjQoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCB1bG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50NjQodmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhbiBpbnQ2NCBmaWVsZCB2YWx1ZSwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUludDY0KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgbG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50NjQoKHVsb25nKSB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGFuIGludDMyIGZpZWxkIHZhbHVlLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlSW50MzIoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KTsNCisgICAgICAgICAgICBpZiAodmFsdWUgPj0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50MzIoKHVpbnQpIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gTXVzdCBzaWduLWV4dGVuZC4NCisgICAgICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQ2NCgodWxvbmcpIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgZml4ZWQ2NCBmaWVsZCB2YWx1ZSwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlRml4ZWQ2NChpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIHVsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkZpeGVkNjQpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3TGl0dGxlRW5kaWFuNjQodmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIGZpeGVkMzIgZmllbGQgdmFsdWUsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUZpeGVkMzIoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCB1aW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkZpeGVkMzIpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3TGl0dGxlRW5kaWFuMzIodmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIGJvb2wgZmllbGQgdmFsdWUsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVCb29sKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgYm9vbCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZSh2YWx1ZSA/IChieXRlKSAxIDogKGJ5dGUpIDApOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHN0cmluZyBmaWVsZCB2YWx1ZSwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVN0cmluZyhpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIHN0cmluZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOw0KKyAgICAgICAgICAgIC8vIE9wdGltaXNlIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgZW5vdWdoIHNwYWNlIHRvIHdyaXRlDQorICAgICAgICAgICAgLy8gdGhlIHN0cmluZyBkaXJlY3RseSB0byB0aGUgYnVmZmVyLCB3aGljaCBzaG91bGQgYmUgY29tbW9uLg0KKyAgICAgICAgICAgIGludCBsZW5ndGggPSBFbmNvZGluZy5VVEY4LkdldEJ5dGVDb3VudCh2YWx1ZSk7DQorICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQzMigodWludCkgbGVuZ3RoKTsNCisgICAgICAgICAgICBpZiAobGltaXQgLSBwb3NpdGlvbiA+PSBsZW5ndGgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHZhbHVlLCAwLCB2YWx1ZS5MZW5ndGgsIGJ1ZmZlciwgcG9zaXRpb24pOw0KKyAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSBsZW5ndGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IEVuY29kaW5nLlVURjguR2V0Qnl0ZXModmFsdWUpOw0KKyAgICAgICAgICAgICAgICBXcml0ZVJhd0J5dGVzKGJ5dGVzKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgZ3JvdXAgZmllbGQgdmFsdWUsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVHcm91cChpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElNZXNzYWdlTGl0ZSB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5TdGFydEdyb3VwKTsNCisgICAgICAgICAgICB2YWx1ZS5Xcml0ZVRvKHRoaXMpOw0KKyAgICAgICAgICAgIFdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkVuZEdyb3VwKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlTWVzc2FnZShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElNZXNzYWdlTGl0ZSB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50MzIoKHVpbnQpIHZhbHVlLlNlcmlhbGl6ZWRTaXplKTsNCisgICAgICAgICAgICB2YWx1ZS5Xcml0ZVRvKHRoaXMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVCeXRlcyhpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIEJ5dGVTdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsNCisgICAgICAgICAgICBXcml0ZVJhd1ZhcmludDMyKCh1aW50KSB2YWx1ZS5MZW5ndGgpOw0KKyAgICAgICAgICAgIHZhbHVlLldyaXRlUmF3Qnl0ZXNUbyh0aGlzKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVVSW50MzIoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCB1aW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLlZhcmludCk7DQorICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQzMih2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUVudW0oaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgdmFsdWUsIG9iamVjdCByYXdWYWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpOw0KKyAgICAgICAgICAgIFdyaXRlSW50MzJOb1RhZyh2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVNGaXhlZDMyKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkZpeGVkMzIpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3TGl0dGxlRW5kaWFuMzIoKHVpbnQpIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlU0ZpeGVkNjQoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkZpeGVkNjQpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoKHVsb25nKSB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVNJbnQzMihpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50MzIoRW5jb2RlWmlnWmFnMzIodmFsdWUpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlU0ludDY0KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgbG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50NjQoRW5jb2RlWmlnWmFnNjQodmFsdWUpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlTWVzc2FnZVNldEV4dGVuc2lvbihpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElNZXNzYWdlTGl0ZSB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhXaXJlRm9ybWF0Lk1lc3NhZ2VTZXRGaWVsZC5JdGVtLCBXaXJlRm9ybWF0LldpcmVUeXBlLlN0YXJ0R3JvdXApOw0KKyAgICAgICAgICAgIFdyaXRlVUludDMyKFdpcmVGb3JtYXQuTWVzc2FnZVNldEZpZWxkLlR5cGVJRCwgInR5cGVfaWQiLCAodWludCkgZmllbGROdW1iZXIpOw0KKyAgICAgICAgICAgIFdyaXRlTWVzc2FnZShXaXJlRm9ybWF0Lk1lc3NhZ2VTZXRGaWVsZC5NZXNzYWdlLCAibWVzc2FnZSIsIHZhbHVlKTsNCisgICAgICAgICAgICBXcml0ZVRhZyhXaXJlRm9ybWF0Lk1lc3NhZ2VTZXRGaWVsZC5JdGVtLCBXaXJlRm9ybWF0LldpcmVUeXBlLkVuZEdyb3VwKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlTWVzc2FnZVNldEV4dGVuc2lvbihpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIEJ5dGVTdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVUYWcoV2lyZUZvcm1hdC5NZXNzYWdlU2V0RmllbGQuSXRlbSwgV2lyZUZvcm1hdC5XaXJlVHlwZS5TdGFydEdyb3VwKTsNCisgICAgICAgICAgICBXcml0ZVVJbnQzMihXaXJlRm9ybWF0Lk1lc3NhZ2VTZXRGaWVsZC5UeXBlSUQsICJ0eXBlX2lkIiwgKHVpbnQpIGZpZWxkTnVtYmVyKTsNCisgICAgICAgICAgICBXcml0ZUJ5dGVzKFdpcmVGb3JtYXQuTWVzc2FnZVNldEZpZWxkLk1lc3NhZ2UsICJtZXNzYWdlIiwgdmFsdWUpOw0KKyAgICAgICAgICAgIFdyaXRlVGFnKFdpcmVGb3JtYXQuTWVzc2FnZVNldEZpZWxkLkl0ZW0sIFdpcmVGb3JtYXQuV2lyZVR5cGUuRW5kR3JvdXApOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgI3JlZ2lvbiBXcml0aW5nIG9mIHZhbHVlcyB3aXRob3V0IHRhZ3MNCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlRmllbGROb1RhZyhGaWVsZFR5cGUgZmllbGRUeXBlLCBvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TdHJpbmc6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cmluZ05vVGFnKChzdHJpbmcpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5NZXNzYWdlOg0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVNZXNzYWdlTm9UYWcoKElNZXNzYWdlTGl0ZSkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkdyb3VwOg0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVHcm91cE5vVGFnKChJTWVzc2FnZUxpdGUpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5CeXRlczoNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlQnl0ZXNOb1RhZygoQnl0ZVN0cmluZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkJvb2w6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZUJvb2xOb1RhZygoYm9vbCkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkVudW06DQorICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaXMgRW51bSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZUVudW1Ob1RhZygoaW50KSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVFbnVtTm9UYWcoKChJRW51bUxpdGUpIHZhbHVlKS5OdW1iZXIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkludDMyOg0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVJbnQzMk5vVGFnKChpbnQpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlSW50NjROb1RhZygobG9uZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlVUludDMyTm9UYWcoKHVpbnQpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50NjQ6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZVVJbnQ2NE5vVGFnKCh1bG9uZykgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQzMjoNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlU0ludDMyTm9UYWcoKGludCkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlU0ludDY0Tm9UYWcoKGxvbmcpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GaXhlZDMyOg0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVGaXhlZDMyTm9UYWcoKHVpbnQpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GaXhlZDY0Og0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVGaXhlZDY0Tm9UYWcoKHVsb25nKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZVNGaXhlZDMyTm9UYWcoKGludCkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNGaXhlZDY0Og0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVTRml4ZWQ2NE5vVGFnKChsb25nKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRG91YmxlOg0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVEb3VibGVOb1RhZygoZG91YmxlKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRmxvYXQ6DQorICAgICAgICAgICAgICAgICAgICBXcml0ZUZsb2F0Tm9UYWcoKGZsb2F0KSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgZG91YmxlIGZpZWxkIHZhbHVlLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlRG91YmxlTm9UYWcoZG91YmxlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoKHVsb25nKUZyYW1ld29ya1BvcnRhYmlsaXR5LkRvdWJsZVRvSW50NjQodmFsdWUpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBmbG9hdCBmaWVsZCB2YWx1ZSwgd2l0aG91dCBhIHRhZywgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUZsb2F0Tm9UYWcoZmxvYXQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgYnl0ZVtdIHJhd0J5dGVzID0gQml0Q29udmVydGVyLkdldEJ5dGVzKHZhbHVlKTsNCisgICAgICAgICAgICBpZiAoIUJpdENvbnZlcnRlci5Jc0xpdHRsZUVuZGlhbikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEJ5dGVBcnJheS5SZXZlcnNlKHJhd0J5dGVzKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKGxpbWl0IC0gcG9zaXRpb24gPj0gNCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IHJhd0J5dGVzWzBdOw0KKyAgICAgICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSByYXdCeXRlc1sxXTsNCisgICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gcmF3Qnl0ZXNbMl07DQorICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IHJhd0J5dGVzWzNdOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBXcml0ZVJhd0J5dGVzKHJhd0J5dGVzLCAwLCA0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgdWludDY0IGZpZWxkIHZhbHVlLCB3aXRob3V0IGEgdGFnLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVVSW50NjROb1RhZyh1bG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVJhd1ZhcmludDY0KHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYW4gaW50NjQgZmllbGQgdmFsdWUsIHdpdGhvdXQgYSB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVJbnQ2NE5vVGFnKGxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQ2NCgodWxvbmcpIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYW4gaW50MzIgZmllbGQgdmFsdWUsIHdpdGhvdXQgYSB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVJbnQzMk5vVGFnKGludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAodmFsdWUgPj0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50MzIoKHVpbnQpIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gTXVzdCBzaWduLWV4dGVuZC4NCisgICAgICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQ2NCgodWxvbmcpIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgZml4ZWQ2NCBmaWVsZCB2YWx1ZSwgd2l0aG91dCBhIHRhZywgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlRml4ZWQ2NE5vVGFnKHVsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlUmF3TGl0dGxlRW5kaWFuNjQodmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIGZpeGVkMzIgZmllbGQgdmFsdWUsIHdpdGhvdXQgYSB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUZpeGVkMzJOb1RhZyh1aW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlUmF3TGl0dGxlRW5kaWFuMzIodmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIGJvb2wgZmllbGQgdmFsdWUsIHdpdGhvdXQgYSB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVCb29sTm9UYWcoYm9vbCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVJhd0J5dGUodmFsdWUgPyAoYnl0ZSkgMSA6IChieXRlKSAwKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBzdHJpbmcgZmllbGQgdmFsdWUsIHdpdGhvdXQgYSB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVTdHJpbmdOb1RhZyhzdHJpbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gT3B0aW1pc2UgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgdG8gd3JpdGUNCisgICAgICAgICAgICAvLyB0aGUgc3RyaW5nIGRpcmVjdGx5IHRvIHRoZSBidWZmZXIsIHdoaWNoIHNob3VsZCBiZSBjb21tb24uDQorICAgICAgICAgICAgaW50IGxlbmd0aCA9IEVuY29kaW5nLlVURjguR2V0Qnl0ZUNvdW50KHZhbHVlKTsNCisgICAgICAgICAgICBXcml0ZVJhd1ZhcmludDMyKCh1aW50KSBsZW5ndGgpOw0KKyAgICAgICAgICAgIGlmIChsaW1pdCAtIHBvc2l0aW9uID49IGxlbmd0aCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEVuY29kaW5nLlVURjguR2V0Qnl0ZXModmFsdWUsIDAsIHZhbHVlLkxlbmd0aCwgYnVmZmVyLCBwb3NpdGlvbik7DQorICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IGxlbmd0aDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyh2YWx1ZSk7DQorICAgICAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZXMoYnl0ZXMpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBncm91cCBmaWVsZCB2YWx1ZSwgd2l0aG91dCBhIHRhZywgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUdyb3VwTm9UYWcoSU1lc3NhZ2VMaXRlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhbHVlLldyaXRlVG8odGhpcyk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZU1lc3NhZ2VOb1RhZyhJTWVzc2FnZUxpdGUgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQzMigodWludCkgdmFsdWUuU2VyaWFsaXplZFNpemUpOw0KKyAgICAgICAgICAgIHZhbHVlLldyaXRlVG8odGhpcyk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUJ5dGVzTm9UYWcoQnl0ZVN0cmluZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVJhd1ZhcmludDMyKCh1aW50KSB2YWx1ZS5MZW5ndGgpOw0KKyAgICAgICAgICAgIHZhbHVlLldyaXRlUmF3Qnl0ZXNUbyh0aGlzKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVVSW50MzJOb1RhZyh1aW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50MzIodmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVFbnVtTm9UYWcoaW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlSW50MzJOb1RhZyh2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVNGaXhlZDMyTm9UYWcoaW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlUmF3TGl0dGxlRW5kaWFuMzIoKHVpbnQpIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlU0ZpeGVkNjROb1RhZyhsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoKHVsb25nKSB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVNJbnQzMk5vVGFnKGludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVJhd1ZhcmludDMyKEVuY29kZVppZ1phZzMyKHZhbHVlKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVNJbnQ2NE5vVGFnKGxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQ2NChFbmNvZGVaaWdaYWc2NCh2YWx1ZSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgI3JlZ2lvbiBXcml0ZSBhcnJheSBtZW1iZXJzDQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUFycmF5KEZpZWxkVHlwZSBmaWVsZFR5cGUsIGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGUgbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgZWxlbWVudCBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVGaWVsZChmaWVsZFR5cGUsIGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsIGVsZW1lbnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlR3JvdXBBcnJheTxUPihpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPFQ+IGxpc3QpDQorICAgICAgICAgICAgd2hlcmUgVCA6IElNZXNzYWdlTGl0ZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKElNZXNzYWdlTGl0ZSB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVHcm91cChmaWVsZE51bWJlciwgZmllbGROYW1lLCB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVNZXNzYWdlQXJyYXk8VD4oaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxUPiBsaXN0KQ0KKyAgICAgICAgICAgIHdoZXJlIFQgOiBJTWVzc2FnZUxpdGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoIChJTWVzc2FnZUxpdGUgdmFsdWUgaW4gbGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlTWVzc2FnZShmaWVsZE51bWJlciwgZmllbGROYW1lLCB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVTdHJpbmdBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPHN0cmluZz4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsdWUgaW4gbGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlU3RyaW5nKGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUJ5dGVzQXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxCeXRlU3RyaW5nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVCeXRlcyhmaWVsZE51bWJlciwgZmllbGROYW1lLCB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVCb29sQXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxib29sPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVCb29sKGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUludDMyQXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxpbnQ+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIHZhbHVlIGluIGxpc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBXcml0ZUludDMyKGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVNJbnQzMkFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGU8aW50PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVTSW50MzIoZmllbGROdW1iZXIsIGZpZWxkTmFtZSwgdmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVUludDMyQXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTx1aW50PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVVSW50MzIoZmllbGROdW1iZXIsIGZpZWxkTmFtZSwgdmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlRml4ZWQzMkFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGU8dWludD4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsdWUgaW4gbGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlRml4ZWQzMihmaWVsZE51bWJlciwgZmllbGROYW1lLCB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVTRml4ZWQzMkFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGU8aW50PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVTRml4ZWQzMihmaWVsZE51bWJlciwgZmllbGROYW1lLCB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVJbnQ2NEFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGU8bG9uZz4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsdWUgaW4gbGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlSW50NjQoZmllbGROdW1iZXIsIGZpZWxkTmFtZSwgdmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlU0ludDY0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxsb25nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVTSW50NjQoZmllbGROdW1iZXIsIGZpZWxkTmFtZSwgdmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVUludDY0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTx1bG9uZz4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsdWUgaW4gbGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlVUludDY0KGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUZpeGVkNjRBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPHVsb25nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVGaXhlZDY0KGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVNGaXhlZDY0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxsb25nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVTRml4ZWQ2NChmaWVsZE51bWJlciwgZmllbGROYW1lLCB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVEb3VibGVBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPGRvdWJsZT4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsdWUgaW4gbGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlRG91YmxlKGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUZsb2F0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxmbG9hdD4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsdWUgaW4gbGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlRmxvYXQoZmllbGROdW1iZXIsIGZpZWxkTmFtZSwgdmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVFbnVtQXJyYXk8VD4oaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxUPiBsaXN0KQ0KKyAgICAgICAgICAgIHdoZXJlIFQgOiBzdHJ1Y3QsIElDb21wYXJhYmxlLCBJRm9ybWF0dGFibGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAobGlzdCBpcyBJQ2FzdEFycmF5KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IHZhbHVlIGluICgoSUNhc3RBcnJheSkgbGlzdCkuQ2FzdEFycmF5PGludD4oKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVFbnVtKGZpZWxkTnVtYmVyLCBmaWVsZE5hbWUsIHZhbHVlLCBudWxsIC8qdW51c2VkKi8pOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBXcml0ZUVudW0oZmllbGROdW1iZXIsIGZpZWxkTmFtZSwgKGludCkgdmFsdWUsIG51bGwgLyp1bnVzZWQqLyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAjcmVnaW9uIFdyaXRlIHBhY2tlZCBhcnJheSBtZW1iZXJzDQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVBhY2tlZEFycmF5KEZpZWxkVHlwZSBmaWVsZFR5cGUsIGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGUgbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgY2FsY3VsYXRlZFNpemUgPSAwOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCBlbGVtZW50IGluIGxpc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjYWxjdWxhdGVkU2l6ZSArPSBDb21wdXRlRmllbGRTaXplTm9UYWcoZmllbGRUeXBlLCBlbGVtZW50KTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgV3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsNCisgICAgICAgICAgICBXcml0ZVJhd1ZhcmludDMyKCh1aW50KSBjYWxjdWxhdGVkU2l6ZSk7DQorDQorICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IGVsZW1lbnQgaW4gbGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlRmllbGROb1RhZyhmaWVsZFR5cGUsIGVsZW1lbnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlUGFja2VkR3JvdXBBcnJheTxUPihpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjYWxjdWxhdGVkU2l6ZSwgSUVudW1lcmFibGU8VD4gbGlzdCkNCisgICAgICAgICAgICB3aGVyZSBUIDogSU1lc3NhZ2VMaXRlDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsNCisgICAgICAgICAgICBXcml0ZVJhd1ZhcmludDMyKCh1aW50KSBjYWxjdWxhdGVkU2l6ZSk7DQorICAgICAgICAgICAgZm9yZWFjaCAoSU1lc3NhZ2VMaXRlIHZhbHVlIGluIGxpc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBXcml0ZUdyb3VwTm9UYWcodmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlUGFja2VkTWVzc2FnZUFycmF5PFQ+KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IGNhbGN1bGF0ZWRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8VD4gbGlzdCkNCisgICAgICAgICAgICB3aGVyZSBUIDogSU1lc3NhZ2VMaXRlDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsNCisgICAgICAgICAgICBXcml0ZVJhd1ZhcmludDMyKCh1aW50KSBjYWxjdWxhdGVkU2l6ZSk7DQorICAgICAgICAgICAgZm9yZWFjaCAoSU1lc3NhZ2VMaXRlIHZhbHVlIGluIGxpc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBXcml0ZU1lc3NhZ2VOb1RhZyh2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVQYWNrZWRTdHJpbmdBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjYWxjdWxhdGVkU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8c3RyaW5nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7DQorICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQzMigodWludCkgY2FsY3VsYXRlZFNpemUpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVTdHJpbmdOb1RhZyh2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVQYWNrZWRCeXRlc0FycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IGNhbGN1bGF0ZWRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlPEJ5dGVTdHJpbmc+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsNCisgICAgICAgICAgICBXcml0ZVJhd1ZhcmludDMyKCh1aW50KSBjYWxjdWxhdGVkU2l6ZSk7DQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIHZhbHVlIGluIGxpc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBXcml0ZUJ5dGVzTm9UYWcodmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlUGFja2VkQm9vbEFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IGNhbGN1bGF0ZWRTaXplLCBJRW51bWVyYWJsZTxib29sPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7DQorICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQzMigodWludCkgY2FsY3VsYXRlZFNpemUpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVCb29sTm9UYWcodmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlUGFja2VkSW50MzJBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjYWxjdWxhdGVkU2l6ZSwgSUVudW1lcmFibGU8aW50PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7DQorICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQzMigodWludCkgY2FsY3VsYXRlZFNpemUpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVJbnQzMk5vVGFnKHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVBhY2tlZFNJbnQzMkFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IGNhbGN1bGF0ZWRTaXplLCBJRW51bWVyYWJsZTxpbnQ+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsNCisgICAgICAgICAgICBXcml0ZVJhd1ZhcmludDMyKCh1aW50KSBjYWxjdWxhdGVkU2l6ZSk7DQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIHZhbHVlIGluIGxpc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBXcml0ZVNJbnQzMk5vVGFnKHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVBhY2tlZFVJbnQzMkFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IGNhbGN1bGF0ZWRTaXplLCBJRW51bWVyYWJsZTx1aW50PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7DQorICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQzMigodWludCkgY2FsY3VsYXRlZFNpemUpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVVSW50MzJOb1RhZyh2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVQYWNrZWRGaXhlZDMyQXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY2FsY3VsYXRlZFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTx1aW50PiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7DQorICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQzMigodWludCkgY2FsY3VsYXRlZFNpemUpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVGaXhlZDMyTm9UYWcodmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlUGFja2VkU0ZpeGVkMzJBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjYWxjdWxhdGVkU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTxpbnQ+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsNCisgICAgICAgICAgICBXcml0ZVJhd1ZhcmludDMyKCh1aW50KSBjYWxjdWxhdGVkU2l6ZSk7DQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIHZhbHVlIGluIGxpc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBXcml0ZVNGaXhlZDMyTm9UYWcodmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlUGFja2VkSW50NjRBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjYWxjdWxhdGVkU2l6ZSwgSUVudW1lcmFibGU8bG9uZz4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50MzIoKHVpbnQpIGNhbGN1bGF0ZWRTaXplKTsNCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsdWUgaW4gbGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlSW50NjROb1RhZyh2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVQYWNrZWRTSW50NjRBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjYWxjdWxhdGVkU2l6ZSwgSUVudW1lcmFibGU8bG9uZz4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50MzIoKHVpbnQpIGNhbGN1bGF0ZWRTaXplKTsNCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsdWUgaW4gbGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlU0ludDY0Tm9UYWcodmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlUGFja2VkVUludDY0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY2FsY3VsYXRlZFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlPHVsb25nPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7DQorICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQzMigodWludCkgY2FsY3VsYXRlZFNpemUpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVVSW50NjROb1RhZyh2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVQYWNrZWRGaXhlZDY0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY2FsY3VsYXRlZFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTx1bG9uZz4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50MzIoKHVpbnQpIGNhbGN1bGF0ZWRTaXplKTsNCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsdWUgaW4gbGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlRml4ZWQ2NE5vVGFnKHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVBhY2tlZFNGaXhlZDY0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY2FsY3VsYXRlZFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8bG9uZz4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50MzIoKHVpbnQpIGNhbGN1bGF0ZWRTaXplKTsNCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsdWUgaW4gbGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlU0ZpeGVkNjROb1RhZyh2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVQYWNrZWREb3VibGVBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjYWxjdWxhdGVkU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8ZG91YmxlPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7DQorICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQzMigodWludCkgY2FsY3VsYXRlZFNpemUpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVEb3VibGVOb1RhZyh2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVQYWNrZWRGbG9hdEFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IGNhbGN1bGF0ZWRTaXplLCBJRW51bWVyYWJsZTxmbG9hdD4gbGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOw0KKyAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50MzIoKHVpbnQpIGNhbGN1bGF0ZWRTaXplKTsNCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsdWUgaW4gbGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFdyaXRlRmxvYXROb1RhZyh2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVBhY2tlZEVudW1BcnJheTxUPihpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjYWxjdWxhdGVkU2l6ZSwgSUVudW1lcmFibGU8VD4gbGlzdCkNCisgICAgICAgICAgICB3aGVyZSBUIDogc3RydWN0LCBJQ29tcGFyYWJsZSwgSUZvcm1hdHRhYmxlDQorICAgICAgICB7DQorICAgICAgICAgICAgV3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsNCisgICAgICAgICAgICBXcml0ZVJhd1ZhcmludDMyKCh1aW50KSBjYWxjdWxhdGVkU2l6ZSk7DQorICAgICAgICAgICAgaWYgKGxpc3QgaXMgSUNhc3RBcnJheSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCB2YWx1ZSBpbiAoKElDYXN0QXJyYXkpIGxpc3QpLkNhc3RBcnJheTxpbnQ+KCkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFdyaXRlRW51bU5vVGFnKHZhbHVlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgdmFsdWUgaW4gbGlzdCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVFbnVtTm9UYWcoKGludCkgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgI3JlZ2lvbiBVbmRlcmx5aW5nIHdyaXRpbmcgcHJpbWl0aXZlcw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEVuY29kZXMgYW5kIHdyaXRlcyBhIHRhZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVGFnKGludCBmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZSB0eXBlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50MzIoV2lyZUZvcm1hdC5NYWtlVGFnKGZpZWxkTnVtYmVyLCB0eXBlKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgMzIgYml0IHZhbHVlIGFzIGEgdmFyaW50LiBUaGUgZmFzdCByb3V0ZSBpcyB0YWtlbiB3aGVuDQorICAgICAgICAvLy8gdGhlcmUncyBlbm91Z2ggYnVmZmVyIHNwYWNlIGxlZnQgdG8gd2hpenogdGhyb3VnaCB3aXRob3V0IGNoZWNraW5nDQorICAgICAgICAvLy8gZm9yIGVhY2ggYnl0ZTsgb3RoZXJ3aXNlLCB3ZSByZXNvcnQgdG8gY2FsbGluZyBXcml0ZVJhd0J5dGUgZWFjaCB0aW1lLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVSYXdWYXJpbnQzMih1aW50IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZSA+IDEyNyAmJiBwb3NpdGlvbiA8IGxpbWl0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKGJ5dGUpICgodmFsdWUgJiAweDdGKSB8IDB4ODApOw0KKyAgICAgICAgICAgICAgICB2YWx1ZSA+Pj0gNzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd2hpbGUgKHZhbHVlID4gMTI3KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSAoKHZhbHVlICYgMHg3RikgfCAweDgwKSk7DQorICAgICAgICAgICAgICAgIHZhbHVlID4+PSA3Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBsaW1pdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IChieXRlKSB2YWx1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVJhd1ZhcmludDY0KHVsb25nIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZSA+IDEyNyAmJiBwb3NpdGlvbiA8IGxpbWl0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKGJ5dGUpICgodmFsdWUgJiAweDdGKSB8IDB4ODApOw0KKyAgICAgICAgICAgICAgICB2YWx1ZSA+Pj0gNzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd2hpbGUgKHZhbHVlID4gMTI3KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSAoKHZhbHVlICYgMHg3RikgfCAweDgwKSk7DQorICAgICAgICAgICAgICAgIHZhbHVlID4+PSA3Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBsaW1pdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IChieXRlKSB2YWx1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVJhd0xpdHRsZUVuZGlhbjMyKHVpbnQgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHBvc2l0aW9uICsgNCA+IGxpbWl0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZSgoYnl0ZSkgKHZhbHVlID4+IDgpKTsNCisgICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSAodmFsdWUgPj4gMTYpKTsNCisgICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSAodmFsdWUgPj4gMjQpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9ICgoYnl0ZSkgKHZhbHVlID4+IDgpKTsNCisgICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSAodmFsdWUgPj4gMTYpKTsNCisgICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSAodmFsdWUgPj4gMjQpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlUmF3TGl0dGxlRW5kaWFuNjQodWxvbmcgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHBvc2l0aW9uICsgOCA+IGxpbWl0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZSgoYnl0ZSkgKHZhbHVlID4+IDgpKTsNCisgICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSAodmFsdWUgPj4gMTYpKTsNCisgICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSAodmFsdWUgPj4gMjQpKTsNCisgICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSAodmFsdWUgPj4gMzIpKTsNCisgICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSAodmFsdWUgPj4gNDApKTsNCisgICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSAodmFsdWUgPj4gNDgpKTsNCisgICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSAodmFsdWUgPj4gNTYpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9ICgoYnl0ZSkgKHZhbHVlID4+IDgpKTsNCisgICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSAodmFsdWUgPj4gMTYpKTsNCisgICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSAodmFsdWUgPj4gMjQpKTsNCisgICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSAodmFsdWUgPj4gMzIpKTsNCisgICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSAodmFsdWUgPj4gNDApKTsNCisgICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSAodmFsdWUgPj4gNDgpKTsNCisgICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSAodmFsdWUgPj4gNTYpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVJhd0J5dGUoYnl0ZSB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAocG9zaXRpb24gPT0gbGltaXQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBSZWZyZXNoQnVmZmVyKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVJhd0J5dGUodWludCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZVJhd0J5dGUoKGJ5dGUpIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgb3V0IGFuIGFycmF5IG9mIGJ5dGVzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlUmF3Qnl0ZXMoYnl0ZVtdIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZXModmFsdWUsIDAsIHZhbHVlLkxlbmd0aCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIG91dCBwYXJ0IG9mIGFuIGFycmF5IG9mIGJ5dGVzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlUmF3Qnl0ZXMoYnl0ZVtdIHZhbHVlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChsaW1pdCAtIHBvc2l0aW9uID49IGxlbmd0aCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEJ5dGVBcnJheS5Db3B5KHZhbHVlLCBvZmZzZXQsIGJ1ZmZlciwgcG9zaXRpb24sIGxlbmd0aCk7DQorICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgcm9vbSBpbiB0aGUgY3VycmVudCBidWZmZXIuDQorICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IGxlbmd0aDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gV3JpdGUgZXh0ZW5kcyBwYXN0IGN1cnJlbnQgYnVmZmVyLiAgRmlsbCB0aGUgcmVzdCBvZiB0aGlzIGJ1ZmZlciBhbmQNCisgICAgICAgICAgICAgICAgLy8gZmx1c2guDQorICAgICAgICAgICAgICAgIGludCBieXRlc1dyaXR0ZW4gPSBsaW1pdCAtIHBvc2l0aW9uOw0KKyAgICAgICAgICAgICAgICBCeXRlQXJyYXkuQ29weSh2YWx1ZSwgb2Zmc2V0LCBidWZmZXIsIHBvc2l0aW9uLCBieXRlc1dyaXR0ZW4pOw0KKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYnl0ZXNXcml0dGVuOw0KKyAgICAgICAgICAgICAgICBsZW5ndGggLT0gYnl0ZXNXcml0dGVuOw0KKyAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGxpbWl0Ow0KKyAgICAgICAgICAgICAgICBSZWZyZXNoQnVmZmVyKCk7DQorDQorICAgICAgICAgICAgICAgIC8vIE5vdyBkZWFsIHdpdGggdGhlIHJlc3QuDQorICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGhhdmUgYW4gb3V0cHV0IHN0cmVhbSwgdGhpcyBpcyBvdXIgYnVmZmVyDQorICAgICAgICAgICAgICAgIC8vIGFuZCBidWZmZXIgb2Zmc2V0ID09IDANCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSBsaW1pdCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gRml0cyBpbiBuZXcgYnVmZmVyLg0KKyAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5LkNvcHkodmFsdWUsIG9mZnNldCwgYnVmZmVyLCAwLCBsZW5ndGgpOw0KKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBsZW5ndGg7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZSBpcyB2ZXJ5IGJpZy4gIExldCdzIGRvIGl0IGFsbCBhdCBvbmNlLg0KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlKHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRW5jb2RlIGEgMzItYml0IHZhbHVlIHdpdGggWmlnWmFnIGVuY29kaW5nLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz4NCisgICAgICAgIC8vLyBaaWdaYWcgZW5jb2RlcyBzaWduZWQgaW50ZWdlcnMgaW50byB2YWx1ZXMgdGhhdCBjYW4gYmUgZWZmaWNpZW50bHkNCisgICAgICAgIC8vLyBlbmNvZGVkIHdpdGggdmFyaW50LiAgKE90aGVyd2lzZSwgbmVnYXRpdmUgdmFsdWVzIG11c3QgYmUgDQorICAgICAgICAvLy8gc2lnbi1leHRlbmRlZCB0byA2NCBiaXRzIHRvIGJlIHZhcmludCBlbmNvZGVkLCB0aHVzIGFsd2F5cyB0YWtpbmcNCisgICAgICAgIC8vLyAxMCBieXRlcyBvbiB0aGUgd2lyZS4pDQorICAgICAgICAvLy8gPC9yZW1hcmtzPg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgc3RhdGljIHVpbnQgRW5jb2RlWmlnWmFnMzIoaW50IG4pDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gTm90ZTogIHRoZSByaWdodC1zaGlmdCBtdXN0IGJlIGFyaXRobWV0aWMNCisgICAgICAgICAgICByZXR1cm4gKHVpbnQpICgobiA8PCAxKSBeIChuID4+IDMxKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRW5jb2RlIGEgNjQtYml0IHZhbHVlIHdpdGggWmlnWmFnIGVuY29kaW5nLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz4NCisgICAgICAgIC8vLyBaaWdaYWcgZW5jb2RlcyBzaWduZWQgaW50ZWdlcnMgaW50byB2YWx1ZXMgdGhhdCBjYW4gYmUgZWZmaWNpZW50bHkNCisgICAgICAgIC8vLyBlbmNvZGVkIHdpdGggdmFyaW50LiAgKE90aGVyd2lzZSwgbmVnYXRpdmUgdmFsdWVzIG11c3QgYmUgDQorICAgICAgICAvLy8gc2lnbi1leHRlbmRlZCB0byA2NCBiaXRzIHRvIGJlIHZhcmludCBlbmNvZGVkLCB0aHVzIGFsd2F5cyB0YWtpbmcNCisgICAgICAgIC8vLyAxMCBieXRlcyBvbiB0aGUgd2lyZS4pDQorICAgICAgICAvLy8gPC9yZW1hcmtzPg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgc3RhdGljIHVsb25nIEVuY29kZVppZ1phZzY0KGxvbmcgbikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gKHVsb25nKSAoKG4gPDwgMSkgXiAobiA+PiA2MykpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJlZnJlc2hCdWZmZXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIFdlJ3JlIHdyaXRpbmcgdG8gYSBzaW5nbGUgYnVmZmVyLg0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3V0T2ZTcGFjZUV4Y2VwdGlvbigpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBTaW5jZSB3ZSBoYXZlIGFuIG91dHB1dCBzdHJlYW0sIHRoaXMgaXMgb3VyIGJ1ZmZlcg0KKyAgICAgICAgICAgIC8vIGFuZCBidWZmZXIgb2Zmc2V0ID09IDANCisgICAgICAgICAgICBvdXRwdXQuV3JpdGUoYnVmZmVyLCAwLCBwb3NpdGlvbik7DQorICAgICAgICAgICAgcG9zaXRpb24gPSAwOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEluZGljYXRlcyB0aGF0IGEgQ29kZWRPdXRwdXRTdHJlYW0gd3JhcHBpbmcgYSBmbGF0IGJ5dGUgYXJyYXkNCisgICAgICAgIC8vLyByYW4gb3V0IG9mIHNwYWNlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgT3V0T2ZTcGFjZUV4Y2VwdGlvbiA6IElPRXhjZXB0aW9uDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50ZXJuYWwgT3V0T2ZTcGFjZUV4Y2VwdGlvbigpDQorICAgICAgICAgICAgICAgIDogYmFzZSgiQ29kZWRPdXRwdXRTdHJlYW0gd2FzIHdyaXRpbmcgdG8gYSBmbGF0IGJ5dGUgYXJyYXkgYW5kIHJhbiBvdXQgb2Ygc3BhY2UuIikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgRmx1c2goKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFJlZnJlc2hCdWZmZXIoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVmVyaWZpZXMgdGhhdCBTcGFjZUxlZnQgcmV0dXJucyB6ZXJvLiBJdCdzIGNvbW1vbiB0byBjcmVhdGUgYSBieXRlIGFycmF5DQorICAgICAgICAvLy8gdGhhdCBpcyBleGFjdGx5IGJpZyBlbm91Z2ggdG8gaG9sZCBhIG1lc3NhZ2UsIHRoZW4gd3JpdGUgdG8gaXQgd2l0aA0KKyAgICAgICAgLy8vIGEgQ29kZWRPdXRwdXRTdHJlYW0uIENhbGxpbmcgQ2hlY2tOb1NwYWNlTGVmdCBhZnRlciB3cml0aW5nIHZlcmlmaWVzIHRoYXQNCisgICAgICAgIC8vLyB0aGUgbWVzc2FnZSB3YXMgYWN0dWFsbHkgYXMgYmlnIGFzIGV4cGVjdGVkLCB3aGljaCBjYW4gaGVscCBidWdzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIENoZWNrTm9TcGFjZUxlZnQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChTcGFjZUxlZnQgIT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJEaWQgbm90IHdyaXRlIGFzIG11Y2ggZGF0YSBhcyBleHBlY3RlZC4iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSWYgd3JpdGluZyB0byBhIGZsYXQgYXJyYXksIHJldHVybnMgdGhlIHNwYWNlIGxlZnQgaW4gdGhlIGFycmF5LiBPdGhlcndpc2UsDQorICAgICAgICAvLy8gdGhyb3dzIGFuIEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGludCBTcGFjZUxlZnQNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0IC0gcG9zaXRpb247DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgICAgICAgICAiU3BhY2VMZWZ0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBDb2RlZE91dHB1dFN0cmVhbXMgdGhhdCBhcmUgIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRpbmcgdG8gYSBmbGF0IGFycmF5LiIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0NvbGxlY3Rpb25zL0RpY3Rpb25hcmllcy5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0NvbGxlY3Rpb25zL0RpY3Rpb25hcmllcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjM3OTFiCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQ29sbGVjdGlvbnMvRGljdGlvbmFyaWVzLmNzCkBAIC0wLDAgKzEsMTIyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBVdGlsaXR5IGNsYXNzIGZvciBkaWN0aW9uYXJpZXMuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGljdGlvbmFyaWVzDQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wYXJlcyB0d28gZGljdGlvbmFyaWVzIGZvciBlcXVhbGl0eS4gRWFjaCB2YWx1ZSBpcyBjb21wYXJlZCB3aXRoIGVxdWFsaXR5IHVzaW5nIEVxdWFscw0KKyAgICAgICAgLy8vIGZvciBub24tSUVudW1lcmFibGUgaW1wbGVtZW50YXRpb25zLCBhbmQgdXNpbmcgRW51bWVyYWJsZUVxdWFscyBvdGhlcndpc2UuDQorICAgICAgICAvLy8gVE9ETyhqb25za2VldCk6IFRoaXMgaXMgY2xlYXJseSBwcmV0dHkgc2xvdywgYW5kIGludm9sdmVzIGxvdHMgb2YgYm94aW5nL3VuYm94aW5nLi4uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEVxdWFsczxUS2V5LCBUVmFsdWU+KElEaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4gbGVmdCwgSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiByaWdodCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAobGVmdC5Db3VudCAhPSByaWdodC5Db3VudCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4gbGVmdEVudHJ5IGluIGxlZnQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBUVmFsdWUgcmlnaHRWYWx1ZTsNCisgICAgICAgICAgICAgICAgaWYgKCFyaWdodC5UcnlHZXRWYWx1ZShsZWZ0RW50cnkuS2V5LCBvdXQgcmlnaHRWYWx1ZSkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBJRW51bWVyYWJsZSBsZWZ0RW51bWVyYWJsZSA9IGxlZnRFbnRyeS5WYWx1ZSBhcyBJRW51bWVyYWJsZTsNCisgICAgICAgICAgICAgICAgSUVudW1lcmFibGUgcmlnaHRFbnVtZXJhYmxlID0gcmlnaHRWYWx1ZSBhcyBJRW51bWVyYWJsZTsNCisgICAgICAgICAgICAgICAgaWYgKGxlZnRFbnVtZXJhYmxlID09IG51bGwgfHwgcmlnaHRFbnVtZXJhYmxlID09IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICghRXF1YWxzKGxlZnRFbnRyeS5WYWx1ZSwgcmlnaHRWYWx1ZSkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFFbnVtZXJhYmxlcy5FcXVhbHMobGVmdEVudW1lcmFibGUsIHJpZ2h0RW51bWVyYWJsZSkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBJRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+IEFzUmVhZE9ubHk8VEtleSwgVFZhbHVlPihJRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+IGRpY3Rpb25hcnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIGRpY3Rpb25hcnkuSXNSZWFkT25seSA/IGRpY3Rpb25hcnkgOiBuZXcgUmVhZE9ubHlEaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4oZGljdGlvbmFyeSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIGhhc2hjb2RlIGZvciBhIGRpY3Rpb25hcnkgYnkgWE9SaW5nIHRoZSBoYXNoY29kZXMgb2YgYWxsIHRoZSBmaWVsZHMNCisgICAgICAgIC8vLyBhbmQgdmFsdWVzLiAoQnkgWE9SaW5nLCB3ZSBhdm9pZCBvcmRlcmluZyBpc3N1ZXMuKQ0KKyAgICAgICAgLy8vIFRPRE8oam9uc2tlZXQpOiBDdXJyZW50bHkgWE9ScyBvdGhlciBzdHVmZiB0b28sIGFuZCBhc3N1bWVzIG5vbi1udWxsIHZhbHVlcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBHZXRIYXNoQ29kZTxUS2V5LCBUVmFsdWU+KElEaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4gZGljdGlvbmFyeSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgcmV0ID0gMzE7DQorICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4gZW50cnkgaW4gZGljdGlvbmFyeSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGludCBoYXNoID0gZW50cnkuS2V5LkdldEhhc2hDb2RlKCkgXiBHZXREZWVwSGFzaENvZGUoZW50cnkuVmFsdWUpOw0KKyAgICAgICAgICAgICAgICByZXQgXj0gaGFzaDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJldDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBEZXRlcm1pbmVzIHRoZSBoYXNoIG9mIGEgdmFsdWUgYnkgZWl0aGVyIHRha2luZyBpdCBkaXJlY3RseSBvciBoYXNoaW5nIGFsbCB0aGUgZWxlbWVudHMNCisgICAgICAgIC8vLyBmb3IgSUVudW1lcmFibGUgaW1wbGVtZW50YXRpb25zLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBHZXREZWVwSGFzaENvZGUob2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIElFbnVtZXJhYmxlIGl0ZXJhYmxlID0gdmFsdWUgYXMgSUVudW1lcmFibGU7DQorICAgICAgICAgICAgaWYgKGl0ZXJhYmxlID09IG51bGwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuR2V0SGFzaENvZGUoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaW50IGhhc2ggPSAyOTsNCisgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgZWxlbWVudCBpbiBpdGVyYWJsZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGhhc2ggPSBoYXNoKjM3ICsgZWxlbWVudC5HZXRIYXNoQ29kZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gaGFzaDsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Db2xsZWN0aW9ucy9FbnVtZXJhYmxlcy5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0NvbGxlY3Rpb25zL0VudW1lcmFibGVzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDlhODMKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Db2xsZWN0aW9ucy9FbnVtZXJhYmxlcy5jcwpAQCAtMCwwICsxLDc0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBVdGlsaXR5IGNsYXNzIGZvciBJRW51bWVyYWJsZSAoYW5kIHBvdGVudGlhbGx5IHRoZSBnZW5lcmljIHZlcnNpb24gaW4gdGhlIGZ1dHVyZSkuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW51bWVyYWJsZXMNCisgICAgew0KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEVxdWFscyhJRW51bWVyYWJsZSBsZWZ0LCBJRW51bWVyYWJsZSByaWdodCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJRW51bWVyYXRvciBsZWZ0RW51bWVyYXRvciA9IGxlZnQuR2V0RW51bWVyYXRvcigpOw0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IHJpZ2h0T2JqZWN0IGluIHJpZ2h0KQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIWxlZnRFbnVtZXJhdG9yLk1vdmVOZXh0KCkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFFcXVhbHMobGVmdEVudW1lcmF0b3IuQ3VycmVudCwgcmlnaHRPYmplY3QpKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAobGVmdEVudW1lcmF0b3IuTW92ZU5leHQoKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZpbmFsbHkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIElEaXNwb3NhYmxlIGxlZnRFbnVtZXJhdG9yRGlzcG9zYWJsZSA9IGxlZnRFbnVtZXJhdG9yIGFzIElEaXNwb3NhYmxlOw0KKyAgICAgICAgICAgICAgICBpZiAobGVmdEVudW1lcmF0b3JEaXNwb3NhYmxlICE9IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGxlZnRFbnVtZXJhdG9yRGlzcG9zYWJsZS5EaXNwb3NlKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQ29sbGVjdGlvbnMvSVBvcHNpY2xlTGlzdC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0NvbGxlY3Rpb25zL0lQb3BzaWNsZUxpc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhNzU4MQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0NvbGxlY3Rpb25zL0lQb3BzaWNsZUxpc3QuY3MKQEAgLTAsMCArMSw1OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEEgbGlzdCB3aGljaCBoYXMgYW4gQWRkIG1ldGhvZCB3aGljaCBhY2NlcHRzIGFuIElFbnVtZXJhYmxlW1RdLg0KKyAgICAvLy8gVGhpcyBhbGxvd3Mgd2hvbGUgY29sbGVjdGlvbnMgdG8gYmUgYWRkZWQgZWFzaWx5IHVzaW5nIGNvbGxlY3Rpb24gaW5pdGlhbGl6ZXJzLg0KKyAgICAvLy8gSXQgY2F1c2VzIGEgcG90ZW50aWFsIG92ZXJsb2FkIGNvbmZ1c2lvbiBpZiBUIDogSUVudW1lcmFibGVbVF0sIGJ1dCBpbg0KKyAgICAvLy8gcHJhY3RpY2UgdGhhdCB3b24ndCBoYXBwZW4gaW4gcHJvdG9jb2wgYnVmZmVycy4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgLy8vIDxyZW1hcmtzPlRoaXMgaXMgb25seSBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYnkgUG9wc2ljbGVMaXN0LCBhbmQgaXQncyBsaWtlbHkNCisgICAgLy8vIHRvIHN0YXkgdGhhdCB3YXkgLSBoZW5jZSB0aGUgbmFtZS4gTW9yZSBnZW51aW5lbHkgZGVzY3JpcHRpdmUgbmFtZXMgYXJlDQorICAgIC8vLyBob3JyaWJseSB1Z2x5LiAoQXQgbGVhc3QsIHRoZSBvbmVzIHRoZSBhdXRob3IgY291bGQgdGhpbmsgb2YuLi4pPC9yZW1hcmtzPg0KKyAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgZWxlbWVudCB0eXBlIG9mIHRoZSBsaXN0PC90eXBlcGFyYW0+DQorICAgIHB1YmxpYyBpbnRlcmZhY2UgSVBvcHNpY2xlTGlzdDxUPiA6IElMaXN0PFQ+DQorICAgIHsNCisgICAgICAgIHZvaWQgQWRkKElFbnVtZXJhYmxlPFQ+IGNvbGxlY3Rpb24pOw0KKyAgICB9DQorDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFVzZWQgdG8gZWZmaWNpZW50bHkgY2FzdCB0aGUgZWxlbWVudHMgb2YgZW51bWVyYXRpb25zDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIGludGVybmFsIGludGVyZmFjZSBJQ2FzdEFycmF5DQorICAgIHsNCisgICAgICAgIElFbnVtZXJhYmxlPFRJdGVtVHlwZT4gQ2FzdEFycmF5PFRJdGVtVHlwZT4oKTsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Db2xsZWN0aW9ucy9MaXN0cy5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0NvbGxlY3Rpb25zL0xpc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNGUxZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Db2xsZWN0aW9ucy9MaXN0cy5jcwpAQCAtMCwwICsxLDExMCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBVdGlsaXR5IG5vbi1nZW5lcmljIGNsYXNzIGZvciBjYWxsaW5nIGludG8gTGlzdHN7VH0gdXNpbmcgdHlwZSBpbmZlcmVuY2UuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGlzdHMNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgYSByZWFkLW9ubHkgdmlldyBvZiB0aGUgc3BlY2lmaWVkIGxpc3QuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBJTGlzdDxUPiBBc1JlYWRPbmx5PFQ+KElMaXN0PFQ+IGxpc3QpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIExpc3RzPFQ+LkFzUmVhZE9ubHkobGlzdCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgRXF1YWxzPFQ+KElMaXN0PFQ+IGxlZnQsIElMaXN0PFQ+IHJpZ2h0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGxlZnQuQ291bnQgIT0gcmlnaHQuQ291bnQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIElFcXVhbGl0eUNvbXBhcmVyPFQ+IGNvbXBhcmVyID0gRXF1YWxpdHlDb21wYXJlcjxUPi5EZWZhdWx0Ow0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVmdC5Db3VudDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKCFjb21wYXJlci5FcXVhbHMobGVmdFtpXSwgcmlnaHRbaV0pKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBHZXRIYXNoQ29kZTxUPihJTGlzdDxUPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGludCBoYXNoID0gMzE7DQorICAgICAgICAgICAgZm9yZWFjaCAoVCBlbGVtZW50IGluIGxpc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBoYXNoID0gaGFzaCoyOSArIGVsZW1lbnQuR2V0SGFzaENvZGUoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGhhc2g7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gVXRpbGl0eSBjbGFzcyBmb3IgZGVhbGluZyB3aXRoIGxpc3RzLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpc3RzPFQ+DQorICAgIHsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJlYWRPbmx5Q29sbGVjdGlvbjxUPiBlbXB0eSA9IG5ldyBSZWFkT25seUNvbGxlY3Rpb248VD4obmV3IFRbMF0pOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgYW4gaW1tdXRhYmxlIGVtcHR5IGxpc3QuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZWFkT25seUNvbGxlY3Rpb248VD4gRW1wdHkNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZW1wdHk7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIGVpdGhlciB0aGUgb3JpZ2luYWwgcmVmZXJlbmNlIGlmIGl0J3MgYWxyZWFkeSByZWFkLW9ubHksDQorICAgICAgICAvLy8gb3IgYSBuZXcgUmVhZE9ubHlDb2xsZWN0aW9uIHdyYXBwaW5nIHRoZSBvcmlnaW5hbCBsaXN0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUxpc3Q8VD4gQXNSZWFkT25seShJTGlzdDxUPiBsaXN0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBsaXN0LklzUmVhZE9ubHkgPyBsaXN0IDogbmV3IFJlYWRPbmx5Q29sbGVjdGlvbjxUPihsaXN0KTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Db2xsZWN0aW9ucy9Qb3BzaWNsZUxpc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Db2xsZWN0aW9ucy9Qb3BzaWNsZUxpc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlOTdmOAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0NvbGxlY3Rpb25zL1BvcHNpY2xlTGlzdC5jcwpAQCAtMCwwICsxLDIwOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9ucw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gUHJveGllcyBjYWxscyB0byBhIDxzZWUgY3JlZj0iTGlzdHtUfSIgLz4sIGJ1dCBhbGxvd3MgdGhlIGxpc3QNCisgICAgLy8vIHRvIGJlIG1hZGUgcmVhZC1vbmx5ICh3aXRoIHRoZSA8c2VlIGNyZWY9Ik1ha2VSZWFkT25seSIgLz4gbWV0aG9kKSwgDQorICAgIC8vLyBhZnRlciB3aGljaCBhbnkgbW9kaWZ5aW5nIG1ldGhvZHMgdGhyb3cgPHNlZSBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iIC8+Lg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIFBvcHNpY2xlTGlzdDxUPiA6IElQb3BzaWNsZUxpc3Q8VD4sIElDYXN0QXJyYXkNCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYm9vbCBDaGVja0Zvck51bGwgPSBkZWZhdWx0KFQpID09IG51bGw7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUW10gRW1wdHlTZXQgPSBuZXcgVFswXTsNCisNCisgICAgICAgIHByaXZhdGUgTGlzdDxUPiBpdGVtczsNCisgICAgICAgIHByaXZhdGUgYm9vbCByZWFkT25seTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBNYWtlcyB0aGlzIGxpc3QgcmVhZC1vbmx5ICgiZnJlZXplcyB0aGUgcG9wc2ljbGUiKS4gRnJvbSB0aGlzDQorICAgICAgICAvLy8gcG9pbnQgb24sIG11dGF0aW5nIG1ldGhvZHMgKENsZWFyLCBBZGQgZXRjKSB3aWxsIHRocm93IGENCisgICAgICAgIC8vLyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24uIFRoZXJlIGlzIG5vIHdheSBvZiAiZGVmcm9zdGluZyIgdGhlIGxpc3QgYWZ0ZXJ3YXJkcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdm9pZCBNYWtlUmVhZE9ubHkoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBpbnQgSW5kZXhPZihUIGl0ZW0pDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIGl0ZW1zID09IG51bGwgPyAtMSA6IGl0ZW1zLkluZGV4T2YoaXRlbSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBJbnNlcnQoaW50IGluZGV4LCBUIGl0ZW0pDQorICAgICAgICB7DQorICAgICAgICAgICAgVmFsaWRhdGVNb2RpZmljYXRpb24oKTsNCisgICAgICAgICAgICBpZiAoQ2hlY2tGb3JOdWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoaXRlbSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGl0ZW1zLkluc2VydChpbmRleCwgaXRlbSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmVBdChpbnQgaW5kZXgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVmFsaWRhdGVNb2RpZmljYXRpb24oKTsNCisgICAgICAgICAgICBpdGVtcy5SZW1vdmVBdChpbmRleCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgVCB0aGlzW2ludCBpbmRleF0NCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChpdGVtcyA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zW2luZGV4XTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBWYWxpZGF0ZU1vZGlmaWNhdGlvbigpOw0KKyAgICAgICAgICAgICAgICBpZiAoQ2hlY2tGb3JOdWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaXRlbXNbaW5kZXhdID0gdmFsdWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgQWRkKFQgaXRlbSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBWYWxpZGF0ZU1vZGlmaWNhdGlvbigpOw0KKyAgICAgICAgICAgIGlmIChDaGVja0Zvck51bGwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChpdGVtKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaXRlbXMuQWRkKGl0ZW0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFZhbGlkYXRlTW9kaWZpY2F0aW9uKCk7DQorICAgICAgICAgICAgaXRlbXMuQ2xlYXIoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBib29sIENvbnRhaW5zKFQgaXRlbSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gaXRlbXMgPT0gbnVsbCA/IGZhbHNlIDogaXRlbXMuQ29udGFpbnMoaXRlbSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG8oVFtdIGFycmF5LCBpbnQgYXJyYXlJbmRleCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoaXRlbXMgIT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGl0ZW1zLkNvcHlUbyhhcnJheSwgYXJyYXlJbmRleCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGludCBDb3VudA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBpdGVtcyA9PSBudWxsID8gMCA6IGl0ZW1zLkNvdW50OyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBJc1JlYWRPbmx5DQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlYWRPbmx5OyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmUoVCBpdGVtKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFZhbGlkYXRlTW9kaWZpY2F0aW9uKCk7DQorICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLlJlbW92ZShpdGVtKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBJRW51bWVyYXRvcjxUPiBHZXRFbnVtZXJhdG9yKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJRW51bWVyYWJsZTxUPiB0ZW51bSA9IChJRW51bWVyYWJsZTxUPilpdGVtcyA/PyBFbXB0eVNldDsNCisgICAgICAgICAgICByZXR1cm4gdGVudW0uR2V0RW51bWVyYXRvcigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgSUVudW1lcmF0b3IgSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEdldEVudW1lcmF0b3IoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZChJRW51bWVyYWJsZTxUPiBjb2xsZWN0aW9uKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFZhbGlkYXRlTW9kaWZpY2F0aW9uKCk7DQorICAgICAgICAgICAgVGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoY29sbGVjdGlvbik7DQorDQorICAgICAgICAgICAgaWYgKCFDaGVja0Zvck51bGwgfHwgY29sbGVjdGlvbiBpcyBQb3BzaWNsZUxpc3Q8VD4pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpdGVtcy5BZGRSYW5nZShjb2xsZWN0aW9uKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gQXNzdW1wdGlvbiwgaXQncyBvayB0byBlbnVtZXJhdGUgY29sbGVjdGlvbnMgbW9yZSB0aGFuIG9uY2UuDQorICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uIGlzIElDb2xsZWN0aW9uPFQ+KQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBUaHJvd0hlbHBlci5UaHJvd0lmQW55TnVsbChjb2xsZWN0aW9uKTsNCisgICAgICAgICAgICAgICAgICAgIGl0ZW1zLkFkZFJhbmdlKGNvbGxlY3Rpb24pOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoVCBpdGVtIGluIGNvbGxlY3Rpb24pDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoaXRlbSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuQWRkKGl0ZW0pOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFZhbGlkYXRlTW9kaWZpY2F0aW9uKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAocmVhZE9ubHkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJMaXN0IGlzIHJlYWQtb25seSIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoaXRlbXMgPT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGl0ZW1zID0gbmV3IExpc3Q8VD4oKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBJRW51bWVyYWJsZTxUSXRlbVR5cGU+IElDYXN0QXJyYXkuQ2FzdEFycmF5PFRJdGVtVHlwZT4oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChpdGVtcyA9PSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFBvcHNpY2xlTGlzdDxUSXRlbVR5cGU+LkVtcHR5U2V0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gKFRJdGVtVHlwZVtdKSAob2JqZWN0KSBpdGVtcy5Ub0FycmF5KCk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQ29sbGVjdGlvbnMvUmVhZE9ubHlEaWN0aW9uYXJ5LmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQ29sbGVjdGlvbnMvUmVhZE9ubHlEaWN0aW9uYXJ5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYmM1NWYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Db2xsZWN0aW9ucy9SZWFkT25seURpY3Rpb25hcnkuY3MKQEAgLTAsMCArMSwxNDYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFJlYWQtb25seSB3cmFwcGVyIGFyb3VuZCBhbm90aGVyIGRpY3Rpb25hcnkuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgUmVhZE9ubHlEaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4gOiBJRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+DQorICAgIHsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiB3cmFwcGVkOw0KKw0KKyAgICAgICAgcHVibGljIFJlYWRPbmx5RGljdGlvbmFyeShJRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+IHdyYXBwZWQpDQorICAgICAgICB7DQorICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZChUS2V5IGtleSwgVFZhbHVlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBDb250YWluc0tleShUS2V5IGtleSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5Db250YWluc0tleShrZXkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIElDb2xsZWN0aW9uPFRLZXk+IEtleXMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gd3JhcHBlZC5LZXlzOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmUoVEtleSBrZXkpDQorICAgICAgICB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBib29sIFRyeUdldFZhbHVlKFRLZXkga2V5LCBvdXQgVFZhbHVlIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLlRyeUdldFZhbHVlKGtleSwgb3V0IHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBJQ29sbGVjdGlvbjxUVmFsdWU+IFZhbHVlcw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB3cmFwcGVkLlZhbHVlczsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIFRWYWx1ZSB0aGlzW1RLZXkga2V5XQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB3cmFwcGVkW2tleV07IH0NCisgICAgICAgICAgICBzZXQgeyB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBBZGQoS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4gaXRlbSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBDb250YWlucyhLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPiBpdGVtKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLkNvbnRhaW5zKGl0ZW0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgQ29weVRvKEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+W10gYXJyYXksIGludCBhcnJheUluZGV4KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyYXBwZWQuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gd3JhcHBlZC5Db3VudDsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGJvb2wgSXNSZWFkT25seQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0cnVlOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmUoS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4gaXRlbSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIElFbnVtZXJhdG9yPEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+PiBHZXRFbnVtZXJhdG9yKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5HZXRFbnVtZXJhdG9yKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gKChJRW51bWVyYWJsZSkgd3JhcHBlZCkuR2V0RW51bWVyYXRvcigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuRXF1YWxzKG9iaik7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5HZXRIYXNoQ29kZSgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuVG9TdHJpbmcoKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9DdXN0b21TZXJpYWxpemF0aW9uLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQ3VzdG9tU2VyaWFsaXphdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTlmY2EyCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvQ3VzdG9tU2VyaWFsaXphdGlvbi5jcwpAQCAtMCwwICsxLDIwMSBAQAor77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKy8qDQorICogVGhpcyBlbnRpcmUgc291cmNlIGZpbGUgaXMgbm90IHN1cHBvcnRlZCBvbiBzb21lIHBsYXRmb3JtDQorICovDQorI2lmICFOT1NFUklBTElaQUJMRQ0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuUGVybWlzc2lvbnM7DQordXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjsNCit1c2luZyBTeXN0ZW0uU2VjdXJpdHk7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8qIA0KKyAgICAgKiBTcGVjaWFsaXplZCBoYW5kaW5nIG9mICphbGwqIG1lc3NhZ2UgdHlwZXMuICBNZXNzYWdlcyBhcmUgc2VyaWFsaXplZCBpbnRvIGEgYnl0ZVtdIGFuZCBzdG9yZWQNCisgICAgICogaW50byB0aGUgU2VyaWFsaXphdGlvbkluZm8sIGFuZCBhcmUgdGhlbiByZWNvbnN0aXR1dGVkIGJ5IGFuIElPYmplY3RSZWZlcmVuY2UgY2xhc3MgYWZ0ZXINCisgICAgICogZGVzZXJpYWxpemF0aW9uLiAgSURlc2VyaWFsaXphdGlvbkNhbGxiYWNrIGlzIHN1cHBvcnRlZCBvbiBib3RoIHRoZSBCdWlsZGVyIGFuZCBNZXNzYWdlLg0KKyAgICAgKi8NCisgICAgW1NlcmlhbGl6YWJsZV0NCisgICAgcGFydGlhbCBjbGFzcyBBYnN0cmFjdE1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gOiBJU2VyaWFsaXphYmxlDQorICAgIHsNCisgICAgICAgIFtTZWN1cml0eUNyaXRpY2FsXQ0KKyAgICAgICAgW1NlY3VyaXR5UGVybWlzc2lvbihTZWN1cml0eUFjdGlvbi5MaW5rRGVtYW5kLCBGbGFncyA9IFNlY3VyaXR5UGVybWlzc2lvbkZsYWcuU2VyaWFsaXphdGlvbkZvcm1hdHRlcildDQorICAgICAgICB2b2lkIElTZXJpYWxpemFibGUuR2V0T2JqZWN0RGF0YShTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaW5mby5TZXRUeXBlKHR5cGVvZihTZXJpYWxpemF0aW9uU3Vycm9nYXRlKSk7DQorICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgibWVzc2FnZSIsIFRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgICAgIGluZm8uQWRkVmFsdWUoImluaXRpYWxpemVkIiwgSXNJbml0aWFsaXplZCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbU2VyaWFsaXphYmxlXQ0KKyAgICAgICAgcHJpdmF0ZSBzZWFsZWQgY2xhc3MgU2VyaWFsaXphdGlvblN1cnJvZ2F0ZSA6IElPYmplY3RSZWZlcmVuY2UsIElTZXJpYWxpemFibGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdGF0aWMgcmVhZG9ubHkgVEJ1aWxkZXIgVGVtcGxhdGVJbnN0YW5jZSA9IChUQnVpbGRlcilBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2UodHlwZW9mKFRCdWlsZGVyKSk7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gX21lc3NhZ2U7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF9pbml0aWFsaXplZDsNCisNCisgICAgICAgICAgICBwcml2YXRlIFNlcmlhbGl6YXRpb25TdXJyb2dhdGUoU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgX21lc3NhZ2UgPSAoYnl0ZVtdKWluZm8uR2V0VmFsdWUoIm1lc3NhZ2UiLCB0eXBlb2YoYnl0ZVtdKSk7DQorICAgICAgICAgICAgICAgIF9pbml0aWFsaXplZCA9IGluZm8uR2V0Qm9vbGVhbigiaW5pdGlhbGl6ZWQiKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgW1NlY3VyaXR5Q3JpdGljYWxdDQorICAgICAgICAgICAgW1NlY3VyaXR5UGVybWlzc2lvbihTZWN1cml0eUFjdGlvbi5MaW5rRGVtYW5kLCBGbGFncyA9IFNlY3VyaXR5UGVybWlzc2lvbkZsYWcuU2VyaWFsaXphdGlvbkZvcm1hdHRlcildDQorICAgICAgICAgICAgb2JqZWN0IElPYmplY3RSZWZlcmVuY2UuR2V0UmVhbE9iamVjdChTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IGNvbnRleHQuQ29udGV4dCBhcyBFeHRlbnNpb25SZWdpc3RyeTsNCisgICAgICAgICAgICAgICAgVEJ1aWxkZXIgYnVpbGRlciA9IFRlbXBsYXRlSW5zdGFuY2UuRGVmYXVsdEluc3RhbmNlRm9yVHlwZS5DcmVhdGVCdWlsZGVyRm9yVHlwZSgpOw0KKyAgICAgICAgICAgICAgICBidWlsZGVyLk1lcmdlRnJvbShfbWVzc2FnZSwgcmVnaXN0cnkgPz8gRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKw0KKyAgICAgICAgICAgICAgICBJRGVzZXJpYWxpemF0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPSBidWlsZGVyIGFzIElEZXNlcmlhbGl6YXRpb25DYWxsYmFjazsNCisgICAgICAgICAgICAgICAgaWYoY2FsbGJhY2sgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suT25EZXNlcmlhbGl6YXRpb24oY29udGV4dCk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IF9pbml0aWFsaXplZCA/IGJ1aWxkZXIuQnVpbGQoKSA6IGJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbWVzc2FnZSBhcyBJRGVzZXJpYWxpemF0aW9uQ2FsbGJhY2s7DQorICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5PbkRlc2VyaWFsaXphdGlvbihjb250ZXh0KTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgW1NlY3VyaXR5Q3JpdGljYWxdDQorICAgICAgICAgICAgW1NlY3VyaXR5UGVybWlzc2lvbihTZWN1cml0eUFjdGlvbi5MaW5rRGVtYW5kLCBGbGFncyA9IFNlY3VyaXR5UGVybWlzc2lvbkZsYWcuU2VyaWFsaXphdGlvbkZvcm1hdHRlcildDQorICAgICAgICAgICAgdm9pZCBJU2VyaWFsaXphYmxlLkdldE9iamVjdERhdGEoU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgibWVzc2FnZSIsIF9tZXNzYWdlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgW1NlcmlhbGl6YWJsZV0NCisgICAgcGFydGlhbCBjbGFzcyBBYnN0cmFjdEJ1aWxkZXJMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gOiBJU2VyaWFsaXphYmxlDQorICAgIHsNCisgICAgICAgIFtTZWN1cml0eUNyaXRpY2FsXQ0KKyAgICAgICAgW1NlY3VyaXR5UGVybWlzc2lvbihTZWN1cml0eUFjdGlvbi5MaW5rRGVtYW5kLCBGbGFncyA9IFNlY3VyaXR5UGVybWlzc2lvbkZsYWcuU2VyaWFsaXphdGlvbkZvcm1hdHRlcildDQorICAgICAgICB2b2lkIElTZXJpYWxpemFibGUuR2V0T2JqZWN0RGF0YShTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaW5mby5TZXRUeXBlKHR5cGVvZihTZXJpYWxpemF0aW9uU3Vycm9nYXRlKSk7DQorICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgibWVzc2FnZSIsIENsb25lKCkuQnVpbGRQYXJ0aWFsKCkuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbU2VyaWFsaXphYmxlXQ0KKyAgICAgICAgcHJpdmF0ZSBzZWFsZWQgY2xhc3MgU2VyaWFsaXphdGlvblN1cnJvZ2F0ZSA6IElPYmplY3RSZWZlcmVuY2UsIElTZXJpYWxpemFibGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdGF0aWMgcmVhZG9ubHkgVEJ1aWxkZXIgVGVtcGxhdGVJbnN0YW5jZSA9IChUQnVpbGRlcilBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2UodHlwZW9mKFRCdWlsZGVyKSk7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gX21lc3NhZ2U7DQorDQorICAgICAgICAgICAgcHJpdmF0ZSBTZXJpYWxpemF0aW9uU3Vycm9nYXRlKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF9tZXNzYWdlID0gKGJ5dGVbXSlpbmZvLkdldFZhbHVlKCJtZXNzYWdlIiwgdHlwZW9mKGJ5dGVbXSkpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBbU2VjdXJpdHlDcml0aWNhbF0NCisgICAgICAgICAgICBbU2VjdXJpdHlQZXJtaXNzaW9uKFNlY3VyaXR5QWN0aW9uLkxpbmtEZW1hbmQsIEZsYWdzID0gU2VjdXJpdHlQZXJtaXNzaW9uRmxhZy5TZXJpYWxpemF0aW9uRm9ybWF0dGVyKV0NCisgICAgICAgICAgICBvYmplY3QgSU9iamVjdFJlZmVyZW5jZS5HZXRSZWFsT2JqZWN0KFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gY29udGV4dC5Db250ZXh0IGFzIEV4dGVuc2lvblJlZ2lzdHJ5Ow0KKyAgICAgICAgICAgICAgICBUQnVpbGRlciBidWlsZGVyID0gVGVtcGxhdGVJbnN0YW5jZS5EZWZhdWx0SW5zdGFuY2VGb3JUeXBlLkNyZWF0ZUJ1aWxkZXJGb3JUeXBlKCk7DQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuTWVyZ2VGcm9tKF9tZXNzYWdlLCByZWdpc3RyeSA/PyBFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorDQorICAgICAgICAgICAgICAgIElEZXNlcmlhbGl6YXRpb25DYWxsYmFjayBjYWxsYmFjayA9IGJ1aWxkZXIgYXMgSURlc2VyaWFsaXphdGlvbkNhbGxiYWNrOw0KKyAgICAgICAgICAgICAgICBpZihjYWxsYmFjayAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5PbkRlc2VyaWFsaXphdGlvbihjb250ZXh0KTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgW1NlY3VyaXR5Q3JpdGljYWxdDQorICAgICAgICAgICAgW1NlY3VyaXR5UGVybWlzc2lvbihTZWN1cml0eUFjdGlvbi5MaW5rRGVtYW5kLCBGbGFncyA9IFNlY3VyaXR5UGVybWlzc2lvbkZsYWcuU2VyaWFsaXphdGlvbkZvcm1hdHRlcildDQorICAgICAgICAgICAgdm9pZCBJU2VyaWFsaXphYmxlLkdldE9iamVjdERhdGEoU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgibWVzc2FnZSIsIF9tZXNzYWdlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICogU3ByZWFkIHNvbWUgYXR0cmlidXRlIGxvdmUgYXJvdW5kLCBrZWVwaW5nIHRoaXMgYWxsIGhlcmUgc28gd2UgZG9uJ3QgdXNlIGNvbmRpdGlvbmFsIGNvbXBsaWF0aW9uIA0KKyAgICAgKiBpbiBldmVyeSBvbmUgb2YgdGhlc2UgY2xhc3Nlcy4gIElmIHdlIGludHJvZHVjZSBhIG5ldyBwbGF0Zm9ybSB0aGF0IGFsc28gZG9lcyBub3Qgc3VwcG9ydCB0aGlzDQorICAgICAqIHdlIGNhbiBjb250cm9sIGl0IGFsbCBmcm9tIHRoaXMgc291cmNlIGZpbGUuDQorICAgICAqLw0KKw0KKyAgICBbU2VyaWFsaXphYmxlXQ0KKyAgICBwYXJ0aWFsIGNsYXNzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4geyB9DQorDQorICAgIFtTZXJpYWxpemFibGVdDQorICAgIHBhcnRpYWwgY2xhc3MgRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4geyB9DQorDQorICAgIFtTZXJpYWxpemFibGVdDQorICAgIHBhcnRpYWwgY2xhc3MgQWJzdHJhY3RNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4geyB9DQorDQorICAgIFtTZXJpYWxpemFibGVdDQorICAgIHBhcnRpYWwgY2xhc3MgR2VuZXJhdGVkTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+IHsgfQ0KKw0KKyAgICBbU2VyaWFsaXphYmxlXQ0KKyAgICBwYXJ0aWFsIGNsYXNzIEV4dGVuZGFibGVNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4geyB9DQorDQorICAgIFtTZXJpYWxpemFibGVdDQorICAgIHBhcnRpYWwgY2xhc3MgR2VuZXJhdGVkQnVpbGRlckxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiB7IH0NCisNCisgICAgW1NlcmlhbGl6YWJsZV0NCisgICAgcGFydGlhbCBjbGFzcyBFeHRlbmRhYmxlQnVpbGRlckxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiB7IH0NCisNCisgICAgW1NlcmlhbGl6YWJsZV0NCisgICAgcGFydGlhbCBjbGFzcyBBYnN0cmFjdEJ1aWxkZXI8VE1lc3NhZ2UsIFRCdWlsZGVyPiB7IH0NCisNCisgICAgW1NlcmlhbGl6YWJsZV0NCisgICAgcGFydGlhbCBjbGFzcyBHZW5lcmF0ZWRCdWlsZGVyPFRNZXNzYWdlLCBUQnVpbGRlcj4geyB9DQorDQorICAgIFtTZXJpYWxpemFibGVdDQorICAgIHBhcnRpYWwgY2xhc3MgRXh0ZW5kYWJsZUJ1aWxkZXI8VE1lc3NhZ2UsIFRCdWlsZGVyPiB7IH0NCisNCisgICAgW1NlcmlhbGl6YWJsZV0NCisgICAgcGFydGlhbCBjbGFzcyBEeW5hbWljTWVzc2FnZSANCisgICAgew0KKyAgICAgICAgW1NlcmlhbGl6YWJsZV0NCisgICAgICAgIHBhcnRpYWwgY2xhc3MgQnVpbGRlciB7IH0NCisgICAgfQ0KK30NCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZWxlZ2F0ZXMuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZWxlZ2F0ZXMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2MmJjMAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0RlbGVnYXRlcy5jcwpAQCAtMCwwICsxLDU0IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtLklPOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBEZWxlZ2F0ZSB0byByZXR1cm4gYSBzdHJlYW0gd2hlbiBhc2tlZCwgdXNlZCBieSBNZXNzYWdlU3RyZWFtSXRlcmF0b3IuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBkZWxlZ2F0ZSBTdHJlYW0gU3RyZWFtUHJvdmlkZXIoKTsNCisNCisgICAgLy8gVGhlc2UgZGVsZWdhdGUgZGVjbGFyYXRpb25zIG1pcnJvciB0aGUgb25lcyBpbiAuTkVUIDMuNSBmb3IgdGhlIHNha2Ugb2YgZmFtaWxpYXJpdHkuDQorICAgIGludGVybmFsIGRlbGVnYXRlIFRSZXN1bHQgRnVuYzxUUmVzdWx0PigpOw0KKw0KKyAgICBpbnRlcm5hbCBkZWxlZ2F0ZSBUUmVzdWx0IEZ1bmM8VCwgVFJlc3VsdD4oVCBhcmcpOw0KKw0KKyAgICBpbnRlcm5hbCBkZWxlZ2F0ZSBUUmVzdWx0IEZ1bmM8VDEsIFQyLCBUUmVzdWx0PihUMSBhcmcxLCBUMiBhcmcyKTsNCisNCisgICAgaW50ZXJuYWwgZGVsZWdhdGUgdm9pZCBBY3Rpb248VDEsIFQyPihUMSBhcmcxLCBUMiBhcmcyKTsNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvclByb3Rvcy9DU2hhcnBPcHRpb25zLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvclByb3Rvcy9DU2hhcnBPcHRpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNzdkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9yUHJvdG9zL0NTaGFycE9wdGlvbnMuY3MKQEAgLTAsMCArMSwxODg3IEBACisvLyBHZW5lcmF0ZWQgYnkgUHJvdG9HZW4sIFZlcnNpb249Mi40LjEuNTU1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTU1ZjcxMjUyMzRiZWI1ODkuICBETyBOT1QgRURJVCENCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxDQorI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KKw0KK3VzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zIHsNCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBDU2hhcnBPcHRpb25zIHsNCisgIA0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5DU2hhcnBGaWxlT3B0aW9ucyk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuQ1NoYXJwRmllbGRPcHRpb25zKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5Dc2hhcnBTZXJ2aWNlT3B0aW9ucyk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuQ3NoYXJwTWV0aG9kT3B0aW9ucyk7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbnMNCisgICAgcHVibGljIGNvbnN0IGludCBDU2hhcnBGaWxlT3B0aW9uc0ZpZWxkTnVtYmVyID0gMTAwMDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBGaWxlT3B0aW9ucz4gQ1NoYXJwRmlsZU9wdGlvbnM7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgQ1NoYXJwRmllbGRPcHRpb25zRmllbGROdW1iZXIgPSAxMDAwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycEZpZWxkT3B0aW9ucz4gQ1NoYXJwRmllbGRPcHRpb25zOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IENzaGFycFNlcnZpY2VPcHRpb25zRmllbGROdW1iZXIgPSAxMDAwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycFNlcnZpY2VPcHRpb25zPiBDc2hhcnBTZXJ2aWNlT3B0aW9uczsNCisgICAgcHVibGljIGNvbnN0IGludCBDc2hhcnBNZXRob2RPcHRpb25zRmllbGROdW1iZXIgPSAxMDAwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE1ldGhvZE9wdGlvbnM+IENzaGFycE1ldGhvZE9wdGlvbnM7DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgICNyZWdpb24gU3RhdGljIHZhcmlhYmxlcw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9DU2hhcnBGaWxlT3B0aW9uc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwRmlsZU9wdGlvbnMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycEZpbGVPcHRpb25zLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0NTaGFycEZpbGVPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0NTaGFycEZpZWxkT3B0aW9uc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwRmllbGRPcHRpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBGaWVsZE9wdGlvbnMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfQ1NoYXJwRmllbGRPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0NTaGFycFNlcnZpY2VPcHRpb25zX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBTZXJ2aWNlT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwU2VydmljZU9wdGlvbnMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfQ1NoYXJwU2VydmljZU9wdGlvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfQ1NoYXJwTWV0aG9kT3B0aW9uc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwTWV0aG9kT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwTWV0aG9kT3B0aW9ucy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9DU2hhcnBNZXRob2RPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBEZXNjcmlwdG9yDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIHByaXZhdGUgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsNCisgICAgDQorICAgIHN0YXRpYyBDU2hhcnBPcHRpb25zKCkgew0KKyAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygNCisgICAgICAgICAgc3RyaW5nLkNvbmNhdCgNCisgICAgICAgICAgICAiQ2lSbmIyOW5iR1V2Y0hKdmRHOWlkV1l2WTNOb1lYSndYMjl3ZEdsdmJuTXVjSEp2ZEc4U0QyZHZiMmRzIiwgDQorICAgICAgICAgICAgIlpTNXdjbTkwYjJKMVpob2daMjl2WjJ4bEwzQnliM1J2WW5WbUwyUmxjMk55YVhCMGIzSXVjSEp2ZEc4aSIsIA0KKyAgICAgICAgICAgICJwd1FLRVVOVGFHRnljRVpwYkdWUGNIUnBiMjV6RWhFS0NXNWhiV1Z6Y0dGalpSZ0JJQUVvQ1JJYUNoSjEiLCANCisgICAgICAgICAgICAiYldKeVpXeHNZVjlqYkdGemMyNWhiV1VZQWlBQktBa1NIQW9PY0hWaWJHbGpYMk5zWVhOelpYTVlBeUFCIiwgDQorICAgICAgICAgICAgIktBZzZCSFJ5ZFdVU0Znb09iWFZzZEdsd2JHVmZabWxzWlhNWUJDQUJLQWdTRkFvTWJtVnpkRjlqYkdGeiIsIA0KKyAgICAgICAgICAgICJjMlZ6R0FVZ0FTZ0lFaFlLRG1OdlpHVmZZMjl1ZEhKaFkzUnpHQVlnQVNnSUVpUUtIR1Y0Y0dGdVpGOXUiLCANCisgICAgICAgICAgICAiWVcxbGMzQmhZMlZmWkdseVpXTjBiM0pwWlhNWUJ5QUJLQWdTSEFvT1kyeHpYMk52YlhCc2FXRnVZMlVZIiwgDQorICAgICAgICAgICAgIkNDQUJLQWc2QkhSeWRXVVNId29RWVdSa1gzTmxjbWxoYkdsNllXSnNaUmdKSUFFb0NEb0ZabUZzYzJVUyIsIA0KKyAgICAgICAgICAgICJJd29WWjJWdVpYSmhkR1ZmY0hKcGRtRjBaVjlqZEc5eUdBb2dBU2dJT2dSMGNuVmxFaHdLRG1acGJHVmYiLCANCisgICAgICAgICAgICAiWlhoMFpXNXphVzl1R04wQklBRW9DVG9ETG1OekVoc0tFblZ0WW5KbGJHeGhYMjVoYldWemNHRmpaUmplIiwgDQorICAgICAgICAgICAgIkFTQUJLQWtTSEFvUWIzVjBjSFYwWDJScGNtVmpkRzl5ZVJqZkFTQUJLQWs2QVM0U0pnb1dhV2R1YjNKbCIsIA0KKyAgICAgICAgICAgICJYMmR2YjJkc1pWOXdjbTkwYjJKMVpoamdBU0FCS0FnNkJXWmhiSE5sRWtrS0ZuTmxjblpwWTJWZloyVnUiLCANCisgICAgICAgICAgICAiWlhKaGRHOXlYM1I1Y0dVWTRRRWdBU2dPTWlJdVoyOXZaMnhsTG5CeWIzUnZZblZtTGtOVGFHRnljRk5sIiwgDQorICAgICAgICAgICAgImNuWnBZMlZVZVhCbE9nUk9UMDVGRWlrS0dXZGxibVZ5WVhSbFpGOWpiMlJsWDJGMGRISnBZblYwWlhNWSIsIA0KKyAgICAgICAgICAgICI0Z0VnQVNnSU9nVm1ZV3h6WlNJckNoSkRVMmhoY25CR2FXVnNaRTl3ZEdsdmJuTVNGUW9OY0hKdmNHVnkiLCANCisgICAgICAgICAgICAiZEhsZmJtRnRaUmdCSUFFb0NTSXNDaFJEVTJoaGNuQlRaWEoyYVdObFQzQjBhVzl1Y3hJVUNneHBiblJsIiwgDQorICAgICAgICAgICAgImNtWmhZMlZmYVdRWUFTQUJLQWtpS2dvVFExTm9ZWEp3VFdWMGFHOWtUM0IwYVc5dWN4SVRDZ3RrYVhOdyIsIA0KKyAgICAgICAgICAgICJZWFJqYUY5cFpCZ0JJQUVvQlNwTENoRkRVMmhoY25CVFpYSjJhV05sVkhsd1pSSUlDZ1JPVDA1RkVBQVMiLCANCisgICAgICAgICAgICAiQ3dvSFIwVk9SVkpKUXhBQkVnMEtDVWxPVkVWU1JrRkRSUkFDRWhBS0RFbFNVRU5FU1ZOUVFWUkRTQkFEIiwgDQorICAgICAgICAgICAgIk9sNEtFMk56YUdGeWNGOW1hV3hsWDI5d2RHbHZibk1TSEM1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1Um1scyIsIA0KKyAgICAgICAgICAgICJaVTl3ZEdsdmJuTVk2QWNnQVNnTE1pSXVaMjl2WjJ4bExuQnliM1J2WW5WbUxrTlRhR0Z5Y0VacGJHVlAiLCANCisgICAgICAgICAgICAiY0hScGIyNXpPbUVLRkdOemFHRnljRjltYVdWc1pGOXZjSFJwYjI1ekVoMHVaMjl2WjJ4bExuQnliM1J2IiwgDQorICAgICAgICAgICAgIlluVm1Ma1pwWld4a1QzQjBhVzl1Y3hqb0J5QUJLQXN5SXk1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1UTFObyIsIA0KKyAgICAgICAgICAgICJZWEp3Um1sbGJHUlBjSFJwYjI1ek9tY0tGbU56YUdGeWNGOXpaWEoyYVdObFgyOXdkR2x2Ym5NU0h5NW4iLCANCisgICAgICAgICAgICAiYjI5bmJHVXVjSEp2ZEc5aWRXWXVVMlZ5ZG1salpVOXdkR2x2Ym5NWTZBY2dBU2dMTWlVdVoyOXZaMnhsIiwgDQorICAgICAgICAgICAgIkxuQnliM1J2WW5WbUxrTlRhR0Z5Y0ZObGNuWnBZMlZQY0hScGIyNXpPbVFLRldOemFHRnljRjl0WlhSbyIsIA0KKyAgICAgICAgICAgICJiMlJmYjNCMGFXOXVjeEllTG1kdmIyZHNaUzV3Y205MGIySjFaaTVOWlhSb2IyUlBjSFJwYjI1ekdPZ0giLCANCisgICAgICAgICAgIklBRW9DeklrTG1kdmIyZHNaUzV3Y205MGIySjFaaTVEVTJoaGNuQk5aWFJvYjJSUGNIUnBiMjV6IikpOw0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgYXNzaWduZXIgPSBkZWxlZ2F0ZShwYmQ6OkZpbGVEZXNjcmlwdG9yIHJvb3QpIHsNCisgICAgICAgIGRlc2NyaXB0b3IgPSByb290Ow0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfQ1NoYXJwRmlsZU9wdGlvbnNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0NTaGFycEZpbGVPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBGaWxlT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwRmlsZU9wdGlvbnMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfQ1NoYXJwRmlsZU9wdGlvbnNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJOYW1lc3BhY2UiLCAiVW1icmVsbGFDbGFzc25hbWUiLCAiUHVibGljQ2xhc3NlcyIsICJNdWx0aXBsZUZpbGVzIiwgIk5lc3RDbGFzc2VzIiwgIkNvZGVDb250cmFjdHMiLCAiRXhwYW5kTmFtZXNwYWNlRGlyZWN0b3JpZXMiLCAiQ2xzQ29tcGxpYW5jZSIsICJBZGRTZXJpYWxpemFibGUiLCAiR2VuZXJhdGVQcml2YXRlQ3RvciIsICJGaWxlRXh0ZW5zaW9uIiwgIlVtYnJlbGxhTmFtZXNwYWNlIiwgIk91dHB1dERpcmVjdG9yeSIsICJJZ25vcmVHb29nbGVQcm90b2J1ZiIsICJTZXJ2aWNlR2VuZXJhdG9yVHlwZSIsICJHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfQ1NoYXJwRmllbGRPcHRpb25zX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9DU2hhcnBGaWVsZE9wdGlvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycEZpZWxkT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwRmllbGRPcHRpb25zLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0NTaGFycEZpZWxkT3B0aW9uc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIlByb3BlcnR5TmFtZSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfQ1NoYXJwU2VydmljZU9wdGlvbnNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0NTaGFycFNlcnZpY2VPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBTZXJ2aWNlT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwU2VydmljZU9wdGlvbnMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfQ1NoYXJwU2VydmljZU9wdGlvbnNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJJbnRlcmZhY2VJZCIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfQ1NoYXJwTWV0aG9kT3B0aW9uc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzNdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfQ1NoYXJwTWV0aG9kT3B0aW9uc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwTWV0aG9kT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwTWV0aG9kT3B0aW9ucy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9DU2hhcnBNZXRob2RPcHRpb25zX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRGlzcGF0Y2hJZCIsIH0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5DU2hhcnBGaWxlT3B0aW9ucyA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwRmlsZU9wdGlvbnM+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuRGVzY3JpcHRvci5FeHRlbnNpb25zWzBdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuQ1NoYXJwRmllbGRPcHRpb25zID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBGaWVsZE9wdGlvbnM+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuRGVzY3JpcHRvci5FeHRlbnNpb25zWzFdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuQ3NoYXJwU2VydmljZU9wdGlvbnMgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycFNlcnZpY2VPcHRpb25zPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLkNzaGFycE1ldGhvZE9wdGlvbnMgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE1ldGhvZE9wdGlvbnM+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuRGVzY3JpcHRvci5FeHRlbnNpb25zWzNdKTsNCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgIH07DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oZGVzY3JpcHRvckRhdGEsDQorICAgICAgICAgIG5ldyBwYmQ6OkZpbGVEZXNjcmlwdG9yW10gew0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLkRlc2NyaXB0b3IsIA0KKyAgICAgICAgICB9LCBhc3NpZ25lcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgIH0NCisgICNyZWdpb24gRW51bXMNCisgIHB1YmxpYyBlbnVtIENTaGFycFNlcnZpY2VUeXBlIHsNCisgICAgTk9ORSA9IDAsDQorICAgIEdFTkVSSUMgPSAxLA0KKyAgICBJTlRFUkZBQ0UgPSAyLA0KKyAgICBJUlBDRElTUEFUQ0ggPSAzLA0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCisgICNyZWdpb24gTWVzc2FnZXMNCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQ1NoYXJwRmlsZU9wdGlvbnMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxDU2hhcnBGaWxlT3B0aW9ucywgQ1NoYXJwRmlsZU9wdGlvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIENTaGFycEZpbGVPcHRpb25zKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENTaGFycEZpbGVPcHRpb25zIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBDU2hhcnBGaWxlT3B0aW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfY1NoYXJwRmlsZU9wdGlvbnNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImFkZF9zZXJpYWxpemFibGUiLCAiY2xzX2NvbXBsaWFuY2UiLCAiY29kZV9jb250cmFjdHMiLCAiZXhwYW5kX25hbWVzcGFjZV9kaXJlY3RvcmllcyIsICJmaWxlX2V4dGVuc2lvbiIsICJnZW5lcmF0ZV9wcml2YXRlX2N0b3IiLCAiZ2VuZXJhdGVkX2NvZGVfYXR0cmlidXRlcyIsICJpZ25vcmVfZ29vZ2xlX3Byb3RvYnVmIiwgIm11bHRpcGxlX2ZpbGVzIiwgIm5hbWVzcGFjZSIsICJuZXN0X2NsYXNzZXMiLCAib3V0cHV0X2RpcmVjdG9yeSIsICJwdWJsaWNfY2xhc3NlcyIsICJzZXJ2aWNlX2dlbmVyYXRvcl90eXBlIiwgInVtYnJlbGxhX2NsYXNzbmFtZSIsICJ1bWJyZWxsYV9uYW1lc3BhY2UiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfY1NoYXJwRmlsZU9wdGlvbnNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgNzIsIDY0LCA0OCwgNTYsIDE3NzAsIDgwLCAxODA4LCAxNzkyLCAzMiwgMTAsIDQwLCAxNzg2LCAyNCwgMTgwMCwgMTgsIDE3NzggfTsNCisgICAgcHVibGljIHN0YXRpYyBDU2hhcnBGaWxlT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIENTaGFycEZpbGVPcHRpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIENTaGFycEZpbGVPcHRpb25zIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfQ1NoYXJwRmlsZU9wdGlvbnNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Q1NoYXJwRmlsZU9wdGlvbnMsIENTaGFycEZpbGVPcHRpb25zLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0NTaGFycEZpbGVPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOYW1lc3BhY2VGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOYW1lc3BhY2U7DQorICAgIHByaXZhdGUgc3RyaW5nIG5hbWVzcGFjZV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzTmFtZXNwYWNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmFtZXNwYWNlOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBOYW1lc3BhY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBuYW1lc3BhY2VfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW1icmVsbGFDbGFzc25hbWVGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNVbWJyZWxsYUNsYXNzbmFtZTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgdW1icmVsbGFDbGFzc25hbWVfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc1VtYnJlbGxhQ2xhc3NuYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzVW1icmVsbGFDbGFzc25hbWU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIFVtYnJlbGxhQ2xhc3NuYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gdW1icmVsbGFDbGFzc25hbWVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUHVibGljQ2xhc3Nlc0ZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc1B1YmxpY0NsYXNzZXM7DQorICAgIHByaXZhdGUgYm9vbCBwdWJsaWNDbGFzc2VzXyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc1B1YmxpY0NsYXNzZXMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNQdWJsaWNDbGFzc2VzOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgUHVibGljQ2xhc3NlcyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHB1YmxpY0NsYXNzZXNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTXVsdGlwbGVGaWxlc0ZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc011bHRpcGxlRmlsZXM7DQorICAgIHByaXZhdGUgYm9vbCBtdWx0aXBsZUZpbGVzXzsNCisgICAgcHVibGljIGJvb2wgSGFzTXVsdGlwbGVGaWxlcyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc011bHRpcGxlRmlsZXM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBNdWx0aXBsZUZpbGVzIHsNCisgICAgICBnZXQgeyByZXR1cm4gbXVsdGlwbGVGaWxlc187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOZXN0Q2xhc3Nlc0ZpZWxkTnVtYmVyID0gNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc05lc3RDbGFzc2VzOw0KKyAgICBwcml2YXRlIGJvb2wgbmVzdENsYXNzZXNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOZXN0Q2xhc3NlcyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc05lc3RDbGFzc2VzOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgTmVzdENsYXNzZXMgew0KKyAgICAgIGdldCB7IHJldHVybiBuZXN0Q2xhc3Nlc187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBDb2RlQ29udHJhY3RzRmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzQ29kZUNvbnRyYWN0czsNCisgICAgcHJpdmF0ZSBib29sIGNvZGVDb250cmFjdHNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNDb2RlQ29udHJhY3RzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQ29kZUNvbnRyYWN0czsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIENvZGVDb250cmFjdHMgew0KKyAgICAgIGdldCB7IHJldHVybiBjb2RlQ29udHJhY3RzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEV4cGFuZE5hbWVzcGFjZURpcmVjdG9yaWVzRmllbGROdW1iZXIgPSA3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRXhwYW5kTmFtZXNwYWNlRGlyZWN0b3JpZXM7DQorICAgIHByaXZhdGUgYm9vbCBleHBhbmROYW1lc3BhY2VEaXJlY3Rvcmllc187DQorICAgIHB1YmxpYyBib29sIEhhc0V4cGFuZE5hbWVzcGFjZURpcmVjdG9yaWVzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRXhwYW5kTmFtZXNwYWNlRGlyZWN0b3JpZXM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBFeHBhbmROYW1lc3BhY2VEaXJlY3RvcmllcyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGV4cGFuZE5hbWVzcGFjZURpcmVjdG9yaWVzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IENsc0NvbXBsaWFuY2VGaWVsZE51bWJlciA9IDg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNDbHNDb21wbGlhbmNlOw0KKyAgICBwcml2YXRlIGJvb2wgY2xzQ29tcGxpYW5jZV8gPSB0cnVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNDbHNDb21wbGlhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQ2xzQ29tcGxpYW5jZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIENsc0NvbXBsaWFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBjbHNDb21wbGlhbmNlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEFkZFNlcmlhbGl6YWJsZUZpZWxkTnVtYmVyID0gOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0FkZFNlcmlhbGl6YWJsZTsNCisgICAgcHJpdmF0ZSBib29sIGFkZFNlcmlhbGl6YWJsZV87DQorICAgIHB1YmxpYyBib29sIEhhc0FkZFNlcmlhbGl6YWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0FkZFNlcmlhbGl6YWJsZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEFkZFNlcmlhbGl6YWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGFkZFNlcmlhbGl6YWJsZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBHZW5lcmF0ZVByaXZhdGVDdG9yRmllbGROdW1iZXIgPSAxMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0dlbmVyYXRlUHJpdmF0ZUN0b3I7DQorICAgIHByaXZhdGUgYm9vbCBnZW5lcmF0ZVByaXZhdGVDdG9yXyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0dlbmVyYXRlUHJpdmF0ZUN0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNHZW5lcmF0ZVByaXZhdGVDdG9yOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgR2VuZXJhdGVQcml2YXRlQ3RvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdlbmVyYXRlUHJpdmF0ZUN0b3JfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRmlsZUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMjIxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRmlsZUV4dGVuc2lvbjsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZmlsZUV4dGVuc2lvbl8gPSAiLmNzIjsNCisgICAgcHVibGljIGJvb2wgSGFzRmlsZUV4dGVuc2lvbiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZpbGVFeHRlbnNpb247IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEZpbGVFeHRlbnNpb24gew0KKyAgICAgIGdldCB7IHJldHVybiBmaWxlRXh0ZW5zaW9uXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVtYnJlbGxhTmFtZXNwYWNlRmllbGROdW1iZXIgPSAyMjI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNVbWJyZWxsYU5hbWVzcGFjZTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgdW1icmVsbGFOYW1lc3BhY2VfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc1VtYnJlbGxhTmFtZXNwYWNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzVW1icmVsbGFOYW1lc3BhY2U7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIFVtYnJlbGxhTmFtZXNwYWNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdW1icmVsbGFOYW1lc3BhY2VfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3V0cHV0RGlyZWN0b3J5RmllbGROdW1iZXIgPSAyMjM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPdXRwdXREaXJlY3Rvcnk7DQorICAgIHByaXZhdGUgc3RyaW5nIG91dHB1dERpcmVjdG9yeV8gPSAiLiI7DQorICAgIHB1YmxpYyBib29sIEhhc091dHB1dERpcmVjdG9yeSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc091dHB1dERpcmVjdG9yeTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgT3V0cHV0RGlyZWN0b3J5IHsNCisgICAgICBnZXQgeyByZXR1cm4gb3V0cHV0RGlyZWN0b3J5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IElnbm9yZUdvb2dsZVByb3RvYnVmRmllbGROdW1iZXIgPSAyMjQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNJZ25vcmVHb29nbGVQcm90b2J1ZjsNCisgICAgcHJpdmF0ZSBib29sIGlnbm9yZUdvb2dsZVByb3RvYnVmXzsNCisgICAgcHVibGljIGJvb2wgSGFzSWdub3JlR29vZ2xlUHJvdG9idWYgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNJZ25vcmVHb29nbGVQcm90b2J1ZjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIElnbm9yZUdvb2dsZVByb3RvYnVmIHsNCisgICAgICBnZXQgeyByZXR1cm4gaWdub3JlR29vZ2xlUHJvdG9idWZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgU2VydmljZUdlbmVyYXRvclR5cGVGaWVsZE51bWJlciA9IDIyNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc1NlcnZpY2VHZW5lcmF0b3JUeXBlOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycFNlcnZpY2VUeXBlIHNlcnZpY2VHZW5lcmF0b3JUeXBlXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycFNlcnZpY2VUeXBlLk5PTkU7DQorICAgIHB1YmxpYyBib29sIEhhc1NlcnZpY2VHZW5lcmF0b3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzU2VydmljZUdlbmVyYXRvclR5cGU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwU2VydmljZVR5cGUgU2VydmljZUdlbmVyYXRvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBzZXJ2aWNlR2VuZXJhdG9yVHlwZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBHZW5lcmF0ZWRDb2RlQXR0cmlidXRlc0ZpZWxkTnVtYmVyID0gMjI2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXM7DQorICAgIHByaXZhdGUgYm9vbCBnZW5lcmF0ZWRDb2RlQXR0cmlidXRlc187DQorICAgIHB1YmxpYyBib29sIEhhc0dlbmVyYXRlZENvZGVBdHRyaWJ1dGVzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfY1NoYXJwRmlsZU9wdGlvbnNGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNOYW1lc3BhY2UpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxLCBmaWVsZF9uYW1lc1s5XSwgTmFtZXNwYWNlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1VtYnJlbGxhQ2xhc3NuYW1lKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMiwgZmllbGRfbmFtZXNbMTRdLCBVbWJyZWxsYUNsYXNzbmFtZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNQdWJsaWNDbGFzc2VzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDMsIGZpZWxkX25hbWVzWzEyXSwgUHVibGljQ2xhc3Nlcyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNNdWx0aXBsZUZpbGVzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDQsIGZpZWxkX25hbWVzWzhdLCBNdWx0aXBsZUZpbGVzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05lc3RDbGFzc2VzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDUsIGZpZWxkX25hbWVzWzEwXSwgTmVzdENsYXNzZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQ29kZUNvbnRyYWN0cykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCg2LCBmaWVsZF9uYW1lc1syXSwgQ29kZUNvbnRyYWN0cyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNFeHBhbmROYW1lc3BhY2VEaXJlY3Rvcmllcykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCg3LCBmaWVsZF9uYW1lc1szXSwgRXhwYW5kTmFtZXNwYWNlRGlyZWN0b3JpZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQ2xzQ29tcGxpYW5jZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCg4LCBmaWVsZF9uYW1lc1sxXSwgQ2xzQ29tcGxpYW5jZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNBZGRTZXJpYWxpemFibGUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woOSwgZmllbGRfbmFtZXNbMF0sIEFkZFNlcmlhbGl6YWJsZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNHZW5lcmF0ZVByaXZhdGVDdG9yKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDEwLCBmaWVsZF9uYW1lc1s1XSwgR2VuZXJhdGVQcml2YXRlQ3Rvcik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWxlRXh0ZW5zaW9uKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMjIxLCBmaWVsZF9uYW1lc1s0XSwgRmlsZUV4dGVuc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNVbWJyZWxsYU5hbWVzcGFjZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDIyMiwgZmllbGRfbmFtZXNbMTVdLCBVbWJyZWxsYU5hbWVzcGFjZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPdXRwdXREaXJlY3RvcnkpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygyMjMsIGZpZWxkX25hbWVzWzExXSwgT3V0cHV0RGlyZWN0b3J5KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0lnbm9yZUdvb2dsZVByb3RvYnVmKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDIyNCwgZmllbGRfbmFtZXNbN10sIElnbm9yZUdvb2dsZVByb3RvYnVmKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1NlcnZpY2VHZW5lcmF0b3JUeXBlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDIyNSwgZmllbGRfbmFtZXNbMTNdLCAoaW50KSBTZXJ2aWNlR2VuZXJhdG9yVHlwZSwgU2VydmljZUdlbmVyYXRvclR5cGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMjI2LCBmaWVsZF9uYW1lc1s2XSwgR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc05hbWVzcGFjZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMSwgTmFtZXNwYWNlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1VtYnJlbGxhQ2xhc3NuYW1lKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgyLCBVbWJyZWxsYUNsYXNzbmFtZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNQdWJsaWNDbGFzc2VzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMywgUHVibGljQ2xhc3Nlcyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNNdWx0aXBsZUZpbGVzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoNCwgTXVsdGlwbGVGaWxlcyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNOZXN0Q2xhc3Nlcykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDUsIE5lc3RDbGFzc2VzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0NvZGVDb250cmFjdHMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSg2LCBDb2RlQ29udHJhY3RzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0V4cGFuZE5hbWVzcGFjZURpcmVjdG9yaWVzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoNywgRXhwYW5kTmFtZXNwYWNlRGlyZWN0b3JpZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQ2xzQ29tcGxpYW5jZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDgsIENsc0NvbXBsaWFuY2UpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQWRkU2VyaWFsaXphYmxlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoOSwgQWRkU2VyaWFsaXphYmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0dlbmVyYXRlUHJpdmF0ZUN0b3IpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSgxMCwgR2VuZXJhdGVQcml2YXRlQ3Rvcik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGaWxlRXh0ZW5zaW9uKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgyMjEsIEZpbGVFeHRlbnNpb24pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzVW1icmVsbGFOYW1lc3BhY2UpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDIyMiwgVW1icmVsbGFOYW1lc3BhY2UpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3V0cHV0RGlyZWN0b3J5KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgyMjMsIE91dHB1dERpcmVjdG9yeSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNJZ25vcmVHb29nbGVQcm90b2J1Zikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDIyNCwgSWdub3JlR29vZ2xlUHJvdG9idWYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU2VydmljZUdlbmVyYXRvclR5cGUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgyMjUsIChpbnQpIFNlcnZpY2VHZW5lcmF0b3JUeXBlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0dlbmVyYXRlZENvZGVBdHRyaWJ1dGVzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMjI2LCBHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENTaGFycEZpbGVPcHRpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENTaGFycEZpbGVPcHRpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENTaGFycEZpbGVPcHRpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDU2hhcnBGaWxlT3B0aW9ucyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwRmlsZU9wdGlvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwRmlsZU9wdGlvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwRmlsZU9wdGlvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwRmlsZU9wdGlvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwRmlsZU9wdGlvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwRmlsZU9wdGlvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgQ1NoYXJwRmlsZU9wdGlvbnMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQ1NoYXJwRmlsZU9wdGlvbnMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8Q1NoYXJwRmlsZU9wdGlvbnMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKENTaGFycEZpbGVPcHRpb25zIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQ1NoYXJwRmlsZU9wdGlvbnMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgQ1NoYXJwRmlsZU9wdGlvbnMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBDU2hhcnBGaWxlT3B0aW9ucyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IENTaGFycEZpbGVPcHRpb25zKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBDU2hhcnBGaWxlT3B0aW9ucyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycEZpbGVPcHRpb25zLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIENTaGFycEZpbGVPcHRpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycEZpbGVPcHRpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ1NoYXJwRmlsZU9wdGlvbnMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIENTaGFycEZpbGVPcHRpb25zKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKENTaGFycEZpbGVPcHRpb25zKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oQ1NoYXJwRmlsZU9wdGlvbnMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBGaWxlT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNOYW1lc3BhY2UpIHsNCisgICAgICAgICAgTmFtZXNwYWNlID0gb3RoZXIuTmFtZXNwYWNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1VtYnJlbGxhQ2xhc3NuYW1lKSB7DQorICAgICAgICAgIFVtYnJlbGxhQ2xhc3NuYW1lID0gb3RoZXIuVW1icmVsbGFDbGFzc25hbWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzUHVibGljQ2xhc3Nlcykgew0KKyAgICAgICAgICBQdWJsaWNDbGFzc2VzID0gb3RoZXIuUHVibGljQ2xhc3NlczsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNNdWx0aXBsZUZpbGVzKSB7DQorICAgICAgICAgIE11bHRpcGxlRmlsZXMgPSBvdGhlci5NdWx0aXBsZUZpbGVzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc05lc3RDbGFzc2VzKSB7DQorICAgICAgICAgIE5lc3RDbGFzc2VzID0gb3RoZXIuTmVzdENsYXNzZXM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzQ29kZUNvbnRyYWN0cykgew0KKyAgICAgICAgICBDb2RlQ29udHJhY3RzID0gb3RoZXIuQ29kZUNvbnRyYWN0czsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNFeHBhbmROYW1lc3BhY2VEaXJlY3Rvcmllcykgew0KKyAgICAgICAgICBFeHBhbmROYW1lc3BhY2VEaXJlY3RvcmllcyA9IG90aGVyLkV4cGFuZE5hbWVzcGFjZURpcmVjdG9yaWVzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0Nsc0NvbXBsaWFuY2UpIHsNCisgICAgICAgICAgQ2xzQ29tcGxpYW5jZSA9IG90aGVyLkNsc0NvbXBsaWFuY2U7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzQWRkU2VyaWFsaXphYmxlKSB7DQorICAgICAgICAgIEFkZFNlcmlhbGl6YWJsZSA9IG90aGVyLkFkZFNlcmlhbGl6YWJsZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNHZW5lcmF0ZVByaXZhdGVDdG9yKSB7DQorICAgICAgICAgIEdlbmVyYXRlUHJpdmF0ZUN0b3IgPSBvdGhlci5HZW5lcmF0ZVByaXZhdGVDdG9yOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZpbGVFeHRlbnNpb24pIHsNCisgICAgICAgICAgRmlsZUV4dGVuc2lvbiA9IG90aGVyLkZpbGVFeHRlbnNpb247DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzVW1icmVsbGFOYW1lc3BhY2UpIHsNCisgICAgICAgICAgVW1icmVsbGFOYW1lc3BhY2UgPSBvdGhlci5VbWJyZWxsYU5hbWVzcGFjZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPdXRwdXREaXJlY3RvcnkpIHsNCisgICAgICAgICAgT3V0cHV0RGlyZWN0b3J5ID0gb3RoZXIuT3V0cHV0RGlyZWN0b3J5Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0lnbm9yZUdvb2dsZVByb3RvYnVmKSB7DQorICAgICAgICAgIElnbm9yZUdvb2dsZVByb3RvYnVmID0gb3RoZXIuSWdub3JlR29vZ2xlUHJvdG9idWY7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzU2VydmljZUdlbmVyYXRvclR5cGUpIHsNCisgICAgICAgICAgU2VydmljZUdlbmVyYXRvclR5cGUgPSBvdGhlci5TZXJ2aWNlR2VuZXJhdG9yVHlwZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcykgew0KKyAgICAgICAgICBHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyA9IG90aGVyLkdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfY1NoYXJwRmlsZU9wdGlvbnNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfY1NoYXJwRmlsZU9wdGlvbnNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOYW1lc3BhY2UgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQubmFtZXNwYWNlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1VtYnJlbGxhQ2xhc3NuYW1lID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LnVtYnJlbGxhQ2xhc3NuYW1lXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1B1YmxpY0NsYXNzZXMgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LnB1YmxpY0NsYXNzZXNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTXVsdGlwbGVGaWxlcyA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQubXVsdGlwbGVGaWxlc18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOZXN0Q2xhc3NlcyA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQubmVzdENsYXNzZXNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQ4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzQ29kZUNvbnRyYWN0cyA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuY29kZUNvbnRyYWN0c18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNFeHBhbmROYW1lc3BhY2VEaXJlY3RvcmllcyA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZXhwYW5kTmFtZXNwYWNlRGlyZWN0b3JpZXNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzQ2xzQ29tcGxpYW5jZSA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuY2xzQ29tcGxpYW5jZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNBZGRTZXJpYWxpemFibGUgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmFkZFNlcmlhbGl6YWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNHZW5lcmF0ZVByaXZhdGVDdG9yID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5nZW5lcmF0ZVByaXZhdGVDdG9yXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNzcwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRmlsZUV4dGVuc2lvbiA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5maWxlRXh0ZW5zaW9uXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNzc4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzVW1icmVsbGFOYW1lc3BhY2UgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQudW1icmVsbGFOYW1lc3BhY2VfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE3ODY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPdXRwdXREaXJlY3RvcnkgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQub3V0cHV0RGlyZWN0b3J5Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNzkyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzSWdub3JlR29vZ2xlUHJvdG9idWYgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0Lmlnbm9yZUdvb2dsZVByb3RvYnVmXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODAwOiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQuc2VydmljZUdlbmVyYXRvclR5cGVfLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc1NlcnZpY2VHZW5lcmF0b3JUeXBlID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCgyMjUsICh1bG9uZykoaW50KXVua25vd24pOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTgwODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0dlbmVyYXRlZENvZGVBdHRyaWJ1dGVzID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5nZW5lcmF0ZWRDb2RlQXR0cmlidXRlc18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc05hbWVzcGFjZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc05hbWVzcGFjZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIE5hbWVzcGFjZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk5hbWVzcGFjZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TmFtZXNwYWNlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROYW1lc3BhY2Uoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOYW1lc3BhY2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm5hbWVzcGFjZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5hbWVzcGFjZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmFtZXNwYWNlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubmFtZXNwYWNlXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1VtYnJlbGxhQ2xhc3NuYW1lIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzVW1icmVsbGFDbGFzc25hbWU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBVbWJyZWxsYUNsYXNzbmFtZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVtYnJlbGxhQ2xhc3NuYW1lOyB9DQorICAgICAgICBzZXQgeyBTZXRVbWJyZWxsYUNsYXNzbmFtZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW1icmVsbGFDbGFzc25hbWUoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNVbWJyZWxsYUNsYXNzbmFtZSA9IHRydWU7DQorICAgICAgICByZXN1bHQudW1icmVsbGFDbGFzc25hbWVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbWJyZWxsYUNsYXNzbmFtZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzVW1icmVsbGFDbGFzc25hbWUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC51bWJyZWxsYUNsYXNzbmFtZV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNQdWJsaWNDbGFzc2VzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzUHVibGljQ2xhc3NlczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBQdWJsaWNDbGFzc2VzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUHVibGljQ2xhc3NlczsgfQ0KKyAgICAgICAgc2V0IHsgU2V0UHVibGljQ2xhc3Nlcyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UHVibGljQ2xhc3Nlcyhib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1B1YmxpY0NsYXNzZXMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnB1YmxpY0NsYXNzZXNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQdWJsaWNDbGFzc2VzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNQdWJsaWNDbGFzc2VzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQucHVibGljQ2xhc3Nlc18gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc011bHRpcGxlRmlsZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNNdWx0aXBsZUZpbGVzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIE11bHRpcGxlRmlsZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5NdWx0aXBsZUZpbGVzOyB9DQorICAgICAgICBzZXQgeyBTZXRNdWx0aXBsZUZpbGVzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRNdWx0aXBsZUZpbGVzKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTXVsdGlwbGVGaWxlcyA9IHRydWU7DQorICAgICAgICByZXN1bHQubXVsdGlwbGVGaWxlc18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck11bHRpcGxlRmlsZXMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc011bHRpcGxlRmlsZXMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5tdWx0aXBsZUZpbGVzXyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc05lc3RDbGFzc2VzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTmVzdENsYXNzZXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgTmVzdENsYXNzZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OZXN0Q2xhc3NlczsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TmVzdENsYXNzZXModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5lc3RDbGFzc2VzKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmVzdENsYXNzZXMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm5lc3RDbGFzc2VzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTmVzdENsYXNzZXMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05lc3RDbGFzc2VzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubmVzdENsYXNzZXNfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQ29kZUNvbnRyYWN0cyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0NvZGVDb250cmFjdHM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgQ29kZUNvbnRyYWN0cyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkNvZGVDb250cmFjdHM7IH0NCisgICAgICAgIHNldCB7IFNldENvZGVDb250cmFjdHModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldENvZGVDb250cmFjdHMoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDb2RlQ29udHJhY3RzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5jb2RlQ29udHJhY3RzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQ29kZUNvbnRyYWN0cygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQ29kZUNvbnRyYWN0cyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmNvZGVDb250cmFjdHNfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRXhwYW5kTmFtZXNwYWNlRGlyZWN0b3JpZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNFeHBhbmROYW1lc3BhY2VEaXJlY3RvcmllczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBFeHBhbmROYW1lc3BhY2VEaXJlY3RvcmllcyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkV4cGFuZE5hbWVzcGFjZURpcmVjdG9yaWVzOyB9DQorICAgICAgICBzZXQgeyBTZXRFeHBhbmROYW1lc3BhY2VEaXJlY3Rvcmllcyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RXhwYW5kTmFtZXNwYWNlRGlyZWN0b3JpZXMoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNFeHBhbmROYW1lc3BhY2VEaXJlY3RvcmllcyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZXhwYW5kTmFtZXNwYWNlRGlyZWN0b3JpZXNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJFeHBhbmROYW1lc3BhY2VEaXJlY3RvcmllcygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRXhwYW5kTmFtZXNwYWNlRGlyZWN0b3JpZXMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5leHBhbmROYW1lc3BhY2VEaXJlY3Rvcmllc18gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNDbHNDb21wbGlhbmNlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQ2xzQ29tcGxpYW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBDbHNDb21wbGlhbmNlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQ2xzQ29tcGxpYW5jZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Q2xzQ29tcGxpYW5jZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Q2xzQ29tcGxpYW5jZShib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0Nsc0NvbXBsaWFuY2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmNsc0NvbXBsaWFuY2VfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJDbHNDb21wbGlhbmNlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDbHNDb21wbGlhbmNlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuY2xzQ29tcGxpYW5jZV8gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0FkZFNlcmlhbGl6YWJsZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0FkZFNlcmlhbGl6YWJsZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBBZGRTZXJpYWxpemFibGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BZGRTZXJpYWxpemFibGU7IH0NCisgICAgICAgIHNldCB7IFNldEFkZFNlcmlhbGl6YWJsZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QWRkU2VyaWFsaXphYmxlKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQWRkU2VyaWFsaXphYmxlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5hZGRTZXJpYWxpemFibGVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBZGRTZXJpYWxpemFibGUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0FkZFNlcmlhbGl6YWJsZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmFkZFNlcmlhbGl6YWJsZV8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNHZW5lcmF0ZVByaXZhdGVDdG9yIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzR2VuZXJhdGVQcml2YXRlQ3RvcjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBHZW5lcmF0ZVByaXZhdGVDdG9yIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuR2VuZXJhdGVQcml2YXRlQ3RvcjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0R2VuZXJhdGVQcml2YXRlQ3Rvcih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0R2VuZXJhdGVQcml2YXRlQ3Rvcihib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0dlbmVyYXRlUHJpdmF0ZUN0b3IgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmdlbmVyYXRlUHJpdmF0ZUN0b3JfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJHZW5lcmF0ZVByaXZhdGVDdG9yKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNHZW5lcmF0ZVByaXZhdGVDdG9yID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZ2VuZXJhdGVQcml2YXRlQ3Rvcl8gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZpbGVFeHRlbnNpb24gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNGaWxlRXh0ZW5zaW9uOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRmlsZUV4dGVuc2lvbiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpbGVFeHRlbnNpb247IH0NCisgICAgICAgIHNldCB7IFNldEZpbGVFeHRlbnNpb24odmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpbGVFeHRlbnNpb24oc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGaWxlRXh0ZW5zaW9uID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5maWxlRXh0ZW5zaW9uXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmlsZUV4dGVuc2lvbigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRmlsZUV4dGVuc2lvbiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmZpbGVFeHRlbnNpb25fID0gIi5jcyI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzVW1icmVsbGFOYW1lc3BhY2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNVbWJyZWxsYU5hbWVzcGFjZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIFVtYnJlbGxhTmFtZXNwYWNlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW1icmVsbGFOYW1lc3BhY2U7IH0NCisgICAgICAgIHNldCB7IFNldFVtYnJlbGxhTmFtZXNwYWNlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbWJyZWxsYU5hbWVzcGFjZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1VtYnJlbGxhTmFtZXNwYWNlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC51bWJyZWxsYU5hbWVzcGFjZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVtYnJlbGxhTmFtZXNwYWNlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNVbWJyZWxsYU5hbWVzcGFjZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnVtYnJlbGxhTmFtZXNwYWNlXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc091dHB1dERpcmVjdG9yeSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc091dHB1dERpcmVjdG9yeTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIE91dHB1dERpcmVjdG9yeSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk91dHB1dERpcmVjdG9yeTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3V0cHV0RGlyZWN0b3J5KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPdXRwdXREaXJlY3Rvcnkoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPdXRwdXREaXJlY3RvcnkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm91dHB1dERpcmVjdG9yeV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck91dHB1dERpcmVjdG9yeSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3V0cHV0RGlyZWN0b3J5ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3V0cHV0RGlyZWN0b3J5XyA9ICIuIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNJZ25vcmVHb29nbGVQcm90b2J1ZiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0lnbm9yZUdvb2dsZVByb3RvYnVmOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIElnbm9yZUdvb2dsZVByb3RvYnVmIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSWdub3JlR29vZ2xlUHJvdG9idWY7IH0NCisgICAgICAgIHNldCB7IFNldElnbm9yZUdvb2dsZVByb3RvYnVmKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRJZ25vcmVHb29nbGVQcm90b2J1Zihib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0lnbm9yZUdvb2dsZVByb3RvYnVmID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5pZ25vcmVHb29nbGVQcm90b2J1Zl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhcklnbm9yZUdvb2dsZVByb3RvYnVmKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJZ25vcmVHb29nbGVQcm90b2J1ZiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lmlnbm9yZUdvb2dsZVByb3RvYnVmXyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1NlcnZpY2VHZW5lcmF0b3JUeXBlIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNTZXJ2aWNlR2VuZXJhdG9yVHlwZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwU2VydmljZVR5cGUgU2VydmljZUdlbmVyYXRvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5TZXJ2aWNlR2VuZXJhdG9yVHlwZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0U2VydmljZUdlbmVyYXRvclR5cGUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFNlcnZpY2VHZW5lcmF0b3JUeXBlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycFNlcnZpY2VUeXBlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1NlcnZpY2VHZW5lcmF0b3JUeXBlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5zZXJ2aWNlR2VuZXJhdG9yVHlwZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclNlcnZpY2VHZW5lcmF0b3JUeXBlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTZXJ2aWNlR2VuZXJhdG9yVHlwZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnNlcnZpY2VHZW5lcmF0b3JUeXBlXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycFNlcnZpY2VUeXBlLk5PTkU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNHZW5lcmF0ZWRDb2RlQXR0cmlidXRlczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzOyB9DQorICAgICAgICBzZXQgeyBTZXRHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0R2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZ2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5nZW5lcmF0ZWRDb2RlQXR0cmlidXRlc18gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgQ1NoYXJwRmlsZU9wdGlvbnMoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQ1NoYXJwRmllbGRPcHRpb25zIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8Q1NoYXJwRmllbGRPcHRpb25zLCBDU2hhcnBGaWVsZE9wdGlvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIENTaGFycEZpZWxkT3B0aW9ucygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDU2hhcnBGaWVsZE9wdGlvbnMgZGVmYXVsdEluc3RhbmNlID0gbmV3IENTaGFycEZpZWxkT3B0aW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfY1NoYXJwRmllbGRPcHRpb25zRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJwcm9wZXJ0eV9uYW1lIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2NTaGFycEZpZWxkT3B0aW9uc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIENTaGFycEZpZWxkT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIENTaGFycEZpZWxkT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBDU2hhcnBGaWVsZE9wdGlvbnMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9DU2hhcnBGaWVsZE9wdGlvbnNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Q1NoYXJwRmllbGRPcHRpb25zLCBDU2hhcnBGaWVsZE9wdGlvbnMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfQ1NoYXJwRmllbGRPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQcm9wZXJ0eU5hbWVGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNQcm9wZXJ0eU5hbWU7DQorICAgIHByaXZhdGUgc3RyaW5nIHByb3BlcnR5TmFtZV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzUHJvcGVydHlOYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzUHJvcGVydHlOYW1lOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBQcm9wZXJ0eU5hbWUgew0KKyAgICAgIGdldCB7IHJldHVybiBwcm9wZXJ0eU5hbWVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9jU2hhcnBGaWVsZE9wdGlvbnNGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNQcm9wZXJ0eU5hbWUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxLCBmaWVsZF9uYW1lc1swXSwgUHJvcGVydHlOYW1lKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNQcm9wZXJ0eU5hbWUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDEsIFByb3BlcnR5TmFtZSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENTaGFycEZpZWxkT3B0aW9ucyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDU2hhcnBGaWVsZE9wdGlvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwRmllbGRPcHRpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDU2hhcnBGaWVsZE9wdGlvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENTaGFycEZpZWxkT3B0aW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDU2hhcnBGaWVsZE9wdGlvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwRmllbGRPcHRpb25zIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENTaGFycEZpZWxkT3B0aW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDU2hhcnBGaWVsZE9wdGlvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwRmllbGRPcHRpb25zIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIENTaGFycEZpZWxkT3B0aW9ucyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihDU2hhcnBGaWVsZE9wdGlvbnMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8Q1NoYXJwRmllbGRPcHRpb25zLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihDU2hhcnBGaWVsZE9wdGlvbnMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBDU2hhcnBGaWVsZE9wdGlvbnMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgQ1NoYXJwRmllbGRPcHRpb25zIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgQ1NoYXJwRmllbGRPcHRpb25zIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgQ1NoYXJwRmllbGRPcHRpb25zKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBDU2hhcnBGaWVsZE9wdGlvbnMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBGaWVsZE9wdGlvbnMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ1NoYXJwRmllbGRPcHRpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycEZpZWxkT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIENTaGFycEZpZWxkT3B0aW9ucyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgQ1NoYXJwRmllbGRPcHRpb25zKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKENTaGFycEZpZWxkT3B0aW9ucykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKENTaGFycEZpZWxkT3B0aW9ucyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycEZpZWxkT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNQcm9wZXJ0eU5hbWUpIHsNCisgICAgICAgICAgUHJvcGVydHlOYW1lID0gb3RoZXIuUHJvcGVydHlOYW1lOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfY1NoYXJwRmllbGRPcHRpb25zRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2NTaGFycEZpZWxkT3B0aW9uc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1Byb3BlcnR5TmFtZSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5wcm9wZXJ0eU5hbWVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNQcm9wZXJ0eU5hbWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNQcm9wZXJ0eU5hbWU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBQcm9wZXJ0eU5hbWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Qcm9wZXJ0eU5hbWU7IH0NCisgICAgICAgIHNldCB7IFNldFByb3BlcnR5TmFtZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UHJvcGVydHlOYW1lKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzUHJvcGVydHlOYW1lID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5wcm9wZXJ0eU5hbWVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQcm9wZXJ0eU5hbWUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1Byb3BlcnR5TmFtZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnByb3BlcnR5TmFtZV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgQ1NoYXJwRmllbGRPcHRpb25zKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIENTaGFycFNlcnZpY2VPcHRpb25zIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8Q1NoYXJwU2VydmljZU9wdGlvbnMsIENTaGFycFNlcnZpY2VPcHRpb25zLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBDU2hhcnBTZXJ2aWNlT3B0aW9ucygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDU2hhcnBTZXJ2aWNlT3B0aW9ucyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQ1NoYXJwU2VydmljZU9wdGlvbnMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2NTaGFycFNlcnZpY2VPcHRpb25zRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJpbnRlcmZhY2VfaWQiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfY1NoYXJwU2VydmljZU9wdGlvbnNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAgfTsNCisgICAgcHVibGljIHN0YXRpYyBDU2hhcnBTZXJ2aWNlT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIENTaGFycFNlcnZpY2VPcHRpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIENTaGFycFNlcnZpY2VPcHRpb25zIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfQ1NoYXJwU2VydmljZU9wdGlvbnNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Q1NoYXJwU2VydmljZU9wdGlvbnMsIENTaGFycFNlcnZpY2VPcHRpb25zLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0NTaGFycFNlcnZpY2VPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBJbnRlcmZhY2VJZEZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ludGVyZmFjZUlkOw0KKyAgICBwcml2YXRlIHN0cmluZyBpbnRlcmZhY2VJZF8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzSW50ZXJmYWNlSWQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNJbnRlcmZhY2VJZDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgSW50ZXJmYWNlSWQgew0KKyAgICAgIGdldCB7IHJldHVybiBpbnRlcmZhY2VJZF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2NTaGFycFNlcnZpY2VPcHRpb25zRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzSW50ZXJmYWNlSWQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxLCBmaWVsZF9uYW1lc1swXSwgSW50ZXJmYWNlSWQpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0ludGVyZmFjZUlkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxLCBJbnRlcmZhY2VJZCk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENTaGFycFNlcnZpY2VPcHRpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENTaGFycFNlcnZpY2VPcHRpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENTaGFycFNlcnZpY2VPcHRpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDU2hhcnBTZXJ2aWNlT3B0aW9ucyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwU2VydmljZU9wdGlvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwU2VydmljZU9wdGlvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwU2VydmljZU9wdGlvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwU2VydmljZU9wdGlvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwU2VydmljZU9wdGlvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwU2VydmljZU9wdGlvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgQ1NoYXJwU2VydmljZU9wdGlvbnMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQ1NoYXJwU2VydmljZU9wdGlvbnMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8Q1NoYXJwU2VydmljZU9wdGlvbnMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKENTaGFycFNlcnZpY2VPcHRpb25zIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQ1NoYXJwU2VydmljZU9wdGlvbnMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgQ1NoYXJwU2VydmljZU9wdGlvbnMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBDU2hhcnBTZXJ2aWNlT3B0aW9ucyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IENTaGFycFNlcnZpY2VPcHRpb25zKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBDU2hhcnBTZXJ2aWNlT3B0aW9ucyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycFNlcnZpY2VPcHRpb25zLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIENTaGFycFNlcnZpY2VPcHRpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycFNlcnZpY2VPcHRpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ1NoYXJwU2VydmljZU9wdGlvbnMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIENTaGFycFNlcnZpY2VPcHRpb25zKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKENTaGFycFNlcnZpY2VPcHRpb25zKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oQ1NoYXJwU2VydmljZU9wdGlvbnMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBTZXJ2aWNlT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNJbnRlcmZhY2VJZCkgew0KKyAgICAgICAgICBJbnRlcmZhY2VJZCA9IG90aGVyLkludGVyZmFjZUlkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfY1NoYXJwU2VydmljZU9wdGlvbnNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfY1NoYXJwU2VydmljZU9wdGlvbnNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNJbnRlcmZhY2VJZCA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5pbnRlcmZhY2VJZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ludGVyZmFjZUlkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzSW50ZXJmYWNlSWQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBJbnRlcmZhY2VJZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkludGVyZmFjZUlkOyB9DQorICAgICAgICBzZXQgeyBTZXRJbnRlcmZhY2VJZCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0SW50ZXJmYWNlSWQoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJbnRlcmZhY2VJZCA9IHRydWU7DQorICAgICAgICByZXN1bHQuaW50ZXJmYWNlSWRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJJbnRlcmZhY2VJZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSW50ZXJmYWNlSWQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5pbnRlcmZhY2VJZF8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgQ1NoYXJwU2VydmljZU9wdGlvbnMoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQ1NoYXJwTWV0aG9kT3B0aW9ucyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPENTaGFycE1ldGhvZE9wdGlvbnMsIENTaGFycE1ldGhvZE9wdGlvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIENTaGFycE1ldGhvZE9wdGlvbnMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ1NoYXJwTWV0aG9kT3B0aW9ucyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQ1NoYXJwTWV0aG9kT3B0aW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfY1NoYXJwTWV0aG9kT3B0aW9uc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiZGlzcGF0Y2hfaWQiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfY1NoYXJwTWV0aG9kT3B0aW9uc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwTWV0aG9kT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIENTaGFycE1ldGhvZE9wdGlvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQ1NoYXJwTWV0aG9kT3B0aW9ucyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0NTaGFycE1ldGhvZE9wdGlvbnNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Q1NoYXJwTWV0aG9kT3B0aW9ucywgQ1NoYXJwTWV0aG9kT3B0aW9ucy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9DU2hhcnBNZXRob2RPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEaXNwYXRjaElkRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGlzcGF0Y2hJZDsNCisgICAgcHJpdmF0ZSBpbnQgZGlzcGF0Y2hJZF87DQorICAgIHB1YmxpYyBib29sIEhhc0Rpc3BhdGNoSWQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEaXNwYXRjaElkOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEaXNwYXRjaElkIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGlzcGF0Y2hJZF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2NTaGFycE1ldGhvZE9wdGlvbnNGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNEaXNwYXRjaElkKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgRGlzcGF0Y2hJZCk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzRGlzcGF0Y2hJZCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBEaXNwYXRjaElkKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwTWV0aG9kT3B0aW9ucyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDU2hhcnBNZXRob2RPcHRpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENTaGFycE1ldGhvZE9wdGlvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENTaGFycE1ldGhvZE9wdGlvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENTaGFycE1ldGhvZE9wdGlvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwTWV0aG9kT3B0aW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDU2hhcnBNZXRob2RPcHRpb25zIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIENTaGFycE1ldGhvZE9wdGlvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQ1NoYXJwTWV0aG9kT3B0aW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBDU2hhcnBNZXRob2RPcHRpb25zIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIENTaGFycE1ldGhvZE9wdGlvbnMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQ1NoYXJwTWV0aG9kT3B0aW9ucyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxDU2hhcnBNZXRob2RPcHRpb25zLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihDU2hhcnBNZXRob2RPcHRpb25zIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQ1NoYXJwTWV0aG9kT3B0aW9ucyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBDU2hhcnBNZXRob2RPcHRpb25zIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgQ1NoYXJwTWV0aG9kT3B0aW9ucyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IENTaGFycE1ldGhvZE9wdGlvbnMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIENTaGFycE1ldGhvZE9wdGlvbnMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBNZXRob2RPcHRpb25zLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIENTaGFycE1ldGhvZE9wdGlvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwTWV0aG9kT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIENTaGFycE1ldGhvZE9wdGlvbnMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIENTaGFycE1ldGhvZE9wdGlvbnMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoQ1NoYXJwTWV0aG9kT3B0aW9ucykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKENTaGFycE1ldGhvZE9wdGlvbnMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBNZXRob2RPcHRpb25zLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0Rpc3BhdGNoSWQpIHsNCisgICAgICAgICAgRGlzcGF0Y2hJZCA9IG90aGVyLkRpc3BhdGNoSWQ7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9jU2hhcnBNZXRob2RPcHRpb25zRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2NTaGFycE1ldGhvZE9wdGlvbnNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0Rpc3BhdGNoSWQgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kaXNwYXRjaElkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGlzcGF0Y2hJZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0Rpc3BhdGNoSWQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEaXNwYXRjaElkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGlzcGF0Y2hJZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGlzcGF0Y2hJZCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGlzcGF0Y2hJZChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGlzcGF0Y2hJZCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGlzcGF0Y2hJZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRpc3BhdGNoSWQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0Rpc3BhdGNoSWQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kaXNwYXRjaElkXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIENTaGFycE1ldGhvZE9wdGlvbnMoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgICNlbmRyZWdpb24NCisgIA0KK30NCisNCisjZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvclByb3Rvcy9EZXNjcmlwdG9yUHJvdG9GaWxlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvclByb3Rvcy9EZXNjcmlwdG9yUHJvdG9GaWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMTljNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9yUHJvdG9zL0Rlc2NyaXB0b3JQcm90b0ZpbGUuY3MKQEAgLTAsMCArMSw5MTEwIEBACisvLyBHZW5lcmF0ZWQgYnkgUHJvdG9HZW4sIFZlcnNpb249Mi40LjEuNTU1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTU1ZjcxMjUyMzRiZWI1ODkuICBETyBOT1QgRURJVCENCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxDQorI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KKw0KK3VzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zIHsNCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBEZXNjcmlwdG9yUHJvdG9GaWxlIHsNCisgIA0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gU3RhdGljIHZhcmlhYmxlcw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclNldF9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JTZXQsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yU2V0LkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yU2V0X19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8uQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90bywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90by5UeXBlcy5FeHRlbnNpb25SYW5nZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvLlR5cGVzLkV4dGVuc2lvblJhbmdlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0VudW1EZXNjcmlwdG9yUHJvdG9fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1EZXNjcmlwdG9yUHJvdG8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1EZXNjcmlwdG9yUHJvdG8uQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRW51bURlc2NyaXB0b3JQcm90b19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZURlc2NyaXB0b3JQcm90b19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlRGVzY3JpcHRvclByb3RvX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VEZXNjcmlwdG9yUHJvdG9fX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfTWV0aG9kRGVzY3JpcHRvclByb3RvX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5NZXRob2REZXNjcmlwdG9yUHJvdG8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1ldGhvZERlc2NyaXB0b3JQcm90by5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9NZXRob2REZXNjcmlwdG9yUHJvdG9fX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVPcHRpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlT3B0aW9ucy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9NZXNzYWdlT3B0aW9uc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWVzc2FnZU9wdGlvbnMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1lc3NhZ2VPcHRpb25zLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX01lc3NhZ2VPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZE9wdGlvbnMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0VudW1PcHRpb25zX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bU9wdGlvbnMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRW51bU9wdGlvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRW51bVZhbHVlT3B0aW9uc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlT3B0aW9ucy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VPcHRpb25zX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5TZXJ2aWNlT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU2VydmljZU9wdGlvbnMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfU2VydmljZU9wdGlvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfTWV0aG9kT3B0aW9uc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kT3B0aW9ucy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9NZXRob2RPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24uQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLlR5cGVzLk5hbWVQYXJ0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLlR5cGVzLk5hbWVQYXJ0LkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfU291cmNlQ29kZUluZm9fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNvdXJjZUNvZGVJbmZvLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mby5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU291cmNlQ29kZUluZm8uVHlwZXMuTG9jYXRpb24sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNvdXJjZUNvZGVJbmZvLlR5cGVzLkxvY2F0aW9uLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBEZXNjcmlwdG9yDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIHByaXZhdGUgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsNCisgICAgDQorICAgIHN0YXRpYyBEZXNjcmlwdG9yUHJvdG9GaWxlKCkgew0KKyAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygNCisgICAgICAgICAgc3RyaW5nLkNvbmNhdCgNCisgICAgICAgICAgICAiQ2lCbmIyOW5iR1V2Y0hKdmRHOWlkV1l2WkdWelkzSnBjSFJ2Y2k1d2NtOTBieElQWjI5dloyeGxMbkJ5IiwgDQorICAgICAgICAgICAgImIzUnZZblZtSWtjS0VVWnBiR1ZFWlhOamNtbHdkRzl5VTJWMEVqSUtCR1pwYkdVWUFTQURLQXN5SkM1biIsIA0KKyAgICAgICAgICAgICJiMjluYkdVdWNISnZkRzlpZFdZdVJtbHNaVVJsYzJOeWFYQjBiM0pRY205MGJ5S1hBd29UUm1sc1pVUmwiLCANCisgICAgICAgICAgICAiYzJOeWFYQjBiM0pRY205MGJ4SU1DZ1J1WVcxbEdBRWdBU2dKRWc4S0IzQmhZMnRoWjJVWUFpQUJLQWtTIiwgDQorICAgICAgICAgICAgIkVnb0taR1Z3Wlc1a1pXNWplUmdESUFNb0NSSTJDZ3h0WlhOellXZGxYM1I1Y0dVWUJDQURLQXN5SUM1biIsIA0KKyAgICAgICAgICAgICJiMjluYkdVdWNISnZkRzlpZFdZdVJHVnpZM0pwY0hSdmNsQnliM1J2RWpjS0NXVnVkVzFmZEhsd1pSZ0YiLCANCisgICAgICAgICAgICAiSUFNb0N6SWtMbWR2YjJkc1pTNXdjbTkwYjJKMVppNUZiblZ0UkdWelkzSnBjSFJ2Y2xCeWIzUnZFamdLIiwgDQorICAgICAgICAgICAgIkIzTmxjblpwWTJVWUJpQURLQXN5Snk1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1VTJWeWRtbGpaVVJsYzJOeSIsIA0KKyAgICAgICAgICAgICJhWEIwYjNKUWNtOTBieEk0Q2dsbGVIUmxibk5wYjI0WUJ5QURLQXN5SlM1bmIyOW5iR1V1Y0hKdmRHOWkiLCANCisgICAgICAgICAgICAiZFdZdVJtbGxiR1JFWlhOamNtbHdkRzl5VUhKdmRHOFNMUW9IYjNCMGFXOXVjeGdJSUFFb0N6SWNMbWR2IiwgDQorICAgICAgICAgICAgImIyZHNaUzV3Y205MGIySjFaaTVHYVd4bFQzQjBhVzl1Y3hJNUNoQnpiM1Z5WTJWZlkyOWtaVjlwYm1adiIsIA0KKyAgICAgICAgICAgICJHQWtnQVNnTE1oOHVaMjl2WjJ4bExuQnliM1J2WW5WbUxsTnZkWEpqWlVOdlpHVkpibVp2SXFrRENnOUUiLCANCisgICAgICAgICAgICAiWlhOamNtbHdkRzl5VUhKdmRHOFNEQW9FYm1GdFpSZ0JJQUVvQ1JJMENnVm1hV1ZzWkJnQ0lBTW9DeklsIiwgDQorICAgICAgICAgICAgIkxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1R2FXVnNaRVJsYzJOeWFYQjBiM0pRY205MGJ4STRDZ2xsZUhSbCIsIA0KKyAgICAgICAgICAgICJibk5wYjI0WUJpQURLQXN5SlM1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1Um1sbGJHUkVaWE5qY21sd2RHOXkiLCANCisgICAgICAgICAgICAiVUhKdmRHOFNOUW9MYm1WemRHVmtYM1I1Y0dVWUF5QURLQXN5SUM1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1IiwgDQorICAgICAgICAgICAgIlJHVnpZM0pwY0hSdmNsQnliM1J2RWpjS0NXVnVkVzFmZEhsd1pSZ0VJQU1vQ3pJa0xtZHZiMmRzWlM1dyIsIA0KKyAgICAgICAgICAgICJjbTkwYjJKMVppNUZiblZ0UkdWelkzSnBjSFJ2Y2xCeWIzUnZFa2dLRDJWNGRHVnVjMmx2Ymw5eVlXNW4iLCANCisgICAgICAgICAgICAiWlJnRklBTW9Dekl2TG1kdmIyZHNaUzV3Y205MGIySjFaaTVFWlhOamNtbHdkRzl5VUhKdmRHOHVSWGgwIiwgDQorICAgICAgICAgICAgIlpXNXphVzl1VW1GdVoyVVNNQW9IYjNCMGFXOXVjeGdISUFFb0N6SWZMbWR2YjJkc1pTNXdjbTkwYjJKMSIsIA0KKyAgICAgICAgICAgICJaaTVOWlhOellXZGxUM0IwYVc5dWN4b3NDZzVGZUhSbGJuTnBiMjVTWVc1blpSSU5DZ1Z6ZEdGeWRCZ0IiLCANCisgICAgICAgICAgICAiSUFFb0JSSUxDZ05sYm1RWUFpQUJLQVVpbEFVS0ZFWnBaV3hrUkdWelkzSnBjSFJ2Y2xCeWIzUnZFZ3dLIiwgDQorICAgICAgICAgICAgIkJHNWhiV1VZQVNBQktBa1NEZ29HYm5WdFltVnlHQU1nQVNnRkVqb0tCV3hoWW1Wc0dBUWdBU2dPTWlzdSIsIA0KKyAgICAgICAgICAgICJaMjl2WjJ4bExuQnliM1J2WW5WbUxrWnBaV3hrUkdWelkzSnBjSFJ2Y2xCeWIzUnZMa3hoWW1Wc0VqZ0siLCANCisgICAgICAgICAgICAiQkhSNWNHVVlCU0FCS0E0eUtpNW5iMjluYkdVdWNISnZkRzlpZFdZdVJtbGxiR1JFWlhOamNtbHdkRzl5IiwgDQorICAgICAgICAgICAgIlVISnZkRzh1Vkhsd1pSSVJDZ2wwZVhCbFgyNWhiV1VZQmlBQktBa1NFQW9JWlhoMFpXNWtaV1VZQWlBQiIsIA0KKyAgICAgICAgICAgICJLQWtTRlFvTlpHVm1ZWFZzZEY5MllXeDFaUmdISUFFb0NSSXVDZ2R2Y0hScGIyNXpHQWdnQVNnTE1oMHUiLCANCisgICAgICAgICAgICAiWjI5dloyeGxMbkJ5YjNSdlluVm1Ma1pwWld4a1QzQjBhVzl1Y3lLMkFnb0VWSGx3WlJJUENndFVXVkJGIiwgDQorICAgICAgICAgICAgIlgwUlBWVUpNUlJBQkVnNEtDbFJaVUVWZlJreFBRVlFRQWhJT0NncFVXVkJGWDBsT1ZEWTBFQU1TRHdvTCIsIA0KKyAgICAgICAgICAgICJWRmxRUlY5VlNVNVVOalFRQkJJT0NncFVXVkJGWDBsT1ZETXlFQVVTRUFvTVZGbFFSVjlHU1ZoRlJEWTAiLCANCisgICAgICAgICAgICAiRUFZU0VBb01WRmxRUlY5R1NWaEZSRE15RUFjU0RRb0pWRmxRUlY5Q1QwOU1FQWdTRHdvTFZGbFFSVjlUIiwgDQorICAgICAgICAgICAgIlZGSkpUa2NRQ1JJT0NncFVXVkJGWDBkU1QxVlFFQW9TRUFvTVZGbFFSVjlOUlZOVFFVZEZFQXNTRGdvSyIsIA0KKyAgICAgICAgICAgICJWRmxRUlY5Q1dWUkZVeEFNRWc4S0MxUlpVRVZmVlVsT1ZETXlFQTBTRFFvSlZGbFFSVjlGVGxWTkVBNFMiLCANCisgICAgICAgICAgICAiRVFvTlZGbFFSVjlUUmtsWVJVUXpNaEFQRWhFS0RWUlpVRVZmVTBaSldFVkVOalFRRUJJUENndFVXVkJGIiwgDQorICAgICAgICAgICAgIlgxTkpUbFF6TWhBUkVnOEtDMVJaVUVWZlUwbE9WRFkwRUJJaVF3b0ZUR0ZpWld3U0Vnb09URUZDUlV4ZiIsIA0KKyAgICAgICAgICAgICJUMUJVU1U5T1FVd1FBUklTQ2c1TVFVSkZURjlTUlZGVlNWSkZSQkFDRWhJS0RreEJRa1ZNWDFKRlVFVkIiLCANCisgICAgICAgICAgICAiVkVWRUVBTWlqQUVLRTBWdWRXMUVaWE5qY21sd2RHOXlVSEp2ZEc4U0RBb0VibUZ0WlJnQklBRW9DUkk0IiwgDQorICAgICAgICAgICAgIkNnVjJZV3gxWlJnQ0lBTW9DeklwTG1kdmIyZHNaUzV3Y205MGIySjFaaTVGYm5WdFZtRnNkV1ZFWlhOaiIsIA0KKyAgICAgICAgICAgICJjbWx3ZEc5eVVISnZkRzhTTFFvSGIzQjBhVzl1Y3hnRElBRW9DekljTG1kdmIyZHNaUzV3Y205MGIySjEiLCANCisgICAgICAgICAgICAiWmk1RmJuVnRUM0IwYVc5dWN5SnNDaGhGYm5WdFZtRnNkV1ZFWlhOamNtbHdkRzl5VUhKdmRHOFNEQW9FIiwgDQorICAgICAgICAgICAgImJtRnRaUmdCSUFFb0NSSU9DZ1p1ZFcxaVpYSVlBaUFCS0FVU01nb0hiM0IwYVc5dWN4Z0RJQUVvQ3pJaCIsIA0KKyAgICAgICAgICAgICJMbWR2YjJkc1pTNXdjbTkwYjJKMVppNUZiblZ0Vm1Gc2RXVlBjSFJwYjI1eklwQUJDaFpUWlhKMmFXTmwiLCANCisgICAgICAgICAgICAiUkdWelkzSnBjSFJ2Y2xCeWIzUnZFZ3dLQkc1aGJXVVlBU0FCS0FrU05nb0diV1YwYUc5a0dBSWdBeWdMIiwgDQorICAgICAgICAgICAgIk1pWXVaMjl2WjJ4bExuQnliM1J2WW5WbUxrMWxkR2h2WkVSbGMyTnlhWEIwYjNKUWNtOTBieEl3Q2dkdiIsIA0KKyAgICAgICAgICAgICJjSFJwYjI1ekdBTWdBU2dMTWg4dVoyOXZaMnhsTG5CeWIzUnZZblZtTGxObGNuWnBZMlZQY0hScGIyNXoiLCANCisgICAgICAgICAgICAiSW44S0ZVMWxkR2h2WkVSbGMyTnlhWEIwYjNKUWNtOTBieElNQ2dSdVlXMWxHQUVnQVNnSkVoSUtDbWx1IiwgDQorICAgICAgICAgICAgImNIVjBYM1I1Y0dVWUFpQUJLQWtTRXdvTGIzVjBjSFYwWDNSNWNHVVlBeUFCS0FrU0x3b0hiM0IwYVc5dSIsIA0KKyAgICAgICAgICAgICJjeGdFSUFFb0N6SWVMbWR2YjJkc1pTNXdjbTkwYjJKMVppNU5aWFJvYjJSUGNIUnBiMjV6SXRVRENndEciLCANCisgICAgICAgICAgICAiYVd4bFQzQjBhVzl1Y3hJVUNneHFZWFpoWDNCaFkydGhaMlVZQVNBQktBa1NIQW9VYW1GMllWOXZkWFJsIiwgDQorICAgICAgICAgICAgImNsOWpiR0Z6YzI1aGJXVVlDQ0FCS0FrU0lnb1RhbUYyWVY5dGRXeDBhWEJzWlY5bWFXeGxjeGdLSUFFbyIsIA0KKyAgICAgICAgICAgICJDRG9GWm1Gc2MyVVNMQW9kYW1GMllWOW5aVzVsY21GMFpWOWxjWFZoYkhOZllXNWtYMmhoYzJnWUZDQUIiLCANCisgICAgICAgICAgICAiS0FnNkJXWmhiSE5sRWtZS0RHOXdkR2x0YVhwbFgyWnZjaGdKSUFFb0RqSXBMbWR2YjJkc1pTNXdjbTkwIiwgDQorICAgICAgICAgICAgImIySjFaaTVHYVd4bFQzQjBhVzl1Y3k1UGNIUnBiV2w2WlUxdlpHVTZCVk5RUlVWRUVpSUtFMk5qWDJkbCIsIA0KKyAgICAgICAgICAgICJibVZ5YVdOZmMyVnlkbWxqWlhNWUVDQUJLQWc2QldaaGJITmxFaVFLRldwaGRtRmZaMlZ1WlhKcFkxOXoiLCANCisgICAgICAgICAgICAiWlhKMmFXTmxjeGdSSUFFb0NEb0ZabUZzYzJVU0lnb1RjSGxmWjJWdVpYSnBZMTl6WlhKMmFXTmxjeGdTIiwgDQorICAgICAgICAgICAgIklBRW9DRG9GWm1Gc2MyVVNRd29VZFc1cGJuUmxjbkJ5WlhSbFpGOXZjSFJwYjI0WTV3Y2dBeWdMTWlRdSIsIA0KKyAgICAgICAgICAgICJaMjl2WjJ4bExuQnliM1J2WW5WbUxsVnVhVzUwWlhKd2NtVjBaV1JQY0hScGIyNGlPZ29NVDNCMGFXMXAiLCANCisgICAgICAgICAgICAiZW1WTmIyUmxFZ2tLQlZOUVJVVkVFQUVTRFFvSlEwOUVSVjlUU1ZwRkVBSVNFQW9NVEVsVVJWOVNWVTVVIiwgDQorICAgICAgICAgICAgIlNVMUZFQU1xQ1Fqb0J4Q0FnSUNBQWlLNEFRb09UV1Z6YzJGblpVOXdkR2x2Ym5NU0pnb1hiV1Z6YzJGbiIsIA0KKyAgICAgICAgICAgICJaVjl6WlhSZmQybHlaVjltYjNKdFlYUVlBU0FCS0FnNkJXWmhiSE5sRWk0S0gyNXZYM04wWVc1a1lYSmsiLCANCisgICAgICAgICAgICAiWDJSbGMyTnlhWEIwYjNKZllXTmpaWE56YjNJWUFpQUJLQWc2QldaaGJITmxFa01LRkhWdWFXNTBaWEp3IiwgDQorICAgICAgICAgICAgImNtVjBaV1JmYjNCMGFXOXVHT2NISUFNb0N6SWtMbWR2YjJkc1pTNXdjbTkwYjJKMVppNVZibWx1ZEdWeSIsIA0KKyAgICAgICAgICAgICJjSEpsZEdWa1QzQjBhVzl1S2drSTZBY1FnSUNBZ0FJaWxBSUtERVpwWld4a1QzQjBhVzl1Y3hJNkNnVmoiLCANCisgICAgICAgICAgICAiZEhsd1pSZ0JJQUVvRGpJakxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1R2FXVnNaRTl3ZEdsdmJuTXVRMVI1IiwgDQorICAgICAgICAgICAgImNHVTZCbE5VVWtsT1J4SU9DZ1p3WVdOclpXUVlBaUFCS0FnU0dRb0taR1Z3Y21WallYUmxaQmdESUFFbyIsIA0KKyAgICAgICAgICAgICJDRG9GWm1Gc2MyVVNIQW9VWlhod1pYSnBiV1Z1ZEdGc1gyMWhjRjlyWlhrWUNTQUJLQWtTUXdvVWRXNXAiLCANCisgICAgICAgICAgICAiYm5SbGNuQnlaWFJsWkY5dmNIUnBiMjRZNXdjZ0F5Z0xNaVF1WjI5dloyeGxMbkJ5YjNSdlluVm1MbFZ1IiwgDQorICAgICAgICAgICAgImFXNTBaWEp3Y21WMFpXUlBjSFJwYjI0aUx3b0ZRMVI1Y0dVU0Nnb0dVMVJTU1U1SEVBQVNDQW9FUTA5UyIsIA0KKyAgICAgICAgICAgICJSQkFCRWhBS0RGTlVVa2xPUjE5UVNVVkRSUkFDS2drSTZBY1FnSUNBZ0FJaVhRb0xSVzUxYlU5d2RHbHYiLCANCisgICAgICAgICAgICAiYm5NU1F3b1VkVzVwYm5SbGNuQnlaWFJsWkY5dmNIUnBiMjRZNXdjZ0F5Z0xNaVF1WjI5dloyeGxMbkJ5IiwgDQorICAgICAgICAgICAgImIzUnZZblZtTGxWdWFXNTBaWEp3Y21WMFpXUlBjSFJwYjI0cUNRam9CeENBZ0lDQUFpSmlDaEJGYm5WdCIsIA0KKyAgICAgICAgICAgICJWbUZzZFdWUGNIUnBiMjV6RWtNS0ZIVnVhVzUwWlhKd2NtVjBaV1JmYjNCMGFXOXVHT2NISUFNb0N6SWsiLCANCisgICAgICAgICAgICAiTG1kdmIyZHNaUzV3Y205MGIySjFaaTVWYm1sdWRHVnljSEpsZEdWa1QzQjBhVzl1S2drSTZBY1FnSUNBIiwgDQorICAgICAgICAgICAgImdBSWlZQW9PVTJWeWRtbGpaVTl3ZEdsdmJuTVNRd29VZFc1cGJuUmxjbkJ5WlhSbFpGOXZjSFJwYjI0WSIsIA0KKyAgICAgICAgICAgICI1d2NnQXlnTE1pUXVaMjl2WjJ4bExuQnliM1J2WW5WbUxsVnVhVzUwWlhKd2NtVjBaV1JQY0hScGIyNHEiLCANCisgICAgICAgICAgICAiQ1Fqb0J4Q0FnSUNBQWlKZkNnMU5aWFJvYjJSUGNIUnBiMjV6RWtNS0ZIVnVhVzUwWlhKd2NtVjBaV1JmIiwgDQorICAgICAgICAgICAgImIzQjBhVzl1R09jSElBTW9DeklrTG1kdmIyZHNaUzV3Y205MGIySjFaaTVWYm1sdWRHVnljSEpsZEdWayIsIA0KKyAgICAgICAgICAgICJUM0IwYVc5dUtna0k2QWNRZ0lDQWdBSWluZ0lLRTFWdWFXNTBaWEp3Y21WMFpXUlBjSFJwYjI0U093b0UiLCANCisgICAgICAgICAgICAiYm1GdFpSZ0NJQU1vQ3pJdExtZHZiMmRzWlM1d2NtOTBiMkoxWmk1VmJtbHVkR1Z5Y0hKbGRHVmtUM0IwIiwgDQorICAgICAgICAgICAgImFXOXVMazVoYldWUVlYSjBFaGdLRUdsa1pXNTBhV1pwWlhKZmRtRnNkV1VZQXlBQktBa1NHZ29TY0c5eiIsIA0KKyAgICAgICAgICAgICJhWFJwZG1WZmFXNTBYM1poYkhWbEdBUWdBU2dFRWhvS0VtNWxaMkYwYVhabFgybHVkRjkyWVd4MVpSZ0YiLCANCisgICAgICAgICAgICAiSUFFb0F4SVVDZ3hrYjNWaWJHVmZkbUZzZFdVWUJpQUJLQUVTRkFvTWMzUnlhVzVuWDNaaGJIVmxHQWNnIiwgDQorICAgICAgICAgICAgIkFTZ01FaGNLRDJGblozSmxaMkYwWlY5MllXeDFaUmdJSUFFb0NSb3pDZ2hPWVcxbFVHRnlkQklSQ2dsdSIsIA0KKyAgICAgICAgICAgICJZVzFsWDNCaGNuUVlBU0FDS0FrU0ZBb01hWE5mWlhoMFpXNXphVzl1R0FJZ0FpZ0lJbndLRGxOdmRYSmoiLCANCisgICAgICAgICAgICAiWlVOdlpHVkpibVp2RWpvS0NHeHZZMkYwYVc5dUdBRWdBeWdMTWlndVoyOXZaMnhsTG5CeWIzUnZZblZtIiwgDQorICAgICAgICAgICAgIkxsTnZkWEpqWlVOdlpHVkpibVp2TGt4dlkyRjBhVzl1R2k0S0NFeHZZMkYwYVc5dUVoQUtCSEJoZEdnWSIsIA0KKyAgICAgICAgICAgICJBU0FES0FWQ0FoQUJFaEFLQkhOd1lXNFlBaUFES0FWQ0FoQUJRaWtLRTJOdmJTNW5iMjluYkdVdWNISnYiLCANCisgICAgICAgICAgImRHOWlkV1pDRUVSbGMyTnlhWEIwYjNKUWNtOTBiM05JQVE9PSIpKTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyIGFzc2lnbmVyID0gZGVsZWdhdGUocGJkOjpGaWxlRGVzY3JpcHRvciByb290KSB7DQorICAgICAgICBkZXNjcmlwdG9yID0gcm9vdDsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yU2V0X19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclNldF9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JTZXQsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yU2V0LkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yU2V0X19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRmlsZSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JQcm90bywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JQcm90by5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiTmFtZSIsICJQYWNrYWdlIiwgIkRlcGVuZGVuY3kiLCAiTWVzc2FnZVR5cGUiLCAiRW51bVR5cGUiLCAiU2VydmljZSIsICJFeHRlbnNpb24iLCAiT3B0aW9ucyIsICJTb3VyY2VDb2RlSW5mbyIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMl07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90bywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIk5hbWUiLCAiRmllbGQiLCAiRXh0ZW5zaW9uIiwgIk5lc3RlZFR5cGUiLCAiRW51bVR5cGUiLCAiRXh0ZW5zaW9uUmFuZ2UiLCAiT3B0aW9ucyIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX19EZXNjcmlwdG9yID0gaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8uVHlwZXMuRXh0ZW5zaW9uUmFuZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90by5UeXBlcy5FeHRlbnNpb25SYW5nZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJTdGFydCIsICJFbmQiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbM107DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiTmFtZSIsICJOdW1iZXIiLCAiTGFiZWwiLCAiVHlwZSIsICJUeXBlTmFtZSIsICJFeHRlbmRlZSIsICJEZWZhdWx0VmFsdWUiLCAiT3B0aW9ucyIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRW51bURlc2NyaXB0b3JQcm90b19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzRdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRW51bURlc2NyaXB0b3JQcm90b19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bURlc2NyaXB0b3JQcm90bywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bURlc2NyaXB0b3JQcm90by5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiTmFtZSIsICJWYWx1ZSIsICJPcHRpb25zIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s1XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZURlc2NyaXB0b3JQcm90b19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8uQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiTmFtZSIsICJOdW1iZXIiLCAiT3B0aW9ucyIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfU2VydmljZURlc2NyaXB0b3JQcm90b19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzZdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfU2VydmljZURlc2NyaXB0b3JQcm90b19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU2VydmljZURlc2NyaXB0b3JQcm90bywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU2VydmljZURlc2NyaXB0b3JQcm90by5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlRGVzY3JpcHRvclByb3RvX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiTmFtZSIsICJNZXRob2QiLCAiT3B0aW9ucyIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfTWV0aG9kRGVzY3JpcHRvclByb3RvX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbN107DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9NZXRob2REZXNjcmlwdG9yUHJvdG9fX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1ldGhvZERlc2NyaXB0b3JQcm90bywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kRGVzY3JpcHRvclByb3RvLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90b19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIk5hbWUiLCAiSW5wdXRUeXBlIiwgIk91dHB1dFR5cGUiLCAiT3B0aW9ucyIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s4XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZU9wdGlvbnMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJKYXZhUGFja2FnZSIsICJKYXZhT3V0ZXJDbGFzc25hbWUiLCAiSmF2YU11bHRpcGxlRmlsZXMiLCAiSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaCIsICJPcHRpbWl6ZUZvciIsICJDY0dlbmVyaWNTZXJ2aWNlcyIsICJKYXZhR2VuZXJpY1NlcnZpY2VzIiwgIlB5R2VuZXJpY1NlcnZpY2VzIiwgIlVuaW50ZXJwcmV0ZWRPcHRpb24iLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX01lc3NhZ2VPcHRpb25zX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbOV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9NZXNzYWdlT3B0aW9uc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWVzc2FnZU9wdGlvbnMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1lc3NhZ2VPcHRpb25zLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX01lc3NhZ2VPcHRpb25zX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiTWVzc2FnZVNldFdpcmVGb3JtYXQiLCAiTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvciIsICJVbmludGVycHJldGVkT3B0aW9uIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkN0eXBlIiwgIlBhY2tlZCIsICJEZXByZWNhdGVkIiwgIkV4cGVyaW1lbnRhbE1hcEtleSIsICJVbmludGVycHJldGVkT3B0aW9uIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9FbnVtT3B0aW9uc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzExXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0VudW1PcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bU9wdGlvbnMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRW51bU9wdGlvbnNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJVbmludGVycHJldGVkT3B0aW9uIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVPcHRpb25zX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTJdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRW51bVZhbHVlT3B0aW9uc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlT3B0aW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlT3B0aW9ucy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVPcHRpb25zX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiVW5pbnRlcnByZXRlZE9wdGlvbiIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfU2VydmljZU9wdGlvbnNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxM107DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlT3B0aW9uc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU2VydmljZU9wdGlvbnMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VPcHRpb25zLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VPcHRpb25zX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiVW5pbnRlcnByZXRlZE9wdGlvbiIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfTWV0aG9kT3B0aW9uc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzE0XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZE9wdGlvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1ldGhvZE9wdGlvbnMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1ldGhvZE9wdGlvbnMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfTWV0aG9kT3B0aW9uc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIlVuaW50ZXJwcmV0ZWRPcHRpb24iLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxNV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJOYW1lIiwgIklkZW50aWZpZXJWYWx1ZSIsICJQb3NpdGl2ZUludFZhbHVlIiwgIk5lZ2F0aXZlSW50VmFsdWUiLCAiRG91YmxlVmFsdWUiLCAiU3RyaW5nVmFsdWUiLCAiQWdncmVnYXRlVmFsdWUiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5UeXBlcy5OYW1lUGFydCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5UeXBlcy5OYW1lUGFydC5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiTmFtZVBhcnRfIiwgIklzRXh0ZW5zaW9uIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzE2XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mbywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU291cmNlQ29kZUluZm8uQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfU291cmNlQ29kZUluZm9fX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJMb2NhdGlvbiIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfU291cmNlQ29kZUluZm9fTG9jYXRpb25fX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19fRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mby5UeXBlcy5Mb2NhdGlvbiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU291cmNlQ29kZUluZm8uVHlwZXMuTG9jYXRpb24uQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfU291cmNlQ29kZUluZm9fTG9jYXRpb25fX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJQYXRoIiwgIlNwYW4iLCB9KTsNCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgIH07DQorICAgICAgcGJkOjpGaWxlRGVzY3JpcHRvci5JbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oZGVzY3JpcHRvckRhdGEsDQorICAgICAgICAgIG5ldyBwYmQ6OkZpbGVEZXNjcmlwdG9yW10gew0KKyAgICAgICAgICB9LCBhc3NpZ25lcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgIH0NCisgICNyZWdpb24gTWVzc2FnZXMNCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRmlsZURlc2NyaXB0b3JTZXQgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxGaWxlRGVzY3JpcHRvclNldCwgRmlsZURlc2NyaXB0b3JTZXQuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEZpbGVEZXNjcmlwdG9yU2V0KCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZpbGVEZXNjcmlwdG9yU2V0IGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBGaWxlRGVzY3JpcHRvclNldCgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZmlsZURlc2NyaXB0b3JTZXRGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImZpbGUiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfZmlsZURlc2NyaXB0b3JTZXRGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAgfTsNCisgICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvclNldCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEZpbGVEZXNjcmlwdG9yU2V0IERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZpbGVEZXNjcmlwdG9yU2V0IFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JTZXRfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8RmlsZURlc2NyaXB0b3JTZXQsIEZpbGVEZXNjcmlwdG9yU2V0LkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yU2V0X19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBGaWxlRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8+IGZpbGVfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8+IEZpbGVMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZmlsZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpbGVDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZpbGVfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8gR2V0RmlsZShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gZmlsZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JQcm90byBlbGVtZW50IGluIEZpbGVMaXN0KSB7DQorICAgICAgICAgIGlmICghZWxlbWVudC5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9maWxlRGVzY3JpcHRvclNldEZpZWxkTmFtZXM7DQorICAgICAgaWYgKGZpbGVfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDEsIGZpZWxkX25hbWVzWzBdLCBmaWxlXyk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlRGVzY3JpcHRvclByb3RvIGVsZW1lbnQgaW4gRmlsZUxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxLCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmlsZURlc2NyaXB0b3JTZXQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmlsZURlc2NyaXB0b3JTZXQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmlsZURlc2NyaXB0b3JTZXQgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZpbGVEZXNjcmlwdG9yU2V0IFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvclNldCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvclNldCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvclNldCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvclNldCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvclNldCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvclNldCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBGaWxlRGVzY3JpcHRvclNldCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgZmlsZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihGaWxlRGVzY3JpcHRvclNldCBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxGaWxlRGVzY3JpcHRvclNldCwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoRmlsZURlc2NyaXB0b3JTZXQgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBGaWxlRGVzY3JpcHRvclNldCByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBGaWxlRGVzY3JpcHRvclNldCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEZpbGVEZXNjcmlwdG9yU2V0IG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgRmlsZURlc2NyaXB0b3JTZXQoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZpbGVEZXNjcmlwdG9yU2V0IE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JTZXQuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRmlsZURlc2NyaXB0b3JTZXQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JTZXQuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBGaWxlRGVzY3JpcHRvclNldCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgRmlsZURlc2NyaXB0b3JTZXQpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRmlsZURlc2NyaXB0b3JTZXQpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShGaWxlRGVzY3JpcHRvclNldCBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yU2V0LkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLmZpbGVfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LmZpbGVfLkFkZChvdGhlci5maWxlXyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9maWxlRGVzY3JpcHRvclNldEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9maWxlRGVzY3JpcHRvclNldEZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5maWxlXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JQcm90by5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8+IEZpbGVMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmZpbGVfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmlsZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRmlsZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlRGVzY3JpcHRvclByb3RvIEdldEZpbGUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldEZpbGUoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWxlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JQcm90byB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmlsZV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RmlsZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmlsZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmlsZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlRGVzY3JpcHRvclByb3RvIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWxlXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEZpbGUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JQcm90by5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWxlXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRmlsZShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5maWxlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckZpbGUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpbGVfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIEZpbGVEZXNjcmlwdG9yU2V0KCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEZpbGVEZXNjcmlwdG9yUHJvdG8gOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxGaWxlRGVzY3JpcHRvclByb3RvLCBGaWxlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBGaWxlRGVzY3JpcHRvclByb3RvKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZpbGVEZXNjcmlwdG9yUHJvdG8gZGVmYXVsdEluc3RhbmNlID0gbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG8oKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2ZpbGVEZXNjcmlwdG9yUHJvdG9GaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImRlcGVuZGVuY3kiLCAiZW51bV90eXBlIiwgImV4dGVuc2lvbiIsICJtZXNzYWdlX3R5cGUiLCAibmFtZSIsICJvcHRpb25zIiwgInBhY2thZ2UiLCAic2VydmljZSIsICJzb3VyY2VfY29kZV9pbmZvIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2ZpbGVEZXNjcmlwdG9yUHJvdG9GaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMjYsIDQyLCA1OCwgMzQsIDEwLCA2NiwgMTgsIDUwLCA3NCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEZpbGVEZXNjcmlwdG9yUHJvdG8gRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBGaWxlRGVzY3JpcHRvclByb3RvIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZpbGVEZXNjcmlwdG9yUHJvdG8gVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEZpbGVEZXNjcmlwdG9yUHJvdG8sIEZpbGVEZXNjcmlwdG9yUHJvdG8uQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTmFtZUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc05hbWU7DQorICAgIHByaXZhdGUgc3RyaW5nIG5hbWVfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc05hbWUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNOYW1lOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBOYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gbmFtZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrYWdlRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzUGFja2FnZTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgcGFja2FnZV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzUGFja2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1BhY2thZ2U7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIFBhY2thZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrYWdlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlcGVuZGVuY3lGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiBkZXBlbmRlbmN5XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gRGVwZW5kZW5jeUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoZGVwZW5kZW5jeV8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEZXBlbmRlbmN5Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBkZXBlbmRlbmN5Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgR2V0RGVwZW5kZW5jeShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gZGVwZW5kZW5jeV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE1lc3NhZ2VUeXBlRmllbGROdW1iZXIgPSA0Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90bz4gbWVzc2FnZVR5cGVfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90bz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvPiBNZXNzYWdlVHlwZUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBtZXNzYWdlVHlwZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IE1lc3NhZ2VUeXBlQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBtZXNzYWdlVHlwZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvIEdldE1lc3NhZ2VUeXBlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBtZXNzYWdlVHlwZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEVudW1UeXBlRmllbGROdW1iZXIgPSA1Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1EZXNjcmlwdG9yUHJvdG8+IGVudW1UeXBlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtRGVzY3JpcHRvclByb3RvPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtRGVzY3JpcHRvclByb3RvPiBFbnVtVHlwZUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBlbnVtVHlwZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEVudW1UeXBlQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBlbnVtVHlwZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bURlc2NyaXB0b3JQcm90byBHZXRFbnVtVHlwZShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gZW51bVR5cGVfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBTZXJ2aWNlRmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8+IHNlcnZpY2VfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8+IFNlcnZpY2VMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gc2VydmljZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFNlcnZpY2VDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHNlcnZpY2VfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gR2V0U2VydmljZShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gc2VydmljZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90bz4gZXh0ZW5zaW9uXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90bz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8+IEV4dGVuc2lvbkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBleHRlbnNpb25fOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBFeHRlbnNpb25Db3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGV4dGVuc2lvbl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8gR2V0RXh0ZW5zaW9uKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBleHRlbnNpb25fW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25zRmllbGROdW1iZXIgPSA4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uczsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlT3B0aW9ucyBvcHRpb25zXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9ucyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbnM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZU9wdGlvbnMgT3B0aW9ucyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbnNfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVPcHRpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFNvdXJjZUNvZGVJbmZvRmllbGROdW1iZXIgPSA5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzU291cmNlQ29kZUluZm87DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU291cmNlQ29kZUluZm8gc291cmNlQ29kZUluZm9fOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNTb3VyY2VDb2RlSW5mbyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1NvdXJjZUNvZGVJbmZvOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNvdXJjZUNvZGVJbmZvIFNvdXJjZUNvZGVJbmZvIHsNCisgICAgICBnZXQgeyByZXR1cm4gc291cmNlQ29kZUluZm9fID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNvdXJjZUNvZGVJbmZvLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvIGVsZW1lbnQgaW4gTWVzc2FnZVR5cGVMaXN0KSB7DQorICAgICAgICAgIGlmICghZWxlbWVudC5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtRGVzY3JpcHRvclByb3RvIGVsZW1lbnQgaW4gRW51bVR5cGVMaXN0KSB7DQorICAgICAgICAgIGlmICghZWxlbWVudC5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5TZXJ2aWNlRGVzY3JpcHRvclByb3RvIGVsZW1lbnQgaW4gU2VydmljZUxpc3QpIHsNCisgICAgICAgICAgaWYgKCFlbGVtZW50LklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvIGVsZW1lbnQgaW4gRXh0ZW5zaW9uTGlzdCkgew0KKyAgICAgICAgICBpZiAoIWVsZW1lbnQuSXNJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKEhhc09wdGlvbnMpIHsNCisgICAgICAgICAgaWYgKCFPcHRpb25zLklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2ZpbGVEZXNjcmlwdG9yUHJvdG9GaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNOYW1lKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMSwgZmllbGRfbmFtZXNbNF0sIE5hbWUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzUGFja2FnZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDIsIGZpZWxkX25hbWVzWzZdLCBQYWNrYWdlKTsNCisgICAgICB9DQorICAgICAgaWYgKGRlcGVuZGVuY3lfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoMywgZmllbGRfbmFtZXNbMF0sIGRlcGVuZGVuY3lfKTsNCisgICAgICB9DQorICAgICAgaWYgKG1lc3NhZ2VUeXBlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSg0LCBmaWVsZF9uYW1lc1szXSwgbWVzc2FnZVR5cGVfKTsNCisgICAgICB9DQorICAgICAgaWYgKGVudW1UeXBlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSg1LCBmaWVsZF9uYW1lc1sxXSwgZW51bVR5cGVfKTsNCisgICAgICB9DQorICAgICAgaWYgKHNlcnZpY2VfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDYsIGZpZWxkX25hbWVzWzddLCBzZXJ2aWNlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChleHRlbnNpb25fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDcsIGZpZWxkX25hbWVzWzJdLCBleHRlbnNpb25fKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbnMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoOCwgZmllbGRfbmFtZXNbNV0sIE9wdGlvbnMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU291cmNlQ29kZUluZm8pIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoOSwgZmllbGRfbmFtZXNbOF0sIFNvdXJjZUNvZGVJbmZvKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNOYW1lKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxLCBOYW1lKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1BhY2thZ2UpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDIsIFBhY2thZ2UpOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGVsZW1lbnQgaW4gRGVwZW5kZW5jeUxpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAxICogZGVwZW5kZW5jeV8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90byBlbGVtZW50IGluIE1lc3NhZ2VUeXBlTGlzdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDQsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtRGVzY3JpcHRvclByb3RvIGVsZW1lbnQgaW4gRW51bVR5cGVMaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoNSwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gZWxlbWVudCBpbiBTZXJ2aWNlTGlzdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDYsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90byBlbGVtZW50IGluIEV4dGVuc2lvbkxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSg3LCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbnMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSg4LCBPcHRpb25zKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1NvdXJjZUNvZGVJbmZvKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoOSwgU291cmNlQ29kZUluZm8pOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZpbGVEZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmlsZURlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmlsZURlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmlsZURlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZpbGVEZXNjcmlwdG9yUHJvdG8gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmlsZURlc2NyaXB0b3JQcm90byBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZpbGVEZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgRmlsZURlc2NyaXB0b3JQcm90byBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgZGVwZW5kZW5jeV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgbWVzc2FnZVR5cGVfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIGVudW1UeXBlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBzZXJ2aWNlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBleHRlbnNpb25fLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoRmlsZURlc2NyaXB0b3JQcm90byBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxGaWxlRGVzY3JpcHRvclByb3RvLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihGaWxlRGVzY3JpcHRvclByb3RvIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgRmlsZURlc2NyaXB0b3JQcm90byByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBGaWxlRGVzY3JpcHRvclByb3RvIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG8oKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZpbGVEZXNjcmlwdG9yUHJvdG8gTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlRGVzY3JpcHRvclByb3RvLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEZpbGVEZXNjcmlwdG9yUHJvdG8gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JQcm90by5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEZpbGVEZXNjcmlwdG9yUHJvdG8gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEZpbGVEZXNjcmlwdG9yUHJvdG8pIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRmlsZURlc2NyaXB0b3JQcm90bykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEZpbGVEZXNjcmlwdG9yUHJvdG8gb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlRGVzY3JpcHRvclByb3RvLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc05hbWUpIHsNCisgICAgICAgICAgTmFtZSA9IG90aGVyLk5hbWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzUGFja2FnZSkgew0KKyAgICAgICAgICBQYWNrYWdlID0gb3RoZXIuUGFja2FnZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5kZXBlbmRlbmN5Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5kZXBlbmRlbmN5Xy5BZGQob3RoZXIuZGVwZW5kZW5jeV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLm1lc3NhZ2VUeXBlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5tZXNzYWdlVHlwZV8uQWRkKG90aGVyLm1lc3NhZ2VUeXBlXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuZW51bVR5cGVfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LmVudW1UeXBlXy5BZGQob3RoZXIuZW51bVR5cGVfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5zZXJ2aWNlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5zZXJ2aWNlXy5BZGQob3RoZXIuc2VydmljZV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLmV4dGVuc2lvbl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uXy5BZGQob3RoZXIuZXh0ZW5zaW9uXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9ucykgew0KKyAgICAgICAgICBNZXJnZU9wdGlvbnMob3RoZXIuT3B0aW9ucyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzU291cmNlQ29kZUluZm8pIHsNCisgICAgICAgICAgTWVyZ2VTb3VyY2VDb2RlSW5mbyhvdGhlci5Tb3VyY2VDb2RlSW5mbyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9maWxlRGVzY3JpcHRvclByb3RvRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2ZpbGVEZXNjcmlwdG9yUHJvdG9GaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0Lm5hbWVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzUGFja2FnZSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5wYWNrYWdlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LmRlcGVuZGVuY3lfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0Lm1lc3NhZ2VUeXBlXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDI6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuZW51bVR5cGVfLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtRGVzY3JpcHRvclByb3RvLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTA6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuc2VydmljZV8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8uRGVmYXVsdEluc3RhbmNlLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1ODogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5leHRlbnNpb25fLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90by5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY2OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlT3B0aW9ucy5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlT3B0aW9ucy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbnMpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oT3B0aW9ucyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBPcHRpb25zID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc0OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mby5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mby5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc1NvdXJjZUNvZGVJbmZvKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKFNvdXJjZUNvZGVJbmZvKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIFNvdXJjZUNvZGVJbmZvID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNOYW1lIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTmFtZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OYW1lOyB9DQorICAgICAgICBzZXQgeyBTZXROYW1lKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROYW1lKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmFtZSA9IHRydWU7DQorICAgICAgICByZXN1bHQubmFtZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5hbWUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05hbWUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5uYW1lXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1BhY2thZ2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNQYWNrYWdlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgUGFja2FnZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2thZ2U7IH0NCisgICAgICAgIHNldCB7IFNldFBhY2thZ2UodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2thZ2Uoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNQYWNrYWdlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5wYWNrYWdlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzUGFja2FnZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnBhY2thZ2VfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxzdHJpbmc+IERlcGVuZGVuY3lMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmRlcGVuZGVuY3lfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRGVwZW5kZW5jeUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVwZW5kZW5jeUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgR2V0RGVwZW5kZW5jeShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0RGVwZW5kZW5jeShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlcGVuZGVuY3koaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmRlcGVuZGVuY3lfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZERlcGVuZGVuY3koc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5kZXBlbmRlbmN5Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRGVwZW5kZW5jeShzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmRlcGVuZGVuY3lfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVwZW5kZW5jeSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZGVwZW5kZW5jeV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90bz4gTWVzc2FnZVR5cGVMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLm1lc3NhZ2VUeXBlXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IE1lc3NhZ2VUeXBlQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5NZXNzYWdlVHlwZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8gR2V0TWVzc2FnZVR5cGUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldE1lc3NhZ2VUeXBlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TWVzc2FnZVR5cGUoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lm1lc3NhZ2VUeXBlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRNZXNzYWdlVHlwZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90by5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5tZXNzYWdlVHlwZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkTWVzc2FnZVR5cGUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5tZXNzYWdlVHlwZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRNZXNzYWdlVHlwZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubWVzc2FnZVR5cGVfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VNZXNzYWdlVHlwZShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90bz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lm1lc3NhZ2VUeXBlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck1lc3NhZ2VUeXBlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5tZXNzYWdlVHlwZV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1EZXNjcmlwdG9yUHJvdG8+IEVudW1UeXBlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5lbnVtVHlwZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBFbnVtVHlwZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRW51bVR5cGVDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bURlc2NyaXB0b3JQcm90byBHZXRFbnVtVHlwZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0RW51bVR5cGUoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRFbnVtVHlwZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1EZXNjcmlwdG9yUHJvdG8gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmVudW1UeXBlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRFbnVtVHlwZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1EZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZW51bVR5cGVfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEVudW1UeXBlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1EZXNjcmlwdG9yUHJvdG8gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmVudW1UeXBlXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEVudW1UeXBlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1EZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZW51bVR5cGVfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VFbnVtVHlwZShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1EZXNjcmlwdG9yUHJvdG8+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5lbnVtVHlwZV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJFbnVtVHlwZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZW51bVR5cGVfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5TZXJ2aWNlRGVzY3JpcHRvclByb3RvPiBTZXJ2aWNlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5zZXJ2aWNlXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFNlcnZpY2VDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlNlcnZpY2VDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU2VydmljZURlc2NyaXB0b3JQcm90byBHZXRTZXJ2aWNlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRTZXJ2aWNlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0U2VydmljZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnNlcnZpY2VfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFNlcnZpY2UoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnNlcnZpY2VfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFNlcnZpY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU2VydmljZURlc2NyaXB0b3JQcm90byB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuc2VydmljZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRTZXJ2aWNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuc2VydmljZV8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVNlcnZpY2Uoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5TZXJ2aWNlRGVzY3JpcHRvclByb3RvPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuc2VydmljZV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTZXJ2aWNlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5zZXJ2aWNlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8+IEV4dGVuc2lvbkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZXh0ZW5zaW9uXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEV4dGVuc2lvbkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRXh0ZW5zaW9uQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvIEdldEV4dGVuc2lvbihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0RXh0ZW5zaW9uKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RXh0ZW5zaW9uKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmV4dGVuc2lvbl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RXh0ZW5zaW9uKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZXh0ZW5zaW9uX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRFeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmV4dGVuc2lvbl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRFeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZXh0ZW5zaW9uXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRXh0ZW5zaW9uKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5leHRlbnNpb25fLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRXh0ZW5zaW9uKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5leHRlbnNpb25fLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9ucyB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZU9wdGlvbnMgT3B0aW9ucyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbnM7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbnModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbnMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZU9wdGlvbnMgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbnMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbnNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9ucyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlT3B0aW9ucy5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25zXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlT3B0aW9ucyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlT3B0aW9ucyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbnMgJiYNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uc18gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZU9wdGlvbnMuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnNfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZU9wdGlvbnMuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uc18pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQub3B0aW9uc18gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbnMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbnMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25zXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzU291cmNlQ29kZUluZm8gew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1NvdXJjZUNvZGVJbmZvOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mbyBTb3VyY2VDb2RlSW5mbyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlNvdXJjZUNvZGVJbmZvOyB9DQorICAgICAgICBzZXQgeyBTZXRTb3VyY2VDb2RlSW5mbyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0U291cmNlQ29kZUluZm8oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU291cmNlQ29kZUluZm8gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1NvdXJjZUNvZGVJbmZvID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5zb3VyY2VDb2RlSW5mb18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRTb3VyY2VDb2RlSW5mbyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mby5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTb3VyY2VDb2RlSW5mbyA9IHRydWU7DQorICAgICAgICByZXN1bHQuc291cmNlQ29kZUluZm9fID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VTb3VyY2VDb2RlSW5mbyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mbyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc1NvdXJjZUNvZGVJbmZvICYmDQorICAgICAgICAgICAgcmVzdWx0LnNvdXJjZUNvZGVJbmZvXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mby5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQuc291cmNlQ29kZUluZm9fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU291cmNlQ29kZUluZm8uQ3JlYXRlQnVpbGRlcihyZXN1bHQuc291cmNlQ29kZUluZm9fKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0LnNvdXJjZUNvZGVJbmZvXyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc1NvdXJjZUNvZGVJbmZvID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclNvdXJjZUNvZGVJbmZvKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTb3VyY2VDb2RlSW5mbyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnNvdXJjZUNvZGVJbmZvXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIEZpbGVEZXNjcmlwdG9yUHJvdG8oKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRGVzY3JpcHRvclByb3RvIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8RGVzY3JpcHRvclByb3RvLCBEZXNjcmlwdG9yUHJvdG8uQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIERlc2NyaXB0b3JQcm90bygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEZXNjcmlwdG9yUHJvdG8gZGVmYXVsdEluc3RhbmNlID0gbmV3IERlc2NyaXB0b3JQcm90bygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZGVzY3JpcHRvclByb3RvRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJlbnVtX3R5cGUiLCAiZXh0ZW5zaW9uIiwgImV4dGVuc2lvbl9yYW5nZSIsICJmaWVsZCIsICJuYW1lIiwgIm5lc3RlZF90eXBlIiwgIm9wdGlvbnMiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfZGVzY3JpcHRvclByb3RvRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDM0LCA1MCwgNDIsIDE4LCAxMCwgMjYsIDU4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgRGVzY3JpcHRvclByb3RvIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgRGVzY3JpcHRvclByb3RvIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIERlc2NyaXB0b3JQcm90byBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxEZXNjcmlwdG9yUHJvdG8sIERlc2NyaXB0b3JQcm90by5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgew0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEV4dGVuc2lvblJhbmdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8RXh0ZW5zaW9uUmFuZ2UsIEV4dGVuc2lvblJhbmdlLkJ1aWxkZXI+IHsNCisgICAgICAgIHByaXZhdGUgRXh0ZW5zaW9uUmFuZ2UoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEV4dGVuc2lvblJhbmdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBFeHRlbnNpb25SYW5nZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2V4dGVuc2lvblJhbmdlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJlbmQiLCAic3RhcnQiIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2V4dGVuc2lvblJhbmdlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDE2LCA4IH07DQorICAgICAgICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvblJhbmdlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEV4dGVuc2lvblJhbmdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBFeHRlbnNpb25SYW5nZSBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEV4dGVuc2lvblJhbmdlLCBFeHRlbnNpb25SYW5nZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBTdGFydEZpZWxkTnVtYmVyID0gMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNTdGFydDsNCisgICAgICAgIHByaXZhdGUgaW50IHN0YXJ0XzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc1N0YXJ0IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc1N0YXJ0OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IFN0YXJ0IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHN0YXJ0XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEVuZEZpZWxkTnVtYmVyID0gMjsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNFbmQ7DQorICAgICAgICBwcml2YXRlIGludCBlbmRfOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRW5kIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0VuZDsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBFbmQgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZW5kXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9leHRlbnNpb25SYW5nZUZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNTdGFydCkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzFdLCBTdGFydCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc0VuZCkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIsIGZpZWxkX25hbWVzWzBdLCBFbmQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIGlmIChoYXNTdGFydCkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgU3RhcnQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNFbmQpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIsIEVuZCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvblJhbmdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvblJhbmdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvblJhbmdlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBFeHRlbnNpb25SYW5nZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uUmFuZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uUmFuZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uUmFuZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uUmFuZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uUmFuZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uUmFuZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgRXh0ZW5zaW9uUmFuZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKEV4dGVuc2lvblJhbmdlIHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8RXh0ZW5zaW9uUmFuZ2UsIEJ1aWxkZXI+IHsNCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludGVybmFsIEJ1aWxkZXIoRXh0ZW5zaW9uUmFuZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICAgICAgcHJpdmF0ZSBFeHRlbnNpb25SYW5nZSByZXN1bHQ7DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIEV4dGVuc2lvblJhbmdlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICBFeHRlbnNpb25SYW5nZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBFeHRlbnNpb25SYW5nZSgpOw0KKyAgICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBFeHRlbnNpb25SYW5nZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8uVHlwZXMuRXh0ZW5zaW9uUmFuZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRXh0ZW5zaW9uUmFuZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90by5UeXBlcy5FeHRlbnNpb25SYW5nZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEV4dGVuc2lvblJhbmdlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciBpcyBFeHRlbnNpb25SYW5nZSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRXh0ZW5zaW9uUmFuZ2UpIG90aGVyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRXh0ZW5zaW9uUmFuZ2Ugb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvLlR5cGVzLkV4dGVuc2lvblJhbmdlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzU3RhcnQpIHsNCisgICAgICAgICAgICAgIFN0YXJ0ID0gb3RoZXIuU3RhcnQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNFbmQpIHsNCisgICAgICAgICAgICAgIEVuZCA9IG90aGVyLkVuZDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfZXh0ZW5zaW9uUmFuZ2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgICAgIHRhZyA9IF9leHRlbnNpb25SYW5nZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzU3RhcnQgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5zdGFydF8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzRW5kID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZW5kXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc1N0YXJ0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1N0YXJ0OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBTdGFydCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5TdGFydDsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldFN0YXJ0KHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFN0YXJ0KGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc1N0YXJ0ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuc3RhcnRfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTdGFydCgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNTdGFydCA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5zdGFydF8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNFbmQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRW5kOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBFbmQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRW5kOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0RW5kKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEVuZChpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNFbmQgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5lbmRfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJFbmQoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRW5kID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmVuZF8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgRXh0ZW5zaW9uUmFuZ2UoKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOYW1lRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzTmFtZTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgbmFtZV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzTmFtZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc05hbWU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIE5hbWUgew0KKyAgICAgIGdldCB7IHJldHVybiBuYW1lXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvPiBmaWVsZF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvPiBGaWVsZExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZF87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEZpZWxkQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBmaWVsZF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8gR2V0RmllbGQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGZpZWxkX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvPiBleHRlbnNpb25fID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90bz4gRXh0ZW5zaW9uTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGV4dGVuc2lvbl87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEV4dGVuc2lvbkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gZXh0ZW5zaW9uXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90byBHZXRFeHRlbnNpb24oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGV4dGVuc2lvbl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE5lc3RlZFR5cGVGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvPiBuZXN0ZWRUeXBlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90bz4gTmVzdGVkVHlwZUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBuZXN0ZWRUeXBlXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgTmVzdGVkVHlwZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gbmVzdGVkVHlwZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvIEdldE5lc3RlZFR5cGUoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIG5lc3RlZFR5cGVfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBFbnVtVHlwZUZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtRGVzY3JpcHRvclByb3RvPiBlbnVtVHlwZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bURlc2NyaXB0b3JQcm90bz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bURlc2NyaXB0b3JQcm90bz4gRW51bVR5cGVMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZW51bVR5cGVfOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBFbnVtVHlwZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gZW51bVR5cGVfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1EZXNjcmlwdG9yUHJvdG8gR2V0RW51bVR5cGUoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGVudW1UeXBlX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRXh0ZW5zaW9uUmFuZ2VGaWVsZE51bWJlciA9IDU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvLlR5cGVzLkV4dGVuc2lvblJhbmdlPiBleHRlbnNpb25SYW5nZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvLlR5cGVzLkV4dGVuc2lvblJhbmdlPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8uVHlwZXMuRXh0ZW5zaW9uUmFuZ2U+IEV4dGVuc2lvblJhbmdlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGV4dGVuc2lvblJhbmdlXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRXh0ZW5zaW9uUmFuZ2VDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGV4dGVuc2lvblJhbmdlXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8uVHlwZXMuRXh0ZW5zaW9uUmFuZ2UgR2V0RXh0ZW5zaW9uUmFuZ2UoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGV4dGVuc2lvblJhbmdlX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uc0ZpZWxkTnVtYmVyID0gNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbnM7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWVzc2FnZU9wdGlvbnMgb3B0aW9uc187DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbnMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25zOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1lc3NhZ2VPcHRpb25zIE9wdGlvbnMgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25zXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5NZXNzYWdlT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvIGVsZW1lbnQgaW4gRmllbGRMaXN0KSB7DQorICAgICAgICAgIGlmICghZWxlbWVudC5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90byBlbGVtZW50IGluIEV4dGVuc2lvbkxpc3QpIHsNCisgICAgICAgICAgaWYgKCFlbGVtZW50LklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90byBlbGVtZW50IGluIE5lc3RlZFR5cGVMaXN0KSB7DQorICAgICAgICAgIGlmICghZWxlbWVudC5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtRGVzY3JpcHRvclByb3RvIGVsZW1lbnQgaW4gRW51bVR5cGVMaXN0KSB7DQorICAgICAgICAgIGlmICghZWxlbWVudC5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICBpZiAoSGFzT3B0aW9ucykgew0KKyAgICAgICAgICBpZiAoIU9wdGlvbnMuSXNJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfZGVzY3JpcHRvclByb3RvRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzTmFtZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzRdLCBOYW1lKTsNCisgICAgICB9DQorICAgICAgaWYgKGZpZWxkXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSgyLCBmaWVsZF9uYW1lc1szXSwgZmllbGRfKTsNCisgICAgICB9DQorICAgICAgaWYgKG5lc3RlZFR5cGVfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDMsIGZpZWxkX25hbWVzWzVdLCBuZXN0ZWRUeXBlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChlbnVtVHlwZV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlQXJyYXkoNCwgZmllbGRfbmFtZXNbMF0sIGVudW1UeXBlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChleHRlbnNpb25SYW5nZV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlQXJyYXkoNSwgZmllbGRfbmFtZXNbMl0sIGV4dGVuc2lvblJhbmdlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChleHRlbnNpb25fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDYsIGZpZWxkX25hbWVzWzFdLCBleHRlbnNpb25fKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbnMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoNywgZmllbGRfbmFtZXNbNl0sIE9wdGlvbnMpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc05hbWUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDEsIE5hbWUpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90byBlbGVtZW50IGluIEZpZWxkTGlzdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDIsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90byBlbGVtZW50IGluIEV4dGVuc2lvbkxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSg2LCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvIGVsZW1lbnQgaW4gTmVzdGVkVHlwZUxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgzLCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bURlc2NyaXB0b3JQcm90byBlbGVtZW50IGluIEVudW1UeXBlTGlzdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDQsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8uVHlwZXMuRXh0ZW5zaW9uUmFuZ2UgZWxlbWVudCBpbiBFeHRlbnNpb25SYW5nZUxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSg1LCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbnMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSg3LCBPcHRpb25zKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIERlc2NyaXB0b3JQcm90byBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBEZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIERlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIERlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBEZXNjcmlwdG9yUHJvdG8gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRGVzY3JpcHRvclByb3RvIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIERlc2NyaXB0b3JQcm90byBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBEZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgRGVzY3JpcHRvclByb3RvIE1ha2VSZWFkT25seSgpIHsNCisgICAgICBmaWVsZF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgZXh0ZW5zaW9uXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBuZXN0ZWRUeXBlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBlbnVtVHlwZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgZXh0ZW5zaW9uUmFuZ2VfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoRGVzY3JpcHRvclByb3RvIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPERlc2NyaXB0b3JQcm90bywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoRGVzY3JpcHRvclByb3RvIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgRGVzY3JpcHRvclByb3RvIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIERlc2NyaXB0b3JQcm90byBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIERlc2NyaXB0b3JQcm90byBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IERlc2NyaXB0b3JQcm90bygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRGVzY3JpcHRvclByb3RvIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIERlc2NyaXB0b3JQcm90byBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8uRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBEZXNjcmlwdG9yUHJvdG8gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIERlc2NyaXB0b3JQcm90bykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChEZXNjcmlwdG9yUHJvdG8pIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShEZXNjcmlwdG9yUHJvdG8gb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8uRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzTmFtZSkgew0KKyAgICAgICAgICBOYW1lID0gb3RoZXIuTmFtZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5maWVsZF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQuZmllbGRfLkFkZChvdGhlci5maWVsZF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLmV4dGVuc2lvbl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uXy5BZGQob3RoZXIuZXh0ZW5zaW9uXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIubmVzdGVkVHlwZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQubmVzdGVkVHlwZV8uQWRkKG90aGVyLm5lc3RlZFR5cGVfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5lbnVtVHlwZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQuZW51bVR5cGVfLkFkZChvdGhlci5lbnVtVHlwZV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLmV4dGVuc2lvblJhbmdlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5leHRlbnNpb25SYW5nZV8uQWRkKG90aGVyLmV4dGVuc2lvblJhbmdlXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9ucykgew0KKyAgICAgICAgICBNZXJnZU9wdGlvbnMob3RoZXIuT3B0aW9ucyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9kZXNjcmlwdG9yUHJvdG9GaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfZGVzY3JpcHRvclByb3RvRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTmFtZSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5uYW1lXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5maWVsZF8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjY6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQubmVzdGVkVHlwZV8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90by5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LmVudW1UeXBlXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bURlc2NyaXB0b3JQcm90by5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQyOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LmV4dGVuc2lvblJhbmdlXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvLlR5cGVzLkV4dGVuc2lvblJhbmdlLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTA6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuZXh0ZW5zaW9uXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8uRGVmYXVsdEluc3RhbmNlLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1ODogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWVzc2FnZU9wdGlvbnMuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWVzc2FnZU9wdGlvbnMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25zKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKE9wdGlvbnMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgT3B0aW9ucyA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmFtZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc05hbWU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmFtZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TmFtZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TmFtZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05hbWUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm5hbWVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOYW1lKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubmFtZV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvPiBGaWVsZExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZmllbGRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRmllbGRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkZpZWxkQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvIEdldEZpZWxkKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRGaWVsZChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZpZWxkKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGaWVsZChpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRGaWVsZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90byB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmllbGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGRfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VGaWVsZChzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZmllbGRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmZpZWxkXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8+IEV4dGVuc2lvbkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZXh0ZW5zaW9uXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEV4dGVuc2lvbkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRXh0ZW5zaW9uQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvIEdldEV4dGVuc2lvbihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0RXh0ZW5zaW9uKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RXh0ZW5zaW9uKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmV4dGVuc2lvbl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RXh0ZW5zaW9uKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZXh0ZW5zaW9uX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRFeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmV4dGVuc2lvbl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRFeHRlbnNpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZXh0ZW5zaW9uXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRXh0ZW5zaW9uKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5leHRlbnNpb25fLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRXh0ZW5zaW9uKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5leHRlbnNpb25fLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8+IE5lc3RlZFR5cGVMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLm5lc3RlZFR5cGVfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgTmVzdGVkVHlwZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmVzdGVkVHlwZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8gR2V0TmVzdGVkVHlwZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0TmVzdGVkVHlwZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5lc3RlZFR5cGUoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lm5lc3RlZFR5cGVfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5lc3RlZFR5cGUoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubmVzdGVkVHlwZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkTmVzdGVkVHlwZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lm5lc3RlZFR5cGVfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkTmVzdGVkVHlwZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubmVzdGVkVHlwZV8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZU5lc3RlZFR5cGUoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5uZXN0ZWRUeXBlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5lc3RlZFR5cGUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lm5lc3RlZFR5cGVfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtRGVzY3JpcHRvclByb3RvPiBFbnVtVHlwZUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZW51bVR5cGVfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRW51bVR5cGVDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkVudW1UeXBlQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1EZXNjcmlwdG9yUHJvdG8gR2V0RW51bVR5cGUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldEVudW1UeXBlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RW51bVR5cGUoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtRGVzY3JpcHRvclByb3RvIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5lbnVtVHlwZV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RW51bVR5cGUoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmVudW1UeXBlX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRFbnVtVHlwZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtRGVzY3JpcHRvclByb3RvIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5lbnVtVHlwZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRFbnVtVHlwZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmVudW1UeXBlXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlRW51bVR5cGUoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtRGVzY3JpcHRvclByb3RvPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZW51bVR5cGVfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRW51bVR5cGUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmVudW1UeXBlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvLlR5cGVzLkV4dGVuc2lvblJhbmdlPiBFeHRlbnNpb25SYW5nZUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuZXh0ZW5zaW9uUmFuZ2VfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRXh0ZW5zaW9uUmFuZ2VDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkV4dGVuc2lvblJhbmdlQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90by5UeXBlcy5FeHRlbnNpb25SYW5nZSBHZXRFeHRlbnNpb25SYW5nZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0RXh0ZW5zaW9uUmFuZ2UoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRFeHRlbnNpb25SYW5nZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90by5UeXBlcy5FeHRlbnNpb25SYW5nZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZXh0ZW5zaW9uUmFuZ2VfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEV4dGVuc2lvblJhbmdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvLlR5cGVzLkV4dGVuc2lvblJhbmdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmV4dGVuc2lvblJhbmdlX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRFeHRlbnNpb25SYW5nZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG8uVHlwZXMuRXh0ZW5zaW9uUmFuZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmV4dGVuc2lvblJhbmdlXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEV4dGVuc2lvblJhbmdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90by5UeXBlcy5FeHRlbnNpb25SYW5nZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5leHRlbnNpb25SYW5nZV8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUV4dGVuc2lvblJhbmdlKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvLlR5cGVzLkV4dGVuc2lvblJhbmdlPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuZXh0ZW5zaW9uUmFuZ2VfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRXh0ZW5zaW9uUmFuZ2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmV4dGVuc2lvblJhbmdlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbnMgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbnM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1lc3NhZ2VPcHRpb25zIE9wdGlvbnMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25zOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25zKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25zKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1lc3NhZ2VPcHRpb25zIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25zXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbnMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWVzc2FnZU9wdGlvbnMuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9ucyA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uc18gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbnMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWVzc2FnZU9wdGlvbnMgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25zICYmDQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnNfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1lc3NhZ2VPcHRpb25zLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1lc3NhZ2VPcHRpb25zLkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm9wdGlvbnNfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm9wdGlvbnNfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9ucyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25zKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uc18gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBEZXNjcmlwdG9yUHJvdG8oKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRmllbGREZXNjcmlwdG9yUHJvdG8gOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxGaWVsZERlc2NyaXB0b3JQcm90bywgRmllbGREZXNjcmlwdG9yUHJvdG8uQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEZpZWxkRGVzY3JpcHRvclByb3RvKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZpZWxkRGVzY3JpcHRvclByb3RvIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBGaWVsZERlc2NyaXB0b3JQcm90bygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZmllbGREZXNjcmlwdG9yUHJvdG9GaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImRlZmF1bHRfdmFsdWUiLCAiZXh0ZW5kZWUiLCAibGFiZWwiLCAibmFtZSIsICJudW1iZXIiLCAib3B0aW9ucyIsICJ0eXBlIiwgInR5cGVfbmFtZSIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9maWVsZERlc2NyaXB0b3JQcm90b0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyA1OCwgMTgsIDMyLCAxMCwgMjQsIDY2LCA0MCwgNTAgfTsNCisgICAgcHVibGljIHN0YXRpYyBGaWVsZERlc2NyaXB0b3JQcm90byBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEZpZWxkRGVzY3JpcHRvclByb3RvIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZpZWxkRGVzY3JpcHRvclByb3RvIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8RmllbGREZXNjcmlwdG9yUHJvdG8sIEZpZWxkRGVzY3JpcHRvclByb3RvLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMNCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsNCisgICAgICBwdWJsaWMgZW51bSBUeXBlIHsNCisgICAgICAgIFRZUEVfRE9VQkxFID0gMSwNCisgICAgICAgIFRZUEVfRkxPQVQgPSAyLA0KKyAgICAgICAgVFlQRV9JTlQ2NCA9IDMsDQorICAgICAgICBUWVBFX1VJTlQ2NCA9IDQsDQorICAgICAgICBUWVBFX0lOVDMyID0gNSwNCisgICAgICAgIFRZUEVfRklYRUQ2NCA9IDYsDQorICAgICAgICBUWVBFX0ZJWEVEMzIgPSA3LA0KKyAgICAgICAgVFlQRV9CT09MID0gOCwNCisgICAgICAgIFRZUEVfU1RSSU5HID0gOSwNCisgICAgICAgIFRZUEVfR1JPVVAgPSAxMCwNCisgICAgICAgIFRZUEVfTUVTU0FHRSA9IDExLA0KKyAgICAgICAgVFlQRV9CWVRFUyA9IDEyLA0KKyAgICAgICAgVFlQRV9VSU5UMzIgPSAxMywNCisgICAgICAgIFRZUEVfRU5VTSA9IDE0LA0KKyAgICAgICAgVFlQRV9TRklYRUQzMiA9IDE1LA0KKyAgICAgICAgVFlQRV9TRklYRUQ2NCA9IDE2LA0KKyAgICAgICAgVFlQRV9TSU5UMzIgPSAxNywNCisgICAgICAgIFRZUEVfU0lOVDY0ID0gMTgsDQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBlbnVtIExhYmVsIHsNCisgICAgICAgIExBQkVMX09QVElPTkFMID0gMSwNCisgICAgICAgIExBQkVMX1JFUVVJUkVEID0gMiwNCisgICAgICAgIExBQkVMX1JFUEVBVEVEID0gMywNCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOYW1lRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzTmFtZTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgbmFtZV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzTmFtZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc05hbWU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIE5hbWUgew0KKyAgICAgIGdldCB7IHJldHVybiBuYW1lXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE51bWJlckZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc051bWJlcjsNCisgICAgcHJpdmF0ZSBpbnQgbnVtYmVyXzsNCisgICAgcHVibGljIGJvb2wgSGFzTnVtYmVyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTnVtYmVyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBOdW1iZXIgew0KKyAgICAgIGdldCB7IHJldHVybiBudW1iZXJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTGFiZWxGaWVsZE51bWJlciA9IDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNMYWJlbDsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5MYWJlbCBsYWJlbF8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5MYWJlbC5MQUJFTF9PUFRJT05BTDsNCisgICAgcHVibGljIGJvb2wgSGFzTGFiZWwgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNMYWJlbDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5MYWJlbCBMYWJlbCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGxhYmVsXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFR5cGVGaWVsZE51bWJlciA9IDU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNUeXBlOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLlR5cGUgdHlwZV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLlRZUEVfRE9VQkxFOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzVHlwZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlIFR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiB0eXBlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFR5cGVOYW1lRmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzVHlwZU5hbWU7DQorICAgIHByaXZhdGUgc3RyaW5nIHR5cGVOYW1lXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNUeXBlTmFtZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1R5cGVOYW1lOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBUeXBlTmFtZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHR5cGVOYW1lXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEV4dGVuZGVlRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRXh0ZW5kZWU7DQorICAgIHByaXZhdGUgc3RyaW5nIGV4dGVuZGVlXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNFeHRlbmRlZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0V4dGVuZGVlOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBFeHRlbmRlZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGV4dGVuZGVlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRWYWx1ZUZpZWxkTnVtYmVyID0gNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRWYWx1ZTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZGVmYXVsdFZhbHVlXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0VmFsdWUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0VmFsdWU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIERlZmF1bHRWYWx1ZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRWYWx1ZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25zRmllbGROdW1iZXIgPSA4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uczsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZE9wdGlvbnMgb3B0aW9uc187DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbnMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25zOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkT3B0aW9ucyBPcHRpb25zIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uc18gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaWYgKEhhc09wdGlvbnMpIHsNCisgICAgICAgICAgaWYgKCFPcHRpb25zLklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2ZpZWxkRGVzY3JpcHRvclByb3RvRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzTmFtZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzNdLCBOYW1lKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0V4dGVuZGVlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMiwgZmllbGRfbmFtZXNbMV0sIEV4dGVuZGVlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc051bWJlcikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMywgZmllbGRfbmFtZXNbNF0sIE51bWJlcik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNMYWJlbCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSg0LCBmaWVsZF9uYW1lc1syXSwgKGludCkgTGFiZWwsIExhYmVsKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1R5cGUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW0oNSwgZmllbGRfbmFtZXNbNl0sIChpbnQpIFR5cGUsIFR5cGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzVHlwZU5hbWUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyg2LCBmaWVsZF9uYW1lc1s3XSwgVHlwZU5hbWUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFZhbHVlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoNywgZmllbGRfbmFtZXNbMF0sIERlZmF1bHRWYWx1ZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25zKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDgsIGZpZWxkX25hbWVzWzVdLCBPcHRpb25zKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNOYW1lKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxLCBOYW1lKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc051bWJlcikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgzLCBOdW1iZXIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTGFiZWwpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSg0LCAoaW50KSBMYWJlbCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNUeXBlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoNSwgKGludCkgVHlwZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNUeXBlTmFtZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoNiwgVHlwZU5hbWUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRXh0ZW5kZWUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDIsIEV4dGVuZGVlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRWYWx1ZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoNywgRGVmYXVsdFZhbHVlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbnMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSg4LCBPcHRpb25zKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmllbGREZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmllbGREZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmllbGREZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZpZWxkRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWVsZERlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWVsZERlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWVsZERlc2NyaXB0b3JQcm90byBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWVsZERlc2NyaXB0b3JQcm90byBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWVsZERlc2NyaXB0b3JQcm90byBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWVsZERlc2NyaXB0b3JQcm90byBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBGaWVsZERlc2NyaXB0b3JQcm90byBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihGaWVsZERlc2NyaXB0b3JQcm90byBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxGaWVsZERlc2NyaXB0b3JQcm90bywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoRmllbGREZXNjcmlwdG9yUHJvdG8gY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBGaWVsZERlc2NyaXB0b3JQcm90byByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBGaWVsZERlc2NyaXB0b3JQcm90byBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgRmllbGREZXNjcmlwdG9yUHJvdG8oKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZpZWxkRGVzY3JpcHRvclByb3RvIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8uRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRmllbGREZXNjcmlwdG9yUHJvdG8gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8uRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBGaWVsZERlc2NyaXB0b3JQcm90byBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgRmllbGREZXNjcmlwdG9yUHJvdG8pIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRmllbGREZXNjcmlwdG9yUHJvdG8pIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShGaWVsZERlc2NyaXB0b3JQcm90byBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc05hbWUpIHsNCisgICAgICAgICAgTmFtZSA9IG90aGVyLk5hbWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzTnVtYmVyKSB7DQorICAgICAgICAgIE51bWJlciA9IG90aGVyLk51bWJlcjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNMYWJlbCkgew0KKyAgICAgICAgICBMYWJlbCA9IG90aGVyLkxhYmVsOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1R5cGUpIHsNCisgICAgICAgICAgVHlwZSA9IG90aGVyLlR5cGU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzVHlwZU5hbWUpIHsNCisgICAgICAgICAgVHlwZU5hbWUgPSBvdGhlci5UeXBlTmFtZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNFeHRlbmRlZSkgew0KKyAgICAgICAgICBFeHRlbmRlZSA9IG90aGVyLkV4dGVuZGVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRWYWx1ZSkgew0KKyAgICAgICAgICBEZWZhdWx0VmFsdWUgPSBvdGhlci5EZWZhdWx0VmFsdWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9ucykgew0KKyAgICAgICAgICBNZXJnZU9wdGlvbnMob3RoZXIuT3B0aW9ucyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9maWVsZERlc2NyaXB0b3JQcm90b0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9maWVsZERlc2NyaXB0b3JQcm90b0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc05hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQubmFtZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNFeHRlbmRlZSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5leHRlbmRlZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOdW1iZXIgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5udW1iZXJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMyOiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQubGFiZWxfLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0xhYmVsID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCg0LCAodWxvbmcpKGludCl1bmtub3duKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQwOiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQudHlwZV8sIG91dCB1bmtub3duKSkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQuaGFzVHlwZSA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoNSwgKHVsb25nKShpbnQpdW5rbm93bik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1R5cGVOYW1lID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LnR5cGVOYW1lXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRWYWx1ZSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5kZWZhdWx0VmFsdWVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY2OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZE9wdGlvbnMuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzT3B0aW9ucykgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShPcHRpb25zKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIE9wdGlvbnMgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc05hbWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOYW1lOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk5hbWU7IH0NCisgICAgICAgIHNldCB7IFNldE5hbWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5hbWUoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5uYW1lXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTmFtZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmFtZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5hbWVfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTnVtYmVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTnVtYmVyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgTnVtYmVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTnVtYmVyOyB9DQorICAgICAgICBzZXQgeyBTZXROdW1iZXIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE51bWJlcihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTnVtYmVyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5udW1iZXJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOdW1iZXIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc051bWJlciA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm51bWJlcl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0xhYmVsIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNMYWJlbDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuTGFiZWwgTGFiZWwgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5MYWJlbDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TGFiZWwodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldExhYmVsKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLkxhYmVsIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0xhYmVsID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5sYWJlbF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckxhYmVsKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNMYWJlbCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmxhYmVsXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLkxhYmVsLkxBQkVMX09QVElPTkFMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1R5cGUgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1R5cGU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLlR5cGUgVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlR5cGU7IH0NCisgICAgICAgIHNldCB7IFNldFR5cGUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFR5cGUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNUeXBlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC50eXBlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVHlwZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzVHlwZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnR5cGVfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZS5UWVBFX0RPVUJMRTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNUeXBlTmFtZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1R5cGVOYW1lOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgVHlwZU5hbWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5UeXBlTmFtZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0VHlwZU5hbWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFR5cGVOYW1lKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzVHlwZU5hbWUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnR5cGVOYW1lXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVHlwZU5hbWUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1R5cGVOYW1lID0gZmFsc2U7DQorICAgICAgICByZXN1bHQudHlwZU5hbWVfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRXh0ZW5kZWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNFeHRlbmRlZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEV4dGVuZGVlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRXh0ZW5kZWU7IH0NCisgICAgICAgIHNldCB7IFNldEV4dGVuZGVlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRFeHRlbmRlZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0V4dGVuZGVlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5leHRlbmRlZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckV4dGVuZGVlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNFeHRlbmRlZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmV4dGVuZGVlXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRWYWx1ZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRWYWx1ZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIERlZmF1bHRWYWx1ZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRWYWx1ZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdFZhbHVlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0VmFsdWUoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0VmFsdWUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRWYWx1ZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRWYWx1ZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFZhbHVlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFZhbHVlXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbnMgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbnM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkT3B0aW9ucyBPcHRpb25zIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uczsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9ucyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9ucyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZE9wdGlvbnMgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbnMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbnNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9ucyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZE9wdGlvbnMuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9ucyA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uc18gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbnMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzT3B0aW9ucyAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZE9wdGlvbnMuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnNfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm9wdGlvbnNfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm9wdGlvbnNfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9ucyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25zKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uc18gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBGaWVsZERlc2NyaXB0b3JQcm90bygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBFbnVtRGVzY3JpcHRvclByb3RvIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8RW51bURlc2NyaXB0b3JQcm90bywgRW51bURlc2NyaXB0b3JQcm90by5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgRW51bURlc2NyaXB0b3JQcm90bygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFbnVtRGVzY3JpcHRvclByb3RvIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBFbnVtRGVzY3JpcHRvclByb3RvKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9lbnVtRGVzY3JpcHRvclByb3RvRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJuYW1lIiwgIm9wdGlvbnMiLCAidmFsdWUiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfZW51bURlc2NyaXB0b3JQcm90b0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCwgMjYsIDE4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bURlc2NyaXB0b3JQcm90byBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEVudW1EZXNjcmlwdG9yUHJvdG8gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRW51bURlc2NyaXB0b3JQcm90byBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0VudW1EZXNjcmlwdG9yUHJvdG9fX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8RW51bURlc2NyaXB0b3JQcm90bywgRW51bURlc2NyaXB0b3JQcm90by5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOYW1lRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzTmFtZTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgbmFtZV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzTmFtZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc05hbWU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIE5hbWUgew0KKyAgICAgIGdldCB7IHJldHVybiBuYW1lXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFZhbHVlRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bz4gdmFsdWVfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvPiBWYWx1ZUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiB2YWx1ZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFZhbHVlQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB2YWx1ZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIEdldFZhbHVlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB2YWx1ZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbnNGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25zOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1PcHRpb25zIG9wdGlvbnNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25zIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uczsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtT3B0aW9ucyBPcHRpb25zIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uc18gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bU9wdGlvbnMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gZWxlbWVudCBpbiBWYWx1ZUxpc3QpIHsNCisgICAgICAgICAgaWYgKCFlbGVtZW50LklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChIYXNPcHRpb25zKSB7DQorICAgICAgICAgIGlmICghT3B0aW9ucy5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9lbnVtRGVzY3JpcHRvclByb3RvRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzTmFtZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzBdLCBOYW1lKTsNCisgICAgICB9DQorICAgICAgaWYgKHZhbHVlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSgyLCBmaWVsZF9uYW1lc1syXSwgdmFsdWVfKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbnMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMywgZmllbGRfbmFtZXNbMV0sIE9wdGlvbnMpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc05hbWUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDEsIE5hbWUpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gZWxlbWVudCBpbiBWYWx1ZUxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgyLCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbnMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgzLCBPcHRpb25zKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bURlc2NyaXB0b3JQcm90byBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEVudW1EZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEVudW1EZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEVudW1EZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bURlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtRGVzY3JpcHRvclByb3RvIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEVudW1EZXNjcmlwdG9yUHJvdG8gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bURlc2NyaXB0b3JQcm90byBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIEVudW1EZXNjcmlwdG9yUHJvdG8gTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHZhbHVlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKEVudW1EZXNjcmlwdG9yUHJvdG8gcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8RW51bURlc2NyaXB0b3JQcm90bywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoRW51bURlc2NyaXB0b3JQcm90byBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIEVudW1EZXNjcmlwdG9yUHJvdG8gcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgRW51bURlc2NyaXB0b3JQcm90byBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEVudW1EZXNjcmlwdG9yUHJvdG8gb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBFbnVtRGVzY3JpcHRvclByb3RvKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBFbnVtRGVzY3JpcHRvclByb3RvIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bURlc2NyaXB0b3JQcm90by5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBFbnVtRGVzY3JpcHRvclByb3RvIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1EZXNjcmlwdG9yUHJvdG8uRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBFbnVtRGVzY3JpcHRvclByb3RvIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBFbnVtRGVzY3JpcHRvclByb3RvKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEVudW1EZXNjcmlwdG9yUHJvdG8pIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShFbnVtRGVzY3JpcHRvclByb3RvIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bURlc2NyaXB0b3JQcm90by5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNOYW1lKSB7DQorICAgICAgICAgIE5hbWUgPSBvdGhlci5OYW1lOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnZhbHVlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC52YWx1ZV8uQWRkKG90aGVyLnZhbHVlXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9ucykgew0KKyAgICAgICAgICBNZXJnZU9wdGlvbnMob3RoZXIuT3B0aW9ucyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9lbnVtRGVzY3JpcHRvclByb3RvRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2VudW1EZXNjcmlwdG9yUHJvdG9GaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0Lm5hbWVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnZhbHVlXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjY6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1PcHRpb25zLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1PcHRpb25zLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzT3B0aW9ucykgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShPcHRpb25zKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIE9wdGlvbnMgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc05hbWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOYW1lOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk5hbWU7IH0NCisgICAgICAgIHNldCB7IFNldE5hbWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5hbWUoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5uYW1lXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTmFtZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmFtZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5hbWVfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8+IFZhbHVlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS52YWx1ZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBWYWx1ZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVmFsdWVDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIEdldFZhbHVlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRWYWx1ZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFZhbHVlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC52YWx1ZV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VmFsdWUoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudmFsdWVfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFZhbHVlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudmFsdWVfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVmFsdWUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnZhbHVlXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVmFsdWUoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC52YWx1ZV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJWYWx1ZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudmFsdWVfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9ucyB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bU9wdGlvbnMgT3B0aW9ucyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbnM7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbnModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbnMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bU9wdGlvbnMgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbnMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbnNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9ucyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtT3B0aW9ucy5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25zXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlT3B0aW9ucyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtT3B0aW9ucyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbnMgJiYNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uc18gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bU9wdGlvbnMuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnNfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bU9wdGlvbnMuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uc18pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQub3B0aW9uc18gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbnMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbnMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25zXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIEVudW1EZXNjcmlwdG9yUHJvdG8oKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8RW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8uQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gZGVmYXVsdEluc3RhbmNlID0gbmV3IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZW51bVZhbHVlRGVzY3JpcHRvclByb3RvRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJuYW1lIiwgIm51bWJlciIsICJvcHRpb25zIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2VudW1WYWx1ZURlc2NyaXB0b3JQcm90b0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCwgMTYsIDI2IH07DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZURlc2NyaXB0b3JQcm90b19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8sIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE5hbWVGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOYW1lOw0KKyAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmFtZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG5hbWVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTnVtYmVyRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzTnVtYmVyOw0KKyAgICBwcml2YXRlIGludCBudW1iZXJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOdW1iZXIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNOdW1iZXI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IE51bWJlciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG51bWJlcl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25zRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uczsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtVmFsdWVPcHRpb25zIG9wdGlvbnNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25zIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uczsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtVmFsdWVPcHRpb25zIE9wdGlvbnMgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25zXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtVmFsdWVPcHRpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaWYgKEhhc09wdGlvbnMpIHsNCisgICAgICAgICAgaWYgKCFPcHRpb25zLklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2VudW1WYWx1ZURlc2NyaXB0b3JQcm90b0ZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc05hbWUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxLCBmaWVsZF9uYW1lc1swXSwgTmFtZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNOdW1iZXIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIsIGZpZWxkX25hbWVzWzFdLCBOdW1iZXIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9ucykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZSgzLCBmaWVsZF9uYW1lc1syXSwgT3B0aW9ucyk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzTmFtZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMSwgTmFtZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNOdW1iZXIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMiwgTnVtYmVyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbnMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgzLCBPcHRpb25zKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8sIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc05hbWUpIHsNCisgICAgICAgICAgTmFtZSA9IG90aGVyLk5hbWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzTnVtYmVyKSB7DQorICAgICAgICAgIE51bWJlciA9IG90aGVyLk51bWJlcjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25zKSB7DQorICAgICAgICAgIE1lcmdlT3B0aW9ucyhvdGhlci5PcHRpb25zKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2VudW1WYWx1ZURlc2NyaXB0b3JQcm90b0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9lbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9GaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0Lm5hbWVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTnVtYmVyID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQubnVtYmVyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNjogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlT3B0aW9ucy5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtVmFsdWVPcHRpb25zLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzT3B0aW9ucykgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShPcHRpb25zKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIE9wdGlvbnMgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc05hbWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOYW1lOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk5hbWU7IH0NCisgICAgICAgIHNldCB7IFNldE5hbWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5hbWUoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5uYW1lXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTmFtZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmFtZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5hbWVfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTnVtYmVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTnVtYmVyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgTnVtYmVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTnVtYmVyOyB9DQorICAgICAgICBzZXQgeyBTZXROdW1iZXIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE51bWJlcihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTnVtYmVyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5udW1iZXJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOdW1iZXIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc051bWJlciA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm51bWJlcl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbnMgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbnM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1WYWx1ZU9wdGlvbnMgT3B0aW9ucyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbnM7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbnModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbnMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlT3B0aW9ucyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9ucyA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uc18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25zKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1WYWx1ZU9wdGlvbnMuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9ucyA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uc18gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbnMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlT3B0aW9ucyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbnMgJiYNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uc18gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uc18gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtVmFsdWVPcHRpb25zLkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm9wdGlvbnNfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm9wdGlvbnNfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9ucyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25zKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uc18gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgU2VydmljZURlc2NyaXB0b3JQcm90byA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8sIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8uQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8oKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU2VydmljZURlc2NyaXB0b3JQcm90byBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgU2VydmljZURlc2NyaXB0b3JQcm90bygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfc2VydmljZURlc2NyaXB0b3JQcm90b0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAibWV0aG9kIiwgIm5hbWUiLCAib3B0aW9ucyIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9zZXJ2aWNlRGVzY3JpcHRvclByb3RvRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDE4LCAxMCwgMjYgfTsNCisgICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgU2VydmljZURlc2NyaXB0b3JQcm90byBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfU2VydmljZURlc2NyaXB0b3JQcm90b19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxTZXJ2aWNlRGVzY3JpcHRvclByb3RvLCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VEZXNjcmlwdG9yUHJvdG9fX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE5hbWVGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOYW1lOw0KKyAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmFtZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG5hbWVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTWV0aG9kRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1ldGhvZERlc2NyaXB0b3JQcm90bz4gbWV0aG9kXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5NZXRob2REZXNjcmlwdG9yUHJvdG8+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1ldGhvZERlc2NyaXB0b3JQcm90bz4gTWV0aG9kTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG1ldGhvZF87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IE1ldGhvZENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gbWV0aG9kXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5NZXRob2REZXNjcmlwdG9yUHJvdG8gR2V0TWV0aG9kKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBtZXRob2RfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25zRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uczsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5TZXJ2aWNlT3B0aW9ucyBvcHRpb25zXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9ucyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbnM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU2VydmljZU9wdGlvbnMgT3B0aW9ucyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbnNfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VPcHRpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kRGVzY3JpcHRvclByb3RvIGVsZW1lbnQgaW4gTWV0aG9kTGlzdCkgew0KKyAgICAgICAgICBpZiAoIWVsZW1lbnQuSXNJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKEhhc09wdGlvbnMpIHsNCisgICAgICAgICAgaWYgKCFPcHRpb25zLklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3NlcnZpY2VEZXNjcmlwdG9yUHJvdG9GaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNOYW1lKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMSwgZmllbGRfbmFtZXNbMV0sIE5hbWUpOw0KKyAgICAgIH0NCisgICAgICBpZiAobWV0aG9kXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSgyLCBmaWVsZF9uYW1lc1swXSwgbWV0aG9kXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25zKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDMsIGZpZWxkX25hbWVzWzJdLCBPcHRpb25zKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNOYW1lKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxLCBOYW1lKTsNCisgICAgICB9DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kRGVzY3JpcHRvclByb3RvIGVsZW1lbnQgaW4gTWV0aG9kTGlzdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDIsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9ucykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDMsIE9wdGlvbnMpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZURlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZURlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZURlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZURlc2NyaXB0b3JQcm90byBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgU2VydmljZURlc2NyaXB0b3JQcm90byBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgbWV0aG9kXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8U2VydmljZURlc2NyaXB0b3JQcm90bywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoU2VydmljZURlc2NyaXB0b3JQcm90byBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgU2VydmljZURlc2NyaXB0b3JQcm90byBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU2VydmljZURlc2NyaXB0b3JQcm90by5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8uRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShTZXJ2aWNlRGVzY3JpcHRvclByb3RvIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU2VydmljZURlc2NyaXB0b3JQcm90by5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNOYW1lKSB7DQorICAgICAgICAgIE5hbWUgPSBvdGhlci5OYW1lOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLm1ldGhvZF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQubWV0aG9kXy5BZGQob3RoZXIubWV0aG9kXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9ucykgew0KKyAgICAgICAgICBNZXJnZU9wdGlvbnMob3RoZXIuT3B0aW9ucyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9zZXJ2aWNlRGVzY3JpcHRvclByb3RvRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3NlcnZpY2VEZXNjcmlwdG9yUHJvdG9GaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0Lm5hbWVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0Lm1ldGhvZF8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1ldGhvZERlc2NyaXB0b3JQcm90by5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI2OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5TZXJ2aWNlT3B0aW9ucy5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5TZXJ2aWNlT3B0aW9ucy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbnMpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oT3B0aW9ucyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBPcHRpb25zID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNOYW1lIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTmFtZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OYW1lOyB9DQorICAgICAgICBzZXQgeyBTZXROYW1lKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROYW1lKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmFtZSA9IHRydWU7DQorICAgICAgICByZXN1bHQubmFtZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5hbWUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05hbWUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5uYW1lXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kRGVzY3JpcHRvclByb3RvPiBNZXRob2RMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLm1ldGhvZF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBNZXRob2RDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk1ldGhvZENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5NZXRob2REZXNjcmlwdG9yUHJvdG8gR2V0TWV0aG9kKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRNZXRob2QoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRNZXRob2QoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5NZXRob2REZXNjcmlwdG9yUHJvdG8gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lm1ldGhvZF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TWV0aG9kKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lm1ldGhvZF9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkTWV0aG9kKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1ldGhvZERlc2NyaXB0b3JQcm90byB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubWV0aG9kXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZE1ldGhvZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5NZXRob2REZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubWV0aG9kXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlTWV0aG9kKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kRGVzY3JpcHRvclByb3RvPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubWV0aG9kXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck1ldGhvZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubWV0aG9kXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbnMgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbnM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VPcHRpb25zIE9wdGlvbnMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25zOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25zKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25zKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VPcHRpb25zIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25zXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbnMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU2VydmljZU9wdGlvbnMuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9ucyA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uc18gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbnMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU2VydmljZU9wdGlvbnMgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25zICYmDQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnNfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VPcHRpb25zLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VPcHRpb25zLkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm9wdGlvbnNfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm9wdGlvbnNfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9ucyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25zKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uc18gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE1ldGhvZERlc2NyaXB0b3JQcm90byA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPE1ldGhvZERlc2NyaXB0b3JQcm90bywgTWV0aG9kRGVzY3JpcHRvclByb3RvLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBNZXRob2REZXNjcmlwdG9yUHJvdG8oKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTWV0aG9kRGVzY3JpcHRvclByb3RvIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBNZXRob2REZXNjcmlwdG9yUHJvdG8oKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX21ldGhvZERlc2NyaXB0b3JQcm90b0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiaW5wdXRfdHlwZSIsICJuYW1lIiwgIm9wdGlvbnMiLCAib3V0cHV0X3R5cGUiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfbWV0aG9kRGVzY3JpcHRvclByb3RvRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDE4LCAxMCwgMzQsIDI2IH07DQorICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kRGVzY3JpcHRvclByb3RvIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgTWV0aG9kRGVzY3JpcHRvclByb3RvIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE1ldGhvZERlc2NyaXB0b3JQcm90byBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90b19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxNZXRob2REZXNjcmlwdG9yUHJvdG8sIE1ldGhvZERlc2NyaXB0b3JQcm90by5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9NZXRob2REZXNjcmlwdG9yUHJvdG9fX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE5hbWVGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOYW1lOw0KKyAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmFtZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG5hbWVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgSW5wdXRUeXBlRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzSW5wdXRUeXBlOw0KKyAgICBwcml2YXRlIHN0cmluZyBpbnB1dFR5cGVfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0lucHV0VHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0lucHV0VHlwZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgSW5wdXRUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaW5wdXRUeXBlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE91dHB1dFR5cGVGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPdXRwdXRUeXBlOw0KKyAgICBwcml2YXRlIHN0cmluZyBvdXRwdXRUeXBlXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPdXRwdXRUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3V0cHV0VHlwZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgT3V0cHV0VHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG91dHB1dFR5cGVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uc0ZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbnM7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kT3B0aW9ucyBvcHRpb25zXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9ucyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbnM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kT3B0aW9ucyBPcHRpb25zIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uc18gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmIChIYXNPcHRpb25zKSB7DQorICAgICAgICAgIGlmICghT3B0aW9ucy5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9tZXRob2REZXNjcmlwdG9yUHJvdG9GaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNOYW1lKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMSwgZmllbGRfbmFtZXNbMV0sIE5hbWUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSW5wdXRUeXBlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMiwgZmllbGRfbmFtZXNbMF0sIElucHV0VHlwZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPdXRwdXRUeXBlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMywgZmllbGRfbmFtZXNbM10sIE91dHB1dFR5cGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9ucykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZSg0LCBmaWVsZF9uYW1lc1syXSwgT3B0aW9ucyk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzTmFtZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMSwgTmFtZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNJbnB1dFR5cGUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDIsIElucHV0VHlwZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPdXRwdXRUeXBlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgzLCBPdXRwdXRUeXBlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbnMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSg0LCBPcHRpb25zKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZERlc2NyaXB0b3JQcm90byBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNZXRob2REZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZERlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kRGVzY3JpcHRvclByb3RvIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZERlc2NyaXB0b3JQcm90byBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNZXRob2REZXNjcmlwdG9yUHJvdG8gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kRGVzY3JpcHRvclByb3RvIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZERlc2NyaXB0b3JQcm90byBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNZXRob2REZXNjcmlwdG9yUHJvdG8gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgTWV0aG9kRGVzY3JpcHRvclByb3RvIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKE1ldGhvZERlc2NyaXB0b3JQcm90byBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxNZXRob2REZXNjcmlwdG9yUHJvdG8sIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKE1ldGhvZERlc2NyaXB0b3JQcm90byBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIE1ldGhvZERlc2NyaXB0b3JQcm90byByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBNZXRob2REZXNjcmlwdG9yUHJvdG8gUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG8gb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBNZXRob2REZXNjcmlwdG9yUHJvdG8oKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE1ldGhvZERlc2NyaXB0b3JQcm90byBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1ldGhvZERlc2NyaXB0b3JQcm90by5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBNZXRob2REZXNjcmlwdG9yUHJvdG8gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kRGVzY3JpcHRvclByb3RvLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgTWV0aG9kRGVzY3JpcHRvclByb3RvIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBNZXRob2REZXNjcmlwdG9yUHJvdG8pIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoTWV0aG9kRGVzY3JpcHRvclByb3RvKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oTWV0aG9kRGVzY3JpcHRvclByb3RvIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kRGVzY3JpcHRvclByb3RvLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc05hbWUpIHsNCisgICAgICAgICAgTmFtZSA9IG90aGVyLk5hbWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzSW5wdXRUeXBlKSB7DQorICAgICAgICAgIElucHV0VHlwZSA9IG90aGVyLklucHV0VHlwZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPdXRwdXRUeXBlKSB7DQorICAgICAgICAgIE91dHB1dFR5cGUgPSBvdGhlci5PdXRwdXRUeXBlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbnMpIHsNCisgICAgICAgICAgTWVyZ2VPcHRpb25zKG90aGVyLk9wdGlvbnMpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfbWV0aG9kRGVzY3JpcHRvclByb3RvRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX21ldGhvZERlc2NyaXB0b3JQcm90b0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc05hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQubmFtZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNJbnB1dFR5cGUgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuaW5wdXRUeXBlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc091dHB1dFR5cGUgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQub3V0cHV0VHlwZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzQ6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1ldGhvZE9wdGlvbnMuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kT3B0aW9ucy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbnMpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oT3B0aW9ucyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBPcHRpb25zID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNOYW1lIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTmFtZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OYW1lOyB9DQorICAgICAgICBzZXQgeyBTZXROYW1lKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROYW1lKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmFtZSA9IHRydWU7DQorICAgICAgICByZXN1bHQubmFtZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5hbWUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05hbWUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5uYW1lXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0lucHV0VHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0lucHV0VHlwZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIElucHV0VHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklucHV0VHlwZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0SW5wdXRUeXBlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRJbnB1dFR5cGUoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJbnB1dFR5cGUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmlucHV0VHlwZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhcklucHV0VHlwZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSW5wdXRUeXBlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuaW5wdXRUeXBlXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc091dHB1dFR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPdXRwdXRUeXBlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgT3V0cHV0VHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk91dHB1dFR5cGU7IH0NCisgICAgICAgIHNldCB7IFNldE91dHB1dFR5cGUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE91dHB1dFR5cGUoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPdXRwdXRUeXBlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vdXRwdXRUeXBlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3V0cHV0VHlwZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3V0cHV0VHlwZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm91dHB1dFR5cGVfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9ucyB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kT3B0aW9ucyBPcHRpb25zIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uczsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9ucyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9ucyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5NZXRob2RPcHRpb25zIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25zXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbnMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kT3B0aW9ucy5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25zXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlT3B0aW9ucyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5NZXRob2RPcHRpb25zIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzT3B0aW9ucyAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5NZXRob2RPcHRpb25zLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1ldGhvZE9wdGlvbnMuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uc18pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQub3B0aW9uc18gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25zID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbnMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbnMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25zXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIE1ldGhvZERlc2NyaXB0b3JQcm90bygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBGaWxlT3B0aW9ucyA6IHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxGaWxlT3B0aW9ucywgRmlsZU9wdGlvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEZpbGVPcHRpb25zKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZpbGVPcHRpb25zIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBGaWxlT3B0aW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZmlsZU9wdGlvbnNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImNjX2dlbmVyaWNfc2VydmljZXMiLCAiamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2giLCAiamF2YV9nZW5lcmljX3NlcnZpY2VzIiwgImphdmFfbXVsdGlwbGVfZmlsZXMiLCAiamF2YV9vdXRlcl9jbGFzc25hbWUiLCAiamF2YV9wYWNrYWdlIiwgIm9wdGltaXplX2ZvciIsICJweV9nZW5lcmljX3NlcnZpY2VzIiwgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2ZpbGVPcHRpb25zRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEyOCwgMTYwLCAxMzYsIDgwLCA2NiwgMTAsIDcyLCAxNDQsIDc5OTQgfTsNCisgICAgcHVibGljIHN0YXRpYyBGaWxlT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEZpbGVPcHRpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZpbGVPcHRpb25zIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8RmlsZU9wdGlvbnMsIEZpbGVPcHRpb25zLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMNCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsNCisgICAgICBwdWJsaWMgZW51bSBPcHRpbWl6ZU1vZGUgew0KKyAgICAgICAgU1BFRUQgPSAxLA0KKyAgICAgICAgQ09ERV9TSVpFID0gMiwNCisgICAgICAgIExJVEVfUlVOVElNRSA9IDMsDQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgSmF2YVBhY2thZ2VGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNKYXZhUGFja2FnZTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgamF2YVBhY2thZ2VfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0phdmFQYWNrYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzSmF2YVBhY2thZ2U7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEphdmFQYWNrYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gamF2YVBhY2thZ2VfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgSmF2YU91dGVyQ2xhc3NuYW1lRmllbGROdW1iZXIgPSA4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzSmF2YU91dGVyQ2xhc3NuYW1lOw0KKyAgICBwcml2YXRlIHN0cmluZyBqYXZhT3V0ZXJDbGFzc25hbWVfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0phdmFPdXRlckNsYXNzbmFtZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0phdmFPdXRlckNsYXNzbmFtZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgSmF2YU91dGVyQ2xhc3NuYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gamF2YU91dGVyQ2xhc3NuYW1lXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEphdmFNdWx0aXBsZUZpbGVzRmllbGROdW1iZXIgPSAxMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0phdmFNdWx0aXBsZUZpbGVzOw0KKyAgICBwcml2YXRlIGJvb2wgamF2YU11bHRpcGxlRmlsZXNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNKYXZhTXVsdGlwbGVGaWxlcyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0phdmFNdWx0aXBsZUZpbGVzOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgSmF2YU11bHRpcGxlRmlsZXMgew0KKyAgICAgIGdldCB7IHJldHVybiBqYXZhTXVsdGlwbGVGaWxlc187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoRmllbGROdW1iZXIgPSAyMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0phdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2g7DQorICAgIHByaXZhdGUgYm9vbCBqYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoXzsNCisgICAgcHVibGljIGJvb2wgSGFzSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0phdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2g7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoIHsNCisgICAgICBnZXQgeyByZXR1cm4gamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpbWl6ZUZvckZpZWxkTnVtYmVyID0gOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGltaXplRm9yOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVPcHRpb25zLlR5cGVzLk9wdGltaXplTW9kZSBvcHRpbWl6ZUZvcl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlT3B0aW9ucy5UeXBlcy5PcHRpbWl6ZU1vZGUuU1BFRUQ7DQorICAgIHB1YmxpYyBib29sIEhhc09wdGltaXplRm9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW1pemVGb3I7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZU9wdGlvbnMuVHlwZXMuT3B0aW1pemVNb2RlIE9wdGltaXplRm9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW1pemVGb3JfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQ2NHZW5lcmljU2VydmljZXNGaWVsZE51bWJlciA9IDE2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzQ2NHZW5lcmljU2VydmljZXM7DQorICAgIHByaXZhdGUgYm9vbCBjY0dlbmVyaWNTZXJ2aWNlc187DQorICAgIHB1YmxpYyBib29sIEhhc0NjR2VuZXJpY1NlcnZpY2VzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQ2NHZW5lcmljU2VydmljZXM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBDY0dlbmVyaWNTZXJ2aWNlcyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGNjR2VuZXJpY1NlcnZpY2VzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEphdmFHZW5lcmljU2VydmljZXNGaWVsZE51bWJlciA9IDE3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzSmF2YUdlbmVyaWNTZXJ2aWNlczsNCisgICAgcHJpdmF0ZSBib29sIGphdmFHZW5lcmljU2VydmljZXNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNKYXZhR2VuZXJpY1NlcnZpY2VzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzSmF2YUdlbmVyaWNTZXJ2aWNlczsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEphdmFHZW5lcmljU2VydmljZXMgew0KKyAgICAgIGdldCB7IHJldHVybiBqYXZhR2VuZXJpY1NlcnZpY2VzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFB5R2VuZXJpY1NlcnZpY2VzRmllbGROdW1iZXIgPSAxODsNCisgICAgcHJpdmF0ZSBib29sIGhhc1B5R2VuZXJpY1NlcnZpY2VzOw0KKyAgICBwcml2YXRlIGJvb2wgcHlHZW5lcmljU2VydmljZXNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNQeUdlbmVyaWNTZXJ2aWNlcyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1B5R2VuZXJpY1NlcnZpY2VzOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgUHlHZW5lcmljU2VydmljZXMgew0KKyAgICAgIGdldCB7IHJldHVybiBweUdlbmVyaWNTZXJ2aWNlc187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4gdW5pbnRlcnByZXRlZE9wdGlvbl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4gVW5pbnRlcnByZXRlZE9wdGlvbkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiB1bmludGVycHJldGVkT3B0aW9uXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5pbnRlcnByZXRlZE9wdGlvbl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiBHZXRVbmludGVycHJldGVkT3B0aW9uKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bmludGVycHJldGVkT3B0aW9uX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uIGVsZW1lbnQgaW4gVW5pbnRlcnByZXRlZE9wdGlvbkxpc3QpIHsNCisgICAgICAgICAgaWYgKCFlbGVtZW50LklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghRXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9maWxlT3B0aW9uc0ZpZWxkTmFtZXM7DQorICAgICAgcGI6OkV4dGVuZGFibGVNZXNzYWdlPEZpbGVPcHRpb25zLCBGaWxlT3B0aW9ucy5CdWlsZGVyPi5FeHRlbnNpb25Xcml0ZXIgZXh0ZW5zaW9uV3JpdGVyID0gQ3JlYXRlRXh0ZW5zaW9uV3JpdGVyKHRoaXMpOw0KKyAgICAgIGlmIChoYXNKYXZhUGFja2FnZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzVdLCBKYXZhUGFja2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNKYXZhT3V0ZXJDbGFzc25hbWUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyg4LCBmaWVsZF9uYW1lc1s0XSwgSmF2YU91dGVyQ2xhc3NuYW1lKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGltaXplRm9yKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDksIGZpZWxkX25hbWVzWzZdLCAoaW50KSBPcHRpbWl6ZUZvciwgT3B0aW1pemVGb3IpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSmF2YU11bHRpcGxlRmlsZXMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMTAsIGZpZWxkX25hbWVzWzNdLCBKYXZhTXVsdGlwbGVGaWxlcyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNDY0dlbmVyaWNTZXJ2aWNlcykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCgxNiwgZmllbGRfbmFtZXNbMF0sIENjR2VuZXJpY1NlcnZpY2VzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0phdmFHZW5lcmljU2VydmljZXMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMTcsIGZpZWxkX25hbWVzWzJdLCBKYXZhR2VuZXJpY1NlcnZpY2VzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1B5R2VuZXJpY1NlcnZpY2VzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDE4LCBmaWVsZF9uYW1lc1s3XSwgUHlHZW5lcmljU2VydmljZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCgyMCwgZmllbGRfbmFtZXNbMV0sIEphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2gpOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5pbnRlcnByZXRlZE9wdGlvbl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlQXJyYXkoOTk5LCBmaWVsZF9uYW1lc1s4XSwgdW5pbnRlcnByZXRlZE9wdGlvbl8pOw0KKyAgICAgIH0NCisgICAgICBleHRlbnNpb25Xcml0ZXIuV3JpdGVVbnRpbCg1MzY4NzA5MTIsIG91dHB1dCk7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNKYXZhUGFja2FnZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMSwgSmF2YVBhY2thZ2UpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSmF2YU91dGVyQ2xhc3NuYW1lKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSg4LCBKYXZhT3V0ZXJDbGFzc25hbWUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSmF2YU11bHRpcGxlRmlsZXMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSgxMCwgSmF2YU11bHRpcGxlRmlsZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDIwLCBKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGltaXplRm9yKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoOSwgKGludCkgT3B0aW1pemVGb3IpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQ2NHZW5lcmljU2VydmljZXMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSgxNiwgQ2NHZW5lcmljU2VydmljZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSmF2YUdlbmVyaWNTZXJ2aWNlcykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDE3LCBKYXZhR2VuZXJpY1NlcnZpY2VzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1B5R2VuZXJpY1NlcnZpY2VzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMTgsIFB5R2VuZXJpY1NlcnZpY2VzKTsNCisgICAgICB9DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiBlbGVtZW50IGluIFVuaW50ZXJwcmV0ZWRPcHRpb25MaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoOTk5LCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBFeHRlbnNpb25zU2VyaWFsaXplZFNpemU7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmlsZU9wdGlvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmlsZU9wdGlvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmlsZU9wdGlvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZpbGVPcHRpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlT3B0aW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlT3B0aW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlT3B0aW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlT3B0aW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlT3B0aW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWxlT3B0aW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBGaWxlT3B0aW9ucyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgdW5pbnRlcnByZXRlZE9wdGlvbl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihGaWxlT3B0aW9ucyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6RXh0ZW5kYWJsZUJ1aWxkZXI8RmlsZU9wdGlvbnMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEZpbGVPcHRpb25zIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgRmlsZU9wdGlvbnMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgRmlsZU9wdGlvbnMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBGaWxlT3B0aW9ucyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEZpbGVPcHRpb25zKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBGaWxlT3B0aW9ucyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVPcHRpb25zLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEZpbGVPcHRpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVPcHRpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRmlsZU9wdGlvbnMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEZpbGVPcHRpb25zKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEZpbGVPcHRpb25zKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRmlsZU9wdGlvbnMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNKYXZhUGFja2FnZSkgew0KKyAgICAgICAgICBKYXZhUGFja2FnZSA9IG90aGVyLkphdmFQYWNrYWdlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0phdmFPdXRlckNsYXNzbmFtZSkgew0KKyAgICAgICAgICBKYXZhT3V0ZXJDbGFzc25hbWUgPSBvdGhlci5KYXZhT3V0ZXJDbGFzc25hbWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzSmF2YU11bHRpcGxlRmlsZXMpIHsNCisgICAgICAgICAgSmF2YU11bHRpcGxlRmlsZXMgPSBvdGhlci5KYXZhTXVsdGlwbGVGaWxlczsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoKSB7DQorICAgICAgICAgIEphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2ggPSBvdGhlci5KYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGltaXplRm9yKSB7DQorICAgICAgICAgIE9wdGltaXplRm9yID0gb3RoZXIuT3B0aW1pemVGb3I7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzQ2NHZW5lcmljU2VydmljZXMpIHsNCisgICAgICAgICAgQ2NHZW5lcmljU2VydmljZXMgPSBvdGhlci5DY0dlbmVyaWNTZXJ2aWNlczsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNKYXZhR2VuZXJpY1NlcnZpY2VzKSB7DQorICAgICAgICAgIEphdmFHZW5lcmljU2VydmljZXMgPSBvdGhlci5KYXZhR2VuZXJpY1NlcnZpY2VzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1B5R2VuZXJpY1NlcnZpY2VzKSB7DQorICAgICAgICAgIFB5R2VuZXJpY1NlcnZpY2VzID0gb3RoZXIuUHlHZW5lcmljU2VydmljZXM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKG90aGVyLnVuaW50ZXJwcmV0ZWRPcHRpb25fKTsNCisgICAgICAgIH0NCisgICAgICAgICAgdGhpcy5NZXJnZUV4dGVuc2lvbkZpZWxkcyhvdGhlcik7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9maWxlT3B0aW9uc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9maWxlT3B0aW9uc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0phdmFQYWNrYWdlID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmphdmFQYWNrYWdlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2Njogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0phdmFPdXRlckNsYXNzbmFtZSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5qYXZhT3V0ZXJDbGFzc25hbWVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDcyOiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQub3B0aW1pemVGb3JfLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGltaXplRm9yID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCg5LCAodWxvbmcpKGludCl1bmtub3duKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzSmF2YU11bHRpcGxlRmlsZXMgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmphdmFNdWx0aXBsZUZpbGVzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMjg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNDY0dlbmVyaWNTZXJ2aWNlcyA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuY2NHZW5lcmljU2VydmljZXNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEzNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0phdmFHZW5lcmljU2VydmljZXMgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LmphdmFHZW5lcmljU2VydmljZXNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE0NDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1B5R2VuZXJpY1NlcnZpY2VzID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5weUdlbmVyaWNTZXJ2aWNlc18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTYwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaCA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzk5NDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNKYXZhUGFja2FnZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0phdmFQYWNrYWdlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgSmF2YVBhY2thZ2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5KYXZhUGFja2FnZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0SmF2YVBhY2thZ2UodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEphdmFQYWNrYWdlKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSmF2YVBhY2thZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmphdmFQYWNrYWdlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFySmF2YVBhY2thZ2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0phdmFQYWNrYWdlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuamF2YVBhY2thZ2VfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzSmF2YU91dGVyQ2xhc3NuYW1lIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzSmF2YU91dGVyQ2xhc3NuYW1lOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgSmF2YU91dGVyQ2xhc3NuYW1lIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSmF2YU91dGVyQ2xhc3NuYW1lOyB9DQorICAgICAgICBzZXQgeyBTZXRKYXZhT3V0ZXJDbGFzc25hbWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEphdmFPdXRlckNsYXNzbmFtZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0phdmFPdXRlckNsYXNzbmFtZSA9IHRydWU7DQorICAgICAgICByZXN1bHQuamF2YU91dGVyQ2xhc3NuYW1lXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFySmF2YU91dGVyQ2xhc3NuYW1lKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNKYXZhT3V0ZXJDbGFzc25hbWUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5qYXZhT3V0ZXJDbGFzc25hbWVfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzSmF2YU11bHRpcGxlRmlsZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNKYXZhTXVsdGlwbGVGaWxlczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBKYXZhTXVsdGlwbGVGaWxlcyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkphdmFNdWx0aXBsZUZpbGVzOyB9DQorICAgICAgICBzZXQgeyBTZXRKYXZhTXVsdGlwbGVGaWxlcyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0SmF2YU11bHRpcGxlRmlsZXMoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNKYXZhTXVsdGlwbGVGaWxlcyA9IHRydWU7DQorICAgICAgICByZXN1bHQuamF2YU11bHRpcGxlRmlsZXNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJKYXZhTXVsdGlwbGVGaWxlcygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSmF2YU11bHRpcGxlRmlsZXMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5qYXZhTXVsdGlwbGVGaWxlc18gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0SmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0SmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0phdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2ggPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2hfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaF8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpbWl6ZUZvciB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW1pemVGb3I7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVPcHRpb25zLlR5cGVzLk9wdGltaXplTW9kZSBPcHRpbWl6ZUZvciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGltaXplRm9yOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpbWl6ZUZvcih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW1pemVGb3IoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmlsZU9wdGlvbnMuVHlwZXMuT3B0aW1pemVNb2RlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGltaXplRm9yID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpbWl6ZUZvcl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGltaXplRm9yKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpbWl6ZUZvciA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGltaXplRm9yXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpbGVPcHRpb25zLlR5cGVzLk9wdGltaXplTW9kZS5TUEVFRDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNDY0dlbmVyaWNTZXJ2aWNlcyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0NjR2VuZXJpY1NlcnZpY2VzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIENjR2VuZXJpY1NlcnZpY2VzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQ2NHZW5lcmljU2VydmljZXM7IH0NCisgICAgICAgIHNldCB7IFNldENjR2VuZXJpY1NlcnZpY2VzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRDY0dlbmVyaWNTZXJ2aWNlcyhib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0NjR2VuZXJpY1NlcnZpY2VzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5jY0dlbmVyaWNTZXJ2aWNlc18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckNjR2VuZXJpY1NlcnZpY2VzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDY0dlbmVyaWNTZXJ2aWNlcyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmNjR2VuZXJpY1NlcnZpY2VzXyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0phdmFHZW5lcmljU2VydmljZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNKYXZhR2VuZXJpY1NlcnZpY2VzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEphdmFHZW5lcmljU2VydmljZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5KYXZhR2VuZXJpY1NlcnZpY2VzOyB9DQorICAgICAgICBzZXQgeyBTZXRKYXZhR2VuZXJpY1NlcnZpY2VzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRKYXZhR2VuZXJpY1NlcnZpY2VzKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSmF2YUdlbmVyaWNTZXJ2aWNlcyA9IHRydWU7DQorICAgICAgICByZXN1bHQuamF2YUdlbmVyaWNTZXJ2aWNlc18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckphdmFHZW5lcmljU2VydmljZXMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0phdmFHZW5lcmljU2VydmljZXMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5qYXZhR2VuZXJpY1NlcnZpY2VzXyA9IGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1B5R2VuZXJpY1NlcnZpY2VzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzUHlHZW5lcmljU2VydmljZXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgUHlHZW5lcmljU2VydmljZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QeUdlbmVyaWNTZXJ2aWNlczsgfQ0KKyAgICAgICAgc2V0IHsgU2V0UHlHZW5lcmljU2VydmljZXModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFB5R2VuZXJpY1NlcnZpY2VzKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzUHlHZW5lcmljU2VydmljZXMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnB5R2VuZXJpY1NlcnZpY2VzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUHlHZW5lcmljU2VydmljZXMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1B5R2VuZXJpY1NlcnZpY2VzID0gZmFsc2U7DQorICAgICAgICByZXN1bHQucHlHZW5lcmljU2VydmljZXNfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uPiBVbmludGVycHJldGVkT3B0aW9uTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bmludGVycHJldGVkT3B0aW9uXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25Db3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVuaW50ZXJwcmV0ZWRPcHRpb25Db3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiBHZXRVbmludGVycHJldGVkT3B0aW9uKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbmludGVycHJldGVkT3B0aW9uKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5pbnRlcnByZXRlZE9wdGlvbihpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVuaW50ZXJwcmV0ZWRPcHRpb24oaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVuaW50ZXJwcmV0ZWRPcHRpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbmludGVycHJldGVkT3B0aW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVuaW50ZXJwcmV0ZWRPcHRpb24oc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbmludGVycHJldGVkT3B0aW9uKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBGaWxlT3B0aW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBNZXNzYWdlT3B0aW9ucyA6IHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxNZXNzYWdlT3B0aW9ucywgTWVzc2FnZU9wdGlvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIE1lc3NhZ2VPcHRpb25zKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1lc3NhZ2VPcHRpb25zIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBNZXNzYWdlT3B0aW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfbWVzc2FnZU9wdGlvbnNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IiwgIm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IiLCAidW5pbnRlcnByZXRlZF9vcHRpb24iIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfbWVzc2FnZU9wdGlvbnNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCwgMTYsIDc5OTQgfTsNCisgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIE1lc3NhZ2VPcHRpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE1lc3NhZ2VPcHRpb25zIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfTWVzc2FnZU9wdGlvbnNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8TWVzc2FnZU9wdGlvbnMsIE1lc3NhZ2VPcHRpb25zLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX01lc3NhZ2VPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBNZXNzYWdlU2V0V2lyZUZvcm1hdEZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc01lc3NhZ2VTZXRXaXJlRm9ybWF0Ow0KKyAgICBwcml2YXRlIGJvb2wgbWVzc2FnZVNldFdpcmVGb3JtYXRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNNZXNzYWdlU2V0V2lyZUZvcm1hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc01lc3NhZ2VTZXRXaXJlRm9ybWF0OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgTWVzc2FnZVNldFdpcmVGb3JtYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBtZXNzYWdlU2V0V2lyZUZvcm1hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOb1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvcjsNCisgICAgcHJpdmF0ZSBib29sIG5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3JfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOb1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvcjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIE5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3Igew0KKyAgICAgIGdldCB7IHJldHVybiBub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uPiB1bmludGVycHJldGVkT3B0aW9uXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uPiBVbmludGVycHJldGVkT3B0aW9uTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVuaW50ZXJwcmV0ZWRPcHRpb25fOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbmludGVycHJldGVkT3B0aW9uQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bmludGVycHJldGVkT3B0aW9uXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uIEdldFVuaW50ZXJwcmV0ZWRPcHRpb24oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRPcHRpb25fW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24gZWxlbWVudCBpbiBVbmludGVycHJldGVkT3B0aW9uTGlzdCkgew0KKyAgICAgICAgICBpZiAoIWVsZW1lbnQuSXNJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFFeHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX21lc3NhZ2VPcHRpb25zRmllbGROYW1lczsNCisgICAgICBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8TWVzc2FnZU9wdGlvbnMsIE1lc3NhZ2VPcHRpb25zLkJ1aWxkZXI+LkV4dGVuc2lvbldyaXRlciBleHRlbnNpb25Xcml0ZXIgPSBDcmVhdGVFeHRlbnNpb25Xcml0ZXIodGhpcyk7DQorICAgICAgaWYgKGhhc01lc3NhZ2VTZXRXaXJlRm9ybWF0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDEsIGZpZWxkX25hbWVzWzBdLCBNZXNzYWdlU2V0V2lyZUZvcm1hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNOb1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDIsIGZpZWxkX25hbWVzWzFdLCBOb1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yKTsNCisgICAgICB9DQorICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRPcHRpb25fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDk5OSwgZmllbGRfbmFtZXNbMl0sIHVuaW50ZXJwcmV0ZWRPcHRpb25fKTsNCisgICAgICB9DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoNTM2ODcwOTEyLCBvdXRwdXQpOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzTWVzc2FnZVNldFdpcmVGb3JtYXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSgxLCBNZXNzYWdlU2V0V2lyZUZvcm1hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNOb1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMiwgTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3Nvcik7DQorICAgICAgfQ0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24gZWxlbWVudCBpbiBVbmludGVycHJldGVkT3B0aW9uTGlzdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDk5OSwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VPcHRpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VPcHRpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VPcHRpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlT3B0aW9ucyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZU9wdGlvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZU9wdGlvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZU9wdGlvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZU9wdGlvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZU9wdGlvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZU9wdGlvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgTWVzc2FnZU9wdGlvbnMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoTWVzc2FnZU9wdGlvbnMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkV4dGVuZGFibGVCdWlsZGVyPE1lc3NhZ2VPcHRpb25zLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihNZXNzYWdlT3B0aW9ucyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIE1lc3NhZ2VPcHRpb25zIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIE1lc3NhZ2VPcHRpb25zIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgTWVzc2FnZU9wdGlvbnMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBNZXNzYWdlT3B0aW9ucygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgTWVzc2FnZU9wdGlvbnMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5NZXNzYWdlT3B0aW9ucy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBNZXNzYWdlT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5NZXNzYWdlT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIE1lc3NhZ2VPcHRpb25zIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBNZXNzYWdlT3B0aW9ucykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChNZXNzYWdlT3B0aW9ucykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKE1lc3NhZ2VPcHRpb25zIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWVzc2FnZU9wdGlvbnMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzTWVzc2FnZVNldFdpcmVGb3JtYXQpIHsNCisgICAgICAgICAgTWVzc2FnZVNldFdpcmVGb3JtYXQgPSBvdGhlci5NZXNzYWdlU2V0V2lyZUZvcm1hdDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNOb1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yKSB7DQorICAgICAgICAgIE5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3IgPSBvdGhlci5Ob1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVuaW50ZXJwcmV0ZWRPcHRpb25fLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fLkFkZChvdGhlci51bmludGVycHJldGVkT3B0aW9uXyk7DQorICAgICAgICB9DQorICAgICAgICAgIHRoaXMuTWVyZ2VFeHRlbnNpb25GaWVsZHMob3RoZXIpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfbWVzc2FnZU9wdGlvbnNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfbWVzc2FnZU9wdGlvbnNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc01lc3NhZ2VTZXRXaXJlRm9ybWF0ID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5tZXNzYWdlU2V0V2lyZUZvcm1hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOb1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5ub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3OTk0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc01lc3NhZ2VTZXRXaXJlRm9ybWF0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTWVzc2FnZVNldFdpcmVGb3JtYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgTWVzc2FnZVNldFdpcmVGb3JtYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5NZXNzYWdlU2V0V2lyZUZvcm1hdDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TWVzc2FnZVNldFdpcmVGb3JtYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE1lc3NhZ2VTZXRXaXJlRm9ybWF0KGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZVNldFdpcmVGb3JtYXQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm1lc3NhZ2VTZXRXaXJlRm9ybWF0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTWVzc2FnZVNldFdpcmVGb3JtYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc01lc3NhZ2VTZXRXaXJlRm9ybWF0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubWVzc2FnZVNldFdpcmVGb3JtYXRfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc05vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3I7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3I7IH0NCisgICAgICAgIHNldCB7IFNldE5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3IodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3IoYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOb1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5ub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvcigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvciA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3JfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uPiBVbmludGVycHJldGVkT3B0aW9uTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bmludGVycHJldGVkT3B0aW9uXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25Db3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVuaW50ZXJwcmV0ZWRPcHRpb25Db3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiBHZXRVbmludGVycHJldGVkT3B0aW9uKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbmludGVycHJldGVkT3B0aW9uKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5pbnRlcnByZXRlZE9wdGlvbihpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVuaW50ZXJwcmV0ZWRPcHRpb24oaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVuaW50ZXJwcmV0ZWRPcHRpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbmludGVycHJldGVkT3B0aW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVuaW50ZXJwcmV0ZWRPcHRpb24oc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbmludGVycHJldGVkT3B0aW9uKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBNZXNzYWdlT3B0aW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBGaWVsZE9wdGlvbnMgOiBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8RmllbGRPcHRpb25zLCBGaWVsZE9wdGlvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEZpZWxkT3B0aW9ucygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGaWVsZE9wdGlvbnMgZGVmYXVsdEluc3RhbmNlID0gbmV3IEZpZWxkT3B0aW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZmllbGRPcHRpb25zRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJjdHlwZSIsICJkZXByZWNhdGVkIiwgImV4cGVyaW1lbnRhbF9tYXBfa2V5IiwgInBhY2tlZCIsICJ1bmludGVycHJldGVkX29wdGlvbiIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9maWVsZE9wdGlvbnNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCwgMjQsIDc0LCAxNiwgNzk5NCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEZpZWxkT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEZpZWxkT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBGaWVsZE9wdGlvbnMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8RmllbGRPcHRpb25zLCBGaWVsZE9wdGlvbnMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMNCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsNCisgICAgICBwdWJsaWMgZW51bSBDVHlwZSB7DQorICAgICAgICBTVFJJTkcgPSAwLA0KKyAgICAgICAgQ09SRCA9IDEsDQorICAgICAgICBTVFJJTkdfUElFQ0UgPSAyLA0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEN0eXBlRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzQ3R5cGU7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLlR5cGVzLkNUeXBlIGN0eXBlXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkT3B0aW9ucy5UeXBlcy5DVHlwZS5TVFJJTkc7DQorICAgIHB1YmxpYyBib29sIEhhc0N0eXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQ3R5cGU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLlR5cGVzLkNUeXBlIEN0eXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gY3R5cGVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzUGFja2VkOw0KKyAgICBwcml2YXRlIGJvb2wgcGFja2VkXzsNCisgICAgcHVibGljIGJvb2wgSGFzUGFja2VkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzUGFja2VkOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgUGFja2VkIHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlcHJlY2F0ZWRGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZXByZWNhdGVkOw0KKyAgICBwcml2YXRlIGJvb2wgZGVwcmVjYXRlZF87DQorICAgIHB1YmxpYyBib29sIEhhc0RlcHJlY2F0ZWQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZXByZWNhdGVkOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgRGVwcmVjYXRlZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlcHJlY2F0ZWRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRXhwZXJpbWVudGFsTWFwS2V5RmllbGROdW1iZXIgPSA5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRXhwZXJpbWVudGFsTWFwS2V5Ow0KKyAgICBwcml2YXRlIHN0cmluZyBleHBlcmltZW50YWxNYXBLZXlfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0V4cGVyaW1lbnRhbE1hcEtleSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0V4cGVyaW1lbnRhbE1hcEtleTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRXhwZXJpbWVudGFsTWFwS2V5IHsNCisgICAgICBnZXQgeyByZXR1cm4gZXhwZXJpbWVudGFsTWFwS2V5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uPiB1bmludGVycHJldGVkT3B0aW9uXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uPiBVbmludGVycHJldGVkT3B0aW9uTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVuaW50ZXJwcmV0ZWRPcHRpb25fOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbmludGVycHJldGVkT3B0aW9uQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bmludGVycHJldGVkT3B0aW9uXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uIEdldFVuaW50ZXJwcmV0ZWRPcHRpb24oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRPcHRpb25fW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24gZWxlbWVudCBpbiBVbmludGVycHJldGVkT3B0aW9uTGlzdCkgew0KKyAgICAgICAgICBpZiAoIWVsZW1lbnQuSXNJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFFeHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2ZpZWxkT3B0aW9uc0ZpZWxkTmFtZXM7DQorICAgICAgcGI6OkV4dGVuZGFibGVNZXNzYWdlPEZpZWxkT3B0aW9ucywgRmllbGRPcHRpb25zLkJ1aWxkZXI+LkV4dGVuc2lvbldyaXRlciBleHRlbnNpb25Xcml0ZXIgPSBDcmVhdGVFeHRlbnNpb25Xcml0ZXIodGhpcyk7DQorICAgICAgaWYgKGhhc0N0eXBlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDEsIGZpZWxkX25hbWVzWzBdLCAoaW50KSBDdHlwZSwgQ3R5cGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzUGFja2VkKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCb29sKDIsIGZpZWxkX25hbWVzWzNdLCBQYWNrZWQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVwcmVjYXRlZCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCgzLCBmaWVsZF9uYW1lc1sxXSwgRGVwcmVjYXRlZCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNFeHBlcmltZW50YWxNYXBLZXkpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyg5LCBmaWVsZF9uYW1lc1syXSwgRXhwZXJpbWVudGFsTWFwS2V5KTsNCisgICAgICB9DQorICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRPcHRpb25fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDk5OSwgZmllbGRfbmFtZXNbNF0sIHVuaW50ZXJwcmV0ZWRPcHRpb25fKTsNCisgICAgICB9DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoNTM2ODcwOTEyLCBvdXRwdXQpOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzQ3R5cGUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgxLCAoaW50KSBDdHlwZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNQYWNrZWQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSgyLCBQYWNrZWQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVwcmVjYXRlZCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDMsIERlcHJlY2F0ZWQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRXhwZXJpbWVudGFsTWFwS2V5KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSg5LCBFeHBlcmltZW50YWxNYXBLZXkpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uIGVsZW1lbnQgaW4gVW5pbnRlcnByZXRlZE9wdGlvbkxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSg5OTksIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IEV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZTsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWVsZE9wdGlvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmllbGRPcHRpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZpZWxkT3B0aW9ucyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmllbGRPcHRpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWVsZE9wdGlvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmllbGRPcHRpb25zIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZpZWxkT3B0aW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGaWVsZE9wdGlvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRmllbGRPcHRpb25zIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZpZWxkT3B0aW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBGaWVsZE9wdGlvbnMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoRmllbGRPcHRpb25zIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpFeHRlbmRhYmxlQnVpbGRlcjxGaWVsZE9wdGlvbnMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEZpZWxkT3B0aW9ucyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIEZpZWxkT3B0aW9ucyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBGaWVsZE9wdGlvbnMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBGaWVsZE9wdGlvbnMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBGaWVsZE9wdGlvbnMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZpZWxkT3B0aW9ucyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkT3B0aW9ucy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBGaWVsZE9wdGlvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRmllbGRPcHRpb25zIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBGaWVsZE9wdGlvbnMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRmllbGRPcHRpb25zKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRmllbGRPcHRpb25zIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0N0eXBlKSB7DQorICAgICAgICAgIEN0eXBlID0gb3RoZXIuQ3R5cGU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzUGFja2VkKSB7DQorICAgICAgICAgIFBhY2tlZCA9IG90aGVyLlBhY2tlZDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZXByZWNhdGVkKSB7DQorICAgICAgICAgIERlcHJlY2F0ZWQgPSBvdGhlci5EZXByZWNhdGVkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0V4cGVyaW1lbnRhbE1hcEtleSkgew0KKyAgICAgICAgICBFeHBlcmltZW50YWxNYXBLZXkgPSBvdGhlci5FeHBlcmltZW50YWxNYXBLZXk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKG90aGVyLnVuaW50ZXJwcmV0ZWRPcHRpb25fKTsNCisgICAgICAgIH0NCisgICAgICAgICAgdGhpcy5NZXJnZUV4dGVuc2lvbkZpZWxkcyhvdGhlcik7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9maWVsZE9wdGlvbnNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfZmllbGRPcHRpb25zRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5jdHlwZV8sIG91dCB1bmtub3duKSkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQuaGFzQ3R5cGUgPSB0cnVlOw0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmKHVua25vd24gaXMgaW50KSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5NZXJnZVZhcmludEZpZWxkKDEsICh1bG9uZykoaW50KXVua25vd24pOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNQYWNrZWQgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0LnBhY2tlZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZXByZWNhdGVkID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5kZXByZWNhdGVkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0V4cGVyaW1lbnRhbE1hcEtleSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5leHBlcmltZW50YWxNYXBLZXlfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc5OTQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24uRGVmYXVsdEluc3RhbmNlLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQ3R5cGUgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0N0eXBlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZE9wdGlvbnMuVHlwZXMuQ1R5cGUgQ3R5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5DdHlwZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Q3R5cGUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEN0eXBlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkT3B0aW9ucy5UeXBlcy5DVHlwZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDdHlwZSA9IHRydWU7DQorICAgICAgICByZXN1bHQuY3R5cGVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJDdHlwZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQ3R5cGUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5jdHlwZV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWVsZE9wdGlvbnMuVHlwZXMuQ1R5cGUuU1RSSU5HOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1BhY2tlZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1BhY2tlZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBQYWNrZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWQ7IH0NCisgICAgICAgIHNldCB7IFNldFBhY2tlZCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzUGFja2VkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1BhY2tlZCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZF8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZXByZWNhdGVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVwcmVjYXRlZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBEZXByZWNhdGVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVwcmVjYXRlZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVwcmVjYXRlZCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVwcmVjYXRlZChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlcHJlY2F0ZWQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlcHJlY2F0ZWRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZXByZWNhdGVkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZXByZWNhdGVkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVwcmVjYXRlZF8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNFeHBlcmltZW50YWxNYXBLZXkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNFeHBlcmltZW50YWxNYXBLZXk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBFeHBlcmltZW50YWxNYXBLZXkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5FeHBlcmltZW50YWxNYXBLZXk7IH0NCisgICAgICAgIHNldCB7IFNldEV4cGVyaW1lbnRhbE1hcEtleSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RXhwZXJpbWVudGFsTWFwS2V5KHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRXhwZXJpbWVudGFsTWFwS2V5ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5leHBlcmltZW50YWxNYXBLZXlfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJFeHBlcmltZW50YWxNYXBLZXkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0V4cGVyaW1lbnRhbE1hcEtleSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmV4cGVyaW1lbnRhbE1hcEtleV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24+IFVuaW50ZXJwcmV0ZWRPcHRpb25MaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVuaW50ZXJwcmV0ZWRPcHRpb25fOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5pbnRlcnByZXRlZE9wdGlvbkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uIEdldFVuaW50ZXJwcmV0ZWRPcHRpb24oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVuaW50ZXJwcmV0ZWRPcHRpb24oaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbmludGVycHJldGVkT3B0aW9uKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5pbnRlcnByZXRlZE9wdGlvbihpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5pbnRlcnByZXRlZE9wdGlvbihnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVuaW50ZXJwcmV0ZWRPcHRpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5pbnRlcnByZXRlZE9wdGlvbihzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVuaW50ZXJwcmV0ZWRPcHRpb24oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIEZpZWxkT3B0aW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBFbnVtT3B0aW9ucyA6IHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxFbnVtT3B0aW9ucywgRW51bU9wdGlvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEVudW1PcHRpb25zKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEVudW1PcHRpb25zIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBFbnVtT3B0aW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZW51bU9wdGlvbnNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2VudW1PcHRpb25zRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDc5OTQgfTsNCisgICAgcHVibGljIHN0YXRpYyBFbnVtT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEVudW1PcHRpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEVudW1PcHRpb25zIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfRW51bU9wdGlvbnNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8RW51bU9wdGlvbnMsIEVudW1PcHRpb25zLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0VudW1PcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4gdW5pbnRlcnByZXRlZE9wdGlvbl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4gVW5pbnRlcnByZXRlZE9wdGlvbkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiB1bmludGVycHJldGVkT3B0aW9uXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5pbnRlcnByZXRlZE9wdGlvbl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiBHZXRVbmludGVycHJldGVkT3B0aW9uKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bmludGVycHJldGVkT3B0aW9uX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uIGVsZW1lbnQgaW4gVW5pbnRlcnByZXRlZE9wdGlvbkxpc3QpIHsNCisgICAgICAgICAgaWYgKCFlbGVtZW50LklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghRXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9lbnVtT3B0aW9uc0ZpZWxkTmFtZXM7DQorICAgICAgcGI6OkV4dGVuZGFibGVNZXNzYWdlPEVudW1PcHRpb25zLCBFbnVtT3B0aW9ucy5CdWlsZGVyPi5FeHRlbnNpb25Xcml0ZXIgZXh0ZW5zaW9uV3JpdGVyID0gQ3JlYXRlRXh0ZW5zaW9uV3JpdGVyKHRoaXMpOw0KKyAgICAgIGlmICh1bmludGVycHJldGVkT3B0aW9uXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSg5OTksIGZpZWxkX25hbWVzWzBdLCB1bmludGVycHJldGVkT3B0aW9uXyk7DQorICAgICAgfQ0KKyAgICAgIGV4dGVuc2lvbldyaXRlci5Xcml0ZVVudGlsKDUzNjg3MDkxMiwgb3V0cHV0KTsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiBlbGVtZW50IGluIFVuaW50ZXJwcmV0ZWRPcHRpb25MaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoOTk5LCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBFeHRlbnNpb25zU2VyaWFsaXplZFNpemU7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bU9wdGlvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bU9wdGlvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bU9wdGlvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEVudW1PcHRpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtT3B0aW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtT3B0aW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtT3B0aW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtT3B0aW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtT3B0aW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtT3B0aW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBFbnVtT3B0aW9ucyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgdW5pbnRlcnByZXRlZE9wdGlvbl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihFbnVtT3B0aW9ucyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6RXh0ZW5kYWJsZUJ1aWxkZXI8RW51bU9wdGlvbnMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEVudW1PcHRpb25zIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgRW51bU9wdGlvbnMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgRW51bU9wdGlvbnMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBFbnVtT3B0aW9ucyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEVudW1PcHRpb25zKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBFbnVtT3B0aW9ucyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1PcHRpb25zLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEVudW1PcHRpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1PcHRpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRW51bU9wdGlvbnMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEVudW1PcHRpb25zKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEVudW1PcHRpb25zKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRW51bU9wdGlvbnMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5FbnVtT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci51bmludGVycHJldGVkT3B0aW9uXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uXy5BZGQob3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgICB0aGlzLk1lcmdlRXh0ZW5zaW9uRmllbGRzKG90aGVyKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2VudW1PcHRpb25zRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2VudW1PcHRpb25zRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc5OTQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24uRGVmYXVsdEluc3RhbmNlLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uPiBVbmludGVycHJldGVkT3B0aW9uTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bmludGVycHJldGVkT3B0aW9uXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25Db3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVuaW50ZXJwcmV0ZWRPcHRpb25Db3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiBHZXRVbmludGVycHJldGVkT3B0aW9uKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbmludGVycHJldGVkT3B0aW9uKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5pbnRlcnByZXRlZE9wdGlvbihpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVuaW50ZXJwcmV0ZWRPcHRpb24oaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVuaW50ZXJwcmV0ZWRPcHRpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbmludGVycHJldGVkT3B0aW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVuaW50ZXJwcmV0ZWRPcHRpb24oc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbmludGVycHJldGVkT3B0aW9uKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBFbnVtT3B0aW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBFbnVtVmFsdWVPcHRpb25zIDogcGI6OkV4dGVuZGFibGVNZXNzYWdlPEVudW1WYWx1ZU9wdGlvbnMsIEVudW1WYWx1ZU9wdGlvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEVudW1WYWx1ZU9wdGlvbnMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRW51bVZhbHVlT3B0aW9ucyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgRW51bVZhbHVlT3B0aW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZW51bVZhbHVlT3B0aW9uc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAidW5pbnRlcnByZXRlZF9vcHRpb24iIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfZW51bVZhbHVlT3B0aW9uc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyA3OTk0IH07DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bVZhbHVlT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEVudW1WYWx1ZU9wdGlvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRW51bVZhbHVlT3B0aW9ucyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZU9wdGlvbnNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8RW51bVZhbHVlT3B0aW9ucywgRW51bVZhbHVlT3B0aW9ucy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4gdW5pbnRlcnByZXRlZE9wdGlvbl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4gVW5pbnRlcnByZXRlZE9wdGlvbkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiB1bmludGVycHJldGVkT3B0aW9uXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5pbnRlcnByZXRlZE9wdGlvbl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiBHZXRVbmludGVycHJldGVkT3B0aW9uKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bmludGVycHJldGVkT3B0aW9uX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uIGVsZW1lbnQgaW4gVW5pbnRlcnByZXRlZE9wdGlvbkxpc3QpIHsNCisgICAgICAgICAgaWYgKCFlbGVtZW50LklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghRXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9lbnVtVmFsdWVPcHRpb25zRmllbGROYW1lczsNCisgICAgICBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8RW51bVZhbHVlT3B0aW9ucywgRW51bVZhbHVlT3B0aW9ucy5CdWlsZGVyPi5FeHRlbnNpb25Xcml0ZXIgZXh0ZW5zaW9uV3JpdGVyID0gQ3JlYXRlRXh0ZW5zaW9uV3JpdGVyKHRoaXMpOw0KKyAgICAgIGlmICh1bmludGVycHJldGVkT3B0aW9uXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSg5OTksIGZpZWxkX25hbWVzWzBdLCB1bmludGVycHJldGVkT3B0aW9uXyk7DQorICAgICAgfQ0KKyAgICAgIGV4dGVuc2lvbldyaXRlci5Xcml0ZVVudGlsKDUzNjg3MDkxMiwgb3V0cHV0KTsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiBlbGVtZW50IGluIFVuaW50ZXJwcmV0ZWRPcHRpb25MaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoOTk5LCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBFeHRlbnNpb25zU2VyaWFsaXplZFNpemU7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bVZhbHVlT3B0aW9ucyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtVmFsdWVPcHRpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEVudW1WYWx1ZU9wdGlvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEVudW1WYWx1ZU9wdGlvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEVudW1WYWx1ZU9wdGlvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bVZhbHVlT3B0aW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtVmFsdWVPcHRpb25zIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEVudW1WYWx1ZU9wdGlvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRW51bVZhbHVlT3B0aW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBFbnVtVmFsdWVPcHRpb25zIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIEVudW1WYWx1ZU9wdGlvbnMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoRW51bVZhbHVlT3B0aW9ucyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6RXh0ZW5kYWJsZUJ1aWxkZXI8RW51bVZhbHVlT3B0aW9ucywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoRW51bVZhbHVlT3B0aW9ucyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIEVudW1WYWx1ZU9wdGlvbnMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgRW51bVZhbHVlT3B0aW9ucyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEVudW1WYWx1ZU9wdGlvbnMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBFbnVtVmFsdWVPcHRpb25zKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBFbnVtVmFsdWVPcHRpb25zIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlT3B0aW9ucy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBFbnVtVmFsdWVPcHRpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkVudW1WYWx1ZU9wdGlvbnMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBFbnVtVmFsdWVPcHRpb25zIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBFbnVtVmFsdWVPcHRpb25zKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEVudW1WYWx1ZU9wdGlvbnMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShFbnVtVmFsdWVPcHRpb25zIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci51bmludGVycHJldGVkT3B0aW9uXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uXy5BZGQob3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgICB0aGlzLk1lcmdlRXh0ZW5zaW9uRmllbGRzKG90aGVyKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2VudW1WYWx1ZU9wdGlvbnNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfZW51bVZhbHVlT3B0aW9uc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3OTk0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4gVW5pbnRlcnByZXRlZE9wdGlvbkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5pbnRlcnByZXRlZE9wdGlvbl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbmludGVycHJldGVkT3B0aW9uQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbmludGVycHJldGVkT3B0aW9uQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24gR2V0VW5pbnRlcnByZXRlZE9wdGlvbihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5pbnRlcnByZXRlZE9wdGlvbihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVuaW50ZXJwcmV0ZWRPcHRpb24oaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbmludGVycHJldGVkT3B0aW9uKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbmludGVycHJldGVkT3B0aW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5pbnRlcnByZXRlZE9wdGlvbihnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbmludGVycHJldGVkT3B0aW9uKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5pbnRlcnByZXRlZE9wdGlvbigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgRW51bVZhbHVlT3B0aW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBTZXJ2aWNlT3B0aW9ucyA6IHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxTZXJ2aWNlT3B0aW9ucywgU2VydmljZU9wdGlvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFNlcnZpY2VPcHRpb25zKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNlcnZpY2VPcHRpb25zIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTZXJ2aWNlT3B0aW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfc2VydmljZU9wdGlvbnNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3NlcnZpY2VPcHRpb25zRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDc5OTQgfTsNCisgICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFNlcnZpY2VPcHRpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNlcnZpY2VPcHRpb25zIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfU2VydmljZU9wdGlvbnNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8U2VydmljZU9wdGlvbnMsIFNlcnZpY2VPcHRpb25zLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4gdW5pbnRlcnByZXRlZE9wdGlvbl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4gVW5pbnRlcnByZXRlZE9wdGlvbkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiB1bmludGVycHJldGVkT3B0aW9uXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5pbnRlcnByZXRlZE9wdGlvbl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiBHZXRVbmludGVycHJldGVkT3B0aW9uKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bmludGVycHJldGVkT3B0aW9uX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uIGVsZW1lbnQgaW4gVW5pbnRlcnByZXRlZE9wdGlvbkxpc3QpIHsNCisgICAgICAgICAgaWYgKCFlbGVtZW50LklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghRXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9zZXJ2aWNlT3B0aW9uc0ZpZWxkTmFtZXM7DQorICAgICAgcGI6OkV4dGVuZGFibGVNZXNzYWdlPFNlcnZpY2VPcHRpb25zLCBTZXJ2aWNlT3B0aW9ucy5CdWlsZGVyPi5FeHRlbnNpb25Xcml0ZXIgZXh0ZW5zaW9uV3JpdGVyID0gQ3JlYXRlRXh0ZW5zaW9uV3JpdGVyKHRoaXMpOw0KKyAgICAgIGlmICh1bmludGVycHJldGVkT3B0aW9uXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSg5OTksIGZpZWxkX25hbWVzWzBdLCB1bmludGVycHJldGVkT3B0aW9uXyk7DQorICAgICAgfQ0KKyAgICAgIGV4dGVuc2lvbldyaXRlci5Xcml0ZVVudGlsKDUzNjg3MDkxMiwgb3V0cHV0KTsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiBlbGVtZW50IGluIFVuaW50ZXJwcmV0ZWRPcHRpb25MaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoOTk5LCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBFeHRlbnNpb25zU2VyaWFsaXplZFNpemU7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZU9wdGlvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZU9wdGlvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZU9wdGlvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VPcHRpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlT3B0aW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlT3B0aW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlT3B0aW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlT3B0aW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlT3B0aW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlT3B0aW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBTZXJ2aWNlT3B0aW9ucyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgdW5pbnRlcnByZXRlZE9wdGlvbl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihTZXJ2aWNlT3B0aW9ucyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6RXh0ZW5kYWJsZUJ1aWxkZXI8U2VydmljZU9wdGlvbnMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFNlcnZpY2VPcHRpb25zIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgU2VydmljZU9wdGlvbnMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgU2VydmljZU9wdGlvbnMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBTZXJ2aWNlT3B0aW9ucyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFNlcnZpY2VPcHRpb25zKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBTZXJ2aWNlT3B0aW9ucyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VPcHRpb25zLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNlcnZpY2VPcHRpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNlcnZpY2VPcHRpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgU2VydmljZU9wdGlvbnMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFNlcnZpY2VPcHRpb25zKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFNlcnZpY2VPcHRpb25zKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oU2VydmljZU9wdGlvbnMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5TZXJ2aWNlT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci51bmludGVycHJldGVkT3B0aW9uXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uXy5BZGQob3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgICB0aGlzLk1lcmdlRXh0ZW5zaW9uRmllbGRzKG90aGVyKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3NlcnZpY2VPcHRpb25zRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3NlcnZpY2VPcHRpb25zRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc5OTQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24uRGVmYXVsdEluc3RhbmNlLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uPiBVbmludGVycHJldGVkT3B0aW9uTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bmludGVycHJldGVkT3B0aW9uXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25Db3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVuaW50ZXJwcmV0ZWRPcHRpb25Db3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiBHZXRVbmludGVycHJldGVkT3B0aW9uKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbmludGVycHJldGVkT3B0aW9uKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5pbnRlcnByZXRlZE9wdGlvbihpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVuaW50ZXJwcmV0ZWRPcHRpb24oaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVuaW50ZXJwcmV0ZWRPcHRpb24oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbmludGVycHJldGVkT3B0aW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVuaW50ZXJwcmV0ZWRPcHRpb24oc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbmludGVycHJldGVkT3B0aW9uKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBTZXJ2aWNlT3B0aW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBNZXRob2RPcHRpb25zIDogcGI6OkV4dGVuZGFibGVNZXNzYWdlPE1ldGhvZE9wdGlvbnMsIE1ldGhvZE9wdGlvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIE1ldGhvZE9wdGlvbnMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTWV0aG9kT3B0aW9ucyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgTWV0aG9kT3B0aW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfbWV0aG9kT3B0aW9uc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAidW5pbnRlcnByZXRlZF9vcHRpb24iIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfbWV0aG9kT3B0aW9uc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyA3OTk0IH07DQorICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kT3B0aW9ucyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIE1ldGhvZE9wdGlvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgTWV0aG9kT3B0aW9ucyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZE9wdGlvbnNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8TWV0aG9kT3B0aW9ucywgTWV0aG9kT3B0aW9ucy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9NZXRob2RPcHRpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4gdW5pbnRlcnByZXRlZE9wdGlvbl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4gVW5pbnRlcnByZXRlZE9wdGlvbkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiB1bmludGVycHJldGVkT3B0aW9uXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5pbnRlcnByZXRlZE9wdGlvbl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiBHZXRVbmludGVycHJldGVkT3B0aW9uKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bmludGVycHJldGVkT3B0aW9uX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uIGVsZW1lbnQgaW4gVW5pbnRlcnByZXRlZE9wdGlvbkxpc3QpIHsNCisgICAgICAgICAgaWYgKCFlbGVtZW50LklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghRXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9tZXRob2RPcHRpb25zRmllbGROYW1lczsNCisgICAgICBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8TWV0aG9kT3B0aW9ucywgTWV0aG9kT3B0aW9ucy5CdWlsZGVyPi5FeHRlbnNpb25Xcml0ZXIgZXh0ZW5zaW9uV3JpdGVyID0gQ3JlYXRlRXh0ZW5zaW9uV3JpdGVyKHRoaXMpOw0KKyAgICAgIGlmICh1bmludGVycHJldGVkT3B0aW9uXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSg5OTksIGZpZWxkX25hbWVzWzBdLCB1bmludGVycHJldGVkT3B0aW9uXyk7DQorICAgICAgfQ0KKyAgICAgIGV4dGVuc2lvbldyaXRlci5Xcml0ZVVudGlsKDUzNjg3MDkxMiwgb3V0cHV0KTsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbiBlbGVtZW50IGluIFVuaW50ZXJwcmV0ZWRPcHRpb25MaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoOTk5LCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBFeHRlbnNpb25zU2VyaWFsaXplZFNpemU7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kT3B0aW9ucyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNZXRob2RPcHRpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZE9wdGlvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZE9wdGlvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZE9wdGlvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kT3B0aW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNZXRob2RPcHRpb25zIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZE9wdGlvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kT3B0aW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBNZXRob2RPcHRpb25zIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIE1ldGhvZE9wdGlvbnMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoTWV0aG9kT3B0aW9ucyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6RXh0ZW5kYWJsZUJ1aWxkZXI8TWV0aG9kT3B0aW9ucywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoTWV0aG9kT3B0aW9ucyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIE1ldGhvZE9wdGlvbnMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgTWV0aG9kT3B0aW9ucyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIE1ldGhvZE9wdGlvbnMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBNZXRob2RPcHRpb25zKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBNZXRob2RPcHRpb25zIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kT3B0aW9ucy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBNZXRob2RPcHRpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLk1ldGhvZE9wdGlvbnMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBNZXRob2RPcHRpb25zIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBNZXRob2RPcHRpb25zKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKE1ldGhvZE9wdGlvbnMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShNZXRob2RPcHRpb25zIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuTWV0aG9kT3B0aW9ucy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci51bmludGVycHJldGVkT3B0aW9uXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uXy5BZGQob3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgICB0aGlzLk1lcmdlRXh0ZW5zaW9uRmllbGRzKG90aGVyKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX21ldGhvZE9wdGlvbnNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfbWV0aG9kT3B0aW9uc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3OTk0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4gVW5pbnRlcnByZXRlZE9wdGlvbkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5pbnRlcnByZXRlZE9wdGlvbl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbmludGVycHJldGVkT3B0aW9uQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbmludGVycHJldGVkT3B0aW9uQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24gR2V0VW5pbnRlcnByZXRlZE9wdGlvbihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5pbnRlcnByZXRlZE9wdGlvbihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVuaW50ZXJwcmV0ZWRPcHRpb24oaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbmludGVycHJldGVkT3B0aW9uKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bmludGVycHJldGVkT3B0aW9uX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbmludGVycHJldGVkT3B0aW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5pbnRlcnByZXRlZE9wdGlvbihnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbmludGVycHJldGVkT3B0aW9uKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbj4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVuaW50ZXJwcmV0ZWRPcHRpb25fLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5pbnRlcnByZXRlZE9wdGlvbigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5pbnRlcnByZXRlZE9wdGlvbl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgTWV0aG9kT3B0aW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBVbmludGVycHJldGVkT3B0aW9uIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VW5pbnRlcnByZXRlZE9wdGlvbiwgVW5pbnRlcnByZXRlZE9wdGlvbi5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVW5pbnRlcnByZXRlZE9wdGlvbigpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBVbmludGVycHJldGVkT3B0aW9uIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBVbmludGVycHJldGVkT3B0aW9uKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF91bmludGVycHJldGVkT3B0aW9uRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhZ2dyZWdhdGVfdmFsdWUiLCAiZG91YmxlX3ZhbHVlIiwgImlkZW50aWZpZXJfdmFsdWUiLCAibmFtZSIsICJuZWdhdGl2ZV9pbnRfdmFsdWUiLCAicG9zaXRpdmVfaW50X3ZhbHVlIiwgInN0cmluZ192YWx1ZSIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF91bmludGVycHJldGVkT3B0aW9uRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDY2LCA0OSwgMjYsIDE4LCA0MCwgMzIsIDU4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgVW5pbnRlcnByZXRlZE9wdGlvbiBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFVuaW50ZXJwcmV0ZWRPcHRpb24gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVW5pbnRlcnByZXRlZE9wdGlvbiBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VW5pbnRlcnByZXRlZE9wdGlvbiwgVW5pbnRlcnByZXRlZE9wdGlvbi5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMNCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsNCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBOYW1lUGFydCA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPE5hbWVQYXJ0LCBOYW1lUGFydC5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIE5hbWVQYXJ0KCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBOYW1lUGFydCBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgTmFtZVBhcnQoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9uYW1lUGFydEZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiaXNfZXh0ZW5zaW9uIiwgIm5hbWVfcGFydCIgfTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfbmFtZVBhcnRGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTYsIDEwIH07DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5hbWVQYXJ0IERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIE5hbWVQYXJ0IERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBOYW1lUGFydCBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9fRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxOYW1lUGFydCwgTmFtZVBhcnQuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IE5hbWVQYXJ0X0ZpZWxkTnVtYmVyID0gMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNOYW1lUGFydF87DQorICAgICAgICBwcml2YXRlIHN0cmluZyBuYW1lUGFydF8gPSAiIjsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc05hbWVQYXJ0XyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNOYW1lUGFydF87IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZVBhcnRfIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIG5hbWVQYXJ0XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IElzRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAyOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0lzRXh0ZW5zaW9uOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGlzRXh0ZW5zaW9uXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0lzRXh0ZW5zaW9uIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0lzRXh0ZW5zaW9uOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgYm9vbCBJc0V4dGVuc2lvbiB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBpc0V4dGVuc2lvbl87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaWYgKCFoYXNOYW1lUGFydF8pIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICBpZiAoIWhhc0lzRXh0ZW5zaW9uKSByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfbmFtZVBhcnRGaWVsZE5hbWVzOw0KKyAgICAgICAgICBpZiAoaGFzTmFtZVBhcnRfKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzFdLCBOYW1lUGFydF8pOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNJc0V4dGVuc2lvbikgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woMiwgZmllbGRfbmFtZXNbMF0sIElzRXh0ZW5zaW9uKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgDQorICAgICAgICAgIHNpemUgPSAwOw0KKyAgICAgICAgICBpZiAoaGFzTmFtZVBhcnRfKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMSwgTmFtZVBhcnRfKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzSXNFeHRlbnNpb24pIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQm9vbFNpemUoMiwgSXNFeHRlbnNpb24pOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgICAgIHJldHVybiBzaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOYW1lUGFydCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOYW1lUGFydCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOYW1lUGFydCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmFtZVBhcnQgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5hbWVQYXJ0IFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5hbWVQYXJ0IFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5hbWVQYXJ0IFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5hbWVQYXJ0IFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5hbWVQYXJ0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5hbWVQYXJ0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIE5hbWVQYXJ0IE1ha2VSZWFkT25seSgpIHsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihOYW1lUGFydCBwcm90b3R5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPE5hbWVQYXJ0LCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKE5hbWVQYXJ0IGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgTmFtZVBhcnQgcmVzdWx0Ow0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBOYW1lUGFydCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgTmFtZVBhcnQgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgTmFtZVBhcnQoKTsNCisgICAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgTmFtZVBhcnQgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5UeXBlcy5OYW1lUGFydC5EZXNjcmlwdG9yOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBOYW1lUGFydCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5UeXBlcy5OYW1lUGFydC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIE5hbWVQYXJ0IEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciBpcyBOYW1lUGFydCkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoTmFtZVBhcnQpIG90aGVyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oTmFtZVBhcnQgb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5UeXBlcy5OYW1lUGFydC5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc05hbWVQYXJ0Xykgew0KKyAgICAgICAgICAgICAgTmFtZVBhcnRfID0gb3RoZXIuTmFtZVBhcnRfOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzSXNFeHRlbnNpb24pIHsNCisgICAgICAgICAgICAgIElzRXh0ZW5zaW9uID0gb3RoZXIuSXNFeHRlbnNpb247DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX25hbWVQYXJ0RmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgICAgICB0YWcgPSBfbmFtZVBhcnRGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNOYW1lUGFydF8gPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQubmFtZVBhcnRfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDE2OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0lzRXh0ZW5zaW9uID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5pc0V4dGVuc2lvbl8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNOYW1lUGFydF8gew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTmFtZVBhcnRfOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBOYW1lUGFydF8gew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmFtZVBhcnRfOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0TmFtZVBhcnRfKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5hbWVQYXJ0XyhzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc05hbWVQYXJ0XyA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0Lm5hbWVQYXJ0XyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTmFtZVBhcnRfKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc05hbWVQYXJ0XyA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5uYW1lUGFydF8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzSXNFeHRlbnNpb24gew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzSXNFeHRlbnNpb247IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBJc0V4dGVuc2lvbiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0V4dGVuc2lvbjsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldElzRXh0ZW5zaW9uKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldElzRXh0ZW5zaW9uKGJvb2wgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNJc0V4dGVuc2lvbiA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmlzRXh0ZW5zaW9uXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFySXNFeHRlbnNpb24oKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzSXNFeHRlbnNpb24gPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuaXNFeHRlbnNpb25fID0gZmFsc2U7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0YXRpYyBOYW1lUGFydCgpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE5hbWVGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5UeXBlcy5OYW1lUGFydD4gbmFtZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5UeXBlcy5OYW1lUGFydD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5UeXBlcy5OYW1lUGFydD4gTmFtZUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBuYW1lXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgTmFtZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gbmFtZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5UeXBlcy5OYW1lUGFydCBHZXROYW1lKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBuYW1lX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgSWRlbnRpZmllclZhbHVlRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzSWRlbnRpZmllclZhbHVlOw0KKyAgICBwcml2YXRlIHN0cmluZyBpZGVudGlmaWVyVmFsdWVfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0lkZW50aWZpZXJWYWx1ZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0lkZW50aWZpZXJWYWx1ZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgSWRlbnRpZmllclZhbHVlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaWRlbnRpZmllclZhbHVlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBvc2l0aXZlSW50VmFsdWVGaWVsZE51bWJlciA9IDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNQb3NpdGl2ZUludFZhbHVlOw0KKyAgICBwcml2YXRlIHVsb25nIHBvc2l0aXZlSW50VmFsdWVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNQb3NpdGl2ZUludFZhbHVlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzUG9zaXRpdmVJbnRWYWx1ZTsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgUG9zaXRpdmVJbnRWYWx1ZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBvc2l0aXZlSW50VmFsdWVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTmVnYXRpdmVJbnRWYWx1ZUZpZWxkTnVtYmVyID0gNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc05lZ2F0aXZlSW50VmFsdWU7DQorICAgIHByaXZhdGUgbG9uZyBuZWdhdGl2ZUludFZhbHVlXzsNCisgICAgcHVibGljIGJvb2wgSGFzTmVnYXRpdmVJbnRWYWx1ZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc05lZ2F0aXZlSW50VmFsdWU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBOZWdhdGl2ZUludFZhbHVlIHsNCisgICAgICBnZXQgeyByZXR1cm4gbmVnYXRpdmVJbnRWYWx1ZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEb3VibGVWYWx1ZUZpZWxkTnVtYmVyID0gNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RvdWJsZVZhbHVlOw0KKyAgICBwcml2YXRlIGRvdWJsZSBkb3VibGVWYWx1ZV87DQorICAgIHB1YmxpYyBib29sIEhhc0RvdWJsZVZhbHVlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRG91YmxlVmFsdWU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZG91YmxlIERvdWJsZVZhbHVlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZG91YmxlVmFsdWVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgU3RyaW5nVmFsdWVGaWVsZE51bWJlciA9IDc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNTdHJpbmdWYWx1ZTsNCisgICAgcHJpdmF0ZSBwYjo6Qnl0ZVN0cmluZyBzdHJpbmdWYWx1ZV8gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsNCisgICAgcHVibGljIGJvb2wgSGFzU3RyaW5nVmFsdWUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNTdHJpbmdWYWx1ZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBTdHJpbmdWYWx1ZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHN0cmluZ1ZhbHVlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEFnZ3JlZ2F0ZVZhbHVlRmllbGROdW1iZXIgPSA4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzQWdncmVnYXRlVmFsdWU7DQorICAgIHByaXZhdGUgc3RyaW5nIGFnZ3JlZ2F0ZVZhbHVlXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNBZ2dyZWdhdGVWYWx1ZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0FnZ3JlZ2F0ZVZhbHVlOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBBZ2dyZWdhdGVWYWx1ZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGFnZ3JlZ2F0ZVZhbHVlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5UeXBlcy5OYW1lUGFydCBlbGVtZW50IGluIE5hbWVMaXN0KSB7DQorICAgICAgICAgIGlmICghZWxlbWVudC5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF91bmludGVycHJldGVkT3B0aW9uRmllbGROYW1lczsNCisgICAgICBpZiAobmFtZV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlQXJyYXkoMiwgZmllbGRfbmFtZXNbM10sIG5hbWVfKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0lkZW50aWZpZXJWYWx1ZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDMsIGZpZWxkX25hbWVzWzJdLCBJZGVudGlmaWVyVmFsdWUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzUG9zaXRpdmVJbnRWYWx1ZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlVUludDY0KDQsIGZpZWxkX25hbWVzWzVdLCBQb3NpdGl2ZUludFZhbHVlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05lZ2F0aXZlSW50VmFsdWUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KDUsIGZpZWxkX25hbWVzWzRdLCBOZWdhdGl2ZUludFZhbHVlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RvdWJsZVZhbHVlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGUoNiwgZmllbGRfbmFtZXNbMV0sIERvdWJsZVZhbHVlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1N0cmluZ1ZhbHVlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCeXRlcyg3LCBmaWVsZF9uYW1lc1s2XSwgU3RyaW5nVmFsdWUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQWdncmVnYXRlVmFsdWUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyg4LCBmaWVsZF9uYW1lc1swXSwgQWdncmVnYXRlVmFsdWUpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5UeXBlcy5OYW1lUGFydCBlbGVtZW50IGluIE5hbWVMaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMiwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNJZGVudGlmaWVyVmFsdWUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDMsIElkZW50aWZpZXJWYWx1ZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNQb3NpdGl2ZUludFZhbHVlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDY0U2l6ZSg0LCBQb3NpdGl2ZUludFZhbHVlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05lZ2F0aXZlSW50VmFsdWUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUoNSwgTmVnYXRpdmVJbnRWYWx1ZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEb3VibGVWYWx1ZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZURvdWJsZVNpemUoNiwgRG91YmxlVmFsdWUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU3RyaW5nVmFsdWUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCeXRlc1NpemUoNywgU3RyaW5nVmFsdWUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQWdncmVnYXRlVmFsdWUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDgsIEFnZ3JlZ2F0ZVZhbHVlKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVW5pbnRlcnByZXRlZE9wdGlvbiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBVbmludGVycHJldGVkT3B0aW9uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFVuaW50ZXJwcmV0ZWRPcHRpb24gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFVuaW50ZXJwcmV0ZWRPcHRpb24gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFVuaW50ZXJwcmV0ZWRPcHRpb24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVW5pbnRlcnByZXRlZE9wdGlvbiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBVbmludGVycHJldGVkT3B0aW9uIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFVuaW50ZXJwcmV0ZWRPcHRpb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVW5pbnRlcnByZXRlZE9wdGlvbiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBVbmludGVycHJldGVkT3B0aW9uIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFVuaW50ZXJwcmV0ZWRPcHRpb24gTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIG5hbWVfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVW5pbnRlcnByZXRlZE9wdGlvbiBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxVbmludGVycHJldGVkT3B0aW9uLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihVbmludGVycHJldGVkT3B0aW9uIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVW5pbnRlcnByZXRlZE9wdGlvbiByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBVbmludGVycHJldGVkT3B0aW9uIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbiBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFVuaW50ZXJwcmV0ZWRPcHRpb24oKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFVuaW50ZXJwcmV0ZWRPcHRpb24gTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFVuaW50ZXJwcmV0ZWRPcHRpb24gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFVuaW50ZXJwcmV0ZWRPcHRpb24gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFVuaW50ZXJwcmV0ZWRPcHRpb24pIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVW5pbnRlcnByZXRlZE9wdGlvbikgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFVuaW50ZXJwcmV0ZWRPcHRpb24gb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLm5hbWVfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0Lm5hbWVfLkFkZChvdGhlci5uYW1lXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzSWRlbnRpZmllclZhbHVlKSB7DQorICAgICAgICAgIElkZW50aWZpZXJWYWx1ZSA9IG90aGVyLklkZW50aWZpZXJWYWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNQb3NpdGl2ZUludFZhbHVlKSB7DQorICAgICAgICAgIFBvc2l0aXZlSW50VmFsdWUgPSBvdGhlci5Qb3NpdGl2ZUludFZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc05lZ2F0aXZlSW50VmFsdWUpIHsNCisgICAgICAgICAgTmVnYXRpdmVJbnRWYWx1ZSA9IG90aGVyLk5lZ2F0aXZlSW50VmFsdWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRG91YmxlVmFsdWUpIHsNCisgICAgICAgICAgRG91YmxlVmFsdWUgPSBvdGhlci5Eb3VibGVWYWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNTdHJpbmdWYWx1ZSkgew0KKyAgICAgICAgICBTdHJpbmdWYWx1ZSA9IG90aGVyLlN0cmluZ1ZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0FnZ3JlZ2F0ZVZhbHVlKSB7DQorICAgICAgICAgIEFnZ3JlZ2F0ZVZhbHVlID0gb3RoZXIuQWdncmVnYXRlVmFsdWU7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF91bmludGVycHJldGVkT3B0aW9uRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTg6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQubmFtZV8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24uVHlwZXMuTmFtZVBhcnQuRGVmYXVsdEluc3RhbmNlLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0lkZW50aWZpZXJWYWx1ZSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5pZGVudGlmaWVyVmFsdWVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzUG9zaXRpdmVJbnRWYWx1ZSA9IGlucHV0LlJlYWRVSW50NjQocmVmIHJlc3VsdC5wb3NpdGl2ZUludFZhbHVlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc05lZ2F0aXZlSW50VmFsdWUgPSBpbnB1dC5SZWFkSW50NjQocmVmIHJlc3VsdC5uZWdhdGl2ZUludFZhbHVlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0OTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RvdWJsZVZhbHVlID0gaW5wdXQuUmVhZERvdWJsZShyZWYgcmVzdWx0LmRvdWJsZVZhbHVlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1N0cmluZ1ZhbHVlID0gaW5wdXQuUmVhZEJ5dGVzKHJlZiByZXN1bHQuc3RyaW5nVmFsdWVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzQWdncmVnYXRlVmFsdWUgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuYWdncmVnYXRlVmFsdWVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24uVHlwZXMuTmFtZVBhcnQ+IE5hbWVMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLm5hbWVfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgTmFtZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmFtZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLlR5cGVzLk5hbWVQYXJ0IEdldE5hbWUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldE5hbWUoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROYW1lKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5UeXBlcy5OYW1lUGFydCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubmFtZV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TmFtZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24uVHlwZXMuTmFtZVBhcnQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubmFtZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkTmFtZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5VbmludGVycHJldGVkT3B0aW9uLlR5cGVzLk5hbWVQYXJ0IHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5uYW1lXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZE5hbWUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuVW5pbnRlcnByZXRlZE9wdGlvbi5UeXBlcy5OYW1lUGFydC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5uYW1lXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlTmFtZShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlVuaW50ZXJwcmV0ZWRPcHRpb24uVHlwZXMuTmFtZVBhcnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5uYW1lXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5hbWUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lm5hbWVfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzSWRlbnRpZmllclZhbHVlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzSWRlbnRpZmllclZhbHVlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgSWRlbnRpZmllclZhbHVlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSWRlbnRpZmllclZhbHVlOyB9DQorICAgICAgICBzZXQgeyBTZXRJZGVudGlmaWVyVmFsdWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldElkZW50aWZpZXJWYWx1ZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0lkZW50aWZpZXJWYWx1ZSA9IHRydWU7DQorICAgICAgICByZXN1bHQuaWRlbnRpZmllclZhbHVlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFySWRlbnRpZmllclZhbHVlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJZGVudGlmaWVyVmFsdWUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5pZGVudGlmaWVyVmFsdWVfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzUG9zaXRpdmVJbnRWYWx1ZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1Bvc2l0aXZlSW50VmFsdWU7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIFBvc2l0aXZlSW50VmFsdWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Qb3NpdGl2ZUludFZhbHVlOyB9DQorICAgICAgICBzZXQgeyBTZXRQb3NpdGl2ZUludFZhbHVlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQb3NpdGl2ZUludFZhbHVlKHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1Bvc2l0aXZlSW50VmFsdWUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnBvc2l0aXZlSW50VmFsdWVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQb3NpdGl2ZUludFZhbHVlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNQb3NpdGl2ZUludFZhbHVlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQucG9zaXRpdmVJbnRWYWx1ZV8gPSAwVUw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmVnYXRpdmVJbnRWYWx1ZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc05lZ2F0aXZlSW50VmFsdWU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgTmVnYXRpdmVJbnRWYWx1ZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk5lZ2F0aXZlSW50VmFsdWU7IH0NCisgICAgICAgIHNldCB7IFNldE5lZ2F0aXZlSW50VmFsdWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5lZ2F0aXZlSW50VmFsdWUobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOZWdhdGl2ZUludFZhbHVlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5uZWdhdGl2ZUludFZhbHVlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTmVnYXRpdmVJbnRWYWx1ZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmVnYXRpdmVJbnRWYWx1ZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5lZ2F0aXZlSW50VmFsdWVfID0gMEw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRG91YmxlVmFsdWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEb3VibGVWYWx1ZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZG91YmxlIERvdWJsZVZhbHVlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRG91YmxlVmFsdWU7IH0NCisgICAgICAgIHNldCB7IFNldERvdWJsZVZhbHVlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREb3VibGVWYWx1ZShkb3VibGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRG91YmxlVmFsdWUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRvdWJsZVZhbHVlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRG91YmxlVmFsdWUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RvdWJsZVZhbHVlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZG91YmxlVmFsdWVfID0gMEQ7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzU3RyaW5nVmFsdWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNTdHJpbmdWYWx1ZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgU3RyaW5nVmFsdWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5TdHJpbmdWYWx1ZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0U3RyaW5nVmFsdWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFN0cmluZ1ZhbHVlKHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTdHJpbmdWYWx1ZSA9IHRydWU7DQorICAgICAgICByZXN1bHQuc3RyaW5nVmFsdWVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTdHJpbmdWYWx1ZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU3RyaW5nVmFsdWUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5zdHJpbmdWYWx1ZV8gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNBZ2dyZWdhdGVWYWx1ZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0FnZ3JlZ2F0ZVZhbHVlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgQWdncmVnYXRlVmFsdWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BZ2dyZWdhdGVWYWx1ZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0QWdncmVnYXRlVmFsdWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEFnZ3JlZ2F0ZVZhbHVlKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQWdncmVnYXRlVmFsdWUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmFnZ3JlZ2F0ZVZhbHVlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQWdncmVnYXRlVmFsdWUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0FnZ3JlZ2F0ZVZhbHVlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuYWdncmVnYXRlVmFsdWVfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFVuaW50ZXJwcmV0ZWRPcHRpb24oKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgU291cmNlQ29kZUluZm8gOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxTb3VyY2VDb2RlSW5mbywgU291cmNlQ29kZUluZm8uQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFNvdXJjZUNvZGVJbmZvKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNvdXJjZUNvZGVJbmZvIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTb3VyY2VDb2RlSW5mbygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfc291cmNlQ29kZUluZm9GaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImxvY2F0aW9uIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3NvdXJjZUNvZGVJbmZvRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgU291cmNlQ29kZUluZm8gRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBTb3VyY2VDb2RlSW5mbyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBTb3VyY2VDb2RlSW5mbyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFNvdXJjZUNvZGVJbmZvLCBTb3VyY2VDb2RlSW5mby5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgICNyZWdpb24gTmVzdGVkIHR5cGVzDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgTG9jYXRpb24gOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxMb2NhdGlvbiwgTG9jYXRpb24uQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBMb2NhdGlvbigpIHsgfQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTG9jYXRpb24gZGVmYXVsdEluc3RhbmNlID0gbmV3IExvY2F0aW9uKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfbG9jYXRpb25GaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInBhdGgiLCAic3BhbiIgfTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfbG9jYXRpb25GaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAsIDE4IH07DQorICAgICAgICBwdWJsaWMgc3RhdGljIExvY2F0aW9uIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIExvY2F0aW9uIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBMb2NhdGlvbiBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19nb29nbGVfcHJvdG9idWZfU291cmNlQ29kZUluZm9fTG9jYXRpb25fX0Rlc2NyaXB0b3I7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8TG9jYXRpb24sIExvY2F0aW9uLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgUGF0aEZpZWxkTnVtYmVyID0gMTsNCisgICAgICAgIHByaXZhdGUgaW50IHBhdGhNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IHBhdGhfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gUGF0aExpc3Qgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhdGhfKTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBQYXRoQ291bnQgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gcGF0aF8uQ291bnQ7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgR2V0UGF0aChpbnQgaW5kZXgpIHsNCisgICAgICAgICAgcmV0dXJuIHBhdGhfW2luZGV4XTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBTcGFuRmllbGROdW1iZXIgPSAyOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgc3Bhbk1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gc3Bhbl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICAgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBTcGFuTGlzdCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoc3Bhbl8pOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IFNwYW5Db3VudCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBzcGFuXy5Db3VudDsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBHZXRTcGFuKGludCBpbmRleCkgew0KKyAgICAgICAgICByZXR1cm4gc3Bhbl9baW5kZXhdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9sb2NhdGlvbkZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChwYXRoXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRJbnQzMkFycmF5KDEsIGZpZWxkX25hbWVzWzBdLCBwYXRoTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGF0aF8pOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChzcGFuXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRJbnQzMkFycmF5KDIsIGZpZWxkX25hbWVzWzFdLCBzcGFuTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgc3Bhbl8pOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIFBhdGhMaXN0KSB7DQorICAgICAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICAgIGlmIChwYXRoXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcGF0aE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgICAgICBmb3JlYWNoIChpbnQgZWxlbWVudCBpbiBTcGFuTGlzdCkgew0KKyAgICAgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgICAgICBpZiAoc3Bhbl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNwYW5NZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIExvY2F0aW9uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIExvY2F0aW9uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIExvY2F0aW9uIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBMb2NhdGlvbiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTG9jYXRpb24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTG9jYXRpb24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTG9jYXRpb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTG9jYXRpb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTG9jYXRpb24gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTG9jYXRpb24gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgTG9jYXRpb24gTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICBwYXRoXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgc3Bhbl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoTG9jYXRpb24gcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxMb2NhdGlvbiwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihMb2NhdGlvbiBjbG9uZUZyb20pIHsNCisgICAgICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgICAgICBwcml2YXRlIExvY2F0aW9uIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgTG9jYXRpb24gUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIExvY2F0aW9uIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IExvY2F0aW9uKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIExvY2F0aW9uIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNvdXJjZUNvZGVJbmZvLlR5cGVzLkxvY2F0aW9uLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIExvY2F0aW9uIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mby5UeXBlcy5Mb2NhdGlvbi5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIExvY2F0aW9uIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciBpcyBMb2NhdGlvbikgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoTG9jYXRpb24pIG90aGVyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oTG9jYXRpb24gb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU291cmNlQ29kZUluZm8uVHlwZXMuTG9jYXRpb24uRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChvdGhlci5wYXRoXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgICAgICByZXN1bHQucGF0aF8uQWRkKG90aGVyLnBhdGhfKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLnNwYW5fLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgICAgIHJlc3VsdC5zcGFuXy5BZGQob3RoZXIuc3Bhbl8pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9sb2NhdGlvbkZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX2xvY2F0aW9uRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTA6DQorICAgICAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgICAgIGlucHV0LlJlYWRJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhdGhfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDE4Og0KKyAgICAgICAgICAgICAgICBjYXNlIDE2OiB7DQorICAgICAgICAgICAgICAgICAgaW5wdXQuUmVhZEludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuc3Bhbl8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gUGF0aExpc3Qgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhdGhfOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBQYXRoQ291bnQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGF0aENvdW50OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBHZXRQYXRoKGludCBpbmRleCkgew0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGF0aChpbmRleCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGF0aChpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LnBhdGhfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhdGgoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQucGF0aF8uQWRkKHZhbHVlKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhdGgoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LnBhdGhfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGF0aCgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5wYXRoXy5DbGVhcigpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gU3Bhbkxpc3Qgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnNwYW5fOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBTcGFuQ291bnQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuU3BhbkNvdW50OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBHZXRTcGFuKGludCBpbmRleCkgew0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuR2V0U3BhbihpbmRleCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0U3BhbihpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LnNwYW5fW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFNwYW4oaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuc3Bhbl8uQWRkKHZhbHVlKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVNwYW4oc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LnNwYW5fLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyU3BhbigpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5zcGFuXy5DbGVhcigpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgTG9jYXRpb24oKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBMb2NhdGlvbkZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mby5UeXBlcy5Mb2NhdGlvbj4gbG9jYXRpb25fID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNvdXJjZUNvZGVJbmZvLlR5cGVzLkxvY2F0aW9uPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mby5UeXBlcy5Mb2NhdGlvbj4gTG9jYXRpb25MaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gbG9jYXRpb25fOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBMb2NhdGlvbkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gbG9jYXRpb25fLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNvdXJjZUNvZGVJbmZvLlR5cGVzLkxvY2F0aW9uIEdldExvY2F0aW9uKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBsb2NhdGlvbl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfc291cmNlQ29kZUluZm9GaWVsZE5hbWVzOw0KKyAgICAgIGlmIChsb2NhdGlvbl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlQXJyYXkoMSwgZmllbGRfbmFtZXNbMF0sIGxvY2F0aW9uXyk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mby5UeXBlcy5Mb2NhdGlvbiBlbGVtZW50IGluIExvY2F0aW9uTGlzdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTb3VyY2VDb2RlSW5mbyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTb3VyY2VDb2RlSW5mbyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTb3VyY2VDb2RlSW5mbyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU291cmNlQ29kZUluZm8gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNvdXJjZUNvZGVJbmZvIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNvdXJjZUNvZGVJbmZvIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNvdXJjZUNvZGVJbmZvIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNvdXJjZUNvZGVJbmZvIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNvdXJjZUNvZGVJbmZvIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNvdXJjZUNvZGVJbmZvIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFNvdXJjZUNvZGVJbmZvIE1ha2VSZWFkT25seSgpIHsNCisgICAgICBsb2NhdGlvbl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihTb3VyY2VDb2RlSW5mbyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxTb3VyY2VDb2RlSW5mbywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoU291cmNlQ29kZUluZm8gY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBTb3VyY2VDb2RlSW5mbyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBTb3VyY2VDb2RlSW5mbyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFNvdXJjZUNvZGVJbmZvIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgU291cmNlQ29kZUluZm8oKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNvdXJjZUNvZGVJbmZvIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU291cmNlQ29kZUluZm8uRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgU291cmNlQ29kZUluZm8gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU291cmNlQ29kZUluZm8uRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTb3VyY2VDb2RlSW5mbyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgU291cmNlQ29kZUluZm8pIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoU291cmNlQ29kZUluZm8pIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShTb3VyY2VDb2RlSW5mbyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNvdXJjZUNvZGVJbmZvLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLmxvY2F0aW9uXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5sb2NhdGlvbl8uQWRkKG90aGVyLmxvY2F0aW9uXyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9zb3VyY2VDb2RlSW5mb0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9zb3VyY2VDb2RlSW5mb0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5sb2NhdGlvbl8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNvdXJjZUNvZGVJbmZvLlR5cGVzLkxvY2F0aW9uLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU291cmNlQ29kZUluZm8uVHlwZXMuTG9jYXRpb24+IExvY2F0aW9uTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5sb2NhdGlvbl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBMb2NhdGlvbkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTG9jYXRpb25Db3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU291cmNlQ29kZUluZm8uVHlwZXMuTG9jYXRpb24gR2V0TG9jYXRpb24oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldExvY2F0aW9uKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TG9jYXRpb24oaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mby5UeXBlcy5Mb2NhdGlvbiB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubG9jYXRpb25fW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldExvY2F0aW9uKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU291cmNlQ29kZUluZm8uVHlwZXMuTG9jYXRpb24uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubG9jYXRpb25fW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZExvY2F0aW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLlNvdXJjZUNvZGVJbmZvLlR5cGVzLkxvY2F0aW9uIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5sb2NhdGlvbl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRMb2NhdGlvbihnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5Tb3VyY2VDb2RlSW5mby5UeXBlcy5Mb2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5sb2NhdGlvbl8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUxvY2F0aW9uKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuU291cmNlQ29kZUluZm8uVHlwZXMuTG9jYXRpb24+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5sb2NhdGlvbl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJMb2NhdGlvbigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQubG9jYXRpb25fLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFNvdXJjZUNvZGVJbmZvKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCit9DQorDQorI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JQcm90b3MvSURlc2NyaXB0b3JQcm90by5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JQcm90b3MvSURlc2NyaXB0b3JQcm90by5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODk0ZDMyCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvclByb3Rvcy9JRGVzY3JpcHRvclByb3RvLmNzCkBAIC0wLDAgKzEsNTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhbGwgRGVzY3JpcHRvclByb3Rvcy4gVGhlIGdlbmVyYXRvciBkb2Vzbid0DQorICAgIC8vLyBlbWl0IHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gY2xhaW0sIHNvIFBhcnRpYWxDbGFzc2VzLmNzIGNvbnRhaW5zDQorICAgIC8vLyBwYXJ0aWFsIGNsYXNzIGRlY2xhcmF0aW9ucyBmb3IgZWFjaCBvZiB0aGVtLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUT3B0aW9ucyI+VGhlIGFzc29jaWF0ZWQgb3B0aW9ucyBwcm90b2NvbCBidWZmZXIgdHlwZTwvdHlwZXBhcmFtPg0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElEZXNjcmlwdG9yUHJvdG88VE9wdGlvbnM+DQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUaGUgYnJpZWYgbmFtZSBvZiB0aGUgZGVzY3JpcHRvcidzIHRhcmdldC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBzdHJpbmcgTmFtZSB7IGdldDsgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBvcHRpb25zIGZvciB0aGlzIGRlc2NyaXB0b3IuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgVE9wdGlvbnMgT3B0aW9ucyB7IGdldDsgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JQcm90b3MvUGFydGlhbENsYXNzZXMuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9yUHJvdG9zL1BhcnRpYWxDbGFzc2VzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYzJhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9yUHJvdG9zL1BhcnRpYWxDbGFzc2VzLmNzCkBAIC0wLDAgKzEsNjUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKy8vIFRoaXMgZmlsZSBqdXN0IGNvbnRhaW5zIHBhcnRpYWwgY2xhc3NlcyBmb3IgZWFjaCBvZiB0aGUNCisvLyBhdXRvZ2VuZXJhdGVkIGNsYXNzZXMsIHNvIHRoYXQgdGhleSBpbXBsZW1lbnQNCisvLyBJRGVzY3JpcHRvclByb3RvDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcw0KK3sNCisgICAgcHVibGljIHBhcnRpYWwgY2xhc3MgRGVzY3JpcHRvclByb3RvIDogSURlc2NyaXB0b3JQcm90bzxNZXNzYWdlT3B0aW9ucz4NCisgICAgew0KKyAgICB9DQorDQorICAgIHB1YmxpYyBwYXJ0aWFsIGNsYXNzIEVudW1EZXNjcmlwdG9yUHJvdG8gOiBJRGVzY3JpcHRvclByb3RvPEVudW1PcHRpb25zPg0KKyAgICB7DQorICAgIH0NCisNCisgICAgcHVibGljIHBhcnRpYWwgY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIDogSURlc2NyaXB0b3JQcm90bzxFbnVtVmFsdWVPcHRpb25zPg0KKyAgICB7DQorICAgIH0NCisNCisgICAgcHVibGljIHBhcnRpYWwgY2xhc3MgRmllbGREZXNjcmlwdG9yUHJvdG8gOiBJRGVzY3JpcHRvclByb3RvPEZpZWxkT3B0aW9ucz4NCisgICAgew0KKyAgICB9DQorDQorICAgIHB1YmxpYyBwYXJ0aWFsIGNsYXNzIEZpbGVEZXNjcmlwdG9yUHJvdG8gOiBJRGVzY3JpcHRvclByb3RvPEZpbGVPcHRpb25zPg0KKyAgICB7DQorICAgIH0NCisNCisgICAgcHVibGljIHBhcnRpYWwgY2xhc3MgTWV0aG9kRGVzY3JpcHRvclByb3RvIDogSURlc2NyaXB0b3JQcm90bzxNZXRob2RPcHRpb25zPg0KKyAgICB7DQorICAgIH0NCisNCisgICAgcHVibGljIHBhcnRpYWwgY2xhc3MgU2VydmljZURlc2NyaXB0b3JQcm90byA6IElEZXNjcmlwdG9yUHJvdG88U2VydmljZU9wdGlvbnM+DQorICAgIHsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9EZXNjcmlwdG9yQmFzZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL0Rlc2NyaXB0b3JCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MDA2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9EZXNjcmlwdG9yQmFzZS5jcwpAQCAtMCwwICsxLDExNSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBCYXNlIGNsYXNzIGZvciBuZWFybHkgYWxsIGRlc2NyaXB0b3JzLCBwcm92aWRpbmcgY29tbW9uIGZ1bmN0aW9uYWxpdHkuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlRQcm90byI+VHlwZSBvZiB0aGUgcHJvdG9jb2wgYnVmZmVyIGZvcm0gb2YgdGhpcyBkZXNjcmlwdG9yPC90eXBlcGFyYW0+DQorICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlRPcHRpb25zIj5UeXBlIG9mIHRoZSBvcHRpb25zIHByb3RvY29sIGJ1ZmZlciBmb3IgdGhpcyBkZXNjcmlwdG9yPC90eXBlcGFyYW0+DQorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXNjcmlwdG9yQmFzZTxUUHJvdG8sIFRPcHRpb25zPiA6IElEZXNjcmlwdG9yPFRQcm90bz4NCisgICAgICAgIHdoZXJlIFRQcm90byA6IElNZXNzYWdlLCBJRGVzY3JpcHRvclByb3RvPFRPcHRpb25zPg0KKyAgICB7DQorICAgICAgICBwcml2YXRlIFRQcm90byBwcm90bzsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZURlc2NyaXB0b3IgZmlsZTsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIGZ1bGxOYW1lOw0KKw0KKyAgICAgICAgcHJvdGVjdGVkIERlc2NyaXB0b3JCYXNlKFRQcm90byBwcm90bywgRmlsZURlc2NyaXB0b3IgZmlsZSwgc3RyaW5nIGZ1bGxOYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsNCisgICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOw0KKyAgICAgICAgICAgIHRoaXMuZnVsbE5hbWUgPSBmdWxsTmFtZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHZpcnR1YWwgdm9pZCBSZXBsYWNlUHJvdG8oVFByb3RvIG5ld1Byb3RvKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRoaXMucHJvdG8gPSBuZXdQcm90bzsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgc3RyaW5nIENvbXB1dGVGdWxsTmFtZShGaWxlRGVzY3JpcHRvciBmaWxlLCBNZXNzYWdlRGVzY3JpcHRvciBwYXJlbnQsIHN0cmluZyBuYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQuRnVsbE5hbWUgKyAiLiIgKyBuYW1lOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZmlsZS5QYWNrYWdlLkxlbmd0aCA+IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5QYWNrYWdlICsgIi4iICsgbmFtZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIG5hbWU7DQorICAgICAgICB9DQorDQorICAgICAgICBJTWVzc2FnZSBJRGVzY3JpcHRvci5Qcm90bw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBwcm90bzsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIHByb3RvY29sIGJ1ZmZlciBmb3JtIG9mIHRoaXMgZGVzY3JpcHRvci4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgVFByb3RvIFByb3RvDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHByb3RvOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgVE9wdGlvbnMgT3B0aW9ucw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBwcm90by5PcHRpb25zOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBkZXNjcmlwdG9yJ3MgdGFyZ2V0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgRnVsbE5hbWUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZnVsbE5hbWU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUaGUgYnJpZWYgbmFtZSBvZiB0aGUgZGVzY3JpcHRvcidzIHRhcmdldC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcHJvdG8uTmFtZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDx2YWx1ZT4NCisgICAgICAgIC8vLyBUaGUgZmlsZSB0aGlzIGRlc2NyaXB0b3Igd2FzIGRlY2xhcmVkIGluLg0KKyAgICAgICAgLy8vIDwvdmFsdWU+DQorICAgICAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3IgRmlsZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBmaWxlOyB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvRGVzY3JpcHRvclBvb2wuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9EZXNjcmlwdG9yUG9vbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTgxOTgwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvRGVzY3JpcHRvclBvb2wuY3MKQEAgLTAsMCArMSwzNTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIENvbnRhaW5zIGxvb2t1cCB0YWJsZXMgY29udGFpbmluZyBhbGwgdGhlIGRlc2NyaXB0b3JzIGRlZmluZWQgaW4gYSBwYXJ0aWN1bGFyIGZpbGUuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIGludGVybmFsIHNlYWxlZCBjbGFzcyBEZXNjcmlwdG9yUG9vbA0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElEaWN0aW9uYXJ5PHN0cmluZywgSURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzQnlOYW1lID0NCisgICAgICAgICAgICBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIElEZXNjcmlwdG9yPigpOw0KKw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJRGljdGlvbmFyeTxEZXNjcmlwdG9ySW50UGFpciwgRmllbGREZXNjcmlwdG9yPiBmaWVsZHNCeU51bWJlciA9DQorICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8RGVzY3JpcHRvckludFBhaXIsIEZpZWxkRGVzY3JpcHRvcj4oKTsNCisNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSURpY3Rpb25hcnk8RGVzY3JpcHRvckludFBhaXIsIEVudW1WYWx1ZURlc2NyaXB0b3I+IGVudW1WYWx1ZXNCeU51bWJlciA9DQorICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8RGVzY3JpcHRvckludFBhaXIsIEVudW1WYWx1ZURlc2NyaXB0b3I+KCk7DQorDQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERlc2NyaXB0b3JQb29sW10gZGVwZW5kZW5jaWVzOw0KKw0KKyAgICAgICAgaW50ZXJuYWwgRGVzY3JpcHRvclBvb2woRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmN5RmlsZXMpDQorICAgICAgICB7DQorICAgICAgICAgICAgZGVwZW5kZW5jaWVzID0gbmV3IERlc2NyaXB0b3JQb29sW2RlcGVuZGVuY3lGaWxlcy5MZW5ndGhdOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVwZW5kZW5jeUZpbGVzLkxlbmd0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzW2ldID0gZGVwZW5kZW5jeUZpbGVzW2ldLkRlc2NyaXB0b3JQb29sOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBmb3JlYWNoIChGaWxlRGVzY3JpcHRvciBkZXBlbmRlbmN5IGluIGRlcGVuZGVuY3lGaWxlcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFkZFBhY2thZ2UoZGVwZW5kZW5jeS5QYWNrYWdlLCBkZXBlbmRlbmN5KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRmluZHMgYSBzeW1ib2wgb2YgdGhlIGdpdmVuIG5hbWUgd2l0aGluIHRoZSBwb29sLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSB0eXBlIG9mIHN5bWJvbCB0byBsb29rIGZvcjwvdHlwZXBhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmdWxsTmFtZSI+RnVsbHktcXVhbGlmaWVkIG5hbWUgdG8gbG9vayB1cDwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+VGhlIHN5bWJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB0eXBlLA0KKyAgICAgICAgLy8vIG9yIG51bGwgaWYgdGhlIHN5bWJvbCBkb2Vzbid0IGV4aXN0IG9yIGhhcyB0aGUgd3JvbmcgdHlwZTwvcmV0dXJucz4NCisgICAgICAgIGludGVybmFsIFQgRmluZFN5bWJvbDxUPihzdHJpbmcgZnVsbE5hbWUpIHdoZXJlIFQgOiBjbGFzcywgSURlc2NyaXB0b3INCisgICAgICAgIHsNCisgICAgICAgICAgICBJRGVzY3JpcHRvciByZXN1bHQ7DQorICAgICAgICAgICAgZGVzY3JpcHRvcnNCeU5hbWUuVHJ5R2V0VmFsdWUoZnVsbE5hbWUsIG91dCByZXN1bHQpOw0KKyAgICAgICAgICAgIFQgZGVzY3JpcHRvciA9IHJlc3VsdCBhcyBUOw0KKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZm9yZWFjaCAoRGVzY3JpcHRvclBvb2wgZGVwZW5kZW5jeSBpbiBkZXBlbmRlbmNpZXMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LmRlc2NyaXB0b3JzQnlOYW1lLlRyeUdldFZhbHVlKGZ1bGxOYW1lLCBvdXQgcmVzdWx0KTsNCisgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHJlc3VsdCBhcyBUOw0KKyAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBZGRzIGEgcGFja2FnZSB0byB0aGUgc3ltYm9sIHRhYmxlcy4gSWYgYSBwYWNrYWdlIGJ5IHRoZSBzYW1lIG5hbWUNCisgICAgICAgIC8vLyBhbHJlYWR5IGV4aXN0cywgdGhhdCBpcyBmaW5lLCBidXQgaWYgc29tZSBvdGhlciBraW5kIG9mIHN5bWJvbA0KKyAgICAgICAgLy8vIGV4aXN0cyB1bmRlciB0aGUgc2FtZSBuYW1lLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLiBJZiB0aGUgcGFja2FnZQ0KKyAgICAgICAgLy8vIGhhcyBtdWx0aXBsZSBjb21wb25lbnRzLCB0aGlzIGFsc28gYWRkcyB0aGUgcGFyZW50IHBhY2thZ2UocykuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBBZGRQYWNrYWdlKHN0cmluZyBmdWxsTmFtZSwgRmlsZURlc2NyaXB0b3IgZmlsZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgZG90cG9zID0gZnVsbE5hbWUuTGFzdEluZGV4T2YoJy4nKTsNCisgICAgICAgICAgICBTdHJpbmcgbmFtZTsNCisgICAgICAgICAgICBpZiAoZG90cG9zICE9IC0xKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQWRkUGFja2FnZShmdWxsTmFtZS5TdWJzdHJpbmcoMCwgZG90cG9zKSwgZmlsZSk7DQorICAgICAgICAgICAgICAgIG5hbWUgPSBmdWxsTmFtZS5TdWJzdHJpbmcoZG90cG9zICsgMSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIG5hbWUgPSBmdWxsTmFtZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgSURlc2NyaXB0b3Igb2xkOw0KKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yc0J5TmFtZS5UcnlHZXRWYWx1ZShmdWxsTmFtZSwgb3V0IG9sZCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoIShvbGQgaXMgUGFja2FnZURlc2NyaXB0b3IpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oZmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgbmFtZSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCAoYXMgc29tZXRoaW5nIG90aGVyIHRoYW4gYSAiICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSkgaW4gZmlsZSBcIiIgKyBvbGQuRmlsZS5OYW1lICsgIlwiLiIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlc2NyaXB0b3JzQnlOYW1lW2Z1bGxOYW1lXSA9IG5ldyBQYWNrYWdlRGVzY3JpcHRvcihuYW1lLCBmdWxsTmFtZSwgZmlsZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQWRkcyBhIHN5bWJvbCB0byB0aGUgc3ltYm9sIHRhYmxlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkRlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIj5UaGUgc3ltYm9sIGFscmVhZHkgZXhpc3RlZA0KKyAgICAgICAgLy8vIGluIHRoZSBzeW1ib2wgdGFibGUuPC9leGNlcHRpb24+DQorICAgICAgICBpbnRlcm5hbCB2b2lkIEFkZFN5bWJvbChJRGVzY3JpcHRvciBkZXNjcmlwdG9yKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFZhbGlkYXRlU3ltYm9sTmFtZShkZXNjcmlwdG9yKTsNCisgICAgICAgICAgICBTdHJpbmcgZnVsbE5hbWUgPSBkZXNjcmlwdG9yLkZ1bGxOYW1lOw0KKw0KKyAgICAgICAgICAgIElEZXNjcmlwdG9yIG9sZDsNCisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcnNCeU5hbWUuVHJ5R2V0VmFsdWUoZnVsbE5hbWUsIG91dCBvbGQpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW50IGRvdFBvcyA9IGZ1bGxOYW1lLkxhc3RJbmRleE9mKCcuJyk7DQorICAgICAgICAgICAgICAgIHN0cmluZyBtZXNzYWdlOw0KKyAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5GaWxlID09IG9sZC5GaWxlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZG90UG9zID09IC0xKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiXCIiICsgZnVsbE5hbWUgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkLiI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJcIiIgKyBmdWxsTmFtZS5TdWJzdHJpbmcoZG90UG9zICsgMSkgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIFwiIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxOYW1lLlN1YnN0cmluZygwLCBkb3RQb3MpICsgIlwiLiI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIlwiIiArIGZ1bGxOYW1lICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBmaWxlIFwiIiArIG9sZC5GaWxlLk5hbWUgKyAiXCIuIjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oZGVzY3JpcHRvciwgbWVzc2FnZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlc2NyaXB0b3JzQnlOYW1lW2Z1bGxOYW1lXSA9IGRlc2NyaXB0b3I7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSZWdleCBWYWxpZGF0aW9uUmVnZXggPSBuZXcgUmVnZXgoIl5bX0EtWmEtel1bX0EtWmEtejAtOV0qJCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWV3b3JrUG9ydGFiaWxpdHkuQ29tcGlsZWRSZWdleFdoZXJlQXZhaWxhYmxlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBWZXJpZmllcyB0aGF0IHRoZSBkZXNjcmlwdG9yJ3MgbmFtZSBpcyB2YWxpZCAoaS5lLiBpdCBjb250YWlucw0KKyAgICAgICAgLy8vIG9ubHkgbGV0dGVycywgZGlnaXRzIGFuZCB1bmRlcnNjb3JlcywgYW5kIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBkaWdpdCkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZXNjcmlwdG9yIj48L3BhcmFtPg0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBWYWxpZGF0ZVN5bWJvbE5hbWUoSURlc2NyaXB0b3IgZGVzY3JpcHRvcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5OYW1lID09ICIiKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKGRlc2NyaXB0b3IsICJNaXNzaW5nIG5hbWUuIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghVmFsaWRhdGlvblJlZ2V4LklzTWF0Y2goZGVzY3JpcHRvci5OYW1lKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihkZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIGRlc2NyaXB0b3IuTmFtZSArICJcIiBpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyLiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBmaWVsZCB3aXRoIHRoZSBnaXZlbiBudW1iZXIgaW4gdGhlIGdpdmVuIGRlc2NyaXB0b3IsDQorICAgICAgICAvLy8gb3IgbnVsbCBpZiBpdCBjYW4ndCBiZSBmb3VuZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnRlcm5hbCBGaWVsZERlc2NyaXB0b3IgRmluZEZpZWxkQnlOdW1iZXIoTWVzc2FnZURlc2NyaXB0b3IgbWVzc2FnZURlc2NyaXB0b3IsIGludCBudW1iZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIHJldDsNCisgICAgICAgICAgICBmaWVsZHNCeU51bWJlci5UcnlHZXRWYWx1ZShuZXcgRGVzY3JpcHRvckludFBhaXIobWVzc2FnZURlc2NyaXB0b3IsIG51bWJlciksIG91dCByZXQpOw0KKyAgICAgICAgICAgIHJldHVybiByZXQ7DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBFbnVtVmFsdWVEZXNjcmlwdG9yIEZpbmRFbnVtVmFsdWVCeU51bWJlcihFbnVtRGVzY3JpcHRvciBlbnVtRGVzY3JpcHRvciwgaW50IG51bWJlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yIHJldDsNCisgICAgICAgICAgICBlbnVtVmFsdWVzQnlOdW1iZXIuVHJ5R2V0VmFsdWUobmV3IERlc2NyaXB0b3JJbnRQYWlyKGVudW1EZXNjcmlwdG9yLCBudW1iZXIpLCBvdXQgcmV0KTsNCisgICAgICAgICAgICByZXR1cm4gcmV0Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFkZHMgYSBmaWVsZCB0byB0aGUgZmllbGRzQnlOdW1iZXIgdGFibGUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24iPkEgZmllbGQgd2l0aCB0aGUgc2FtZQ0KKyAgICAgICAgLy8vIGNvbnRhaW5pbmcgdHlwZSBhbmQgbnVtYmVyIGFscmVhZHkgZXhpc3RzLjwvZXhjZXB0aW9uPg0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBBZGRGaWVsZEJ5TnVtYmVyKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBEZXNjcmlwdG9ySW50UGFpciBrZXkgPSBuZXcgRGVzY3JpcHRvckludFBhaXIoZmllbGQuQ29udGFpbmluZ1R5cGUsIGZpZWxkLkZpZWxkTnVtYmVyKTsNCisgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3Igb2xkOw0KKyAgICAgICAgICAgIGlmIChmaWVsZHNCeU51bWJlci5UcnlHZXRWYWx1ZShrZXksIG91dCBvbGQpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKGZpZWxkLCAiRmllbGQgbnVtYmVyICIgKyBmaWVsZC5GaWVsZE51bWJlciArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcyBhbHJlYWR5IGJlZW4gdXNlZCBpbiBcIiIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLkNvbnRhaW5pbmdUeXBlLkZ1bGxOYW1lICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgYnkgZmllbGQgXCIiICsgb2xkLk5hbWUgKyAiXCIuIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZpZWxkc0J5TnVtYmVyW2tleV0gPSBmaWVsZDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBZGRzIGFuIGVudW0gdmFsdWUgdG8gdGhlIGVudW1WYWx1ZXNCeU51bWJlciB0YWJsZS4gSWYgYW4gZW51bSB2YWx1ZQ0KKyAgICAgICAgLy8vIHdpdGggdGhlIHNhbWUgdHlwZSBhbmQgbnVtYmVyIGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuDQorICAgICAgICAvLy8gKFRoaXMgaXMgYWxsb3dlZDsgdGhlIGZpcnN0IHZhbHVlIGRlZmluZWQgd2l0aCB0aGUgbnVtYmVyIHRha2VzIHByZWNlZGVuY2UuKQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIHZvaWQgQWRkRW51bVZhbHVlQnlOdW1iZXIoRW51bVZhbHVlRGVzY3JpcHRvciBlbnVtVmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgRGVzY3JpcHRvckludFBhaXIga2V5ID0gbmV3IERlc2NyaXB0b3JJbnRQYWlyKGVudW1WYWx1ZS5FbnVtRGVzY3JpcHRvciwgZW51bVZhbHVlLk51bWJlcik7DQorICAgICAgICAgICAgaWYgKCFlbnVtVmFsdWVzQnlOdW1iZXIuQ29udGFpbnNLZXkoa2V5KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGVudW1WYWx1ZXNCeU51bWJlcltrZXldID0gZW51bVZhbHVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBMb29rcyB1cCBhIGRlc2NyaXB0b3IgYnkgbmFtZSwgcmVsYXRpdmUgdG8gc29tZSBvdGhlciBkZXNjcmlwdG9yLg0KKyAgICAgICAgLy8vIFRoZSBuYW1lIG1heSBiZSBmdWxseS1xdWFsaWZpZWQgKHdpdGggYSBsZWFkaW5nICcuJyksIHBhcnRpYWxseS1xdWFsaWZpZWQsDQorICAgICAgICAvLy8gb3IgdW5xdWFsaWZpZWQuIEMrKy1saWtlIG5hbWUgbG9va3VwIHNlbWFudGljcyBhcmUgdXNlZCB0byBzZWFyY2ggZm9yIHRoZQ0KKyAgICAgICAgLy8vIG1hdGNoaW5nIGRlc2NyaXB0b3IuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIElEZXNjcmlwdG9yIExvb2t1cFN5bWJvbChzdHJpbmcgbmFtZSwgSURlc2NyaXB0b3IgcmVsYXRpdmVUbykNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBUT0RPKGpvbnNrZWV0KTogIFRoaXMgY291bGQgYmUgb3B0aW1pemVkIGluIGEgbnVtYmVyIG9mIHdheXMuDQorDQorICAgICAgICAgICAgSURlc2NyaXB0b3IgcmVzdWx0Ow0KKyAgICAgICAgICAgIGlmIChuYW1lLlN0YXJ0c1dpdGgoIi4iKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIEZ1bGx5LXF1YWxpZmllZCBuYW1lLg0KKyAgICAgICAgICAgICAgICByZXN1bHQgPSBGaW5kU3ltYm9sPElEZXNjcmlwdG9yPihuYW1lLlN1YnN0cmluZygxKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIElmICJuYW1lIiBpcyBhIGNvbXBvdW5kIGlkZW50aWZpZXIsIHdlIHdhbnQgdG8gc2VhcmNoIGZvciB0aGUNCisgICAgICAgICAgICAgICAgLy8gZmlyc3QgY29tcG9uZW50IG9mIGl0LCB0aGVuIHNlYXJjaCB3aXRoaW4gaXQgZm9yIHRoZSByZXN0Lg0KKyAgICAgICAgICAgICAgICBpbnQgZmlyc3RQYXJ0TGVuZ3RoID0gbmFtZS5JbmRleE9mKCcuJyk7DQorICAgICAgICAgICAgICAgIHN0cmluZyBmaXJzdFBhcnQgPSBmaXJzdFBhcnRMZW5ndGggPT0gLTEgPyBuYW1lIDogbmFtZS5TdWJzdHJpbmcoMCwgZmlyc3RQYXJ0TGVuZ3RoKTsNCisNCisgICAgICAgICAgICAgICAgLy8gV2Ugd2lsbCBzZWFyY2ggZWFjaCBwYXJlbnQgc2NvcGUgb2YgInJlbGF0aXZlVG8iIGxvb2tpbmcgZm9yIHRoZQ0KKyAgICAgICAgICAgICAgICAvLyBzeW1ib2wuDQorICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2NvcGVUb1RyeSA9IG5ldyBTdHJpbmdCdWlsZGVyKHJlbGF0aXZlVG8uRnVsbE5hbWUpOw0KKw0KKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hvcCBvZmYgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBzY29wZS4NCisNCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oam9uc2tlZXQpOiBNYWtlIHRoaXMgbW9yZSBlZmZpY2llbnQuIE1heSBub3QgYmUgd29ydGggdXNpbmcgU3RyaW5nQnVpbGRlciBhdCBhbGwNCisgICAgICAgICAgICAgICAgICAgIGludCBkb3Rwb3MgPSBzY29wZVRvVHJ5LlRvU3RyaW5nKCkuTGFzdEluZGV4T2YoIi4iKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChkb3Rwb3MgPT0gLTEpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRmluZFN5bWJvbDxJRGVzY3JpcHRvcj4obmFtZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVUb1RyeS5MZW5ndGggPSBkb3Rwb3MgKyAxOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBmaXJzdFBhcnQgYW5kIHRyeSB0byBmaW5kLg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlVG9UcnkuQXBwZW5kKGZpcnN0UGFydCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRmluZFN5bWJvbDxJRGVzY3JpcHRvcj4oc2NvcGVUb1RyeS5Ub1N0cmluZygpKTsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RQYXJ0TGVuZ3RoICE9IC0xKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IGZvdW5kIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBzeW1ib2wuICBOb3cgbG9vayBmb3INCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3aG9sZSB0aGluZy4gIElmIHRoaXMgZmFpbHMsIHdlICpkb24ndCogd2FudCB0byBrZWVwDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWFyY2hpbmcgcGFyZW50IHNjb3Blcy4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlVG9UcnkuTGVuZ3RoID0gZG90cG9zICsgMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlVG9UcnkuQXBwZW5kKG5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRmluZFN5bWJvbDxJRGVzY3JpcHRvcj4oc2NvcGVUb1RyeS5Ub1N0cmluZygpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IGZvdW5kLiAgUmVtb3ZlIHRoZSBuYW1lIHNvIHdlIGNhbiB0cnkgYWdhaW4uDQorICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVUb1RyeS5MZW5ndGggPSBkb3Rwb3M7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHJlbGF0aXZlVG8sICJcIiIgKyBuYW1lICsgIlwiIGlzIG5vdCBkZWZpbmVkLiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTdHJ1Y3QgdXNlZCB0byBob2xkIHRoZSBrZXlzIGZvciB0aGUgZmllbGRCeU51bWJlciB0YWJsZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0cnVjdCBEZXNjcmlwdG9ySW50UGFpciA6IElFcXVhdGFibGU8RGVzY3JpcHRvckludFBhaXI+DQorICAgICAgICB7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgbnVtYmVyOw0KKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSURlc2NyaXB0b3IgZGVzY3JpcHRvcjsNCisNCisgICAgICAgICAgICBpbnRlcm5hbCBEZXNjcmlwdG9ySW50UGFpcihJRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBpbnQgbnVtYmVyKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7DQorICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBib29sIEVxdWFscyhEZXNjcmlwdG9ySW50UGFpciBvdGhlcikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yID09IG90aGVyLmRlc2NyaXB0b3INCisgICAgICAgICAgICAgICAgICAgICAgICYmIG51bWJlciA9PSBvdGhlci5udW1iZXI7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKG9iaiBpcyBEZXNjcmlwdG9ySW50UGFpcikNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVxdWFscygoRGVzY3JpcHRvckludFBhaXIpIG9iaik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yLkdldEhhc2hDb2RlKCkqKCgxIDw8IDE2KSAtIDEpICsgbnVtYmVyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9EZXNjcmlwdG9yVXRpbC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL0Rlc2NyaXB0b3JVdGlsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZWZkYmUKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9EZXNjcmlwdG9yVXRpbC5jcwpAQCAtMCwwICsxLDY0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBJbnRlcm5hbCBjbGFzcyBjb250YWluaW5nIHV0aWxpdHkgbWV0aG9kcyB3aGVuIHdvcmtpbmcgd2l0aCBkZXNjcmlwdG9ycy4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIERlc2NyaXB0b3JVdGlsDQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBFcXVpdmFsZW50IHRvIEZ1bmNbVElucHV0LCBpbnQsIFRPdXRwdXRdIGJ1dCB1c2FibGUgaW4gLk5FVCAyLjAuIE9ubHkgdXNlZCB0byBjb252ZXJ0DQorICAgICAgICAvLy8gYXJyYXlzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIGRlbGVnYXRlIFRPdXRwdXQgSW5kZXhlZENvbnZlcnRlcjxUSW5wdXQsIFRPdXRwdXQ+KFRJbnB1dCBlbGVtZW50LCBpbnQgaW5kZXgpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnZlcnRzIHRoZSBnaXZlbiBhcnJheSBpbnRvIGEgcmVhZC1vbmx5IGxpc3QsIGFwcGx5aW5nIHRoZSBzcGVjaWZpZWQgY29udmVyc2lvbiB0bw0KKyAgICAgICAgLy8vIGVhY2ggaW5wdXQgZWxlbWVudC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgSUxpc3Q8VE91dHB1dD4gQ29udmVydEFuZE1ha2VSZWFkT25seTxUSW5wdXQsIFRPdXRwdXQ+KElMaXN0PFRJbnB1dD4gaW5wdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4ZWRDb252ZXJ0ZXI8VElucHV0LCBUT3V0cHV0Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRPdXRwdXRbXSBhcnJheSA9IG5ldyBUT3V0cHV0W2lucHV0LkNvdW50XTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lkxlbmd0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBjb252ZXJ0ZXIoaW5wdXRbaV0sIGkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gTGlzdHM8VE91dHB1dD4uQXNSZWFkT25seShhcnJheSk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24uY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9EZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDVkNjBkCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24uY3MKQEAgLTAsMCArMSw5MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQordXNpbmcgU3lzdGVtOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBUaHJvd24gd2hlbiBidWlsZGluZyBkZXNjcmlwdG9ycyBmYWlscyBiZWNhdXNlIHRoZSBzb3VyY2UgRGVzY3JpcHRvclByb3Rvcw0KKyAgICAvLy8gYXJlIG5vdCB2YWxpZC4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiA6IEV4Y2VwdGlvbg0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFN0cmluZyBuYW1lOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJTWVzc2FnZSBwcm90bzsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIGRlc2NyaXB0aW9uOw0KKw0KKyAgICAgICAgLy8vIDx2YWx1ZT4NCisgICAgICAgIC8vLyBUaGUgZnVsbCBuYW1lIG9mIHRoZSBkZXNjcmlwdG9yIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4NCisgICAgICAgIC8vLyA8L3ZhbHVlPg0KKyAgICAgICAgcHVibGljIFN0cmluZyBQcm9ibGVtU3ltYm9sTmFtZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBuYW1lOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHZhbHVlPg0KKyAgICAgICAgLy8vIFRoZSBwcm90b2NvbCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnZhbGlkIGRlc2NyaXB0b3IuDQorICAgICAgICAvLy8gPC92YWx1ZT4NCisgICAgICAgIHB1YmxpYyBJTWVzc2FnZSBQcm9ibGVtUHJvdG8NCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcHJvdG87IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuIChUaGUgTWVzc2FnZSBwcm9wZXJ0eQ0KKyAgICAgICAgLy8vIGlzIG1hZGUgdXAgb2YgdGhlIGRlc2NyaXB0b3IncyBuYW1lIGFuZCB0aGlzIGRlc2NyaXB0aW9uLikNCisgICAgICAgIC8vLyA8L3ZhbHVlPg0KKyAgICAgICAgcHVibGljIHN0cmluZyBEZXNjcmlwdGlvbg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdGlvbjsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oSURlc2NyaXB0b3IgcHJvYmxlbURlc2NyaXB0b3IsIHN0cmluZyBkZXNjcmlwdGlvbikgOg0KKyAgICAgICAgICAgIGJhc2UocHJvYmxlbURlc2NyaXB0b3IuRnVsbE5hbWUgKyAiOiAiICsgZGVzY3JpcHRpb24pDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHByb2JsZW1EZXNjcmlwdG9yIG1heSBiZSBwYXJ0aWFsbHkgdW5pbml0aWFsaXplZCwgc28gd2UNCisgICAgICAgICAgICAvLyBkb24ndCB3YW50IHRvIGV4cG9zZSBpdCBkaXJlY3RseSB0byB0aGUgdXNlci4gIFNvLCB3ZSBvbmx5IHByb3ZpZGUNCisgICAgICAgICAgICAvLyB0aGUgbmFtZSBhbmQgdGhlIG9yaWdpbmFsIHByb3RvLg0KKyAgICAgICAgICAgIG5hbWUgPSBwcm9ibGVtRGVzY3JpcHRvci5GdWxsTmFtZTsNCisgICAgICAgICAgICBwcm90byA9IHByb2JsZW1EZXNjcmlwdG9yLlByb3RvOw0KKyAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsNCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKElEZXNjcmlwdG9yIHByb2JsZW1EZXNjcmlwdG9yLCBzdHJpbmcgZGVzY3JpcHRpb24sIEV4Y2VwdGlvbiBjYXVzZSkgOg0KKyAgICAgICAgICAgIGJhc2UocHJvYmxlbURlc2NyaXB0b3IuRnVsbE5hbWUgKyAiOiAiICsgZGVzY3JpcHRpb24sIGNhdXNlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIG5hbWUgPSBwcm9ibGVtRGVzY3JpcHRvci5GdWxsTmFtZTsNCisgICAgICAgICAgICBwcm90byA9IHByb2JsZW1EZXNjcmlwdG9yLlByb3RvOw0KKyAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9FbnVtRGVzY3JpcHRvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL0VudW1EZXNjcmlwdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYjgxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9FbnVtRGVzY3JpcHRvci5jcwpAQCAtMCwwICsxLDEyNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBEZXNjcmlwdG9yIGZvciBhbiBlbnVtIHR5cGUgaW4gYSAucHJvdG8gZmlsZS4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBFbnVtRGVzY3JpcHRvciA6IEluZGV4ZWREZXNjcmlwdG9yQmFzZTxFbnVtRGVzY3JpcHRvclByb3RvLCBFbnVtT3B0aW9ucz4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRW51bUxpdGVNYXA8RW51bVZhbHVlRGVzY3JpcHRvcj4NCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZXNzYWdlRGVzY3JpcHRvciBjb250YWluaW5nVHlwZTsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUxpc3Q8RW51bVZhbHVlRGVzY3JpcHRvcj4gdmFsdWVzOw0KKw0KKyAgICAgICAgaW50ZXJuYWwgRW51bURlc2NyaXB0b3IoRW51bURlc2NyaXB0b3JQcm90byBwcm90bywgRmlsZURlc2NyaXB0b3IgZmlsZSwgTWVzc2FnZURlc2NyaXB0b3IgcGFyZW50LCBpbnQgaW5kZXgpDQorICAgICAgICAgICAgOiBiYXNlKHByb3RvLCBmaWxlLCBDb21wdXRlRnVsbE5hbWUoZmlsZSwgcGFyZW50LCBwcm90by5OYW1lKSwgaW5kZXgpDQorICAgICAgICB7DQorICAgICAgICAgICAgY29udGFpbmluZ1R5cGUgPSBwYXJlbnQ7DQorDQorICAgICAgICAgICAgaWYgKHByb3RvLlZhbHVlQ291bnQgPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBhbGxvdyBlbnVtcyB3aXRoIG5vIHZhbHVlcyBiZWNhdXNlIHRoaXMgd291bGQgbWVhbiB0aGVyZQ0KKyAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSBubyB2YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBmaWVsZHMgb2YgdGhpcyB0eXBlLg0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywgIkVudW1zIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgdmFsdWUuIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHZhbHVlcyA9IERlc2NyaXB0b3JVdGlsLkNvbnZlcnRBbmRNYWtlUmVhZE9ubHkocHJvdG8uVmFsdWVMaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlLCBpKSA9PiBuZXcgRW51bVZhbHVlRGVzY3JpcHRvcih2YWx1ZSwgZmlsZSwgdGhpcywgaSkpOw0KKw0KKyAgICAgICAgICAgIEZpbGUuRGVzY3JpcHRvclBvb2wuQWRkU3ltYm9sKHRoaXMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDx2YWx1ZT4NCisgICAgICAgIC8vLyBJZiB0aGlzIGlzIGEgbmVzdGVkIHR5cGUsIGdldCB0aGUgb3V0ZXIgZGVzY3JpcHRvciwgb3RoZXJ3aXNlIG51bGwuDQorICAgICAgICAvLy8gPC92YWx1ZT4NCisgICAgICAgIHB1YmxpYyBNZXNzYWdlRGVzY3JpcHRvciBDb250YWluaW5nVHlwZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBjb250YWluaW5nVHlwZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDx2YWx1ZT4NCisgICAgICAgIC8vLyBBbiB1bm1vZGlmaWFibGUgbGlzdCBvZiBkZWZpbmVkIHZhbHVlIGRlc2NyaXB0b3JzIGZvciB0aGlzIGVudW0uDQorICAgICAgICAvLy8gPC92YWx1ZT4NCisgICAgICAgIHB1YmxpYyBJTGlzdDxFbnVtVmFsdWVEZXNjcmlwdG9yPiBWYWx1ZXMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdmFsdWVzOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTG9naWMgbW92ZWQgZnJvbSBGaWVsZFNldCB0byBjb250aW51ZSBjdXJyZW50IGJlaGF2aW9yDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGJvb2wgSXNWYWxpZFZhbHVlKElFbnVtTGl0ZSB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gdmFsdWUgaXMgRW51bVZhbHVlRGVzY3JpcHRvciAmJiAoKEVudW1WYWx1ZURlc2NyaXB0b3IpIHZhbHVlKS5FbnVtRGVzY3JpcHRvciA9PSB0aGlzOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEZpbmRzIGFuIGVudW0gdmFsdWUgYnkgbnVtYmVyLiBJZiBtdWx0aXBsZSBlbnVtIHZhbHVlcyBoYXZlIHRoZQ0KKyAgICAgICAgLy8vIHNhbWUgbnVtYmVyLCB0aGlzIHJldHVybnMgdGhlIGZpcnN0IGRlZmluZWQgdmFsdWUgd2l0aCB0aGF0IG51bWJlci4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgRW51bVZhbHVlRGVzY3JpcHRvciBGaW5kVmFsdWVCeU51bWJlcihpbnQgbnVtYmVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBGaWxlLkRlc2NyaXB0b3JQb29sLkZpbmRFbnVtVmFsdWVCeU51bWJlcih0aGlzLCBudW1iZXIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgSUVudW1MaXRlIElFbnVtTGl0ZU1hcC5GaW5kVmFsdWVCeU51bWJlcihpbnQgbnVtYmVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBGaW5kVmFsdWVCeU51bWJlcihudW1iZXIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgSUVudW1MaXRlIElFbnVtTGl0ZU1hcC5GaW5kVmFsdWVCeU5hbWUoc3RyaW5nIG5hbWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEZpbmRWYWx1ZUJ5TmFtZShuYW1lKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBGaW5kcyBhbiBlbnVtIHZhbHVlIGJ5IG5hbWUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj5UaGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgdmFsdWUgKGUuZy4gIkZPTyIpLjwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+VGhlIHZhbHVlJ3MgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub3QgZm91bmQuPC9yZXR1cm5zPg0KKyAgICAgICAgcHVibGljIEVudW1WYWx1ZURlc2NyaXB0b3IgRmluZFZhbHVlQnlOYW1lKHN0cmluZyBuYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBGaWxlLkRlc2NyaXB0b3JQb29sLkZpbmRTeW1ib2w8RW51bVZhbHVlRGVzY3JpcHRvcj4oRnVsbE5hbWUgKyAiLiIgKyBuYW1lKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIHZvaWQgUmVwbGFjZVByb3RvKEVudW1EZXNjcmlwdG9yUHJvdG8gbmV3UHJvdG8pDQorICAgICAgICB7DQorICAgICAgICAgICAgYmFzZS5SZXBsYWNlUHJvdG8obmV3UHJvdG8pOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLkNvdW50OyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YWx1ZXNbaV0uUmVwbGFjZVByb3RvKG5ld1Byb3RvLkdldFZhbHVlKGkpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvRW51bVZhbHVlRGVzY3JpcHRvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL0VudW1WYWx1ZURlc2NyaXB0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiOWNiYgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL0VudW1WYWx1ZURlc2NyaXB0b3IuY3MKQEAgLTAsMCArMSw2MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBEZXNjcmlwdG9yIGZvciBhIHNpbmdsZSBlbnVtIHZhbHVlIHdpdGhpbiBhbiBlbnVtIGluIGEgLnByb3RvIGZpbGUuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvciA6IEluZGV4ZWREZXNjcmlwdG9yQmFzZTxFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8sIEVudW1WYWx1ZU9wdGlvbnM+LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRW51bUxpdGUNCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFbnVtRGVzY3JpcHRvciBlbnVtRGVzY3JpcHRvcjsNCisNCisgICAgICAgIGludGVybmFsIEVudW1WYWx1ZURlc2NyaXB0b3IoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHByb3RvLCBGaWxlRGVzY3JpcHRvciBmaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvciBwYXJlbnQsIGludCBpbmRleCkNCisgICAgICAgICAgICA6IGJhc2UocHJvdG8sIGZpbGUsIHBhcmVudC5GdWxsTmFtZSArICIuIiArIHByb3RvLk5hbWUsIGluZGV4KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGVudW1EZXNjcmlwdG9yID0gcGFyZW50Ow0KKyAgICAgICAgICAgIGZpbGUuRGVzY3JpcHRvclBvb2wuQWRkU3ltYm9sKHRoaXMpOw0KKyAgICAgICAgICAgIGZpbGUuRGVzY3JpcHRvclBvb2wuQWRkRW51bVZhbHVlQnlOdW1iZXIodGhpcyk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgaW50IE51bWJlcg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcm90by5OdW1iZXI7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBFbnVtRGVzY3JpcHRvciBFbnVtRGVzY3JpcHRvcg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBlbnVtRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL0ZpZWxkRGVzY3JpcHRvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL0ZpZWxkRGVzY3JpcHRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDE3YWUyCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvRmllbGREZXNjcmlwdG9yLmNzCkBAIC0wLDAgKzEsNjcxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3M7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIERlc2NyaXB0b3IgZm9yIGEgZmllbGQgb3IgZXh0ZW5zaW9uIHdpdGhpbiBhIG1lc3NhZ2UgaW4gYSAucHJvdG8gZmlsZS4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBGaWVsZERlc2NyaXB0b3IgOiBJbmRleGVkRGVzY3JpcHRvckJhc2U8RmllbGREZXNjcmlwdG9yUHJvdG8sIEZpZWxkT3B0aW9ucz4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNvbXBhcmFibGU8RmllbGREZXNjcmlwdG9yPiwgSUZpZWxkRGVzY3JpcHRvckxpdGUNCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZXNzYWdlRGVzY3JpcHRvciBleHRlbnNpb25TY29wZTsNCisgICAgICAgIHByaXZhdGUgRW51bURlc2NyaXB0b3IgZW51bVR5cGU7DQorICAgICAgICBwcml2YXRlIE1lc3NhZ2VEZXNjcmlwdG9yIG1lc3NhZ2VUeXBlOw0KKyAgICAgICAgcHJpdmF0ZSBNZXNzYWdlRGVzY3JpcHRvciBjb250YWluaW5nVHlwZTsNCisgICAgICAgIHByaXZhdGUgb2JqZWN0IGRlZmF1bHRWYWx1ZTsNCisgICAgICAgIHByaXZhdGUgRmllbGRUeXBlIGZpZWxkVHlwZTsNCisgICAgICAgIHByaXZhdGUgTWFwcGVkVHlwZSBtYXBwZWRUeXBlOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBDU2hhcnBGaWVsZE9wdGlvbnMgY3NoYXJwRmllbGRPcHRpb25zOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3Qgb3B0aW9uc0xvY2sgPSBuZXcgb2JqZWN0KCk7DQorDQorICAgICAgICBpbnRlcm5hbCBGaWVsZERlc2NyaXB0b3IoRmllbGREZXNjcmlwdG9yUHJvdG8gcHJvdG8sIEZpbGVEZXNjcmlwdG9yIGZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZURlc2NyaXB0b3IgcGFyZW50LCBpbnQgaW5kZXgsIGJvb2wgaXNFeHRlbnNpb24pDQorICAgICAgICAgICAgOiBiYXNlKHByb3RvLCBmaWxlLCBDb21wdXRlRnVsbE5hbWUoZmlsZSwgcGFyZW50LCBwcm90by5OYW1lKSwgaW5kZXgpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHByb3RvLkhhc1R5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBmaWVsZFR5cGUgPSBHZXRGaWVsZFR5cGVGcm9tUHJvdG9UeXBlKHByb3RvLlR5cGUpOw0KKyAgICAgICAgICAgICAgICBtYXBwZWRUeXBlID0gRmllbGRUeXBlVG9NYXBwZWRUeXBlTWFwW2ZpZWxkVHlwZV07DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmIChGaWVsZE51bWJlciA8PSAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmllbGQgbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzLiIpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAoaXNFeHRlbnNpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoIXByb3RvLkhhc0V4dGVuZGVlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmllbGREZXNjcmlwdG9yUHJvdG8uRXh0ZW5kZWUgbm90IHNldCBmb3IgZXh0ZW5zaW9uIGZpZWxkLiIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdUeXBlID0gbnVsbDsgLy8gV2lsbCBiZSBmaWxsZWQgaW4gd2hlbiBjcm9zcy1saW5raW5nDQorICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uU2NvcGUgPSBwYXJlbnQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25TY29wZSA9IG51bGw7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKHByb3RvLkhhc0V4dGVuZGVlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmllbGREZXNjcmlwdG9yUHJvdG8uRXh0ZW5kZWUgc2V0IGZvciBub24tZXh0ZW5zaW9uIGZpZWxkLiIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdUeXBlID0gcGFyZW50Ow0KKyAgICAgICAgICAgICAgICBleHRlbnNpb25TY29wZSA9IG51bGw7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZpbGUuRGVzY3JpcHRvclBvb2wuQWRkU3ltYm9sKHRoaXMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBDU2hhcnBGaWVsZE9wdGlvbnMgQnVpbGRPckZha2VDU2hhcnBPcHRpb25zKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBUT0RPKGpvbnNrZWV0KTogQ2hlY2sgaWYgd2UgY291bGQgdXNlIEZpbGVEZXNjcmlwdG9yUHJvdG8uRGVzY3JpcHRvci5OYW1lIC0gaW50ZXJlc3RpbmcgYm9vdHN0cmFwIGlzc3Vlcw0KKyAgICAgICAgICAgIGlmIChGaWxlLlByb3RvLk5hbWUgPT0gImdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoTmFtZSA9PSAiY3NoYXJwX2ZpZWxkX29wdGlvbnMiKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENTaGFycEZpZWxkT3B0aW9ucy5CdWlsZGVyIHtQcm9wZXJ0eU5hbWUgPSAiQ1NoYXJwRmllbGRPcHRpb25zIn0uQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoTmFtZSA9PSAiY3NoYXJwX2ZpbGVfb3B0aW9ucyIpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ1NoYXJwRmllbGRPcHRpb25zLkJ1aWxkZXIge1Byb3BlcnR5TmFtZSA9ICJDU2hhcnBGaWxlT3B0aW9ucyJ9LkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ1NoYXJwRmllbGRPcHRpb25zLkJ1aWxkZXIgYnVpbGRlciA9IENTaGFycEZpZWxkT3B0aW9ucy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgaWYgKFByb3RvLk9wdGlvbnMuSGFzRXh0ZW5zaW9uKERlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5DU2hhcnBGaWVsZE9wdGlvbnMpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYnVpbGRlci5NZXJnZUZyb20oUHJvdG8uT3B0aW9ucy5HZXRFeHRlbnNpb24oRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLkNTaGFycEZpZWxkT3B0aW9ucykpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoIWJ1aWxkZXIuSGFzUHJvcGVydHlOYW1lKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSA9IEZpZWxkVHlwZSA9PSBGaWVsZFR5cGUuR3JvdXAgPyBNZXNzYWdlVHlwZS5OYW1lIDogTmFtZTsNCisgICAgICAgICAgICAgICAgc3RyaW5nIHByb3BlcnR5TmFtZSA9IE5hbWVIZWxwZXJzLlVuZGVyc2NvcmVzVG9QYXNjYWxDYXNlKGZpZWxkTmFtZSk7DQorICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT0gQ29udGFpbmluZ1R5cGUuTmFtZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lICs9ICJfIjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBidWlsZGVyLlByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuQnVpbGQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBNYXBzIGEgZmllbGQgdHlwZSBhcyBpbmNsdWRlZCBpbiB0aGUgLnByb3RvIGZpbGUgdG8gYSBGaWVsZFR5cGUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRmllbGRUeXBlIEdldEZpZWxkVHlwZUZyb21Qcm90b1R5cGUoRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZSB0eXBlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZS5UWVBFX0RPVUJMRToNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGUuRG91YmxlOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLlR5cGUuVFlQRV9GTE9BVDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGUuRmxvYXQ7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZS5UWVBFX0lOVDY0Og0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZS5JbnQ2NDsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLlRZUEVfVUlOVDY0Og0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZS5VSW50NjQ7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZS5UWVBFX0lOVDMyOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZS5JbnQzMjsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLlRZUEVfRklYRUQ2NDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGUuRml4ZWQ2NDsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLlRZUEVfRklYRUQzMjoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGUuRml4ZWQzMjsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLlRZUEVfQk9PTDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGUuQm9vbDsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLlRZUEVfU1RSSU5HOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZS5TdHJpbmc7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZS5UWVBFX0dST1VQOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZS5Hcm91cDsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLlRZUEVfTUVTU0FHRToNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGUuTWVzc2FnZTsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLlRZUEVfQllURVM6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLkJ5dGVzOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLlR5cGUuVFlQRV9VSU5UMzI6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLlVJbnQzMjsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLlRZUEVfRU5VTToNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGUuRW51bTsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLlRZUEVfU0ZJWEVEMzI6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLlNGaXhlZDMyOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLlR5cGUuVFlQRV9TRklYRUQ2NDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGUuU0ZpeGVkNjQ7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZS5UWVBFX1NJTlQzMjoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGUuU0ludDMyOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLlR5cGUuVFlQRV9TSU5UNjQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLlNJbnQ2NDsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB0eXBlIHNwZWNpZmllZCIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIG1hcHBlZCB0eXBlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBHZXREZWZhdWx0VmFsdWVGb3JNYXBwZWRUeXBlKE1hcHBlZFR5cGUgdHlwZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuSW50MzI6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICAgICAgY2FzZSBNYXBwZWRUeXBlLkludDY0Og0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChsb25nKSAwOw0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuVUludDMyOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50KSAwOw0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuVUludDY0Og0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1bG9uZykgMDsNCisgICAgICAgICAgICAgICAgY2FzZSBNYXBwZWRUeXBlLlNpbmdsZToNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmxvYXQpIDA7DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5Eb3VibGU6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGRvdWJsZSkgMDsNCisgICAgICAgICAgICAgICAgY2FzZSBNYXBwZWRUeXBlLkJvb2xlYW46DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5TdHJpbmc6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5CeXRlU3RyaW5nOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcuRW1wdHk7DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5NZXNzYWdlOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5FbnVtOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdHlwZSBzcGVjaWZpZWQiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBJc1JlcXVpcmVkDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByb3RvLkxhYmVsID09IEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLkxhYmVsLkxBQkVMX1JFUVVJUkVEOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBJc09wdGlvbmFsDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByb3RvLkxhYmVsID09IEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLkxhYmVsLkxBQkVMX09QVElPTkFMOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBJc1JlcGVhdGVkDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByb3RvLkxhYmVsID09IEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLkxhYmVsLkxBQkVMX1JFUEVBVEVEOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBJc1BhY2tlZA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcm90by5PcHRpb25zLlBhY2tlZDsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDx2YWx1bGU+DQorICAgICAgICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBmaWVsZCBoYWQgYW4gZXhwbGljaXRseS1kZWZpbmVkIGRlZmF1bHQgdmFsdWUuDQorICAgICAgICAvLy8gPC92YWx1ZT4NCisgICAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRWYWx1ZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcm90by5IYXNEZWZhdWx0VmFsdWU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gVGhlIGZpZWxkJ3MgZGVmYXVsdCB2YWx1ZS4gVmFsaWQgZm9yIGFsbCB0eXBlcyBleGNlcHQgbWVzc2FnZXMNCisgICAgICAgIC8vLyBhbmQgZ3JvdXBzLiBGb3IgYWxsIG90aGVyIHR5cGVzLCB0aGUgb2JqZWN0IHJldHVybmVkIGlzIG9mIHRoZQ0KKyAgICAgICAgLy8vIHNhbWUgY2xhc3MgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBieSBJTWVzc2FnZVt0aGlzXS4NCisgICAgICAgIC8vLyBGb3IgcmVwZWF0ZWQgZmllbGRzIHRoaXMgd2lsbCBhbHdheXMgYmUgYW4gZW1wdHkgaW1tdXRhYmxlIGxpc3QgY29tcGF0aWJsZSB3aXRoIElMaXN0W29iamVjdF0uDQorICAgICAgICAvLy8gRm9yIG1lc3NhZ2UgZmllbGRzIGl0IHdpbGwgYWx3YXlzIGJlIG51bGwuIEZvciBzaW5ndWxhciB2YWx1ZXMsIGl0IHdpbGwgZGVwZW5kIG9uIHRoZSBkZXNjcmlwdG9yLg0KKyAgICAgICAgLy8vIDwvdmFsdWU+DQorICAgICAgICBwdWJsaWMgb2JqZWN0IERlZmF1bHRWYWx1ZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKE1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5NZXNzYWdlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgICAgICAgICAiRmllbGREZXNjcmlwdG9yLkRlZmF1bHRWYWx1ZSBjYWxsZWQgb24gYW4gZW1iZWRkZWQgbWVzc2FnZSBmaWVsZC4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoaXMgZmllbGQgaXMgYW4gZXh0ZW5zaW9uLg0KKyAgICAgICAgLy8vIDwvdmFsdWU+DQorICAgICAgICBwdWJsaWMgYm9vbCBJc0V4dGVuc2lvbg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcm90by5IYXNFeHRlbmRlZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLyoNCisgICAgICogR2V0IHRoZSBmaWVsZCdzIGNvbnRhaW5pbmcgdHlwZS4gRm9yIGV4dGVuc2lvbnMsIHRoaXMgaXMgdGhlIHR5cGUgYmVpbmcNCisgICAgICogZXh0ZW5kZWQsIG5vdCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGV4dGVuc2lvbiB3YXMgZGVmaW5lZC4gIFNlZQ0KKyAgICAgKiB7QGxpbmsgI2dldEV4dGVuc2lvblNjb3BlKCl9Lg0KKyAgICAgKi8NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXQgdGhlIGZpZWxkJ3MgY29udGFpbmluZyB0eXBlLiBGb3IgZXh0ZW5zaW9ucywgdGhpcyBpcyB0aGUgdHlwZSBiZWluZw0KKyAgICAgICAgLy8vIGV4dGVuZGVkLCBub3QgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBleHRlbnNpb24gd2FzIGRlZmluZWQuIFNlZQ0KKyAgICAgICAgLy8vIDxzZWUgY3JlZj0iRXh0ZW5zaW9uU2NvcGUiIC8+Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBNZXNzYWdlRGVzY3JpcHRvciBDb250YWluaW5nVHlwZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBjb250YWluaW5nVHlwZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIEMjLXNwZWNpZmljIG9wdGlvbnMgZm9yIHRoaXMgZmllbGQgZGVzY3JpcHRvci4gVGhpcyB3aWxsIGFsd2F5cyBiZQ0KKyAgICAgICAgLy8vIGNvbXBsZXRlbHkgZmlsbGVkIGluLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBDU2hhcnBGaWVsZE9wdGlvbnMgQ1NoYXJwT3B0aW9ucw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbG9jayAob3B0aW9uc0xvY2spDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjc2hhcnBGaWVsZE9wdGlvbnMgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjc2hhcnBGaWVsZE9wdGlvbnMgPSBCdWlsZE9yRmFrZUNTaGFycE9wdGlvbnMoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gY3NoYXJwRmllbGRPcHRpb25zOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBGb3IgZXh0ZW5zaW9ucyBkZWZpbmVkIG5lc3RlZCB3aXRoaW4gbWVzc2FnZSB0eXBlcywgZ2V0cw0KKyAgICAgICAgLy8vIHRoZSBvdXRlciB0eXBlLiBOb3QgdmFsaWQgZm9yIG5vbi1leHRlbnNpb24gZmllbGRzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8ZXhhbXBsZT4NCisgICAgICAgIC8vLyA8Y29kZT4NCisgICAgICAgIC8vLyBtZXNzYWdlIEZvbyB7DQorICAgICAgICAvLy8gICBleHRlbnNpb25zIDEwMDAgdG8gbWF4Ow0KKyAgICAgICAgLy8vIH0NCisgICAgICAgIC8vLyBleHRlbmQgRm9vIHsNCisgICAgICAgIC8vLyAgIG9wdGlvbmFsIGludDMyIGJheiA9IDEyMzQ7DQorICAgICAgICAvLy8gfQ0KKyAgICAgICAgLy8vIG1lc3NhZ2UgQmFyIHsNCisgICAgICAgIC8vLyAgIGV4dGVuZCBGb28gew0KKyAgICAgICAgLy8vICAgICBvcHRpb25hbCBpbnQzMiBxdXggPSA0MzIxOw0KKyAgICAgICAgLy8vICAgfQ0KKyAgICAgICAgLy8vIH0NCisgICAgICAgIC8vLyA8L2NvZGU+DQorICAgICAgICAvLy8gVGhlIGNvbnRhaW5pbmcgdHlwZSBmb3IgYm90aCA8Yz5iYXo8L2M+IGFuZCA8Yz5xdXg8L2M+IGlzIDxjPkZvbzwvYz4uDQorICAgICAgICAvLy8gSG93ZXZlciwgdGhlIGV4dGVuc2lvbiBzY29wZSBmb3IgPGM+YmF6PC9jPiBpcyA8Yz5udWxsPC9jPiB3aGlsZQ0KKyAgICAgICAgLy8vIHRoZSBleHRlbnNpb24gc2NvcGUgZm9yIDxjPnF1eDwvYz4gaXMgPGM+QmFyPC9jPi4NCisgICAgICAgIC8vLyA8L2V4YW1wbGU+DQorICAgICAgICBwdWJsaWMgTWVzc2FnZURlc2NyaXB0b3IgRXh0ZW5zaW9uU2NvcGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmICghSXNFeHRlbnNpb24pDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGlzIGZpZWxkIGlzIG5vdCBhbiBleHRlbnNpb24uIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGV4dGVuc2lvblNjb3BlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBNYXBwZWRUeXBlIE1hcHBlZFR5cGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbWFwcGVkVHlwZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIEZpZWxkVHlwZSBGaWVsZFR5cGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGRUeXBlOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBJc0NMU0NvbXBsaWFudA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCANCisgICAgICAgICAgICB7IA0KKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGVkVHlwZSAhPSBNYXBwZWRUeXBlLlVJbnQzMiAmJiANCisgICAgICAgICAgICAgICAgICAgIG1hcHBlZFR5cGUgIT0gTWFwcGVkVHlwZS5VSW50NjQgJiYNCisgICAgICAgICAgICAgICAgICAgICFOYW1lSGVscGVycy5VbmRlcnNjb3Jlc1RvUGFzY2FsQ2FzZShOYW1lKS5TdGFydHNXaXRoKCJfIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGludCBGaWVsZE51bWJlcg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcm90by5OdW1iZXI7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wYXJlcyB0aGlzIGRlc2NyaXB0b3Igd2l0aCBhbm90aGVyIG9uZSwgb3JkZXJpbmcgaW4gImNhbm9uaWNhbCIgb3JkZXINCisgICAgICAgIC8vLyB3aGljaCBzaW1wbHkgbWVhbnMgYXNjZW5kaW5nIG9yZGVyIGJ5IGZpZWxkIG51bWJlci4gPHBhcmFtcmVmIG5hbWU9Im90aGVyIi8+DQorICAgICAgICAvLy8gbXVzdCBiZSBhIGZpZWxkIG9mIHRoZSBzYW1lIHR5cGUsIGkuZS4gdGhlIDxzZWUgY3JlZj0iQ29udGFpbmluZ1R5cGUiLz4gb2YNCisgICAgICAgIC8vLyBib3RoIGZpZWxkcyBtdXN0IGJlIHRoZSBzYW1lLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBpbnQgQ29tcGFyZVRvKEZpZWxkRGVzY3JpcHRvciBvdGhlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAob3RoZXIuY29udGFpbmluZ1R5cGUgIT0gY29udGFpbmluZ1R5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkRGVzY3JpcHRvcnMgY2FuIG9ubHkgYmUgY29tcGFyZWQgdG8gb3RoZXIgRmllbGREZXNjcmlwdG9ycyAiICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgZmllbGRzIG9mIHRoZSBzYW1lIG1lc3NhZ2UgdHlwZS4iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIEZpZWxkTnVtYmVyIC0gb3RoZXIuRmllbGROdW1iZXI7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcGFyZXMgdGhpcyBkZXNjcmlwdG9yIHdpdGggYW5vdGhlciBvbmUsIG9yZGVyaW5nIGluICJjYW5vbmljYWwiIG9yZGVyDQorICAgICAgICAvLy8gd2hpY2ggc2ltcGx5IG1lYW5zIGFzY2VuZGluZyBvcmRlciBieSBmaWVsZCBudW1iZXIuIDxwYXJhbXJlZiBuYW1lPSJvdGhlciIvPg0KKyAgICAgICAgLy8vIG11c3QgYmUgYSBmaWVsZCBvZiB0aGUgc2FtZSB0eXBlLCBpLmUuIHRoZSA8c2VlIGNyZWY9IkNvbnRhaW5pbmdUeXBlIi8+IG9mDQorICAgICAgICAvLy8gYm90aCBmaWVsZHMgbXVzdCBiZSB0aGUgc2FtZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgaW50IENvbXBhcmVUbyhJRmllbGREZXNjcmlwdG9yTGl0ZSBvdGhlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gRmllbGROdW1iZXIgLSBvdGhlci5GaWVsZE51bWJlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIElFbnVtTGl0ZU1hcCBJRmllbGREZXNjcmlwdG9yTGl0ZS5FbnVtVHlwZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBFbnVtVHlwZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgYm9vbCBJRmllbGREZXNjcmlwdG9yTGl0ZS5NZXNzYWdlU2V0V2lyZUZvcm1hdA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBDb250YWluaW5nVHlwZS5PcHRpb25zLk1lc3NhZ2VTZXRXaXJlRm9ybWF0OyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRm9yIGVudW0gZmllbGRzLCByZXR1cm5zIHRoZSBmaWVsZCdzIHR5cGUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIEVudW1EZXNjcmlwdG9yIEVudW1UeXBlDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoTWFwcGVkVHlwZSAhPSBNYXBwZWRUeXBlLkVudW0pDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJFbnVtVHlwZSBpcyBvbmx5IHZhbGlkIGZvciBlbnVtIGZpZWxkcy4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gZW51bVR5cGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEZvciBlbWJlZGRlZCBtZXNzYWdlIGFuZCBncm91cCBmaWVsZHMsIHJldHVybnMgdGhlIGZpZWxkJ3MgdHlwZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgTWVzc2FnZURlc2NyaXB0b3IgTWVzc2FnZVR5cGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChNYXBwZWRUeXBlICE9IE1hcHBlZFR5cGUuTWVzc2FnZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIk1lc3NhZ2VUeXBlIGlzIG9ubHkgdmFsaWQgZm9yIGVudW0gZmllbGRzLiIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlVHlwZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSW1tdXRhYmxlIG1hcHBpbmcgZnJvbSBmaWVsZCB0eXBlIHRvIG1hcHBlZCB0eXBlLiBCdWlsdCB1c2luZyB0aGUgYXR0cmlidXRlcyBvbg0KKyAgICAgICAgLy8vIEZpZWxkVHlwZSB2YWx1ZXMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBJRGljdGlvbmFyeTxGaWVsZFR5cGUsIE1hcHBlZFR5cGU+IEZpZWxkVHlwZVRvTWFwcGVkVHlwZU1hcCA9IE1hcEZpZWxkVHlwZXMoKTsNCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIElEaWN0aW9uYXJ5PEZpZWxkVHlwZSwgTWFwcGVkVHlwZT4gTWFwRmllbGRUeXBlcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBEaWN0aW9uYXJ5PEZpZWxkVHlwZSwgTWFwcGVkVHlwZT4oKTsNCisgICAgICAgICAgICBmb3JlYWNoIChGaWVsZEluZm8gZmllbGQgaW4gdHlwZW9mKEZpZWxkVHlwZSkuR2V0RmllbGRzKEJpbmRpbmdGbGFncy5TdGF0aWMgfCBCaW5kaW5nRmxhZ3MuUHVibGljKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEZpZWxkVHlwZSBmaWVsZFR5cGUgPSAoRmllbGRUeXBlKSBmaWVsZC5HZXRWYWx1ZShudWxsKTsNCisgICAgICAgICAgICAgICAgRmllbGRNYXBwaW5nQXR0cmlidXRlIG1hcHBpbmcgPQ0KKyAgICAgICAgICAgICAgICAgICAgKEZpZWxkTWFwcGluZ0F0dHJpYnV0ZSkgZmllbGQuR2V0Q3VzdG9tQXR0cmlidXRlcyh0eXBlb2YoRmllbGRNYXBwaW5nQXR0cmlidXRlKSwgZmFsc2UpWzBdOw0KKyAgICAgICAgICAgICAgICBtYXBbZmllbGRUeXBlXSA9IG1hcHBpbmcuTWFwcGVkVHlwZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIERpY3Rpb25hcmllcy5Bc1JlYWRPbmx5KG1hcCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTG9vayB1cCBhbmQgY3Jvc3MtbGluayBhbGwgZmllbGQgdHlwZXMgZXRjLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIHZvaWQgQ3Jvc3NMaW5rKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoUHJvdG8uSGFzRXh0ZW5kZWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBJRGVzY3JpcHRvciBleHRlbmRlZSA9IEZpbGUuRGVzY3JpcHRvclBvb2wuTG9va3VwU3ltYm9sKFByb3RvLkV4dGVuZGVlLCB0aGlzKTsNCisgICAgICAgICAgICAgICAgaWYgKCEoZXh0ZW5kZWUgaXMgTWVzc2FnZURlc2NyaXB0b3IpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywgIlwiIiArIFByb3RvLkV4dGVuZGVlICsgIlwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb250YWluaW5nVHlwZSA9IChNZXNzYWdlRGVzY3JpcHRvcikgZXh0ZW5kZWU7DQorDQorICAgICAgICAgICAgICAgIGlmICghY29udGFpbmluZ1R5cGUuSXNFeHRlbnNpb25OdW1iZXIoRmllbGROdW1iZXIpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgY29udGFpbmluZ1R5cGUuRnVsbE5hbWUgKyAiXCIgZG9lcyBub3QgZGVjbGFyZSAiICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZE51bWJlciArICIgYXMgYW4gZXh0ZW5zaW9uIG51bWJlci4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAoUHJvdG8uSGFzVHlwZU5hbWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBJRGVzY3JpcHRvciB0eXBlRGVzY3JpcHRvciA9DQorICAgICAgICAgICAgICAgICAgICBGaWxlLkRlc2NyaXB0b3JQb29sLkxvb2t1cFN5bWJvbChQcm90by5UeXBlTmFtZSwgdGhpcyk7DQorDQorICAgICAgICAgICAgICAgIGlmICghUHJvdG8uSGFzVHlwZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hvb3NlIGZpZWxkIHR5cGUgYmFzZWQgb24gc3ltYm9sLg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVEZXNjcmlwdG9yIGlzIE1lc3NhZ2VEZXNjcmlwdG9yKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVHlwZSA9IEZpZWxkVHlwZS5NZXNzYWdlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZFR5cGUgPSBNYXBwZWRUeXBlLk1lc3NhZ2U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlRGVzY3JpcHRvciBpcyBFbnVtRGVzY3JpcHRvcikNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFR5cGUgPSBGaWVsZFR5cGUuRW51bTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRUeXBlID0gTWFwcGVkVHlwZS5FbnVtOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLCAiXCIiICsgUHJvdG8uVHlwZU5hbWUgKyAiXCIgaXMgbm90IGEgdHlwZS4iKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBpZiAoTWFwcGVkVHlwZSA9PSBNYXBwZWRUeXBlLk1lc3NhZ2UpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICghKHR5cGVEZXNjcmlwdG9yIGlzIE1lc3NhZ2VEZXNjcmlwdG9yKSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIFByb3RvLlR5cGVOYW1lICsgIlwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS4iKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlID0gKE1lc3NhZ2VEZXNjcmlwdG9yKSB0eXBlRGVzY3JpcHRvcjsNCisNCisgICAgICAgICAgICAgICAgICAgIGlmIChQcm90by5IYXNEZWZhdWx0VmFsdWUpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsICJNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHQgdmFsdWVzLiIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE1hcHBlZFR5cGUgPT0gRGVzY3JpcHRvcnMuTWFwcGVkVHlwZS5FbnVtKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoISh0eXBlRGVzY3JpcHRvciBpcyBFbnVtRGVzY3JpcHRvcikpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsICJcIiIgKyBQcm90by5UeXBlTmFtZSArICJcIiBpcyBub3QgYW4gZW51bSB0eXBlLiIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZW51bVR5cGUgPSAoRW51bURlc2NyaXB0b3IpIHR5cGVEZXNjcmlwdG9yOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsICJGaWVsZCB3aXRoIHByaW1pdGl2ZSB0eXBlIGhhcyB0eXBlX25hbWUuIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKE1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5NZXNzYWdlIHx8IE1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5FbnVtKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywgIkZpZWxkIHdpdGggbWVzc2FnZSBvciBlbnVtIHR5cGUgbWlzc2luZyB0eXBlX25hbWUuIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8gV2UgZG9uJ3QgYXR0ZW1wdCB0byBwYXJzZSB0aGUgZGVmYXVsdCB2YWx1ZSB1bnRpbCBoZXJlIGJlY2F1c2UgZm9yDQorICAgICAgICAgICAgLy8gZW51bXMgd2UgbmVlZCB0aGUgZW51bSB0eXBlJ3MgZGVzY3JpcHRvci4NCisgICAgICAgICAgICBpZiAoUHJvdG8uSGFzRGVmYXVsdFZhbHVlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKElzUmVwZWF0ZWQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLCAiUmVwZWF0ZWQgZmllbGRzIGNhbm5vdCBoYXZlIGRlZmF1bHQgdmFsdWVzLiIpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKEZpZWxkVHlwZSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQzMjoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TSW50MzI6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IFRleHRGb3JtYXQuUGFyc2VJbnQzMihQcm90by5EZWZhdWx0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50MzI6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRml4ZWQzMjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gVGV4dEZvcm1hdC5QYXJzZVVJbnQzMihQcm90by5EZWZhdWx0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TSW50NjQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkNjQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IFRleHRGb3JtYXQuUGFyc2VJbnQ2NChQcm90by5EZWZhdWx0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50NjQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRml4ZWQ2NDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gVGV4dEZvcm1hdC5QYXJzZVVJbnQ2NChQcm90by5EZWZhdWx0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GbG9hdDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gVGV4dEZvcm1hdC5QYXJzZUZsb2F0KFByb3RvLkRlZmF1bHRWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkRvdWJsZToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gVGV4dEZvcm1hdC5QYXJzZURvdWJsZShQcm90by5EZWZhdWx0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Cb29sOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHJvdG8uRGVmYXVsdFZhbHVlID09ICJ0cnVlIikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChQcm90by5EZWZhdWx0VmFsdWUgPT0gImZhbHNlIikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJCb29sZWFuIHZhbHVlcyBtdXN0IGJlIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIiIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlN0cmluZzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gUHJvdG8uRGVmYXVsdFZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5CeXRlczoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IFRleHRGb3JtYXQuVW5lc2NhcGVCeXRlcyhQcm90by5EZWZhdWx0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24gZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IHBhcnNlIGRlZmF1bHQgdmFsdWU6ICIgKyBlLk1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkVudW06DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGVudW1UeXBlLkZpbmRWYWx1ZUJ5TmFtZShQcm90by5EZWZhdWx0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGVudW0gZGVmYXVsdCB2YWx1ZTogXCIiICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90by5EZWZhdWx0VmFsdWUgKyAiXCIiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5NZXNzYWdlOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkdyb3VwOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywgIk1lc3NhZ2UgdHlwZSBoYWQgZGVmYXVsdCB2YWx1ZS4iKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHZhbGlkYXRpb25FeGNlcHRpb24gPQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHBhcnNlIGRlZmF1bHQgdmFsdWU6IFwiIiArIFByb3RvLkRlZmF1bHRWYWx1ZSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIsIGUpOw0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgdmFsaWRhdGlvbkV4Y2VwdGlvbjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgZGVmYXVsdCBmb3IgdGhpcyBmaWVsZC4NCisgICAgICAgICAgICAgICAgaWYgKElzUmVwZWF0ZWQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IExpc3RzPG9iamVjdD4uRW1wdHk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKE1hcHBlZFR5cGUpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNYXBwZWRUeXBlLkVudW06DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGd1YXJhbnRlZSBlbHNld2hlcmUgdGhhdCBhbiBlbnVtIHR5cGUgYWx3YXlzIGhhcyBhdCBsZWFzdA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUgcG9zc2libGUgdmFsdWUuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGVudW1UeXBlLlZhbHVlc1swXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNYXBwZWRUeXBlLk1lc3NhZ2U6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IG51bGw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IEdldERlZmF1bHRWYWx1ZUZvck1hcHBlZFR5cGUoTWFwcGVkVHlwZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmICghSXNFeHRlbnNpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBGaWxlLkRlc2NyaXB0b3JQb29sLkFkZEZpZWxkQnlOdW1iZXIodGhpcyk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmIChjb250YWluaW5nVHlwZSAhPSBudWxsICYmIGNvbnRhaW5pbmdUeXBlLk9wdGlvbnMuTWVzc2FnZVNldFdpcmVGb3JtYXQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoSXNFeHRlbnNpb24pDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICghSXNPcHRpb25hbCB8fCBGaWVsZFR5cGUgIT0gRmllbGRUeXBlLk1lc3NhZ2UpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHRlbnNpb25zIG9mIE1lc3NhZ2VTZXRzIG11c3QgYmUgb3B0aW9uYWwgbWVzc2FnZXMuIik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywgIk1lc3NhZ2VTZXRzIGNhbm5vdCBoYXZlIGZpZWxkcywgb25seSBleHRlbnNpb25zLiIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL0ZpZWxkTWFwcGluZ0F0dHJpYnV0ZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL0ZpZWxkTWFwcGluZ0F0dHJpYnV0ZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzU4ZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvRmllbGRNYXBwaW5nQXR0cmlidXRlLmNzCkBAIC0wLDAgKzEsODYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBEZWZpbmVkIHNwZWNpZmljYWxseSBmb3IgdGhlIDxzZWUgY3JlZj0iRmllbGRUeXBlIiAvPiBlbnVtZXJhdGlvbiwNCisgICAgLy8vIHRoaXMgYWxsb3dzIGVhY2ggZmllbGQgdHlwZSB0byBzcGVjaWZ5IHRoZSBtYXBwZWQgdHlwZSBhbmQgd2lyZSB0eXBlLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgW0F0dHJpYnV0ZVVzYWdlKEF0dHJpYnV0ZVRhcmdldHMuRmllbGQpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEZpZWxkTWFwcGluZ0F0dHJpYnV0ZSA6IEF0dHJpYnV0ZQ0KKyAgICB7DQorICAgICAgICBwdWJsaWMgRmllbGRNYXBwaW5nQXR0cmlidXRlKE1hcHBlZFR5cGUgbWFwcGVkVHlwZSwgV2lyZUZvcm1hdC5XaXJlVHlwZSB3aXJlVHlwZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBNYXBwZWRUeXBlID0gbWFwcGVkVHlwZTsNCisgICAgICAgICAgICBXaXJlVHlwZSA9IHdpcmVUeXBlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIE1hcHBlZFR5cGUgTWFwcGVkVHlwZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0NCisgICAgICAgIHB1YmxpYyBXaXJlRm9ybWF0LldpcmVUeXBlIFdpcmVUeXBlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQ0KKw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEltbXV0YWJsZSBtYXBwaW5nIGZyb20gZmllbGQgdHlwZSB0byBtYXBwZWQgdHlwZS4gQnVpbHQgdXNpbmcgdGhlIGF0dHJpYnV0ZXMgb24NCisgICAgICAgIC8vLyBGaWVsZFR5cGUgdmFsdWVzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElEaWN0aW9uYXJ5PEZpZWxkVHlwZSwgRmllbGRNYXBwaW5nQXR0cmlidXRlPiBGaWVsZFR5cGVUb01hcHBlZFR5cGVNYXAgPSBNYXBGaWVsZFR5cGVzKCk7DQorDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBJRGljdGlvbmFyeTxGaWVsZFR5cGUsIEZpZWxkTWFwcGluZ0F0dHJpYnV0ZT4gTWFwRmllbGRUeXBlcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBEaWN0aW9uYXJ5PEZpZWxkVHlwZSwgRmllbGRNYXBwaW5nQXR0cmlidXRlPigpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkSW5mbyBmaWVsZCBpbiB0eXBlb2YoRmllbGRUeXBlKS5HZXRGaWVsZHMoQmluZGluZ0ZsYWdzLlN0YXRpYyB8IEJpbmRpbmdGbGFncy5QdWJsaWMpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRmllbGRUeXBlIGZpZWxkVHlwZSA9IChGaWVsZFR5cGUpIGZpZWxkLkdldFZhbHVlKG51bGwpOw0KKyAgICAgICAgICAgICAgICBGaWVsZE1hcHBpbmdBdHRyaWJ1dGUgbWFwcGluZyA9DQorICAgICAgICAgICAgICAgICAgICAoRmllbGRNYXBwaW5nQXR0cmlidXRlKSBmaWVsZC5HZXRDdXN0b21BdHRyaWJ1dGVzKHR5cGVvZihGaWVsZE1hcHBpbmdBdHRyaWJ1dGUpLCBmYWxzZSlbMF07DQorICAgICAgICAgICAgICAgIG1hcFtmaWVsZFR5cGVdID0gbWFwcGluZzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIERpY3Rpb25hcmllcy5Bc1JlYWRPbmx5KG1hcCk7DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgTWFwcGVkVHlwZSBNYXBwZWRUeXBlRnJvbUZpZWxkVHlwZShGaWVsZFR5cGUgdHlwZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlVG9NYXBwZWRUeXBlTWFwW3R5cGVdLk1hcHBlZFR5cGU7DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgV2lyZUZvcm1hdC5XaXJlVHlwZSBXaXJlVHlwZUZyb21GaWVsZFR5cGUoRmllbGRUeXBlIHR5cGUsIGJvb2wgcGFja2VkKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBwYWNrZWQgPyBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCA6IEZpZWxkVHlwZVRvTWFwcGVkVHlwZU1hcFt0eXBlXS5XaXJlVHlwZTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9GaWVsZFR5cGUuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9GaWVsZFR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2ZDNkNAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL0ZpZWxkVHlwZS5jcwpAQCAtMCwwICsxLDYwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9ycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gRW51bWVyYXRpb24gb2YgYWxsIHRoZSBwb3NzaWJsZSBmaWVsZCB0eXBlcy4gVGhlIG9kZCBmb3JtYXR0aW5nIGlzIHRvIG1ha2UgaXQgdmVyeSBjbGVhcg0KKyAgICAvLy8gd2hpY2ggYXR0cmlidXRlIGFwcGxpZXMgdG8gd2hpY2ggdmFsdWUsIHdoaWxlIG1haW50YWluaW5nIGEgY29tcGFjdCBmb3JtYXQuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBlbnVtIEZpZWxkVHlwZQ0KKyAgICB7DQorICAgICAgICBbRmllbGRNYXBwaW5nKE1hcHBlZFR5cGUuRG91YmxlLCBXaXJlRm9ybWF0LldpcmVUeXBlLkZpeGVkNjQpXSBEb3VibGUsDQorICAgICAgICBbRmllbGRNYXBwaW5nKE1hcHBlZFR5cGUuU2luZ2xlLCBXaXJlRm9ybWF0LldpcmVUeXBlLkZpeGVkMzIpXSBGbG9hdCwNCisgICAgICAgIFtGaWVsZE1hcHBpbmcoTWFwcGVkVHlwZS5JbnQ2NCwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpXSBJbnQ2NCwNCisgICAgICAgIFtGaWVsZE1hcHBpbmcoTWFwcGVkVHlwZS5VSW50NjQsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KV0gVUludDY0LA0KKyAgICAgICAgW0ZpZWxkTWFwcGluZyhNYXBwZWRUeXBlLkludDMyLCBXaXJlRm9ybWF0LldpcmVUeXBlLlZhcmludCldIEludDMyLA0KKyAgICAgICAgW0ZpZWxkTWFwcGluZyhNYXBwZWRUeXBlLlVJbnQ2NCwgV2lyZUZvcm1hdC5XaXJlVHlwZS5GaXhlZDY0KV0gRml4ZWQ2NCwNCisgICAgICAgIFtGaWVsZE1hcHBpbmcoTWFwcGVkVHlwZS5VSW50MzIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQzMildIEZpeGVkMzIsDQorICAgICAgICBbRmllbGRNYXBwaW5nKE1hcHBlZFR5cGUuQm9vbGVhbiwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpXSBCb29sLA0KKyAgICAgICAgW0ZpZWxkTWFwcGluZyhNYXBwZWRUeXBlLlN0cmluZywgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpXSBTdHJpbmcsDQorICAgICAgICBbRmllbGRNYXBwaW5nKE1hcHBlZFR5cGUuTWVzc2FnZSwgV2lyZUZvcm1hdC5XaXJlVHlwZS5TdGFydEdyb3VwKV0gR3JvdXAsDQorICAgICAgICBbRmllbGRNYXBwaW5nKE1hcHBlZFR5cGUuTWVzc2FnZSwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpXSBNZXNzYWdlLA0KKyAgICAgICAgW0ZpZWxkTWFwcGluZyhNYXBwZWRUeXBlLkJ5dGVTdHJpbmcsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKV0gQnl0ZXMsDQorICAgICAgICBbRmllbGRNYXBwaW5nKE1hcHBlZFR5cGUuVUludDMyLCBXaXJlRm9ybWF0LldpcmVUeXBlLlZhcmludCldIFVJbnQzMiwNCisgICAgICAgIFtGaWVsZE1hcHBpbmcoTWFwcGVkVHlwZS5JbnQzMiwgV2lyZUZvcm1hdC5XaXJlVHlwZS5GaXhlZDMyKV0gU0ZpeGVkMzIsDQorICAgICAgICBbRmllbGRNYXBwaW5nKE1hcHBlZFR5cGUuSW50NjQsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQ2NCldIFNGaXhlZDY0LA0KKyAgICAgICAgW0ZpZWxkTWFwcGluZyhNYXBwZWRUeXBlLkludDMyLCBXaXJlRm9ybWF0LldpcmVUeXBlLlZhcmludCldIFNJbnQzMiwNCisgICAgICAgIFtGaWVsZE1hcHBpbmcoTWFwcGVkVHlwZS5JbnQ2NCwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpXSBTSW50NjQsDQorICAgICAgICBbRmllbGRNYXBwaW5nKE1hcHBlZFR5cGUuRW51bSwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpXSBFbnVtDQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvRmlsZURlc2NyaXB0b3IuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9GaWxlRGVzY3JpcHRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzA3NWUzCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvRmlsZURlc2NyaXB0b3IuY3MKQEAgLTAsMCArMSw0OTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWw7DQordXNpbmcgU3lzdGVtLklPOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3RvczsNCit1c2luZyBGaWxlT3B0aW9ucyA9IEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5GaWxlT3B0aW9uczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9ycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gRGVzY3JpYmVzIGEgLnByb3RvIGZpbGUsIGluY2x1ZGluZyBldmVyeXRoaW5nIGRlZmluZWQgd2l0aGluLg0KKyAgICAvLy8gSURlc2NyaXB0b3IgaXMgaW1wbGVtZW50ZWQgc3VjaCB0aGF0IHRoZSBGaWxlIHByb3BlcnR5IHJldHVybnMgdGhpcyBkZXNjcmlwdG9yLA0KKyAgICAvLy8gYW5kIHRoZSBGdWxsTmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgTmFtZS4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBGaWxlRGVzY3JpcHRvciA6IElEZXNjcmlwdG9yPEZpbGVEZXNjcmlwdG9yUHJvdG8+DQorICAgIHsNCisgICAgICAgIHByaXZhdGUgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bzsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUxpc3Q8TWVzc2FnZURlc2NyaXB0b3I+IG1lc3NhZ2VUeXBlczsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUxpc3Q8RW51bURlc2NyaXB0b3I+IGVudW1UeXBlczsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUxpc3Q8U2VydmljZURlc2NyaXB0b3I+IHNlcnZpY2VzOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJTGlzdDxGaWVsZERlc2NyaXB0b3I+IGV4dGVuc2lvbnM7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElMaXN0PEZpbGVEZXNjcmlwdG9yPiBkZXBlbmRlbmNpZXM7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERlc2NyaXB0b3JQb29sIHBvb2w7DQorICAgICAgICBwcml2YXRlIENTaGFycEZpbGVPcHRpb25zIGNzaGFycEZpbGVPcHRpb25zOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3Qgb3B0aW9uc0xvY2sgPSBuZXcgb2JqZWN0KCk7DQorDQorICAgICAgICBwcml2YXRlIEZpbGVEZXNjcmlwdG9yKEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG8sIEZpbGVEZXNjcmlwdG9yW10gZGVwZW5kZW5jaWVzLCBEZXNjcmlwdG9yUG9vbCBwb29sKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRoaXMucG9vbCA9IHBvb2w7DQorICAgICAgICAgICAgdGhpcy5wcm90byA9IHByb3RvOw0KKyAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gbmV3IFJlYWRPbmx5Q29sbGVjdGlvbjxGaWxlRGVzY3JpcHRvcj4oKEZpbGVEZXNjcmlwdG9yW10pIGRlcGVuZGVuY2llcy5DbG9uZSgpKTsNCisNCisgICAgICAgICAgICBwb29sLkFkZFBhY2thZ2UoUGFja2FnZSwgdGhpcyk7DQorDQorICAgICAgICAgICAgbWVzc2FnZVR5cGVzID0gRGVzY3JpcHRvclV0aWwuQ29udmVydEFuZE1ha2VSZWFkT25seShwcm90by5NZXNzYWdlVHlwZUxpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVzc2FnZSwgaW5kZXgpID0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZURlc2NyaXB0b3IobWVzc2FnZSwgdGhpcywgbnVsbCwgaW5kZXgpKTsNCisNCisgICAgICAgICAgICBlbnVtVHlwZXMgPSBEZXNjcmlwdG9yVXRpbC5Db252ZXJ0QW5kTWFrZVJlYWRPbmx5KHByb3RvLkVudW1UeXBlTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtVHlwZSwgaW5kZXgpID0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRW51bURlc2NyaXB0b3IoZW51bVR5cGUsIHRoaXMsIG51bGwsIGluZGV4KSk7DQorDQorICAgICAgICAgICAgc2VydmljZXMgPSBEZXNjcmlwdG9yVXRpbC5Db252ZXJ0QW5kTWFrZVJlYWRPbmx5KHByb3RvLlNlcnZpY2VMaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VydmljZSwgaW5kZXgpID0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXJ2aWNlRGVzY3JpcHRvcihzZXJ2aWNlLCB0aGlzLCBpbmRleCkpOw0KKw0KKyAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBEZXNjcmlwdG9yVXRpbC5Db252ZXJ0QW5kTWFrZVJlYWRPbmx5KHByb3RvLkV4dGVuc2lvbkxpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpZWxkLCBpbmRleCkgPT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdG9yKGZpZWxkLCB0aGlzLCBudWxsLCBpbmRleCwgdHJ1ZSkpOw0KKyAgICAgICAgfQ0KKw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFsbG93cyBhIGZpbGUgZGVzY3JpcHRvciB0byBiZSBjb25maWd1cmVkIHdpdGggYSBzZXQgb2YgZXh0ZXJuYWwgb3B0aW9ucywgZS5nLiBmcm9tIHRoZQ0KKyAgICAgICAgLy8vIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgdG8gcHJvdG9nZW4uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgQ29uZmlndXJlV2l0aERlZmF1bHRPcHRpb25zKENTaGFycEZpbGVPcHRpb25zIG9wdGlvbnMpDQorICAgICAgICB7DQorICAgICAgICAgICAgY3NoYXJwRmlsZU9wdGlvbnMgPSBCdWlsZE9yRmFrZVdpdGhEZWZhdWx0T3B0aW9ucyhvcHRpb25zKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHN0YXRpYyByZWFkb25seSBjaGFyW10gUGF0aFNlcGVyYXRvcnMgPSBuZXcgY2hhcltdIHsgJy8nLCAnXFwnIH07DQorICAgICAgICBwcml2YXRlIENTaGFycEZpbGVPcHRpb25zIEJ1aWxkT3JGYWtlV2l0aERlZmF1bHRPcHRpb25zKENTaGFycEZpbGVPcHRpb25zIGRlZmF1bHRPcHRpb25zKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIEZpeCBmb3IgYmVpbmcgYWJsZSB0byByZWxvY2F0ZSB0aGVzZSBmaWxlcyB0byBhbnkgZGlyZWN0b3J5IHN0cnVjdHVyZQ0KKyAgICAgICAgICAgIGlmIChwcm90by5QYWNrYWdlID09ICJnb29nbGUucHJvdG9idWYiKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW50IGl4c2xhc2ggPSBwcm90by5OYW1lLkxhc3RJbmRleE9mQW55KFBhdGhTZXBlcmF0b3JzKTsNCisgICAgICAgICAgICAgICAgc3RyaW5nIGZpbGVuYW1lID0gaXhzbGFzaCA8IDAgPyBwcm90by5OYW1lIDogcHJvdG8uTmFtZS5TdWJzdHJpbmcoaXhzbGFzaCArIDEpOw0KKyAgICAgICAgICAgICAgICAvLyBUT0RPKGpvbnNrZWV0KTogQ2hlY2sgaWYgd2UgY291bGQgdXNlIEZpbGVEZXNjcmlwdG9yUHJvdG8uRGVzY3JpcHRvci5OYW1lIC0gaW50ZXJlc3RpbmcgYm9vdHN0cmFwIGlzc3VlcykNCisgICAgICAgICAgICAgICAgaWYgKGZpbGVuYW1lID09ICJkZXNjcmlwdG9yLnByb3RvIikNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDU2hhcnBGaWxlT3B0aW9ucy5CdWlsZGVyDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW1icmVsbGFDbGFzc25hbWUgPSAiRGVzY3JpcHRvclByb3RvRmlsZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0Q2xhc3NlcyA9IGZhbHNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGVGaWxlcyA9IGZhbHNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHVibGljQ2xhc3NlcyA9IHRydWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXREaXJlY3RvcnkgPSBkZWZhdWx0T3B0aW9ucy5PdXRwdXREaXJlY3RvcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVHb29nbGVQcm90b2J1ZiA9IGRlZmF1bHRPcHRpb25zLklnbm9yZUdvb2dsZVByb3RvYnVmDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoZmlsZW5hbWUgPT0gImNzaGFycF9vcHRpb25zLnByb3RvIikNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDU2hhcnBGaWxlT3B0aW9ucy5CdWlsZGVyDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW1icmVsbGFDbGFzc25hbWUgPSAiQ1NoYXJwT3B0aW9ucyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0Q2xhc3NlcyA9IGZhbHNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGVGaWxlcyA9IGZhbHNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHVibGljQ2xhc3NlcyA9IHRydWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXREaXJlY3RvcnkgPSBkZWZhdWx0T3B0aW9ucy5PdXRwdXREaXJlY3RvcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVHb29nbGVQcm90b2J1ZiA9IGRlZmF1bHRPcHRpb25zLklnbm9yZUdvb2dsZVByb3RvYnVmDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDU2hhcnBGaWxlT3B0aW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBkZWZhdWx0T3B0aW9ucy5Ub0J1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAocHJvdG8uT3B0aW9ucy5IYXNFeHRlbnNpb24oRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLkNTaGFycEZpbGVPcHRpb25zKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuTWVyZ2VGcm9tKHByb3RvLk9wdGlvbnMuR2V0RXh0ZW5zaW9uKERlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5DU2hhcnBGaWxlT3B0aW9ucykpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoIWJ1aWxkZXIuSGFzTmFtZXNwYWNlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYnVpbGRlci5OYW1lc3BhY2UgPSBQYWNrYWdlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoIWJ1aWxkZXIuSGFzVW1icmVsbGFDbGFzc25hbWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpbnQgbGFzdFNsYXNoID0gTmFtZS5MYXN0SW5kZXhPZignLycpOw0KKyAgICAgICAgICAgICAgICBzdHJpbmcgYmFzZU5hbWUgPSBOYW1lLlN1YnN0cmluZyhsYXN0U2xhc2ggKyAxKTsNCisgICAgICAgICAgICAgICAgYnVpbGRlci5VbWJyZWxsYUNsYXNzbmFtZSA9IE5hbWVIZWxwZXJzLlVuZGVyc2NvcmVzVG9QYXNjYWxDYXNlKE5hbWVIZWxwZXJzLlN0cmlwUHJvdG8oYmFzZU5hbWUpKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8gQXV0by1maXggZm9yIG5hbWUgY29sbGlzaW9uIGJ5IHBsYWNpbmcgdW1icmVsbGEgY2xhc3MgaW50byBhIG5ldyBuYW1lc3BhY2UuICBUaGlzDQorICAgICAgICAgICAgLy8gc3RpbGwgd29uJ3QgZml4IHRoZSBjb2xsaXNpb25zIHdpdGggbmVzdGluZyBlbmFibGVkOyBob3dldmVyLCB5b3UgaGF2ZSB0byB0dXJuIHRoYXQgb24gZXhwbGljaXRseSBhbnl3YXkuDQorICAgICAgICAgICAgaWYgKCFidWlsZGVyLk5lc3RDbGFzc2VzICYmICFidWlsZGVyLkhhc1VtYnJlbGxhTmFtZXNwYWNlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYm9vbCBjb2xsaXNpb24gPSBmYWxzZTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoSURlc2NyaXB0b3IgZCBpbiBNZXNzYWdlVHlwZXMpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbiB8PSBkLk5hbWUgPT0gYnVpbGRlci5VbWJyZWxsYUNsYXNzbmFtZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChJRGVzY3JpcHRvciBkIGluIFNlcnZpY2VzKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb24gfD0gZC5OYW1lID09IGJ1aWxkZXIuVW1icmVsbGFDbGFzc25hbWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoSURlc2NyaXB0b3IgZCBpbiBFbnVtVHlwZXMpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbiB8PSBkLk5hbWUgPT0gYnVpbGRlci5VbWJyZWxsYUNsYXNzbmFtZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoY29sbGlzaW9uKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlVtYnJlbGxhTmFtZXNwYWNlID0gIlByb3RvIjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDx2YWx1ZT4NCisgICAgICAgIC8vLyBUaGUgZGVzY3JpcHRvciBpbiBpdHMgcHJvdG9jb2wgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4NCisgICAgICAgIC8vLyA8L3ZhbHVlPg0KKyAgICAgICAgcHVibGljIEZpbGVEZXNjcmlwdG9yUHJvdG8gUHJvdG8NCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcHJvdG87IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gVGhlIDxzZWUgY3JlZj0iRGVzY3JpcHRvclByb3Rvcy5GaWxlT3B0aW9ucyIgLz4gZGVmaW5lZCBpbiA8Yz5kZXNjcmlwdG9yLnByb3RvPC9jPi4NCisgICAgICAgIC8vLyA8L3ZhbHVlPg0KKyAgICAgICAgcHVibGljIEZpbGVPcHRpb25zIE9wdGlvbnMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcHJvdG8uT3B0aW9uczsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIEMjLXNwZWNpZmljIG9wdGlvbnMgZm9yIHRoaXMgZmlsZSBkZXNjcmlwdG9yLiBUaGlzIHdpbGwgYWx3YXlzIGJlDQorICAgICAgICAvLy8gY29tcGxldGVseSBmaWxsZWQgaW4uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIENTaGFycEZpbGVPcHRpb25zIENTaGFycE9wdGlvbnMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGxvY2sgKG9wdGlvbnNMb2NrKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY3NoYXJwRmlsZU9wdGlvbnMgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjc2hhcnBGaWxlT3B0aW9ucyA9IEJ1aWxkT3JGYWtlV2l0aERlZmF1bHRPcHRpb25zKENTaGFycEZpbGVPcHRpb25zLkRlZmF1bHRJbnN0YW5jZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGNzaGFycEZpbGVPcHRpb25zOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gVGhlIGZpbGUgbmFtZS4NCisgICAgICAgIC8vLyA8L3ZhbHVlPg0KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHByb3RvLk5hbWU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUaGUgcGFja2FnZSBhcyBkZWNsYXJlZCBpbiB0aGUgLnByb3RvIGZpbGUuIFRoaXMgbWF5IG9yIG1heSBub3QNCisgICAgICAgIC8vLyBiZSBlcXVpdmFsZW50IHRvIHRoZSAuTkVUIG5hbWVzcGFjZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0cmluZyBQYWNrYWdlDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHByb3RvLlBhY2thZ2U7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gVW5tb2RpZmlhYmxlIGxpc3Qgb2YgdG9wLWxldmVsIG1lc3NhZ2UgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlLg0KKyAgICAgICAgLy8vIDwvdmFsdWU+DQorICAgICAgICBwdWJsaWMgSUxpc3Q8TWVzc2FnZURlc2NyaXB0b3I+IE1lc3NhZ2VUeXBlcw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBtZXNzYWdlVHlwZXM7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gVW5tb2RpZmlhYmxlIGxpc3Qgb2YgdG9wLWxldmVsIGVudW0gdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlLg0KKyAgICAgICAgLy8vIDwvdmFsdWU+DQorICAgICAgICBwdWJsaWMgSUxpc3Q8RW51bURlc2NyaXB0b3I+IEVudW1UeXBlcw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBlbnVtVHlwZXM7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gVW5tb2RpZmlhYmxlIGxpc3Qgb2YgdG9wLWxldmVsIHNlcnZpY2VzIGRlY2xhcmVkIGluIHRoaXMgZmlsZS4NCisgICAgICAgIC8vLyA8L3ZhbHVlPg0KKyAgICAgICAgcHVibGljIElMaXN0PFNlcnZpY2VEZXNjcmlwdG9yPiBTZXJ2aWNlcw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBzZXJ2aWNlczsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDx2YWx1ZT4NCisgICAgICAgIC8vLyBVbm1vZGlmaWFibGUgbGlzdCBvZiB0b3AtbGV2ZWwgZXh0ZW5zaW9ucyBkZWNsYXJlZCBpbiB0aGlzIGZpbGUuDQorICAgICAgICAvLy8gPC92YWx1ZT4NCisgICAgICAgIHB1YmxpYyBJTGlzdDxGaWVsZERlc2NyaXB0b3I+IEV4dGVuc2lvbnMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZXh0ZW5zaW9uczsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDx2YWx1ZT4NCisgICAgICAgIC8vLyBVbm1vZGlmaWFibGUgbGlzdCBvZiB0aGlzIGZpbGUncyBkZXBlbmRlbmNpZXMgKGltcG9ydHMpLg0KKyAgICAgICAgLy8vIDwvdmFsdWU+DQorICAgICAgICBwdWJsaWMgSUxpc3Q8RmlsZURlc2NyaXB0b3I+IERlcGVuZGVuY2llcw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBkZXBlbmRlbmNpZXM7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gSW1wbGVtZW50YXRpb24gb2YgSURlc2NyaXB0b3IuRnVsbE5hbWUgLSBqdXN0IHJldHVybnMgdGhlIHNhbWUgYXMgTmFtZS4NCisgICAgICAgIC8vLyA8L3ZhbHVlPg0KKyAgICAgICAgc3RyaW5nIElEZXNjcmlwdG9yLkZ1bGxOYW1lDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIE5hbWU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gSW1wbGVtZW50YXRpb24gb2YgSURlc2NyaXB0b3IuRmlsZSAtIGp1c3QgcmV0dXJucyB0aGlzIGRlc2NyaXB0b3IuDQorICAgICAgICAvLy8gPC92YWx1ZT4NCisgICAgICAgIEZpbGVEZXNjcmlwdG9yIElEZXNjcmlwdG9yLkZpbGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDx2YWx1ZT4NCisgICAgICAgIC8vLyBQcm90b2NvbCBidWZmZXIgZGVzY3JpYmluZyB0aGlzIGRlc2NyaXB0b3IuDQorICAgICAgICAvLy8gPC92YWx1ZT4NCisgICAgICAgIElNZXNzYWdlIElEZXNjcmlwdG9yLlByb3RvDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByb3RvOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHZhbHVlPg0KKyAgICAgICAgLy8vIFBvb2wgY29udGFpbmluZyBzeW1ib2wgZGVzY3JpcHRvcnMuDQorICAgICAgICAvLy8gPC92YWx1ZT4NCisgICAgICAgIGludGVybmFsIERlc2NyaXB0b3JQb29sIERlc2NyaXB0b3JQb29sDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHBvb2w7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBGaW5kcyBhIHR5cGUgKG1lc3NhZ2UsIGVudW0sIHNlcnZpY2Ugb3IgZXh0ZW5zaW9uKSBpbiB0aGUgZmlsZSBieSBuYW1lLiBEb2VzIG5vdCBmaW5kIG5lc3RlZCB0eXBlcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPlRoZSB1bnF1YWxpZmllZCB0eXBlIG5hbWUgdG8gbG9vayBmb3IuPC9wYXJhbT4NCisgICAgICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSB0eXBlIG9mIGRlc2NyaXB0b3IgdG8gbG9vayBmb3IgKG9yIElUeXBlRGVzY3JpcHRvciBmb3IgYW55KTwvdHlwZXBhcmFtPg0KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSB0eXBlJ3MgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub3QgZm91bmQuPC9yZXR1cm5zPg0KKyAgICAgICAgcHVibGljIFQgRmluZFR5cGVCeU5hbWU8VD4oU3RyaW5nIG5hbWUpDQorICAgICAgICAgICAgd2hlcmUgVCA6IGNsYXNzLCBJRGVzY3JpcHRvcg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIERvbid0IGFsbG93IGxvb2tpbmcgdXAgbmVzdGVkIHR5cGVzLiAgVGhpcyB3aWxsIG1ha2Ugb3B0aW1pemF0aW9uDQorICAgICAgICAgICAgLy8gZWFzaWVyIGxhdGVyLg0KKyAgICAgICAgICAgIGlmIChuYW1lLkluZGV4T2YoJy4nKSAhPSAtMSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoUGFja2FnZS5MZW5ndGggPiAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbmFtZSA9IFBhY2thZ2UgKyAiLiIgKyBuYW1lOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBUIHJlc3VsdCA9IHBvb2wuRmluZFN5bWJvbDxUPihuYW1lKTsNCisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LkZpbGUgPT0gdGhpcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEJ1aWxkcyBhIEZpbGVEZXNjcmlwdG9yIGZyb20gaXRzIHByb3RvY29sIGJ1ZmZlciByZXByZXNlbnRhdGlvbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb3RvIj5UaGUgcHJvdG9jb2wgbWVzc2FnZSBmb3JtIG9mIHRoZSBGaWxlRGVzY3JpcHRvci48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZXBlbmRlbmNpZXMiPkZpbGVEZXNjcmlwdG9ycyBjb3JyZXNwb25kaW5nIHRvIGFsbCBvZiB0aGUNCisgICAgICAgIC8vLyBmaWxlJ3MgZGVwZW5kZW5jaWVzLCBpbiB0aGUgZXhhY3Qgb3JkZXIgbGlzdGVkIGluIHRoZSAucHJvdG8gZmlsZS4gTWF5IGJlIG51bGwsDQorICAgICAgICAvLy8gaW4gd2hpY2ggY2FzZSBpdCBpcyB0cmVhdGVkIGFzIGFuIGVtcHR5IGFycmF5LjwvcGFyYW0+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiI+SWYgPHBhcmFtcmVmIG5hbWU9InByb3RvIi8+IGlzIG5vdA0KKyAgICAgICAgLy8vIGEgdmFsaWQgZGVzY3JpcHRvci4gVGhpcyBjYW4gb2NjdXIgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnMsIHN1Y2ggYXMgYSBmaWVsZA0KKyAgICAgICAgLy8vIGhhdmluZyBhbiB1bmRlZmluZWQgdHlwZSBvciBiZWNhdXNlIHR3byBtZXNzYWdlcyB3ZXJlIGRlZmluZWQgd2l0aCB0aGUgc2FtZSBuYW1lLjwvZXhjZXB0aW9uPg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvciBCdWlsZEZyb20oRmlsZURlc2NyaXB0b3JQcm90byBwcm90bywgRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmNpZXMpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gQnVpbGRpbmcgZGVzY3JpcHRvcnMgaW52b2x2ZXMgdHdvIHN0ZXBzOiB0cmFuc2xhdGluZyBhbmQgbGlua2luZy4NCisgICAgICAgICAgICAvLyBJbiB0aGUgdHJhbnNsYXRpb24gc3RlcCAoaW1wbGVtZW50ZWQgYnkgRmlsZURlc2NyaXB0b3Incw0KKyAgICAgICAgICAgIC8vIGNvbnN0cnVjdG9yKSwgd2UgYnVpbGQgYW4gb2JqZWN0IHRyZWUgbWlycm9yaW5nIHRoZQ0KKyAgICAgICAgICAgIC8vIEZpbGVEZXNjcmlwdG9yUHJvdG8ncyB0cmVlIGFuZCBwdXQgYWxsIG9mIHRoZSBkZXNjcmlwdG9ycyBpbnRvIHRoZQ0KKyAgICAgICAgICAgIC8vIERlc2NyaXB0b3JQb29sJ3MgbG9va3VwIHRhYmxlcy4gIEluIHRoZSBsaW5raW5nIHN0ZXAsIHdlIGxvb2sgdXAgYWxsDQorICAgICAgICAgICAgLy8gdHlwZSByZWZlcmVuY2VzIGluIHRoZSBEZXNjcmlwdG9yUG9vbCwgc28gdGhhdCwgZm9yIGV4YW1wbGUsIGENCisgICAgICAgICAgICAvLyBGaWVsZERlc2NyaXB0b3IgZm9yIGFuIGVtYmVkZGVkIG1lc3NhZ2UgY29udGFpbnMgYSBwb2ludGVyIGRpcmVjdGx5DQorICAgICAgICAgICAgLy8gdG8gdGhlIERlc2NyaXB0b3IgZm9yIHRoYXQgbWVzc2FnZSdzIHR5cGUuICBXZSBhbHNvIGRldGVjdCB1bmRlZmluZWQNCisgICAgICAgICAgICAvLyB0eXBlcyBpbiB0aGUgbGlua2luZyBzdGVwLg0KKyAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXMgPT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcyA9IG5ldyBGaWxlRGVzY3JpcHRvclswXTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgRGVzY3JpcHRvclBvb2wgcG9vbCA9IG5ldyBEZXNjcmlwdG9yUG9vbChkZXBlbmRlbmNpZXMpOw0KKyAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yIHJlc3VsdCA9IG5ldyBGaWxlRGVzY3JpcHRvcihwcm90bywgZGVwZW5kZW5jaWVzLCBwb29sKTsNCisNCisgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzLkxlbmd0aCAhPSBwcm90by5EZXBlbmRlbmN5Q291bnQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24ocmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlcGVuZGVuY2llcyBwYXNzZWQgdG8gRmlsZURlc2NyaXB0b3IuQnVpbGRGcm9tKCkgZG9uJ3QgbWF0Y2ggIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhvc2UgbGlzdGVkIGluIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvLiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLkRlcGVuZGVuY3lDb3VudDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGRlcGVuZGVuY2llc1tpXS5OYW1lICE9IHByb3RvLkRlcGVuZGVuY3lMaXN0W2ldKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24ocmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXBlbmRlbmNpZXMgcGFzc2VkIHRvIEZpbGVEZXNjcmlwdG9yLkJ1aWxkRnJvbSgpIGRvbid0IG1hdGNoICIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aG9zZSBsaXN0ZWQgaW4gdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8uIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcmVzdWx0LkNyb3NzTGluaygpOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHZvaWQgQ3Jvc3NMaW5rKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoIChNZXNzYWdlRGVzY3JpcHRvciBtZXNzYWdlIGluIG1lc3NhZ2VUeXBlcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuQ3Jvc3NMaW5rKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKFNlcnZpY2VEZXNjcmlwdG9yIHNlcnZpY2UgaW4gc2VydmljZXMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBzZXJ2aWNlLkNyb3NzTGluaygpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBmb3JlYWNoIChGaWVsZERlc2NyaXB0b3IgZXh0ZW5zaW9uIGluIGV4dGVuc2lvbnMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBleHRlbnNpb24uQ3Jvc3NMaW5rKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKE1lc3NhZ2VEZXNjcmlwdG9yIG1lc3NhZ2UgaW4gbWVzc2FnZVR5cGVzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbWVzc2FnZS5DaGVja1JlcXVpcmVkRmllbGRzKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGNhbGxlZCBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LiAgSXQgaXMgZXF1aXZhbGVudA0KKyAgICAgICAgLy8vIHRvIEJ1aWxkRnJvbSBleGNlcHQgdGhhdCB0aGUgRmlsZURlc2NyaXB0b3JQcm90byBpcyBlbmNvZGVkIGluDQorICAgICAgICAvLy8gcHJvdG9jb2wgYnVmZmVyIHdpcmUgZm9ybWF0LiBUaGlzIG92ZXJsb2FkIGlzIG1haW50YWluZWQgZm9yIGJhY2t3YXJkDQorICAgICAgICAvLy8gY29tcGF0aWJpbGl0eSB3aXRoIHNvdXJjZSBjb2RlIGdlbmVyYXRlZCBiZWZvcmUgdGhlIGN1c3RvbSBvcHRpb25zIHdlcmUgYXZhaWxhYmxlDQorICAgICAgICAvLy8gKGFuZCB3b3JraW5nKS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZpbGVEZXNjcmlwdG9yIEludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbShieXRlW10gZGVzY3JpcHRvckRhdGEsIEZpbGVEZXNjcmlwdG9yW10gZGVwZW5kZW5jaWVzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBJbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oZGVzY3JpcHRvckRhdGEsIGRlcGVuZGVuY2llcywgeCA9PiBudWxsKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUaGlzIGRlbGVnYXRlIHNob3VsZCBiZSB1c2VkIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuIFdoZW4gY2FsbGluZw0KKyAgICAgICAgLy8vIEZpbGVEZXNjcmlwdG9yLkludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbSwgdGhlIGNhbGxlciBjYW4gcHJvdmlkZQ0KKyAgICAgICAgLy8vIGEgY2FsbGJhY2sgd2hpY2ggYXNzaWducyB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgY29kZQ0KKyAgICAgICAgLy8vIHdoaWNoIHBvaW50IGF0IHBhcnRzIG9mIHRoZSBGaWxlRGVzY3JpcHRvci4gVGhlIGNhbGxiYWNrIHJldHVybnMgYW4NCisgICAgICAgIC8vLyBFeHRlbnNpb24gUmVnaXN0cnkgd2hpY2ggY29udGFpbnMgYW55IGV4dGVuc2lvbnMgd2hpY2ggbWlnaHQgYmUgdXNlZCBpbg0KKyAgICAgICAgLy8vIHRoZSBkZXNjcmlwdG9yIC0gdGhhdCBpcywgZXh0ZW5zaW9ucyBvZiB0aGUgdmFyaW91cyAiT3B0aW9ucyIgbWVzc2FnZXMgZGVmaW5lZA0KKyAgICAgICAgLy8vIGluIGRlc2NyaXB0b3IucHJvdG8uIFRoZSBjYWxsYmFjayBtYXkgYWxzbyByZXR1cm4gbnVsbCB0byBpbmRpY2F0ZSB0aGF0DQorICAgICAgICAvLy8gbm8gZXh0ZW5zaW9ucyBhcmUgdXNlZCBpbiB0aGUgZGVzY3JpcHRvci4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRlc2NyaXB0b3IiPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgcHVibGljIGRlbGVnYXRlIEV4dGVuc2lvblJlZ2lzdHJ5IEludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyKEZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpOw0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvciBJbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oYnl0ZVtdIGRlc2NyaXB0b3JEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmNpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciBkZXNjcmlwdG9yQXNzaWduZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bzsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHByb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5QYXJzZUZyb20oZGVzY3JpcHRvckRhdGEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBwcm90b2NvbCBidWZmZXIgZGVzY3JpcHRvciBmb3IgZ2VuZXJhdGVkIGNvZGUuIiwgZSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yIHJlc3VsdDsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IEJ1aWxkRnJvbShwcm90bywgZGVwZW5kZW5jaWVzKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZW1iZWRkZWQgZGVzY3JpcHRvciBmb3IgXCIiICsgcHJvdG8uTmFtZSArICJcIi4iLCBlKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBkZXNjcmlwdG9yQXNzaWduZXIocmVzdWx0KTsNCisNCisgICAgICAgICAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgcmUtcGFyc2UgdGhlIHByb3RvIHVzaW5nIHRoZSByZWdpc3RyeS4NCisgICAgICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5QYXJzZUZyb20oZGVzY3JpcHRvckRhdGEsIHJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIHByb3RvY29sIGJ1ZmZlciBkZXNjcmlwdG9yIGZvciBnZW5lcmF0ZWQgY29kZS4iLCBlKTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICByZXN1bHQuUmVwbGFjZVByb3RvKHByb3RvKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXBsYWNlIG91ciBGaWxlRGVzY3JpcHRvclByb3RvIHdpdGggdGhlIGdpdmVuIG9uZSwgd2hpY2ggaXMNCisgICAgICAgIC8vLyBpZGVudGljYWwgZXhjZXB0IHRoYXQgaXQgbWlnaHQgY29udGFpbiBleHRlbnNpb25zIHRoYXQgd2VyZW4ndCBwcmVzZW50DQorICAgICAgICAvLy8gaW4gdGhlIG9yaWdpbmFsLiBUaGlzIG1ldGhvZCBpcyBuZWVkZWQgZm9yIGJvb3RzdHJhcHBpbmcgd2hlbiBhIGZpbGUNCisgICAgICAgIC8vLyBkZWZpbmVzIGN1c3RvbSBvcHRpb25zLiBUaGUgb3B0aW9ucyBtYXkgYmUgZGVmaW5lZCBpbiB0aGUgZmlsZSBpdHNlbGYsDQorICAgICAgICAvLy8gc28gd2UgY2FuJ3QgYWN0dWFsbHkgcGFyc2UgdGhlbSB1bnRpbCB3ZSd2ZSBjb25zdHJ1Y3RlZCB0aGUgZGVzY3JpcHRvcnMsDQorICAgICAgICAvLy8gYnV0IHRvIGNvbnN0cnVjdCB0aGUgZGVjc3JpcHRvcnMgd2UgaGF2ZSB0byBoYXZlIHBhcnNlZCB0aGUgZGVzY3JpcHRvcg0KKyAgICAgICAgLy8vIHByb3Rvcy4gU28sIHdlIGhhdmUgdG8gcGFyc2UgdGhlIGRlc2NyaXB0b3IgcHJvdG9zIGEgc2Vjb25kIHRpbWUgYWZ0ZXINCisgICAgICAgIC8vLyBjb25zdHJ1Y3RpbmcgdGhlIGRlc2NyaXB0b3JzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgdm9pZCBSZXBsYWNlUHJvdG8oRmlsZURlc2NyaXB0b3JQcm90byBuZXdQcm90bykNCisgICAgICAgIHsNCisgICAgICAgICAgICBwcm90byA9IG5ld1Byb3RvOw0KKw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZVR5cGVzLkNvdW50OyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZXNbaV0uUmVwbGFjZVByb3RvKHByb3RvLkdldE1lc3NhZ2VUeXBlKGkpKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtVHlwZXMuQ291bnQ7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGVudW1UeXBlc1tpXS5SZXBsYWNlUHJvdG8ocHJvdG8uR2V0RW51bVR5cGUoaSkpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLkNvdW50OyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBzZXJ2aWNlc1tpXS5SZXBsYWNlUHJvdG8ocHJvdG8uR2V0U2VydmljZShpKSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5Db3VudDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc1tpXS5SZXBsYWNlUHJvdG8ocHJvdG8uR2V0RXh0ZW5zaW9uKGkpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvSURlc2NyaXB0b3IuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9JRGVzY3JpcHRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTljMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvSURlc2NyaXB0b3IuY3MKQEAgLTAsMCArMSw1NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFRoZSBub24tZ2VuZXJpYyBmb3JtIG9mIHRoZSBJRGVzY3JpcHRvciBpbnRlcmZhY2UuIFVzZWZ1bCBmb3IgZGVzY3JpYmluZyBhIGdlbmVyYWwNCisgICAgLy8vIGRlc2NyaXB0b3IuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBpbnRlcmZhY2UgSURlc2NyaXB0b3INCisgICAgew0KKyAgICAgICAgc3RyaW5nIE5hbWUgeyBnZXQ7IH0NCisgICAgICAgIHN0cmluZyBGdWxsTmFtZSB7IGdldDsgfQ0KKyAgICAgICAgRmlsZURlc2NyaXB0b3IgRmlsZSB7IGdldDsgfQ0KKyAgICAgICAgSU1lc3NhZ2UgUHJvdG8geyBnZXQ7IH0NCisgICAgfQ0KKw0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBTdHJvbmdseS10eXBlZCBmb3JtIG9mIHRoZSBJRGVzY3JpcHRvciBpbnRlcmZhY2UuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlRQcm90byI+UHJvdG9jb2wgYnVmZmVyIHR5cGUgdW5kZXJseWluZyB0aGlzIGRlc2NyaXB0b3IgdHlwZTwvdHlwZXBhcmFtPg0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElEZXNjcmlwdG9yPFRQcm90bz4gOiBJRGVzY3JpcHRvciB3aGVyZSBUUHJvdG8gOiBJTWVzc2FnZQ0KKyAgICB7DQorICAgICAgICBuZXcgVFByb3RvIFByb3RvIHsgZ2V0OyB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvSW5kZXhlZERlc2NyaXB0b3JCYXNlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvSW5kZXhlZERlc2NyaXB0b3JCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYjRlYjgKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9JbmRleGVkRGVzY3JpcHRvckJhc2UuY3MKQEAgLTAsMCArMSw2NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBCYXNlIGNsYXNzIGZvciBkZXNjcmlwdG9ycyB3aGljaCBhcmUgYWxzbyBpbmRleGVkLiBUaGlzIGlzIGFsbCBvZiB0aGVtIG90aGVyIHRoYW4NCisgICAgLy8vIDxzZWUgY3JlZj0iRmlsZURlc2NyaXB0b3IiIC8+Lg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5kZXhlZERlc2NyaXB0b3JCYXNlPFRQcm90bywgVE9wdGlvbnM+IDogRGVzY3JpcHRvckJhc2U8VFByb3RvLCBUT3B0aW9ucz4NCisgICAgICAgIHdoZXJlIFRQcm90byA6IElNZXNzYWdlPFRQcm90bz4sIElEZXNjcmlwdG9yUHJvdG88VE9wdGlvbnM+DQorICAgIHsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IGluZGV4Ow0KKw0KKyAgICAgICAgcHJvdGVjdGVkIEluZGV4ZWREZXNjcmlwdG9yQmFzZShUUHJvdG8gcHJvdG8sIEZpbGVEZXNjcmlwdG9yIGZpbGUsIHN0cmluZyBmdWxsTmFtZSwgaW50IGluZGV4KQ0KKyAgICAgICAgICAgIDogYmFzZShwcm90bywgZmlsZSwgZnVsbE5hbWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDx2YWx1ZT4NCisgICAgICAgIC8vLyBUaGUgaW5kZXggb2YgdGhpcyBkZXNjcmlwdG9yIHdpdGhpbiBpdHMgcGFyZW50IGRlc2NyaXB0b3IuIA0KKyAgICAgICAgLy8vIDwvdmFsdWU+DQorICAgICAgICAvLy8gPHJlbWFya3M+DQorICAgICAgICAvLy8gVGhpcyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGlzIGRlc2NyaXB0b3Igd2l0aGluIGl0cyBwYXJlbnQsIGZvcg0KKyAgICAgICAgLy8vIHRoaXMgZGVzY3JpcHRvcidzIHR5cGUuIChUaGVyZSBjYW4gYmUgZHVwbGljYXRlIHZhbHVlcyBmb3IgZGlmZmVyZW50DQorICAgICAgICAvLy8gdHlwZXMsIGUuZy4gb25lIGVudW0gdHlwZSB3aXRoIGluZGV4IDAgYW5kIG9uZSBtZXNzYWdlIHR5cGUgd2l0aCBpbmRleCAwLikNCisgICAgICAgIC8vLyA8L3JlbWFya3M+DQorICAgICAgICBwdWJsaWMgaW50IEluZGV4DQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGluZGV4OyB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvTWFwcGVkVHlwZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL01hcHBlZFR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1NTUzMAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL01hcHBlZFR5cGUuY3MKQEAgLTAsMCArMSw1MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFR5cGUgYXMgaXQncyBtYXBwZWQgb250byBhIC5ORVQgdHlwZS4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIGVudW0gTWFwcGVkVHlwZQ0KKyAgICB7DQorICAgICAgICBJbnQzMiwNCisgICAgICAgIEludDY0LA0KKyAgICAgICAgVUludDMyLA0KKyAgICAgICAgVUludDY0LA0KKyAgICAgICAgU2luZ2xlLA0KKyAgICAgICAgRG91YmxlLA0KKyAgICAgICAgQm9vbGVhbiwNCisgICAgICAgIFN0cmluZywNCisgICAgICAgIEJ5dGVTdHJpbmcsDQorICAgICAgICBNZXNzYWdlLA0KKyAgICAgICAgRW51bQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL01lc3NhZ2VEZXNjcmlwdG9yLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvTWVzc2FnZURlc2NyaXB0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzOGMwZgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL01lc3NhZ2VEZXNjcmlwdG9yLmNzCkBAIC0wLDAgKzEsMjg4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBEZXNjcmliZXMgYSBtZXNzYWdlIHR5cGUuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgTWVzc2FnZURlc2NyaXB0b3IgOiBJbmRleGVkRGVzY3JpcHRvckJhc2U8RGVzY3JpcHRvclByb3RvLCBNZXNzYWdlT3B0aW9ucz4NCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZXNzYWdlRGVzY3JpcHRvciBjb250YWluaW5nVHlwZTsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUxpc3Q8TWVzc2FnZURlc2NyaXB0b3I+IG5lc3RlZFR5cGVzOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJTGlzdDxFbnVtRGVzY3JpcHRvcj4gZW51bVR5cGVzOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJTGlzdDxGaWVsZERlc2NyaXB0b3I+IGZpZWxkczsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUxpc3Q8RmllbGREZXNjcmlwdG9yPiBleHRlbnNpb25zOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc1JlcXVpcmVkRmllbGRzOw0KKw0KKyAgICAgICAgaW50ZXJuYWwgTWVzc2FnZURlc2NyaXB0b3IoRGVzY3JpcHRvclByb3RvIHByb3RvLCBGaWxlRGVzY3JpcHRvciBmaWxlLCBNZXNzYWdlRGVzY3JpcHRvciBwYXJlbnQsIGludCB0eXBlSW5kZXgpDQorICAgICAgICAgICAgOiBiYXNlKHByb3RvLCBmaWxlLCBDb21wdXRlRnVsbE5hbWUoZmlsZSwgcGFyZW50LCBwcm90by5OYW1lKSwgdHlwZUluZGV4KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGNvbnRhaW5pbmdUeXBlID0gcGFyZW50Ow0KKw0KKyAgICAgICAgICAgIG5lc3RlZFR5cGVzID0gRGVzY3JpcHRvclV0aWwuQ29udmVydEFuZE1ha2VSZWFkT25seShwcm90by5OZXN0ZWRUeXBlTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUsIGluZGV4KSA9Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZURlc2NyaXB0b3IodHlwZSwgZmlsZSwgdGhpcywgaW5kZXgpKTsNCisNCisgICAgICAgICAgICBlbnVtVHlwZXMgPSBEZXNjcmlwdG9yVXRpbC5Db252ZXJ0QW5kTWFrZVJlYWRPbmx5KHByb3RvLkVudW1UeXBlTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlLCBpbmRleCkgPT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbnVtRGVzY3JpcHRvcih0eXBlLCBmaWxlLCB0aGlzLCBpbmRleCkpOw0KKw0KKyAgICAgICAgICAgIC8vIFRPRE8oam9uc2tlZXQpOiBTb3J0IGZpZWxkcyBmaXJzdD8NCisgICAgICAgICAgICBmaWVsZHMgPSBEZXNjcmlwdG9yVXRpbC5Db252ZXJ0QW5kTWFrZVJlYWRPbmx5KHByb3RvLkZpZWxkTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWVsZCwgaW5kZXgpID0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdG9yKGZpZWxkLCBmaWxlLCB0aGlzLCBpbmRleCwgZmFsc2UpKTsNCisNCisgICAgICAgICAgICBleHRlbnNpb25zID0gRGVzY3JpcHRvclV0aWwuQ29udmVydEFuZE1ha2VSZWFkT25seShwcm90by5FeHRlbnNpb25MaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWVsZCwgaW5kZXgpID0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRvcihmaWVsZCwgZmlsZSwgdGhpcywgaW5kZXgsIHRydWUpKTsNCisNCisgICAgICAgICAgICBmaWxlLkRlc2NyaXB0b3JQb29sLkFkZFN5bWJvbCh0aGlzKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gSWYgdGhpcyBpcyBhIG5lc3RlZCB0eXBlLCBnZXQgdGhlIG91dGVyIGRlc2NyaXB0b3IsIG90aGVyd2lzZSBudWxsLg0KKyAgICAgICAgLy8vIDwvdmFsdWU+DQorICAgICAgICBwdWJsaWMgTWVzc2FnZURlc2NyaXB0b3IgQ29udGFpbmluZ1R5cGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gY29udGFpbmluZ1R5cGU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gQW4gdW5tb2RpZmlhYmxlIGxpc3Qgb2YgdGhpcyBtZXNzYWdlIHR5cGUncyBmaWVsZHMuDQorICAgICAgICAvLy8gPC92YWx1ZT4NCisgICAgICAgIHB1YmxpYyBJTGlzdDxGaWVsZERlc2NyaXB0b3I+IEZpZWxkcw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBmaWVsZHM7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gQW4gdW5tb2RpZmlhYmxlIGxpc3Qgb2YgdGhpcyBtZXNzYWdlIHR5cGUncyBleHRlbnNpb25zLg0KKyAgICAgICAgLy8vIDwvdmFsdWU+DQorICAgICAgICBwdWJsaWMgSUxpc3Q8RmllbGREZXNjcmlwdG9yPiBFeHRlbnNpb25zDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGV4dGVuc2lvbnM7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gQW4gdW5tb2RpZmlhYmxlIGxpc3Qgb2YgdGhpcyBtZXNzYWdlIHR5cGUncyBuZXN0ZWQgdHlwZXMuDQorICAgICAgICAvLy8gPC92YWx1ZT4NCisgICAgICAgIHB1YmxpYyBJTGlzdDxNZXNzYWdlRGVzY3JpcHRvcj4gTmVzdGVkVHlwZXMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbmVzdGVkVHlwZXM7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gQW4gdW5tb2RpZmlhYmxlIGxpc3Qgb2YgdGhpcyBtZXNzYWdlIHR5cGUncyBlbnVtIHR5cGVzLg0KKyAgICAgICAgLy8vIDwvdmFsdWU+DQorICAgICAgICBwdWJsaWMgSUxpc3Q8RW51bURlc2NyaXB0b3I+IEVudW1UeXBlcw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBlbnVtVHlwZXM7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIGEgcHJlLWNvbXB1dGVkIHJlc3VsdCBhcyB0byB3aGV0aGVyIHRoaXMgbWVzc2FnZQ0KKyAgICAgICAgLy8vIGhhcyByZXF1aXJlZCBmaWVsZHMuIFRoaXMgaW5jbHVkZXMgb3B0aW9uYWwgZmllbGRzIHdoaWNoIGFyZQ0KKyAgICAgICAgLy8vIG1lc3NhZ2UgdHlwZXMgd2hpY2ggaW4gdHVybiBoYXZlIHJlcXVpcmVkIGZpZWxkcywgYW5kIGFueSANCisgICAgICAgIC8vLyBleHRlbnNpb24gZmllbGRzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIGJvb2wgSGFzUmVxdWlyZWRGaWVsZHMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzUmVxdWlyZWRGaWVsZHM7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIgaXMgYW4gZXh0ZW5zaW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBib29sIElzRXh0ZW5zaW9uTnVtYmVyKGludCBudW1iZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoRGVzY3JpcHRvclByb3RvLlR5cGVzLkV4dGVuc2lvblJhbmdlIHJhbmdlIGluIFByb3RvLkV4dGVuc2lvblJhbmdlTGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChyYW5nZS5TdGFydCA8PSBudW1iZXIgJiYgbnVtYmVyIDwgcmFuZ2UuRW5kKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRmluZHMgYSBmaWVsZCBieSBmaWVsZCBuYW1lLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZpZWxkIChlLmcuICJmb28iKS48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBmaWVsZCdzIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm90IGZvdW5kLjwvcmV0dXJucz4NCisgICAgICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgRmluZEZpZWxkQnlOYW1lKFN0cmluZyBuYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBGaWxlLkRlc2NyaXB0b3JQb29sLkZpbmRTeW1ib2w8RmllbGREZXNjcmlwdG9yPihGdWxsTmFtZSArICIuIiArIG5hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEZpbmRzIGEgZmllbGQgYnkgZmllbGQgbnVtYmVyLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnVtYmVyIj5UaGUgZmllbGQgbnVtYmVyIHdpdGhpbiB0aGlzIG1lc3NhZ2UgdHlwZS48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBmaWVsZCdzIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm90IGZvdW5kLjwvcmV0dXJucz4NCisgICAgICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgRmluZEZpZWxkQnlOdW1iZXIoaW50IG51bWJlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gRmlsZS5EZXNjcmlwdG9yUG9vbC5GaW5kRmllbGRCeU51bWJlcih0aGlzLCBudW1iZXIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEZpbmRzIGEgZmllbGQgYnkgaXRzIHByb3BlcnR5IG5hbWUsIGFzIGl0IHdvdWxkIGJlIGdlbmVyYXRlZCBieSBwcm90b2dlbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb3BlcnR5TmFtZSI+VGhlIHByb3BlcnR5IG5hbWUgd2l0aGluIHRoaXMgbWVzc2FnZSB0eXBlLjwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+VGhlIGZpZWxkJ3MgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub3QgZm91bmQuPC9yZXR1cm5zPg0KKyAgICAgICAgcHVibGljIEZpZWxkRGVzY3JpcHRvciBGaW5kRmllbGRCeVByb3BlcnR5TmFtZShzdHJpbmcgcHJvcGVydHlOYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIEZvciByZWFzb25hYmx5IHNob3J0IG1lc3NhZ2VzLCB0aGlzIHdpbGwgYmUgbW9yZSBlZmZpY2llbnQgdGhhbiBhIGRpY3Rpb25hcnkNCisgICAgICAgICAgICAvLyBsb29rdXAuIEl0IGFsc28gbWVhbnMgd2UgZG9uJ3QgbmVlZCB0byBkbyB0aGluZ3MgbGF6aWx5IHdpdGggbG9ja3MgZXRjLg0KKyAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBmaWVsZCBpbiBGaWVsZHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuQ1NoYXJwT3B0aW9ucy5Qcm9wZXJ0eU5hbWUgPT0gcHJvcGVydHlOYW1lKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRmluZHMgYSBuZXN0ZWQgZGVzY3JpcHRvciBieSBuYW1lLiBUaGUgaXMgdmFsaWQgZm9yIGZpZWxkcywgbmVzdGVkDQorICAgICAgICAvLy8gbWVzc2FnZSB0eXBlcyBhbmQgZW51bXMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj5UaGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciwgZS5nLiAiRm9vIjwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+VGhlIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm90IGZvdW5kLjwvcmV0dXJucz4NCisgICAgICAgIHB1YmxpYyBUIEZpbmREZXNjcmlwdG9yPFQ+KHN0cmluZyBuYW1lKQ0KKyAgICAgICAgICAgIHdoZXJlIFQgOiBjbGFzcywgSURlc2NyaXB0b3INCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gRmlsZS5EZXNjcmlwdG9yUG9vbC5GaW5kU3ltYm9sPFQ+KEZ1bGxOYW1lICsgIi4iICsgbmFtZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTG9va3MgdXAgYW5kIGNyb3NzLWxpbmtzIGFsbCBmaWVsZHMsIG5lc3RlZCB0eXBlcywgYW5kIGV4dGVuc2lvbnMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBDcm9zc0xpbmsoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKE1lc3NhZ2VEZXNjcmlwdG9yIG1lc3NhZ2UgaW4gbmVzdGVkVHlwZXMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLkNyb3NzTGluaygpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBmb3JlYWNoIChGaWVsZERlc2NyaXB0b3IgZmllbGQgaW4gZmllbGRzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZmllbGQuQ3Jvc3NMaW5rKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBleHRlbnNpb24gaW4gZXh0ZW5zaW9ucykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5Dcm9zc0xpbmsoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCB2b2lkIENoZWNrUmVxdWlyZWRGaWVsZHMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIElEaWN0aW9uYXJ5PE1lc3NhZ2VEZXNjcmlwdG9yLCBieXRlPiBhbHJlYWR5U2VlbiA9IG5ldyBEaWN0aW9uYXJ5PE1lc3NhZ2VEZXNjcmlwdG9yLCBieXRlPigpOw0KKyAgICAgICAgICAgIGhhc1JlcXVpcmVkRmllbGRzID0gQ2hlY2tSZXF1aXJlZEZpZWxkcyhhbHJlYWR5U2Vlbik7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIGJvb2wgQ2hlY2tSZXF1aXJlZEZpZWxkcyhJRGljdGlvbmFyeTxNZXNzYWdlRGVzY3JpcHRvciwgYnl0ZT4gYWxyZWFkeVNlZW4pDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGFscmVhZHlTZWVuLkNvbnRhaW5zS2V5KHRoaXMpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gVGhlIHR5cGUgaXMgYWxyZWFkeSBpbiB0aGUgY2FjaGUuIFRoaXMgbWVhbnMgdGhhdCBlaXRoZXI6DQorICAgICAgICAgICAgICAgIC8vIGEuIFRoZSB0eXBlIGhhcyBubyByZXF1aXJlZCBmaWVsZHMuDQorICAgICAgICAgICAgICAgIC8vIGIuIFdlIGFyZSBpbiB0aGUgbWlkc3Qgb2YgY2hlY2tpbmcgaWYgdGhlIHR5cGUgaGFzIHJlcXVpcmVkIGZpZWxkcywNCisgICAgICAgICAgICAgICAgLy8gICAgc29tZXdoZXJlIHVwIHRoZSBzdGFjay4gIEluIHRoaXMgY2FzZSwgd2Uga25vdyB0aGF0IGlmIHRoZSB0eXBlDQorICAgICAgICAgICAgICAgIC8vICAgIGhhcyBhbnkgcmVxdWlyZWQgZmllbGRzLCB0aGV5J2xsIGJlIGZvdW5kIHdoZW4gd2UgcmV0dXJuIHRvIGl0LA0KKyAgICAgICAgICAgICAgICAvLyAgICBhbmQgdGhlIHdob2xlIGNhbGwgdG8gSGFzUmVxdWlyZWRGaWVsZHMoKSB3aWxsIHJldHVybiB0cnVlLg0KKyAgICAgICAgICAgICAgICAvLyAgICBUaGVyZWZvcmUsIHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgaWYgdGhpcyB0eXBlIGhhcyByZXF1aXJlZCBmaWVsZHMNCisgICAgICAgICAgICAgICAgLy8gICAgaGVyZS4NCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBhbHJlYWR5U2Vlblt0aGlzXSA9IDA7IC8vIFZhbHVlIGlzIGlycmVsZXZhbnQ7IHdlIHdhbnQgc2V0IHNlbWFudGljcw0KKw0KKyAgICAgICAgICAgIC8vIElmIHRoZSB0eXBlIGFsbG93cyBleHRlbnNpb25zLCBhbiBleHRlbnNpb24gd2l0aCBtZXNzYWdlIHR5cGUgY291bGQgY29udGFpbg0KKyAgICAgICAgICAgIC8vIHJlcXVpcmVkIGZpZWxkcywgc28gd2UgaGF2ZSB0byBiZSBjb25zZXJ2YXRpdmUgYW5kIGFzc3VtZSBzdWNoIGFuDQorICAgICAgICAgICAgLy8gZXh0ZW5zaW9uIGV4aXN0cy4NCisgICAgICAgICAgICBpZiAoUHJvdG8uRXh0ZW5zaW9uUmFuZ2VDb3VudCAhPSAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBmaWVsZCBpbiBGaWVsZHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNSZXF1aXJlZCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLk1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5NZXNzYWdlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuTWVzc2FnZVR5cGUuQ2hlY2tSZXF1aXJlZEZpZWxkcyhhbHJlYWR5U2VlbikpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNlZSBGaWxlRGVzY3JpcHRvci5SZXBsYWNlUHJvdG8NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIFJlcGxhY2VQcm90byhEZXNjcmlwdG9yUHJvdG8gbmV3UHJvdG8pDQorICAgICAgICB7DQorICAgICAgICAgICAgYmFzZS5SZXBsYWNlUHJvdG8obmV3UHJvdG8pOw0KKw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkVHlwZXMuQ291bnQ7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIG5lc3RlZFR5cGVzW2ldLlJlcGxhY2VQcm90byhuZXdQcm90by5HZXROZXN0ZWRUeXBlKGkpKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtVHlwZXMuQ291bnQ7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGVudW1UeXBlc1tpXS5SZXBsYWNlUHJvdG8obmV3UHJvdG8uR2V0RW51bVR5cGUoaSkpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5Db3VudDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZmllbGRzW2ldLlJlcGxhY2VQcm90byhuZXdQcm90by5HZXRGaWVsZChpKSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5Db3VudDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc1tpXS5SZXBsYWNlUHJvdG8obmV3UHJvdG8uR2V0RXh0ZW5zaW9uKGkpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRGVzY3JpcHRvcnMvTWV0aG9kRGVzY3JpcHRvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL01ldGhvZERlc2NyaXB0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllZGUyNAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL01ldGhvZERlc2NyaXB0b3IuY3MKQEAgLTAsMCArMSw5NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBEZXNjcmliZXMgYSBzaW5nbGUgbWV0aG9kIGluIGEgc2VydmljZS4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBNZXRob2REZXNjcmlwdG9yIDogSW5kZXhlZERlc2NyaXB0b3JCYXNlPE1ldGhvZERlc2NyaXB0b3JQcm90bywgTWV0aG9kT3B0aW9ucz4NCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTZXJ2aWNlRGVzY3JpcHRvciBzZXJ2aWNlOw0KKyAgICAgICAgcHJpdmF0ZSBNZXNzYWdlRGVzY3JpcHRvciBpbnB1dFR5cGU7DQorICAgICAgICBwcml2YXRlIE1lc3NhZ2VEZXNjcmlwdG9yIG91dHB1dFR5cGU7DQorDQorICAgICAgICAvLy8gPHZhbHVlPg0KKyAgICAgICAgLy8vIFRoZSBzZXJ2aWNlIHRoaXMgbWV0aG9kIGJlbG9uZ3MgdG8uDQorICAgICAgICAvLy8gPC92YWx1ZT4NCisgICAgICAgIHB1YmxpYyBTZXJ2aWNlRGVzY3JpcHRvciBTZXJ2aWNlDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHNlcnZpY2U7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8dmFsdWU+DQorICAgICAgICAvLy8gVGhlIG1ldGhvZCdzIGlucHV0IHR5cGUuDQorICAgICAgICAvLy8gPC92YWx1ZT4NCisgICAgICAgIHB1YmxpYyBNZXNzYWdlRGVzY3JpcHRvciBJbnB1dFR5cGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gaW5wdXRUeXBlOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHZhbHVlPg0KKyAgICAgICAgLy8vIFRoZSBtZXRob2QncyBpbnB1dCB0eXBlLg0KKyAgICAgICAgLy8vIDwvdmFsdWU+DQorICAgICAgICBwdWJsaWMgTWVzc2FnZURlc2NyaXB0b3IgT3V0cHV0VHlwZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBvdXRwdXRUeXBlOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBNZXRob2REZXNjcmlwdG9yKE1ldGhvZERlc2NyaXB0b3JQcm90byBwcm90bywgRmlsZURlc2NyaXB0b3IgZmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0b3IgcGFyZW50LCBpbnQgaW5kZXgpDQorICAgICAgICAgICAgOiBiYXNlKHByb3RvLCBmaWxlLCBwYXJlbnQuRnVsbE5hbWUgKyAiLiIgKyBwcm90by5OYW1lLCBpbmRleCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzZXJ2aWNlID0gcGFyZW50Ow0KKyAgICAgICAgICAgIGZpbGUuRGVzY3JpcHRvclBvb2wuQWRkU3ltYm9sKHRoaXMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBDcm9zc0xpbmsoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIElEZXNjcmlwdG9yIGxvb2t1cCA9IEZpbGUuRGVzY3JpcHRvclBvb2wuTG9va3VwU3ltYm9sKFByb3RvLklucHV0VHlwZSwgdGhpcyk7DQorICAgICAgICAgICAgaWYgKCEobG9va3VwIGlzIE1lc3NhZ2VEZXNjcmlwdG9yKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLCAiXCIiICsgUHJvdG8uSW5wdXRUeXBlICsgIlwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS4iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaW5wdXRUeXBlID0gKE1lc3NhZ2VEZXNjcmlwdG9yKSBsb29rdXA7DQorDQorICAgICAgICAgICAgbG9va3VwID0gRmlsZS5EZXNjcmlwdG9yUG9vbC5Mb29rdXBTeW1ib2woUHJvdG8uT3V0cHV0VHlwZSwgdGhpcyk7DQorICAgICAgICAgICAgaWYgKCEobG9va3VwIGlzIE1lc3NhZ2VEZXNjcmlwdG9yKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLCAiXCIiICsgUHJvdG8uT3V0cHV0VHlwZSArICJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG91dHB1dFR5cGUgPSAoTWVzc2FnZURlc2NyaXB0b3IpIGxvb2t1cDsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9QYWNrYWdlRGVzY3JpcHRvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL1BhY2thZ2VEZXNjcmlwdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNTQ5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9QYWNrYWdlRGVzY3JpcHRvci5jcwpAQCAtMCwwICsxLDczIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9ycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gUmVwcmVzZW50cyBhIHBhY2thZ2UgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIFdlIHVzZSBQYWNrYWdlRGVzY3JpcHRvcnMNCisgICAgLy8vIGp1c3QgYXMgcGxhY2Vob2xkZXJzIHNvIHRoYXQgc29tZW9uZSBjYW5ub3QgZGVmaW5lLCBzYXksIGEgbWVzc2FnZSB0eXBlDQorICAgIC8vLyB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGFuIGV4aXN0aW5nIHBhY2thZ2UuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIGludGVybmFsIHNlYWxlZCBjbGFzcyBQYWNrYWdlRGVzY3JpcHRvciA6IElEZXNjcmlwdG9yPElNZXNzYWdlPg0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBuYW1lOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgZnVsbE5hbWU7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVEZXNjcmlwdG9yIGZpbGU7DQorDQorICAgICAgICBpbnRlcm5hbCBQYWNrYWdlRGVzY3JpcHRvcihzdHJpbmcgbmFtZSwgc3RyaW5nIGZ1bGxOYW1lLCBGaWxlRGVzY3JpcHRvciBmaWxlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7DQorICAgICAgICAgICAgdGhpcy5mdWxsTmFtZSA9IGZ1bGxOYW1lOw0KKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgSU1lc3NhZ2UgUHJvdG8NCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmlsZS5Qcm90bzsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG5hbWU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdHJpbmcgRnVsbE5hbWUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZnVsbE5hbWU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBGaWxlDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpbGU7IH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9TZXJ2aWNlRGVzY3JpcHRvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0Rlc2NyaXB0b3JzL1NlcnZpY2VEZXNjcmlwdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxN2MwODMKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EZXNjcmlwdG9ycy9TZXJ2aWNlRGVzY3JpcHRvci5jcwpAQCAtMCwwICsxLDg5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBEZXNjcmliZXMgYSBzZXJ2aWNlIHR5cGUuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgU2VydmljZURlc2NyaXB0b3IgOiBJbmRleGVkRGVzY3JpcHRvckJhc2U8U2VydmljZURlc2NyaXB0b3JQcm90bywgU2VydmljZU9wdGlvbnM+DQorICAgIHsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUxpc3Q8TWV0aG9kRGVzY3JpcHRvcj4gbWV0aG9kczsNCisNCisgICAgICAgIHB1YmxpYyBTZXJ2aWNlRGVzY3JpcHRvcihTZXJ2aWNlRGVzY3JpcHRvclByb3RvIHByb3RvLCBGaWxlRGVzY3JpcHRvciBmaWxlLCBpbnQgaW5kZXgpDQorICAgICAgICAgICAgOiBiYXNlKHByb3RvLCBmaWxlLCBDb21wdXRlRnVsbE5hbWUoZmlsZSwgbnVsbCwgcHJvdG8uTmFtZSksIGluZGV4KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIG1ldGhvZHMgPSBEZXNjcmlwdG9yVXRpbC5Db252ZXJ0QW5kTWFrZVJlYWRPbmx5KHByb3RvLk1ldGhvZExpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1ldGhvZCwgaSkgPT4gbmV3IE1ldGhvZERlc2NyaXB0b3IobWV0aG9kLCBmaWxlLCB0aGlzLCBpKSk7DQorDQorICAgICAgICAgICAgZmlsZS5EZXNjcmlwdG9yUG9vbC5BZGRTeW1ib2wodGhpcyk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHZhbHVlPg0KKyAgICAgICAgLy8vIEFuIHVubW9kaWZpYWJsZSBsaXN0IG9mIG1ldGhvZHMgaW4gdGhpcyBzZXJ2aWNlLg0KKyAgICAgICAgLy8vIDwvdmFsdWU+DQorICAgICAgICBwdWJsaWMgSUxpc3Q8TWV0aG9kRGVzY3JpcHRvcj4gTWV0aG9kcw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBtZXRob2RzOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRmluZHMgYSBtZXRob2QgYnkgbmFtZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPlRoZSB1bnF1YWxpZmllZCBuYW1lIG9mIHRoZSBtZXRob2QgKGUuZy4gIkZvbyIpLjwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+VGhlIG1ldGhvZCdzIGRlY3NyaXB0b3IsIG9yIG51bGwgaWYgbm90IGZvdW5kLjwvcmV0dXJucz4NCisgICAgICAgIHB1YmxpYyBNZXRob2REZXNjcmlwdG9yIEZpbmRNZXRob2RCeU5hbWUoU3RyaW5nIG5hbWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEZpbGUuRGVzY3JpcHRvclBvb2wuRmluZFN5bWJvbDxNZXRob2REZXNjcmlwdG9yPihGdWxsTmFtZSArICIuIiArIG5hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBDcm9zc0xpbmsoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKE1ldGhvZERlc2NyaXB0b3IgbWV0aG9kIGluIG1ldGhvZHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBtZXRob2QuQ3Jvc3NMaW5rKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgdm9pZCBSZXBsYWNlUHJvdG8oU2VydmljZURlc2NyaXB0b3JQcm90byBuZXdQcm90bykNCisgICAgICAgIHsNCisgICAgICAgICAgICBiYXNlLlJlcGxhY2VQcm90byhuZXdQcm90byk7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLkNvdW50OyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBtZXRob2RzW2ldLlJlcGxhY2VQcm90byhuZXdQcm90by5HZXRNZXRob2QoaSkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EeW5hbWljTWVzc2FnZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0R5bmFtaWNNZXNzYWdlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOWVmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9EeW5hbWljTWVzc2FnZS5jcwpAQCAtMCwwICsxLDUxMiBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgSU1lc3NhZ2UgdGhhdCBjYW4gcmVwcmVzZW50IGFyYml0cmFyeSB0eXBlcywgZ2l2ZW4gYSBNZXNzYWdlYURlc2NyaXB0b3IuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBEeW5hbWljTWVzc2FnZSA6IEFic3RyYWN0TWVzc2FnZTxEeW5hbWljTWVzc2FnZSwgRHluYW1pY01lc3NhZ2UuQnVpbGRlcj4NCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZXNzYWdlRGVzY3JpcHRvciB0eXBlOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGaWVsZFNldCBmaWVsZHM7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTaXplID0gLTE7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIER5bmFtaWNNZXNzYWdlIHdpdGggdGhlIGdpdmVuIEZpZWxkU2V0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmllbGRzIj48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1bmtub3duRmllbGRzIj48L3BhcmFtPg0KKyAgICAgICAgcHJpdmF0ZSBEeW5hbWljTWVzc2FnZShNZXNzYWdlRGVzY3JpcHRvciB0eXBlLCBGaWVsZFNldCBmaWVsZHMsIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7DQorICAgICAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7DQorICAgICAgICAgICAgdGhpcy51bmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkczsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIGEgRHluYW1pY01lc3NhZ2UgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4NCisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIEdldERlZmF1bHRJbnN0YW5jZShNZXNzYWdlRGVzY3JpcHRvciB0eXBlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgRHluYW1pY01lc3NhZ2UodHlwZSwgRmllbGRTZXQuRGVmYXVsdEluc3RhbmNlLCBVbmtub3duRmllbGRTZXQuRGVmYXVsdEluc3RhbmNlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQYXJzZXMgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGZyb20gdGhlIGdpdmVuIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIFBhcnNlRnJvbShNZXNzYWdlRGVzY3JpcHRvciB0eXBlLCBJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSBDcmVhdGVCdWlsZGVyKHR5cGUpOw0KKyAgICAgICAgICAgIEJ1aWxkZXIgZHluYW1pY0J1aWxkZXIgPSBidWlsZGVyLk1lcmdlRnJvbShpbnB1dCk7DQorICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNCdWlsZGVyLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUGFyc2UgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGZyb20gdGhlIGdpdmVuIHN0cmVhbSBhbmQgZXh0ZW5zaW9uIHJlZ2lzdHJ5Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXQiPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImV4dGVuc2lvblJlZ2lzdHJ5Ij48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2UgUGFyc2VGcm9tKE1lc3NhZ2VEZXNjcmlwdG9yIHR5cGUsIElDb2RlZElucHV0U3RyZWFtIGlucHV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgQnVpbGRlciBidWlsZGVyID0gQ3JlYXRlQnVpbGRlcih0eXBlKTsNCisgICAgICAgICAgICBCdWlsZGVyIGR5bmFtaWNCdWlsZGVyID0gYnVpbGRlci5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICByZXR1cm4gZHluYW1pY0J1aWxkZXIuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQYXJzZXMgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGZyb20gdGhlIGdpdmVuIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIFBhcnNlRnJvbShNZXNzYWdlRGVzY3JpcHRvciB0eXBlLCBTdHJlYW0gaW5wdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgQnVpbGRlciBidWlsZGVyID0gQ3JlYXRlQnVpbGRlcih0eXBlKTsNCisgICAgICAgICAgICBCdWlsZGVyIGR5bmFtaWNCdWlsZGVyID0gYnVpbGRlci5NZXJnZUZyb20oaW5wdXQpOw0KKyAgICAgICAgICAgIHJldHVybiBkeW5hbWljQnVpbGRlci5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBhcnNlIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZSBmcm9tIHRoZSBnaXZlbiBzdHJlYW0gYW5kIGV4dGVuc2lvbiByZWdpc3RyeS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlucHV0Ij48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJleHRlbnNpb25SZWdpc3RyeSI+PC9wYXJhbT4NCisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIFBhcnNlRnJvbShNZXNzYWdlRGVzY3JpcHRvciB0eXBlLCBTdHJlYW0gaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IENyZWF0ZUJ1aWxkZXIodHlwZSk7DQorICAgICAgICAgICAgQnVpbGRlciBkeW5hbWljQnVpbGRlciA9IGJ1aWxkZXIuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNCdWlsZGVyLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUGFyc2UgPHBhcmFtcmVmIG5hbWU9ImRhdGEiLz4gYXMgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCByZXR1cm4gaXQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZSBQYXJzZUZyb20oTWVzc2FnZURlc2NyaXB0b3IgdHlwZSwgQnl0ZVN0cmluZyBkYXRhKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IENyZWF0ZUJ1aWxkZXIodHlwZSk7DQorICAgICAgICAgICAgQnVpbGRlciBkeW5hbWljQnVpbGRlciA9IGJ1aWxkZXIuTWVyZ2VGcm9tKGRhdGEpOw0KKyAgICAgICAgICAgIHJldHVybiBkeW5hbWljQnVpbGRlci5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBhcnNlIDxwYXJhbXJlZiBuYW1lPSJkYXRhIi8+IGFzIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgcmV0dXJuIGl0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2UgUGFyc2VGcm9tKE1lc3NhZ2VEZXNjcmlwdG9yIHR5cGUsIEJ5dGVTdHJpbmcgZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IENyZWF0ZUJ1aWxkZXIodHlwZSk7DQorICAgICAgICAgICAgQnVpbGRlciBkeW5hbWljQnVpbGRlciA9IGJ1aWxkZXIuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICByZXR1cm4gZHluYW1pY0J1aWxkZXIuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQYXJzZSA8cGFyYW1yZWYgbmFtZT0iZGF0YSIvPiBhcyBhIG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgYW5kIHJldHVybiBpdC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIFBhcnNlRnJvbShNZXNzYWdlRGVzY3JpcHRvciB0eXBlLCBieXRlW10gZGF0YSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSBDcmVhdGVCdWlsZGVyKHR5cGUpOw0KKyAgICAgICAgICAgIEJ1aWxkZXIgZHluYW1pY0J1aWxkZXIgPSBidWlsZGVyLk1lcmdlRnJvbShkYXRhKTsNCisgICAgICAgICAgICByZXR1cm4gZHluYW1pY0J1aWxkZXIuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQYXJzZSA8cGFyYW1yZWYgbmFtZT0iZGF0YSIvPiBhcyBhIG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgYW5kIHJldHVybiBpdC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIFBhcnNlRnJvbShNZXNzYWdlRGVzY3JpcHRvciB0eXBlLCBieXRlW10gZGF0YSwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgQnVpbGRlciBidWlsZGVyID0gQ3JlYXRlQnVpbGRlcih0eXBlKTsNCisgICAgICAgICAgICBCdWlsZGVyIGR5bmFtaWNCdWlsZGVyID0gYnVpbGRlci5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgIHJldHVybiBkeW5hbWljQnVpbGRlci5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYSBidWlsZGVyIGZvciB0aGUgZ2l2ZW4gdHlwZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihNZXNzYWdlRGVzY3JpcHRvciB0eXBlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcih0eXBlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgYnVpbGRlciBmb3IgYSBtZXNzYWdlIG9mIHRoZSBzYW1lIHR5cGUgYXMgPHBhcmFtcmVmIG5hbWU9InByb3RvdHlwZSIvPiwNCisgICAgICAgIC8vLyBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCB0aGUgc2FtZSBjb250ZW50cy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb3RvdHlwZSI+PC9wYXJhbT4NCisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihJTWVzc2FnZSBwcm90b3R5cGUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZS5EZXNjcmlwdG9yRm9yVHlwZSkuTWVyZ2VGcm9tKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgSU1lc3NhZ2UgaW50ZXJmYWNlLg0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIE1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHR5cGU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBEeW5hbWljTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIEdldERlZmF1bHRJbnN0YW5jZSh0eXBlKTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElEaWN0aW9uYXJ5PEZpZWxkRGVzY3JpcHRvciwgb2JqZWN0PiBBbGxGaWVsZHMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGRzLkFsbEZpZWxkRGVzY3JpcHRvcnM7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEhhc0ZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBWZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7DQorICAgICAgICAgICAgcmV0dXJuIGZpZWxkcy5IYXNGaWVsZChmaWVsZCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IHRoaXNbRmllbGREZXNjcmlwdG9yIGZpZWxkXQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOw0KKyAgICAgICAgICAgICAgICBvYmplY3QgcmVzdWx0ID0gZmllbGRzW2ZpZWxkXTsNCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBHZXREZWZhdWx0SW5zdGFuY2UoZmllbGQuTWVzc2FnZVR5cGUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRSZXBlYXRlZEZpZWxkQ291bnQoRmllbGREZXNjcmlwdG9yIGZpZWxkKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsNCisgICAgICAgICAgICByZXR1cm4gZmllbGRzLkdldFJlcGVhdGVkRmllbGRDb3VudChmaWVsZCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IHRoaXNbRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXhdDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBWZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZHNbZmllbGQsIGluZGV4XTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVW5rbm93bkZpZWxkU2V0IFVua25vd25GaWVsZHMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdW5rbm93bkZpZWxkczsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGJvb2wgSW5pdGlhbGl6ZWQNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGRzLklzSW5pdGlhbGl6ZWRXaXRoUmVzcGVjdFRvKHR5cGUuRmllbGRzKTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgICAgICAgICAgaWYgKHR5cGUuT3B0aW9ucy5NZXNzYWdlU2V0V2lyZUZvcm1hdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuV3JpdGVBc01lc3NhZ2VTZXRUbyhvdXRwdXQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2l6ZTsNCisgICAgICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHNpemUgPSBmaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgICAgIGlmICh0eXBlLk9wdGlvbnMuTWVzc2FnZVNldFdpcmVGb3JtYXQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gdW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gdW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBtZW1vaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHR5cGUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlckZvclR5cGUoKS5NZXJnZUZyb20odGhpcyk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVmVyaWZpZXMgdGhhdCB0aGUgZmllbGQgaXMgYSBmaWVsZCBvZiB0aGlzIG1lc3NhZ2UuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFZlcmlmeUNvbnRhaW5pbmdUeXBlKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZmllbGQuQ29udGFpbmluZ1R5cGUgIT0gdHlwZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiRmllbGREZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQnVpbGRlciBmb3IgZHluYW1pYyBtZXNzYWdlcy4gSW5zdGFuY2VzIGFyZSBjcmVhdGVkIHdpdGggRHluYW1pY01lc3NhZ2UuQ3JlYXRlQnVpbGRlci4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IEFic3RyYWN0QnVpbGRlcjxEeW5hbWljTWVzc2FnZSwgQnVpbGRlcj4NCisgICAgICAgIHsNCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lc3NhZ2VEZXNjcmlwdG9yIHR5cGU7DQorICAgICAgICAgICAgcHJpdmF0ZSBGaWVsZFNldCBmaWVsZHM7DQorICAgICAgICAgICAgcHJpdmF0ZSBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkczsNCisNCisgICAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKE1lc3NhZ2VEZXNjcmlwdG9yIHR5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOw0KKyAgICAgICAgICAgICAgICB0aGlzLmZpZWxkcyA9IEZpZWxkU2V0LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICAgICAgICAgIHRoaXMudW5rbm93bkZpZWxkcyA9IFVua25vd25GaWVsZFNldC5EZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBmaWVsZHMuQ2xlYXIoKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShJTWVzc2FnZSBvdGhlcikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChvdGhlci5EZXNjcmlwdG9yRm9yVHlwZSAhPSB0eXBlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIk1lcmdlRnJvbShJTWVzc2FnZSkgY2FuIG9ubHkgbWVyZ2UgbWVzc2FnZXMgb2YgdGhlIHNhbWUgdHlwZS4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmaWVsZHMuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgICAgICAgTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKER5bmFtaWNNZXNzYWdlIG90aGVyKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgSU1lc3NhZ2UgZG93bmNhc3QgPSBvdGhlcjsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShkb3duY2FzdCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBEeW5hbWljTWVzc2FnZSBCdWlsZCgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGRzICE9IG51bGwgJiYgIUlzSW5pdGlhbGl6ZWQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbihuZXcgRHluYW1pY01lc3NhZ2UodHlwZSwgZmllbGRzLCB1bmtub3duRmllbGRzKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIEJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAgICAgLy8vIEhlbHBlciBmb3IgRHluYW1pY01lc3NhZ2UuUGFyc2VGcm9tKCkgbWV0aG9kcyB0byBjYWxsLiBUaHJvd3MNCisgICAgICAgICAgICAvLy8gSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIA0KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgICAgICBpbnRlcm5hbCBEeW5hbWljTWVzc2FnZSBCdWlsZFBhcnNlZCgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoIUlzSW5pdGlhbGl6ZWQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbihuZXcgRHluYW1pY01lc3NhZ2UodHlwZSwgZmllbGRzLCB1bmtub3duRmllbGRzKSkuDQorICAgICAgICAgICAgICAgICAgICAgICAgQXNJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBEeW5hbWljTWVzc2FnZSBCdWlsZFBhcnRpYWwoKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQnVpbGQoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBvbiB0aGlzIEJ1aWxkZXIuIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZmllbGRzLk1ha2VJbW11dGFibGUoKTsNCisgICAgICAgICAgICAgICAgRHluYW1pY01lc3NhZ2UgcmVzdWx0ID0gbmV3IER5bmFtaWNNZXNzYWdlKHR5cGUsIGZpZWxkcywgdW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgIGZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBCdWlsZGVyIHJlc3VsdCA9IG5ldyBCdWlsZGVyKHR5cGUpOw0KKyAgICAgICAgICAgICAgICByZXN1bHQuZmllbGRzLk1lcmdlRnJvbShmaWVsZHMpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmllbGRzLklzSW5pdGlhbGl6ZWRXaXRoUmVzcGVjdFRvKHR5cGUuRmllbGRzKTsgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oSUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkc0J1aWxkZXIgPSBVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih1bmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkc0J1aWxkZXIuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGhpcyk7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzQnVpbGRlci5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIE1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHlwZTsgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRHluYW1pY01lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIEdldERlZmF1bHRJbnN0YW5jZSh0eXBlKTsgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSURpY3Rpb25hcnk8RmllbGREZXNjcmlwdG9yLCBvYmplY3Q+IEFsbEZpZWxkcw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkcy5BbGxGaWVsZERlc2NyaXB0b3JzOyB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOw0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuTWFwcGVkVHlwZSAhPSBNYXBwZWRUeXBlLk1lc3NhZ2UpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ3JlYXRlQnVpbGRlckZvckZpZWxkIGlzIG9ubHkgdmFsaWQgZm9yIGZpZWxkcyB3aXRoIG1lc3NhZ2UgdHlwZS4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoZmllbGQuTWVzc2FnZVR5cGUpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBIYXNGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBWZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZHMuSGFzRmllbGQoZmllbGQpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IHRoaXNbRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXhdDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgVmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkc1tmaWVsZCwgaW5kZXhdOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHNldA0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBWZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7DQorICAgICAgICAgICAgICAgICAgICBmaWVsZHNbZmllbGQsIGluZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgdGhpc1tGaWVsZERlc2NyaXB0b3IgZmllbGRdDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgVmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOw0KKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHJlc3VsdCA9IGZpZWxkc1tmaWVsZF07DQorICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gR2V0RGVmYXVsdEluc3RhbmNlKGZpZWxkLk1lc3NhZ2VUeXBlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgc2V0DQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsNCisgICAgICAgICAgICAgICAgICAgIGZpZWxkc1tmaWVsZF0gPSB2YWx1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhckZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsNCisgICAgICAgICAgICAgICAgZmllbGRzLkNsZWFyRmllbGQoZmllbGQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRSZXBlYXRlZEZpZWxkQ291bnQoRmllbGREZXNjcmlwdG9yIGZpZWxkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmllbGRzLkdldFJlcGVhdGVkRmllbGRDb3VudChmaWVsZCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIEFkZFJlcGVhdGVkRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkLCBvYmplY3QgdmFsdWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBWZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7DQorICAgICAgICAgICAgICAgIGZpZWxkcy5BZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVW5rbm93bkZpZWxkU2V0IFVua25vd25GaWVsZHMNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiB1bmtub3duRmllbGRzOyB9DQorICAgICAgICAgICAgICAgIHNldCB7IHVua25vd25GaWVsZHMgPSB2YWx1ZTsgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAgICAgLy8vIFZlcmlmaWVzIHRoYXQgdGhlIGZpZWxkIGlzIGEgZmllbGQgb2YgdGhpcyBtZXNzYWdlLg0KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWVsZCI+PC9wYXJhbT4NCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgVmVyaWZ5Q29udGFpbmluZ1R5cGUoRmllbGREZXNjcmlwdG9yIGZpZWxkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLkNvbnRhaW5pbmdUeXBlICE9IHR5cGUpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiRmllbGREZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9FbnVtTGl0ZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0VudW1MaXRlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMDFlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9FbnVtTGl0ZS5jcwpAQCAtMCwwICsxLDIzNCBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vPHN1bW1hcnk+DQorICAgIC8vL0ludGVyZmFjZSBmb3IgYW4gZW51bSB2YWx1ZSBvciB2YWx1ZSBkZXNjcmlwdG9yLCB0byBiZSB1c2VkIGluIEZpZWxkU2V0Lg0KKyAgICAvLy9UaGUgbGl0ZSBsaWJyYXJ5IHN0b3JlcyBlbnVtIHZhbHVlcyBkaXJlY3RseSBpbiBGaWVsZFNldHMgYnV0IHRoZSBmdWxsDQorICAgIC8vL2xpYnJhcnkgc3RvcmVzIEVudW1WYWx1ZURlc2NyaXB0b3JzIGluIG9yZGVyIHRvIGJldHRlciBzdXBwb3J0IHJlZmxlY3Rpb24uDQorICAgIC8vLzwvc3VtbWFyeT4NCisgICAgcHVibGljIGludGVyZmFjZSBJRW51bUxpdGUNCisgICAgew0KKyAgICAgICAgaW50IE51bWJlciB7IGdldDsgfQ0KKyAgICAgICAgc3RyaW5nIE5hbWUgeyBnZXQ7IH0NCisgICAgfQ0KKw0KKyAgICAvLy88c3VtbWFyeT4NCisgICAgLy8vSW50ZXJmYWNlIGZvciBhbiBvYmplY3Qgd2hpY2ggbWFwcyBpbnRlZ2VycyB0byB7QGxpbmsgRW51bUxpdGV9cy4NCisgICAgLy8ve0BsaW5rIERlc2NyaXB0b3JzLkVudW1EZXNjcmlwdG9yfSBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIGJ5IG1hcHBpbmcNCisgICAgLy8vbnVtYmVycyB0byB7QGxpbmsgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvcn1zLiAgQWRkaXRpb25hbGx5LA0KKyAgICAvLy9ldmVyeSBnZW5lcmF0ZWQgZW51bSB0eXBlIGhhcyBhIHN0YXRpYyBtZXRob2QgaW50ZXJuYWxHZXRWYWx1ZU1hcCgpIHdoaWNoDQorICAgIC8vL3JldHVybnMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyB0eXBlIHRoYXQgbWFwcyBudW1iZXJzIHRvIGVudW0gdmFsdWVzLg0KKyAgICAvLy88L3N1bW1hcnk+DQorICAgIHB1YmxpYyBpbnRlcmZhY2UgSUVudW1MaXRlTWFwPFQ+IDogSUVudW1MaXRlTWFwDQorICAgICAgICB3aGVyZSBUIDogSUVudW1MaXRlDQorICAgIHsNCisgICAgICAgIG5ldyBUIEZpbmRWYWx1ZUJ5TnVtYmVyKGludCBudW1iZXIpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnRlcmZhY2UgSUVudW1MaXRlTWFwDQorICAgIHsNCisgICAgICAgIGJvb2wgSXNWYWxpZFZhbHVlKElFbnVtTGl0ZSB2YWx1ZSk7DQorICAgICAgICBJRW51bUxpdGUgRmluZFZhbHVlQnlOdW1iZXIoaW50IG51bWJlcik7DQorICAgICAgICBJRW51bUxpdGUgRmluZFZhbHVlQnlOYW1lKHN0cmluZyBuYW1lKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgY2xhc3MgRW51bUxpdGVNYXA8VEVudW0+IDogSUVudW1MaXRlTWFwPElFbnVtTGl0ZT4NCisgICAgICAgIHdoZXJlIFRFbnVtIDogc3RydWN0LCBJQ29tcGFyYWJsZSwgSUZvcm1hdHRhYmxlDQorICAgIHsNCisgICAgICAgIHByaXZhdGUgc3RydWN0IEVudW1WYWx1ZSA6IElFbnVtTGl0ZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVEVudW0gdmFsdWU7DQorDQorICAgICAgICAgICAgcHVibGljIEVudW1WYWx1ZShURW51bSB2YWx1ZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaW50IElFbnVtTGl0ZS5OdW1iZXINCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBDb252ZXJ0LlRvSW50MzIodmFsdWUpOyB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHN0cmluZyBJRW51bUxpdGUuTmFtZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHZhbHVlLlRvU3RyaW5nKCk7IH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgSUVudW1MaXRlIEZpbmRWYWx1ZUJ5TnVtYmVyKGludCBudW1iZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgVEVudW0gdmFsID0gZGVmYXVsdChURW51bSk7DQorICAgICAgICAgICAgaWYgKEVudW1QYXJzZXI8VEVudW0+LlRyeUNvbnZlcnQobnVtYmVyLCByZWYgdmFsKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW51bVZhbHVlKHZhbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIElFbnVtTGl0ZSBGaW5kVmFsdWVCeU5hbWUoc3RyaW5nIG5hbWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgVEVudW0gdmFsID0gZGVmYXVsdChURW51bSk7DQorICAgICAgICAgICAgaWYgKEVudW1QYXJzZXI8VEVudW0+LlRyeUNvbnZlcnQobmFtZSwgcmVmIHZhbCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudW1WYWx1ZSh2YWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBib29sIElzVmFsaWRWYWx1ZShJRW51bUxpdGUgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgVEVudW0gdmFsID0gZGVmYXVsdChURW51bSk7DQorICAgICAgICAgICAgcmV0dXJuIEVudW1QYXJzZXI8VEVudW0+LlRyeUNvbnZlcnQodmFsdWUuTnVtYmVyLCByZWYgdmFsKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVudW1QYXJzZXI8VD4gd2hlcmUgVCA6IHN0cnVjdCwgSUNvbXBhcmFibGUsIElGb3JtYXR0YWJsZQ0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEaWN0aW9uYXJ5PGludCwgVD4gX2J5TnVtYmVyOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxzdHJpbmcsIFQ+IF9ieU5hbWU7DQorDQorICAgICAgICBzdGF0aWMgRW51bVBhcnNlcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50W10gYXJyYXk7DQorICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgew0KKyNpZiBDTElFTlRQUk9GSUxFDQorICAgICAgICAgICAgICAgIC8vIEl0IHdpbGwgYWN0dWFsbHkgYmUgYSBUW10sIGJ1dCB0aGUgQ0xSIHdpbGwgbGV0IHVzIGNvbnZlcnQuDQorICAgICAgICAgICAgICAgIGFycmF5ID0gKGludFtdKUVudW0uR2V0VmFsdWVzKHR5cGVvZihUKSk7DQorI2Vsc2UNCisgICAgICAgICAgICAgICAgdmFyIHRlbXAgPSBuZXcgTGlzdDxUPigpOw0KKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZmxkIGluIHR5cGVvZiAoVCkuR2V0RmllbGRzKFN5c3RlbS5SZWZsZWN0aW9uLkJpbmRpbmdGbGFncy5QdWJsaWMgfCBTeXN0ZW0uUmVmbGVjdGlvbi5CaW5kaW5nRmxhZ3MuU3RhdGljKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZsZC5Jc0xpdGVyYWwgJiYgZmxkLkZpZWxkVHlwZSA9PSB0eXBlb2YoVCkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5BZGQoKFQpZmxkLkdldFZhbHVlKG51bGwpKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBhcnJheSA9IChpbnRbXSkob2JqZWN0KXRlbXAuVG9BcnJheSgpOw0KKyNlbmRpZg0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgX2J5TnVtYmVyID0gbnVsbDsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBfYnlOdW1iZXIgPSBuZXcgRGljdGlvbmFyeTxpbnQsIFQ+KGFycmF5Lkxlbmd0aCk7DQorICAgICAgICAgICAgZm9yZWFjaCAoaW50IGkgaW4gYXJyYXkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBfYnlOdW1iZXJbaV0gPSAoVCkob2JqZWN0KWk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIFRyeUNvbnZlcnQob2JqZWN0IGlucHV0LCByZWYgVCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoaW5wdXQgaXMgaW50IHx8IGlucHV0IGlzIFQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ5Q29udmVydCgoaW50KWlucHV0LCByZWYgdmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoaW5wdXQgaXMgc3RyaW5nKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRyeUNvbnZlcnQoKHN0cmluZylpbnB1dCwgcmVmIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRyaWVzIHRvIGNvbnZlcnQgYW4gaW50ZWdlciB0byBpdHMgZW51bSByZXByZXNlbnRhdGlvbi4gVGhpcyB3b3VsZCB0YWtlIGFuIG91dCBwYXJhbWV0ZXIsDQorICAgICAgICAvLy8gYnV0IHRoZSBjYWxsZXIgdXNlcyByZWYsIHNvIHRoaXMgYXBwcm9hY2ggaXMgc2ltcGxlci4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgVHJ5Q29udmVydChpbnQgbnVtYmVyLCByZWYgVCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBudWxsIGluZGljYXRlcyBhbiBleGNlcHRpb24gYXQgY29uc3RydWN0aW9uLCB1c2UgbmF0aXZlIElzRGVmaW5lZC4NCisgICAgICAgICAgICBpZiAoX2J5TnVtYmVyID09IG51bGwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRW51bS5Jc0RlZmluZWQodHlwZW9mKFQpLCBudW1iZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBUIGNvbnZlcnRlZDsNCisgICAgICAgICAgICBpZiAoX2J5TnVtYmVyICE9IG51bGwgJiYgX2J5TnVtYmVyLlRyeUdldFZhbHVlKG51bWJlciwgb3V0IGNvbnZlcnRlZCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbnZlcnRlZDsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUcmllcyB0byBjb252ZXJ0IGEgc3RyaW5nIHRvIGl0cyBlbnVtIHJlcHJlc2VudGF0aW9uLiBUaGlzIHdvdWxkIHRha2UgYW4gb3V0IHBhcmFtZXRlciwNCisgICAgICAgIC8vLyBidXQgdGhlIGNhbGxlciB1c2VzIHJlZiwgc28gdGhpcyBhcHByb2FjaCBpcyBzaW1wbGVyLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBUcnlDb252ZXJ0KHN0cmluZyBuYW1lLCByZWYgVCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBudWxsIGluZGljYXRlcyBhbiBleGNlcHRpb24gYXQgY29uc3RydWN0aW9uLCB1c2UgbmF0aXZlIElzRGVmaW5lZC9QYXJzZS4NCisgICAgICAgICAgICBpZiAoX2J5TnVtYmVyID09IG51bGwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoRW51bS5Jc0RlZmluZWQodHlwZW9mKFQpLCBuYW1lKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoVClFbnVtLlBhcnNlKHR5cGVvZihUKSwgbmFtZSwgZmFsc2UpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBrbm93biByYWNlLCBwb3NzaWJsZSBtdWx0aXBsZSB0aHJlYWRzIGVhY2ggYnVpbGQgdGhlaXIgb3duIGNvcHk7IGhvd2V2ZXIsIGxhc3Qgd3JpdGVyIHdpbGwgd2luDQorICAgICAgICAgICAgdmFyIG1hcCA9IF9ieU5hbWU7DQorICAgICAgICAgICAgaWYgKG1hcCA9PSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbWFwID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBUPihTdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBvc3NpYmxlIGluIF9ieU51bWJlci5WYWx1ZXMpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIG1hcFtwb3NzaWJsZS5Ub1N0cmluZygpXSA9IHBvc3NpYmxlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIF9ieU5hbWUgPSBtYXA7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIFQgY29udmVydGVkOw0KKyAgICAgICAgICAgIGlmIChtYXAuVHJ5R2V0VmFsdWUobmFtZSwgb3V0IGNvbnZlcnRlZCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbnZlcnRlZDsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9FeHRlbmRhYmxlQnVpbGRlci5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0V4dGVuZGFibGVCdWlsZGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMWZmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9FeHRlbmRhYmxlQnVpbGRlci5jcwpAQCAtMCwwICsxLDIxMyBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBwdWJsaWMgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyBFeHRlbmRhYmxlQnVpbGRlcjxUTWVzc2FnZSwgVEJ1aWxkZXI+IDogR2VuZXJhdGVkQnVpbGRlcjxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgICAgICB3aGVyZSBUTWVzc2FnZSA6IEV4dGVuZGFibGVNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgIHdoZXJlIFRCdWlsZGVyIDogR2VuZXJhdGVkQnVpbGRlcjxUTWVzc2FnZSwgVEJ1aWxkZXI+LCBuZXcoKQ0KKyAgICB7DQorICAgICAgICBwcm90ZWN0ZWQgRXh0ZW5kYWJsZUJ1aWxkZXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENoZWNrcyBpZiBhIHNpbmd1bGFyIGV4dGVuc2lvbiBpcyBwcmVzZW50DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRXh0ZW5zaW9uPFRFeHRlbnNpb24+KEdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8VEV4dGVuc2lvbj4gZXh0ZW5zaW9uKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBNZXNzYWdlQmVpbmdCdWlsdC5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSByZXBlYXRlZCBleHRlbnNpb24uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGludCBHZXRFeHRlbnNpb25Db3VudDxURXh0ZW5zaW9uPihHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPElMaXN0PFRFeHRlbnNpb24+PiBleHRlbnNpb24pDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VCZWluZ0J1aWx0LkdldEV4dGVuc2lvbkNvdW50KGV4dGVuc2lvbik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBURXh0ZW5zaW9uIEdldEV4dGVuc2lvbjxURXh0ZW5zaW9uPihHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPFRFeHRlbnNpb24+IGV4dGVuc2lvbikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTWVzc2FnZUJlaW5nQnVpbHQuR2V0RXh0ZW5zaW9uKGV4dGVuc2lvbik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgVEV4dGVuc2lvbiBHZXRFeHRlbnNpb248VEV4dGVuc2lvbj4oR2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxJTGlzdDxURXh0ZW5zaW9uPj4gZXh0ZW5zaW9uLCBpbnQgaW5kZXgpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VCZWluZ0J1aWx0LkdldEV4dGVuc2lvbihleHRlbnNpb24sIGluZGV4KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXRzIHRoZSB2YWx1ZSBvZiBhbiBleHRlbnNpb24uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIFRCdWlsZGVyIFNldEV4dGVuc2lvbjxURXh0ZW5zaW9uPihHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPFRFeHRlbnNpb24+IGV4dGVuc2lvbiwgVEV4dGVuc2lvbiB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBFeHRlbmRhYmxlTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+IG1lc3NhZ2UgPSBNZXNzYWdlQmVpbmdCdWlsdDsNCisgICAgICAgICAgICBtZXNzYWdlLlZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7DQorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25zW2V4dGVuc2lvbi5EZXNjcmlwdG9yXSA9IGV4dGVuc2lvbi5Ub1JlZmxlY3Rpb25UeXBlKHZhbHVlKTsNCisgICAgICAgICAgICByZXR1cm4gVGhpc0J1aWxkZXI7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gU2V0cyB0aGUgdmFsdWUgb2Ygb25lIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBleHRlbnNpb24uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIFRCdWlsZGVyIFNldEV4dGVuc2lvbjxURXh0ZW5zaW9uPihHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPElMaXN0PFRFeHRlbnNpb24+PiBleHRlbnNpb24sIGludCBpbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEV4dGVuc2lvbiB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBFeHRlbmRhYmxlTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+IG1lc3NhZ2UgPSBNZXNzYWdlQmVpbmdCdWlsdDsNCisgICAgICAgICAgICBtZXNzYWdlLlZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7DQorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25zW2V4dGVuc2lvbi5EZXNjcmlwdG9yLCBpbmRleF0gPSBleHRlbnNpb24uU2luZ3VsYXJUb1JlZmxlY3Rpb25UeXBlKHZhbHVlKTsNCisgICAgICAgICAgICByZXR1cm4gVGhpc0J1aWxkZXI7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQXBwZW5kcyBhIHZhbHVlIHRvIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBUQnVpbGRlciBBZGRFeHRlbnNpb248VEV4dGVuc2lvbj4oR2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxJTGlzdDxURXh0ZW5zaW9uPj4gZXh0ZW5zaW9uLCBURXh0ZW5zaW9uIHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEV4dGVuZGFibGVNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4gbWVzc2FnZSA9IE1lc3NhZ2VCZWluZ0J1aWx0Ow0KKyAgICAgICAgICAgIG1lc3NhZ2UuVmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsNCisgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvbnMuQWRkUmVwZWF0ZWRGaWVsZChleHRlbnNpb24uRGVzY3JpcHRvciwgZXh0ZW5zaW9uLlNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZSh2YWx1ZSkpOw0KKyAgICAgICAgICAgIHJldHVybiBUaGlzQnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDbGVhcnMgYW4gZXh0ZW5zaW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBUQnVpbGRlciBDbGVhckV4dGVuc2lvbjxURXh0ZW5zaW9uPihHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPFRFeHRlbnNpb24+IGV4dGVuc2lvbikNCisgICAgICAgIHsNCisgICAgICAgICAgICBFeHRlbmRhYmxlTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+IG1lc3NhZ2UgPSBNZXNzYWdlQmVpbmdCdWlsdDsNCisgICAgICAgICAgICBtZXNzYWdlLlZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7DQorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25zLkNsZWFyRmllbGQoZXh0ZW5zaW9uLkRlc2NyaXB0b3IpOw0KKyAgICAgICAgICAgIHJldHVybiBUaGlzQnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBwYXJzZSBhbiB1bmtub3duIGZpZWxkIG9yIGFuIGV4dGVuc2lvbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSB1bmxlc3MgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAgdGFnPC9yZXR1cm5zPg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBQYXJzZVVua25vd25GaWVsZChJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5LCB1aW50IHRhZywgc3RyaW5nIGZpZWxkTmFtZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gdW5rbm93bkZpZWxkcy5NZXJnZUZpZWxkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRoaXMsIHRhZywgZmllbGROYW1lKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAgICAgICAgLy8gUmVmbGVjdGlvbg0KKw0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCB0aGlzW0ZpZWxkRGVzY3JpcHRvciBmaWVsZCwgaW50IGluZGV4XQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHNldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzRXh0ZW5zaW9uKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBFeHRlbmRhYmxlTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+IG1lc3NhZ2UgPSBNZXNzYWdlQmVpbmdCdWlsdDsNCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOw0KKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25zW2ZpZWxkLCBpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGJhc2VbZmllbGQsIGluZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCB0aGlzW0ZpZWxkRGVzY3JpcHRvciBmaWVsZF0NCisgICAgICAgIHsNCisgICAgICAgICAgICBzZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Jc0V4dGVuc2lvbikNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgRXh0ZW5kYWJsZU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPiBtZXNzYWdlID0gTWVzc2FnZUJlaW5nQnVpbHQ7DQorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsNCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uc1tmaWVsZF0gPSB2YWx1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGJhc2VbZmllbGRdID0gdmFsdWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVEJ1aWxkZXIgQ2xlYXJGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGZpZWxkLklzRXh0ZW5zaW9uKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRXh0ZW5kYWJsZU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPiBtZXNzYWdlID0gTWVzc2FnZUJlaW5nQnVpbHQ7DQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuVmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOw0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvbnMuQ2xlYXJGaWVsZChmaWVsZCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBUaGlzQnVpbGRlcjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuQ2xlYXJGaWVsZChmaWVsZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRCdWlsZGVyIEFkZFJlcGVhdGVkRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkLCBvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGZpZWxkLklzRXh0ZW5zaW9uKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRXh0ZW5kYWJsZU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPiBtZXNzYWdlID0gTWVzc2FnZUJlaW5nQnVpbHQ7DQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuVmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOw0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvbnMuQWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gVGhpc0J1aWxkZXI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLkFkZFJlcGVhdGVkRmllbGQoZmllbGQsIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBNZXJnZUV4dGVuc2lvbkZpZWxkcyhFeHRlbmRhYmxlTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+IG90aGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE1lc3NhZ2VCZWluZ0J1aWx0LkV4dGVuc2lvbnMuTWVyZ2VGcm9tKG90aGVyLkV4dGVuc2lvbnMpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0V4dGVuZGFibGVCdWlsZGVyTGl0ZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0V4dGVuZGFibGVCdWlsZGVyTGl0ZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTcxYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRXh0ZW5kYWJsZUJ1aWxkZXJMaXRlLmNzCkBAIC0wLDAgKzEsMzQ2IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIHB1YmxpYyBhYnN0cmFjdCBwYXJ0aWFsIGNsYXNzIEV4dGVuZGFibGVCdWlsZGVyTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+IDogR2VuZXJhdGVkQnVpbGRlckxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVE1lc3NhZ2UgOiBFeHRlbmRhYmxlTWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVEJ1aWxkZXIgOiBHZW5lcmF0ZWRCdWlsZGVyTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgIHsNCisgICAgICAgIHByb3RlY3RlZCBFeHRlbmRhYmxlQnVpbGRlckxpdGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENoZWNrcyBpZiBhIHNpbmd1bGFyIGV4dGVuc2lvbiBpcyBwcmVzZW50DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRXh0ZW5zaW9uPFRFeHRlbnNpb24+KEdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8VE1lc3NhZ2UsIFRFeHRlbnNpb24+IGV4dGVuc2lvbikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTWVzc2FnZUJlaW5nQnVpbHQuSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBpbnQgR2V0RXh0ZW5zaW9uQ291bnQ8VEV4dGVuc2lvbj4oR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxUTWVzc2FnZSwgSUxpc3Q8VEV4dGVuc2lvbj4+IGV4dGVuc2lvbikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTWVzc2FnZUJlaW5nQnVpbHQuR2V0RXh0ZW5zaW9uQ291bnQoZXh0ZW5zaW9uKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhbiBleHRlbnNpb24uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIFRFeHRlbnNpb24gR2V0RXh0ZW5zaW9uPFRFeHRlbnNpb24+KEdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8VE1lc3NhZ2UsIFRFeHRlbnNpb24+IGV4dGVuc2lvbikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTWVzc2FnZUJlaW5nQnVpbHQuR2V0RXh0ZW5zaW9uKGV4dGVuc2lvbik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgVEV4dGVuc2lvbiBHZXRFeHRlbnNpb248VEV4dGVuc2lvbj4oR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxUTWVzc2FnZSwgSUxpc3Q8VEV4dGVuc2lvbj4+IGV4dGVuc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VCZWluZ0J1aWx0LkdldEV4dGVuc2lvbihleHRlbnNpb24sIGluZGV4KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXRzIHRoZSB2YWx1ZSBvZiBhbiBleHRlbnNpb24uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIFRCdWlsZGVyIFNldEV4dGVuc2lvbjxURXh0ZW5zaW9uPihHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPFRNZXNzYWdlLCBURXh0ZW5zaW9uPiBleHRlbnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFeHRlbnNpb24gdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gbWVzc2FnZSA9IE1lc3NhZ2VCZWluZ0J1aWx0Ow0KKyAgICAgICAgICAgIG1lc3NhZ2UuVmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsNCisgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvbnNbZXh0ZW5zaW9uLkRlc2NyaXB0b3JdID0gZXh0ZW5zaW9uLlRvUmVmbGVjdGlvblR5cGUodmFsdWUpOw0KKyAgICAgICAgICAgIHJldHVybiBUaGlzQnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXRzIHRoZSB2YWx1ZSBvZiBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgVEJ1aWxkZXIgU2V0RXh0ZW5zaW9uPFRFeHRlbnNpb24+KEdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8VE1lc3NhZ2UsIElMaXN0PFRFeHRlbnNpb24+PiBleHRlbnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgVEV4dGVuc2lvbiB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBFeHRlbmRhYmxlTWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiBtZXNzYWdlID0gTWVzc2FnZUJlaW5nQnVpbHQ7DQorICAgICAgICAgICAgbWVzc2FnZS5WZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOw0KKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uc1tleHRlbnNpb24uRGVzY3JpcHRvciwgaW5kZXhdID0gZXh0ZW5zaW9uLlNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZSh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIFRoaXNCdWlsZGVyOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFwcGVuZHMgYSB2YWx1ZSB0byBhIHJlcGVhdGVkIGV4dGVuc2lvbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgVEJ1aWxkZXIgQWRkRXh0ZW5zaW9uPFRFeHRlbnNpb24+KEdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8VE1lc3NhZ2UsIElMaXN0PFRFeHRlbnNpb24+PiBleHRlbnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFeHRlbnNpb24gdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gbWVzc2FnZSA9IE1lc3NhZ2VCZWluZ0J1aWx0Ow0KKyAgICAgICAgICAgIG1lc3NhZ2UuVmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsNCisgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvbnMuQWRkUmVwZWF0ZWRGaWVsZChleHRlbnNpb24uRGVzY3JpcHRvciwgZXh0ZW5zaW9uLlNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZSh2YWx1ZSkpOw0KKyAgICAgICAgICAgIHJldHVybiBUaGlzQnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDbGVhcnMgYW4gZXh0ZW5zaW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBUQnVpbGRlciBDbGVhckV4dGVuc2lvbjxURXh0ZW5zaW9uPihHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPFRNZXNzYWdlLCBURXh0ZW5zaW9uPiBleHRlbnNpb24pDQorICAgICAgICB7DQorICAgICAgICAgICAgRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gbWVzc2FnZSA9IE1lc3NhZ2VCZWluZ0J1aWx0Ow0KKyAgICAgICAgICAgIG1lc3NhZ2UuVmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsNCisgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvbnMuQ2xlYXJGaWVsZChleHRlbnNpb24uRGVzY3JpcHRvcik7DQorICAgICAgICAgICAgcmV0dXJuIFRoaXNCdWlsZGVyOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENhbGxlZCBieSBzdWJjbGFzc2VzIHRvIHBhcnNlIGFuIHVua25vd24gZmllbGQgb3IgYW4gZXh0ZW5zaW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cmV0dXJucz50cnVlIHVubGVzcyB0aGUgdGFnIGlzIGFuIGVuZC1ncm91cCB0YWc8L3JldHVybnM+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFBhcnNlVW5rbm93bkZpZWxkKElDb2RlZElucHV0U3RyZWFtIGlucHV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnksIHVpbnQgdGFnLCBzdHJpbmcgZmllbGROYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEZpZWxkU2V0IGV4dGVuc2lvbnMgPSBNZXNzYWdlQmVpbmdCdWlsdC5FeHRlbnNpb25zOw0KKw0KKyAgICAgICAgICAgIFdpcmVGb3JtYXQuV2lyZVR5cGUgd2lyZVR5cGUgPSBXaXJlRm9ybWF0LkdldFRhZ1dpcmVUeXBlKHRhZyk7DQorICAgICAgICAgICAgaW50IGZpZWxkTnVtYmVyID0gV2lyZUZvcm1hdC5HZXRUYWdGaWVsZE51bWJlcih0YWcpOw0KKyAgICAgICAgICAgIElHZW5lcmF0ZWRFeHRlbnNpb25MaXRlIGV4dGVuc2lvbiA9IGV4dGVuc2lvblJlZ2lzdHJ5W0RlZmF1bHRJbnN0YW5jZUZvclR5cGUsIGZpZWxkTnVtYmVyXTsNCisNCisgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwpIC8vdW5rbm93biBmaWVsZA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LlNraXBGaWVsZCgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBJRmllbGREZXNjcmlwdG9yTGl0ZSBmaWVsZCA9IGV4dGVuc2lvbi5EZXNjcmlwdG9yOw0KKw0KKw0KKyAgICAgICAgICAgIC8vIFVua25vd24gZmllbGQgb3Igd3Jvbmcgd2lyZSB0eXBlLiBTa2lwLg0KKyAgICAgICAgICAgIGlmIChmaWVsZCA9PSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LlNraXBGaWVsZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBXaXJlRm9ybWF0LldpcmVUeXBlIGV4cGVjdGVkVHlwZSA9IGZpZWxkLklzUGFja2VkDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogV2lyZUZvcm1hdC5HZXRXaXJlVHlwZShmaWVsZC5GaWVsZFR5cGUpOw0KKyAgICAgICAgICAgIGlmICh3aXJlVHlwZSAhPSBleHBlY3RlZFR5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUgPSBXaXJlRm9ybWF0LkdldFdpcmVUeXBlKGZpZWxkLkZpZWxkVHlwZSk7DQorICAgICAgICAgICAgICAgIGlmICh3aXJlVHlwZSA9PSBleHBlY3RlZFR5cGUpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIC8vQWxsb3dlZCBhcyBvZiAyLjMsIHRoaXMgaXMgdW5wYWNrZWQgZGF0YSBmb3IgYSBwYWNrZWQgYXJyYXkNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5Jc1JlcGVhdGVkICYmIHdpcmVUeXBlID09IFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgIChleHBlY3RlZFR5cGUgPT0gV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQgfHwgZXhwZWN0ZWRUeXBlID09IFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQzMiB8fA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUeXBlID09IFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQ2NCkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIC8vQWxsb3dlZCBhcyBvZiAyLjMsIHRoaXMgaXMgcGFja2VkIGRhdGEgZm9yIGFuIHVucGFja2VkIGFycmF5DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuU2tpcEZpZWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKCFmaWVsZC5Jc1JlcGVhdGVkICYmIHdpcmVUeXBlICE9IFdpcmVGb3JtYXQuR2V0V2lyZVR5cGUoZmllbGQuRmllbGRUeXBlKSkgLy9pbnZhbGlkIHdpcmUgdHlwZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LlNraXBGaWVsZCgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLkZpZWxkVHlwZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkdyb3VwOg0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5NZXNzYWdlOg0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNZXNzYWdlTGl0ZSBtZXNzYWdlID0gZXh0ZW5zaW9uc1tleHRlbnNpb24uRGVzY3JpcHRvcl0gYXMgSU1lc3NhZ2VMaXRlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQnVpbGRlckxpdGUgc3ViQnVpbGRlciA9IChtZXNzYWdlID8/IGV4dGVuc2lvbi5NZXNzYWdlRGVmYXVsdEluc3RhbmNlKS5XZWFrVG9CdWlsZGVyKCk7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5GaWVsZFR5cGUgPT0gRmllbGRUeXBlLkdyb3VwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5SZWFkR3JvdXAoZmllbGQuRmllbGROdW1iZXIsIHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zW2ZpZWxkXSA9IHN1YkJ1aWxkZXIuV2Vha0J1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8SU1lc3NhZ2VMaXRlPiBsaXN0ID0gbmV3IExpc3Q8SU1lc3NhZ2VMaXRlPigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuRmllbGRUeXBlID09IEZpZWxkVHlwZS5Hcm91cCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuUmVhZEdyb3VwQXJyYXkodGFnLCBmaWVsZE5hbWUsIGxpc3QsIGV4dGVuc2lvbi5NZXNzYWdlRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkTmFtZSwgbGlzdCwgZXh0ZW5zaW9uLk1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChJTWVzc2FnZUxpdGUgbSBpbiBsaXN0KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLkFkZFJlcGVhdGVkRmllbGQoZmllbGQsIG0pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRW51bToNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLklzUmVwZWF0ZWQpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1MaXRlIHZhbHVlID0gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LlJlYWRFbnVtKHJlZiB2YWx1ZSwgb3V0IHVua25vd24sIGZpZWxkLkVudW1UeXBlKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc1tmaWVsZF0gPSB2YWx1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd247DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8SUVudW1MaXRlPiBsaXN0ID0gbmV3IExpc3Q8SUVudW1MaXRlPigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5SZWFkRW51bUFycmF5KHRhZywgZmllbGROYW1lLCBsaXN0LCBvdXQgdW5rbm93biwgZmllbGQuRW51bVR5cGUpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChJRW51bUxpdGUgZW4gaW4gbGlzdCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5BZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCBlbik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5Jc1JlcGVhdGVkKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHZhbHVlID0gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LlJlYWRQcmltaXRpdmVGaWVsZChmaWVsZC5GaWVsZFR5cGUsIHJlZiB2YWx1ZSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNbZmllbGRdID0gdmFsdWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxvYmplY3Q+IGxpc3QgPSBuZXcgTGlzdDxvYmplY3Q+KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LlJlYWRQcmltaXRpdmVBcnJheShmaWVsZC5GaWVsZFR5cGUsIHRhZywgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IG92YWwgaW4gbGlzdCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5BZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCBvdmFsKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICB9DQorDQorICAgICAgICAjcmVnaW9uIFJlZmxlY3Rpb24NCisNCisgICAgICAgIHB1YmxpYyBvYmplY3QgdGhpc1tJRmllbGREZXNjcmlwdG9yTGl0ZSBmaWVsZCwgaW50IGluZGV4XQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHNldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzRXh0ZW5zaW9uKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBFeHRlbmRhYmxlTWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiBtZXNzYWdlID0gTWVzc2FnZUJlaW5nQnVpbHQ7DQorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvbnNbZmllbGQsIGluZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiB0aGUgbGl0ZSBydW50aW1lLiIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG9iamVjdCB0aGlzW0lGaWVsZERlc2NyaXB0b3JMaXRlIGZpZWxkXQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHNldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzRXh0ZW5zaW9uKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBFeHRlbmRhYmxlTWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiBtZXNzYWdlID0gTWVzc2FnZUJlaW5nQnVpbHQ7DQorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvbnNbZmllbGRdID0gdmFsdWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIGluIHRoZSBsaXRlIHJ1bnRpbWUuIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgVEJ1aWxkZXIgQ2xlYXJGaWVsZChJRmllbGREZXNjcmlwdG9yTGl0ZSBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZmllbGQuSXNFeHRlbnNpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBFeHRlbmRhYmxlTWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiBtZXNzYWdlID0gTWVzc2FnZUJlaW5nQnVpbHQ7DQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9ucy5DbGVhckZpZWxkKGZpZWxkKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRoaXNCdWlsZGVyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIGluIHRoZSBsaXRlIHJ1bnRpbWUuIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIFRCdWlsZGVyIEFkZFJlcGVhdGVkRmllbGQoSUZpZWxkRGVzY3JpcHRvckxpdGUgZmllbGQsIG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZmllbGQuSXNFeHRlbnNpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBFeHRlbmRhYmxlTWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiBtZXNzYWdlID0gTWVzc2FnZUJlaW5nQnVpbHQ7DQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9ucy5BZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiBUaGlzQnVpbGRlcjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiB0aGUgbGl0ZSBydW50aW1lLiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCB2b2lkIE1lcmdlRXh0ZW5zaW9uRmllbGRzKEV4dGVuZGFibGVNZXNzYWdlTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+IG90aGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE1lc3NhZ2VCZWluZ0J1aWx0LkV4dGVuc2lvbnMuTWVyZ2VGcm9tKG90aGVyLkV4dGVuc2lvbnMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0V4dGVuZGFibGVNZXNzYWdlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRXh0ZW5kYWJsZU1lc3NhZ2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjZDFiMwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0V4dGVuZGFibGVNZXNzYWdlLmNzCkBAIC0wLDAgKzEsMjc0IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgcHVibGljIGFic3RyYWN0IHBhcnRpYWwgY2xhc3MgRXh0ZW5kYWJsZU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPiA6IEdlbmVyYXRlZE1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVE1lc3NhZ2UgOiBHZW5lcmF0ZWRNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgIHdoZXJlIFRCdWlsZGVyIDogR2VuZXJhdGVkQnVpbGRlcjxUTWVzc2FnZSwgVEJ1aWxkZXI+LCBuZXcoKQ0KKyAgICB7DQorICAgICAgICBwcm90ZWN0ZWQgRXh0ZW5kYWJsZU1lc3NhZ2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGaWVsZFNldCBleHRlbnNpb25zID0gRmllbGRTZXQuQ3JlYXRlSW5zdGFuY2UoKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBY2Nlc3MgZm9yIHRoZSBidWlsZGVyLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIEZpZWxkU2V0IEV4dGVuc2lvbnMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZXh0ZW5zaW9uczsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENoZWNrcyBpZiBhIHNpbmd1bGFyIGV4dGVuc2lvbiBpcyBwcmVzZW50Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBib29sIEhhc0V4dGVuc2lvbjxURXh0ZW5zaW9uPihHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPFRFeHRlbnNpb24+IGV4dGVuc2lvbikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5IYXNGaWVsZChleHRlbnNpb24uRGVzY3JpcHRvcik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBpbnQgR2V0RXh0ZW5zaW9uQ291bnQ8VEV4dGVuc2lvbj4oR2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxJTGlzdDxURXh0ZW5zaW9uPj4gZXh0ZW5zaW9uKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBleHRlbnNpb25zLkdldFJlcGVhdGVkRmllbGRDb3VudChleHRlbnNpb24uRGVzY3JpcHRvcik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBURXh0ZW5zaW9uIEdldEV4dGVuc2lvbjxURXh0ZW5zaW9uPihHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPFRFeHRlbnNpb24+IGV4dGVuc2lvbikNCisgICAgICAgIHsNCisgICAgICAgICAgICBvYmplY3QgdmFsdWUgPSBleHRlbnNpb25zW2V4dGVuc2lvbi5EZXNjcmlwdG9yXTsNCisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiAoVEV4dGVuc2lvbikgZXh0ZW5zaW9uLk1lc3NhZ2VEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiAoVEV4dGVuc2lvbikgZXh0ZW5zaW9uLkZyb21SZWZsZWN0aW9uVHlwZSh2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgb25lIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBleHRlbnNpb24uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIFRFeHRlbnNpb24gR2V0RXh0ZW5zaW9uPFRFeHRlbnNpb24+KEdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8SUxpc3Q8VEV4dGVuc2lvbj4+IGV4dGVuc2lvbiwgaW50IGluZGV4KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiAoVEV4dGVuc2lvbikgZXh0ZW5zaW9uLlNpbmd1bGFyRnJvbVJlZmxlY3Rpb25UeXBlKGV4dGVuc2lvbnNbZXh0ZW5zaW9uLkRlc2NyaXB0b3IsIGluZGV4XSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2FsbGVkIHRvIGNoZWNrIGlmIGFsbCBleHRlbnNpb25zIGFyZSBpbml0aWFsaXplZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYm9vbCBFeHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZXh0ZW5zaW9ucy5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGJhc2UuSXNJbml0aWFsaXplZCAmJiBFeHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgICNyZWdpb24gUmVmbGVjdGlvbg0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElEaWN0aW9uYXJ5PEZpZWxkRGVzY3JpcHRvciwgb2JqZWN0PiBBbGxGaWVsZHMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIElEaWN0aW9uYXJ5PEZpZWxkRGVzY3JpcHRvciwgb2JqZWN0PiByZXN1bHQgPSBHZXRNdXRhYmxlRmllbGRNYXAoKTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPElGaWVsZERlc2NyaXB0b3JMaXRlLCBvYmplY3Q+IGVudHJ5IGluIGV4dGVuc2lvbnMuQWxsRmllbGRzKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXN1bHRbKEZpZWxkRGVzY3JpcHRvcikgZW50cnkuS2V5XSA9IGVudHJ5LlZhbHVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBEaWN0aW9uYXJpZXMuQXNSZWFkT25seShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEhhc0ZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZmllbGQuSXNFeHRlbnNpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBWZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBleHRlbnNpb25zLkhhc0ZpZWxkKGZpZWxkKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuSGFzRmllbGQoZmllbGQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgdGhpc1tGaWVsZERlc2NyaXB0b3IgZmllbGRdDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNFeHRlbnNpb24pDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsNCisgICAgICAgICAgICAgICAgICAgIG9iamVjdCB2YWx1ZSA9IGV4dGVuc2lvbnNbZmllbGRdOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGFja2luZyBhbiBFeHRlbnNpb25SZWdpc3RyeSwgd2UgaGF2ZSBubyB3YXkgdG8gZGV0ZXJtaW5lIHRoZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dGVuc2lvbidzIHJlYWwgdHlwZSwgc28gd2UgcmV0dXJuIGEgRHluYW1pY01lc3NhZ2UuDQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqb25za2VldCk6IFdvcmsgb3V0IHdoYXQgdGhpcyBtZWFucw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEeW5hbWljTWVzc2FnZS5HZXREZWZhdWx0SW5zdGFuY2UoZmllbGQuTWVzc2FnZVR5cGUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlW2ZpZWxkXTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0UmVwZWF0ZWRGaWVsZENvdW50KEZpZWxkRGVzY3JpcHRvciBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZmllbGQuSXNFeHRlbnNpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBWZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBleHRlbnNpb25zLkdldFJlcGVhdGVkRmllbGRDb3VudChmaWVsZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLkdldFJlcGVhdGVkRmllbGRDb3VudChmaWVsZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCB0aGlzW0ZpZWxkRGVzY3JpcHRvciBmaWVsZCwgaW50IGluZGV4XQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzRXh0ZW5zaW9uKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBWZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uc1tmaWVsZCwgaW5kZXhdOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VbZmllbGQsIGluZGV4XTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHZvaWQgVmVyaWZ5Q29udGFpbmluZ1R5cGUoRmllbGREZXNjcmlwdG9yIGZpZWxkKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChmaWVsZC5Db250YWluaW5nVHlwZSAhPSBEZXNjcmlwdG9yRm9yVHlwZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiRmllbGREZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVXNlZCBieSBzdWJjbGFzc2VzIHRvIHNlcmlhbGl6ZSBleHRlbnNpb25zLiBFeHRlbnNpb24gcmFuZ2VzIG1heSBiZQ0KKyAgICAgICAgLy8vIGludGVybGVhdmVzIHdpdGggZmllbGQgbnVtYmVycywgYnV0IHdlIG11c3Qgd3JpdGUgdGhlbSBpbiBjYW5vbmljYWwNCisgICAgICAgIC8vLyAoc29ydGVkIGJ5IGZpZWxkIG51bWJlcikgb3JkZXIuIFRoaXMgY2xhc3MgaGVscHMgdXMgdG8gd3JpdGUgaW5kaXZpZHVhbA0KKyAgICAgICAgLy8vIHJhbmdlcyBvZiBleHRlbnNpb25zIGF0IG9uY2UuDQorICAgICAgICAvLy8gDQorICAgICAgICAvLy8gVE9ETyhqb25za2VldCk6IFNlZSBpZiB3ZSBjYW4gaW1wcm92ZSB0aGlzIGluIHRlcm1zIG9mIHJlYWRhYmlsaXR5Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBFeHRlbnNpb25Xcml0ZXINCisgICAgICAgIHsNCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElFbnVtZXJhdG9yPEtleVZhbHVlUGFpcjxJRmllbGREZXNjcmlwdG9yTGl0ZSwgb2JqZWN0Pj4gaXRlcmF0b3I7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGaWVsZFNldCBleHRlbnNpb25zOw0KKyAgICAgICAgICAgIHByaXZhdGUgS2V5VmFsdWVQYWlyPElGaWVsZERlc2NyaXB0b3JMaXRlLCBvYmplY3Q+PyBuZXh0ID0gbnVsbDsNCisNCisgICAgICAgICAgICBpbnRlcm5hbCBFeHRlbnNpb25Xcml0ZXIoRXh0ZW5kYWJsZU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPiBtZXNzYWdlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IG1lc3NhZ2UuZXh0ZW5zaW9uczsNCisgICAgICAgICAgICAgICAgaXRlcmF0b3IgPSBtZXNzYWdlLmV4dGVuc2lvbnMuR2V0RW51bWVyYXRvcigpOw0KKyAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3IuTW92ZU5leHQoKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGl0ZXJhdG9yLkN1cnJlbnQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIHZvaWQgV3JpdGVVbnRpbChpbnQgZW5kLCBJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd2hpbGUgKG5leHQgIT0gbnVsbCAmJiBuZXh0LlZhbHVlLktleS5GaWVsZE51bWJlciA8IGVuZCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5Xcml0ZUZpZWxkKG5leHQuVmFsdWUuS2V5LCBuZXh0LlZhbHVlLlZhbHVlLCBvdXRwdXQpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLk1vdmVOZXh0KCkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGl0ZXJhdG9yLkN1cnJlbnQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG51bGw7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwcm90ZWN0ZWQgRXh0ZW5zaW9uV3JpdGVyIENyZWF0ZUV4dGVuc2lvbldyaXRlcihFeHRlbmRhYmxlTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+IG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25Xcml0ZXIobWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBleHRlbnNpb25zLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBpbnQgRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGV4dGVuc2lvbnMuU2VyaWFsaXplZFNpemU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHZvaWQgVmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGU8VEV4dGVuc2lvbj4oR2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxURXh0ZW5zaW9uPiBleHRlbnNpb24pDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGV4dGVuc2lvbi5EZXNjcmlwdG9yLkNvbnRhaW5pbmdUeXBlICE9IERlc2NyaXB0b3JGb3JUeXBlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgc29tZW9uZSB1c2VzIHVuY2hlY2tlZCBvcGVyYXRpb25zLg0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkV4dGVuc2lvbiBpcyBmb3IgdHlwZSBcIiIgKyBleHRlbnNpb24uRGVzY3JpcHRvci5Db250YWluaW5nVHlwZS5GdWxsTmFtZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgd2hpY2ggZG9lcyBub3QgbWF0Y2ggbWVzc2FnZSB0eXBlIFwiIiArIERlc2NyaXB0b3JGb3JUeXBlLkZ1bGxOYW1lICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIi4iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ODI0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9FeHRlbmRhYmxlTWVzc2FnZUxpdGUuY3MKQEAgLTAsMCArMSwyMjEgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBwdWJsaWMgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyBFeHRlbmRhYmxlTWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiA6IEdlbmVyYXRlZE1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgIHdoZXJlIFRNZXNzYWdlIDogR2VuZXJhdGVkTWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVEJ1aWxkZXIgOiBHZW5lcmF0ZWRCdWlsZGVyTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgIHsNCisgICAgICAgIHByb3RlY3RlZCBFeHRlbmRhYmxlTWVzc2FnZUxpdGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGaWVsZFNldCBleHRlbnNpb25zID0gRmllbGRTZXQuQ3JlYXRlSW5zdGFuY2UoKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBY2Nlc3MgZm9yIHRoZSBidWlsZGVyLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIEZpZWxkU2V0IEV4dGVuc2lvbnMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZXh0ZW5zaW9uczsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopDQorICAgICAgICB7DQorICAgICAgICAgICAgRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gb3RoZXIgPSBvYmogYXMgRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj47DQorICAgICAgICAgICAgcmV0dXJuICFSZWZlcmVuY2VFcXVhbHMobnVsbCwgb3RoZXIpICYmDQorICAgICAgICAgICAgICAgICAgIERpY3Rpb25hcmllcy5FcXVhbHMoZXh0ZW5zaW9ucy5BbGxGaWVsZHMsIG90aGVyLmV4dGVuc2lvbnMuQWxsRmllbGRzKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBEaWN0aW9uYXJpZXMuR2V0SGFzaENvZGUoZXh0ZW5zaW9ucy5BbGxGaWVsZHMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIHdyaXRlcyB0aGUgZXh0ZW5zaW9ucyB0byB0aGUgdGV4dCBzdHJlYW0NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludFRvKFRleHRXcml0ZXIgd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxJRmllbGREZXNjcmlwdG9yTGl0ZSwgb2JqZWN0PiBlbnRyeSBpbiBleHRlbnNpb25zLkFsbEZpZWxkcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHN0cmluZyBmbiA9IHN0cmluZy5Gb3JtYXQoIlt7MH1dIiwgZW50cnkuS2V5LkZ1bGxOYW1lKTsNCisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LktleS5Jc1JlcGVhdGVkKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgbyBpbiAoKElFbnVtZXJhYmxlKSBlbnRyeS5WYWx1ZSkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRGaWVsZChmbiwgdHJ1ZSwgbywgd3JpdGVyKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFByaW50RmllbGQoZm4sIHRydWUsIGVudHJ5LlZhbHVlLCB3cml0ZXIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENoZWNrcyBpZiBhIHNpbmd1bGFyIGV4dGVuc2lvbiBpcyBwcmVzZW50Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBib29sIEhhc0V4dGVuc2lvbjxURXh0ZW5zaW9uPihHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPFRNZXNzYWdlLCBURXh0ZW5zaW9uPiBleHRlbnNpb24pDQorICAgICAgICB7DQorICAgICAgICAgICAgVmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsNCisgICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5IYXNGaWVsZChleHRlbnNpb24uRGVzY3JpcHRvcik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBpbnQgR2V0RXh0ZW5zaW9uQ291bnQ8VEV4dGVuc2lvbj4oR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxUTWVzc2FnZSwgSUxpc3Q8VEV4dGVuc2lvbj4+IGV4dGVuc2lvbikNCisgICAgICAgIHsNCisgICAgICAgICAgICBWZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJldHVybiBleHRlbnNpb25zLkdldFJlcGVhdGVkRmllbGRDb3VudChleHRlbnNpb24uRGVzY3JpcHRvcik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBURXh0ZW5zaW9uIEdldEV4dGVuc2lvbjxURXh0ZW5zaW9uPihHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPFRNZXNzYWdlLCBURXh0ZW5zaW9uPiBleHRlbnNpb24pDQorICAgICAgICB7DQorICAgICAgICAgICAgVmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsNCisgICAgICAgICAgICBvYmplY3QgdmFsdWUgPSBleHRlbnNpb25zW2V4dGVuc2lvbi5EZXNjcmlwdG9yXTsNCisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBleHRlbnNpb24uRGVmYXVsdFZhbHVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gKFRFeHRlbnNpb24pIGV4dGVuc2lvbi5Gcm9tUmVmbGVjdGlvblR5cGUodmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBURXh0ZW5zaW9uIEdldEV4dGVuc2lvbjxURXh0ZW5zaW9uPihHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPFRNZXNzYWdlLCBJTGlzdDxURXh0ZW5zaW9uPj4gZXh0ZW5zaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBWZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOw0KKyAgICAgICAgICAgIHJldHVybiAoVEV4dGVuc2lvbikgZXh0ZW5zaW9uLlNpbmd1bGFyRnJvbVJlZmxlY3Rpb25UeXBlKGV4dGVuc2lvbnNbZXh0ZW5zaW9uLkRlc2NyaXB0b3IsIGluZGV4XSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2FsbGVkIHRvIGNoZWNrIGlmIGFsbCBleHRlbnNpb25zIGFyZSBpbml0aWFsaXplZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYm9vbCBFeHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZXh0ZW5zaW9ucy5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIEV4dGVuc2lvbnNBcmVJbml0aWFsaXplZDsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFVzZWQgYnkgc3ViY2xhc3NlcyB0byBzZXJpYWxpemUgZXh0ZW5zaW9ucy4gRXh0ZW5zaW9uIHJhbmdlcyBtYXkgYmUNCisgICAgICAgIC8vLyBpbnRlcmxlYXZlcyB3aXRoIGZpZWxkIG51bWJlcnMsIGJ1dCB3ZSBtdXN0IHdyaXRlIHRoZW0gaW4gY2Fub25pY2FsDQorICAgICAgICAvLy8gKHNvcnRlZCBieSBmaWVsZCBudW1iZXIpIG9yZGVyLiBUaGlzIGNsYXNzIGhlbHBzIHVzIHRvIHdyaXRlIGluZGl2aWR1YWwNCisgICAgICAgIC8vLyByYW5nZXMgb2YgZXh0ZW5zaW9ucyBhdCBvbmNlLg0KKyAgICAgICAgLy8vIA0KKyAgICAgICAgLy8vIFRPRE8oam9uc2tlZXQpOiBTZWUgaWYgd2UgY2FuIGltcHJvdmUgdGhpcyBpbiB0ZXJtcyBvZiByZWFkYWJpbGl0eS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgRXh0ZW5zaW9uV3JpdGVyDQorICAgICAgICB7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJRW51bWVyYXRvcjxLZXlWYWx1ZVBhaXI8SUZpZWxkRGVzY3JpcHRvckxpdGUsIG9iamVjdD4+IGl0ZXJhdG9yOw0KKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRmllbGRTZXQgZXh0ZW5zaW9uczsNCisgICAgICAgICAgICBwcml2YXRlIEtleVZhbHVlUGFpcjxJRmllbGREZXNjcmlwdG9yTGl0ZSwgb2JqZWN0Pj8gbmV4dCA9IG51bGw7DQorDQorICAgICAgICAgICAgaW50ZXJuYWwgRXh0ZW5zaW9uV3JpdGVyKEV4dGVuZGFibGVNZXNzYWdlTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+IG1lc3NhZ2UpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBleHRlbnNpb25zID0gbWVzc2FnZS5leHRlbnNpb25zOw0KKyAgICAgICAgICAgICAgICBpdGVyYXRvciA9IG1lc3NhZ2UuZXh0ZW5zaW9ucy5HZXRFbnVtZXJhdG9yKCk7DQorICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvci5Nb3ZlTmV4dCgpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBuZXh0ID0gaXRlcmF0b3IuQ3VycmVudDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVVudGlsKGludCBlbmQsIElDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCAhPSBudWxsICYmIG5leHQuVmFsdWUuS2V5LkZpZWxkTnVtYmVyIDwgZW5kKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLldyaXRlRmllbGQobmV4dC5WYWx1ZS5LZXksIG5leHQuVmFsdWUuVmFsdWUsIG91dHB1dCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3IuTW92ZU5leHQoKSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gaXRlcmF0b3IuQ3VycmVudDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCBFeHRlbnNpb25Xcml0ZXIgQ3JlYXRlRXh0ZW5zaW9uV3JpdGVyKEV4dGVuZGFibGVNZXNzYWdlTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+IG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25Xcml0ZXIobWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBleHRlbnNpb25zLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByb3RlY3RlZCBpbnQgRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGV4dGVuc2lvbnMuU2VyaWFsaXplZFNpemU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHZvaWQgVmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGU8VEV4dGVuc2lvbj4oR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxUTWVzc2FnZSwgVEV4dGVuc2lvbj4gZXh0ZW5zaW9uKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICghUmVmZXJlbmNlRXF1YWxzKGV4dGVuc2lvbi5Db250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSwgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiBzb21lb25lIHVzZXMgdW5jaGVja2VkIG9wZXJhdGlvbnMuDQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5Gb3JtYXQoIkV4dGVuc2lvbiBpcyBmb3IgdHlwZSBcInswfVwiIHdoaWNoIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZSBcInsxfVwiLiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5Db250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSwgRGVmYXVsdEluc3RhbmNlRm9yVHlwZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9FeHRlbnNpb25JbmZvLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRXh0ZW5zaW9uSW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjExZDNiCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRXh0ZW5zaW9uSW5mby5jcwpAQCAtMCwwICsxLDg4IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeHRlbnNpb25JbmZvIDogSUdlbmVyYXRlZEV4dGVuc2lvbkxpdGUNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBleHRlbnNpb24ncyBkZXNjcmlwdG9yDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIEZpZWxkRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsgZ2V0OyBwcml2YXRlIHNldDsgfQ0KKw0KKyAgICAgICAgSUZpZWxkRGVzY3JpcHRvckxpdGUgSUdlbmVyYXRlZEV4dGVuc2lvbkxpdGUuRGVzY3JpcHRvcg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSBleHRlbnNpb25zJ3MgdHlwZSwgaWYgaXQgaGFzIGEgbWVzc2FnZSB0eXBlLA0KKyAgICAgICAgLy8vIG9yIG51bGwgb3RoZXJ3aXNlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBJTWVzc2FnZUxpdGUgRGVmYXVsdEluc3RhbmNlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgRXh0ZW5zaW9uSW5mbyhGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvcikgOiB0aGlzKGRlc2NyaXB0b3IsIG51bGwpDQorICAgICAgICB7DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBFeHRlbnNpb25JbmZvKEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBJTWVzc2FnZUxpdGUgZGVmYXVsdEluc3RhbmNlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOw0KKyAgICAgICAgICAgIERlZmF1bHRJbnN0YW5jZSA9IGRlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIH0NCisNCisgICAgICAgICNyZWdpb24gSUdlbmVyYXRlZEV4dGVuc2lvbkxpdGUgTWVtYmVycw0KKw0KKyAgICAgICAgaW50IElHZW5lcmF0ZWRFeHRlbnNpb25MaXRlLk51bWJlcg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yLkZpZWxkTnVtYmVyOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBvYmplY3QgSUdlbmVyYXRlZEV4dGVuc2lvbkxpdGUuQ29udGFpbmluZ1R5cGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvci5Db250YWluaW5nVHlwZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgSU1lc3NhZ2VMaXRlIElHZW5lcmF0ZWRFeHRlbnNpb25MaXRlLk1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRXh0ZW5zaW9uUmVnaXN0cnkuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9FeHRlbnNpb25SZWdpc3RyeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzk0NjdiCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRXh0ZW5zaW9uUmVnaXN0cnkuY3MKQEAgLTAsMCArMSwyMTUgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gQSB0YWJsZSBvZiBrbm93biBleHRlbnNpb25zLCBzZWFyY2hhYmxlIGJ5IG5hbWUgb3IgZmllbGQgbnVtYmVyLiAgV2hlbg0KKyAgICAvLy8gcGFyc2luZyBhIHByb3RvY29sIG1lc3NhZ2UgdGhhdCBtaWdodCBoYXZlIGV4dGVuc2lvbnMsIHlvdSBtdXN0IHByb3ZpZGUNCisgICAgLy8vIGFuIDxzZWUgY3JlZj0iRXh0ZW5zaW9uUmVnaXN0cnkiLz4gaW4gd2hpY2ggeW91IGhhdmUgcmVnaXN0ZXJlZCBhbnkgZXh0ZW5zaW9ucw0KKyAgICAvLy8gdGhhdCB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHBhcnNlLiAgT3RoZXJ3aXNlLCB0aG9zZSBleHRlbnNpb25zIHdpbGwganVzdA0KKyAgICAvLy8gYmUgdHJlYXRlZCBsaWtlIHVua25vd24gZmllbGRzLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAvLy8gPGV4YW1wbGU+DQorICAgIC8vLyBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZCB0aGUgPGM+LnByb3RvPC9jPiBmaWxlOg0KKyAgICAvLy8gPGNvZGU+DQorICAgIC8vLyBvcHRpb24gamF2YV9jbGFzcyA9ICJNeVByb3RvIjsNCisgICAgLy8vDQorICAgIC8vLyBtZXNzYWdlIEZvbyB7DQorICAgIC8vLyAgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7DQorICAgIC8vLyB9DQorICAgIC8vLw0KKyAgICAvLy8gZXh0ZW5kIEZvbyB7DQorICAgIC8vLyAgIG9wdGlvbmFsIGludDMyIGJhcjsNCisgICAgLy8vIH0NCisgICAgLy8vIDwvY29kZT4NCisgICAgLy8vDQorICAgIC8vLyBUaGVuIHlvdSBtaWdodCB3cml0ZSBjb2RlIGxpa2U6DQorICAgIC8vLw0KKyAgICAvLy8gPGNvZGU+DQorICAgIC8vLyBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgIC8vLyByZWdpc3RyeS5BZGQoTXlQcm90by5CYXIpOw0KKyAgICAvLy8gTXlQcm90by5Gb28gbWVzc2FnZSA9IE15UHJvdG8uRm9vLlBhcnNlRnJvbShpbnB1dCwgcmVnaXN0cnkpOw0KKyAgICAvLy8gPC9jb2RlPg0KKyAgICAvLy8gPC9leGFtcGxlPg0KKyAgICAvLy8NCisgICAgLy8vIDxyZW1hcmtzPg0KKyAgICAvLy8gPHBhcmE+WW91IG1pZ2h0IHdvbmRlciB3aHkgdGhpcyBpcyBuZWNlc3NhcnkuIFR3byBhbHRlcm5hdGl2ZXMgbWlnaHQgY29tZSB0bw0KKyAgICAvLy8gbWluZC4gRmlyc3QsIHlvdSBtaWdodCBpbWFnaW5lIGEgc3lzdGVtIHdoZXJlIGdlbmVyYXRlZCBleHRlbnNpb25zIGFyZQ0KKyAgICAvLy8gYXV0b21hdGljYWxseSByZWdpc3RlcmVkIHdoZW4gdGhlaXIgY29udGFpbmluZyBjbGFzc2VzIGFyZSBsb2FkZWQuIFRoaXMNCisgICAgLy8vIGlzIGEgcG9wdWxhciB0ZWNobmlxdWUsIGJ1dCBpcyBiYWQgZGVzaWduOyBhbW9uZyBvdGhlciB0aGluZ3MsIGl0IGNyZWF0ZXMgYQ0KKyAgICAvLy8gc2l0dWF0aW9uIHdoZXJlIGJlaGF2aW9yIGNhbiBjaGFuZ2UgZGVwZW5kaW5nIG9uIHdoYXQgY2xhc3NlcyBoYXBwZW4gdG8gYmUNCisgICAgLy8vIGxvYWRlZC4gSXQgYWxzbyBpbnRyb2R1Y2VzIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSwgYmVjYXVzZSBhbg0KKyAgICAvLy8gdW5wcml2aWxlZ2VkIGNsYXNzIGNvdWxkIGNhdXNlIGl0cyBjb2RlIHRvIGJlIGNhbGxlZCB1bmV4cGVjdGVkbHkgZnJvbSBhDQorICAgIC8vLyBwcml2aWxlZ2VkIGNsYXNzIGJ5IHJlZ2lzdGVyaW5nIGl0c2VsZiBhcyBhbiBleHRlbnNpb24gb2YgdGhlIHJpZ2h0IHR5cGUuDQorICAgIC8vLyA8L3BhcmE+DQorICAgIC8vLyA8cGFyYT5Bbm90aGVyIG9wdGlvbiB5b3UgbWlnaHQgY29uc2lkZXIgaXMgbGF6eSBwYXJzaW5nOiBkbyBub3QgcGFyc2UgYW4NCisgICAgLy8vIGV4dGVuc2lvbiB1bnRpbCBpdCBpcyBmaXJzdCByZXF1ZXN0ZWQsIGF0IHdoaWNoIHBvaW50IHRoZSBjYWxsZXIgbXVzdA0KKyAgICAvLy8gcHJvdmlkZSBhIHR5cGUgdG8gdXNlLiBUaGlzIGludHJvZHVjZXMgYSBkaWZmZXJlbnQgc2V0IG9mIHByb2JsZW1zLiBGaXJzdCwNCisgICAgLy8vIGl0IHdvdWxkIHJlcXVpcmUgYSBtdXRleCBsb2NrIGFueSB0aW1lIGFuIGV4dGVuc2lvbiB3YXMgYWNjZXNzZWQsIHdoaWNoDQorICAgIC8vLyB3b3VsZCBiZSBzbG93LiBTZWNvbmQsIGNvcnJ1cHQgZGF0YSB3b3VsZCBub3QgYmUgZGV0ZWN0ZWQgdW50aWwgZmlyc3QNCisgICAgLy8vIGFjY2VzcywgYXQgd2hpY2ggcG9pbnQgaXQgd291bGQgYmUgbXVjaCBoYXJkZXIgdG8gZGVhbCB3aXRoIGl0LiBUaGlyZCwgaXQNCisgICAgLy8vIGNvdWxkIHZpb2xhdGUgdGhlIGV4cGVjdGF0aW9uIHRoYXQgbWVzc2FnZSBvYmplY3RzIGFyZSBpbW11dGFibGUsIHNpbmNlIHRoZQ0KKyAgICAvLy8gdHlwZSBwcm92aWRlZCBjb3VsZCBiZSBhbnkgYXJiaXRyYXJ5IG1lc3NhZ2UgY2xhc3MuIEFuIHVucHJpdmlsZWdlZCB1c2VyDQorICAgIC8vLyBjb3VsZCB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIHRvIGluamVjdCBhIG11dGFibGUgb2JqZWN0IGludG8gYSBtZXNzYWdlDQorICAgIC8vLyBiZWxvbmdpbmcgdG8gcHJpdmlsZWdlZCBjb2RlIGFuZCBjcmVhdGUgbWlzY2hpZWYuPC9wYXJhPg0KKyAgICAvLy8gPC9yZW1hcmtzPg0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRXh0ZW5zaW9uUmVnaXN0cnkNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEZpbmRzIGFuIGV4dGVuc2lvbiBieSBmdWxseS1xdWFsaWZpZWQgZmllbGQgbmFtZSwgaW4gdGhlDQorICAgICAgICAvLy8gcHJvdG8gbmFtZXNwYWNlLCBpLmUuIHJlc3VsdC5EZXNjcmlwdG9yLkZ1bGxOYW1lIHdpbGwgbWF0Y2gNCisgICAgICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0iZnVsbE5hbWUiLz4gaWYgYSBtYXRjaCBpcyBmb3VuZC4gQSBudWxsDQorICAgICAgICAvLy8gcmVmZXJlbmNlIGlzIHJldHVybmVkIGlmIHRoZSBleHRlbnNpb24gY2FuJ3QgYmUgZm91bmQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW09ic29sZXRlKCJQbGVhc2UgdXNlIHRoZSBGaW5kQnlOYW1lIG1ldGhvZCBpbnN0ZWFkLiIsIHRydWUpXQ0KKyAgICAgICAgcHVibGljIEV4dGVuc2lvbkluZm8gdGhpc1tzdHJpbmcgZnVsbE5hbWVdDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChJR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZSBleHQgaW4gZXh0ZW5zaW9uc0J5TnVtYmVyLlZhbHVlcykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFN0cmluZ0NvbXBhcmVyLk9yZGluYWwuRXF1YWxzKGV4dC5EZXNjcmlwdG9yLkZ1bGxOYW1lLCBmdWxsTmFtZSkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4dCBhcyBFeHRlbnNpb25JbmZvOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisjaWYgIUxJVEUNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBGaW5kcyBhbiBleHRlbnNpb24gYnkgY29udGFpbmluZyB0eXBlIGFuZCBmaWVsZCBudW1iZXIuDQorICAgICAgICAvLy8gQSBudWxsIHJlZmVyZW5jZSBpcyByZXR1cm5lZCBpZiB0aGUgZXh0ZW5zaW9uIGNhbid0IGJlIGZvdW5kLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBFeHRlbnNpb25JbmZvIHRoaXNbTWVzc2FnZURlc2NyaXB0b3IgY29udGFpbmluZ1R5cGUsIGludCBmaWVsZE51bWJlcl0NCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIElHZW5lcmF0ZWRFeHRlbnNpb25MaXRlIHJldDsNCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc0J5TnVtYmVyLlRyeUdldFZhbHVlKG5ldyBFeHRlbnNpb25JbnRQYWlyKGNvbnRhaW5pbmdUeXBlLCBmaWVsZE51bWJlciksIG91dCByZXQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0IGFzIEV4dGVuc2lvbkluZm87DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIEV4dGVuc2lvbkluZm8gRmluZEJ5TmFtZShNZXNzYWdlRGVzY3JpcHRvciBjb250YWluaW5nVHlwZSwgc3RyaW5nIGZpZWxkTmFtZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gRmluZEV4dGVuc2lvbkJ5TmFtZShjb250YWluaW5nVHlwZSwgZmllbGROYW1lKSBhcyBFeHRlbnNpb25JbmZvOw0KKyAgICAgICAgfQ0KKyNlbmRpZg0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFkZCBhbiBleHRlbnNpb24gZnJvbSBhIGdlbmVyYXRlZCBmaWxlIHRvIHRoZSByZWdpc3RyeS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdm9pZCBBZGQ8VEV4dGVuc2lvbj4oR2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxURXh0ZW5zaW9uPiBleHRlbnNpb24pDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGV4dGVuc2lvbi5EZXNjcmlwdG9yLk1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5NZXNzYWdlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQWRkKG5ldyBFeHRlbnNpb25JbmZvKGV4dGVuc2lvbi5EZXNjcmlwdG9yLCBleHRlbnNpb24uTWVzc2FnZURlZmF1bHRJbnN0YW5jZSkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBBZGQobmV3IEV4dGVuc2lvbkluZm8oZXh0ZW5zaW9uLkRlc2NyaXB0b3IsIG51bGwpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQWRkcyBhIG5vbi1tZXNzYWdlLXR5cGUgZXh0ZW5zaW9uIHRvIHRoZSByZWdpc3RyeSBieSBkZXNjcmlwdG9yLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4NCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZChGaWVsZERlc2NyaXB0b3IgdHlwZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAodHlwZS5NYXBwZWRUeXBlID09IE1hcHBlZFR5cGUuTWVzc2FnZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiRXh0ZW5zaW9uUmVnaXN0cnkuQWRkKCkgbXVzdCBiZSBwcm92aWRlZCBhIGRlZmF1bHQgaW5zdGFuY2UgIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAid2hlbiBhZGRpbmcgYW4gZW1iZWRkZWQgbWVzc2FnZSBleHRlbnNpb24uIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEFkZChuZXcgRXh0ZW5zaW9uSW5mbyh0eXBlLCBudWxsKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQWRkcyBhIG1lc3NhZ2UtdHlwZS1leHRlbnNpb24gdG8gdGhlIHJlZ2lzdHJ5IGJ5IGRlc2NyaXB0b3IuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZWZhdWx0SW5zdGFuY2UiPjwvcGFyYW0+DQorICAgICAgICBwdWJsaWMgdm9pZCBBZGQoRmllbGREZXNjcmlwdG9yIHR5cGUsIElNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAodHlwZS5NYXBwZWRUeXBlICE9IE1hcHBlZFR5cGUuTWVzc2FnZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiRXh0ZW5zaW9uUmVnaXN0cnkuQWRkKCkgcHJvdmlkZWQgYSBkZWZhdWx0IGluc3RhbmNlIGZvciBhICINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5vbi1tZXNzYWdlIGV4dGVuc2lvbi4iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQWRkKG5ldyBFeHRlbnNpb25JbmZvKHR5cGUsIGRlZmF1bHRJbnN0YW5jZSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZChFeHRlbnNpb25JbmZvIGV4dGVuc2lvbikNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAocmVhZE9ubHkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGFkZCBlbnRyaWVzIHRvIGEgcmVhZC1vbmx5IGV4dGVuc2lvbiByZWdpc3RyeSIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoIWV4dGVuc2lvbi5EZXNjcmlwdG9yLklzRXh0ZW5zaW9uKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJFeHRlbnNpb25SZWdpc3RyeS5hZGQoKSB3YXMgZ2l2ZW4gYSBGaWVsZERlc2NyaXB0b3IgZm9yIGEgIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVndWxhciAobm9uLWV4dGVuc2lvbikgZmllbGQuIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIElHZW5lcmF0ZWRFeHRlbnNpb25MaXRlIGxpdGVFeHRlbnNpb24gPSBleHRlbnNpb247DQorICAgICAgICAgICAgQWRkKGxpdGVFeHRlbnNpb24pOw0KKw0KKyAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGV4dGVuc2lvbi5EZXNjcmlwdG9yOw0KKyAgICAgICAgICAgIGlmIChmaWVsZC5Db250YWluaW5nVHlwZS5PcHRpb25zLk1lc3NhZ2VTZXRXaXJlRm9ybWF0DQorICAgICAgICAgICAgICAgICYmIGZpZWxkLkZpZWxkVHlwZSA9PSBGaWVsZFR5cGUuTWVzc2FnZQ0KKyAgICAgICAgICAgICAgICAmJiBmaWVsZC5Jc09wdGlvbmFsDQorICAgICAgICAgICAgICAgICYmIGZpZWxkLkV4dGVuc2lvblNjb3BlID09IGZpZWxkLk1lc3NhZ2VUeXBlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBleHRlbnNpb24gb2YgYSBNZXNzYWdlU2V0IHR5cGUgZGVmaW5lZCB3aXRoaW4gdGhlIGV4dGVuc2lvbg0KKyAgICAgICAgICAgICAgICAvLyB0eXBlJ3Mgb3duIHNjb3BlLiBGb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHksIGFsbG93IGl0IHRvIGJlIGxvb2tlZA0KKyAgICAgICAgICAgICAgICAvLyB1cCBieSB0eXBlIG5hbWUuDQorICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBJR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZT4gbWFwOw0KKyAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uc0J5TmFtZS5UcnlHZXRWYWx1ZShsaXRlRXh0ZW5zaW9uLkNvbnRhaW5pbmdUeXBlLCBvdXQgbWFwKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgbWFwW2ZpZWxkLk1lc3NhZ2VUeXBlLkZ1bGxOYW1lXSA9IGV4dGVuc2lvbjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9FeHRlbnNpb25SZWdpc3RyeUxpdGUuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9FeHRlbnNpb25SZWdpc3RyeUxpdGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyMjBlOQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0V4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5jcwpAQCAtMCwwICsxLDIyMCBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBFeHRlbnNpb25CeU5hbWVNYXAgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5PG9iamVjdCwgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeTxzdHJpbmcsIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuSUdlbmVyYXRlZEV4dGVuc2lvbkxpdGU+PjsNCit1c2luZyBFeHRlbnNpb25CeUlkTWFwID0gU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeTxHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkV4dGVuc2lvblJlZ2lzdHJ5LkV4dGVuc2lvbkludFBhaXIsIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuSUdlbmVyYXRlZEV4dGVuc2lvbkxpdGU+Ow0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBBIHRhYmxlIG9mIGtub3duIGV4dGVuc2lvbnMsIHNlYXJjaGFibGUgYnkgbmFtZSBvciBmaWVsZCBudW1iZXIuICBXaGVuDQorICAgIC8vLyBwYXJzaW5nIGEgcHJvdG9jb2wgbWVzc2FnZSB0aGF0IG1pZ2h0IGhhdmUgZXh0ZW5zaW9ucywgeW91IG11c3QgcHJvdmlkZQ0KKyAgICAvLy8gYW4gPHNlZSBjcmVmPSJFeHRlbnNpb25SZWdpc3RyeSIvPiBpbiB3aGljaCB5b3UgaGF2ZSByZWdpc3RlcmVkIGFueSBleHRlbnNpb25zDQorICAgIC8vLyB0aGF0IHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcGFyc2UuICBPdGhlcndpc2UsIHRob3NlIGV4dGVuc2lvbnMgd2lsbCBqdXN0DQorICAgIC8vLyBiZSB0cmVhdGVkIGxpa2UgdW5rbm93biBmaWVsZHMuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIC8vLyA8ZXhhbXBsZT4NCisgICAgLy8vIEZvciBleGFtcGxlLCBpZiB5b3UgaGFkIHRoZSA8Yz4ucHJvdG88L2M+IGZpbGU6DQorICAgIC8vLyA8Y29kZT4NCisgICAgLy8vIG9wdGlvbiBqYXZhX2NsYXNzID0gIk15UHJvdG8iOw0KKyAgICAvLy8NCisgICAgLy8vIG1lc3NhZ2UgRm9vIHsNCisgICAgLy8vICAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsNCisgICAgLy8vIH0NCisgICAgLy8vDQorICAgIC8vLyBleHRlbmQgRm9vIHsNCisgICAgLy8vICAgb3B0aW9uYWwgaW50MzIgYmFyOw0KKyAgICAvLy8gfQ0KKyAgICAvLy8gPC9jb2RlPg0KKyAgICAvLy8NCisgICAgLy8vIFRoZW4geW91IG1pZ2h0IHdyaXRlIGNvZGUgbGlrZToNCisgICAgLy8vDQorICAgIC8vLyA8Y29kZT4NCisgICAgLy8vIGV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgLy8vIHJlZ2lzdHJ5LkFkZChNeVByb3RvLkJhcik7DQorICAgIC8vLyBNeVByb3RvLkZvbyBtZXNzYWdlID0gTXlQcm90by5Gb28uUGFyc2VGcm9tKGlucHV0LCByZWdpc3RyeSk7DQorICAgIC8vLyA8L2NvZGU+DQorICAgIC8vLyA8L2V4YW1wbGU+DQorICAgIC8vLw0KKyAgICAvLy8gPHJlbWFya3M+DQorICAgIC8vLyA8cGFyYT5Zb3UgbWlnaHQgd29uZGVyIHdoeSB0aGlzIGlzIG5lY2Vzc2FyeS4gVHdvIGFsdGVybmF0aXZlcyBtaWdodCBjb21lIHRvDQorICAgIC8vLyBtaW5kLiBGaXJzdCwgeW91IG1pZ2h0IGltYWdpbmUgYSBzeXN0ZW0gd2hlcmUgZ2VuZXJhdGVkIGV4dGVuc2lvbnMgYXJlDQorICAgIC8vLyBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyZWQgd2hlbiB0aGVpciBjb250YWluaW5nIGNsYXNzZXMgYXJlIGxvYWRlZC4gVGhpcw0KKyAgICAvLy8gaXMgYSBwb3B1bGFyIHRlY2huaXF1ZSwgYnV0IGlzIGJhZCBkZXNpZ247IGFtb25nIG90aGVyIHRoaW5ncywgaXQgY3JlYXRlcyBhDQorICAgIC8vLyBzaXR1YXRpb24gd2hlcmUgYmVoYXZpb3IgY2FuIGNoYW5nZSBkZXBlbmRpbmcgb24gd2hhdCBjbGFzc2VzIGhhcHBlbiB0byBiZQ0KKyAgICAvLy8gbG9hZGVkLiBJdCBhbHNvIGludHJvZHVjZXMgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5LCBiZWNhdXNlIGFuDQorICAgIC8vLyB1bnByaXZpbGVnZWQgY2xhc3MgY291bGQgY2F1c2UgaXRzIGNvZGUgdG8gYmUgY2FsbGVkIHVuZXhwZWN0ZWRseSBmcm9tIGENCisgICAgLy8vIHByaXZpbGVnZWQgY2xhc3MgYnkgcmVnaXN0ZXJpbmcgaXRzZWxmIGFzIGFuIGV4dGVuc2lvbiBvZiB0aGUgcmlnaHQgdHlwZS4NCisgICAgLy8vIDwvcGFyYT4NCisgICAgLy8vIDxwYXJhPkFub3RoZXIgb3B0aW9uIHlvdSBtaWdodCBjb25zaWRlciBpcyBsYXp5IHBhcnNpbmc6IGRvIG5vdCBwYXJzZSBhbg0KKyAgICAvLy8gZXh0ZW5zaW9uIHVudGlsIGl0IGlzIGZpcnN0IHJlcXVlc3RlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIGNhbGxlciBtdXN0DQorICAgIC8vLyBwcm92aWRlIGEgdHlwZSB0byB1c2UuIFRoaXMgaW50cm9kdWNlcyBhIGRpZmZlcmVudCBzZXQgb2YgcHJvYmxlbXMuIEZpcnN0LA0KKyAgICAvLy8gaXQgd291bGQgcmVxdWlyZSBhIG11dGV4IGxvY2sgYW55IHRpbWUgYW4gZXh0ZW5zaW9uIHdhcyBhY2Nlc3NlZCwgd2hpY2gNCisgICAgLy8vIHdvdWxkIGJlIHNsb3cuIFNlY29uZCwgY29ycnVwdCBkYXRhIHdvdWxkIG5vdCBiZSBkZXRlY3RlZCB1bnRpbCBmaXJzdA0KKyAgICAvLy8gYWNjZXNzLCBhdCB3aGljaCBwb2ludCBpdCB3b3VsZCBiZSBtdWNoIGhhcmRlciB0byBkZWFsIHdpdGggaXQuIFRoaXJkLCBpdA0KKyAgICAvLy8gY291bGQgdmlvbGF0ZSB0aGUgZXhwZWN0YXRpb24gdGhhdCBtZXNzYWdlIG9iamVjdHMgYXJlIGltbXV0YWJsZSwgc2luY2UgdGhlDQorICAgIC8vLyB0eXBlIHByb3ZpZGVkIGNvdWxkIGJlIGFueSBhcmJpdHJhcnkgbWVzc2FnZSBjbGFzcy4gQW4gdW5wcml2aWxlZ2VkIHVzZXINCisgICAgLy8vIGNvdWxkIHRha2UgYWR2YW50YWdlIG9mIHRoaXMgdG8gaW5qZWN0IGEgbXV0YWJsZSBvYmplY3QgaW50byBhIG1lc3NhZ2UNCisgICAgLy8vIGJlbG9uZ2luZyB0byBwcml2aWxlZ2VkIGNvZGUgYW5kIGNyZWF0ZSBtaXNjaGllZi48L3BhcmE+DQorICAgIC8vLyA8L3JlbWFya3M+DQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBFeHRlbnNpb25SZWdpc3RyeQ0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFeHRlbnNpb25SZWdpc3RyeSBlbXB0eSA9IG5ldyBFeHRlbnNpb25SZWdpc3RyeSgNCisgICAgICAgICAgICBuZXcgRXh0ZW5zaW9uQnlOYW1lTWFwKCksDQorICAgICAgICAgICAgbmV3IEV4dGVuc2lvbkJ5SWRNYXAoKSwNCisgICAgICAgICAgICB0cnVlKTsNCisNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRXh0ZW5zaW9uQnlOYW1lTWFwIGV4dGVuc2lvbnNCeU5hbWU7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEV4dGVuc2lvbkJ5SWRNYXAgZXh0ZW5zaW9uc0J5TnVtYmVyOw0KKw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIHJlYWRPbmx5Ow0KKw0KKyAgICAgICAgcHJpdmF0ZSBFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25CeU5hbWVNYXAgYnlOYW1lLCBFeHRlbnNpb25CeUlkTWFwIGJ5TnVtYmVyLCBib29sIHJlYWRPbmx5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uc0J5TmFtZSA9IGJ5TmFtZTsNCisgICAgICAgICAgICB0aGlzLmV4dGVuc2lvbnNCeU51bWJlciA9IGJ5TnVtYmVyOw0KKyAgICAgICAgICAgIHRoaXMucmVhZE9ubHkgPSByZWFkT25seTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3QgYSBuZXcsIGVtcHR5IGluc3RhbmNlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uUmVnaXN0cnkgQ3JlYXRlSW5zdGFuY2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uUmVnaXN0cnkobmV3IEV4dGVuc2lvbkJ5TmFtZU1hcCgpLCBuZXcgRXh0ZW5zaW9uQnlJZE1hcCgpLCBmYWxzZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgRXh0ZW5zaW9uUmVnaXN0cnkgQXNSZWFkT25seSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25SZWdpc3RyeShleHRlbnNpb25zQnlOYW1lLCBleHRlbnNpb25zQnlOdW1iZXIsIHRydWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEdldCB0aGUgdW5tb2RpZmlhYmxlIHNpbmdsZXRvbiBlbXB0eSBpbnN0YW5jZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvblJlZ2lzdHJ5IEVtcHR5DQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGVtcHR5OyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRmluZHMgYW4gZXh0ZW5zaW9uIGJ5IGNvbnRhaW5pbmcgdHlwZSBhbmQgZmllbGQgbnVtYmVyLg0KKyAgICAgICAgLy8vIEEgbnVsbCByZWZlcmVuY2UgaXMgcmV0dXJuZWQgaWYgdGhlIGV4dGVuc2lvbiBjYW4ndCBiZSBmb3VuZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgSUdlbmVyYXRlZEV4dGVuc2lvbkxpdGUgdGhpc1tJTWVzc2FnZUxpdGUgY29udGFpbmluZ1R5cGUsIGludCBmaWVsZE51bWJlcl0NCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIElHZW5lcmF0ZWRFeHRlbnNpb25MaXRlIHJldDsNCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc0J5TnVtYmVyLlRyeUdldFZhbHVlKG5ldyBFeHRlbnNpb25JbnRQYWlyKGNvbnRhaW5pbmdUeXBlLCBmaWVsZE51bWJlciksIG91dCByZXQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBJR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZSBGaW5kQnlOYW1lKElNZXNzYWdlTGl0ZSBkZWZhdWx0SW5zdGFuY2VPZlR5cGUsIHN0cmluZyBmaWVsZE5hbWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIEZpbmRFeHRlbnNpb25CeU5hbWUoZGVmYXVsdEluc3RhbmNlT2ZUeXBlLCBmaWVsZE5hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBJR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZSBGaW5kRXh0ZW5zaW9uQnlOYW1lKG9iamVjdCBmb3J3aGF0LCBzdHJpbmcgZmllbGROYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIElHZW5lcmF0ZWRFeHRlbnNpb25MaXRlIGV4dGVuc2lvbiA9IG51bGw7DQorICAgICAgICAgICAgRGljdGlvbmFyeTxzdHJpbmcsIElHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPiBtYXA7DQorICAgICAgICAgICAgaWYgKGV4dGVuc2lvbnNCeU5hbWUuVHJ5R2V0VmFsdWUoZm9yd2hhdCwgb3V0IG1hcCkgJiYgbWFwLlRyeUdldFZhbHVlKGZpZWxkTmFtZSwgb3V0IGV4dGVuc2lvbikpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBZGQgYW4gZXh0ZW5zaW9uIGZyb20gYSBnZW5lcmF0ZWQgZmlsZSB0byB0aGUgcmVnaXN0cnkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgQWRkKElHZW5lcmF0ZWRFeHRlbnNpb25MaXRlIGV4dGVuc2lvbikNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAocmVhZE9ubHkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGFkZCBlbnRyaWVzIHRvIGEgcmVhZC1vbmx5IGV4dGVuc2lvbiByZWdpc3RyeSIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBleHRlbnNpb25zQnlOdW1iZXIuQWRkKG5ldyBFeHRlbnNpb25JbnRQYWlyKGV4dGVuc2lvbi5Db250YWluaW5nVHlwZSwgZXh0ZW5zaW9uLk51bWJlciksIGV4dGVuc2lvbik7DQorDQorICAgICAgICAgICAgRGljdGlvbmFyeTxzdHJpbmcsIElHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPiBtYXA7DQorICAgICAgICAgICAgaWYgKCFleHRlbnNpb25zQnlOYW1lLlRyeUdldFZhbHVlKGV4dGVuc2lvbi5Db250YWluaW5nVHlwZSwgb3V0IG1hcCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBleHRlbnNpb25zQnlOYW1lLkFkZChleHRlbnNpb24uQ29udGFpbmluZ1R5cGUsIG1hcCA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgSUdlbmVyYXRlZEV4dGVuc2lvbkxpdGU+KCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtYXBbZXh0ZW5zaW9uLkRlc2NyaXB0b3IuTmFtZV0gPSBleHRlbnNpb247DQorICAgICAgICAgICAgbWFwW2V4dGVuc2lvbi5EZXNjcmlwdG9yLkZ1bGxOYW1lXSA9IGV4dGVuc2lvbjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBOZXN0ZWQgdHlwZSBqdXN0IHVzZWQgdG8gcmVwcmVzZW50IGEgcGFpciBvZiBNZXNzYWdlRGVzY3JpcHRvciBhbmQgaW50LCBhcw0KKyAgICAgICAgLy8vIHRoZSBrZXkgaW50byB0aGUgImJ5IG51bWJlciIgbWFwLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIHN0cnVjdCBFeHRlbnNpb25JbnRQYWlyIDogSUVxdWF0YWJsZTxFeHRlbnNpb25JbnRQYWlyPg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0IG1zZ1R5cGU7DQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgbnVtYmVyOw0KKw0KKyAgICAgICAgICAgIGludGVybmFsIEV4dGVuc2lvbkludFBhaXIob2JqZWN0IG1zZ1R5cGUsIGludCBudW1iZXIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aGlzLm1zZ1R5cGUgPSBtc2dUeXBlOw0KKyAgICAgICAgICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gbXNnVHlwZS5HZXRIYXNoQ29kZSgpKigoMSA8PCAxNikgLSAxKSArIG51bWJlcjsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoIShvYmogaXMgRXh0ZW5zaW9uSW50UGFpcikpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gRXF1YWxzKChFeHRlbnNpb25JbnRQYWlyKSBvYmopOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBFcXVhbHMoRXh0ZW5zaW9uSW50UGFpciBvdGhlcikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBtc2dUeXBlLkVxdWFscyhvdGhlci5tc2dUeXBlKSAmJiBudW1iZXIgPT0gb3RoZXIubnVtYmVyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9GaWVsZEFjY2Vzcy9GaWVsZEFjY2Vzc29yVGFibGUuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9GaWVsZEFjY2Vzcy9GaWVsZEFjY2Vzc29yVGFibGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhMDM5YwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0ZpZWxkQWNjZXNzL0ZpZWxkQWNjZXNzb3JUYWJsZS5jcwpAQCAtMCwwICsxLDEyNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRmllbGRBY2Nlc3MNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBmaWVsZHMgaW4gZ2VuZXJhdGVkIG1lc3NhZ2VzIHZpYSByZWZsZWN0aW9uLg0KKyAgICAvLy8gVGhpcyB0eXBlIGlzIHB1YmxpYyB0byBhbGxvdyBpdCB0byBiZSB1c2VkIGJ5IGdlbmVyYXRlZCBtZXNzYWdlcywgd2hpY2gNCisgICAgLy8vIGNyZWF0ZSBhcHByb3ByaWF0ZSBpbnN0YW5jZXMgaW4gdGhlIC5wcm90byBmaWxlIGRlc2NyaXB0aW9uIGNsYXNzLg0KKyAgICAvLy8gVE9ETyhqb25za2VldCk6IFNlZSBpZiB3ZSBjYW4gaGlkZSBpdCBzb21ld2hlcmUuLi4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBGaWVsZEFjY2Vzc29yVGFibGU8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVE1lc3NhZ2UgOiBJTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgICAgICB3aGVyZSBUQnVpbGRlciA6IElCdWlsZGVyPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJRmllbGRBY2Nlc3NvcjxUTWVzc2FnZSwgVEJ1aWxkZXI+W10gYWNjZXNzb3JzOw0KKw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZXNzYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yOw0KKw0KKyAgICAgICAgcHVibGljIE1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3INCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYSBGaWVsZEFjY2Vzc29yVGFibGUgZm9yIGEgcGFydGljdWxhciBtZXNzYWdlIGNsYXNzLg0KKyAgICAgICAgLy8vIE9ubHkgb25lIEZpZWxkQWNjZXNzb3JUYWJsZSBzaG91bGQgYmUgY29uc3RydWN0ZWQgcGVyIGNsYXNzLg0KKyAgICAgICAgLy8vIFRoZSBwcm9wZXJ0eSBuYW1lcyBzaG91bGQgYWxsIGFjdHVhbGx5IGNvcnJlc3BvbmQgd2l0aCB0aGUgZmllbGQgZGVzY3JpcHRvcidzDQorICAgICAgICAvLy8gQ1NoYXJwT3B0aW9ucy5Qcm9wZXJ0eU5hbWUgcHJvcGVydHksIGJ1dCBib290c3RyYXBwaW5nIGlzc3VlcyBjdXJyZW50bHkNCisgICAgICAgIC8vLyBwcmV2ZW50IHVzIGZyb20gdXNpbmcgdGhhdC4gVGhpcyBtYXkgYmUgYWRkcmVzc2VkIGF0IGEgZnV0dXJlIHRpbWUsIGluIHdoaWNoIGNhc2UNCisgICAgICAgIC8vLyB3ZSBjYW4ga2VlcCB0aGlzIGNvbnN0cnVjdG9yIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwganVzdCBpZ25vcmluZyB0aGUgcGFyYW1ldGVyLg0KKyAgICAgICAgLy8vIFRPRE8oam9uc2tlZXQpOiBNYWtlIGl0IHNvLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGVzY3JpcHRvciI+VGhlIHR5cGUncyBkZXNjcmlwdG9yPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvcGVydHlOYW1lcyI+VGhlIFBhc2NhbC1jYXNlIG5hbWVzIG9mIGFsbCB0aGUgZmllbGQtYmFzZWQgcHJvcGVydGllcyBpbiB0aGUgbWVzc2FnZS48L3BhcmFtPg0KKyAgICAgICAgcHVibGljIEZpZWxkQWNjZXNzb3JUYWJsZShNZXNzYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7DQorICAgICAgICAgICAgYWNjZXNzb3JzID0gbmV3IElGaWVsZEFjY2Vzc29yPFRNZXNzYWdlLCBUQnVpbGRlcj5bZGVzY3JpcHRvci5GaWVsZHMuQ291bnRdOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWNjZXNzb3JzLkxlbmd0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYWNjZXNzb3JzW2ldID0gQ3JlYXRlQWNjZXNzb3IoZGVzY3JpcHRvci5GaWVsZHNbaV0sIHByb3BlcnR5TmFtZXNbaV0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDcmVhdGVzIGFuIGFjY2Vzc29yIGZvciBhIHNpbmdsZSBmaWVsZA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gICANCisgICAgICAgIHByaXZhdGUgc3RhdGljIElGaWVsZEFjY2Vzc29yPFRNZXNzYWdlLCBUQnVpbGRlcj4gQ3JlYXRlQWNjZXNzb3IoRmllbGREZXNjcmlwdG9yIGZpZWxkLCBzdHJpbmcgbmFtZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZmllbGQuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuTWFwcGVkVHlwZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNYXBwZWRUeXBlLk1lc3NhZ2U6DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZE1lc3NhZ2VBY2Nlc3NvcjxUTWVzc2FnZSwgVEJ1aWxkZXI+KG5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNYXBwZWRUeXBlLkVudW06DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZEVudW1BY2Nlc3NvcjxUTWVzc2FnZSwgVEJ1aWxkZXI+KGZpZWxkLCBuYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZFByaW1pdGl2ZUFjY2Vzc29yPFRNZXNzYWdlLCBUQnVpbGRlcj4obmFtZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5NYXBwZWRUeXBlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuTWVzc2FnZToNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbmdsZU1lc3NhZ2VBY2Nlc3NvcjxUTWVzc2FnZSwgVEJ1aWxkZXI+KG5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNYXBwZWRUeXBlLkVudW06DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGVFbnVtQWNjZXNzb3I8VE1lc3NhZ2UsIFRCdWlsZGVyPihmaWVsZCwgbmFtZSk7DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2luZ2xlUHJpbWl0aXZlQWNjZXNzb3I8VE1lc3NhZ2UsIFRCdWlsZGVyPihuYW1lKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIElGaWVsZEFjY2Vzc29yPFRNZXNzYWdlLCBUQnVpbGRlcj4gdGhpc1tGaWVsZERlc2NyaXB0b3IgZmllbGRdDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuQ29udGFpbmluZ1R5cGUgIT0gZGVzY3JpcHRvcikNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZERlc2NyaXB0b3IgZG9lcyBub3QgbWF0Y2ggbWVzc2FnZSB0eXBlLiIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkLklzRXh0ZW5zaW9uKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHR5cGUgaGFkIGV4dGVuc2lvbnMsIGl0IHdvdWxkIHN1YmNsYXNzIEV4dGVuZGFibGVNZXNzYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggb3ZlcnJpZGVzIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZSB0byBoYW5kbGUgZXh0ZW5zaW9ucy4NCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVGhpcyB0eXBlIGRvZXMgbm90IGhhdmUgZXh0ZW5zaW9ucy4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3JzW2ZpZWxkLkluZGV4XTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRmllbGRBY2Nlc3MvSUZpZWxkQWNjZXNzb3IuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9GaWVsZEFjY2Vzcy9JRmllbGRBY2Nlc3Nvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQzYjg1Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRmllbGRBY2Nlc3MvSUZpZWxkQWNjZXNzb3IuY3MKQEAgLTAsMCArMSw5NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRmllbGRBY2Nlc3MNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEFsbG93cyBmaWVsZHMgdG8gYmUgcmVmbGVjdGl2ZWx5IGFjY2Vzc2VkIGluIGEgc21hcnQgbWFubmVyLg0KKyAgICAvLy8gVGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciBlYWNoIGZpZWxkIGFyZSBjcmVhdGVkIG9uY2UgYW5kIHRoZW4gY2FjaGVkLg0KKyAgICAvLy8gSW4gYWRkaXRpb24sIHRoaXMgaW50ZXJmYWNlIGhvbGRzIGtub3dsZWRnZSBvZiByZXBlYXRlZCBmaWVsZHMsIGJ1aWxkZXJzIGV0Yy4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgaW50ZXJuYWwgaW50ZXJmYWNlIElGaWVsZEFjY2Vzc29yPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgIHdoZXJlIFRNZXNzYWdlIDogSU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVEJ1aWxkZXIgOiBJQnVpbGRlcjxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgY29udGFpbnMgdGhlIGZpZWxkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGJvb2wgSGFzKFRNZXNzYWdlIG1lc3NhZ2UpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEdldHMgdGhlIGNvdW50IG9mIHRoZSByZXBlYXRlZCBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgaW50IEdldFJlcGVhdGVkQ291bnQoVE1lc3NhZ2UgbWVzc2FnZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2xlYXJzIHRoZSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIGJ1aWxkZXIuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWlsZGVyIj48L3BhcmFtPg0KKyAgICAgICAgdm9pZCBDbGVhcihUQnVpbGRlciBidWlsZGVyKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDcmVhdGVzIGEgYnVpbGRlciBmb3IgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZCAod2hpY2ggbXVzdCBiZSBhIG1lc3NhZ2UgZmllbGQpLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIElCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBY2Nlc3NvciBmb3Igc2luZ2xlIGZpZWxkcw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIG9iamVjdCBHZXRWYWx1ZShUTWVzc2FnZSBtZXNzYWdlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBNdXRhdG9yIGZvciBzaW5nbGUgZmllbGRzDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBTZXRWYWx1ZShUQnVpbGRlciBidWlsZGVyLCBvYmplY3QgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFjY2Vzc29yIGZvciByZXBlYXRlZCBmaWVsZHMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBvYmplY3QgR2V0UmVwZWF0ZWRWYWx1ZShUTWVzc2FnZSBtZXNzYWdlLCBpbnQgaW5kZXgpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE11dGF0b3IgZm9yIHJlcGVhdGVkIGZpZWxkcw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgU2V0UmVwZWF0ZWQoVEJ1aWxkZXIgYnVpbGRlciwgaW50IGluZGV4LCBvYmplY3QgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFkZHMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byB0aGUgZmllbGQgaW4gdGhlIGdpdmVuIGJ1aWxkZXIuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBBZGRSZXBlYXRlZChUQnVpbGRlciBidWlsZGVyLCBvYmplY3QgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgYSByZWFkLW9ubHkgd3JhcHBlciBhcm91bmQgdGhlIHZhbHVlIG9mIGEgcmVwZWF0ZWQgZmllbGQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgb2JqZWN0IEdldFJlcGVhdGVkV3JhcHBlcihUQnVpbGRlciBidWlsZGVyKTsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9GaWVsZEFjY2Vzcy9SZWZsZWN0aW9uVXRpbC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0ZpZWxkQWNjZXNzL1JlZmxlY3Rpb25VdGlsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OGYwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9GaWVsZEFjY2Vzcy9SZWZsZWN0aW9uVXRpbC5jcwpAQCAtMCwwICsxLDE4OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkZpZWxkQWNjZXNzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBUaGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZSBzb21ld2hhdCBldmlsLCBhbmQgc2hvdWxkIG5vdCBiZSB0YW1wZXJlZCB3aXRoIGxpZ2h0bHkuDQorICAgIC8vLyBCYXNpY2FsbHkgdGhleSBhbGxvdyB0aGUgY3JlYXRpb24gb2YgcmVsYXRpdmVseSB3ZWFrbHkgdHlwZWQgZGVsZWdhdGVzIGZyb20gTWV0aG9kSW5mb3MNCisgICAgLy8vIHdoaWNoIGFyZSBtb3JlIHN0cm9uZ2x5IHR5cGVkLiBUaGV5IGRvIHRoaXMgYnkgY3JlYXRpbmcgYW4gYXBwcm9wcmlhdGUgc3Ryb25nbHkgdHlwZWQNCisgICAgLy8vIGRlbGVnYXRlIGZyb20gdGhlIE1ldGhvZEluZm8sIGFuZCB0aGVuIGNhbGxpbmcgdGhhdCB3aXRoaW4gYW4gYW5vbnltb3VzIG1ldGhvZC4NCisgICAgLy8vIE1pbmQtYmVuZGluZyBzdHVmZiAoYXQgbGVhc3QgdG8geW91ciBodW1ibGUgbmFycmF0b3IpIGJ1dCB0aGUgcmVzdWx0aW5nIGRlbGVnYXRlcyBhcmUNCisgICAgLy8vIHZlcnkgZmFzdCBjb21wYXJlZCB3aXRoIGNhbGxpbmcgSW52b2tlIGxhdGVyIG9uLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgUmVmbGVjdGlvblV0aWwNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEVtcHR5IFR5cGVbXSB1c2VkIHdoZW4gY2FsbGluZyBHZXRQcm9wZXJ0eSB0byBmb3JjZSBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGluZGV4ZXIgZmV0Y2hpbmcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IFR5cGVbXSBFbXB0eVR5cGVzID0gbmV3IFR5cGVbMF07DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIGRlbGVnYXRlIHdoaWNoIHdpbGwgZXhlY3V0ZSB0aGUgZ2l2ZW4gbWV0aG9kIGFuZCB0aGVuIHJldHVybg0KKyAgICAgICAgLy8vIHRoZSByZXN1bHQgYXMgYW4gb2JqZWN0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRnVuYzxULCBvYmplY3Q+IENyZWF0ZVVwY2FzdERlbGVnYXRlPFQ+KE1ldGhvZEluZm8gbWV0aG9kKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIFRoZSB0cmlja3kgYml0IGlzIGludm9raW5nIENyZWF0ZUNyZWF0ZVVwY2FzdERlbGVnYXRlSW1wbCB3aXRoIHRoZSByaWdodCB0eXBlIHBhcmFtZXRlcnMNCisgICAgICAgICAgICBNZXRob2RJbmZvIG9wZW5JbXBsID0gdHlwZW9mKFJlZmxlY3Rpb25VdGlsKS5HZXRNZXRob2QoIkNyZWF0ZVVwY2FzdERlbGVnYXRlSW1wbCIpOw0KKyAgICAgICAgICAgIE1ldGhvZEluZm8gY2xvc2VkSW1wbCA9IG9wZW5JbXBsLk1ha2VHZW5lcmljTWV0aG9kKHR5cGVvZihUKSwgbWV0aG9kLlJldHVyblR5cGUpOw0KKyAgICAgICAgICAgIHJldHVybiAoRnVuYzxULCBvYmplY3Q+KSBjbG9zZWRJbXBsLkludm9rZShudWxsLCBuZXcgb2JqZWN0W10ge21ldGhvZH0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE1ldGhvZCB1c2VkIHNvbGVseSBmb3IgaW1wbGVtZW50aW5nIENyZWF0ZVVwY2FzdERlbGVnYXRlLiBQdWJsaWMgdG8gYXZvaWQgdHJ1c3QgaXNzdWVzDQorICAgICAgICAvLy8gaW4gbG93LXRydXN0IHNjZW5hcmlvcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZ1bmM8VFNvdXJjZSwgb2JqZWN0PiBDcmVhdGVVcGNhc3REZWxlZ2F0ZUltcGw8VFNvdXJjZSwgVFJlc3VsdD4oTWV0aG9kSW5mbyBtZXRob2QpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgcmVmbGVjdGlvbiBjYWxsIGludG8gYW4gb3BlbiBkZWxlZ2F0ZSwgaS5lLiBpbnN0ZWFkIG9mIGNhbGxpbmcgeC5NZXRob2QoKQ0KKyAgICAgICAgICAgIC8vIHdlJ2xsIGNhbGwgZ2V0dGVyKHgpLg0KKyAgICAgICAgICAgIEZ1bmM8VFNvdXJjZSwgVFJlc3VsdD4gZ2V0dGVyID0gUmVmbGVjdGlvblV0aWwuQ3JlYXRlRGVsZWdhdGVGdW5jPFRTb3VyY2UsIFRSZXN1bHQ+KG1ldGhvZCk7DQorDQorICAgICAgICAgICAgLy8gSW1wbGljaXQgdXBjYXN0IHRvIG9iamVjdCAod2l0aGluIHRoZSBkZWxlZ2F0ZSkNCisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUoVFNvdXJjZSBzb3VyY2UpIHsgcmV0dXJuIGdldHRlcihzb3VyY2UpOyB9Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBkZWxlZ2F0ZSB3aGljaCB3aWxsIGV4ZWN1dGUgdGhlIGdpdmVuIG1ldGhvZCBhZnRlciBjYXN0aW5nIHRoZSBwYXJhbWV0ZXINCisgICAgICAgIC8vLyBkb3duIGZyb20gb2JqZWN0IHRvIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXIgdHlwZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEFjdGlvbjxULCBvYmplY3Q+IENyZWF0ZURvd25jYXN0RGVsZWdhdGU8VD4oTWV0aG9kSW5mbyBtZXRob2QpDQorICAgICAgICB7DQorICAgICAgICAgICAgTWV0aG9kSW5mbyBvcGVuSW1wbCA9IHR5cGVvZihSZWZsZWN0aW9uVXRpbCkuR2V0TWV0aG9kKCJDcmVhdGVEb3duY2FzdERlbGVnYXRlSW1wbCIpOw0KKyAgICAgICAgICAgIE1ldGhvZEluZm8gY2xvc2VkSW1wbCA9IG9wZW5JbXBsLk1ha2VHZW5lcmljTWV0aG9kKHR5cGVvZihUKSwgbWV0aG9kLkdldFBhcmFtZXRlcnMoKVswXS5QYXJhbWV0ZXJUeXBlKTsNCisgICAgICAgICAgICByZXR1cm4gKEFjdGlvbjxULCBvYmplY3Q+KSBjbG9zZWRJbXBsLkludm9rZShudWxsLCBuZXcgb2JqZWN0W10ge21ldGhvZH0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBBY3Rpb248VFNvdXJjZSwgb2JqZWN0PiBDcmVhdGVEb3duY2FzdERlbGVnYXRlSW1wbDxUU291cmNlLCBUUGFyYW0+KE1ldGhvZEluZm8gbWV0aG9kKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIHJlZmxlY3Rpb24gY2FsbCBpbnRvIGFuIG9wZW4gZGVsZWdhdGUsIGkuZS4gaW5zdGVhZCBvZiBjYWxsaW5nIHguTWV0aG9kKHkpIHdlJ2xsDQorICAgICAgICAgICAgLy8gY2FsbCBNZXRob2QoeCwgeSkNCisgICAgICAgICAgICBBY3Rpb248VFNvdXJjZSwgVFBhcmFtPiBjYWxsID0gUmVmbGVjdGlvblV0aWwuQ3JlYXRlRGVsZWdhdGVBY3Rpb248VFNvdXJjZSwgVFBhcmFtPihtZXRob2QpOw0KKw0KKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZShUU291cmNlIHNvdXJjZSwgb2JqZWN0IHBhcmFtZXRlcikgeyBjYWxsKHNvdXJjZSwgKFRQYXJhbSkgcGFyYW1ldGVyKTsgfTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDcmVhdGVzIGEgZGVsZWdhdGUgd2hpY2ggd2lsbCBleGVjdXRlIHRoZSBnaXZlbiBtZXRob2QgYWZ0ZXIgY2FzdGluZyB0aGUgcGFyYW1ldGVyDQorICAgICAgICAvLy8gZG93biBmcm9tIG9iamVjdCB0byB0aGUgcmVxdWlyZWQgcGFyYW1ldGVyIHR5cGUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBBY3Rpb248VCwgb2JqZWN0PiBDcmVhdGVEb3duY2FzdERlbGVnYXRlSWdub3JpbmdSZXR1cm48VD4oTWV0aG9kSW5mbyBtZXRob2QpDQorICAgICAgICB7DQorICAgICAgICAgICAgTWV0aG9kSW5mbyBvcGVuSW1wbCA9IHR5cGVvZihSZWZsZWN0aW9uVXRpbCkuR2V0TWV0aG9kKCJDcmVhdGVEb3duY2FzdERlbGVnYXRlSWdub3JpbmdSZXR1cm5JbXBsIik7DQorICAgICAgICAgICAgTWV0aG9kSW5mbyBjbG9zZWRJbXBsID0gb3BlbkltcGwuTWFrZUdlbmVyaWNNZXRob2QodHlwZW9mKFQpLCBtZXRob2QuR2V0UGFyYW1ldGVycygpWzBdLlBhcmFtZXRlclR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLlJldHVyblR5cGUpOw0KKyAgICAgICAgICAgIHJldHVybiAoQWN0aW9uPFQsIG9iamVjdD4pIGNsb3NlZEltcGwuSW52b2tlKG51bGwsIG5ldyBvYmplY3RbXSB7bWV0aG9kfSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIEFjdGlvbjxUU291cmNlLCBvYmplY3Q+IENyZWF0ZURvd25jYXN0RGVsZWdhdGVJZ25vcmluZ1JldHVybkltcGw8VFNvdXJjZSwgVFBhcmFtLCBUUmV0dXJuPigNCisgICAgICAgICAgICBNZXRob2RJbmZvIG1ldGhvZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSByZWZsZWN0aW9uIGNhbGwgaW50byBhbiBvcGVuIGRlbGVnYXRlLCBpLmUuIGluc3RlYWQgb2YgY2FsbGluZyB4Lk1ldGhvZCh5KSB3ZSdsbA0KKyAgICAgICAgICAgIC8vIGNhbGwgTWV0aG9kKHgsIHkpDQorICAgICAgICAgICAgRnVuYzxUU291cmNlLCBUUGFyYW0sIFRSZXR1cm4+IGNhbGwgPSBSZWZsZWN0aW9uVXRpbC5DcmVhdGVEZWxlZ2F0ZUZ1bmM8VFNvdXJjZSwgVFBhcmFtLCBUUmV0dXJuPihtZXRob2QpOw0KKw0KKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZShUU291cmNlIHNvdXJjZSwgb2JqZWN0IHBhcmFtZXRlcikgeyBjYWxsKHNvdXJjZSwgKFRQYXJhbSkgcGFyYW1ldGVyKTsgfTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDcmVhdGVzIGEgZGVsZWdhdGUgd2hpY2ggd2lsbCBleGVjdXRlIHRoZSBnaXZlbiBzdGF0aWMgbWV0aG9kIGFuZCBjYXN0IHRoZSByZXN1bHQgdXAgdG8gSUJ1aWxkZXIuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGdW5jPElCdWlsZGVyPiBDcmVhdGVTdGF0aWNVcGNhc3REZWxlZ2F0ZShNZXRob2RJbmZvIG1ldGhvZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBNZXRob2RJbmZvIG9wZW5JbXBsID0gdHlwZW9mKFJlZmxlY3Rpb25VdGlsKS5HZXRNZXRob2QoIkNyZWF0ZVN0YXRpY1VwY2FzdERlbGVnYXRlSW1wbCIpOw0KKyAgICAgICAgICAgIE1ldGhvZEluZm8gY2xvc2VkSW1wbCA9IG9wZW5JbXBsLk1ha2VHZW5lcmljTWV0aG9kKG1ldGhvZC5SZXR1cm5UeXBlKTsNCisgICAgICAgICAgICByZXR1cm4gKEZ1bmM8SUJ1aWxkZXI+KSBjbG9zZWRJbXBsLkludm9rZShudWxsLCBuZXcgb2JqZWN0W10ge21ldGhvZH0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGdW5jPElCdWlsZGVyPiBDcmVhdGVTdGF0aWNVcGNhc3REZWxlZ2F0ZUltcGw8VD4oTWV0aG9kSW5mbyBtZXRob2QpDQorICAgICAgICB7DQorICAgICAgICAgICAgRnVuYzxUPiBjYWxsID0gUmVmbGVjdGlvblV0aWwuQ3JlYXRlRGVsZWdhdGVGdW5jPFQ+KG1ldGhvZCk7DQorICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlIHsgcmV0dXJuIChJQnVpbGRlcikgY2FsbCgpOyB9Ow0KKyAgICAgICAgfQ0KKw0KKw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEZ1bmM8VFJlc3VsdD4gQ3JlYXRlRGVsZWdhdGVGdW5jPFRSZXN1bHQ+KE1ldGhvZEluZm8gbWV0aG9kKQ0KKyAgICAgICAgew0KKyNpZiAhQ0YyMA0KKyAgICAgICAgICAgIG9iamVjdCB0ZGVsZWdhdGUgPSBEZWxlZ2F0ZS5DcmVhdGVEZWxlZ2F0ZSh0eXBlb2YoRnVuYzxUUmVzdWx0PiksIG51bGwsIG1ldGhvZCk7DQorICAgICAgICAgICAgcmV0dXJuIChGdW5jPFRSZXN1bHQ+KXRkZWxlZ2F0ZTsNCisjZWxzZQ0KKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpIHsgcmV0dXJuIChUUmVzdWx0KW1ldGhvZC5JbnZva2UobnVsbCwgbnVsbCk7IH07DQorI2VuZGlmDQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgRnVuYzxULCBUUmVzdWx0PiBDcmVhdGVEZWxlZ2F0ZUZ1bmM8VCwgVFJlc3VsdD4oTWV0aG9kSW5mbyBtZXRob2QpDQorICAgICAgICB7DQorI2lmICFDRjIwDQorICAgICAgICAgICAgb2JqZWN0IHRkZWxlZ2F0ZSA9IERlbGVnYXRlLkNyZWF0ZURlbGVnYXRlKHR5cGVvZihGdW5jPFQsIFRSZXN1bHQ+KSwgbnVsbCwgbWV0aG9kKTsNCisgICAgICAgICAgICByZXR1cm4gKEZ1bmM8VCwgVFJlc3VsdD4pdGRlbGVnYXRlOw0KKyNlbHNlDQorICAgICAgICAgICAgaWYgKG1ldGhvZC5Jc1N0YXRpYykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZShUIGFyZzEpIHsgcmV0dXJuIChUUmVzdWx0KSBtZXRob2QuSW52b2tlKG51bGwsIG5ldyBvYmplY3RbXSB7YXJnMX0pOyB9Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUoVCBhcmcxKSB7IHJldHVybiAoVFJlc3VsdCltZXRob2QuSW52b2tlKGFyZzEsIG51bGwpOyB9Ow0KKyNlbmRpZg0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEZ1bmM8VDEsIFQyLCBUUmVzdWx0PiBDcmVhdGVEZWxlZ2F0ZUZ1bmM8VDEsIFQyLCBUUmVzdWx0PihNZXRob2RJbmZvIG1ldGhvZCkNCisgICAgICAgIHsNCisjaWYgIUNGMjANCisgICAgICAgICAgICBvYmplY3QgdGRlbGVnYXRlID0gRGVsZWdhdGUuQ3JlYXRlRGVsZWdhdGUodHlwZW9mKEZ1bmM8VDEsIFQyLCBUUmVzdWx0PiksIG51bGwsIG1ldGhvZCk7DQorICAgICAgICAgICAgcmV0dXJuIChGdW5jPFQxLCBUMiwgVFJlc3VsdD4pdGRlbGVnYXRlOw0KKyNlbHNlDQorICAgICAgICAgICAgaWYgKG1ldGhvZC5Jc1N0YXRpYykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZShUMSBhcmcxLCBUMiBhcmcyKSB7IHJldHVybiAoVFJlc3VsdCkgbWV0aG9kLkludm9rZShudWxsLCBuZXcgb2JqZWN0W10ge2FyZzEsIGFyZzJ9KTsgfTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlKFQxIGFyZzEsIFQyIGFyZzIpIHsgcmV0dXJuIChUUmVzdWx0KW1ldGhvZC5JbnZva2UoYXJnMSwgbmV3IG9iamVjdFtdIHsgYXJnMiB9KTsgfTsNCisjZW5kaWYNCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHN0YXRpYyBBY3Rpb248VDEsIFQyPiBDcmVhdGVEZWxlZ2F0ZUFjdGlvbjxUMSwgVDI+KE1ldGhvZEluZm8gbWV0aG9kKQ0KKyAgICAgICAgew0KKyNpZiAhQ0YyMA0KKyAgICAgICAgICAgIG9iamVjdCB0ZGVsZWdhdGUgPSBEZWxlZ2F0ZS5DcmVhdGVEZWxlZ2F0ZSh0eXBlb2YoQWN0aW9uPFQxLCBUMj4pLCBudWxsLCBtZXRob2QpOw0KKyAgICAgICAgICAgIHJldHVybiAoQWN0aW9uPFQxLCBUMj4pdGRlbGVnYXRlOw0KKyNlbHNlDQorICAgICAgICAgICAgaWYgKG1ldGhvZC5Jc1N0YXRpYykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZShUMSBhcmcxLCBUMiBhcmcyKSB7IG1ldGhvZC5JbnZva2UobnVsbCwgbmV3IG9iamVjdFtdIHthcmcxLCBhcmcyfSk7IH07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZShUMSBhcmcxLCBUMiBhcmcyKSB7IG1ldGhvZC5JbnZva2UoYXJnMSwgbmV3IG9iamVjdFtdIHsgYXJnMiB9KTsgfTsNCisjZW5kaWYNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9GaWVsZEFjY2Vzcy9SZXBlYXRlZEVudW1BY2Nlc3Nvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0ZpZWxkQWNjZXNzL1JlcGVhdGVkRW51bUFjY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MmMyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9GaWVsZEFjY2Vzcy9SZXBlYXRlZEVudW1BY2Nlc3Nvci5jcwpAQCAtMCwwICsxLDgzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkZpZWxkQWNjZXNzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBBY2Nlc3NvciBmb3IgYSByZXBlYXRlZCBlbnVtIGZpZWxkLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBpbnRlcm5hbCBzZWFsZWQgY2xhc3MgUmVwZWF0ZWRFbnVtQWNjZXNzb3I8VE1lc3NhZ2UsIFRCdWlsZGVyPiA6IFJlcGVhdGVkUHJpbWl0aXZlQWNjZXNzb3I8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVE1lc3NhZ2UgOiBJTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgICAgICB3aGVyZSBUQnVpbGRlciA6IElCdWlsZGVyPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFbnVtRGVzY3JpcHRvciBlbnVtRGVzY3JpcHRvcjsNCisNCisgICAgICAgIGludGVybmFsIFJlcGVhdGVkRW51bUFjY2Vzc29yKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgc3RyaW5nIG5hbWUpIDogYmFzZShuYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGVudW1EZXNjcmlwdG9yID0gZmllbGQuRW51bVR5cGU7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IEdldFZhbHVlKFRNZXNzYWdlIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgTGlzdDxFbnVtVmFsdWVEZXNjcmlwdG9yPiByZXQgPSBuZXcgTGlzdDxFbnVtVmFsdWVEZXNjcmlwdG9yPigpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKGludCByYXdWYWx1ZSBpbiAoSUVudW1lcmFibGUpIGJhc2UuR2V0VmFsdWUobWVzc2FnZSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXQuQWRkKGVudW1EZXNjcmlwdG9yLkZpbmRWYWx1ZUJ5TnVtYmVyKHJhd1ZhbHVlKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBMaXN0cy5Bc1JlYWRPbmx5KHJldCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IEdldFJlcGVhdGVkVmFsdWUoVE1lc3NhZ2UgbWVzc2FnZSwgaW50IGluZGV4KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIE5vdGU6IFRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgdGhlIENMUiBhbGxvd3MgdW5ib3hpbmcgZnJvbSBhbiBlbnVtIHRvDQorICAgICAgICAgICAgLy8gaXRzIHVuZGVybHlpbmcgdmFsdWUNCisgICAgICAgICAgICBpbnQgcmF3VmFsdWUgPSAoaW50KSBiYXNlLkdldFJlcGVhdGVkVmFsdWUobWVzc2FnZSwgaW5kZXgpOw0KKyAgICAgICAgICAgIHJldHVybiBlbnVtRGVzY3JpcHRvci5GaW5kVmFsdWVCeU51bWJlcihyYXdWYWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBBZGRSZXBlYXRlZChUQnVpbGRlciBidWlsZGVyLCBvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIGJhc2UuQWRkUmVwZWF0ZWQoYnVpbGRlciwgKChFbnVtVmFsdWVEZXNjcmlwdG9yKSB2YWx1ZSkuTnVtYmVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNldFJlcGVhdGVkKFRCdWlsZGVyIGJ1aWxkZXIsIGludCBpbmRleCwgb2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBiYXNlLlNldFJlcGVhdGVkKGJ1aWxkZXIsIGluZGV4LCAoKEVudW1WYWx1ZURlc2NyaXB0b3IpIHZhbHVlKS5OdW1iZXIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0ZpZWxkQWNjZXNzL1JlcGVhdGVkTWVzc2FnZUFjY2Vzc29yLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRmllbGRBY2Nlc3MvUmVwZWF0ZWRNZXNzYWdlQWNjZXNzb3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxOGI5MAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0ZpZWxkQWNjZXNzL1JlcGVhdGVkTWVzc2FnZUFjY2Vzc29yLmNzCkBAIC0wLDAgKzEsOTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5GaWVsZEFjY2Vzcw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gQWNjZXNzb3IgZm9yIGEgcmVwZWF0ZWQgbWVzc2FnZSBmaWVsZC4NCisgICAgLy8vIA0KKyAgICAvLy8gVE9ETyhqb25za2VldCk6IFRyeSB0byBleHRyYWN0IHRoZSBjb21tb25hbGl0eSBiZXR3ZWVuIHRoaXMgYW5kIFNpbmdsZU1lc3NhZ2VBY2Nlc3Nvci4NCisgICAgLy8vIFdlIGFsbW9zdCB3YW50IG11bHRpcGxlIGluaGVyaXRhbmNlLi4uDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIGludGVybmFsIHNlYWxlZCBjbGFzcyBSZXBlYXRlZE1lc3NhZ2VBY2Nlc3NvcjxUTWVzc2FnZSwgVEJ1aWxkZXI+IDogUmVwZWF0ZWRQcmltaXRpdmVBY2Nlc3NvcjxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgICAgICB3aGVyZSBUTWVzc2FnZSA6IElNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgIHdoZXJlIFRCdWlsZGVyIDogSUJ1aWxkZXI8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIGEgYnVpbGRlciBmb3IgdGhlIHByb3BlcnR5IHR5cGUuIEZvciBleGFtcGxlLA0KKyAgICAgICAgLy8vIGluIGEgbWVzc2FnZSB0eXBlICJGb28iLCBhIGZpZWxkIGNhbGxlZCAiYmFyIiBtaWdodCBiZSBvZiB0eXBlICJCYXoiLiBUaGlzDQorICAgICAgICAvLy8gbWV0aG9kIGlzIEJhei5DcmVhdGVCdWlsZGVyLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRnVuYzxJQnVpbGRlcj4gY3JlYXRlQnVpbGRlckRlbGVnYXRlOw0KKw0KKyAgICAgICAgaW50ZXJuYWwgUmVwZWF0ZWRNZXNzYWdlQWNjZXNzb3Ioc3RyaW5nIG5hbWUpIDogYmFzZShuYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE1ldGhvZEluZm8gY3JlYXRlQnVpbGRlck1ldGhvZCA9IENsclR5cGUuR2V0TWV0aG9kKCJDcmVhdGVCdWlsZGVyIiwgRW1wdHlUeXBlcyk7DQorICAgICAgICAgICAgaWYgKGNyZWF0ZUJ1aWxkZXJNZXRob2QgPT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiTm8gcHVibGljIHN0YXRpYyBDcmVhdGVCdWlsZGVyIG1ldGhvZCBkZWNsYXJlZCBpbiAiICsgQ2xyVHlwZS5OYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY3JlYXRlQnVpbGRlckRlbGVnYXRlID0gUmVmbGVjdGlvblV0aWwuQ3JlYXRlU3RhdGljVXBjYXN0RGVsZWdhdGUoY3JlYXRlQnVpbGRlck1ldGhvZCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIG1lc3NhZ2Ugb2YgdGhlIGFwcHJvcHJpYXRlIENMUiB0eXBlIGZyb20gdGhlIGdpdmVuIHZhbHVlLA0KKyAgICAgICAgLy8vIHdoaWNoIG1heSBhbHJlYWR5IGJlIG9mIHRoZSByaWdodCB0eXBlIG9yIG1heSBiZSBhIGR5bmFtaWMgbWVzc2FnZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIG9iamVjdCBDb2VyY2VUeXBlKG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgLy8gSWYgaXQncyBhbHJlYWR5IG9mIHRoZSByaWdodCB0eXBlLCB3ZSdyZSBkb25lDQorICAgICAgICAgICAgaWYgKENsclR5cGUuSXNJbnN0YW5jZU9mVHlwZSh2YWx1ZSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vIE5vLi4uIHNvIGxldCdzIGNyZWF0ZSBhIGJ1aWxkZXIgb2YgdGhlIHJpZ2h0IHR5cGUsIGFuZCBtZXJnZSB0aGUgdmFsdWUgaW4uDQorICAgICAgICAgICAgSU1lc3NhZ2VMaXRlIG1lc3NhZ2UgPSAoSU1lc3NhZ2VMaXRlKSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLldlYWtNZXJnZUZyb20obWVzc2FnZSkuV2Vha0J1aWxkKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRSZXBlYXRlZChUQnVpbGRlciBidWlsZGVyLCBpbnQgaW5kZXgsIG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBiYXNlLlNldFJlcGVhdGVkKGJ1aWxkZXIsIGluZGV4LCBDb2VyY2VUeXBlKHZhbHVlKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSUJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1aWxkZXJEZWxlZ2F0ZSgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQWRkUmVwZWF0ZWQoVEJ1aWxkZXIgYnVpbGRlciwgb2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJhc2UuQWRkUmVwZWF0ZWQoYnVpbGRlciwgQ29lcmNlVHlwZSh2YWx1ZSkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0ZpZWxkQWNjZXNzL1JlcGVhdGVkUHJpbWl0aXZlQWNjZXNzb3IuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9GaWVsZEFjY2Vzcy9SZXBlYXRlZFByaW1pdGl2ZUFjY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYjkyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9GaWVsZEFjY2Vzcy9SZXBlYXRlZFByaW1pdGl2ZUFjY2Vzc29yLmNzCkBAIC0wLDAgKzEsMTU4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOw0KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkZpZWxkQWNjZXNzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBBY2Nlc3NvciBmb3IgYSByZXBlYXRlZCBmaWVsZCBvZiB0eXBlIGludCwgQnl0ZVN0cmluZyBldGMuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIGludGVybmFsIGNsYXNzIFJlcGVhdGVkUHJpbWl0aXZlQWNjZXNzb3I8VE1lc3NhZ2UsIFRCdWlsZGVyPiA6IElGaWVsZEFjY2Vzc29yPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgIHdoZXJlIFRNZXNzYWdlIDogSU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVEJ1aWxkZXIgOiBJQnVpbGRlcjxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgIHsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVHlwZSBjbHJUeXBlOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGdW5jPFRNZXNzYWdlLCBvYmplY3Q+IGdldFZhbHVlRGVsZWdhdGU7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZ1bmM8VEJ1aWxkZXIsIElCdWlsZGVyPiBjbGVhckRlbGVnYXRlOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBY3Rpb248VEJ1aWxkZXIsIG9iamVjdD4gYWRkVmFsdWVEZWxlZ2F0ZTsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRnVuYzxUQnVpbGRlciwgb2JqZWN0PiBnZXRSZXBlYXRlZFdyYXBwZXJEZWxlZ2F0ZTsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRnVuYzxUTWVzc2FnZSwgaW50PiBjb3VudERlbGVnYXRlOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZXRob2RJbmZvIGdldEVsZW1lbnRNZXRob2Q7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1ldGhvZEluZm8gc2V0RWxlbWVudE1ldGhvZDsNCisNCisgICAgICAgIC8vIFJlcGxhY2VtZW50IGZvciBUeXBlLkVtcHR5VHlwZXMgd2hpY2ggYXBwYXJlbnRseSBpc24ndCBhdmFpbGFibGUgb24gdGhlIGNvbXBhY3QgZnJhbWV3b3JrDQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgVHlwZVtdIEVtcHR5VHlwZXMgPSBuZXcgVHlwZVswXTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUaGUgQ0xSIHR5cGUgb2YgdGhlIGZpZWxkIChpbnQsIHRoZSBlbnVtIHR5cGUsIEJ5dGVTdHJpbmcsIHRoZSBtZXNzYWdlIGV0YykuDQorICAgICAgICAvLy8gVGhpcyBpcyB0YWtlbiBmcm9tIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kIHVzZWQgdG8gcmV0cmlldmUgYSBzaW5nbGUNCisgICAgICAgIC8vLyB2YWx1ZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgVHlwZSBDbHJUeXBlDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGNsclR5cGU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIFJlcGVhdGVkUHJpbWl0aXZlQWNjZXNzb3Ioc3RyaW5nIG5hbWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgUHJvcGVydHlJbmZvIG1lc3NhZ2VQcm9wZXJ0eSA9IHR5cGVvZihUTWVzc2FnZSkuR2V0UHJvcGVydHkobmFtZSArICJMaXN0Iik7DQorICAgICAgICAgICAgUHJvcGVydHlJbmZvIGJ1aWxkZXJQcm9wZXJ0eSA9IHR5cGVvZihUQnVpbGRlcikuR2V0UHJvcGVydHkobmFtZSArICJMaXN0Iik7DQorICAgICAgICAgICAgUHJvcGVydHlJbmZvIGNvdW50UHJvcGVydHkgPSB0eXBlb2YoVE1lc3NhZ2UpLkdldFByb3BlcnR5KG5hbWUgKyAiQ291bnQiKTsNCisgICAgICAgICAgICBNZXRob2RJbmZvIGNsZWFyTWV0aG9kID0gdHlwZW9mKFRCdWlsZGVyKS5HZXRNZXRob2QoIkNsZWFyIiArIG5hbWUsIEVtcHR5VHlwZXMpOw0KKyAgICAgICAgICAgIGdldEVsZW1lbnRNZXRob2QgPSB0eXBlb2YoVE1lc3NhZ2UpLkdldE1ldGhvZCgiR2V0IiArIG5hbWUsIG5ldyBUeXBlW10ge3R5cGVvZihpbnQpfSk7DQorICAgICAgICAgICAgY2xyVHlwZSA9IGdldEVsZW1lbnRNZXRob2QuUmV0dXJuVHlwZTsNCisgICAgICAgICAgICBNZXRob2RJbmZvIGFkZE1ldGhvZCA9IHR5cGVvZihUQnVpbGRlcikuR2V0TWV0aG9kKCJBZGQiICsgbmFtZSwgbmV3IFR5cGVbXSB7Q2xyVHlwZX0pOw0KKyAgICAgICAgICAgIHNldEVsZW1lbnRNZXRob2QgPSB0eXBlb2YoVEJ1aWxkZXIpLkdldE1ldGhvZCgiU2V0IiArIG5hbWUsIG5ldyBUeXBlW10ge3R5cGVvZihpbnQpLCBDbHJUeXBlfSk7DQorICAgICAgICAgICAgaWYgKG1lc3NhZ2VQcm9wZXJ0eSA9PSBudWxsDQorICAgICAgICAgICAgICAgIHx8IGJ1aWxkZXJQcm9wZXJ0eSA9PSBudWxsDQorICAgICAgICAgICAgICAgIHx8IGNvdW50UHJvcGVydHkgPT0gbnVsbA0KKyAgICAgICAgICAgICAgICB8fCBjbGVhck1ldGhvZCA9PSBudWxsDQorICAgICAgICAgICAgICAgIHx8IGFkZE1ldGhvZCA9PSBudWxsDQorICAgICAgICAgICAgICAgIHx8IGdldEVsZW1lbnRNZXRob2QgPT0gbnVsbA0KKyAgICAgICAgICAgICAgICB8fCBzZXRFbGVtZW50TWV0aG9kID09IG51bGwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIk5vdCBhbGwgcmVxdWlyZWQgcHJvcGVydGllcy9tZXRob2RzIGF2YWlsYWJsZSIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjbGVhckRlbGVnYXRlID0gUmVmbGVjdGlvblV0aWwuQ3JlYXRlRGVsZWdhdGVGdW5jPFRCdWlsZGVyLCBJQnVpbGRlcj4oY2xlYXJNZXRob2QpOw0KKyAgICAgICAgICAgIGNvdW50RGVsZWdhdGUgPSBSZWZsZWN0aW9uVXRpbC5DcmVhdGVEZWxlZ2F0ZUZ1bmM8VE1lc3NhZ2UsIGludD4oY291bnRQcm9wZXJ0eS5HZXRHZXRNZXRob2QoKSk7DQorICAgICAgICAgICAgZ2V0VmFsdWVEZWxlZ2F0ZSA9IFJlZmxlY3Rpb25VdGlsLkNyZWF0ZVVwY2FzdERlbGVnYXRlPFRNZXNzYWdlPihtZXNzYWdlUHJvcGVydHkuR2V0R2V0TWV0aG9kKCkpOw0KKyAgICAgICAgICAgIGFkZFZhbHVlRGVsZWdhdGUgPSBSZWZsZWN0aW9uVXRpbC5DcmVhdGVEb3duY2FzdERlbGVnYXRlSWdub3JpbmdSZXR1cm48VEJ1aWxkZXI+KGFkZE1ldGhvZCk7DQorICAgICAgICAgICAgZ2V0UmVwZWF0ZWRXcmFwcGVyRGVsZWdhdGUgPSBSZWZsZWN0aW9uVXRpbC5DcmVhdGVVcGNhc3REZWxlZ2F0ZTxUQnVpbGRlcj4oYnVpbGRlclByb3BlcnR5LkdldEdldE1ldGhvZCgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBib29sIEhhcyhUTWVzc2FnZSBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdmlydHVhbCBJQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEdldFZhbHVlKFRNZXNzYWdlIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlRGVsZWdhdGUobWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBTZXRWYWx1ZShUQnVpbGRlciBidWlsZGVyLCBvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gQWRkIGFsbCB0aGUgZWxlbWVudHMgaW5kaXZpZHVhbGx5LiAgVGhpcyBzZXJ2ZXMgdHdvIHB1cnBvc2VzOg0KKyAgICAgICAgICAgIC8vIDEpIFZlcmlmaWVzIHRoYXQgZWFjaCBlbGVtZW50IGhhcyB0aGUgY29ycmVjdCB0eXBlLg0KKyAgICAgICAgICAgIC8vIDIpIEluc3VyZXMgdGhhdCB0aGUgY2FsbGVyIGNhbm5vdCBtb2RpZnkgdGhlIGxpc3QgbGF0ZXIgb24gYW5kDQorICAgICAgICAgICAgLy8gICAgaGF2ZSB0aGUgbW9kaWZpY2F0aW9ucyBiZSByZWZsZWN0ZWQgaW4gdGhlIG1lc3NhZ2UuDQorICAgICAgICAgICAgQ2xlYXIoYnVpbGRlcik7DQorICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IGVsZW1lbnQgaW4gKElFbnVtZXJhYmxlKSB2YWx1ZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEFkZFJlcGVhdGVkKGJ1aWxkZXIsIGVsZW1lbnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKFRCdWlsZGVyIGJ1aWxkZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgY2xlYXJEZWxlZ2F0ZShidWlsZGVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBpbnQgR2V0UmVwZWF0ZWRDb3VudChUTWVzc2FnZSBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBjb3VudERlbGVnYXRlKG1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEdldFJlcGVhdGVkVmFsdWUoVE1lc3NhZ2UgbWVzc2FnZSwgaW50IGluZGV4KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBnZXRFbGVtZW50TWV0aG9kLkludm9rZShtZXNzYWdlLCBuZXcgb2JqZWN0W10ge2luZGV4fSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldFJlcGVhdGVkKFRCdWlsZGVyIGJ1aWxkZXIsIGludCBpbmRleCwgb2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBzZXRFbGVtZW50TWV0aG9kLkludm9rZShidWlsZGVyLCBuZXcgb2JqZWN0W10ge2luZGV4LCB2YWx1ZX0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBBZGRSZXBlYXRlZChUQnVpbGRlciBidWlsZGVyLCBvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIGFkZFZhbHVlRGVsZWdhdGUoYnVpbGRlciwgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBidWlsZGVyIGNsYXNzJ3MgYWNjZXNzb3IgYWxyZWFkeSBidWlsZHMgYSByZWFkLW9ubHkgd3JhcHBlciBmb3INCisgICAgICAgIC8vLyB1cywgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIHdhbnQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIG9iamVjdCBHZXRSZXBlYXRlZFdyYXBwZXIoVEJ1aWxkZXIgYnVpbGRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gZ2V0UmVwZWF0ZWRXcmFwcGVyRGVsZWdhdGUoYnVpbGRlcik7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRmllbGRBY2Nlc3MvU2luZ2xlRW51bUFjY2Vzc29yLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRmllbGRBY2Nlc3MvU2luZ2xlRW51bUFjY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMjdjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9GaWVsZEFjY2Vzcy9TaW5nbGVFbnVtQWNjZXNzb3IuY3MKQEAgLTAsMCArMSw3NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5GaWVsZEFjY2Vzcw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gQWNjZXNzb3IgZm9yIGZpZWxkcyByZXByZXNlbnRpbmcgYSBub24tcmVwZWF0ZWQgZW51bSB2YWx1ZS4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgaW50ZXJuYWwgc2VhbGVkIGNsYXNzIFNpbmdsZUVudW1BY2Nlc3NvcjxUTWVzc2FnZSwgVEJ1aWxkZXI+IDogU2luZ2xlUHJpbWl0aXZlQWNjZXNzb3I8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVE1lc3NhZ2UgOiBJTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgICAgICB3aGVyZSBUQnVpbGRlciA6IElCdWlsZGVyPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFbnVtRGVzY3JpcHRvciBlbnVtRGVzY3JpcHRvcjsNCisNCisgICAgICAgIGludGVybmFsIFNpbmdsZUVudW1BY2Nlc3NvcihGaWVsZERlc2NyaXB0b3IgZmllbGQsIHN0cmluZyBuYW1lKSA6IGJhc2UobmFtZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBlbnVtRGVzY3JpcHRvciA9IGZpZWxkLkVudW1UeXBlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgYW4gRW51bVZhbHVlRGVzY3JpcHRvciByZXByZXNlbnRpbmcgdGhlIHZhbHVlIGluIHRoZSBidWlsZGVyLg0KKyAgICAgICAgLy8vIE5vdGUgdGhhdCBpZiBhbiBlbnVtIGhhcyBtdWx0aXBsZSB2YWx1ZXMgZm9yIHRoZSBzYW1lIG51bWJlciwgdGhlIGRlc2NyaXB0b3INCisgICAgICAgIC8vLyBmb3IgdGhlIGZpcnN0IHZhbHVlIHdpdGggdGhhdCBudW1iZXIgd2lsbCBiZSByZXR1cm5lZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IEdldFZhbHVlKFRNZXNzYWdlIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gTm90ZTogVGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCB0aGUgQ0xSIGFsbG93cyB1bmJveGluZyBmcm9tIGFuIGVudW0gdG8NCisgICAgICAgICAgICAvLyBpdHMgdW5kZXJseWluZyB2YWx1ZQ0KKyAgICAgICAgICAgIGludCByYXdWYWx1ZSA9IChpbnQpIGJhc2UuR2V0VmFsdWUobWVzc2FnZSk7DQorICAgICAgICAgICAgcmV0dXJuIGVudW1EZXNjcmlwdG9yLkZpbmRWYWx1ZUJ5TnVtYmVyKHJhd1ZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBlbnVtICh2aWEgYW4gaW50KSBpbiB0aGUgYnVpbGRlciwNCisgICAgICAgIC8vLyBmcm9tIGFuIEVudW1WYWx1ZURlc2NyaXB0b3IgcGFyYW1ldGVyLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNldFZhbHVlKFRCdWlsZGVyIGJ1aWxkZXIsIG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgRW51bVZhbHVlRGVzY3JpcHRvciB2YWx1ZURlc2NyaXB0b3IgPSAoRW51bVZhbHVlRGVzY3JpcHRvcikgdmFsdWU7DQorICAgICAgICAgICAgYmFzZS5TZXRWYWx1ZShidWlsZGVyLCB2YWx1ZURlc2NyaXB0b3IuTnVtYmVyKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9GaWVsZEFjY2Vzcy9TaW5nbGVNZXNzYWdlQWNjZXNzb3IuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9GaWVsZEFjY2Vzcy9TaW5nbGVNZXNzYWdlQWNjZXNzb3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmNDhhMAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0ZpZWxkQWNjZXNzL1NpbmdsZU1lc3NhZ2VBY2Nlc3Nvci5jcwpAQCAtMCwwICsxLDg5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRmllbGRBY2Nlc3MNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEFjY2Vzc29yIGZvciBmaWVsZHMgcmVwcmVzZW50aW5nIGEgbm9uLXJlcGVhdGVkIG1lc3NhZ2UgdmFsdWUuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIGludGVybmFsIHNlYWxlZCBjbGFzcyBTaW5nbGVNZXNzYWdlQWNjZXNzb3I8VE1lc3NhZ2UsIFRCdWlsZGVyPiA6IFNpbmdsZVByaW1pdGl2ZUFjY2Vzc29yPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgIHdoZXJlIFRNZXNzYWdlIDogSU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVEJ1aWxkZXIgOiBJQnVpbGRlcjxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUaGUgc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgYSBidWlsZGVyIGZvciB0aGUgcHJvcGVydHkgdHlwZS4gRm9yIGV4YW1wbGUsDQorICAgICAgICAvLy8gaW4gYSBtZXNzYWdlIHR5cGUgIkZvbyIsIGEgZmllbGQgY2FsbGVkICJiYXIiIG1pZ2h0IGJlIG9mIHR5cGUgIkJheiIuIFRoaXMNCisgICAgICAgIC8vLyBtZXRob2QgaXMgQmF6LkNyZWF0ZUJ1aWxkZXIuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGdW5jPElCdWlsZGVyPiBjcmVhdGVCdWlsZGVyRGVsZWdhdGU7DQorDQorICAgICAgICBpbnRlcm5hbCBTaW5nbGVNZXNzYWdlQWNjZXNzb3Ioc3RyaW5nIG5hbWUpIDogYmFzZShuYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE1ldGhvZEluZm8gY3JlYXRlQnVpbGRlck1ldGhvZCA9IENsclR5cGUuR2V0TWV0aG9kKCJDcmVhdGVCdWlsZGVyIiwgUmVmbGVjdGlvblV0aWwuRW1wdHlUeXBlcyk7DQorICAgICAgICAgICAgaWYgKGNyZWF0ZUJ1aWxkZXJNZXRob2QgPT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiTm8gcHVibGljIHN0YXRpYyBDcmVhdGVCdWlsZGVyIG1ldGhvZCBkZWNsYXJlZCBpbiAiICsgQ2xyVHlwZS5OYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY3JlYXRlQnVpbGRlckRlbGVnYXRlID0gUmVmbGVjdGlvblV0aWwuQ3JlYXRlU3RhdGljVXBjYXN0RGVsZWdhdGUoY3JlYXRlQnVpbGRlck1ldGhvZCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIG1lc3NhZ2Ugb2YgdGhlIGFwcHJvcHJpYXRlIENMUiB0eXBlIGZyb20gdGhlIGdpdmVuIHZhbHVlLA0KKyAgICAgICAgLy8vIHdoaWNoIG1heSBhbHJlYWR5IGJlIG9mIHRoZSByaWdodCB0eXBlIG9yIG1heSBiZSBhIGR5bmFtaWMgbWVzc2FnZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIG9iamVjdCBDb2VyY2VUeXBlKG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgLy8gSWYgaXQncyBhbHJlYWR5IG9mIHRoZSByaWdodCB0eXBlLCB3ZSdyZSBkb25lDQorICAgICAgICAgICAgaWYgKENsclR5cGUuSXNJbnN0YW5jZU9mVHlwZSh2YWx1ZSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vIE5vLi4uIHNvIGxldCdzIGNyZWF0ZSBhIGJ1aWxkZXIgb2YgdGhlIHJpZ2h0IHR5cGUsIGFuZCBtZXJnZSB0aGUgdmFsdWUgaW4uDQorICAgICAgICAgICAgSU1lc3NhZ2VMaXRlIG1lc3NhZ2UgPSAoSU1lc3NhZ2VMaXRlKSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLldlYWtNZXJnZUZyb20obWVzc2FnZSkuV2Vha0J1aWxkKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRWYWx1ZShUQnVpbGRlciBidWlsZGVyLCBvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgYmFzZS5TZXRWYWx1ZShidWlsZGVyLCBDb2VyY2VUeXBlKHZhbHVlKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSUJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1aWxkZXJEZWxlZ2F0ZSgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0ZpZWxkQWNjZXNzL1NpbmdsZVByaW1pdGl2ZUFjY2Vzc29yLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRmllbGRBY2Nlc3MvU2luZ2xlUHJpbWl0aXZlQWNjZXNzb3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhMDc1NAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0ZpZWxkQWNjZXNzL1NpbmdsZVByaW1pdGl2ZUFjY2Vzc29yLmNzCkBAIC0wLDAgKzEsMTMzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRmllbGRBY2Nlc3MNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEFjY2VzcyBmb3IgYSBub24tcmVwZWF0ZWQgZmllbGQgb2YgYSAicHJpbWl0aXZlIiB0eXBlIChpLmUuIG5vdCBhbm90aGVyIG1lc3NhZ2Ugb3IgYW4gZW51bSkuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIGludGVybmFsIGNsYXNzIFNpbmdsZVByaW1pdGl2ZUFjY2Vzc29yPFRNZXNzYWdlLCBUQnVpbGRlcj4gOiBJRmllbGRBY2Nlc3NvcjxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgICAgICB3aGVyZSBUTWVzc2FnZSA6IElNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgIHdoZXJlIFRCdWlsZGVyIDogSUJ1aWxkZXI8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFR5cGUgY2xyVHlwZTsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRnVuYzxUTWVzc2FnZSwgb2JqZWN0PiBnZXRWYWx1ZURlbGVnYXRlOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBY3Rpb248VEJ1aWxkZXIsIG9iamVjdD4gc2V0VmFsdWVEZWxlZ2F0ZTsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRnVuYzxUTWVzc2FnZSwgYm9vbD4gaGFzRGVsZWdhdGU7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZ1bmM8VEJ1aWxkZXIsIElCdWlsZGVyPiBjbGVhckRlbGVnYXRlOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBDTFIgdHlwZSBvZiB0aGUgZmllbGQgKGludCwgdGhlIGVudW0gdHlwZSwgQnl0ZVN0cmluZywgdGhlIG1lc3NhZ2UgZXRjKS4NCisgICAgICAgIC8vLyBBcyBkZWNsYXJlZCBieSB0aGUgcHJvcGVydHkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIFR5cGUgQ2xyVHlwZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBjbHJUeXBlOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBTaW5nbGVQcmltaXRpdmVBY2Nlc3NvcihzdHJpbmcgbmFtZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBQcm9wZXJ0eUluZm8gbWVzc2FnZVByb3BlcnR5ID0gdHlwZW9mKFRNZXNzYWdlKS5HZXRQcm9wZXJ0eShuYW1lLCBudWxsLCBSZWZsZWN0aW9uVXRpbC5FbXB0eVR5cGVzKTsNCisgICAgICAgICAgICBQcm9wZXJ0eUluZm8gYnVpbGRlclByb3BlcnR5ID0gdHlwZW9mKFRCdWlsZGVyKS5HZXRQcm9wZXJ0eShuYW1lLCBudWxsLCBSZWZsZWN0aW9uVXRpbC5FbXB0eVR5cGVzKTsNCisgICAgICAgICAgICBQcm9wZXJ0eUluZm8gaGFzUHJvcGVydHkgPSB0eXBlb2YoVE1lc3NhZ2UpLkdldFByb3BlcnR5KCJIYXMiICsgbmFtZSk7DQorICAgICAgICAgICAgTWV0aG9kSW5mbyBjbGVhck1ldGhvZCA9IHR5cGVvZihUQnVpbGRlcikuR2V0TWV0aG9kKCJDbGVhciIgKyBuYW1lKTsNCisgICAgICAgICAgICBpZiAobWVzc2FnZVByb3BlcnR5ID09IG51bGwgfHwgYnVpbGRlclByb3BlcnR5ID09IG51bGwgfHwgaGFzUHJvcGVydHkgPT0gbnVsbCB8fCBjbGVhck1ldGhvZCA9PSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYWxsIHJlcXVpcmVkIHByb3BlcnRpZXMvbWV0aG9kcyBhdmFpbGFibGUiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2xyVHlwZSA9IG1lc3NhZ2VQcm9wZXJ0eS5Qcm9wZXJ0eVR5cGU7DQorICAgICAgICAgICAgaGFzRGVsZWdhdGUgPSBSZWZsZWN0aW9uVXRpbC5DcmVhdGVEZWxlZ2F0ZUZ1bmM8VE1lc3NhZ2UsIGJvb2w+KGhhc1Byb3BlcnR5LkdldEdldE1ldGhvZCgpKTsNCisgICAgICAgICAgICBjbGVhckRlbGVnYXRlID0gUmVmbGVjdGlvblV0aWwuQ3JlYXRlRGVsZWdhdGVGdW5jPFRCdWlsZGVyLCBJQnVpbGRlcj4oY2xlYXJNZXRob2QpOw0KKyAgICAgICAgICAgIGdldFZhbHVlRGVsZWdhdGUgPSBSZWZsZWN0aW9uVXRpbC5DcmVhdGVVcGNhc3REZWxlZ2F0ZTxUTWVzc2FnZT4obWVzc2FnZVByb3BlcnR5LkdldEdldE1ldGhvZCgpKTsNCisgICAgICAgICAgICBzZXRWYWx1ZURlbGVnYXRlID0gUmVmbGVjdGlvblV0aWwuQ3JlYXRlRG93bmNhc3REZWxlZ2F0ZTxUQnVpbGRlcj4oYnVpbGRlclByb3BlcnR5LkdldFNldE1ldGhvZCgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBib29sIEhhcyhUTWVzc2FnZSBtZXNzYWdlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBoYXNEZWxlZ2F0ZShtZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKFRCdWlsZGVyIGJ1aWxkZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgY2xlYXJEZWxlZ2F0ZShidWlsZGVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBPbmx5IHZhbGlkIGZvciBtZXNzYWdlIHR5cGVzIC0gdGhpcyBpbXBsZW1lbnRhdGlvbiB0aHJvd3MgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdmlydHVhbCBJQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEdldFZhbHVlKFRNZXNzYWdlIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlRGVsZWdhdGUobWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldFZhbHVlKFRCdWlsZGVyIGJ1aWxkZXIsIG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzZXRWYWx1ZURlbGVnYXRlKGJ1aWxkZXIsIHZhbHVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgICNyZWdpb24gTWV0aG9kcyBvbmx5IHJlbGF0ZWQgdG8gcmVwZWF0ZWQgdmFsdWVzDQorDQorICAgICAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkQ291bnQoVE1lc3NhZ2UgbWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG9iamVjdCBHZXRSZXBlYXRlZFZhbHVlKFRNZXNzYWdlIG1lc3NhZ2UsIGludCBpbmRleCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0UmVwZWF0ZWQoVEJ1aWxkZXIgYnVpbGRlciwgaW50IGluZGV4LCBvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZFJlcGVhdGVkKFRCdWlsZGVyIGJ1aWxkZXIsIG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG9iamVjdCBHZXRSZXBlYXRlZFdyYXBwZXIoVEJ1aWxkZXIgYnVpbGRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0ZpZWxkU2V0LmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRmllbGRTZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjMDhjZgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0ZpZWxkU2V0LmNzCkBAIC0wLDAgKzEsNjMyIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIHB1YmxpYyBpbnRlcmZhY2UgSUZpZWxkRGVzY3JpcHRvckxpdGUgOiBJQ29tcGFyYWJsZTxJRmllbGREZXNjcmlwdG9yTGl0ZT4NCisgICAgew0KKyAgICAgICAgYm9vbCBJc1JlcGVhdGVkIHsgZ2V0OyB9DQorICAgICAgICBib29sIElzUmVxdWlyZWQgeyBnZXQ7IH0NCisgICAgICAgIGJvb2wgSXNQYWNrZWQgeyBnZXQ7IH0NCisgICAgICAgIGJvb2wgSXNFeHRlbnNpb24geyBnZXQ7IH0NCisgICAgICAgIGJvb2wgTWVzc2FnZVNldFdpcmVGb3JtYXQgeyBnZXQ7IH0gLy9maWVsZC5Db250YWluaW5nVHlwZS5PcHRpb25zLk1lc3NhZ2VTZXRXaXJlRm9ybWF0DQorICAgICAgICBpbnQgRmllbGROdW1iZXIgeyBnZXQ7IH0NCisgICAgICAgIHN0cmluZyBOYW1lIHsgZ2V0OyB9DQorICAgICAgICBzdHJpbmcgRnVsbE5hbWUgeyBnZXQ7IH0NCisgICAgICAgIElFbnVtTGl0ZU1hcCBFbnVtVHlwZSB7IGdldDsgfQ0KKyAgICAgICAgRmllbGRUeXBlIEZpZWxkVHlwZSB7IGdldDsgfQ0KKyAgICAgICAgTWFwcGVkVHlwZSBNYXBwZWRUeXBlIHsgZ2V0OyB9DQorICAgICAgICBvYmplY3QgRGVmYXVsdFZhbHVlIHsgZ2V0OyB9DQorICAgIH0NCisNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gQSBjbGFzcyB3aGljaCByZXByZXNlbnRzIGFuIGFyYml0cmFyeSBzZXQgb2YgZmllbGRzIG9mIHNvbWUgbWVzc2FnZSB0eXBlLg0KKyAgICAvLy8gVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBEeW5hbWljTWVzc2FnZSwgYW5kIGFsc28gdG8gcmVwcmVzZW50IGV4dGVuc2lvbnMNCisgICAgLy8vIGluIEdlbmVyYXRlZE1lc3NhZ2UuIFRoaXMgY2xhc3MgaXMgaW50ZXJuYWwsIHNpbmNlIG91dHNpZGUgdXNlcnMgc2hvdWxkIHByb2JhYmx5DQorICAgIC8vLyBiZSB1c2luZyBEeW5hbWljTWVzc2FnZS4NCisgICAgLy8vIA0KKyAgICAvLy8gQXMgaW4gdGhlIEphdmEgaW1wbGVtZW50YXRpb24sIHRoaXMgY2xhc3MgZ29lcyBhZ2FpbnN0IHRoZSByZXN0IG9mIHRoZSBmcmFtZXdvcmsNCisgICAgLy8vIGluIHRlcm1zIG9mIG11dGFiaWxpdHkuIEluc3RlYWQgb2YgaGF2aW5nIGEgbXV0YWJsZSBCdWlsZGVyIGNsYXNzIGFuZCBhbiBpbW11dGFibGUNCisgICAgLy8vIEZpZWxkU2V0IGNsYXNzLCBGaWVsZFNldCBqdXN0IGhhcyBhIE1ha2VJbW11dGFibGUoKSBtZXRob2QuIFRoaXMgaXMgc2FmZSBzbyBsb25nIGFzDQorICAgIC8vLyBhbGwgY2FsbGVycyBhcmUgY2FyZWZ1bCBub3QgdG8gbGV0IGEgbXV0YWJsZSBGaWVsZFNldCBlc2NhcGUgaW50byB0aGUgb3Blbi4gVGhpcyB3b3VsZA0KKyAgICAvLy8gYmUgaW1wb3NzaWJsZSB0byBndWFyYW50ZWUgaWYgdGhpcyB3ZXJlIGEgcHVibGljIGNsYXNzLCBvZiBjb3Vyc2UuDQorICAgIC8vLyANCisgICAgLy8vIEFsbCByZXBlYXRlZCBmaWVsZHMgYXJlIHN0b3JlZCBhcyBJTGlzdFtvYmplY3RdIGV2ZW4gDQorICAgIC8vLyBUT0RPKGpvbnNrZWV0KTogRmluaXNoIHRoaXMgY29tbWVudCENCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgaW50ZXJuYWwgc2VhbGVkIGNsYXNzIEZpZWxkU2V0DQorICAgIHsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZpZWxkU2V0IGRlZmF1bHRJbnN0YW5jZSA9DQorICAgICAgICAgICAgbmV3IEZpZWxkU2V0KG5ldyBEaWN0aW9uYXJ5PElGaWVsZERlc2NyaXB0b3JMaXRlLCBvYmplY3Q+KCkpLk1ha2VJbW11dGFibGUoKTsNCisNCisgICAgICAgIHByaXZhdGUgSURpY3Rpb25hcnk8SUZpZWxkRGVzY3JpcHRvckxpdGUsIG9iamVjdD4gZmllbGRzOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBGaWVsZFNldChJRGljdGlvbmFyeTxJRmllbGREZXNjcmlwdG9yTGl0ZSwgb2JqZWN0PiBmaWVsZHMpDQorICAgICAgICB7DQorICAgICAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIEZpZWxkU2V0IENyZWF0ZUluc3RhbmNlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBVc2UgU29ydGVkTGlzdCB0byBrZWVwIGZpZWxkcyBpbiB0aGUgY2Fub25pY2FsIG9yZGVyDQorICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWVsZFNldChuZXcgU29ydGVkTGlzdDxJRmllbGREZXNjcmlwdG9yTGl0ZSwgb2JqZWN0PigpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBNYWtlcyB0aGlzIEZpZWxkU2V0IGltbXV0YWJsZSwgYW5kIHJldHVybnMgaXQgZm9yIGNvbnZlbmllbmNlLiBBbnkNCisgICAgICAgIC8vLyBtdXRhYmxlIHJlcGVhdGVkIGZpZWxkcyBhcmUgbWFkZSBpbW11dGFibGUsIGFzIHdlbGwgYXMgdGhlIG1hcCBpdHNlbGYuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgaW50ZXJuYWwgRmllbGRTZXQgTWFrZUltbXV0YWJsZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgd2UgaGF2ZSBhbnkgcmVwZWF0ZWQgdmFsdWVzDQorICAgICAgICAgICAgYm9vbCBoYXNSZXBlYXRzID0gZmFsc2U7DQorICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IHZhbHVlIGluIGZpZWxkcy5WYWx1ZXMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBJTGlzdDxvYmplY3Q+IGxpc3QgPSB2YWx1ZSBhcyBJTGlzdDxvYmplY3Q+Ow0KKyAgICAgICAgICAgICAgICBpZiAobGlzdCAhPSBudWxsICYmICFsaXN0LklzUmVhZE9ubHkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGhhc1JlcGVhdHMgPSB0cnVlOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKGhhc1JlcGVhdHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YXIgdG1wID0gbmV3IFNvcnRlZExpc3Q8SUZpZWxkRGVzY3JpcHRvckxpdGUsIG9iamVjdD4oKTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPElGaWVsZERlc2NyaXB0b3JMaXRlLCBvYmplY3Q+IGVudHJ5IGluIGZpZWxkcykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgSUxpc3Q8b2JqZWN0PiBsaXN0ID0gZW50cnkuVmFsdWUgYXMgSUxpc3Q8b2JqZWN0PjsNCisgICAgICAgICAgICAgICAgICAgIHRtcFtlbnRyeS5LZXldID0gbGlzdCA9PSBudWxsID8gZW50cnkuVmFsdWUgOiBMaXN0cy5Bc1JlYWRPbmx5KGxpc3QpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGZpZWxkcyA9IHRtcDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZmllbGRzID0gRGljdGlvbmFyaWVzLkFzUmVhZE9ubHkoZmllbGRzKTsNCisNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBkZWZhdWx0LCBpbW11dGFibGUgaW5zdGFuY2Ugd2l0aCBubyBmaWVsZHMgZGVmaW5lZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgRmllbGRTZXQgRGVmYXVsdEluc3RhbmNlDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgYW4gaW1tdXRhYmxlIG1hcHBpbmcgb2YgZmllbGRzLiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhlIG1hcHBpbmcgaXRzZWxmDQorICAgICAgICAvLy8gaXMgaW1tdXRhYmxlLCB0aGUgZW50cmllcyBtYXkgbm90IGJlIChpLmUuIGFueSByZXBlYXRlZCB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGJ5DQorICAgICAgICAvLy8gbXV0YWJsZSBsaXN0cykuIFRoZSBiZWhhdmlvdXIgaXMgbm90IHNwZWNpZmllZCBpZiB0aGUgY29udGVudHMgYXJlIG11dGF0ZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgaW50ZXJuYWwgSURpY3Rpb25hcnk8SUZpZWxkRGVzY3JpcHRvckxpdGUsIG9iamVjdD4gQWxsRmllbGRzDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIERpY3Rpb25hcmllcy5Bc1JlYWRPbmx5KGZpZWxkcyk7IH0NCisgICAgICAgIH0NCisNCisjaWYgIUxJVEUNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBGb3JjZSBjb2VyY2lvbiB0byBmdWxsIGRlc2NyaXB0b3IgZGljdGlvbmFyeS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnRlcm5hbCBJRGljdGlvbmFyeTxGaWVsZERlc2NyaXB0b3IsIG9iamVjdD4gQWxsRmllbGREZXNjcmlwdG9ycw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgU29ydGVkTGlzdDxGaWVsZERlc2NyaXB0b3IsIG9iamVjdD4gY29weSA9DQorICAgICAgICAgICAgICAgICAgICBuZXcgU29ydGVkTGlzdDxGaWVsZERlc2NyaXB0b3IsIG9iamVjdD4oKTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPElGaWVsZERlc2NyaXB0b3JMaXRlLCBvYmplY3Q+IGZkIGluIGZpZWxkcykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgY29weS5BZGQoKEZpZWxkRGVzY3JpcHRvcikgZmQuS2V5LCBmZC5WYWx1ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIERpY3Rpb25hcmllcy5Bc1JlYWRPbmx5KGNvcHkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisjZW5kaWYNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZWUgPHNlZSBjcmVmPSJJTWVzc2FnZUxpdGUuSGFzRmllbGQiLz4uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRmllbGQoSUZpZWxkRGVzY3JpcHRvckxpdGUgZmllbGQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGZpZWxkLklzUmVwZWF0ZWQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkhhc0ZpZWxkKCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIG5vbi1yZXBlYXRlZCBmaWVsZHMuIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHJldHVybiBmaWVsZHMuQ29udGFpbnNLZXkoZmllbGQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENsZWFycyBhbGwgZmllbGRzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIHZvaWQgQ2xlYXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZpZWxkcy5DbGVhcigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNlZSA8c2VlIGNyZWY9IklNZXNzYWdlTGl0ZS5JdGVtKElGaWVsZERlc2NyaXB0b3JMaXRlKSIvPg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz4NCisgICAgICAgIC8vLyBJZiB0aGUgZmllbGQgaXMgbm90IHNldCwgdGhlIGJlaGF2aW91ciB3aGVuIGZldGNoaW5nIHRoaXMgcHJvcGVydHkgdmFyaWVzIGJ5IGZpZWxkIHR5cGU6DQorICAgICAgICAvLy8gPGxpc3Q+DQorICAgICAgICAvLy8gPGl0ZW0+Rm9yIHNpbmd1bGFyIG1lc3NhZ2UgdmFsdWVzLCBudWxsIGlzIHJldHVybmVkLjwvaXRlbT4NCisgICAgICAgIC8vLyA8aXRlbT5Gb3Igc2luZ3VsYXIgbm9uLW1lc3NhZ2UgdmFsdWVzLCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZmllbGQgaXMgcmV0dXJuZWQuPC9pdGVtPg0KKyAgICAgICAgLy8vIDxpdGVtPkZvciByZXBlYXRlZCB2YWx1ZXMsIGFuIGVtcHR5IGltbXV0YWJsZSBsaXN0IGlzIHJldHVybmVkLiBUaGlzIHdpbGwgYmUgY29tcGF0aWJsZQ0KKyAgICAgICAgLy8vIHdpdGggSUxpc3Rbb2JqZWN0XSwgcmVnYXJkbGVzcyBvZiB0aGUgdHlwZSBvZiB0aGUgcmVwZWF0ZWQgaXRlbS48L2l0ZW0+DQorICAgICAgICAvLy8gPC9saXN0Pg0KKyAgICAgICAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBpZiB0aGUgZmllbGQgaXMgYSBzaW5ndWxhciBtZXNzYWdlIHR5cGUNCisgICAgICAgIC8vLyBhbmQgaXMgbm90IHNldDsgaW4gdGhpcyBjYXNlIGl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZmV0Y2ggdGhlIA0KKyAgICAgICAgLy8vIG1lc3NhZ2UncyBkZWZhdWx0IGluc3RhbmNlLiBGb3IgcmVwZWF0ZWQgZmllbGRzIG9mIG1lc3NhZ2UgdHlwZXMsIA0KKyAgICAgICAgLy8vIGFuIGVtcHR5IGNvbGxlY3Rpb24gaXMgcmV0dXJuZWQuIEZvciByZXBlYXRlZCBmaWVsZHMgb2Ygbm9uLW1lc3NhZ2UNCisgICAgICAgIC8vLyB0eXBlcywgbnVsbCBpcyByZXR1cm5lZC4NCisgICAgICAgIC8vLyA8cGFyYSAvPg0KKyAgICAgICAgLy8vIFdoZW4gc2V0dGluZyB0aGlzIHByb3BlcnR5LCBhbnkgbGlzdCB2YWx1ZXMgYXJlIGNvcGllZCwgYW5kIGVhY2ggZWxlbWVudCBpcyBjaGVja2VkDQorICAgICAgICAvLy8gdG8gZW5zdXJlIGl0IGlzIG9mIGFuIGFwcHJvcHJpYXRlIHR5cGUuDQorICAgICAgICAvLy8gPC9yZW1hcmtzPg0KKyAgICAgICAgLy8vIA0KKyAgICAgICAgaW50ZXJuYWwgb2JqZWN0IHRoaXNbSUZpZWxkRGVzY3JpcHRvckxpdGUgZmllbGRdDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBvYmplY3QgcmVzdWx0Ow0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGRzLlRyeUdldFZhbHVlKGZpZWxkLCBvdXQgcmVzdWx0KSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuTWFwcGVkVHlwZSA9PSBNYXBwZWRUeXBlLk1lc3NhZ2UpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Jc1JlcGVhdGVkKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGlzdDxvYmplY3Q+KCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLkRlZmF1bHRWYWx1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgTGlzdDxvYmplY3Q+IGxpc3QgPSB2YWx1ZSBhcyBMaXN0PG9iamVjdD47DQorICAgICAgICAgICAgICAgICAgICBpZiAobGlzdCA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiV3Jvbmcgb2JqZWN0IHR5cGUgdXNlZCB3aXRoIHByb3RvY29sIG1lc3NhZ2UgcmVmbGVjdGlvbi4iKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgIC8vIFdyYXAgdGhlIGNvbnRlbnRzIGluIGEgbmV3IGxpc3Qgc28gdGhhdCB0aGUgY2FsbGVyIGNhbm5vdCBjaGFuZ2UNCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsaXN0J3MgY29udGVudHMgYWZ0ZXIgc2V0dGluZyBpdC4NCisgICAgICAgICAgICAgICAgICAgIExpc3Q8b2JqZWN0PiBuZXdMaXN0ID0gbmV3IExpc3Q8b2JqZWN0PihsaXN0KTsNCisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCBlbGVtZW50IGluIG5ld0xpc3QpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgVmVyaWZ5VHlwZShmaWVsZCwgZWxlbWVudCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ld0xpc3Q7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBWZXJpZnlUeXBlKGZpZWxkLCB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZmllbGRzW2ZpZWxkXSA9IHZhbHVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZWUgPHNlZSBjcmVmPSJJTWVzc2FnZUxpdGUuSXRlbShJRmllbGREZXNjcmlwdG9yTGl0ZSxpbnQpIiAvPg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIG9iamVjdCB0aGlzW0lGaWVsZERlc2NyaXB0b3JMaXRlIGZpZWxkLCBpbnQgaW5kZXhdDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLklzUmVwZWF0ZWQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgICAgICAgICAiSW5kZXhlciBzcGVjaWZ5aW5nIGZpZWxkIGFuZCBpbmRleCBjYW4gb25seSBiZSBjYWxsZWQgb24gcmVwZWF0ZWQgZmllbGRzLiIpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHJldHVybiAoKElMaXN0PG9iamVjdD4pIHRoaXNbZmllbGRdKVtpbmRleF07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5Jc1JlcGVhdGVkKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oDQorICAgICAgICAgICAgICAgICAgICAgICAgIkluZGV4ZXIgc3BlY2lmeWluZyBmaWVsZCBhbmQgaW5kZXggY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHJlcGVhdGVkIGZpZWxkcy4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBWZXJpZnlUeXBlKGZpZWxkLCB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIG9iamVjdCBsaXN0Ow0KKyAgICAgICAgICAgICAgICBpZiAoIWZpZWxkcy5UcnlHZXRWYWx1ZShmaWVsZCwgb3V0IGxpc3QpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgKChJTGlzdDxvYmplY3Q+KSBsaXN0KVtpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gU2VlIDxzZWUgY3JlZj0iSUJ1aWxkZXJ7VE1lc3NhZ2UsIFRCdWlsZGVyfS5BZGRSZXBlYXRlZEZpZWxkIiAvPg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIHZvaWQgQWRkUmVwZWF0ZWRGaWVsZChJRmllbGREZXNjcmlwdG9yTGl0ZSBmaWVsZCwgb2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICghZmllbGQuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQWRkUmVwZWF0ZWRGaWVsZCBjYW4gb25seSBiZSBjYWxsZWQgb24gcmVwZWF0ZWQgZmllbGRzLiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBWZXJpZnlUeXBlKGZpZWxkLCB2YWx1ZSk7DQorICAgICAgICAgICAgb2JqZWN0IGxpc3Q7DQorICAgICAgICAgICAgaWYgKCFmaWVsZHMuVHJ5R2V0VmFsdWUoZmllbGQsIG91dCBsaXN0KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgTGlzdDxvYmplY3Q+KCk7DQorICAgICAgICAgICAgICAgIGZpZWxkc1tmaWVsZF0gPSBsaXN0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICAoKElMaXN0PG9iamVjdD4pIGxpc3QpLkFkZCh2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyBhbiBlbnVtZXJhdG9yIGZvciB0aGUgZmllbGQgbWFwLiBVc2VkIHRvIHdyaXRlIHRoZSBmaWVsZHMgb3V0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIElFbnVtZXJhdG9yPEtleVZhbHVlUGFpcjxJRmllbGREZXNjcmlwdG9yTGl0ZSwgb2JqZWN0Pj4gR2V0RW51bWVyYXRvcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIGZpZWxkcy5HZXRFbnVtZXJhdG9yKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gU2VlIDxzZWUgY3JlZj0iSU1lc3NhZ2VMaXRlLklzSW5pdGlhbGl6ZWQiIC8+DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPg0KKyAgICAgICAgLy8vIFNpbmNlIEZpZWxkU2V0IGl0c2VsZiBkb2VzIG5vdCBoYXZlIGFueSB3YXkgb2Yga25vd2luZyBhYm91dA0KKyAgICAgICAgLy8vIHJlcXVpcmVkIGZpZWxkcyB0aGF0IGFyZW4ndCBhY3R1YWxseSBwcmVzZW50IGluIHRoZSBzZXQsIGl0IGlzIHVwDQorICAgICAgICAvLy8gdG8gdGhlIGNhbGxlciB0byBjaGVjayBmb3IgZ2VudWluZWx5IHJlcXVpcmVkIGZpZWxkcy4gVGhpcyBwcm9wZXJ0eQ0KKyAgICAgICAgLy8vIG1lcmVseSBjaGVja3MgdGhhdCBhbnkgbWVzc2FnZXMgcHJlc2VudCBhcmUgdGhlbXNlbHZlcyBpbml0aWFsaXplZC4NCisgICAgICAgIC8vLyA8L3JlbWFya3M+DQorICAgICAgICBpbnRlcm5hbCBib29sIElzSW5pdGlhbGl6ZWQNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxJRmllbGREZXNjcmlwdG9yTGl0ZSwgb2JqZWN0PiBlbnRyeSBpbiBmaWVsZHMpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIElGaWVsZERlc2NyaXB0b3JMaXRlIGZpZWxkID0gZW50cnkuS2V5Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLk1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5NZXNzYWdlKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Jc1JlcGVhdGVkKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoSU1lc3NhZ2VMaXRlIG1lc3NhZ2UgaW4gKElFbnVtZXJhYmxlKSBlbnRyeS5WYWx1ZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLklzSW5pdGlhbGl6ZWQpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKChJTWVzc2FnZUxpdGUpIGVudHJ5LlZhbHVlKS5Jc0luaXRpYWxpemVkKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFZlcmlmaWVzIHdoZXRoZXIgYWxsIHRoZSByZXF1aXJlZCBmaWVsZHMgaW4gdGhlIHNwZWNpZmllZCBtZXNzYWdlDQorICAgICAgICAvLy8gZGVzY3JpcHRvciBhcmUgcHJlc2VudCBpbiB0aGlzIGZpZWxkIHNldCwgYXMgd2VsbCBhcyB3aGV0aGVyDQorICAgICAgICAvLy8gYWxsIHRoZSBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgdGhlbXNlbHZlcyBpbml0aWFsaXplZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnRlcm5hbCBib29sIElzSW5pdGlhbGl6ZWRXaXRoUmVzcGVjdFRvKElFbnVtZXJhYmxlIHR5cGVGaWVsZHMpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoSUZpZWxkRGVzY3JpcHRvckxpdGUgZmllbGQgaW4gdHlwZUZpZWxkcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Jc1JlcXVpcmVkICYmICFIYXNGaWVsZChmaWVsZCkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gSXNJbml0aWFsaXplZDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZWUgPHNlZSBjcmVmPSJJQnVpbGRlcntUTWVzc2FnZSwgVEJ1aWxkZXJ9LkNsZWFyRmllbGQiIC8+DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYXJGaWVsZChJRmllbGREZXNjcmlwdG9yTGl0ZSBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmaWVsZHMuUmVtb3ZlKGZpZWxkKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZWUgPHNlZSBjcmVmPSJJTWVzc2FnZUxpdGUuR2V0UmVwZWF0ZWRGaWVsZENvdW50IiAvPg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBpbnQgR2V0UmVwZWF0ZWRGaWVsZENvdW50KElGaWVsZERlc2NyaXB0b3JMaXRlIGZpZWxkKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICghZmllbGQuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiR2V0UmVwZWF0ZWRGaWVsZENvdW50KCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHJlcGVhdGVkIGZpZWxkcy4iKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcmV0dXJuICgoSUxpc3Q8b2JqZWN0PikgdGhpc1tmaWVsZF0pLkNvdW50Ow0KKyAgICAgICAgfQ0KKw0KKyNpZiAhTElURQ0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNlZSA8c2VlIGNyZWY9IklCdWlsZGVye1RNZXNzYWdlLCBUQnVpbGRlcn0uTWVyZ2VGcm9tKElNZXNzYWdlTGl0ZSkiIC8+DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKElNZXNzYWdlIG90aGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxGaWVsZERlc2NyaXB0b3IsIG9iamVjdD4gZmQgaW4gb3RoZXIuQWxsRmllbGRzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgTWVyZ2VGaWVsZChmZC5LZXksIGZkLlZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorI2VuZGlmDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSW1wbGVtZW50YXRpb24gb2YgYm90aCA8Yz5NZXJnZUZyb208L2M+IG1ldGhvZHMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdGhlckZpZWxkcyI+PC9wYXJhbT4NCisgICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShGaWVsZFNldCBvdGhlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBOb3RlOiAgV2UgZG9uJ3QgYXR0ZW1wdCB0byB2ZXJpZnkgdGhhdCBvdGhlcidzIGZpZWxkcyBoYXZlIHZhbGlkDQorICAgICAgICAgICAgLy8gICB0eXBlcy4gIERvaW5nIHNvIHdvdWxkIGJlIGEgbG9zaW5nIGJhdHRsZS4gIFdlJ2QgaGF2ZSB0byB2ZXJpZnkNCisgICAgICAgICAgICAvLyAgIGFsbCBzdWItbWVzc2FnZXMgYXMgd2VsbCwgYW5kIHdlJ2QgaGF2ZSB0byBtYWtlIGNvcGllcyBvZiBhbGwgb2YNCisgICAgICAgICAgICAvLyAgIHRoZW0gdG8gaW5zdXJlIHRoYXQgdGhleSBkb24ndCBjaGFuZ2UgYWZ0ZXIgdmVyaWZpY2F0aW9uIChzaW5jZQ0KKyAgICAgICAgICAgIC8vICAgdGhlIElNZXNzYWdlTGl0ZSBpbnRlcmZhY2UgaXRzZWxmIGNhbm5vdCBlbmZvcmNlIGltbXV0YWJpbGl0eSBvZg0KKyAgICAgICAgICAgIC8vICAgaW1wbGVtZW50YXRpb25zKS4NCisgICAgICAgICAgICAvLyBUT0RPKGpvbnNrZWV0KTogIFByb3ZpZGUgYSBmdW5jdGlvbiBzb21ld2hlcmUgY2FsbGVkIE1ha2VEZWVwQ29weSgpDQorICAgICAgICAgICAgLy8gICB3aGljaCBhbGxvd3MgcGVvcGxlIHRvIG1ha2Ugc2VjdXJlIGRlZXAgY29waWVzIG9mIG1lc3NhZ2VzLg0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxJRmllbGREZXNjcmlwdG9yTGl0ZSwgb2JqZWN0PiBlbnRyeSBpbiBvdGhlci5maWVsZHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBNZXJnZUZpZWxkKGVudHJ5LktleSwgZW50cnkuVmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgdm9pZCBNZXJnZUZpZWxkKElGaWVsZERlc2NyaXB0b3JMaXRlIGZpZWxkLCBvYmplY3QgbWVyZ2VWYWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBvYmplY3QgZXhpc3RpbmdWYWx1ZTsNCisgICAgICAgICAgICBmaWVsZHMuVHJ5R2V0VmFsdWUoZmllbGQsIG91dCBleGlzdGluZ1ZhbHVlKTsNCisgICAgICAgICAgICBpZiAoZmllbGQuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1ZhbHVlID09IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVmFsdWUgPSBuZXcgTGlzdDxvYmplY3Q+KCk7DQorICAgICAgICAgICAgICAgICAgICBmaWVsZHNbZmllbGRdID0gZXhpc3RpbmdWYWx1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBJTGlzdDxvYmplY3Q+IGxpc3QgPSAoSUxpc3Q8b2JqZWN0PikgZXhpc3RpbmdWYWx1ZTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IG90aGVyVmFsdWUgaW4gKElFbnVtZXJhYmxlKSBtZXJnZVZhbHVlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZChvdGhlclZhbHVlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5NYXBwZWRUeXBlID09IE1hcHBlZFR5cGUuTWVzc2FnZSAmJiBleGlzdGluZ1ZhbHVlICE9IG51bGwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBJTWVzc2FnZUxpdGUgZXhpc3RpbmdNZXNzYWdlID0gKElNZXNzYWdlTGl0ZSkgZXhpc3RpbmdWYWx1ZTsNCisgICAgICAgICAgICAgICAgSU1lc3NhZ2VMaXRlIG1lcmdlZCA9IGV4aXN0aW5nTWVzc2FnZS5XZWFrVG9CdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgIC5XZWFrTWVyZ2VGcm9tKChJTWVzc2FnZUxpdGUpIG1lcmdlVmFsdWUpDQorICAgICAgICAgICAgICAgICAgICAuV2Vha0J1aWxkKCk7DQorICAgICAgICAgICAgICAgIHRoaXNbZmllbGRdID0gbWVyZ2VkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aGlzW2ZpZWxkXSA9IG1lcmdlVmFsdWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNlZSA8c2VlIGNyZWY9IklNZXNzYWdlTGl0ZS5Xcml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtKSIgLz4uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVUbyhJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxJRmllbGREZXNjcmlwdG9yTGl0ZSwgb2JqZWN0PiBlbnRyeSBpbiBmaWVsZHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBXcml0ZUZpZWxkKGVudHJ5LktleSwgZW50cnkuVmFsdWUsIG91dHB1dCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHNpbmdsZSBmaWVsZCB0byBhIENvZGVkT3V0cHV0U3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlRmllbGQoSUZpZWxkRGVzY3JpcHRvckxpdGUgZmllbGQsIE9iamVjdCB2YWx1ZSwgSUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZmllbGQuSXNFeHRlbnNpb24gJiYgZmllbGQuTWVzc2FnZVNldFdpcmVGb3JtYXQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpZWxkLkZpZWxkTnVtYmVyLCBmaWVsZC5OYW1lLCAoSU1lc3NhZ2VMaXRlKSB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Jc1JlcGVhdGVkKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZSB2YWx1ZUxpc3QgPSAoSUVudW1lcmFibGUpIHZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzUGFja2VkKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZEFycmF5KGZpZWxkLkZpZWxkVHlwZSwgZmllbGQuRmllbGROdW1iZXIsIGZpZWxkLk5hbWUsIHZhbHVlTGlzdCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlQXJyYXkoZmllbGQuRmllbGRUeXBlLCBmaWVsZC5GaWVsZE51bWJlciwgZmllbGQuTmFtZSwgdmFsdWVMaXN0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZUZpZWxkKGZpZWxkLkZpZWxkVHlwZSwgZmllbGQuRmllbGROdW1iZXIsIGZpZWxkLk5hbWUsIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZWUgPHNlZSBjcmVmPSJJTWVzc2FnZUxpdGUuU2VyaWFsaXplZFNpemUiIC8+LiBJdCdzIHVwIHRvIHRoZSBjYWxsZXIgdG8NCisgICAgICAgIC8vLyBjYWNoZSB0aGUgcmVzdWx0aW5nIHNpemUgaWYgZGVzaXJlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgaW50IFNlcmlhbGl6ZWRTaXplDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxJRmllbGREZXNjcmlwdG9yTGl0ZSwgb2JqZWN0PiBlbnRyeSBpbiBmaWVsZHMpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIElGaWVsZERlc2NyaXB0b3JMaXRlIGZpZWxkID0gZW50cnkuS2V5Ow0KKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHZhbHVlID0gZW50cnkuVmFsdWU7DQorDQorICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNFeHRlbnNpb24gJiYgZmllbGQuTWVzc2FnZVNldFdpcmVGb3JtYXQpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNldEV4dGVuc2lvblNpemUoZmllbGQuRmllbGROdW1iZXIsIChJTWVzc2FnZUxpdGUpIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlIHZhbHVlTGlzdCA9IChJRW51bWVyYWJsZSkgdmFsdWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Jc1BhY2tlZCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCBlbGVtZW50IGluIHZhbHVlTGlzdCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSArPSBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmllbGRTaXplTm9UYWcoZmllbGQuRmllbGRUeXBlLCBlbGVtZW50KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gZGF0YVNpemUgKyBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVGFnU2l6ZShmaWVsZC5GaWVsZE51bWJlcikgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlUmF3VmFyaW50MzJTaXplKCh1aW50KSBkYXRhU2l6ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgZWxlbWVudCBpbiB2YWx1ZUxpc3QpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmllbGRTaXplKGZpZWxkLkZpZWxkVHlwZSwgZmllbGQuRmllbGROdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZpZWxkU2l6ZShmaWVsZC5GaWVsZFR5cGUsIGZpZWxkLkZpZWxkTnVtYmVyLCB2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSB0byBiZSBhIHZhbGlkDQorICAgICAgICAvLy8gdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+DQorICAgICAgICAvLy8gRm9yIHJlcGVhdGVkIGZpZWxkcywgdGhpcyBjaGVja3MgaWYgdGhlIG9iamVjdCBpcyBvZiB0aGUgcmlnaHQNCisgICAgICAgIC8vLyBlbGVtZW50IHR5cGUsIG5vdCB3aGV0aGVyIGl0J3MgYSBsaXN0Lg0KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5UaGUgdmFsdWUgaXMgbm90IG9mIHRoZSByaWdodCB0eXBlLjwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIj5UaGUgdmFsdWUgaXMgbnVsbC48L2V4Y2VwdGlvbj4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVmVyaWZ5VHlwZShJRmllbGREZXNjcmlwdG9yTGl0ZSBmaWVsZCwgb2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBib29sIGlzVmFsaWQgPSBmYWxzZTsNCisgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLk1hcHBlZFR5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuSW50MzI6DQorICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaXMgaW50Ow0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5JbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSB2YWx1ZSBpcyBsb25nOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5VSW50MzI6DQorICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaXMgdWludDsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuVUludDY0Og0KKyAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHZhbHVlIGlzIHVsb25nOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5TaW5nbGU6DQorICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaXMgZmxvYXQ7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBNYXBwZWRUeXBlLkRvdWJsZToNCisgICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSB2YWx1ZSBpcyBkb3VibGU7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBNYXBwZWRUeXBlLkJvb2xlYW46DQorICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaXMgYm9vbDsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuU3RyaW5nOg0KKyAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHZhbHVlIGlzIHN0cmluZzsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuQnl0ZVN0cmluZzoNCisgICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSB2YWx1ZSBpcyBCeXRlU3RyaW5nOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5FbnVtOg0KKyAgICAgICAgICAgICAgICAgICAgSUVudW1MaXRlIGVudW1WYWx1ZSA9IHZhbHVlIGFzIElFbnVtTGl0ZTsNCisgICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBlbnVtVmFsdWUgIT0gbnVsbCAmJiBmaWVsZC5FbnVtVHlwZS5Jc1ZhbGlkVmFsdWUoZW51bVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuTWVzc2FnZToNCisgICAgICAgICAgICAgICAgICAgIElNZXNzYWdlTGl0ZSBtZXNzYWdlVmFsdWUgPSB2YWx1ZSBhcyBJTWVzc2FnZUxpdGU7DQorICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gbWVzc2FnZVZhbHVlICE9IG51bGw7DQorI2lmICFMSVRFDQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCAmJiBtZXNzYWdlVmFsdWUgaXMgSU1lc3NhZ2UgJiYgZmllbGQgaXMgRmllbGREZXNjcmlwdG9yKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSAoKElNZXNzYWdlKSBtZXNzYWdlVmFsdWUpLkRlc2NyaXB0b3JGb3JUeXBlID09ICgoRmllbGREZXNjcmlwdG9yKSBmaWVsZCkuTWVzc2FnZVR5cGU7DQorICAgICAgICAgICAgICAgICAgICB9DQorI2VuZGlmDQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gV2hlbiBjaGFpbmluZyBjYWxscyB0byBTZXRGaWVsZCgpLCBpdCBjYW4gYmUgaGFyZCB0byB0ZWxsIGZyb20NCisgICAgICAgICAgICAgICAgLy8gdGhlIHN0YWNrIHRyYWNlIHdoaWNoIGV4YWN0IGNhbGwgZmFpbGVkLCBzaW5jZSB0aGUgd2hvbGUgY2hhaW4gaXMNCisgICAgICAgICAgICAgICAgLy8gY29uc2lkZXJlZCBvbmUgbGluZSBvZiBjb2RlLiAgU28sIGxldCdzIG1ha2Ugc3VyZSB0byBpbmNsdWRlIHRoZQ0KKyAgICAgICAgICAgICAgICAvLyBmaWVsZCBuYW1lIGFuZCBvdGhlciB1c2VmdWwgaW5mbyBpbiB0aGUgZXhjZXB0aW9uLg0KKyAgICAgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZSA9ICJXcm9uZyBvYmplY3QgdHlwZSB1c2VkIHdpdGggcHJvdG9jb2wgbWVzc2FnZSByZWZsZWN0aW9uLiI7DQorI2lmICFMSVRFDQorICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZGluZm8gPQ0KKyAgICAgICAgICAgICAgICAgICAgZmllbGQgYXMgRmllbGREZXNjcmlwdG9yOw0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGRpbmZvICE9IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gIk1lc3NhZ2UgdHlwZSBcIiIgKyBmaWVsZGluZm8uQ29udGFpbmluZ1R5cGUuRnVsbE5hbWU7DQorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICJcIiwgZmllbGQgXCIiICsgKGZpZWxkaW5mby5Jc0V4dGVuc2lvbiA/IGZpZWxkaW5mby5GdWxsTmFtZSA6IGZpZWxkaW5mby5OYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gIlwiLCB2YWx1ZSB3YXMgdHlwZSBcIiIgKyB2YWx1ZS5HZXRUeXBlKCkuTmFtZSArICJcIi4iOw0KKyAgICAgICAgICAgICAgICB9DQorI2VuZGlmDQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihtZXNzYWdlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9GcmFtZXdvcmtQb3J0YWJpbGl0eS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2U4MTk4Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MKQEAgLTAsMCArMSwxMTEgQEAKK++7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247DQordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBDbGFzcyBjb250YWluaW5nIGhlbHBmdWwgd29ya2Fyb3VuZHMgZm9yIHZhcmlvdXMgcGxhdGZvcm0gY29tcGF0aWJpbGl0eQ0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRnJhbWV3b3JrUG9ydGFiaWxpdHkNCisgICAgew0KKyNpZiBDT01QQUNUX0ZSQU1FV09SSw0KKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE5ld0xpbmUgPSAiXG4iOw0KKyNlbHNlDQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nIE5ld0xpbmUgPSBTeXN0ZW0uRW52aXJvbm1lbnQuTmV3TGluZTsNCisjZW5kaWYNCisNCisjaWYgQ0xJRU5UUFJPRklMRQ0KKyAgICAgICAgaW50ZXJuYWwgY29uc3QgUmVnZXhPcHRpb25zIENvbXBpbGVkUmVnZXhXaGVyZUF2YWlsYWJsZSA9IFJlZ2V4T3B0aW9ucy5Db21waWxlZDsNCisjZWxzZQ0KKyAgICAgICAgaW50ZXJuYWwgY29uc3QgUmVnZXhPcHRpb25zIENvbXBpbGVkUmVnZXhXaGVyZUF2YWlsYWJsZSA9IFJlZ2V4T3B0aW9ucy5Ob25lOw0KKyNlbmRpZg0KKw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEN1bHR1cmVJbmZvIEludmFyaWFudEN1bHR1cmUgDQorICAgICAgICB7IA0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlOyB9IA0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGRvdWJsZSBJbnQ2NFRvRG91YmxlKGxvbmcgdmFsdWUpDQorICAgICAgICB7DQorI2lmIENMSUVOVFBST0ZJTEUNCisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKHZhbHVlKTsNCisjZWxzZQ0KKyAgICAgICAgICAgIGRvdWJsZVtdIGFycmVzdWx0ID0gbmV3IGRvdWJsZVsxXTsNCisgICAgICAgICAgICBCdWZmZXIuQmxvY2tDb3B5KG5ld1tdIHsgdmFsdWUgfSwgMCwgYXJyZXN1bHQsIDAsIDgpOw0KKyAgICAgICAgICAgIHJldHVybiBhcnJlc3VsdFswXTsNCisjZW5kaWYNCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHN0YXRpYyBsb25nIERvdWJsZVRvSW50NjQoZG91YmxlIHZhbHVlKQ0KKyAgICAgICAgew0KKyNpZiBDTElFTlRQUk9GSUxFDQorICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5Eb3VibGVUb0ludDY0Qml0cyh2YWx1ZSk7DQorI2Vsc2UNCisgICAgICAgICAgICBsb25nW10gYXJyZXN1bHQgPSBuZXcgbG9uZ1sxXTsNCisgICAgICAgICAgICBCdWZmZXIuQmxvY2tDb3B5KG5ld1tdIHsgdmFsdWUgfSwgMCwgYXJyZXN1bHQsIDAsIDgpOw0KKyAgICAgICAgICAgIHJldHVybiBhcnJlc3VsdFswXTsNCisjZW5kaWYNCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHN0YXRpYyBib29sIFRyeVBhcnNlSW50MzIoc3RyaW5nIHRleHQsIG91dCBpbnQgbnVtYmVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBUcnlQYXJzZUludDMyKHRleHQsIE51bWJlclN0eWxlcy5BbnksIEludmFyaWFudEN1bHR1cmUsIG91dCBudW1iZXIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJvb2wgVHJ5UGFyc2VJbnQzMihzdHJpbmcgdGV4dCwgTnVtYmVyU3R5bGVzIHN0eWxlLCBJRm9ybWF0UHJvdmlkZXIgZm9ybWF0LCBvdXQgaW50IG51bWJlcikNCisgICAgICAgIHsNCisjaWYgQ09NUEFDVF9GUkFNRVdPUksNCisgICAgICAgICAgICAgICAgdHJ5IA0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBudW1iZXIgPSBpbnQuUGFyc2UodGV4dCwgc3R5bGUsIGZvcm1hdCk7IA0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2F0Y2ggDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIG51bWJlciA9IDA7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IA0KKyAgICAgICAgICAgICAgICB9DQorI2Vsc2UNCisgICAgICAgICAgICByZXR1cm4gaW50LlRyeVBhcnNlKHRleHQsIHN0eWxlLCBmb3JtYXQsIG91dCBudW1iZXIpOw0KKyNlbmRpZg0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0dlbmVyYXRlZEJ1aWxkZXIuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9HZW5lcmF0ZWRCdWlsZGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNmZlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9HZW5lcmF0ZWRCdWlsZGVyLmNzCkBAIC0wLDAgKzEsMjE1IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRmllbGRBY2Nlc3M7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEFsbCBnZW5lcmF0ZWQgcHJvdG9jb2wgbWVzc2FnZSBidWlsZGVyIGNsYXNzZXMgZXh0ZW5kIHRoaXMgY2xhc3MuIEl0IGltcGxlbWVudHMNCisgICAgLy8vIG1vc3Qgb2YgdGhlIElCdWlsZGVyIGludGVyZmFjZSB1c2luZyByZWZsZWN0aW9uLiBVc2VycyBjYW4gaWdub3JlIHRoaXMgY2xhc3MNCisgICAgLy8vIGFzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIGFic3RyYWN0IHBhcnRpYWwgY2xhc3MgR2VuZXJhdGVkQnVpbGRlcjxUTWVzc2FnZSwgVEJ1aWxkZXI+IDogQWJzdHJhY3RCdWlsZGVyPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgIHdoZXJlIFRNZXNzYWdlIDogR2VuZXJhdGVkTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgICAgICB3aGVyZSBUQnVpbGRlciA6IEdlbmVyYXRlZEJ1aWxkZXI8VE1lc3NhZ2UsIFRCdWlsZGVyPiwgbmV3KCkNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIG1lc3NhZ2UgYmVpbmcgYnVpbHQgYXQgdGhlIG1vbWVudC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVE1lc3NhZ2UgTWVzc2FnZUJlaW5nQnVpbHQgeyBnZXQ7IH0NCisNCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBGaWVsZEFjY2Vzc29yVGFibGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZUZvclR5cGUuRmllbGRBY2Nlc3NvcnNGcm9tQnVpbGRlcjsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElEaWN0aW9uYXJ5PEZpZWxkRGVzY3JpcHRvciwgb2JqZWN0PiBBbGxGaWVsZHMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gTWVzc2FnZUJlaW5nQnVpbHQuQWxsRmllbGRzOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IHRoaXNbRmllbGREZXNjcmlwdG9yIGZpZWxkXQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gRm9yIHJlcGVhdGVkIGZpZWxkcywgdGhlIHVuZGVybHlpbmcgbGlzdCBvYmplY3QgaXMgc3RpbGwgbW9kaWZpYWJsZSBhdCB0aGlzIHBvaW50Lg0KKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGV4cG9zZSB0aGUgbW9kaWZpYWJsZSBsaXN0IHRvIHRoZSBjYWxsZXIuDQorICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZC5Jc1JlcGVhdGVkDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzW2ZpZWxkXS5HZXRSZXBlYXRlZFdyYXBwZXIoVGhpc0J1aWxkZXIpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNZXNzYWdlQmVpbmdCdWlsdFtmaWVsZF07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNldCB7IEludGVybmFsRmllbGRBY2Nlc3NvcnNbZmllbGRdLlNldFZhbHVlKFRoaXNCdWlsZGVyLCB2YWx1ZSk7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDYWxsZWQgYnkgZGVyaXZlZCBjbGFzc2VzIHRvIHBhcnNlIGFuIHVua25vd24gZmllbGQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgdW5sZXNzIHRoZSB0YWcgaXMgYW4gZW5kLWdyb3VwIHRhZzwvcmV0dXJucz4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgYm9vbCBQYXJzZVVua25vd25GaWVsZChJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnksIHVpbnQgdGFnLCBzdHJpbmcgZmllbGROYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiB1bmtub3duRmllbGRzLk1lcmdlRmllbGRGcm9tKHRhZywgaW5wdXQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIE1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZUZvclR5cGUuRGVzY3JpcHRvckZvclR5cGU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0UmVwZWF0ZWRGaWVsZENvdW50KEZpZWxkRGVzY3JpcHRvciBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gTWVzc2FnZUJlaW5nQnVpbHQuR2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgdGhpc1tGaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBpbmRleF0NCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gTWVzc2FnZUJlaW5nQnVpbHRbZmllbGQsIGluZGV4XTsgfQ0KKyAgICAgICAgICAgIHNldCB7IEludGVybmFsRmllbGRBY2Nlc3NvcnNbZmllbGRdLlNldFJlcGVhdGVkKFRoaXNCdWlsZGVyLCBpbmRleCwgdmFsdWUpOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBIYXNGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VCZWluZ0J1aWx0Lkhhc0ZpZWxkKGZpZWxkKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzW2ZpZWxkXS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVEJ1aWxkZXIgQ2xlYXJGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpDQorICAgICAgICB7DQorICAgICAgICAgICAgSW50ZXJuYWxGaWVsZEFjY2Vzc29yc1tmaWVsZF0uQ2xlYXIoVGhpc0J1aWxkZXIpOw0KKyAgICAgICAgICAgIHJldHVybiBUaGlzQnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUQnVpbGRlciBNZXJnZUZyb20oVE1lc3NhZ2Ugb3RoZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKG90aGVyLkRlc2NyaXB0b3JGb3JUeXBlICE9IEludGVybmFsRmllbGRBY2Nlc3NvcnMuRGVzY3JpcHRvcikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiTWVzc2FnZSB0eXBlIG1pc21hdGNoIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxGaWVsZERlc2NyaXB0b3IsIG9iamVjdD4gZW50cnkgaW4gb3RoZXIuQWxsRmllbGRzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZW50cnkuS2V5Ow0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gQ29uY2F0ZW5hdGUgcmVwZWF0ZWQgZmllbGRzDQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgZWxlbWVudCBpbiAoSUVudW1lcmFibGUpIGVudHJ5LlZhbHVlKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZFJlcGVhdGVkRmllbGQoZmllbGQsIGVsZW1lbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkLk1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5NZXNzYWdlICYmIEhhc0ZpZWxkKGZpZWxkKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gTWVyZ2Ugc2luZ3VsYXIgZW1iZWRkZWQgbWVzc2FnZXMNCisgICAgICAgICAgICAgICAgICAgIElNZXNzYWdlTGl0ZSBvbGRWYWx1ZSA9IChJTWVzc2FnZUxpdGUpIHRoaXNbZmllbGRdOw0KKyAgICAgICAgICAgICAgICAgICAgdGhpc1tmaWVsZF0gPSBvbGRWYWx1ZS5XZWFrQ3JlYXRlQnVpbGRlckZvclR5cGUoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5XZWFrTWVyZ2VGcm9tKG9sZFZhbHVlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5XZWFrTWVyZ2VGcm9tKChJTWVzc2FnZUxpdGUpIGVudHJ5LlZhbHVlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5XZWFrQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IG92ZXJ3cml0ZQ0KKyAgICAgICAgICAgICAgICAgICAgdGhpc1tmaWVsZF0gPSBlbnRyeS5WYWx1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvL0ZpeCBmb3IgdW5rbm93biBmaWVsZHMgbm90IG1lcmdpbmcsIHNlZSBqYXZhJ3MgQWJzdHJhY3RNZXNzYWdlLkJ1aWxkZXI8VD4gbGluZSAyMzYNCisgICAgICAgICAgICBNZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorDQorICAgICAgICAgICAgcmV0dXJuIFRoaXNCdWlsZGVyOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRCdWlsZGVyIE1lcmdlVW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcykNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBVbmtub3duRmllbGRTZXQuRGVmYXVsdEluc3RhbmNlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVE1lc3NhZ2UgcmVzdWx0ID0gTWVzc2FnZUJlaW5nQnVpbHQ7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5TZXRVbmtub3duRmllbGRzKFVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHJlc3VsdC5Vbmtub3duRmllbGRzKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk1lcmdlRnJvbSh1bmtub3duRmllbGRzKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gVGhpc0J1aWxkZXI7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVEJ1aWxkZXIgQWRkUmVwZWF0ZWRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzW2ZpZWxkXS5BZGRSZXBlYXRlZChUaGlzQnVpbGRlciwgdmFsdWUpOw0KKyAgICAgICAgICAgIHJldHVybiBUaGlzQnVpbGRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBMaWtlIEJ1aWxkKCksIGJ1dCB3aWxsIHdyYXAgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24gaW4NCisgICAgICAgIC8vLyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIFRNZXNzYWdlIEJ1aWxkUGFyc2VkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoIUlzSW5pdGlhbGl6ZWQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24oTWVzc2FnZUJlaW5nQnVpbHQpLkFzSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBCdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiA8c2VlIGNyZWY9IklCdWlsZGVye1RNZXNzYWdlLCBUQnVpbGRlcn0uQnVpbGQiIC8+Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWVzc2FnZSBCdWlsZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgbnVsbCwgd2UnbGwgdGhyb3cgYSBtb3JlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBpbiBCdWlsZFBhcnRpYWwuDQorICAgICAgICAgICAgaWYgKCFJc0luaXRpYWxpemVkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKE1lc3NhZ2VCZWluZ0J1aWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIEJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFVua25vd25GaWVsZFNldCBVbmtub3duRmllbGRzDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIE1lc3NhZ2VCZWluZ0J1aWx0LlVua25vd25GaWVsZHM7IH0NCisgICAgICAgICAgICBzZXQgeyBNZXNzYWdlQmVpbmdCdWlsdC5TZXRVbmtub3duRmllbGRzKHZhbHVlKTsgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0dlbmVyYXRlZEJ1aWxkZXJMaXRlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvR2VuZXJhdGVkQnVpbGRlckxpdGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzMGU4MAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0dlbmVyYXRlZEJ1aWxkZXJMaXRlLmNzCkBAIC0wLDAgKzEsMTAxIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBBbGwgZ2VuZXJhdGVkIHByb3RvY29sIG1lc3NhZ2UgYnVpbGRlciBjbGFzc2VzIGV4dGVuZCB0aGlzIGNsYXNzLiBJdCBpbXBsZW1lbnRzDQorICAgIC8vLyBtb3N0IG9mIHRoZSBJQnVpbGRlciBpbnRlcmZhY2UgdXNpbmcgcmVmbGVjdGlvbi4gVXNlcnMgY2FuIGlnbm9yZSB0aGlzIGNsYXNzDQorICAgIC8vLyBhcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBhYnN0cmFjdCBwYXJ0aWFsIGNsYXNzIEdlbmVyYXRlZEJ1aWxkZXJMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gOiBBYnN0cmFjdEJ1aWxkZXJMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgIHdoZXJlIFRNZXNzYWdlIDogR2VuZXJhdGVkTWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVEJ1aWxkZXIgOiBHZW5lcmF0ZWRCdWlsZGVyTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBtZXNzYWdlIGJlaW5nIGJ1aWx0IGF0IHRoZSBtb21lbnQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFRNZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsgZ2V0OyB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVEJ1aWxkZXIgTWVyZ2VGcm9tKElNZXNzYWdlTGl0ZSBvdGhlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICAvL2RvIG5vdGhpbmcsIExpdGUgcnVudGltZSBkb2VzIG5vdCBzdXBwb3J0IGNyb3NzLW1lc3NhZ2UgbWVyZ2VzDQorICAgICAgICAgICAgcmV0dXJuIFRoaXNCdWlsZGVyOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRCdWlsZGVyIE1lcmdlRnJvbShUTWVzc2FnZSBvdGhlcik7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2FsbGVkIGJ5IGRlcml2ZWQgY2xhc3NlcyB0byBwYXJzZSBhbiB1bmtub3duIGZpZWxkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cmV0dXJucz50cnVlIHVubGVzcyB0aGUgdGFnIGlzIGFuIGVuZC1ncm91cCB0YWc8L3JldHVybnM+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGJvb2wgUGFyc2VVbmtub3duRmllbGQoSUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5LCB1aW50IHRhZywgc3RyaW5nIGZpZWxkTmFtZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gaW5wdXQuU2tpcEZpZWxkKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTGlrZSBCdWlsZCgpLCBidXQgd2lsbCB3cmFwIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIGluDQorICAgICAgICAvLy8gSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBUTWVzc2FnZSBCdWlsZFBhcnNlZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCFJc0luaXRpYWxpemVkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKE1lc3NhZ2VCZWluZ0J1aWx0KS5Bc0ludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSW1wbGVtZW50YXRpb24gb2YgPHNlZSBjcmVmPSJJQnVpbGRlcntUTWVzc2FnZSwgVEJ1aWxkZXJ9LkJ1aWxkIiAvPi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgQnVpbGQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIG51bGwsIHdlJ2xsIHRocm93IGEgbW9yZSBhcHByb3ByaWF0ZSBleGNlcHRpb24gaW4gQnVpbGRQYXJ0aWFsLg0KKyAgICAgICAgICAgIGlmICghSXNJbml0aWFsaXplZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbihNZXNzYWdlQmVpbmdCdWlsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBCdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9HZW5lcmF0ZWRFeHRlbnNpb25CYXNlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvR2VuZXJhdGVkRXh0ZW5zaW9uQmFzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjRiOTgxCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvR2VuZXJhdGVkRXh0ZW5zaW9uQmFzZS5jcwpAQCAtMCwwICsxLDE4NSBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gQmFzZSB0eXBlIGZvciBhbGwgZ2VuZXJhdGVkIGV4dGVuc2lvbnMuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIC8vLyA8cmVtYXJrcz4NCisgICAgLy8vIFRoZSBwcm90b2NvbCBjb21waWxlciBnZW5lcmF0ZXMgYSBzdGF0aWMgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMNCisgICAgLy8vIGNsYXNzIGZvciBlYWNoIGV4dGVuc2lvbi4gRm9yIGV4bWFwbGUsIGltYWdpbmUgYSAucHJvdG8gZmlsZSB3aXRoOg0KKyAgICAvLy8gPGNvZGU+DQorICAgIC8vLyBtZXNzYWdlIEZvbyB7DQorICAgIC8vLyAgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXgNCisgICAgLy8vIH0NCisgICAgLy8vIA0KKyAgICAvLy8gZXh0ZW5kIEZvbyB7DQorICAgIC8vLyAgIG9wdGlvbmFsIGludDMyIGJhcjsNCisgICAgLy8vIH0NCisgICAgLy8vIDwvY29kZT4NCisgICAgLy8vIFRoZW4gTXlQcm90by5Gb28uQmFyIGhhcyB0eXBlIEdlbmVyYXRlZEV4dGVuc2lvbkJhc2UmbHQ7TXlQcm90by5Gb28saW50Jmd0Oy4NCisgICAgLy8vIDxwYXJhIC8+DQorICAgIC8vLyBJbiBnZW5lcmFsLCB1c2VycyBzaG91bGQgaWdub3JlIHRoZSBkZXRhaWxzIG9mIHRoaXMgdHlwZSwgYW5kDQorICAgIC8vLyBzaW1wbHkgdXNlIHRoZSBzdGF0aWMgc2luZ2xldG9ucyBhcyBwYXJhbWV0ZXJzIHRvIHRoZSBleHRlbnNpb24gYWNjZXNzb3JzDQorICAgIC8vLyBpbiBFeHRlbmRhYmxlTWVzc2FnZSBhbmQgRXh0ZW5kYWJsZUJ1aWxkZXIuDQorICAgIC8vLyBUaGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGJvdGggR2VuZXJhdGVkRXhjZXB0aW9uIGFuZCBHZW5lcmF0ZWRSZXBlYXRFeGNlcHRpb24sDQorICAgIC8vLyB0byBtYWtlIGl0IGVhc2llciB0byBjb3BlIHdpdGggcmVwZWF0cyBzZXBhcmF0ZWx5Lg0KKyAgICAvLy8gPC9yZW1hcmtzPg0KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxURXh0ZW5zaW9uPg0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJTWVzc2FnZUxpdGUgbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsNCisNCisgICAgICAgIHByb3RlY3RlZCBHZW5lcmF0ZWRFeHRlbnNpb25CYXNlKEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBUeXBlIHNpbmd1bGFyRXh0ZW5zaW9uVHlwZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IuSXNFeHRlbnNpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkdlbmVyYXRlZEV4dGVuc2lvbiBnaXZlbiBhIHJlZ3VsYXIgKG5vbi1leHRlbnNpb24pIGZpZWxkLiIpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOw0KKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLk1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5NZXNzYWdlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvIGRlZmF1bHRJbnN0YW5jZVByb3BlcnR5ID0gc2luZ3VsYXJFeHRlbnNpb25UeXBlDQorICAgICAgICAgICAgICAgICAgICAuR2V0UHJvcGVydHkoIkRlZmF1bHRJbnN0YW5jZSIsIEJpbmRpbmdGbGFncy5TdGF0aWMgfCBCaW5kaW5nRmxhZ3MuUHVibGljKTsNCisgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRJbnN0YW5jZVByb3BlcnR5ID09IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiTm8gcHVibGljIHN0YXRpYyBEZWZhdWx0SW5zdGFuY2UgcHJvcGVydHkgZm9yIHR5cGUgIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mKFRFeHRlbnNpb24pLk5hbWUpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UgPSAoSU1lc3NhZ2VMaXRlKSBkZWZhdWx0SW5zdGFuY2VQcm9wZXJ0eS5HZXRWYWx1ZShudWxsLCBudWxsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yIERlc2NyaXB0b3INCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGludCBOdW1iZXINCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvci5GaWVsZE51bWJlcjsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIGRlZmF1bHQgbWVzc2FnZSBpbnN0YW5jZSBmb3IgZXh0ZW5zaW9ucyB3aGljaCBhcmUgbWVzc2FnZSB0eXBlcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgSU1lc3NhZ2VMaXRlIE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG9iamVjdCBTaW5ndWxhckZyb21SZWZsZWN0aW9uVHlwZShvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3dpdGNoIChEZXNjcmlwdG9yLk1hcHBlZFR5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuTWVzc2FnZToNCisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpcyBURXh0ZW5zaW9uKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBzZWVtcyB0aGUgY29weSBvZiB0aGUgZW1iZWRkZWQgbWVzc2FnZSBzdG9yZWQgaW5zaWRlIHRoZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dGVuZGVkIG1lc3NhZ2UgaXMgbm90IG9mIHRoZSBleGFjdCB0eXBlIHRoZSB1c2VyIHdhcw0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGluZy4gIFRoaXMgY2FuIGhhcHBlbiBpZiBhIHVzZXIgZGVmaW5lcyBhDQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGVkRXh0ZW5zaW9uIG1hbnVhbGx5IGFuZCBnaXZlcyBpdCBhIGRpZmZlcmVudCB0eXBlLg0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaW4gbm9ybWFsIHVzZS4gIEJ1dCwgdG8gYmUgbmljZSwgd2UnbGwNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IHRoZSBtZXNzYWdlIHRvIHdoYXRldmVyIHR5cGUgdGhlIGNhbGxlciB3YXMgZXhwZWN0aW5nLg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNZXNzYWdlRGVmYXVsdEluc3RhbmNlLldlYWtDcmVhdGVCdWlsZGVyRm9yVHlwZSgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XZWFrTWVyZ2VGcm9tKChJTWVzc2FnZUxpdGUpIHZhbHVlKS5XZWFrQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSBNYXBwZWRUeXBlLkVudW06DQorICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHJldHVybiBhIGJveGVkIGludCAtIHRoYXQgY2FuIGJlIHVuYm94ZWQgdG8gdGhlIGVudW0NCisgICAgICAgICAgICAgICAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3IgZW51bVZhbHVlID0gKEVudW1WYWx1ZURlc2NyaXB0b3IpIHZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudW1WYWx1ZS5OdW1iZXI7DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnZlcnRzIGZyb20gdGhlIHR5cGUgdXNlZCBieSB0aGUgbmF0aXZlIGFjY2Vzc29ycyB0byB0aGUgdHlwZQ0KKyAgICAgICAgLy8vIHVzZWQgYnkgcmVmbGVjdGlvbiBhY2Nlc3NvcnMuIEZvciBleGFtcGxlLCB0aGUgcmVmbGVjdGlvbiBhY2Nlc3NvcnMNCisgICAgICAgIC8vLyBmb3IgZW51bXMgdXNlIEVudW1WYWx1ZURlc2NyaXB0b3JzIGJ1dCB0aGUgbmF0aXZlIGFjY2Vzc29ycyB1c2UNCisgICAgICAgIC8vLyB0aGUgZ2VuZXJhdGVkIGVudW0gdHlwZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb2JqZWN0IFRvUmVmbGVjdGlvblR5cGUob2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLklzUmVwZWF0ZWQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5NYXBwZWRUeXBlID09IE1hcHBlZFR5cGUuRW51bSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gTXVzdCBjb252ZXJ0IHRoZSB3aG9sZSBsaXN0Lg0KKyAgICAgICAgICAgICAgICAgICAgSUxpc3Q8b2JqZWN0PiByZXN1bHQgPSBuZXcgTGlzdDxvYmplY3Q+KCk7DQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgZWxlbWVudCBpbiAoSUVudW1lcmFibGUpIHZhbHVlKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5BZGQoU2luZ3VsYXJUb1JlZmxlY3Rpb25UeXBlKGVsZW1lbnQpKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZSh2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIExpa2UgVG9SZWZsZWN0aW9uVHlwZShvYmplY3QpIGJ1dCBmb3IgYSBzaW5nbGUgZWxlbWVudC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnRlcm5hbCBPYmplY3QgU2luZ3VsYXJUb1JlZmxlY3Rpb25UeXBlKG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5NYXBwZWRUeXBlID09IE1hcHBlZFR5cGUuRW51bQ0KKyAgICAgICAgICAgICAgICAgICAgICAgPyBkZXNjcmlwdG9yLkVudW1UeXBlLkZpbmRWYWx1ZUJ5TnVtYmVyKChpbnQpIHZhbHVlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBvYmplY3QgRnJvbVJlZmxlY3Rpb25UeXBlKG9iamVjdCB2YWx1ZSk7DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0dlbmVyYXRlZEV4dGVuc2lvbkxpdGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2MjMzNAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0dlbmVyYXRlZEV4dGVuc2lvbkxpdGUuY3MKQEAgLTAsMCArMSwzNTQgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgcHVibGljIGludGVyZmFjZSBJR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZQ0KKyAgICB7DQorICAgICAgICBpbnQgTnVtYmVyIHsgZ2V0OyB9DQorICAgICAgICBvYmplY3QgQ29udGFpbmluZ1R5cGUgeyBnZXQ7IH0NCisgICAgICAgIElNZXNzYWdlTGl0ZSBNZXNzYWdlRGVmYXVsdEluc3RhbmNlIHsgZ2V0OyB9DQorICAgICAgICBJRmllbGREZXNjcmlwdG9yTGl0ZSBEZXNjcmlwdG9yIHsgZ2V0OyB9DQorICAgIH0NCisNCisgICAgcHVibGljIGNsYXNzIEV4dGVuc2lvbkRlc2NyaXB0b3JMaXRlIDogSUZpZWxkRGVzY3JpcHRvckxpdGUNCisgICAgew0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgZnVsbE5hbWU7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElFbnVtTGl0ZU1hcCBlbnVtVHlwZU1hcDsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IG51bWJlcjsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRmllbGRUeXBlIHR5cGU7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgaXNSZXBlYXRlZDsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBpc1BhY2tlZDsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWFwcGVkVHlwZSBtYXBUeXBlOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgZGVmYXVsdFZhbHVlOw0KKw0KKyAgICAgICAgcHVibGljIEV4dGVuc2lvbkRlc2NyaXB0b3JMaXRlKHN0cmluZyBmdWxsTmFtZSwgSUVudW1MaXRlTWFwIGVudW1UeXBlTWFwLCBpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgZGVmYXVsdFZhbHVlLCBib29sIGlzUmVwZWF0ZWQsIGJvb2wgaXNQYWNrZWQpDQorICAgICAgICB7DQorICAgICAgICAgICAgdGhpcy5mdWxsTmFtZSA9IGZ1bGxOYW1lOw0KKyAgICAgICAgICAgIHRoaXMuZW51bVR5cGVNYXAgPSBlbnVtVHlwZU1hcDsNCisgICAgICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsNCisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOw0KKyAgICAgICAgICAgIHRoaXMubWFwVHlwZSA9IEZpZWxkTWFwcGluZ0F0dHJpYnV0ZS5NYXBwZWRUeXBlRnJvbUZpZWxkVHlwZSh0eXBlKTsNCisgICAgICAgICAgICB0aGlzLmlzUmVwZWF0ZWQgPSBpc1JlcGVhdGVkOw0KKyAgICAgICAgICAgIHRoaXMuaXNQYWNrZWQgPSBpc1BhY2tlZDsNCisgICAgICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSBmdWxsTmFtZTsNCisgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IG5hbWUuTGFzdEluZGV4T2YoJy4nKTsNCisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSAwKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5TdWJzdHJpbmcob2Zmc2V0KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RyaW5nIEZ1bGxOYW1lDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZ1bGxOYW1lOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBJc1JlcGVhdGVkDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGlzUmVwZWF0ZWQ7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBib29sIElzUmVxdWlyZWQNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBib29sIElzUGFja2VkDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGlzUGFja2VkOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBJc0V4dGVuc2lvbg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0cnVlOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBhc3NlcnRpb25zIGFyZSBtYWRlIHRvIGVuc3VyZSB0aGlzIGRvZXMgbm90IGV4aXN0IG9uIGV4dGVuc2lvbnMgb2YgTGl0ZSB0eXBlcw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBib29sIE1lc3NhZ2VTZXRXaXJlRm9ybWF0DQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgaW50IEZpZWxkTnVtYmVyDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG51bWJlcjsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIElFbnVtTGl0ZU1hcCBFbnVtVHlwZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBlbnVtVHlwZU1hcDsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIEZpZWxkVHlwZSBGaWVsZFR5cGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHlwZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIE1hcHBlZFR5cGUgTWFwcGVkVHlwZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBtYXBUeXBlOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb2JqZWN0IERlZmF1bHRWYWx1ZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0VmFsdWU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBpbnQgQ29tcGFyZVRvKElGaWVsZERlc2NyaXB0b3JMaXRlIG90aGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBGaWVsZE51bWJlci5Db21wYXJlVG8ob3RoZXIuRmllbGROdW1iZXIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBjbGFzcyBHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPFRDb250YWluaW5nVHlwZSwgVEV4dGVuc2lvblR5cGU+IDoNCisgICAgICAgIEdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8VENvbnRhaW5pbmdUeXBlLCBJTGlzdDxURXh0ZW5zaW9uVHlwZT4+DQorICAgICAgICB3aGVyZSBUQ29udGFpbmluZ1R5cGUgOiBJTWVzc2FnZUxpdGUNCisgICAgew0KKyAgICAgICAgcHVibGljIEdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGUoc3RyaW5nIGZ1bGxOYW1lLCBUQ29udGFpbmluZ1R5cGUgY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTWVzc2FnZUxpdGUgbWVzc2FnZURlZmF1bHRJbnN0YW5jZSwgSUVudW1MaXRlTWFwIGVudW1UeXBlTWFwLCBpbnQgbnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRUeXBlIHR5cGUsIGJvb2wgaXNQYWNrZWQpIDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxOYW1lLCBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSwgbmV3IExpc3Q8VEV4dGVuc2lvblR5cGU+KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZURlZmF1bHRJbnN0YW5jZSwgZW51bVR5cGVNYXAsIG51bWJlciwgdHlwZSwgaXNQYWNrZWQpDQorICAgICAgICB7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFRvUmVmbGVjdGlvblR5cGUob2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIElMaXN0PG9iamVjdD4gcmVzdWx0ID0gbmV3IExpc3Q8b2JqZWN0PigpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCBlbGVtZW50IGluIChJRW51bWVyYWJsZSkgdmFsdWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXN1bHQuQWRkKFNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZShlbGVtZW50KSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IEZyb21SZWZsZWN0aW9uVHlwZShvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gTXVzdCBjb252ZXJ0IHRoZSB3aG9sZSBsaXN0Lg0KKyAgICAgICAgICAgIExpc3Q8VEV4dGVuc2lvblR5cGU+IHJlc3VsdCA9IG5ldyBMaXN0PFRFeHRlbnNpb25UeXBlPigpOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCBlbGVtZW50IGluIChJRW51bWVyYWJsZSkgdmFsdWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXN1bHQuQWRkKChURXh0ZW5zaW9uVHlwZSkgU2luZ3VsYXJGcm9tUmVmbGVjdGlvblR5cGUoZWxlbWVudCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBjbGFzcyBHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPFRDb250YWluaW5nVHlwZSwgVEV4dGVuc2lvblR5cGU+IDogSUdlbmVyYXRlZEV4dGVuc2lvbkxpdGUNCisgICAgICAgIHdoZXJlIFRDb250YWluaW5nVHlwZSA6IElNZXNzYWdlTGl0ZQ0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRDb250YWluaW5nVHlwZSBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVEV4dGVuc2lvblR5cGUgZGVmYXVsdFZhbHVlOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJTWVzc2FnZUxpdGUgbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRXh0ZW5zaW9uRGVzY3JpcHRvckxpdGUgZGVzY3JpcHRvcjsNCisNCisgICAgICAgIC8vIFdlIGNhbid0IGFsd2F5cyBpbml0aWFsaXplIGEgR2VuZXJhdGVkRXh0ZW5zaW9uIHdoZW4gd2UgZmlyc3QgY29uc3RydWN0DQorICAgICAgICAvLyBpdCBkdWUgdG8gaW5pdGlhbGl6YXRpb24gb3JkZXIgZGlmZmljdWx0aWVzIChuYW1lbHksIHRoZSBkZWZhdWx0DQorICAgICAgICAvLyBpbnN0YW5jZXMgbWF5IG5vdCBoYXZlIGJlZW4gY29uc3RydWN0ZWQgeWV0KS4gIFNvLCB3ZSBjb25zdHJ1Y3QgYW4NCisgICAgICAgIC8vIHVuaW5pdGlhbGl6ZWQgR2VuZXJhdGVkRXh0ZW5zaW9uIG9uY2UsIHRoZW4gY2FsbCBpbnRlcm5hbEluaXQoKSBvbiBpdA0KKyAgICAgICAgLy8gbGF0ZXIuICBHZW5lcmF0ZWQgY29kZSB3aWxsIGFsd2F5cyBjYWxsIGludGVybmFsSW5pdCgpIG9uIGFsbCBleHRlbnNpb25zDQorICAgICAgICAvLyBhcyBwYXJ0IG9mIHRoZSBzdGF0aWMgaW5pdGlhbGl6YXRpb24gY29kZSwgYW5kIGludGVybmFsSW5pdCgpIHRocm93cyBhbg0KKyAgICAgICAgLy8gZXhjZXB0aW9uIGlmIGNhbGxlZCBtb3JlIHRoYW4gb25jZSwgc28gdGhpcyBtZXRob2QgaXMgdXNlbGVzcyB0byB1c2Vycy4NCisgICAgICAgIHByb3RlY3RlZCBHZW5lcmF0ZWRFeHRlbnNpb25MaXRlKA0KKyAgICAgICAgICAgIFRDb250YWluaW5nVHlwZSBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgICBURXh0ZW5zaW9uVHlwZSBkZWZhdWx0VmFsdWUsDQorICAgICAgICAgICAgSU1lc3NhZ2VMaXRlIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgICAgRXh0ZW5zaW9uRGVzY3JpcHRvckxpdGUgZGVzY3JpcHRvcikNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aGlzLmNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlID0gY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgdGhpcy5tZXNzYWdlRGVmYXVsdEluc3RhbmNlID0gbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsNCisgICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLyoqIEZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4gKi8NCisNCisgICAgICAgIHB1YmxpYyBHZW5lcmF0ZWRFeHRlbnNpb25MaXRlKA0KKyAgICAgICAgICAgIHN0cmluZyBmdWxsTmFtZSwNCisgICAgICAgICAgICBUQ29udGFpbmluZ1R5cGUgY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgICAgVEV4dGVuc2lvblR5cGUgZGVmYXVsdFZhbHVlLA0KKyAgICAgICAgICAgIElNZXNzYWdlTGl0ZSBtZXNzYWdlRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICAgIElFbnVtTGl0ZU1hcCBlbnVtVHlwZU1hcCwNCisgICAgICAgICAgICBpbnQgbnVtYmVyLA0KKyAgICAgICAgICAgIEZpZWxkVHlwZSB0eXBlKQ0KKyAgICAgICAgICAgIDogdGhpcyhjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSwgZGVmYXVsdFZhbHVlLCBtZXNzYWdlRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICAgICAgICAgICBuZXcgRXh0ZW5zaW9uRGVzY3JpcHRvckxpdGUoZnVsbE5hbWUsIGVudW1UeXBlTWFwLCBudW1iZXIsIHR5cGUsIGRlZmF1bHRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGlzUmVwZWF0ZWQgKi8sIGZhbHNlIC8qIGlzUGFja2VkICovKSkNCisgICAgICAgIHsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElMaXN0PG9iamVjdD4gRW1wdHkgPSBuZXcgb2JqZWN0WzBdOw0KKyAgICAgICAgLyoqIFJlcGVhdGluZyBmaWVsZHM6IEZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4gKi8NCisNCisgICAgICAgIHByb3RlY3RlZCBHZW5lcmF0ZWRFeHRlbnNpb25MaXRlKA0KKyAgICAgICAgICAgIHN0cmluZyBmdWxsTmFtZSwNCisgICAgICAgICAgICBUQ29udGFpbmluZ1R5cGUgY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgICAgVEV4dGVuc2lvblR5cGUgZGVmYXVsdFZhbHVlLA0KKyAgICAgICAgICAgIElNZXNzYWdlTGl0ZSBtZXNzYWdlRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICAgIElFbnVtTGl0ZU1hcCBlbnVtVHlwZU1hcCwNCisgICAgICAgICAgICBpbnQgbnVtYmVyLA0KKyAgICAgICAgICAgIEZpZWxkVHlwZSB0eXBlLA0KKyAgICAgICAgICAgIGJvb2wgaXNQYWNrZWQpDQorICAgICAgICAgICAgOiB0aGlzKGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlLCBkZWZhdWx0VmFsdWUsIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgICAgICAgICAgIG5ldyBFeHRlbnNpb25EZXNjcmlwdG9yTGl0ZShmdWxsTmFtZSwgZW51bVR5cGVNYXAsIG51bWJlciwgdHlwZSwgRW1wdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGlzUmVwZWF0ZWQgKi8sIGlzUGFja2VkKSkNCisgICAgICAgIHsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXh0ZW5zaW9uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIElGaWVsZERlc2NyaXB0b3JMaXRlIERlc2NyaXB0b3INCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZXh0ZW5zaW9uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIFRFeHRlbnNpb25UeXBlIERlZmF1bHRWYWx1ZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0VmFsdWU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyB1c2VkIGZvciB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgb2JqZWN0IElHZW5lcmF0ZWRFeHRlbnNpb25MaXRlLkNvbnRhaW5pbmdUeXBlDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIENvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvKioNCisgICAgICogRGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgdHlwZSBiZWluZyBleHRlbmRlZCwgdXNlZCB0byBpZGVudGlmeSB0aGF0IHR5cGUuDQorICAgICAqLw0KKw0KKyAgICAgICAgcHVibGljIFRDb250YWluaW5nVHlwZSBDb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLyoqIEdldCB0aGUgZmllbGQgbnVtYmVyLiAqLw0KKw0KKyAgICAgICAgcHVibGljIGludCBOdW1iZXINCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvci5GaWVsZE51bWJlcjsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLyoqDQorICAgICAqIElmIHRoZSBleHRlbnNpb24gaXMgYW4gZW1iZWRkZWQgbWVzc2FnZSwgdGhpcyBpcyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZg0KKyAgICAgKiB0aGF0IHR5cGUuDQorICAgICAqLw0KKw0KKyAgICAgICAgcHVibGljIElNZXNzYWdlTGl0ZSBNZXNzYWdlRGVmYXVsdEluc3RhbmNlDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb252ZXJ0cyBmcm9tIHRoZSB0eXBlIHVzZWQgYnkgdGhlIG5hdGl2ZSBhY2Nlc3NvcnMgdG8gdGhlIHR5cGUNCisgICAgICAgIC8vLyB1c2VkIGJ5IHJlZmxlY3Rpb24gYWNjZXNzb3JzLiBGb3IgZXhhbXBsZSwgdGhlIHJlZmxlY3Rpb24gYWNjZXNzb3JzDQorICAgICAgICAvLy8gZm9yIGVudW1zIHVzZSBFbnVtVmFsdWVEZXNjcmlwdG9ycyBidXQgdGhlIG5hdGl2ZSBhY2Nlc3NvcnMgdXNlDQorICAgICAgICAvLy8gdGhlIGdlbmVyYXRlZCBlbnVtIHR5cGUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IFRvUmVmbGVjdGlvblR5cGUob2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBTaW5ndWxhclRvUmVmbGVjdGlvblR5cGUodmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIExpa2UgVG9SZWZsZWN0aW9uVHlwZShvYmplY3QpIGJ1dCBmb3IgYSBzaW5nbGUgZWxlbWVudC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb2JqZWN0IFNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZShvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuTWFwcGVkVHlwZSA9PSBNYXBwZWRUeXBlLkVudW0NCisgICAgICAgICAgICAgICAgICAgICAgID8gZGVzY3JpcHRvci5FbnVtVHlwZS5GaW5kVmFsdWVCeU51bWJlcigoaW50KSB2YWx1ZSkNCisgICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWU7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgRnJvbVJlZmxlY3Rpb25UeXBlKG9iamVjdCB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gU2luZ3VsYXJGcm9tUmVmbGVjdGlvblR5cGUodmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG9iamVjdCBTaW5ndWxhckZyb21SZWZsZWN0aW9uVHlwZShvYmplY3QgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3dpdGNoIChEZXNjcmlwdG9yLk1hcHBlZFR5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjYXNlIE1hcHBlZFR5cGUuTWVzc2FnZToNCisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpcyBURXh0ZW5zaW9uVHlwZSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQgc2VlbXMgdGhlIGNvcHkgb2YgdGhlIGVtYmVkZGVkIG1lc3NhZ2Ugc3RvcmVkIGluc2lkZSB0aGUNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRlbmRlZCBtZXNzYWdlIGlzIG5vdCBvZiB0aGUgZXhhY3QgdHlwZSB0aGUgdXNlciB3YXMNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RpbmcuICBUaGlzIGNhbiBoYXBwZW4gaWYgYSB1c2VyIGRlZmluZXMgYQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlZEV4dGVuc2lvbiBtYW51YWxseSBhbmQgZ2l2ZXMgaXQgYSBkaWZmZXJlbnQgdHlwZS4NCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGluIG5vcm1hbCB1c2UuICBCdXQsIHRvIGJlIG5pY2UsIHdlJ2xsDQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgbWVzc2FnZSB0byB3aGF0ZXZlciB0eXBlIHRoZSBjYWxsZXIgd2FzIGV4cGVjdGluZy4NCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVzc2FnZURlZmF1bHRJbnN0YW5jZS5XZWFrQ3JlYXRlQnVpbGRlckZvclR5cGUoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuV2Vha01lcmdlRnJvbSgoSU1lc3NhZ2VMaXRlKSB2YWx1ZSkuV2Vha0J1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgTWFwcGVkVHlwZS5FbnVtOg0KKyAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCByZXR1cm4gYSBib3hlZCBpbnQgLSB0aGF0IGNhbiBiZSB1bmJveGVkIHRvIHRoZSBlbnVtDQorICAgICAgICAgICAgICAgICAgICBJRW51bUxpdGUgZW51bVZhbHVlID0gKElFbnVtTGl0ZSkgdmFsdWU7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW51bVZhbHVlLk51bWJlcjsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvR2VuZXJhdGVkTWVzc2FnZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0dlbmVyYXRlZE1lc3NhZ2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0YjY2NQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0dlbmVyYXRlZE1lc3NhZ2UuY3MKQEAgLTAsMCArMSwxODEgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uWG1sOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkZpZWxkQWNjZXNzOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBBbGwgZ2VuZXJhdGVkIHByb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyBleHRlbmQgdGhpcyBjbGFzcy4gSXQgaW1wbGVtZW50cw0KKyAgICAvLy8gbW9zdCBvZiB0aGUgSU1lc3NhZ2UgaW50ZXJmYWNlIHVzaW5nIHJlZmxlY3Rpb24uIFVzZXJzDQorICAgIC8vLyBjYW4gaWdub3JlIHRoaXMgY2xhc3MgYXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyBHZW5lcmF0ZWRNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4gOiBBYnN0cmFjdE1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVE1lc3NhZ2UgOiBHZW5lcmF0ZWRNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgIHdoZXJlIFRCdWlsZGVyIDogR2VuZXJhdGVkQnVpbGRlcjxUTWVzc2FnZSwgVEJ1aWxkZXI+LCBuZXcoKQ0KKyAgICB7DQorICAgICAgICBwcml2YXRlIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0LkRlZmF1bHRJbnN0YW5jZTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBtZXNzYWdlIGFzIGEgVE1lc3NhZ2UuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFRNZXNzYWdlIFRoaXNNZXNzYWdlIHsgZ2V0OyB9DQorDQorICAgICAgICBpbnRlcm5hbCBGaWVsZEFjY2Vzc29yVGFibGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiBGaWVsZEFjY2Vzc29yc0Zyb21CdWlsZGVyDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIEludGVybmFsRmllbGRBY2Nlc3NvcnM7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBGaWVsZEFjY2Vzc29yVGFibGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsgZ2V0OyB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgTWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycy5EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBJRGljdGlvbmFyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gR2V0TXV0YWJsZUZpZWxkTWFwKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBVc2UgYSBTb3J0ZWRMaXN0IHNvIHdlJ2xsIGVuZCB1cCBzZXJpYWxpemluZyBmaWVsZHMgaW4gb3JkZXINCisgICAgICAgICAgICB2YXIgcmV0ID0gbmV3IFNvcnRlZExpc3Q8RmllbGREZXNjcmlwdG9yLCBvYmplY3Q+KCk7DQorICAgICAgICAgICAgTWVzc2FnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IERlc2NyaXB0b3JGb3JUeXBlOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKEZpZWxkRGVzY3JpcHRvciBmaWVsZCBpbiBkZXNjcmlwdG9yLkZpZWxkcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIElGaWVsZEFjY2Vzc29yPFRNZXNzYWdlLCBUQnVpbGRlcj4gYWNjZXNzb3IgPSBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzW2ZpZWxkXTsNCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzUmVwZWF0ZWQpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3Nvci5HZXRSZXBlYXRlZENvdW50KFRoaXNNZXNzYWdlKSAhPSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldFtmaWVsZF0gPSBhY2Nlc3Nvci5HZXRWYWx1ZShUaGlzTWVzc2FnZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoSGFzRmllbGQoZmllbGQpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXRbZmllbGRdID0gYWNjZXNzb3IuR2V0VmFsdWUoVGhpc01lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXQ7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChGaWVsZERlc2NyaXB0b3IgZmllbGQgaW4gRGVzY3JpcHRvckZvclR5cGUuRmllbGRzKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQuDQorICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNSZXF1aXJlZCAmJiAhSGFzRmllbGQoZmllbGQpKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgZW1iZWRkZWQgbWVzc2FnZXMgYXJlIGluaXRpYWxpemVkLg0KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjb2RlIGlzIHNpbWlsYXIgdG8gdGhhdCBpbiBBYnN0cmFjdE1lc3NhZ2UsIGJ1dCB3ZSBkb24ndA0KKyAgICAgICAgICAgICAgICAgICAgLy8gZmV0Y2ggYWxsIHRoZSBmaWVsZCB2YWx1ZXMgLSBqdXN0IHRoZSBvbmVzIHdlIG5lZWQgdG8uDQorICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuTWFwcGVkVHlwZSA9PSBNYXBwZWRUeXBlLk1lc3NhZ2UpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzUmVwZWF0ZWQpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBrbm93IGl0J3MgYW4gSUxpc3Q8VD4sIGJ1dCBub3QgdGhlIGV4YWN0IHR5cGUgLSBzbw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJRW51bWVyYWJsZSBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8uIChDIyBnZW5lcmljcyBhcmVuJ3QgY292YXJpYW50IHlldC4pDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKElNZXNzYWdlTGl0ZSBlbGVtZW50IGluIChJRW51bWVyYWJsZSkgdGhpc1tmaWVsZF0pDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5Jc0luaXRpYWxpemVkKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSGFzRmllbGQoZmllbGQpICYmICEoKElNZXNzYWdlTGl0ZSkgdGhpc1tmaWVsZF0pLklzSW5pdGlhbGl6ZWQpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSURpY3Rpb25hcnk8RmllbGREZXNjcmlwdG9yLCBvYmplY3Q+IEFsbEZpZWxkcw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBEaWN0aW9uYXJpZXMuQXNSZWFkT25seShHZXRNdXRhYmxlRmllbGRNYXAoKSk7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEhhc0ZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gSW50ZXJuYWxGaWVsZEFjY2Vzc29yc1tmaWVsZF0uSGFzKFRoaXNNZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0UmVwZWF0ZWRGaWVsZENvdW50KEZpZWxkRGVzY3JpcHRvciBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gSW50ZXJuYWxGaWVsZEFjY2Vzc29yc1tmaWVsZF0uR2V0UmVwZWF0ZWRDb3VudChUaGlzTWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IHRoaXNbRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXhdDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIEludGVybmFsRmllbGRBY2Nlc3NvcnNbZmllbGRdLkdldFJlcGVhdGVkVmFsdWUoVGhpc01lc3NhZ2UsIGluZGV4KTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCB0aGlzW0ZpZWxkRGVzY3JpcHRvciBmaWVsZF0NCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gSW50ZXJuYWxGaWVsZEFjY2Vzc29yc1tmaWVsZF0uR2V0VmFsdWUoVGhpc01lc3NhZ2UpOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVW5rbm93bkZpZWxkU2V0IFVua25vd25GaWVsZHMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdW5rbm93bkZpZWxkczsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlcGxhY2VzIHRoZSBzZXQgb2YgdW5rbm93biBmaWVsZHMgZm9yIHRoaXMgbWVzc2FnZS4gVGhpcyBzaG91bGQNCisgICAgICAgIC8vLyBvbmx5IGJlIHVzZWQgYmVmb3JlIGEgbWVzc2FnZSBpcyBidWlsdCwgYnkgdGhlIGJ1aWxkZXIuIChJbiB0aGUNCisgICAgICAgIC8vLyBKYXZhIGNvZGUgaXQgaXMgcHJpdmF0ZSwgYnV0IHRoZSBidWlsZGVyIGlzIG5lc3RlZCBzbyBoYXMgYWNjZXNzDQorICAgICAgICAvLy8gdG8gaXQuKQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIHZvaWQgU2V0VW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXQgZmllbGRTZXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IGZpZWxkU2V0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0dlbmVyYXRlZE1lc3NhZ2VMaXRlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvR2VuZXJhdGVkTWVzc2FnZUxpdGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmYzk3NgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0dlbmVyYXRlZE1lc3NhZ2VMaXRlLmNzCkBAIC0wLDAgKzEsMTgyIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gQWxsIGdlbmVyYXRlZCBwcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgZXh0ZW5kIHRoaXMgY2xhc3MuIEl0IGltcGxlbWVudHMNCisgICAgLy8vIG1vc3Qgb2YgdGhlIElNZXNzYWdlIGludGVyZmFjZSB1c2luZyByZWZsZWN0aW9uLiBVc2Vycw0KKyAgICAvLy8gY2FuIGlnbm9yZSB0aGlzIGNsYXNzIGFzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIGFic3RyYWN0IHBhcnRpYWwgY2xhc3MgR2VuZXJhdGVkTWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiA6IEFic3RyYWN0TWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVE1lc3NhZ2UgOiBHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgICAgICB3aGVyZSBUQnVpbGRlciA6IEdlbmVyYXRlZEJ1aWxkZXJMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgew0KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFRNZXNzYWdlIFRoaXNNZXNzYWdlIHsgZ2V0OyB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2VhbGVkIHN0cmluZyBUb1N0cmluZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgdXNpbmcgKFN0cmluZ1dyaXRlciB3dHIgPSBuZXcgU3RyaW5nV3JpdGVyKCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBQcmludFRvKHd0cik7DQorICAgICAgICAgICAgICAgIHJldHVybiB3dHIuVG9TdHJpbmcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUHJpbnRUbygpIGhlbHBlciBtZXRob2RzIGZvciBMaXRlIFJ1bnRpbWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgUHJpbnRGaWVsZDxUPihzdHJpbmcgbmFtZSwgSUxpc3Q8VD4gdmFsdWUsIFRleHRXcml0ZXIgd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKFQgaXRlbSBpbiB2YWx1ZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFByaW50RmllbGQobmFtZSwgdHJ1ZSwgKG9iamVjdCkgaXRlbSwgd3JpdGVyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUHJpbnRUbygpIGhlbHBlciBtZXRob2RzIGZvciBMaXRlIFJ1bnRpbWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgUHJpbnRGaWVsZChzdHJpbmcgbmFtZSwgYm9vbCBoYXNWYWx1ZSwgb2JqZWN0IHZhbHVlLCBUZXh0V3JpdGVyIHdyaXRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoIWhhc1ZhbHVlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAodmFsdWUgaXMgSU1lc3NhZ2VMaXRlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9IHt7IiwgbmFtZSk7DQorICAgICAgICAgICAgICAgICgoSU1lc3NhZ2VMaXRlKSB2YWx1ZSkuUHJpbnRUbyh3cml0ZXIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ9Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGlzIEJ5dGVTdHJpbmcgfHwgdmFsdWUgaXMgU3RyaW5nKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCJ7MH06IFwiIiwgbmFtZSk7DQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpcyBTdHJpbmcpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEVzY2FwZUJ5dGVzKEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoKHN0cmluZykgdmFsdWUpLCB3cml0ZXIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgRXNjYXBlQnl0ZXMoKChCeXRlU3RyaW5nKSB2YWx1ZSksIHdyaXRlcik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiXCIiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaXMgYm9vbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInswfTogezF9IiwgbmFtZSwgKGJvb2wpIHZhbHVlID8gInRydWUiIDogImZhbHNlIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGlzIElFbnVtTGl0ZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInswfTogezF9IiwgbmFtZSwgKChJRW51bUxpdGUpIHZhbHVlKS5OYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9OiB7MX0iLCBuYW1lLCAoKElDb252ZXJ0aWJsZSl2YWx1ZSkuVG9TdHJpbmcoRnJhbWV3b3JrUG9ydGFiaWxpdHkuSW52YXJpYW50Q3VsdHVyZSkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDT1BJRUQgZnJvbSBUZXh0Rm9ybWF0DQorICAgICAgICAvLy8gRXNjYXBlcyBieXRlcyBpbiB0aGUgZm9ybWF0IHVzZWQgaW4gcHJvdG9jb2wgYnVmZmVyIHRleHQgZm9ybWF0LCB3aGljaA0KKyAgICAgICAgLy8vIGlzIHRoZSBzYW1lIGFzIHRoZSBmb3JtYXQgdXNlZCBmb3IgQyBzdHJpbmcgbGl0ZXJhbHMuICBBbGwgYnl0ZXMNCisgICAgICAgIC8vLyB0aGF0IGFyZSBub3QgcHJpbnRhYmxlIDctYml0IEFTQ0lJIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQsIGFzIHdlbGwgYXMNCisgICAgICAgIC8vLyBiYWNrc2xhc2gsIHNpbmdsZS1xdW90ZSwgYW5kIGRvdWJsZS1xdW90ZSBjaGFyYWN0ZXJzLiAgQ2hhcmFjdGVycyBmb3INCisgICAgICAgIC8vLyB3aGljaCBubyBkZWZpbmVkIHNob3J0LWhhbmQgZXNjYXBlIHNlcXVlbmNlIGlzIGRlZmluZWQgd2lsbCBiZSBlc2NhcGVkDQorICAgICAgICAvLy8gdXNpbmcgMy1kaWdpdCBvY3RhbCBzZXF1ZW5jZXMuDQorICAgICAgICAvLy8gVGhlIHJldHVybmVkIHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gYmUgZW50aXJlbHkgQVNDSUkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBFc2NhcGVCeXRlcyhJRW51bWVyYWJsZTxieXRlPiBpbnB1dCwgVGV4dFdyaXRlciB3cml0ZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoYnl0ZSBiIGluIGlucHV0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3dpdGNoIChiKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQyMgZG9lcyBub3QgdXNlIFxhIG9yIFx2DQorICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDc6DQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCJcXGEiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdcYic6DQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCJcXGIiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdcZic6DQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCJcXGYiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdcbic6DQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCJcXG4iKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdccic6DQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCJcXHIiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdcdCc6DQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCJcXHQiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwYjoNCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoIlxcdiIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ1xcJzoNCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoIlxcXFwiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdcJyc6DQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCJcXFwnIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnIic6DQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCJcXFwiIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID49IDB4MjAgJiYgYiA8IDEyOCkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgoY2hhcikgYik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgnXFwnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKChjaGFyKSAoJzAnICsgKChiID4+IDYpICYgMykpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKChjaGFyKSAoJzAnICsgKChiID4+IDMpICYgNykpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKChjaGFyKSAoJzAnICsgKGIgJiA3KSkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9HZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb24uY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9HZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3YjA4OAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0dlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbi5jcwpAQCAtMCwwICsxLDg4IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBDbGFzcyB1c2VkIHRvIHJlcHJlc2VudCByZXBlYXQgZXh0ZW5zaW9ucyBpbiBnZW5lcmF0ZWQgY2xhc3Nlcy4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248VEV4dGVuc2lvbkVsZW1lbnQ+IDogR2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxJTGlzdDxURXh0ZW5zaW9uRWxlbWVudD4+DQorICAgIHsNCisgICAgICAgIHByaXZhdGUgR2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgOiBiYXNlKGZpZWxkLCB0eXBlb2YoVEV4dGVuc2lvbkVsZW1lbnQpKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPElMaXN0PFRFeHRlbnNpb25FbGVtZW50Pj4gQ3JlYXRlSW5zdGFuY2UoRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yLklzUmVwZWF0ZWQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIk11c3QgY2FsbCBHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb24uQ3JlYXRlSW5zdGFuY2UoKSBmb3IgcmVwZWF0ZWQgdHlwZXMuIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPFRFeHRlbnNpb25FbGVtZW50PihkZXNjcmlwdG9yKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb252ZXJ0cyB0aGUgbGlzdCB0byB0aGUgcmlnaHQgdHlwZS4NCisgICAgICAgIC8vLyBUT0RPKGpvbnNrZWV0KTogQ2hlY2sgd2hlcmUgdGhpcyBpcyB1c2VkLCBhbmQgd2hldGhlciB3ZSBuZWVkIHRvIGNvbnZlcnQNCisgICAgICAgIC8vLyBmb3IgcHJpbWl0aXZlIHR5cGVzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBGcm9tUmVmbGVjdGlvblR5cGUob2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChEZXNjcmlwdG9yLk1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5NZXNzYWdlIHx8DQorICAgICAgICAgICAgICAgIERlc2NyaXB0b3IuTWFwcGVkVHlwZSA9PSBNYXBwZWRUeXBlLkVudW0pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBNdXN0IGNvbnZlcnQgdGhlIHdob2xlIGxpc3QuDQorICAgICAgICAgICAgICAgIExpc3Q8VEV4dGVuc2lvbkVsZW1lbnQ+IHJlc3VsdCA9IG5ldyBMaXN0PFRFeHRlbnNpb25FbGVtZW50PigpOw0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgZWxlbWVudCBpbiAoSUVudW1lcmFibGUpIHZhbHVlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXN1bHQuQWRkKChURXh0ZW5zaW9uRWxlbWVudCkgU2luZ3VsYXJGcm9tUmVmbGVjdGlvblR5cGUoZWxlbWVudCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvR2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvR2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZjE5NzkKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9HZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb24uY3MKQEAgLTAsMCArMSw2NSBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBHZW5lcmF0ZWQgZXh0ZW5zaW9uIGZvciBhIHNpbmd1bGFyIGZpZWxkLg0KKyAgICAvLy8gPC9yZW1hcmtzPg0KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxURXh0ZW5zaW9uPiA6IEdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8VEV4dGVuc2lvbj4NCisgICAgew0KKyAgICAgICAgaW50ZXJuYWwgR2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uKEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yKSA6IGJhc2UoZGVzY3JpcHRvciwgdHlwZW9mKFRFeHRlbnNpb24pKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248VEV4dGVuc2lvbj4gQ3JlYXRlSW5zdGFuY2UoRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiTXVzdCBjYWxsIEdlbmVyYXRlZFJlcGVhdGVFeHRlbnNpb24uQ3JlYXRlSW5zdGFuY2UoKSBmb3IgcmVwZWF0ZWQgdHlwZXMuIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPFRFeHRlbnNpb24+KGRlc2NyaXB0b3IpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBGcm9tUmVmbGVjdGlvblR5cGUob2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBiYXNlLlNpbmd1bGFyRnJvbVJlZmxlY3Rpb25UeXBlKHZhbHVlKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9JQnVpbGRlci5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0lCdWlsZGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YzBkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9JQnVpbGRlci5jcwpAQCAtMCwwICsxLDMwOSBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gTm9uLWdlbmVyaWMgaW50ZXJmYWNlIGZvciBhbGwgbWVtYmVycyB3aG9zZSBzaWduYXR1cmVzIGRvbid0IHJlcXVpcmUga25vd2xlZGdlIG9mDQorICAgIC8vLyB0aGUgdHlwZSBiZWluZyBidWlsdC4gVGhlIGdlbmVyaWMgaW50ZXJmYWNlIGV4dGVuZHMgdGhpcyBvbmUuIFNvbWUgbWV0aG9kcyByZXR1cm4NCisgICAgLy8vIGVpdGhlciBhbiBJQnVpbGRlciBvciBhbiBJTWVzc2FnZTsgaW4gdGhlc2UgY2FzZXMgdGhlIGdlbmVyaWMgaW50ZXJmYWNlIHJlZGVjbGFyZXMNCisgICAgLy8vIHRoZSBzYW1lIG1ldGhvZCB3aXRoIGEgdHlwZS1zcGVjaWZpYyBzaWduYXR1cmUuIEltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0bw0KKyAgICAvLy8gdXNlIGV4cGxpY2l0IGludGVyZmFjZSBpbXBsZW1lbmF0aW9uIGZvciB0aGUgbm9uLWdlbmVyaWMgZm9ybS4gVGhpcyBtaXJyb3JzDQorICAgIC8vLyBob3cgSUVudW1lcmFibGUgYW5kIElFbnVtZXJhYmxlJmx0O1QmZ3Q7IHdvcmsuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBpbnRlcmZhY2UgSUJ1aWxkZXIgOiBJQnVpbGRlckxpdGUNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZmYgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBhbmQgYWxsDQorICAgICAgICAvLy8gZW1iZWRkZWQgbWVzc2FnZXMgYXJlIHNldC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBuZXcgYm9vbCBJc0luaXRpYWxpemVkIHsgZ2V0OyB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gT25seSBwcmVzZW50IGluIHRoZSBub25nZW5lcmljIGludGVyZmFjZSAtIHVzZWZ1bCBmb3IgdGVzdHMsIGJ1dA0KKyAgICAgICAgLy8vIG5vdCBhcyBtdWNoIGluIHJlYWwgbGlmZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBJQnVpbGRlciBTZXRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIG9iamVjdCB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gT25seSBwcmVzZW50IGluIHRoZSBub25nZW5lcmljIGludGVyZmFjZSAtIHVzZWZ1bCBmb3IgdGVzdHMsIGJ1dA0KKyAgICAgICAgLy8vIG5vdCBhcyBtdWNoIGluIHJlYWwgbGlmZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBJQnVpbGRlciBTZXRSZXBlYXRlZEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgaW50IGluZGV4LCBvYmplY3QgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEJlaGF2ZXMgbGlrZSB0aGUgZXF1aXZhbGVudCBwcm9wZXJ0eSBpbiBJTWVzc2FnZSZsdDtUJmd0Oy4NCisgICAgICAgIC8vLyBUaGUgcmV0dXJuZWQgbWFwIG1heSBvciBtYXkgbm90IHJlZmxlY3QgZnV0dXJlIGNoYW5nZXMgdG8gdGhlIGJ1aWxkZXIuDQorICAgICAgICAvLy8gRWl0aGVyIHdheSwgdGhlIHJldHVybmVkIG1hcCBpcyB1bm1vZGlmaWFibGUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgSURpY3Rpb25hcnk8RmllbGREZXNjcmlwdG9yLCBvYmplY3Q+IEFsbEZpZWxkcyB7IGdldDsgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFsbG93cyBnZXR0aW5nIGFuZCBzZXR0aW5nIG9mIGEgZmllbGQuDQorICAgICAgICAvLy8gPHNlZSBjcmVmPSJJTWVzc2FnZXtUTWVzc2FnZSwgVEJ1aWxkZXJ9Lkl0ZW0oRmllbGREZXNjcmlwdG9yKSIvPg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmllbGQiPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgb2JqZWN0IHRoaXNbRmllbGREZXNjcmlwdG9yIGZpZWxkXSB7IGdldDsgc2V0OyB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gR2V0IHRoZSBtZXNzYWdlJ3MgdHlwZSBkZXNjcmlwdG9yLg0KKyAgICAgICAgLy8vIDxzZWUgY3JlZj0iSU1lc3NhZ2V7VE1lc3NhZ2UsIFRCdWlsZGVyfS5EZXNjcmlwdG9yRm9yVHlwZSIvPg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIE1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsgZ2V0OyB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gPHNlZSBjcmVmPSJJTWVzc2FnZXtUTWVzc2FnZSwgVEJ1aWxkZXJ9LkdldFJlcGVhdGVkRmllbGRDb3VudCIvPg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmllbGQiPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgaW50IEdldFJlcGVhdGVkRmllbGRDb3VudChGaWVsZERlc2NyaXB0b3IgZmllbGQpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFsbG93cyBnZXR0aW5nIGFuZCBzZXR0aW5nIG9mIGEgcmVwZWF0ZWQgZmllbGQgdmFsdWUuDQorICAgICAgICAvLy8gPHNlZSBjcmVmPSJJTWVzc2FnZXtUTWVzc2FnZSwgVEJ1aWxkZXJ9Lkl0ZW0oRmllbGREZXNjcmlwdG9yLCBpbnQpIi8+DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgb2JqZWN0IHRoaXNbRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXhdIHsgZ2V0OyBzZXQ7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyA8c2VlIGNyZWY9IklNZXNzYWdle1RNZXNzYWdlLCBUQnVpbGRlcn0uSGFzRmllbGQiLz4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBib29sIEhhc0ZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gPHNlZSBjcmVmPSJJTWVzc2FnZXtUTWVzc2FnZSwgVEJ1aWxkZXJ9LlVua25vd25GaWVsZHMiLz4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBVbmtub3duRmllbGRTZXQgVW5rbm93bkZpZWxkcyB7IGdldDsgc2V0OyB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlIGEgYnVpbGRlciBmb3IgbWVzc2FnZXMgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHRoZSBnaXZlbiBmaWVsZC4NCisgICAgICAgIC8vLyBNZXNzYWdlcyBidWlsdCB3aXRoIHRoaXMgY2FuIHRoZW4gYmUgcGFzc2VkIHRvIHRoZSB2YXJpb3VzIG11dGF0aW9uIHByb3BlcnRpZXMNCisgICAgICAgIC8vLyBhbmQgbWV0aG9kcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBJQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKTsNCisNCisgICAgICAgICNyZWdpb24gTWV0aG9kcyB3aGljaCBhcmUgbGlrZSB0aG9zZSBvZiB0aGUgZ2VuZXJpYyBmb3JtLCBidXQgd2l0aG91dCBhbnkga25vd2xlZGdlIG9mIHRoZSB0eXBlIHBhcmFtZXRlcnMNCisNCisgICAgICAgIElCdWlsZGVyIFdlYWtBZGRSZXBlYXRlZEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgb2JqZWN0IHZhbHVlKTsNCisgICAgICAgIG5ldyBJQnVpbGRlciBXZWFrQ2xlYXIoKTsNCisgICAgICAgIElCdWlsZGVyIFdlYWtDbGVhckZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCk7DQorICAgICAgICBJQnVpbGRlciBXZWFrTWVyZ2VGcm9tKElNZXNzYWdlIG1lc3NhZ2UpOw0KKyAgICAgICAgbmV3IElCdWlsZGVyIFdlYWtNZXJnZUZyb20oQnl0ZVN0cmluZyBkYXRhKTsNCisgICAgICAgIG5ldyBJQnVpbGRlciBXZWFrTWVyZ2VGcm9tKEJ5dGVTdHJpbmcgZGF0YSwgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpOw0KKyAgICAgICAgbmV3IElCdWlsZGVyIFdlYWtNZXJnZUZyb20oSUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpOw0KKyAgICAgICAgbmV3IElCdWlsZGVyIFdlYWtNZXJnZUZyb20oSUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KTsNCisgICAgICAgIG5ldyBJTWVzc2FnZSBXZWFrQnVpbGQoKTsNCisgICAgICAgIG5ldyBJTWVzc2FnZSBXZWFrQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICBuZXcgSUJ1aWxkZXIgV2Vha0Nsb25lKCk7DQorICAgICAgICBuZXcgSU1lc3NhZ2UgV2Vha0RlZmF1bHRJbnN0YW5jZUZvclR5cGUgeyBnZXQ7IH0NCisNCisgICAgICAgICNlbmRyZWdpb24NCisgICAgfQ0KKw0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgUHJvdG9jb2wgTWVzc2FnZSBidWlsZGVycy4NCisgICAgLy8vIFRPRE8oam9uc2tlZXQpOiBDb25zaWRlciAiU2V0WFhYIiBtZXRob2RzIHJldHVybmluZyB0aGUgYnVpbGRlciwgYXMgd2VsbCBhcyB0aGUgcHJvcGVydGllcy4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVE1lc3NhZ2UiPlR5cGUgb2YgbWVzc2FnZTwvdHlwZXBhcmFtPg0KKyAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUQnVpbGRlciI+VHlwZSBvZiBidWlsZGVyPC90eXBlcGFyYW0+DQorICAgIHB1YmxpYyBpbnRlcmZhY2UgSUJ1aWxkZXI8VE1lc3NhZ2UsIFRCdWlsZGVyPiA6IElCdWlsZGVyLCBJQnVpbGRlckxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVE1lc3NhZ2UgOiBJTWVzc2FnZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgICAgICB3aGVyZSBUQnVpbGRlciA6IElCdWlsZGVyPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgew0KKyAgICAgICAgVEJ1aWxkZXIgU2V0VW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcyk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVzZXRzIGFsbCBmaWVsZHMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgbmV3IFRCdWlsZGVyIENsZWFyKCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTWVyZ2UgdGhlIHNwZWNpZmllZCBvdGhlciBtZXNzYWdlIHdoaWNoIG1heSBiZSBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBvZg0KKyAgICAgICAgLy8vIHRoZSBzYW1lIG1lc3NhZ2UgZGVzY3JpcHRvci4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBUQnVpbGRlciBNZXJnZUZyb20oSU1lc3NhZ2Ugb3RoZXIpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIGZpbmFsIG1lc3NhZ2UuIE9uY2UgdGhpcyBpcyBjYWxsZWQsIHRoaXMgQnVpbGRlciBpbnN0YW5jZQ0KKyAgICAgICAgLy8vIGlzIG5vIGxvbmdlciB2YWxpZCwgYW5kIGNhbGxpbmcgYW55IG90aGVyIG1ldGhvZCBtYXkgdGhyb3cgYQ0KKyAgICAgICAgLy8vIE51bGxSZWZlcmVuY2VFeGNlcHRpb24uIElmIHlvdSBuZWVkIHRvIGNvbnRpbnVlIHdvcmtpbmcgd2l0aCB0aGUgYnVpbGRlcg0KKyAgICAgICAgLy8vIGFmdGVyIGNhbGxpbmcgQnVpbGQsIGNhbGwgQ2xvbmUgZmlyc3QuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24iPnRoZSBtZXNzYWdlDQorICAgICAgICAvLy8gaXMgbWlzc2luZyBvbmUgb3IgbW9yZSByZXF1aXJlZCBmaWVsZHM7IHVzZSBCdWlsZFBhcnRpYWwgdG8gYnlwYXNzDQorICAgICAgICAvLy8gdGhpcyBjaGVjazwvZXhjZXB0aW9uPg0KKyAgICAgICAgbmV3IFRNZXNzYWdlIEJ1aWxkKCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTGlrZSBCdWlsZCgpLCBidXQgZG9lcyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGlzIG1pc3NpbmcNCisgICAgICAgIC8vLyByZXF1aXJlZCBmaWVsZHMuIEluc3RlYWQsIGEgcGFydGlhbCBtZXNzYWdlIGlzIHJldHVybmVkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIG5ldyBUTWVzc2FnZSBCdWlsZFBhcnRpYWwoKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDbG9uZXMgdGhpcyBidWlsZGVyLg0KKyAgICAgICAgLy8vIFRPRE8oam9uc2tlZXQpOiBFeHBsYWluIGRlcHRoIG9mIGNsb25lLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIG5ldyBUQnVpbGRlciBDbG9uZSgpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBhcnNlcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGZyb20gdGhlIGlucHV0IGFuZCBtZXJnZXMgaXQgd2l0aCB0aGlzDQorICAgICAgICAvLy8gbWVzc2FnZSwgYXMgaWYgdXNpbmcgTWVyZ2VGcm9tKElNZXNzYWdlJmx0O1QmZ3Q7KS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+DQorICAgICAgICAvLy8gV2FybmluZzogVGhpcyBkb2VzIG5vdCB2ZXJpZnkgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50DQorICAgICAgICAvLy8gaW4gdGhlIGlucHV0IG1lc3NhZ2UuIElmIHlvdSBjYWxsIEJ1aWxkKCkgd2l0aG91dCBzZXR0aW5nIGFsbA0KKyAgICAgICAgLy8vIHJlcXVpcmVkIGZpZWxkcywgaXQgd2lsbCB0aHJvdyBhbiBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi4NCisgICAgICAgIC8vLyBUaGVyZSBhcmUgYSBmZXcgZ29vZCB3YXlzIHRvIGRlYWwgd2l0aCB0aGlzOg0KKyAgICAgICAgLy8vIDxsaXN0Pg0KKyAgICAgICAgLy8vIDxpdGVtPkNhbGwgSXNJbml0aWFsaXplZCB0byB2ZXJpZnkgdG8gdmVyaWZ5IHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUNCisgICAgICAgIC8vLyBzZXQgYmVmb3JlIGJ1aWxkaW5nLjwvaXRlbT4NCisgICAgICAgIC8vLyA8aXRlbT5QYXJzZSAgdGhlIG1lc3NhZ2Ugc2VwYXJhdGVseSB1c2luZyBvbmUgb2YgdGhlIHN0YXRpYyBQYXJzZUZyb20NCisgICAgICAgIC8vLyBtZXRob2RzLCB0aGVuIHVzZSBNZXJnZUZyb20oSU1lc3NhZ2UmbHQ7VCZndDspIHRvIG1lcmdlIGl0IHdpdGgNCisgICAgICAgIC8vLyB0aGlzIG9uZS4gUGFyc2VGcm9tIHdpbGwgdGhyb3cgYW4gSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uDQorICAgICAgICAvLy8gKGFuIElPRXhjZXB0aW9uKSBpZiBzb21lIHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy4NCisgICAgICAgIC8vLyBVc2UgQnVpbGRQYXJ0aWFsIHRvIGJ1aWxkLCB3aGljaCBpZ25vcmVzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLg0KKyAgICAgICAgLy8vIDwvbGlzdD4NCisgICAgICAgIC8vLyA8L3JlbWFya3M+DQorICAgICAgICBuZXcgVEJ1aWxkZXIgTWVyZ2VGcm9tKElDb2RlZElucHV0U3RyZWFtIGlucHV0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBMaWtlIE1lcmdlRnJvbShJQ29kZWRJbnB1dFN0cmVhbSksIGJ1dCBhbHNvIHBhcnNlcyBleHRlbnNpb25zLg0KKyAgICAgICAgLy8vIFRoZSBleHRlbnNpb25zIHRoYXQgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBwYXJzZSBtdXN0IGJlIHJlZ2lzdGVyZWQNCisgICAgICAgIC8vLyBpbiA8cGFyYW1yZWYgbmFtZT0iZXh0ZW5zaW9uUmVnaXN0cnkiLz4uIEV4dGVuc2lvbnMgbm90IGluIHRoZSByZWdpc3RyeQ0KKyAgICAgICAgLy8vIHdpbGwgYmUgdHJlYXRlZCBhcyB1bmtub3duIGZpZWxkcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBuZXcgVEJ1aWxkZXIgTWVyZ2VGcm9tKElDb2RlZElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gR2V0J3MgdGhlIG1lc3NhZ2UncyB0eXBlJ3MgZGVmYXVsdCBpbnN0YW5jZS4NCisgICAgICAgIC8vLyA8c2VlIGNyZWY9IklNZXNzYWdle1RNZXNzYWdlfS5EZWZhdWx0SW5zdGFuY2VGb3JUeXBlIiAvPg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIG5ldyBUTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsgZ2V0OyB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2xlYXJzIHRoZSBmaWVsZC4gVGhpcyBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGUgZ2VuZXJhdGVkDQorICAgICAgICAvLy8gQ2xlYXIgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmllbGQiPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgVEJ1aWxkZXIgQ2xlYXJGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFwcGVuZHMgdGhlIGdpdmVuIHZhbHVlIGFzIGEgbmV3IGVsZW1lbnQgZm9yIHRoZSBzcGVjaWZpZWQgcmVwZWF0ZWQgZmllbGQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPnRoZSBmaWVsZCBpcyBub3QgYSByZXBlYXRlZCBmaWVsZCwNCisgICAgICAgIC8vLyB0aGUgZmllbGQgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgYnVpbGRlcidzIHR5cGUsIG9yIHRoZSB2YWx1ZSBpcw0KKyAgICAgICAgLy8vIG9mIHRoZSBpbmNvcnJlY3QgdHlwZQ0KKyAgICAgICAgLy8vIDwvZXhjZXB0aW9uPg0KKyAgICAgICAgVEJ1aWxkZXIgQWRkUmVwZWF0ZWRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIG9iamVjdCB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTWVyZ2Ugc29tZSB1bmtub3duIGZpZWxkcyBpbnRvIHRoZSBzZXQgZm9yIHRoaXMgbWVzc2FnZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBUQnVpbGRlciBNZXJnZVVua25vd25GaWVsZHMoVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIExpa2UgTWVyZ2VGcm9tKFN0cmVhbSksIGJ1dCBkb2VzIG5vdCByZWFkIHVudGlsIHRoZSBlbmQgb2YgdGhlIGZpbGUuDQorICAgICAgICAvLy8gSW5zdGVhZCwgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgKGVuY29kZWQgYXMgYSB2YXJpbnQpIGlzIHJlYWQgZmlyc3QsDQorICAgICAgICAvLy8gdGhlbiB0aGUgbWVzc2FnZSBkYXRhLiBVc2UgTWVzc2FnZS5Xcml0ZURlbGltaXRlZFRvKFN0cmVhbSkgdG8NCisgICAgICAgIC8vLyB3cml0ZSBtZXNzYWdlcyBpbiB0aGlzIGZvcm1hdC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlucHV0Ij48L3BhcmFtPg0KKyAgICAgICAgbmV3IFRCdWlsZGVyIE1lcmdlRGVsaW1pdGVkRnJvbShTdHJlYW0gaW5wdXQpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIExpa2UgTWVyZ2VEZWxpbWl0ZWRGcm9tKFN0cmVhbSkgYnV0IHN1cHBvcnRpbmcgZXh0ZW5zaW9ucy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBuZXcgVEJ1aWxkZXIgTWVyZ2VEZWxpbWl0ZWRGcm9tKFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKw0KKyAgICAgICAgI3JlZ2lvbiBDb252ZW5pZW5jZSBtZXRob2RzDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUGFyc2UgPHBhcmFtcmVmIG5hbWU9ImRhdGEiLz4gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UNCisgICAgICAgIC8vLyBpdCB3aXRoIHRoZSBtZXNzYWdlIGJlaW5nIGJ1aWx0LiBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZA0KKyAgICAgICAgLy8vIE1lcmdlRnJvbShJQ29kZWRJbnB1dFN0cmVhbSkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgbmV3IFRCdWlsZGVyIE1lcmdlRnJvbShCeXRlU3RyaW5nIGRhdGEpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBhcnNlIDxwYXJhbXJlZiBuYW1lPSJkYXRhIi8+IGFzIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgYW5kIG1lcmdlDQorICAgICAgICAvLy8gaXQgd2l0aCB0aGUgbWVzc2FnZSBiZWluZyBidWlsdC4gVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQNCisgICAgICAgIC8vLyBNZXJnZUZyb20oSUNvZGVkSW5wdXRTdHJlYW0sIGV4dGVuc2lvblJlZ2lzdHJ5KS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBuZXcgVEJ1aWxkZXIgTWVyZ2VGcm9tKEJ5dGVTdHJpbmcgZGF0YSwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBhcnNlIDxwYXJhbXJlZiBuYW1lPSJkYXRhIi8+IGFzIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgYW5kIG1lcmdlDQorICAgICAgICAvLy8gaXQgd2l0aCB0aGUgbWVzc2FnZSBiZWluZyBidWlsdC4gVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQNCisgICAgICAgIC8vLyBNZXJnZUZyb20oSUNvZGVkSW5wdXRTdHJlYW0pLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIG5ldyBUQnVpbGRlciBNZXJnZUZyb20oYnl0ZVtdIGRhdGEpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBhcnNlIDxwYXJhbXJlZiBuYW1lPSJkYXRhIi8+IGFzIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgYW5kIG1lcmdlDQorICAgICAgICAvLy8gaXQgd2l0aCB0aGUgbWVzc2FnZSBiZWluZyBidWlsdC4gVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQNCisgICAgICAgIC8vLyBNZXJnZUZyb20oSUNvZGVkSW5wdXRTdHJlYW0sIGV4dGVuc2lvblJlZ2lzdHJ5KS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBuZXcgVEJ1aWxkZXIgTWVyZ2VGcm9tKGJ5dGVbXSBkYXRhLCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUGFyc2UgPHBhcmFtcmVmIG5hbWU9ImlucHV0Ii8+IGFzIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgYW5kIG1lcmdlDQorICAgICAgICAvLy8gaXQgd2l0aCB0aGUgbWVzc2FnZSBiZWluZyBidWlsdC4gVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQNCisgICAgICAgIC8vLyBNZXJnZUZyb20oSUNvZGVkSW5wdXRTdHJlYW0pLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgYWx3YXlzIHJlYWRzDQorICAgICAgICAvLy8gdGhlIGVudGlyZSBpbnB1dCAodW5sZXNzIGl0IHRocm93cyBhbiBleGNlcHRpb24pLiBJZiB5b3Ugd2FudCBpdCB0bw0KKyAgICAgICAgLy8vIHN0b3AgZWFybGllciwgeW91IHdpbGwgbmVlZCB0byB3cmFwIHRoZSBpbnB1dCBpbiBhIHdyYXBwZXINCisgICAgICAgIC8vLyBzdHJlYW0gd2hpY2ggbGltaXRzIHJlYWRpbmcuIE9yLCB1c2UgSU1lc3NhZ2UuV3JpdGVEZWxpbWl0ZWRUbyhTdHJlYW0pDQorICAgICAgICAvLy8gdG8gd3JpdGUgeW91ciBtZXNzYWdlIGFuZCBNbWVyZ2VEZWxpbWl0ZWRGcm9tKFN0cmVhbSkgdG8gcmVhZCBpdC4NCisgICAgICAgIC8vLyBEZXNwaXRlIHVzdWFsbHkgcmVhZGluZyB0aGUgZW50aXJlIHN0cmVhbSwgdGhpcyBtZXRob2QgbmV2ZXIgY2xvc2VzIHRoZSBzdHJlYW0uIA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIG5ldyBUQnVpbGRlciBNZXJnZUZyb20oU3RyZWFtIGlucHV0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQYXJzZSA8cGFyYW1yZWYgbmFtZT0iaW5wdXQiLz4gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UNCisgICAgICAgIC8vLyBpdCB3aXRoIHRoZSBtZXNzYWdlIGJlaW5nIGJ1aWx0LiBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZA0KKyAgICAgICAgLy8vIE1lcmdlRnJvbShJQ29kZWRJbnB1dFN0cmVhbSwgZXh0ZW5zaW9uUmVnaXN0cnkpLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIG5ldyBUQnVpbGRlciBNZXJnZUZyb20oU3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSk7DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvSUJ1aWxkZXJMaXRlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvSUJ1aWxkZXJMaXRlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMGZlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9JQnVpbGRlckxpdGUuY3MKQEAgLTAsMCArMSwyMTMgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW0uSU87DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIE5vbi1nZW5lcmljIGludGVyZmFjZSBmb3IgYWxsIG1lbWJlcnMgd2hvc2Ugc2lnbmF0dXJlcyBkb24ndCByZXF1aXJlIGtub3dsZWRnZSBvZg0KKyAgICAvLy8gdGhlIHR5cGUgYmVpbmcgYnVpbHQuIFRoZSBnZW5lcmljIGludGVyZmFjZSBleHRlbmRzIHRoaXMgb25lLiBTb21lIG1ldGhvZHMgcmV0dXJuDQorICAgIC8vLyBlaXRoZXIgYW4gSUJ1aWxkZXIgb3IgYW4gSU1lc3NhZ2U7IGluIHRoZXNlIGNhc2VzIHRoZSBnZW5lcmljIGludGVyZmFjZSByZWRlY2xhcmVzDQorICAgIC8vLyB0aGUgc2FtZSBtZXRob2Qgd2l0aCBhIHR5cGUtc3BlY2lmaWMgc2lnbmF0dXJlLiBJbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8NCisgICAgLy8vIHVzZSBleHBsaWNpdCBpbnRlcmZhY2UgaW1wbGVtZW5hdGlvbiBmb3IgdGhlIG5vbi1nZW5lcmljIGZvcm0uIFRoaXMgbWlycm9ycw0KKyAgICAvLy8gaG93IElFbnVtZXJhYmxlIGFuZCBJRW51bWVyYWJsZSZsdDtUJmd0OyB3b3JrLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgcGFydGlhbCBpbnRlcmZhY2UgSUJ1aWxkZXJMaXRlDQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWZmIGFsbCByZXF1aXJlZCBmaWVsZHMgaW4gdGhlIG1lc3NhZ2UgYW5kIGFsbA0KKyAgICAgICAgLy8vIGVtYmVkZGVkIG1lc3NhZ2VzIGFyZSBzZXQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgYm9vbCBJc0luaXRpYWxpemVkIHsgZ2V0OyB9DQorDQorICAgICAgICBJQnVpbGRlckxpdGUgV2Vha0NsZWFyKCk7DQorICAgICAgICBJQnVpbGRlckxpdGUgV2Vha01lcmdlRnJvbShJTWVzc2FnZUxpdGUgbWVzc2FnZSk7DQorICAgICAgICBJQnVpbGRlckxpdGUgV2Vha01lcmdlRnJvbShCeXRlU3RyaW5nIGRhdGEpOw0KKyAgICAgICAgSUJ1aWxkZXJMaXRlIFdlYWtNZXJnZUZyb20oQnl0ZVN0cmluZyBkYXRhLCBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSk7DQorICAgICAgICBJQnVpbGRlckxpdGUgV2Vha01lcmdlRnJvbShJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCk7DQorICAgICAgICBJQnVpbGRlckxpdGUgV2Vha01lcmdlRnJvbShJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpOw0KKyAgICAgICAgSU1lc3NhZ2VMaXRlIFdlYWtCdWlsZCgpOw0KKyAgICAgICAgSU1lc3NhZ2VMaXRlIFdlYWtCdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIElCdWlsZGVyTGl0ZSBXZWFrQ2xvbmUoKTsNCisgICAgICAgIElNZXNzYWdlTGl0ZSBXZWFrRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7IGdldDsgfQ0KKyAgICB9DQorDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBQcm90b2NvbCBNZXNzYWdlIGJ1aWxkZXJzLg0KKyAgICAvLy8gVE9ETyhqb25za2VldCk6IENvbnNpZGVyICJTZXRYWFgiIG1ldGhvZHMgcmV0dXJuaW5nIHRoZSBidWlsZGVyLCBhcyB3ZWxsIGFzIHRoZSBwcm9wZXJ0aWVzLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUTWVzc2FnZSI+VHlwZSBvZiBtZXNzYWdlPC90eXBlcGFyYW0+DQorICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlRCdWlsZGVyIj5UeXBlIG9mIGJ1aWxkZXI8L3R5cGVwYXJhbT4NCisgICAgcHVibGljIGludGVyZmFjZSBJQnVpbGRlckxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPiA6IElCdWlsZGVyTGl0ZQ0KKyAgICAgICAgd2hlcmUgVE1lc3NhZ2UgOiBJTWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVEJ1aWxkZXIgOiBJQnVpbGRlckxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVzZXRzIGFsbCBmaWVsZHMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgVEJ1aWxkZXIgQ2xlYXIoKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBNZXJnZSB0aGUgc3BlY2lmaWVkIG90aGVyIG1lc3NhZ2Ugd2hpY2ggbWF5IGJlIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIG9mDQorICAgICAgICAvLy8gdGhlIHNhbWUgbWVzc2FnZSBkZXNjcmlwdG9yLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFRCdWlsZGVyIE1lcmdlRnJvbShJTWVzc2FnZUxpdGUgb3RoZXIpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIGZpbmFsIG1lc3NhZ2UuIE9uY2UgdGhpcyBpcyBjYWxsZWQsIHRoaXMgQnVpbGRlciBpbnN0YW5jZQ0KKyAgICAgICAgLy8vIGlzIG5vIGxvbmdlciB2YWxpZCwgYW5kIGNhbGxpbmcgYW55IG90aGVyIG1ldGhvZCBtYXkgdGhyb3cgYQ0KKyAgICAgICAgLy8vIE51bGxSZWZlcmVuY2VFeGNlcHRpb24uIElmIHlvdSBuZWVkIHRvIGNvbnRpbnVlIHdvcmtpbmcgd2l0aCB0aGUgYnVpbGRlcg0KKyAgICAgICAgLy8vIGFmdGVyIGNhbGxpbmcgQnVpbGQsIGNhbGwgQ2xvbmUgZmlyc3QuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24iPnRoZSBtZXNzYWdlDQorICAgICAgICAvLy8gaXMgbWlzc2luZyBvbmUgb3IgbW9yZSByZXF1aXJlZCBmaWVsZHM7IHVzZSBCdWlsZFBhcnRpYWwgdG8gYnlwYXNzDQorICAgICAgICAvLy8gdGhpcyBjaGVjazwvZXhjZXB0aW9uPg0KKyAgICAgICAgVE1lc3NhZ2UgQnVpbGQoKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBMaWtlIEJ1aWxkKCksIGJ1dCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaXMgbWlzc2luZw0KKyAgICAgICAgLy8vIHJlcXVpcmVkIGZpZWxkcy4gSW5zdGVhZCwgYSBwYXJ0aWFsIG1lc3NhZ2UgaXMgcmV0dXJuZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgVE1lc3NhZ2UgQnVpbGRQYXJ0aWFsKCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2xvbmVzIHRoaXMgYnVpbGRlci4NCisgICAgICAgIC8vLyBUT0RPKGpvbnNrZWV0KTogRXhwbGFpbiBkZXB0aCBvZiBjbG9uZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBUQnVpbGRlciBDbG9uZSgpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBhcnNlcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGZyb20gdGhlIGlucHV0IGFuZCBtZXJnZXMgaXQgd2l0aCB0aGlzDQorICAgICAgICAvLy8gbWVzc2FnZSwgYXMgaWYgdXNpbmcgTWVyZ2VGcm9tKElNZXNzYWdlJmx0O1QmZ3Q7KS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+DQorICAgICAgICAvLy8gV2FybmluZzogVGhpcyBkb2VzIG5vdCB2ZXJpZnkgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50DQorICAgICAgICAvLy8gaW4gdGhlIGlucHV0IG1lc3NhZ2UuIElmIHlvdSBjYWxsIEJ1aWxkKCkgd2l0aG91dCBzZXR0aW5nIGFsbA0KKyAgICAgICAgLy8vIHJlcXVpcmVkIGZpZWxkcywgaXQgd2lsbCB0aHJvdyBhbiBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi4NCisgICAgICAgIC8vLyBUaGVyZSBhcmUgYSBmZXcgZ29vZCB3YXlzIHRvIGRlYWwgd2l0aCB0aGlzOg0KKyAgICAgICAgLy8vIDxsaXN0Pg0KKyAgICAgICAgLy8vIDxpdGVtPkNhbGwgSXNJbml0aWFsaXplZCB0byB2ZXJpZnkgdG8gdmVyaWZ5IHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUNCisgICAgICAgIC8vLyBzZXQgYmVmb3JlIGJ1aWxkaW5nLjwvaXRlbT4NCisgICAgICAgIC8vLyA8aXRlbT5QYXJzZSAgdGhlIG1lc3NhZ2Ugc2VwYXJhdGVseSB1c2luZyBvbmUgb2YgdGhlIHN0YXRpYyBQYXJzZUZyb20NCisgICAgICAgIC8vLyBtZXRob2RzLCB0aGVuIHVzZSBNZXJnZUZyb20oSU1lc3NhZ2UmbHQ7VCZndDspIHRvIG1lcmdlIGl0IHdpdGgNCisgICAgICAgIC8vLyB0aGlzIG9uZS4gUGFyc2VGcm9tIHdpbGwgdGhyb3cgYW4gSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uDQorICAgICAgICAvLy8gKGFuIElPRXhjZXB0aW9uKSBpZiBzb21lIHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy4NCisgICAgICAgIC8vLyBVc2UgQnVpbGRQYXJ0aWFsIHRvIGJ1aWxkLCB3aGljaCBpZ25vcmVzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLg0KKyAgICAgICAgLy8vIDwvbGlzdD4NCisgICAgICAgIC8vLyA8L3JlbWFya3M+DQorICAgICAgICBUQnVpbGRlciBNZXJnZUZyb20oSUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIExpa2UgTWVyZ2VGcm9tKElDb2RlZElucHV0U3RyZWFtKSwgYnV0IGFsc28gcGFyc2VzIGV4dGVuc2lvbnMuDQorICAgICAgICAvLy8gVGhlIGV4dGVuc2lvbnMgdGhhdCB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHBhcnNlIG11c3QgYmUgcmVnaXN0ZXJlZA0KKyAgICAgICAgLy8vIGluIDxwYXJhbXJlZiBuYW1lPSJleHRlbnNpb25SZWdpc3RyeSIvPi4gRXh0ZW5zaW9ucyBub3QgaW4gdGhlIHJlZ2lzdHJ5DQorICAgICAgICAvLy8gd2lsbCBiZSB0cmVhdGVkIGFzIHVua25vd24gZmllbGRzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFRCdWlsZGVyIE1lcmdlRnJvbShJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEdldCdzIHRoZSBtZXNzYWdlJ3MgdHlwZSdzIGRlZmF1bHQgaW5zdGFuY2UuDQorICAgICAgICAvLy8gPHNlZSBjcmVmPSJJTWVzc2FnZUxpdGV7VE1lc3NhZ2V9LkRlZmF1bHRJbnN0YW5jZUZvclR5cGUiIC8+DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgVE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7IGdldDsgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIExpa2UgTWVyZ2VGcm9tKFN0cmVhbSksIGJ1dCBkb2VzIG5vdCByZWFkIHVudGlsIHRoZSBlbmQgb2YgdGhlIGZpbGUuDQorICAgICAgICAvLy8gSW5zdGVhZCwgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgKGVuY29kZWQgYXMgYSB2YXJpbnQpIGlzIHJlYWQgZmlyc3QsDQorICAgICAgICAvLy8gdGhlbiB0aGUgbWVzc2FnZSBkYXRhLiBVc2UgTWVzc2FnZS5Xcml0ZURlbGltaXRlZFRvKFN0cmVhbSkgdG8NCisgICAgICAgIC8vLyB3cml0ZSBtZXNzYWdlcyBpbiB0aGlzIGZvcm1hdC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlucHV0Ij48L3BhcmFtPg0KKyAgICAgICAgVEJ1aWxkZXIgTWVyZ2VEZWxpbWl0ZWRGcm9tKFN0cmVhbSBpbnB1dCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTGlrZSBNZXJnZURlbGltaXRlZEZyb20oU3RyZWFtKSBidXQgc3VwcG9ydGluZyBleHRlbnNpb25zLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFRCdWlsZGVyIE1lcmdlRGVsaW1pdGVkRnJvbShTdHJlYW0gaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisNCisgICAgICAgICNyZWdpb24gQ29udmVuaWVuY2UgbWV0aG9kcw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBhcnNlIDxwYXJhbXJlZiBuYW1lPSJkYXRhIi8+IGFzIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgYW5kIG1lcmdlDQorICAgICAgICAvLy8gaXQgd2l0aCB0aGUgbWVzc2FnZSBiZWluZyBidWlsdC4gVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQNCisgICAgICAgIC8vLyBNZXJnZUZyb20oSUNvZGVkSW5wdXRTdHJlYW0pLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFRCdWlsZGVyIE1lcmdlRnJvbShCeXRlU3RyaW5nIGRhdGEpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBhcnNlIDxwYXJhbXJlZiBuYW1lPSJkYXRhIi8+IGFzIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgYW5kIG1lcmdlDQorICAgICAgICAvLy8gaXQgd2l0aCB0aGUgbWVzc2FnZSBiZWluZyBidWlsdC4gVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQNCisgICAgICAgIC8vLyBNZXJnZUZyb20oSUNvZGVkSW5wdXRTdHJlYW0sIEV4dGVuc2lvblJlZ2lzdHJ5KS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBUQnVpbGRlciBNZXJnZUZyb20oQnl0ZVN0cmluZyBkYXRhLCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUGFyc2UgPHBhcmFtcmVmIG5hbWU9ImRhdGEiLz4gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UNCisgICAgICAgIC8vLyBpdCB3aXRoIHRoZSBtZXNzYWdlIGJlaW5nIGJ1aWx0LiBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZA0KKyAgICAgICAgLy8vIE1lcmdlRnJvbShJQ29kZWRJbnB1dFN0cmVhbSkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgVEJ1aWxkZXIgTWVyZ2VGcm9tKGJ5dGVbXSBkYXRhKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQYXJzZSA8cGFyYW1yZWYgbmFtZT0iZGF0YSIvPiBhcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGFuZCBtZXJnZQ0KKyAgICAgICAgLy8vIGl0IHdpdGggdGhlIG1lc3NhZ2UgYmVpbmcgYnVpbHQuIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kDQorICAgICAgICAvLy8gTWVyZ2VGcm9tKElDb2RlZElucHV0U3RyZWFtLCBFeHRlbnNpb25SZWdpc3RyeSkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgVEJ1aWxkZXIgTWVyZ2VGcm9tKGJ5dGVbXSBkYXRhLCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUGFyc2UgPHBhcmFtcmVmIG5hbWU9ImlucHV0Ii8+IGFzIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgYW5kIG1lcmdlDQorICAgICAgICAvLy8gaXQgd2l0aCB0aGUgbWVzc2FnZSBiZWluZyBidWlsdC4gVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQNCisgICAgICAgIC8vLyBNZXJnZUZyb20oSUNvZGVkSW5wdXRTdHJlYW0pLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgYWx3YXlzIHJlYWRzDQorICAgICAgICAvLy8gdGhlIGVudGlyZSBpbnB1dCAodW5sZXNzIGl0IHRocm93cyBhbiBleGNlcHRpb24pLiBJZiB5b3Ugd2FudCBpdCB0bw0KKyAgICAgICAgLy8vIHN0b3AgZWFybGllciwgeW91IHdpbGwgbmVlZCB0byB3cmFwIHRoZSBpbnB1dCBpbiBhIHdyYXBwZXINCisgICAgICAgIC8vLyBzdHJlYW0gd2hpY2ggbGltaXRzIHJlYWRpbmcuIE9yLCB1c2UgSU1lc3NhZ2UuV3JpdGVEZWxpbWl0ZWRUbyhTdHJlYW0pDQorICAgICAgICAvLy8gdG8gd3JpdGUgeW91ciBtZXNzYWdlIGFuZCBNbWVyZ2VEZWxpbWl0ZWRGcm9tKFN0cmVhbSkgdG8gcmVhZCBpdC4NCisgICAgICAgIC8vLyBEZXNwaXRlIHVzdWFsbHkgcmVhZGluZyB0aGUgZW50aXJlIHN0cmVhbSwgdGhpcyBtZXRob2QgbmV2ZXIgY2xvc2VzIHRoZSBzdHJlYW0uIA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFRCdWlsZGVyIE1lcmdlRnJvbShTdHJlYW0gaW5wdXQpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBhcnNlIDxwYXJhbXJlZiBuYW1lPSJpbnB1dCIvPiBhcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGFuZCBtZXJnZQ0KKyAgICAgICAgLy8vIGl0IHdpdGggdGhlIG1lc3NhZ2UgYmVpbmcgYnVpbHQuIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kDQorICAgICAgICAvLy8gTWVyZ2VGcm9tKElDb2RlZElucHV0U3RyZWFtLCBFeHRlbnNpb25SZWdpc3RyeSkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgVEJ1aWxkZXIgTWVyZ2VGcm9tKFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0lDb2RlZElucHV0U3RyZWFtLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvSUNvZGVkSW5wdXRTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5YjYwMgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0lDb2RlZElucHV0U3RyZWFtLmNzCkBAIC0wLDAgKzEsMzQ1IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorLy9EaXNhYmxlIHdhcm5pbmcgQ1MzMDEwOiBDTFMtY29tcGxpYW50IGludGVyZmFjZXMgbXVzdCBoYXZlIG9ubHkgQ0xTLWNvbXBsaWFudCBtZW1iZXJzDQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMzAxMA0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElDb2RlZElucHV0U3RyZWFtDQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBhbnkgbWVzc2FnZSBpbml0aWFsaXphdGlvbiBkYXRhIGV4cGVjdGVkIGZyb20gdGhlIGlucHV0IHN0cmVhbQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz4NCisgICAgICAgIC8vLyBUaGlzIGlzIHByaW1hcmlseSB1c2VkIGJ5IHRleHQgZm9ybWF0cyBhbmQgdW5uZWNlc3NhcnkgZm9yIHByb3RvYnVmZmVycycgb3duDQorICAgICAgICAvLy8gYmluYXJ5IGZvcm1hdC4gIFRoZSBBUEkgZm9yIE1lc3NhZ2VTdGFydC9FbmQgd2FzIGFkZGVkIGZvciBjb25zaXN0ZW50IGhhbmRsaW5nDQorICAgICAgICAvLy8gb2Ygb3V0cHV0IHN0cmVhbXMgcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsIHdyaXRlciBpbXBsZW1lbnRhdGlvbi4NCisgICAgICAgIC8vLyA8L3JlbWFya3M+DQorICAgICAgICB2b2lkIFJlYWRNZXNzYWdlU3RhcnQoKTsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBhbnkgbWVzc2FnZSBmaW5hbGl6YXRpb24gZGF0YSBleHBlY3RlZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+DQorICAgICAgICAvLy8gVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBieSB0ZXh0IGZvcm1hdHMgYW5kIHVubmVjZXNzYXJ5IGZvciBwcm90b2J1ZmZlcnMnIG93bg0KKyAgICAgICAgLy8vIGJpbmFyeSBmb3JtYXQuICBUaGUgQVBJIGZvciBNZXNzYWdlU3RhcnQvRW5kIHdhcyBhZGRlZCBmb3IgY29uc2lzdGVudCBoYW5kbGluZw0KKyAgICAgICAgLy8vIG9mIG91dHB1dCBzdHJlYW1zIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCB3cml0ZXIgaW1wbGVtZW50YXRpb24uDQorICAgICAgICAvLy8gPC9yZW1hcmtzPg0KKyAgICAgICAgdm9pZCBSZWFkTWVzc2FnZUVuZCgpOw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEF0dGVtcHQgdG8gcmVhZCBhIGZpZWxkIHRhZywgcmV0dXJuaW5nIGZhbHNlIGlmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kDQorICAgICAgICAvLy8gb2YgdGhlIGlucHV0IGRhdGEuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPg0KKyAgICAgICAgLy8vIDxwYXJhPg0KKyAgICAgICAgLy8vIElmIGZpZWxkVGFnIGlzIG5vbi16ZXJvIGFuZCBSZWFkVGFnIHJldHVybnMgdHJ1ZSB0aGVuIHRoZSB2YWx1ZSBpbiBmaWVsZE5hbWUNCisgICAgICAgIC8vLyBtYXkgb3IgbWF5IG5vdCBiZSBwb3B1bGF0ZWQuICBIb3dldmVyLCBpZiBmaWVsZFRhZyBpcyB6ZXJvIGFuZCBSZWFkVGFnIHJldHVybnMNCisgICAgICAgIC8vLyB0cnVlLCB0aGVuIGZpZWxkTmFtZSBzaG91bGQgYmUgcG9wdWxhdGVkIHdpdGggYSBub24tbnVsbCBmaWVsZCBuYW1lLg0KKyAgICAgICAgLy8vIDwvcGFyYT48cGFyYT4NCisgICAgICAgIC8vLyBJbiBvdGhlciB3b3JkcyBpZiBSZWFkVGFnIHJldHVybnMgdHJ1ZSB0aGVuIGVpdGhlciBmaWVsZFRhZyB3aWxsIGJlIG5vbi16ZXJvIE9SDQorICAgICAgICAvLy8gZmllbGROYW1lIHdpbGwgYmUgbm9uLXplcm8uICBJbiBzb21lIGNhc2VzIGJvdGggbWF5IGJlIHBvcHVsYXRlZCwgaG93ZXZlciB0aGUNCisgICAgICAgIC8vLyBidWlsZGVycyB3aWxsIGFsd2F5cyBwcmVmZXIgdGhlIGZpZWxkVGFnIG92ZXIgZmllbGROYW1lLg0KKyAgICAgICAgLy8vIDwvcGFyYT4NCisgICAgICAgIC8vLyA8L3JlbWFya3M+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIGJvb2wgUmVhZFRhZyhvdXQgdWludCBmaWVsZFRhZywgb3V0IHN0cmluZyBmaWVsZE5hbWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWQgYSBkb3VibGUgZmllbGQgZnJvbSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGJvb2wgUmVhZERvdWJsZShyZWYgZG91YmxlIHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkIGEgZmxvYXQgZmllbGQgZnJvbSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGJvb2wgUmVhZEZsb2F0KHJlZiBmbG9hdCB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZCBhIHVpbnQ2NCBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBib29sIFJlYWRVSW50NjQocmVmIHVsb25nIHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkIGFuIGludDY0IGZpZWxkIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBib29sIFJlYWRJbnQ2NChyZWYgbG9uZyB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZCBhbiBpbnQzMiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgYm9vbCBSZWFkSW50MzIocmVmIGludCB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZCBhIGZpeGVkNjQgZmllbGQgZnJvbSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgYm9vbCBSZWFkRml4ZWQ2NChyZWYgdWxvbmcgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWQgYSBmaXhlZDMyIGZpZWxkIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIGJvb2wgUmVhZEZpeGVkMzIocmVmIHVpbnQgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWQgYSBib29sIGZpZWxkIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBib29sIFJlYWRCb29sKHJlZiBib29sIHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBhIHN0cmluZyBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgYm9vbCBSZWFkU3RyaW5nKHJlZiBzdHJpbmcgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGEgZ3JvdXAgZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gICAgDQorICAgICAgICB2b2lkIFJlYWRHcm91cChpbnQgZmllbGROdW1iZXIsIElCdWlsZGVyTGl0ZSBidWlsZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGEgZ3JvdXAgZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtIGFuZCBtZXJnZXMgaXQgaW50byB0aGUgZ2l2ZW4NCisgICAgICAgIC8vLyBVbmtub3duRmllbGRTZXQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgIA0KKyAgICAgICAgW09ic29sZXRlXQ0KKyAgICAgICAgdm9pZCBSZWFkVW5rbm93bkdyb3VwKGludCBmaWVsZE51bWJlciwgSUJ1aWxkZXJMaXRlIGJ1aWxkZXIpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGFuIGVtYmVkZGVkIG1lc3NhZ2UgZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gICANCisgICAgICAgIHZvaWQgUmVhZE1lc3NhZ2UoSUJ1aWxkZXJMaXRlIGJ1aWxkZXIsIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBhIGJ5dGVzIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+ICAgDQorICAgICAgICBib29sIFJlYWRCeXRlcyhyZWYgQnl0ZVN0cmluZyB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYSB1aW50MzIgZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gICANCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgYm9vbCBSZWFkVUludDMyKHJlZiB1aW50IHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBhbiBlbnVtIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQ0KKyAgICAgICAgLy8vIGZvciBjb252ZXJ0aW5nIHRoZSBudW1lcmljIHZhbHVlIHRvIGFuIGFjdHVhbCBlbnVtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gICANCisgICAgICAgIGJvb2wgUmVhZEVudW0ocmVmIElFbnVtTGl0ZSB2YWx1ZSwgb3V0IG9iamVjdCB1bmtub3duLCBJRW51bUxpdGVNYXAgbWFwcGluZyk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYW4gZW51bSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uIElmIHRoZSBlbnVtIGlzIHZhbGlkIGZvciB0eXBlIFQsDQorICAgICAgICAvLy8gdGhlbiB0aGUgcmVmIHZhbHVlIGlzIHNldCBhbmQgaXQgcmV0dXJucyB0cnVlLiAgT3RoZXJ3aXNlIHRoZSB1bmtvd24gb3V0cHV0DQorICAgICAgICAvLy8gdmFsdWUgaXMgc2V0IGFuZCB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gICANCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgYm9vbCBSZWFkRW51bTxUPihyZWYgVCB2YWx1ZSwgb3V0IG9iamVjdCB1bmtub3duKQ0KKyAgICAgICAgICAgIHdoZXJlIFQgOiBzdHJ1Y3QsIElDb21wYXJhYmxlLCBJRm9ybWF0dGFibGU7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYW4gc2ZpeGVkMzIgZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gICANCisgICAgICAgIGJvb2wgUmVhZFNGaXhlZDMyKHJlZiBpbnQgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGFuIHNmaXhlZDY0IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+ICAgDQorICAgICAgICBib29sIFJlYWRTRml4ZWQ2NChyZWYgbG9uZyB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYW4gc2ludDMyIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+ICAgDQorICAgICAgICBib29sIFJlYWRTSW50MzIocmVmIGludCB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYW4gc2ludDY0IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+ICAgDQorICAgICAgICBib29sIFJlYWRTSW50NjQocmVmIGxvbmcgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGFuIGFycmF5IG9mIHByaW1pdGl2ZSB2YWx1ZXMgaW50byB0aGUgbGlzdCwgaWYgdGhlIHdpcmUtdHlwZSBvZiBmaWVsZFRhZyBpcyBsZW5ndGgtcHJlZml4ZWQgYW5kIHRoZSANCisgICAgICAgIC8vLyB0eXBlIGlzIG51bWVyaWMsIGl0IHdpbGwgcmVhZCBhIHBhY2tlZCBhcnJheS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHZvaWQgUmVhZFByaW1pdGl2ZUFycmF5KEZpZWxkVHlwZSBmaWVsZFR5cGUsIHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPG9iamVjdD4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYW4gYXJyYXkgb2YgcHJpbWl0aXZlIHZhbHVlcyBpbnRvIHRoZSBsaXN0LCBpZiB0aGUgd2lyZS10eXBlIG9mIGZpZWxkVGFnIGlzIGxlbmd0aC1wcmVmaXhlZCwgaXQgd2lsbA0KKyAgICAgICAgLy8vIHJlYWQgYSBwYWNrZWQgYXJyYXkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICB2b2lkIFJlYWRFbnVtQXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248SUVudW1MaXRlPiBsaXN0LCBvdXQgSUNvbGxlY3Rpb248b2JqZWN0PiB1bmtub3duLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbnVtTGl0ZU1hcCBtYXBwaW5nKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBhbiBhcnJheSBvZiBwcmltaXRpdmUgdmFsdWVzIGludG8gdGhlIGxpc3QsIGlmIHRoZSB3aXJlLXR5cGUgb2YgZmllbGRUYWcgaXMgbGVuZ3RoLXByZWZpeGVkLCBpdCB3aWxsDQorICAgICAgICAvLy8gcmVhZCBhIHBhY2tlZCBhcnJheS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHZvaWQgUmVhZEVudW1BcnJheTxUPih1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxUPiBsaXN0LCBvdXQgSUNvbGxlY3Rpb248b2JqZWN0PiB1bmtub3duKQ0KKyAgICAgICAgICAgIHdoZXJlIFQgOiBzdHJ1Y3QsIElDb21wYXJhYmxlLCBJRm9ybWF0dGFibGU7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYSBzZXQgb2YgbWVzc2FnZXMgdXNpbmcgdGhlIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlVHlwZSIvPiBhcyBhIHRlbXBsYXRlLiAgVCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSANCisgICAgICAgIC8vLyB0aGUgbW9zdCBkZXJpdmVkIHR5cGUsIGl0IGlzIG9ubHkgdGhlIHR5cGUgc3BlY2lmaWVyIGZvciB0aGUgY29sbGVjdGlvbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHZvaWQgUmVhZE1lc3NhZ2VBcnJheTxUPih1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxUPiBsaXN0LCBUIG1lc3NhZ2VUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB3aGVyZSBUIDogSU1lc3NhZ2VMaXRlOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIGEgc2V0IG9mIG1lc3NhZ2VzIHVzaW5nIHRoZSA8cGFyYW1yZWYgbmFtZT0ibWVzc2FnZVR5cGUiLz4gYXMgYSB0ZW1wbGF0ZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHZvaWQgUmVhZEdyb3VwQXJyYXk8VD4odWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248VD4gbGlzdCwgVCBtZXNzYWdlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHdoZXJlIFQgOiBJTWVzc2FnZUxpdGU7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYSBmaWVsZCBvZiBhbnkgcHJpbWl0aXZlIHR5cGUuIEVudW1zLCBncm91cHMgYW5kIGVtYmVkZGVkDQorICAgICAgICAvLy8gbWVzc2FnZXMgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoaXMgbWV0aG9kLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGJvb2wgUmVhZFByaW1pdGl2ZUZpZWxkKEZpZWxkVHlwZSBmaWVsZFR5cGUsIHJlZiBvYmplY3QgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyZWFtIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIHRoZQ0KKyAgICAgICAgLy8vIGNhc2UgaWYgZWl0aGVyIHRoZSBlbmQgb2YgdGhlIHVuZGVybHlpbmcgaW5wdXQgc291cmNlIGhhcyBiZWVuIHJlYWNoZWQgb3INCisgICAgICAgIC8vLyB0aGUgc3RyZWFtIGhhcyByZWFjaGVkIGEgbGltaXQgY3JlYXRlZCB1c2luZyBQdXNoTGltaXQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgYm9vbCBJc0F0RW5kIHsgZ2V0OyB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgYW5kIGRpc2NhcmRzIGEgc2luZ2xlIGZpZWxkLCBnaXZlbiBpdHMgdGFnIHZhbHVlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cmV0dXJucz5mYWxzZSBpZiB0aGUgdGFnIGlzIGFuIGVuZC1ncm91cCB0YWcsIGluIHdoaWNoIGNhc2UNCisgICAgICAgIC8vLyBub3RoaW5nIGlzIHNraXBwZWQuIE90aGVyd2lzZSwgcmV0dXJucyB0cnVlLjwvcmV0dXJucz4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgYm9vbCBTa2lwRmllbGQoKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBvbmUgb3IgbW9yZSByZXBlYXRlZCBzdHJpbmcgZmllbGQgdmFsdWVzIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+ICAgDQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHZvaWQgUmVhZFN0cmluZ0FycmF5KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPHN0cmluZz4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgb25lIG9yIG1vcmUgcmVwZWF0ZWQgQnl0ZVN0cmluZyBmaWVsZCB2YWx1ZXMgZnJvbSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gICANCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgdm9pZCBSZWFkQnl0ZXNBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxCeXRlU3RyaW5nPiBsaXN0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBvbmUgb3IgbW9yZSByZXBlYXRlZCBib29sZWFuIGZpZWxkIHZhbHVlcyBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICB2b2lkIFJlYWRCb29sQXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248Ym9vbD4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgb25lIG9yIG1vcmUgcmVwZWF0ZWQgSW50MzIgZmllbGQgdmFsdWVzIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHZvaWQgUmVhZEludDMyQXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248aW50PiBsaXN0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBvbmUgb3IgbW9yZSByZXBlYXRlZCBTSW50MzIgZmllbGQgdmFsdWVzIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHZvaWQgUmVhZFNJbnQzMkFycmF5KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPGludD4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgb25lIG9yIG1vcmUgcmVwZWF0ZWQgVUludDMyIGZpZWxkIHZhbHVlcyBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICB2b2lkIFJlYWRVSW50MzJBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjx1aW50PiBsaXN0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBvbmUgb3IgbW9yZSByZXBlYXRlZCBGaXhlZDMyIGZpZWxkIHZhbHVlcyBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICB2b2lkIFJlYWRGaXhlZDMyQXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248dWludD4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgb25lIG9yIG1vcmUgcmVwZWF0ZWQgU0ZpeGVkMzIgZmllbGQgdmFsdWVzIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHZvaWQgUmVhZFNGaXhlZDMyQXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248aW50PiBsaXN0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBvbmUgb3IgbW9yZSByZXBlYXRlZCBJbnQ2NCBmaWVsZCB2YWx1ZXMgZnJvbSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgdm9pZCBSZWFkSW50NjRBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxsb25nPiBsaXN0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWFkcyBvbmUgb3IgbW9yZSByZXBlYXRlZCBTSW50NjQgZmllbGQgdmFsdWVzIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHZvaWQgUmVhZFNJbnQ2NEFycmF5KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPGxvbmc+IGxpc3QpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIG9uZSBvciBtb3JlIHJlcGVhdGVkIFVJbnQ2NCBmaWVsZCB2YWx1ZXMgZnJvbSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgdm9pZCBSZWFkVUludDY0QXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248dWxvbmc+IGxpc3QpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIG9uZSBvciBtb3JlIHJlcGVhdGVkIEZpeGVkNjQgZmllbGQgdmFsdWVzIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHZvaWQgUmVhZEZpeGVkNjRBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjx1bG9uZz4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgb25lIG9yIG1vcmUgcmVwZWF0ZWQgU0ZpeGVkNjQgZmllbGQgdmFsdWVzIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHZvaWQgUmVhZFNGaXhlZDY0QXJyYXkodWludCBmaWVsZFRhZywgc3RyaW5nIGZpZWxkTmFtZSwgSUNvbGxlY3Rpb248bG9uZz4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVhZHMgb25lIG9yIG1vcmUgcmVwZWF0ZWQgRG91YmxlIGZpZWxkIHZhbHVlcyBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICB2b2lkIFJlYWREb3VibGVBcnJheSh1aW50IGZpZWxkVGFnLCBzdHJpbmcgZmllbGROYW1lLCBJQ29sbGVjdGlvbjxkb3VibGU+IGxpc3QpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlYWRzIG9uZSBvciBtb3JlIHJlcGVhdGVkIEZsb2F0IGZpZWxkIHZhbHVlcyBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICB2b2lkIFJlYWRGbG9hdEFycmF5KHVpbnQgZmllbGRUYWcsIHN0cmluZyBmaWVsZE5hbWUsIElDb2xsZWN0aW9uPGZsb2F0PiBsaXN0KTsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9JQ29kZWRPdXRwdXRTdHJlYW0uY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9JQ29kZWRPdXRwdXRTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjODA2NQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0lDb2RlZE91dHB1dFN0cmVhbS5jcwpAQCAtMCwwICsxLDM3NCBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCisvL0Rpc2FibGUgd2FybmluZyBDUzMwMTA6IENMUy1jb21wbGlhbnQgaW50ZXJmYWNlcyBtdXN0IGhhdmUgb25seSBDTFMtY29tcGxpYW50IG1lbWJlcnMNCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAzMDEwDQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFByb3ZpZGVzIGFuIGludGVyZmFjZSB0aGF0IGlzIHVzZWQgd3JpdGUgYSBtZXNzYWdlLiAgTW9zdCBvZnRlbiBwcm90byBidWZmZXJzIGFyZSB3cml0dGVuDQorICAgIC8vLyBpbiB0aGVpciBiaW5hcnkgZm9ybSBieSBjcmVhdGluZyBhIGluc3RhbmNlIHZpYSB0aGUgQ29kZWRPdXRwdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UNCisgICAgLy8vIHN0YXRpYyBmYWN0b3J5Lg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElDb2RlZE91dHB1dFN0cmVhbQ0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGFueSBtZXNzYWdlIGluaXRpYWxpemF0aW9uIGRhdGEgbmVlZGVkIHRvIHRoZSBvdXRwdXQgc3RyZWFtDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPg0KKyAgICAgICAgLy8vIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgYnkgdGV4dCBmb3JtYXRzIGFuZCB1bm5lY2Vzc2FyeSBmb3IgcHJvdG9idWZmZXJzJyBvd24NCisgICAgICAgIC8vLyBiaW5hcnkgZm9ybWF0LiAgVGhlIEFQSSBmb3IgTWVzc2FnZVN0YXJ0L0VuZCB3YXMgYWRkZWQgZm9yIGNvbnNpc3RlbnQgaGFuZGxpbmcNCisgICAgICAgIC8vLyBvZiBvdXRwdXQgc3RyZWFtcyByZWdhcmRsZXNzIG9mIHRoZSBhY3R1YWwgd3JpdGVyIGltcGxlbWVudGF0aW9uLg0KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4NCisgICAgICAgIHZvaWQgV3JpdGVNZXNzYWdlU3RhcnQoKTsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYW55IG1lc3NhZ2UgZmluYWxpemF0aW9uIGRhdGEgbmVlZGVkIHRvIHRoZSBvdXRwdXQgc3RyZWFtDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPg0KKyAgICAgICAgLy8vIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgYnkgdGV4dCBmb3JtYXRzIGFuZCB1bm5lY2Vzc2FyeSBmb3IgcHJvdG9idWZmZXJzJyBvd24NCisgICAgICAgIC8vLyBiaW5hcnkgZm9ybWF0LiAgVGhlIEFQSSBmb3IgTWVzc2FnZVN0YXJ0L0VuZCB3YXMgYWRkZWQgZm9yIGNvbnNpc3RlbnQgaGFuZGxpbmcNCisgICAgICAgIC8vLyBvZiBvdXRwdXQgc3RyZWFtcyByZWdhcmRsZXNzIG9mIHRoZSBhY3R1YWwgd3JpdGVyIGltcGxlbWVudGF0aW9uLg0KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4NCisgICAgICAgIHZvaWQgV3JpdGVNZXNzYWdlRW5kKCk7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSW5kaWNhdGVzIHRoYXQgYWxsIHRlbXBvcmFyeSBidWZmZXJzIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbmFsIG91dHB1dC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIEZsdXNoKCk7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGFuIHVua25vd24gbWVzc2FnZSBhcyBhIGdyb3VwDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW09ic29sZXRlXQ0KKyAgICAgICAgdm9pZCBXcml0ZVVua25vd25Hcm91cChpbnQgZmllbGROdW1iZXIsIElNZXNzYWdlTGl0ZSB2YWx1ZSk7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGFuIHVua25vd24gZmllbGQgdmFsdWUgb2YgYnl0ZXMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlVW5rbm93bkJ5dGVzKGludCBmaWVsZE51bWJlciwgQnl0ZVN0cmluZyB2YWx1ZSk7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGFuIHVua25vd24gZmllbGQgb2YgYSBwcmltaXRpdmUgdHlwZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgdm9pZCBXcml0ZVVua25vd25GaWVsZChpbnQgZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUgd2lyZVR5cGUsIHVsb25nIHZhbHVlKTsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYW4gZXh0ZW5zaW9uIGFzIGEgbWVzc2FnZS1zZXQgZ3JvdXANCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlTWVzc2FnZVNldEV4dGVuc2lvbihpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElNZXNzYWdlTGl0ZSB2YWx1ZSk7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGFuIHVua25vd24gZXh0ZW5zaW9uIGFzIGEgbWVzc2FnZS1zZXQgZ3JvdXANCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlTWVzc2FnZVNldEV4dGVuc2lvbihpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIEJ5dGVTdHJpbmcgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIGZpZWxkIHZhbHVlLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgV3JpdGVGaWVsZChGaWVsZFR5cGUgZmllbGRUeXBlLCBpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIG9iamVjdCB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgZG91YmxlIGZpZWxkIHZhbHVlLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgV3JpdGVEb3VibGUoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBkb3VibGUgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIGZsb2F0IGZpZWxkIHZhbHVlLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgV3JpdGVGbG9hdChpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGZsb2F0IHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSB1aW50NjQgZmllbGQgdmFsdWUsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICB2b2lkIFdyaXRlVUludDY0KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgdWxvbmcgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhbiBpbnQ2NCBmaWVsZCB2YWx1ZSwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlSW50NjQoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBsb25nIHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYW4gaW50MzIgZmllbGQgdmFsdWUsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBXcml0ZUludDMyKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBmaXhlZDY0IGZpZWxkIHZhbHVlLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgdm9pZCBXcml0ZUZpeGVkNjQoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCB1bG9uZyB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgZml4ZWQzMiBmaWVsZCB2YWx1ZSwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHZvaWQgV3JpdGVGaXhlZDMyKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgdWludCB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgYm9vbCBmaWVsZCB2YWx1ZSwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlQm9vbChpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGJvb2wgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHN0cmluZyBmaWVsZCB2YWx1ZSwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlU3RyaW5nKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgc3RyaW5nIHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBncm91cCBmaWVsZCB2YWx1ZSwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlR3JvdXAoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJTWVzc2FnZUxpdGUgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIG1lc3NhZ2UgZmllbGQgdmFsdWUsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBXcml0ZU1lc3NhZ2UoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJTWVzc2FnZUxpdGUgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIGJ5dGUgYXJyYXkgZmllbGQgdmFsdWUsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBXcml0ZUJ5dGVzKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgQnl0ZVN0cmluZyB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgVUludDMyIGZpZWxkIHZhbHVlLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgdm9pZCBXcml0ZVVJbnQzMihpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIHVpbnQgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhbiBlbnVtIGZpZWxkIHZhbHVlLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgV3JpdGVFbnVtKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IHZhbHVlLCBvYmplY3QgcmF3VmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIGZpeGVkIDMyLWJpdCBmaWVsZCB2YWx1ZSwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlU0ZpeGVkMzIoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgdmFsdWUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHNpZ25lZCBmaXhlZCA2NC1iaXQgZmllbGQgdmFsdWUsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBXcml0ZVNGaXhlZDY0KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgbG9uZyB2YWx1ZSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgc2lnbmVkIDMyLWJpdCBmaWVsZCB2YWx1ZSwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlU0ludDMyKGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBzaWduZWQgNjQtYml0IGZpZWxkIHZhbHVlLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgV3JpdGVTSW50NjQoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBsb25nIHZhbHVlKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSByZXBlYXRlZCBmaWVsZCB2YWx1ZSwgaW5jbHVkaW5nIHRhZyhzKSwgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlQXJyYXkoRmllbGRUeXBlIGZpZWxkVHlwZSwgaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZSBsaXN0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSByZXBlYXRlZCBncm91cCB2YWx1ZSwgaW5jbHVkaW5nIHRhZyhzKSwgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlR3JvdXBBcnJheTxUPihpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPFQ+IGxpc3QpDQorICAgICAgICAgICAgd2hlcmUgVCA6IElNZXNzYWdlTGl0ZTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSByZXBlYXRlZCBtZXNzYWdlIHZhbHVlLCBpbmNsdWRpbmcgdGFnKHMpLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgV3JpdGVNZXNzYWdlQXJyYXk8VD4oaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxUPiBsaXN0KQ0KKyAgICAgICAgICAgIHdoZXJlIFQgOiBJTWVzc2FnZUxpdGU7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgcmVwZWF0ZWQgc3RyaW5nIHZhbHVlLCBpbmNsdWRpbmcgdGFnKHMpLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgV3JpdGVTdHJpbmdBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPHN0cmluZz4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgcmVwZWF0ZWQgQnl0ZVN0cmluZyB2YWx1ZSwgaW5jbHVkaW5nIHRhZyhzKSwgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlQnl0ZXNBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPEJ5dGVTdHJpbmc+IGxpc3QpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHJlcGVhdGVkIGJvb2xlYW4gdmFsdWUsIGluY2x1ZGluZyB0YWcocyksIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBXcml0ZUJvb2xBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPGJvb2w+IGxpc3QpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHJlcGVhdGVkIEludDMyIHZhbHVlLCBpbmNsdWRpbmcgdGFnKHMpLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgV3JpdGVJbnQzMkFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGU8aW50PiBsaXN0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSByZXBlYXRlZCBTSW50MzIgdmFsdWUsIGluY2x1ZGluZyB0YWcocyksIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBXcml0ZVNJbnQzMkFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGU8aW50PiBsaXN0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSByZXBlYXRlZCBVSW50MzIgdmFsdWUsIGluY2x1ZGluZyB0YWcocyksIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBXcml0ZVVJbnQzMkFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGU8dWludD4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgcmVwZWF0ZWQgRml4ZWQzMiB2YWx1ZSwgaW5jbHVkaW5nIHRhZyhzKSwgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlRml4ZWQzMkFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGU8dWludD4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgcmVwZWF0ZWQgU0ZpeGVkMzIgdmFsdWUsIGluY2x1ZGluZyB0YWcocyksIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBXcml0ZVNGaXhlZDMyQXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxpbnQ+IGxpc3QpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHJlcGVhdGVkIEludDY0IHZhbHVlLCBpbmNsdWRpbmcgdGFnKHMpLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgV3JpdGVJbnQ2NEFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGU8bG9uZz4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgcmVwZWF0ZWQgU0ludDY0IHZhbHVlLCBpbmNsdWRpbmcgdGFnKHMpLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgV3JpdGVTSW50NjRBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPGxvbmc+IGxpc3QpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHJlcGVhdGVkIFVJbnQ2NCB2YWx1ZSwgaW5jbHVkaW5nIHRhZyhzKSwgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlVUludDY0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTx1bG9uZz4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgcmVwZWF0ZWQgRml4ZWQ2NCB2YWx1ZSwgaW5jbHVkaW5nIHRhZyhzKSwgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlRml4ZWQ2NEFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGU8dWxvbmc+IGxpc3QpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHJlcGVhdGVkIFNGaXhlZDY0IHZhbHVlLCBpbmNsdWRpbmcgdGFnKHMpLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgV3JpdGVTRml4ZWQ2NEFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGU8bG9uZz4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgcmVwZWF0ZWQgRG91YmxlIHZhbHVlLCBpbmNsdWRpbmcgdGFnKHMpLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgV3JpdGVEb3VibGVBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPGRvdWJsZT4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgcmVwZWF0ZWQgRmxvYXQgdmFsdWUsIGluY2x1ZGluZyB0YWcocyksIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBXcml0ZUZsb2F0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBJRW51bWVyYWJsZTxmbG9hdD4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgcmVwZWF0ZWQgZW51bWVyYXRpb24gdmFsdWUgb2YgdHlwZSBULCBpbmNsdWRpbmcgdGFnKHMpLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgdm9pZCBXcml0ZUVudW1BcnJheTxUPihpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIElFbnVtZXJhYmxlPFQ+IGxpc3QpDQorICAgICAgICAgICAgd2hlcmUgVCA6IHN0cnVjdCwgSUNvbXBhcmFibGUsIElGb3JtYXR0YWJsZTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBwYWNrZWQgcmVwZWF0ZWQgcHJpbWl0aXZlLCBpbmNsdWRpbmcgdGFnIGFuZCBsZW5ndGgsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBXcml0ZVBhY2tlZEFycmF5KEZpZWxkVHlwZSBmaWVsZFR5cGUsIGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgSUVudW1lcmFibGUgbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgcGFja2VkIHJlcGVhdGVkIGJvb2xlYW4sIGluY2x1ZGluZyB0YWcgYW5kIGxlbmd0aCwgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlUGFja2VkQm9vbEFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IGNhbGN1bGF0ZWRTaXplLCBJRW51bWVyYWJsZTxib29sPiBsaXN0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBwYWNrZWQgcmVwZWF0ZWQgSW50MzIsIGluY2x1ZGluZyB0YWcgYW5kIGxlbmd0aCwgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlUGFja2VkSW50MzJBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjYWxjdWxhdGVkU2l6ZSwgSUVudW1lcmFibGU8aW50PiBsaXN0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBwYWNrZWQgcmVwZWF0ZWQgU0ludDMyLCBpbmNsdWRpbmcgdGFnIGFuZCBsZW5ndGgsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBXcml0ZVBhY2tlZFNJbnQzMkFycmF5KGludCBmaWVsZE51bWJlciwgc3RyaW5nIGZpZWxkTmFtZSwgaW50IGNhbGN1bGF0ZWRTaXplLCBJRW51bWVyYWJsZTxpbnQ+IGxpc3QpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHBhY2tlZCByZXBlYXRlZCBVSW50MzIsIGluY2x1ZGluZyB0YWcgYW5kIGxlbmd0aCwgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlUGFja2VkVUludDMyQXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY2FsY3VsYXRlZFNpemUsIElFbnVtZXJhYmxlPHVpbnQ+IGxpc3QpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHBhY2tlZCByZXBlYXRlZCBGaXhlZDMyLCBpbmNsdWRpbmcgdGFnIGFuZCBsZW5ndGgsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBXcml0ZVBhY2tlZEZpeGVkMzJBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjYWxjdWxhdGVkU2l6ZSwgSUVudW1lcmFibGU8dWludD4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgcGFja2VkIHJlcGVhdGVkIFNGaXhlZDMyLCBpbmNsdWRpbmcgdGFnIGFuZCBsZW5ndGgsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBXcml0ZVBhY2tlZFNGaXhlZDMyQXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY2FsY3VsYXRlZFNpemUsIElFbnVtZXJhYmxlPGludD4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgcGFja2VkIHJlcGVhdGVkIEludDY0LCBpbmNsdWRpbmcgdGFnIGFuZCBsZW5ndGgsIHRvIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBXcml0ZVBhY2tlZEludDY0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY2FsY3VsYXRlZFNpemUsIElFbnVtZXJhYmxlPGxvbmc+IGxpc3QpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHBhY2tlZCByZXBlYXRlZCBTSW50NjQsIGluY2x1ZGluZyB0YWcgYW5kIGxlbmd0aCwgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlUGFja2VkU0ludDY0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY2FsY3VsYXRlZFNpemUsIElFbnVtZXJhYmxlPGxvbmc+IGxpc3QpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHBhY2tlZCByZXBlYXRlZCBVSW50NjQsIGluY2x1ZGluZyB0YWcgYW5kIGxlbmd0aCwgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlUGFja2VkVUludDY0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY2FsY3VsYXRlZFNpemUsIElFbnVtZXJhYmxlPHVsb25nPiBsaXN0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBwYWNrZWQgcmVwZWF0ZWQgRml4ZWQ2NCwgaW5jbHVkaW5nIHRhZyBhbmQgbGVuZ3RoLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgV3JpdGVQYWNrZWRGaXhlZDY0QXJyYXkoaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY2FsY3VsYXRlZFNpemUsIElFbnVtZXJhYmxlPHVsb25nPiBsaXN0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBwYWNrZWQgcmVwZWF0ZWQgU0ZpeGVkNjQsIGluY2x1ZGluZyB0YWcgYW5kIGxlbmd0aCwgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlUGFja2VkU0ZpeGVkNjRBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjYWxjdWxhdGVkU2l6ZSwgSUVudW1lcmFibGU8bG9uZz4gbGlzdCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgcGFja2VkIHJlcGVhdGVkIERvdWJsZSwgaW5jbHVkaW5nIHRhZyBhbmQgbGVuZ3RoLCB0byB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgV3JpdGVQYWNrZWREb3VibGVBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjYWxjdWxhdGVkU2l6ZSwgSUVudW1lcmFibGU8ZG91YmxlPiBsaXN0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBXcml0ZXMgYSBwYWNrZWQgcmVwZWF0ZWQgRmxvYXQsIGluY2x1ZGluZyB0YWcgYW5kIGxlbmd0aCwgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFdyaXRlUGFja2VkRmxvYXRBcnJheShpbnQgZmllbGROdW1iZXIsIHN0cmluZyBmaWVsZE5hbWUsIGludCBjYWxjdWxhdGVkU2l6ZSwgSUVudW1lcmFibGU8ZmxvYXQ+IGxpc3QpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHBhY2tlZCByZXBlYXRlZCBlbnVtZXJhdGlvbiBvZiB0eXBlIFQsIGluY2x1ZGluZyB0YWcgYW5kIGxlbmd0aCwgdG8gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHZvaWQgV3JpdGVQYWNrZWRFbnVtQXJyYXk8VD4oaW50IGZpZWxkTnVtYmVyLCBzdHJpbmcgZmllbGROYW1lLCBpbnQgY2FsY3VsYXRlZFNpemUsIElFbnVtZXJhYmxlPFQ+IGxpc3QpDQorICAgICAgICAgICAgd2hlcmUgVCA6IHN0cnVjdCwgSUNvbXBhcmFibGUsIElGb3JtYXR0YWJsZTsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9JTWVzc2FnZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0lNZXNzYWdlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyM2JjM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9JTWVzc2FnZS5jcwpAQCAtMCwwICsxLDI0OSBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gTm9uLWdlbmVyaWMgaW50ZXJmYWNlIHVzZWQgZm9yIGFsbCBwYXJ0cyBvZiB0aGUgQVBJIHdoaWNoIGRvbid0IHJlcXVpcmUNCisgICAgLy8vIGFueSB0eXBlIGtub3dsZWRnZS4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIGludGVyZmFjZSBJTWVzc2FnZSA6IElNZXNzYWdlTGl0ZQ0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0aGUgbWVzc2FnZSdzIHR5cGUncyBkZXNjcmlwdG9yLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUNCisgICAgICAgIC8vLyBEZXNjcmlwdG9yIHByb3BlcnR5IG9mIGVhY2ggZ2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3MgaW4gdGhhdCB0aGlzDQorICAgICAgICAvLy8gbWV0aG9kIGlzIGFuIGFic3RyYWN0IG1ldGhvZCBvZiBJTWVzc2FnZSB3aGVyZWFzIERlc2NyaXB0b3IgaXMNCisgICAgICAgIC8vLyBhIHN0YXRpYyBwcm9wZXJ0eSBvZiBhIHNwZWNpZmljIGNsYXNzLiBUaGV5IHJldHVybiB0aGUgc2FtZSB0aGluZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7IGdldDsgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIGFsbCB0aGUgZmllbGRzIGluIHRoaXMgbWVzc2FnZSB3aGljaCBhcmUgc2V0DQorICAgICAgICAvLy8gYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiAgQSBzaW5ndWxhciAoInJlcXVpcmVkIiBvciAib3B0aW9uYWwiKQ0KKyAgICAgICAgLy8vIGZpZWxkIGlzIHNldCBpZmYgSGFzRmllbGQoKSByZXR1cm5zIHRydWUgZm9yIHRoYXQgZmllbGQuICBBICJyZXBlYXRlZCINCisgICAgICAgIC8vLyBmaWVsZCBpcyBzZXQgaWZmIEdldFJlcGVhdGVkRmllbGRTaXplKCkgaXMgZ3JlYXRlciB0aGFuIHplcm8uICBUaGUNCisgICAgICAgIC8vLyB2YWx1ZXMgYXJlIGV4YWN0bHkgd2hhdCB3b3VsZCBiZSByZXR1cm5lZCBieSBjYWxsaW5nDQorICAgICAgICAvLy8gR2V0RmllbGQoRmllbGREZXNjcmlwdG9yKSBmb3IgZWFjaCBmaWVsZC4gIFRoZSBtYXANCisgICAgICAgIC8vLyBpcyBndWFyYW50ZWVkIHRvIGJlIGEgc29ydGVkIG1hcCwgc28gaXRlcmF0aW5nIG92ZXIgaXQgd2lsbCByZXR1cm4gZmllbGRzDQorICAgICAgICAvLy8gaW4gb3JkZXIgYnkgZmllbGQgbnVtYmVyLiANCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBJRGljdGlvbmFyeTxGaWVsZERlc2NyaXB0b3IsIG9iamVjdD4gQWxsRmllbGRzIHsgZ2V0OyB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBmaWVsZCBpcyBzZXQuIFRoaXMgaXMgZXhhY3RseSBlcXVpdmFsZW50DQorICAgICAgICAvLy8gdG8gY2FsbGluZyB0aGUgZ2VuZXJhdGVkICJIYXMiIHByb3BlcnR5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj50aGUgZmllbGQgaXMgYSByZXBlYXRlZCBmaWVsZCwNCisgICAgICAgIC8vLyBvciBpdCdzIG5vdCBhIGZpZWxkIG9mIHRoaXMgdHlwZTwvZXhjZXB0aW9uPg0KKyAgICAgICAgYm9vbCBIYXNGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE9idGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCwgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYNCisgICAgICAgIC8vLyBpdCBpc24ndCBzZXQuIEZvciB2YWx1ZSB0eXBlIGZpZWxkcywgdGhlIGJveGVkIHZhbHVlIGlzIHJldHVybmVkLg0KKyAgICAgICAgLy8vIEZvciBlbnVtIGZpZWxkcywgdGhlIEVudW1WYWx1ZURlc2NyaXB0b3IgZm9yIHRoZSBlbnVtIGlzIHJldHVybmVkLg0KKyAgICAgICAgLy8vIEZvciBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkcywgdGhlIHN1Yi1tZXNzYWdlDQorICAgICAgICAvLy8gaXMgcmV0dXJuZWQuIEZvciByZXBlYXRlZCBmaWVsZHMsIGFuIElMaXN0Jmx0O1QmZ3Q7IGlzIHJldHVybmVkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIG9iamVjdCB0aGlzW0ZpZWxkRGVzY3JpcHRvciBmaWVsZF0geyBnZXQ7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgYSByZXBlYXRlZCBmaWVsZC4gVGhpcyBpcw0KKyAgICAgICAgLy8vIGV4YWN0bHkgZXF1aXZhbGVudCB0byBjYWxsaW5nIHRoZSBnZW5lcmF0ZWQgIkNvdW50IiBwcm9wZXJ0eQ0KKyAgICAgICAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj50aGUgZmllbGQgaXMgbm90IGEgcmVwZWF0ZWQgZmllbGQsDQorICAgICAgICAvLy8gb3IgaXQncyBub3QgYSBmaWVsZCBvZiB0aGlzIHR5cGU8L2V4Y2VwdGlvbj4NCisgICAgICAgIGludCBHZXRSZXBlYXRlZEZpZWxkQ291bnQoRmllbGREZXNjcmlwdG9yIGZpZWxkKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzIGFuIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBmaWVsZC4gRm9yIHZhbHVlIHR5cGUgZmllbGRzIA0KKyAgICAgICAgLy8vIGV4Y2x1ZGluZyBlbnVtcywgdGhlIGJveGVkIHZhbHVlIGlzIHJldHVybmVkLiBGb3IgZW1iZWRkZWQNCisgICAgICAgIC8vLyBtZXNzYWdlIGZpZWxkcywgdGhlIHN1Yi1tZXNzYWdlIGlzIHJldHVybmVkLiBGb3IgZW51bXMsIHRoZQ0KKyAgICAgICAgLy8vIHJlbGV2YW50IEVudW1WYWx1ZURlc2NyaXB0b3IgaXMgcmV0dXJuZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPnRoZSBmaWVsZCBpcyBub3QgYSByZXBlYXRlZCBmaWVsZCwNCisgICAgICAgIC8vLyBvciBpdCdzIG5vdCBhIGZpZWxkIG9mIHRoaXMgdHlwZTwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj50aGUgaW5kZXggaXMgb3V0IG9mDQorICAgICAgICAvLy8gcmFuZ2UgZm9yIHRoZSByZXBlYXRlZCBmaWVsZCdzIHZhbHVlPC9leGNlcHRpb24+DQorICAgICAgICBvYmplY3QgdGhpc1tGaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBpbmRleF0geyBnZXQ7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSB1bmtub3duIGZpZWxkcyBmb3IgdGhpcyBtZXNzYWdlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFVua25vd25GaWVsZFNldCBVbmtub3duRmllbGRzIHsgZ2V0OyB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmZiBhbGwgcmVxdWlyZWQgZmllbGRzIGluIHRoZSBtZXNzYWdlIGFuZCBhbGwgZW1iZWRkZWQNCisgICAgICAgIC8vLyBtZXNzYWdlcyBhcmUgc2V0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIG5ldyBib29sIElzSW5pdGlhbGl6ZWQgeyBnZXQ7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIGFuZCB3cml0ZXMgaXQgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uDQorICAgICAgICAvLy8gVGhpcyBkb2VzIG5vdCBmbHVzaCBvciBjbG9zZSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz4NCisgICAgICAgIC8vLyBQcm90b2NvbCBCdWZmZXJzIGFyZSBub3Qgc2VsZi1kZWxpbWl0aW5nLiBUaGVyZWZvcmUsIGlmIHlvdSB3cml0ZQ0KKyAgICAgICAgLy8vIGFueSBtb3JlIGRhdGEgdG8gdGhlIHN0cmVhbSBhZnRlciB0aGUgbWVzc2FnZSwgeW91IG11c3Qgc29tZWhvdyBlbnN1cmUNCisgICAgICAgIC8vLyB0aGF0IHRoZSBwYXJzZXIgb24gdGhlIHJlY2VpdmluZyBlbmQgZG9lcyBub3QgaW50ZXJwcmV0IHRoaXMgYXMgYmVpbmcNCisgICAgICAgIC8vLyBwYXJ0IG9mIHRoZSBwcm90b2NvbCBtZXNzYWdlLiBPbmUgd2F5IG9mIGRvaW5nIHRoaXMgaXMgYnkgd3JpdGluZyB0aGUgc2l6ZQ0KKyAgICAgICAgLy8vIG9mIHRoZSBtZXNzYWdlIGJlZm9yZSB0aGUgZGF0YSwgdGhlbiBtYWtpbmcgc3VyZSB5b3UgbGltaXQgdGhlIGlucHV0IHRvDQorICAgICAgICAvLy8gdGhhdCBzaXplIHdoZW4gcmVjZWl2aW5nIHRoZSBkYXRhLiBBbHRlcm5hdGl2ZWx5LCB1c2UgV3JpdGVEZWxpbWl0ZWRUbyhTdHJlYW0pLg0KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4NCisgICAgICAgIG5ldyB2b2lkIFdyaXRlVG8oSUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTGlrZSBXcml0ZVRvKFN0cmVhbSkgYnV0IHdyaXRlcyB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSBhcyBhIHZhcmludCBiZWZvcmUNCisgICAgICAgIC8vLyB3cml0aW5nIHRoZSBkYXRhLiBUaGlzIGFsbG93cyBtb3JlIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgc3RyZWFtIGFmdGVyIHRoZQ0KKyAgICAgICAgLy8vIG1lc3NhZ2Ugd2l0aG91dCB0aGUgbmVlZCB0byBkZWxpbWl0IHRoZSBtZXNzYWdlIGRhdGEgeW91cnNlbGYuIFVzZSANCisgICAgICAgIC8vLyBJQnVpbGRlci5NZXJnZURlbGltaXRlZEZyb20oU3RyZWFtKSBvciB0aGUgc3RhdGljIG1ldGhvZA0KKyAgICAgICAgLy8vIFlvdXJNZXNzYWdlVHlwZS5QYXJzZURlbGltaXRlZEZyb20oU3RyZWFtKSB0byBwYXJzZSBtZXNzYWdlcyB3cml0dGVuIGJ5IHRoaXMgbWV0aG9kLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0Ij48L3BhcmFtPg0KKyAgICAgICAgbmV3IHZvaWQgV3JpdGVEZWxpbWl0ZWRUbyhTdHJlYW0gb3V0cHV0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gZW5jb2RlIHRoaXMgbWVzc2FnZS4NCisgICAgICAgIC8vLyBUaGUgcmVzdWx0IGlzIG9ubHkgY29tcHV0ZWQgb24gdGhlIGZpcnN0IGNhbGwgYW5kIG1lbW9pemVkIGFmdGVyIHRoYXQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgbmV3IGludCBTZXJpYWxpemVkU2l6ZSB7IGdldDsgfQ0KKw0KKyAgICAgICAgI3JlZ2lvbiBDb21wYXJpc29uIGFuZCBoYXNoaW5nDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIG1lc3NhZ2UgZm9yIGVxdWFsaXR5Lg0KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGdpdmVuIG9iamVjdCBpcyBhIG1lc3NhZ2Ugb2YgdGhlIHNhbWUgdHlwZQ0KKyAgICAgICAgLy8vIChhcyBkZWZpbmVkIGJ5IERlc2NyaXB0b3JGb3JUeXBlKSBhbmQgaGFzIGlkZW50aWNhbCB2YWx1ZXMNCisgICAgICAgIC8vLyBmb3IgYWxsIGl0cyBmaWVsZHMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgbmV3IGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcik7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG1lc3NhZ2UuDQorICAgICAgICAvLy8gVE9ETyhqb25za2VldCk6IFNwZWNpZnkgdGhlIGhhc2ggYWxnb3JpdGhtLCBidXQgYmV0dGVyIHRoYW4gdGhlIEphdmEgb25lIQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIG5ldyBpbnQgR2V0SGFzaENvZGUoKTsNCisNCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgICNyZWdpb24gQ29udmVuaWVuY2UgbWV0aG9kcw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnZlcnRzIHRoZSBtZXNzYWdlIHRvIGEgc3RyaW5nIGluIHByb3RvY29sIGJ1ZmZlciB0ZXh0IGZvcm1hdC4NCisgICAgICAgIC8vLyBUaGlzIGlzIGp1c3QgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kIFRleHRGb3JtYXQuUHJpbnRUb1N0cmluZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBuZXcgc3RyaW5nIFRvU3RyaW5nKCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBhIEJ5dGVTdHJpbmcuIFRoaXMgaXMgYSB0cml2aWFsIHdyYXBwZXINCisgICAgICAgIC8vLyBhcm91bmQgV3JpdGVUbyhJQ29kZWRPdXRwdXRTdHJlYW0pLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIG5ldyBCeXRlU3RyaW5nIFRvQnl0ZVN0cmluZygpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYSBieXRlIGFycmF5LiBUaGlzIGlzIGEgdHJpdmlhbCB3cmFwcGVyDQorICAgICAgICAvLy8gYXJvdW5kIFdyaXRlVG8oSUNvZGVkT3V0cHV0U3RyZWFtKS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBuZXcgYnl0ZVtdIFRvQnl0ZUFycmF5KCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gU2VyaWFsaXplcyB0aGUgbWVzc2FnZSBhbmQgd3JpdGVzIGl0IHRvIHRoZSBnaXZlbiBzdHJlYW0uDQorICAgICAgICAvLy8gVGhpcyBpcyBqdXN0IGEgd3JhcHBlciBhcm91bmQgV3JpdGVUbyhJQ29kZWRPdXRwdXRTdHJlYW0pLiBUaGlzDQorICAgICAgICAvLy8gZG9lcyBub3QgZmx1c2ggb3IgY2xvc2UgdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im91dHB1dCI+PC9wYXJhbT4NCisgICAgICAgIG5ldyB2b2lkIFdyaXRlVG8oU3RyZWFtIG91dHB1dCk7DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIGJ1aWxkZXIgZm9yIHRoZSB0eXBlLCBidXQgaW4gYSB3ZWFrbHkgdHlwZWQgbWFubmVyLiBUaGlzDQorICAgICAgICAvLy8gaXMgdHlwaWNhbGx5IGltcGxlbWVudGVkIGJ5IHN0cm9uZ2x5IHR5cGVkIG1lc3NhZ2VzIGJ5IGp1c3QgcmV0dXJuaW5nDQorICAgICAgICAvLy8gdGhlIHJlc3VsdCBvZiBDcmVhdGVCdWlsZGVyRm9yVHlwZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBuZXcgSUJ1aWxkZXIgV2Vha0NyZWF0ZUJ1aWxkZXJGb3JUeXBlKCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIGJ1aWxkZXIgd2l0aCB0aGUgc2FtZSBjb250ZW50cyBhcyB0aGlzIG1lc3NhZ2UuIFRoaXMNCisgICAgICAgIC8vLyBpcyB0eXBpY2FsbHkgaW1wbGVtZW50ZWQgYnkgc3Ryb25nbHkgdHlwZWQgbWVzc2FnZXMgYnkganVzdCByZXR1cm5pbmcNCisgICAgICAgIC8vLyB0aGUgcmVzdWx0IG9mIFRvQnVpbGRlci4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBuZXcgSUJ1aWxkZXIgV2Vha1RvQnVpbGRlcigpOw0KKw0KKyAgICAgICAgbmV3IElNZXNzYWdlIFdlYWtEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsgZ2V0OyB9DQorICAgIH0NCisNCisgICAgcHVibGljIGludGVyZmFjZSBJTWVzc2FnZTxUTWVzc2FnZT4gOiBJTWVzc2FnZSwgSU1lc3NhZ2VMaXRlPFRNZXNzYWdlPg0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGlzIG1lc3NhZ2UgdHlwZSB3aXRoIGFsbCBmaWVsZHMgc2V0IHRvDQorICAgICAgICAvLy8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgYSBzaW5nbGV0b24uIFRoaXMgZGlmZmVycw0KKyAgICAgICAgLy8vIGZyb20gdGhlIERlZmF1bHRJbnN0YW5jZSBwcm9wZXJ0eSBvZiBlYWNoIGdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzIGluIHRoYXQgdGhpcw0KKyAgICAgICAgLy8vIG1ldGhvZCBpcyBhbiBhYnN0cmFjdCBtZXRob2Qgb2YgSU1lc3NhZ2Ugd2hlcmVhcyBEZWZhdWx0SW5zdGFuY2UgaXMNCisgICAgICAgIC8vLyBhIHN0YXRpYyBwcm9wZXJ0eSBvZiBhIHNwZWNpZmljIGNsYXNzLiBUaGV5IHJldHVybiB0aGUgc2FtZSB0aGluZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBuZXcgVE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7IGdldDsgfQ0KKyAgICB9DQorDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFR5cGUtc2FmZSBpbnRlcmZhY2UgZm9yIGFsbCBnZW5lcmF0ZWQgbWVzc2FnZXMgdG8gaW1wbGVtZW50Lg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4gOiBJTWVzc2FnZTxUTWVzc2FnZT4sIElNZXNzYWdlTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgICAgICB3aGVyZSBUTWVzc2FnZSA6IElNZXNzYWdlPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgIHdoZXJlIFRCdWlsZGVyIDogSUJ1aWxkZXI8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICB7DQorICAgICAgICAjcmVnaW9uIEJ1aWxkZXJzDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29uc3RydWN0cyBhIG5ldyBidWlsZGVyIGZvciBhIG1lc3NhZ2Ugb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIG1lc3NhZ2UuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgbmV3IFRCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ3JlYXRlcyBhIGJ1aWxkZXIgd2l0aCB0aGUgc2FtZSBjb250ZW50cyBhcyB0aGlzIGN1cnJlbnQgaW5zdGFuY2UuDQorICAgICAgICAvLy8gVGhpcyBpcyB0eXBpY2FsbHkgaW1wbGVtZW50ZWQgYnkgc3Ryb25nbHkgdHlwZWQgbWVzc2FnZXMgYnkganVzdA0KKyAgICAgICAgLy8vIHJldHVybmluZyB0aGUgcmVzdWx0IG9mIFRvQnVpbGRlcigpLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIG5ldyBUQnVpbGRlciBUb0J1aWxkZXIoKTsNCisNCisgICAgICAgICNlbmRyZWdpb24NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9JTWVzc2FnZUxpdGUuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9JTWVzc2FnZUxpdGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1ZDk5NAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0lNZXNzYWdlTGl0ZS5jcwpAQCAtMCwwICsxLDE4OCBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbS5JTzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gTm9uLWdlbmVyaWMgaW50ZXJmYWNlIHVzZWQgZm9yIGFsbCBwYXJ0cyBvZiB0aGUgQVBJIHdoaWNoIGRvbid0IHJlcXVpcmUNCisgICAgLy8vIGFueSB0eXBlIGtub3dsZWRnZS4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHBhcnRpYWwgaW50ZXJmYWNlIElNZXNzYWdlTGl0ZQ0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmZiBhbGwgcmVxdWlyZWQgZmllbGRzIGluIHRoZSBtZXNzYWdlIGFuZCBhbGwgZW1iZWRkZWQNCisgICAgICAgIC8vLyBtZXNzYWdlcyBhcmUgc2V0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGJvb2wgSXNJbml0aWFsaXplZCB7IGdldDsgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgYW5kIHdyaXRlcyBpdCB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4NCisgICAgICAgIC8vLyBUaGlzIGRvZXMgbm90IGZsdXNoIG9yIGNsb3NlIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPg0KKyAgICAgICAgLy8vIFByb3RvY29sIEJ1ZmZlcnMgYXJlIG5vdCBzZWxmLWRlbGltaXRpbmcuIFRoZXJlZm9yZSwgaWYgeW91IHdyaXRlDQorICAgICAgICAvLy8gYW55IG1vcmUgZGF0YSB0byB0aGUgc3RyZWFtIGFmdGVyIHRoZSBtZXNzYWdlLCB5b3UgbXVzdCBzb21laG93IGVuc3VyZQ0KKyAgICAgICAgLy8vIHRoYXQgdGhlIHBhcnNlciBvbiB0aGUgcmVjZWl2aW5nIGVuZCBkb2VzIG5vdCBpbnRlcnByZXQgdGhpcyBhcyBiZWluZw0KKyAgICAgICAgLy8vIHBhcnQgb2YgdGhlIHByb3RvY29sIG1lc3NhZ2UuIE9uZSB3YXkgb2YgZG9pbmcgdGhpcyBpcyBieSB3cml0aW5nIHRoZSBzaXplDQorICAgICAgICAvLy8gb2YgdGhlIG1lc3NhZ2UgYmVmb3JlIHRoZSBkYXRhLCB0aGVuIG1ha2luZyBzdXJlIHlvdSBsaW1pdCB0aGUgaW5wdXQgdG8NCisgICAgICAgIC8vLyB0aGF0IHNpemUgd2hlbiByZWNlaXZpbmcgdGhlIGRhdGEuIEFsdGVybmF0aXZlbHksIHVzZSBXcml0ZURlbGltaXRlZFRvKFN0cmVhbSkuDQorICAgICAgICAvLy8gPC9yZW1hcmtzPg0KKyAgICAgICAgdm9pZCBXcml0ZVRvKElDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIExpa2UgV3JpdGVUbyhTdHJlYW0pIGJ1dCB3cml0ZXMgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgYXMgYSB2YXJpbnQgYmVmb3JlDQorICAgICAgICAvLy8gd3JpdGluZyB0aGUgZGF0YS4gVGhpcyBhbGxvd3MgbW9yZSBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbSBhZnRlciB0aGUNCisgICAgICAgIC8vLyBtZXNzYWdlIHdpdGhvdXQgdGhlIG5lZWQgdG8gZGVsaW1pdCB0aGUgbWVzc2FnZSBkYXRhIHlvdXJzZWxmLiBVc2UgDQorICAgICAgICAvLy8gSUJ1aWxkZXIuTWVyZ2VEZWxpbWl0ZWRGcm9tKFN0cmVhbSkgb3IgdGhlIHN0YXRpYyBtZXRob2QNCisgICAgICAgIC8vLyBZb3VyTWVzc2FnZVR5cGUuUGFyc2VEZWxpbWl0ZWRGcm9tKFN0cmVhbSkgdG8gcGFyc2UgbWVzc2FnZXMgd3JpdHRlbiBieSB0aGlzIG1ldGhvZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im91dHB1dCI+PC9wYXJhbT4NCisgICAgICAgIHZvaWQgV3JpdGVEZWxpbWl0ZWRUbyhTdHJlYW0gb3V0cHV0KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gZW5jb2RlIHRoaXMgbWVzc2FnZS4NCisgICAgICAgIC8vLyBUaGUgcmVzdWx0IGlzIG9ubHkgY29tcHV0ZWQgb24gdGhlIGZpcnN0IGNhbGwgYW5kIG1lbW9pemVkIGFmdGVyIHRoYXQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgaW50IFNlcmlhbGl6ZWRTaXplIHsgZ2V0OyB9DQorDQorICAgICAgICAjcmVnaW9uIENvbXBhcmlzb24gYW5kIGhhc2hpbmcNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoIHRoaXMgbWVzc2FnZSBmb3IgZXF1YWxpdHkuDQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgbWVzc2FnZSBvZiB0aGUgc2FtZSB0eXBlDQorICAgICAgICAvLy8gKGFzIGRlZmluZWQgYnkgRGVzY3JpcHRvckZvclR5cGUpIGFuZCBoYXMgaWRlbnRpY2FsIHZhbHVlcw0KKyAgICAgICAgLy8vIGZvciBhbGwgaXRzIGZpZWxkcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBtZXNzYWdlLg0KKyAgICAgICAgLy8vIFRPRE8oam9uc2tlZXQpOiBTcGVjaWZ5IHRoZSBoYXNoIGFsZ29yaXRobSwgYnV0IGJldHRlciB0aGFuIHRoZSBKYXZhIG9uZSENCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBpbnQgR2V0SGFzaENvZGUoKTsNCisNCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgICNyZWdpb24gQ29udmVuaWVuY2UgbWV0aG9kcw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnZlcnRzIHRoZSBtZXNzYWdlIHRvIGEgc3RyaW5nIGluIHByb3RvY29sIGJ1ZmZlciB0ZXh0IGZvcm1hdC4NCisgICAgICAgIC8vLyBUaGlzIGlzIGp1c3QgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kIFRleHRGb3JtYXQuUHJpbnRUb1N0cmluZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBzdHJpbmcgVG9TdHJpbmcoKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb252ZXJ0cyB0aGUgbWVzc2FnZSB0byBhIHN0cmluZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIFByaW50VG8oVGV4dFdyaXRlciB3cml0ZXIpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYSBCeXRlU3RyaW5nLiBUaGlzIGlzIGEgdHJpdmlhbCB3cmFwcGVyDQorICAgICAgICAvLy8gYXJvdW5kIFdyaXRlVG8oSUNvZGVkT3V0cHV0U3RyZWFtKS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBCeXRlU3RyaW5nIFRvQnl0ZVN0cmluZygpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYSBieXRlIGFycmF5LiBUaGlzIGlzIGEgdHJpdmlhbCB3cmFwcGVyDQorICAgICAgICAvLy8gYXJvdW5kIFdyaXRlVG8oSUNvZGVkT3V0cHV0U3RyZWFtKS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBieXRlW10gVG9CeXRlQXJyYXkoKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIGFuZCB3cml0ZXMgaXQgdG8gdGhlIGdpdmVuIHN0cmVhbS4NCisgICAgICAgIC8vLyBUaGlzIGlzIGp1c3QgYSB3cmFwcGVyIGFyb3VuZCBXcml0ZVRvKElDb2RlZE91dHB1dFN0cmVhbSkuIFRoaXMNCisgICAgICAgIC8vLyBkb2VzIG5vdCBmbHVzaCBvciBjbG9zZSB0aGUgc3RyZWFtLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0Ij48L3BhcmFtPg0KKyAgICAgICAgdm9pZCBXcml0ZVRvKFN0cmVhbSBvdXRwdXQpOw0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBidWlsZGVyIGZvciB0aGUgdHlwZSwgYnV0IGluIGEgd2Vha2x5IHR5cGVkIG1hbm5lci4gVGhpcw0KKyAgICAgICAgLy8vIGlzIHR5cGljYWxseSBpbXBsZW1lbnRlZCBieSBzdHJvbmdseSB0eXBlZCBtZXNzYWdlcyBieSBqdXN0IHJldHVybmluZw0KKyAgICAgICAgLy8vIHRoZSByZXN1bHQgb2YgQ3JlYXRlQnVpbGRlckZvclR5cGUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgSUJ1aWxkZXJMaXRlIFdlYWtDcmVhdGVCdWlsZGVyRm9yVHlwZSgpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBidWlsZGVyIHdpdGggdGhlIHNhbWUgY29udGVudHMgYXMgdGhpcyBtZXNzYWdlLiBUaGlzDQorICAgICAgICAvLy8gaXMgdHlwaWNhbGx5IGltcGxlbWVudGVkIGJ5IHN0cm9uZ2x5IHR5cGVkIG1lc3NhZ2VzIGJ5IGp1c3QgcmV0dXJuaW5nDQorICAgICAgICAvLy8gdGhlIHJlc3VsdCBvZiBUb0J1aWxkZXIuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgSUJ1aWxkZXJMaXRlIFdlYWtUb0J1aWxkZXIoKTsNCisNCisgICAgICAgIElNZXNzYWdlTGl0ZSBXZWFrRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7IGdldDsgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnRlcmZhY2UgSU1lc3NhZ2VMaXRlPFRNZXNzYWdlPiA6IElNZXNzYWdlTGl0ZQ0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGlzIG1lc3NhZ2UgdHlwZSB3aXRoIGFsbCBmaWVsZHMgc2V0IHRvDQorICAgICAgICAvLy8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgYSBzaW5nbGV0b24uIFRoaXMgZGlmZmVycw0KKyAgICAgICAgLy8vIGZyb20gdGhlIERlZmF1bHRJbnN0YW5jZSBwcm9wZXJ0eSBvZiBlYWNoIGdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzIGluIHRoYXQgdGhpcw0KKyAgICAgICAgLy8vIG1ldGhvZCBpcyBhbiBhYnN0cmFjdCBtZXRob2Qgb2YgSU1lc3NhZ2Ugd2hlcmVhcyBEZWZhdWx0SW5zdGFuY2UgaXMNCisgICAgICAgIC8vLyBhIHN0YXRpYyBwcm9wZXJ0eSBvZiBhIHNwZWNpZmljIGNsYXNzLiBUaGV5IHJldHVybiB0aGUgc2FtZSB0aGluZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBUTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsgZ2V0OyB9DQorICAgIH0NCisNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gVHlwZS1zYWZlIGludGVyZmFjZSBmb3IgYWxsIGdlbmVyYXRlZCBtZXNzYWdlcyB0byBpbXBsZW1lbnQuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBpbnRlcmZhY2UgSU1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gOiBJTWVzc2FnZUxpdGU8VE1lc3NhZ2U+DQorICAgICAgICB3aGVyZSBUTWVzc2FnZSA6IElNZXNzYWdlTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgICAgICB3aGVyZSBUQnVpbGRlciA6IElCdWlsZGVyTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+DQorICAgIHsNCisgICAgICAgICNyZWdpb24gQnVpbGRlcnMNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgbmV3IGJ1aWxkZXIgZm9yIGEgbWVzc2FnZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoaXMgbWVzc2FnZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBUQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBidWlsZGVyIHdpdGggdGhlIHNhbWUgY29udGVudHMgYXMgdGhpcyBjdXJyZW50IGluc3RhbmNlLg0KKyAgICAgICAgLy8vIFRoaXMgaXMgdHlwaWNhbGx5IGltcGxlbWVudGVkIGJ5IHN0cm9uZ2x5IHR5cGVkIG1lc3NhZ2VzIGJ5IGp1c3QNCisgICAgICAgIC8vLyByZXR1cm5pbmcgdGhlIHJlc3VsdCBvZiBUb0J1aWxkZXIoKS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBUQnVpbGRlciBUb0J1aWxkZXIoKTsNCisNCisgICAgICAgICNlbmRyZWdpb24NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9JUnBjQ2hhbm5lbC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0lScGNDaGFubmVsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTI0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9JUnBjQ2hhbm5lbC5jcwpAQCAtMCwwICsxLDYzIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEludGVyZmFjZSBmb3IgYW4gUlBDIGNoYW5uZWwuIEEgY2hhbm5lbCByZXByZXNlbnRzIGEgY29tbXVuaWNhdGlvbiBsaW5lIHRvDQorICAgIC8vLyBhIHNlcnZpY2UgKElTZXJ2aWNlIGltcGxlbWVudGF0aW9uKSB3aGljaCBjYW4gYmUgdXNlZCB0byBjYWxsIHRoYXQgc2VydmljZSdzDQorICAgIC8vLyBtZXRob2RzLiBUaGUgc2VydmljZSBtYXkgYmUgcnVubmluZyBvbiBhbm90aGVyIG1hY2hpbmUuIE5vcm1hbGx5LCB5b3Ugc2hvdWxkDQorICAgIC8vLyBub3QgY2FsbCBhbiBJUnBjQ2hhbm5lbCBkaXJlY3RseSwgYnV0IGluc3RlYWQgY29uc3RydWN0IGEgc3R1YiB3cmFwcGluZyBpdC4NCisgICAgLy8vIEdlbmVyYXRlZCBzZXJ2aWNlIGNsYXNzZXMgY29udGFpbiBhIENyZWF0ZVN0dWIgbWV0aG9kIGZvciBwcmVjaXNlbHkgdGhpcyBwdXJwb3NlLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElScGNDaGFubmVsDQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDYWxscyB0aGUgZ2l2ZW4gbWV0aG9kIG9mIHRoZSByZW1vdGUgc2VydmljZS4gVGhpcyBtZXRob2QgaXMgc2ltaWxhcg0KKyAgICAgICAgLy8vIHRvIDxzZWUgY3JlZj0iSVNlcnZpY2UuQ2FsbE1ldGhvZCIgLz4gd2l0aCBvbmUgaW1wb3J0YW50IGRpZmZlcmVuY2U6IHRoZQ0KKyAgICAgICAgLy8vIGNhbGxlciBkZWNpZGVzIHRoZSB0eXBlcyBvZiB0aGUgSU1lc3NhZ2Ugb2JqZWN0cywgbm90IHRoZSBpbXBsZW1lbnRhdGlvbi4NCisgICAgICAgIC8vLyBUaGUgcmVxdWVzdCBtYXkgYmUgb2YgYW55IHR5cGUgYXMgbG9uZyBhcyA8Yz5yZXF1ZXN0LkRlc2NyaXB0b3IgPT0gbWV0aG9kLklucHV0VHlwZTwvYz4uDQorICAgICAgICAvLy8gVGhlIHJlc3BvbnNlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgd2lsbCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFzDQorICAgICAgICAvLy8gPHBhcmFtcmVmIG5hbWU9InJlc3BvbnNlUHJvdG90eXBlIi8+ICh3aGljaCBtdXN0IGJlIHN1Y2ggdGhhdA0KKyAgICAgICAgLy8vIDxjPnJlc3BvbnNlUHJvdG90eXBlLkRlc2NyaXB0b3IgPT0gbWV0aG9kLk91dHB1dFR5cGU8L2M+KS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIENhbGxNZXRob2QoTWV0aG9kRGVzY3JpcHRvciBtZXRob2QsIElScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgSU1lc3NhZ2UgcmVxdWVzdCwgSU1lc3NhZ2UgcmVzcG9uc2VQcm90b3R5cGUsIEFjdGlvbjxJTWVzc2FnZT4gZG9uZSk7DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvSVJwY0NvbnRyb2xsZXIuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9JUnBjQ29udHJvbGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTU1YmVjCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvSVJwY0NvbnRyb2xsZXIuY3MKQEAgLTAsMCArMSwxMjUgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIE1lZGlhdGVzIGEgc2luZ2xlIG1ldGhvZCBjYWxsLiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoZSBjb250cm9sbGVyDQorICAgIC8vLyBpcyB0byBwcm92aWRlIGEgd2F5IHRvIG1hbmlwdWxhdGUgc2V0dGluZ3Mgc3BlY2lmaWMgdG8gdGhlDQorICAgIC8vLyBSUEMgaW1wbGVtZW50YXRpb24gYW5kIHRvIGZpbmQgb3V0IGFib3V0IFJQQy1sZXZlbCBlcnJvcnMuDQorICAgIC8vLyANCisgICAgLy8vIFRoZSBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoaXMgaW50ZXJmYWNlIGFyZSBpbnRlbmRlZCB0byBiZSBhICJsZWFzdA0KKyAgICAvLy8gY29tbW9uIGRlbm9taW5hdG9yIiBzZXQgb2YgZmVhdHVyZXMgd2hpY2ggd2UgZXhwZWN0IGFsbCBpbXBsZW1lbnRhdGlvbnMgdG8NCisgICAgLy8vIHN1cHBvcnQuIFNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBtYXkgcHJvdmlkZSBtb3JlIGFkdmFuY2VkIGZlYXR1cmVzLA0KKyAgICAvLy8gKGUuZy4gZGVhZGxpbmUgcHJvcGFnYXRpb24pLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElScGNDb250cm9sbGVyDQorICAgIHsNCisgICAgICAgICNyZWdpb24gQ2xpZW50IHNpZGUgY2FsbHMNCisNCisgICAgICAgIC8vIFRoZXNlIGNhbGxzIG1heSBiZSBtYWRlIGZyb20gdGhlIGNsaWVudCBzaWRlIG9ubHkuICBUaGVpciByZXN1bHRzDQorICAgICAgICAvLyBhcmUgdW5kZWZpbmVkIG9uIHRoZSBzZXJ2ZXIgc2lkZSAobWF5IHRocm93IGV4Y2VwdGlvbnMpLg0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlc2V0cyB0aGUgY29udHJvbGxlciB0byBpdHMgaW5pdGlhbCBzdGF0ZSBzbyB0aGF0IGl0IG1heSBiZSByZXVzZWQgaW4NCisgICAgICAgIC8vLyBhIG5ldyBjYWxsLiAgVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIGNsaWVudCBzaWRlIG9ubHkuICBJdCBtdXN0IG5vdA0KKyAgICAgICAgLy8vIGJlIGNhbGxlZCB3aGlsZSBhbiBSUEMgaXMgaW4gcHJvZ3Jlc3MuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBSZXNldCgpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFmdGVyIGEgY2FsbCBoYXMgZmluaXNoZWQsIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbCBmYWlsZWQuICBUaGUgcG9zc2libGUNCisgICAgICAgIC8vLyByZWFzb25zIGZvciBmYWlsdXJlIGRlcGVuZCBvbiB0aGUgUlBDIGltcGxlbWVudGF0aW9uLiBGYWlsZWQgbXVzdA0KKyAgICAgICAgLy8vIG9ubHkgYmUgY2FsbGVkIG9uIHRoZSBjbGllbnQgc2lkZSwgYW5kIG11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgYSBjYWxsIGhhcw0KKyAgICAgICAgLy8vIGZpbmlzaGVkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGJvb2wgRmFpbGVkIHsgZ2V0OyB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSWYgRmFpbGVkIGlzIHRydWUsIEVycm9yVGV4dCByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHN0cmluZyBFcnJvclRleHQgeyBnZXQ7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBZHZpc2VzIHRoZSBSUEMgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciBkZXNpcmVzIHRoYXQgdGhlIFJQQyBjYWxsIGJlDQorICAgICAgICAvLy8gY2FuY2VsZWQuIFRoZSBSUEMgc3lzdGVtIG1heSBjYW5jZWwgaXQgaW1tZWRpYXRlbHksIG1heSB3YWl0IGF3aGlsZSBhbmQNCisgICAgICAgIC8vLyB0aGVuIGNhbmNlbCBpdCwgb3IgbWF5IG5vdCBldmVuIGNhbmNlbCB0aGUgY2FsbCBhdCBhbGwuIElmIHRoZSBjYWxsIGlzDQorICAgICAgICAvLy8gY2FuY2VsZWQsIHRoZSAiZG9uZSIgY2FsbGJhY2sgd2lsbCBzdGlsbCBiZSBjYWxsZWQgYW5kIHRoZSBScGNDb250cm9sbGVyDQorICAgICAgICAvLy8gd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsIGZhaWxlZCBhdCB0aGF0IHRpbWUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdm9pZCBTdGFydENhbmNlbCgpOw0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgI3JlZ2lvbiBTZXJ2ZXIgc2lkZSBjYWxscw0KKw0KKyAgICAgICAgLy8gVGhlc2UgY2FsbHMgbWF5IGJlIG1hZGUgZnJvbSB0aGUgc2VydmVyIHNpZGUgb25seS4gIFRoZWlyIHJlc3VsdHMNCisgICAgICAgIC8vIGFyZSB1bmRlZmluZWQgb24gdGhlIGNsaWVudCBzaWRlIChtYXkgdGhyb3cgZXhjZXB0aW9ucykuDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2F1c2VzIEZhaWxlZCB0byByZXR1cm4gdHJ1ZSBvbiB0aGUgY2xpZW50IHNpZGUuIDxwYXJhbXJlZiBuYW1lPSJyZWFzb24iLz4NCisgICAgICAgIC8vLyB3aWxsIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBtZXNzYWdlIHJldHVybmVkIGJ5IEVycm9yVGV4dC4NCisgICAgICAgIC8vLyBJZiB5b3UgZmluZCB5b3UgbmVlZCB0byByZXR1cm4gbWFjaGluZS1yZWFkYWJsZSBpbmZvcm1hdGlvbiBhYm91dA0KKyAgICAgICAgLy8vIGZhaWx1cmVzLCB5b3Ugc2hvdWxkIGluY29ycG9yYXRlIGl0IGludG8geW91ciByZXNwb25zZSBwcm90b2NvbCBidWZmZXINCisgICAgICAgIC8vLyBhbmQgc2hvdWxkICpub3QqIGNhbGwgU2V0RmFpbGVkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgU2V0RmFpbGVkKHN0cmluZyByZWFzb24pOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIElmIHRydWUsIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQgY2FuY2VsZWQgdGhlIFJQQywgc28gdGhlIHNlcnZlciBtYXkgYXMNCisgICAgICAgIC8vLyB3ZWxsIGdpdmUgdXAgb24gcmVwbHlpbmcgdG8gaXQuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9uIHRoZSBzZXJ2ZXINCisgICAgICAgIC8vLyBzaWRlIG9ubHkuIFRoZSBzZXJ2ZXIgc2hvdWxkIHN0aWxsIGNhbGwgdGhlIGZpbmFsICJkb25lIiBjYWxsYmFjay4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBib29sIElzQ2FuY2VsZWQoKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXF1ZXN0cyB0aGF0IHRoZSBnaXZlbiBjYWxsYmFjayBiZSBjYWxsZWQgd2hlbiB0aGUgUlBDIGlzIGNhbmNlbGVkLg0KKyAgICAgICAgLy8vIFRoZSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayB3aWxsIGFsd2F5cyBiZSBudWxsLiBUaGUgY2FsbGJhY2sgd2lsbA0KKyAgICAgICAgLy8vIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UuIElmIHRoZSBSUEMgY29tcGxldGVzIHdpdGhvdXQgYmVpbmcgY2FuY2VsZWQsIHRoZQ0KKyAgICAgICAgLy8vIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGNvbXBsZXRpb24uIElmIHRoZSBSUEMgaGFzIGFscmVhZHkgYmVlbiBjYW5jZWxlZA0KKyAgICAgICAgLy8vIHdoZW4gTm90aWZ5T25DYW5jZWwgaXMgY2FsbGVkLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkuDQorICAgICAgICAvLy8gDQorICAgICAgICAvLy8gTm90aWZ5T25DYW5jZWwgbXVzdCBiZSBjYWxsZWQgbm8gbW9yZSB0aGFuIG9uY2UgcGVyIHJlcXVlc3QuIEl0IG11c3QgYmUNCisgICAgICAgIC8vLyBjYWxsZWQgb24gdGhlIHNlcnZlciBzaWRlIG9ubHkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjYWxsYmFjayI+PC9wYXJhbT4NCisgICAgICAgIHZvaWQgTm90aWZ5T25DYW5jZWwoQWN0aW9uPG9iamVjdD4gY2FsbGJhY2spOw0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0lScGNEaXNwYXRjaC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0lScGNEaXNwYXRjaC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjQ4MzhlCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvSVJwY0Rpc3BhdGNoLmNzCkBAIC0wLDAgKzEsNzggQEAKK++7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFByb3ZpZGVzIGFuIGVudHJ5LXBvaW50IGZvciB0cmFuc3BvcnQgbGlzdGVuZXJzIHRvIGNhbGwgYSBzcGVjaWZpZWQgbWV0aG9kIG9uIGEgc2VydmljZQ0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElScGNTZXJ2ZXJTdHViIDogSURpc3Bvc2FibGUNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENhbGxzIHRoZSBtZXRob2QgaWRlbnRpZmllZCBieSBtZXRob2ROYW1lIGFuZCByZXR1cm5zIHRoZSBtZXNzYWdlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtZXRob2ROYW1lIj5UaGUgbWV0aG9kIG5hbWUgb24gdGhlIHNlcnZpY2UgZGVzY3JpcHRvciAoY2FzZS1zZW5zaXRpdmUpPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXQiPlRoZSBJQ29kZWRJbnB1dFN0cmVhbSB0byBkZXNlcmlhbGl6ZSB0aGUgY2FsbCBwYXJhbWV0ZXIgZnJvbTwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJlZ2lzdHJ5Ij5UaGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5IHRvIHVzZSB3aGVuIGRlc2VyaWFsaXppbmcgdGhlIGNhbGwgcGFyYW1ldGVyPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgbWVzc2FnZSB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2aWNlJ3MgbWV0aG9kPC9yZXR1cm5zPg0KKyAgICAgICAgSU1lc3NhZ2VMaXRlIENhbGxNZXRob2Qoc3RyaW5nIG1ldGhvZE5hbWUsIElDb2RlZElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSk7DQorICAgIH0NCisNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gVXNlZCB0byBmb3J3YXJkIGFuIGludm9jYXRpb24gb2YgYSBzZXJ2aWNlIG1ldGhvZCB0byBhIHRyYW5zcG9ydCBzZW5kZXIgaW1wbGVtZW50YXRpb24NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIGludGVyZmFjZSBJUnBjRGlzcGF0Y2gNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENhbGxzIHRoZSBzZXJ2aWNlIG1lbWJlciBvbiB0aGUgZW5kcG9pbnQgY29ubmVjdGVkLiAgVGhpcyBpcyBnZW5lcmFsbHkgZG9uZSBieSBzZXJpYWxpemluZw0KKyAgICAgICAgLy8vIHRoZSBtZXNzYWdlLCBzZW5kaW5nIHRoZSBieXRlcyBvdmVyIGEgdHJhbnNwb3J0LCBhbmQgdGhlbiBkZXNlcmlhbGl6aW5nIHRoZSBjYWxsIHBhcmFtZXRlcg0KKyAgICAgICAgLy8vIHRvIGludm9rZSB0aGUgc2VydmljZSdzIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiB2aWEgSVJwY1NlcnZlclN0dWIuICBPbmNlIHRoZSBjYWxsIGhhcw0KKyAgICAgICAgLy8vIGNvbXBsZXRlZCB0aGUgcmVzdWx0IG1lc3NhZ2UgaXMgc2VyaWFsaXplZCBhbmQgcmV0dXJuZWQgdG8gdGhlIG9yaWdpbmF0aW5nIGVuZHBvaW50Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlRNZXNzYWdlIj5UaGUgdHlwZSBvZiB0aGUgcmVzcG9uc2UgbWVzc2FnZTwvdHlwZXBhcmFtPg0KKyAgICAgICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVEJ1aWxkZXIiPlRoZSB0eXBlIG9mIG9mIHRoZSByZXNwb25zZSBidWlsZGVyPC90eXBlcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1ldGhvZCI+VGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBvbiB0aGUgc2VydmljZTwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJlcXVlc3QiPlRoZSBtZXNzYWdlIGluc3RhbmNlIHByb3ZpZGVkIHRvIHRoZSBzZXJ2aWNlIGNhbGw8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyZXNwb25zZSI+VGhlIGJ1aWxkZXIgdXNlZCB0byBkZXNlcmlhbGl6ZSB0aGUgcmVzcG9uc2U8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSByZXN1bHRpbmcgbWVzc2FnZSBvZiB0aGUgc2VydmljZSBjYWxsPC9yZXR1cm5zPg0KKyAgICAgICAgVE1lc3NhZ2UgQ2FsbE1ldGhvZDxUTWVzc2FnZSwgVEJ1aWxkZXI+KHN0cmluZyBtZXRob2QsIElNZXNzYWdlTGl0ZSByZXF1ZXN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCdWlsZGVyTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+IHJlc3BvbnNlKQ0KKyAgICAgICAgICAgIHdoZXJlIFRNZXNzYWdlIDogSU1lc3NhZ2VMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4NCisgICAgICAgICAgICB3aGVyZSBUQnVpbGRlciA6IElCdWlsZGVyTGl0ZTxUTWVzc2FnZSwgVEJ1aWxkZXI+Ow0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0lTZXJ2aWNlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvSVNlcnZpY2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhZjM1YwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0lTZXJ2aWNlLmNzCkBAIC0wLDAgKzEsMTAyIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEJhc2UgaW50ZXJmYWNlIGZvciBwcm90b2NvbC1idWZmZXItYmFzZWQgUlBDIHNlcnZpY2VzLiBTZXJ2aWNlcyB0aGVtc2VsdmVzDQorICAgIC8vLyBhcmUgYWJzdHJhY3QgY2xhc3NlcyAoaW1wbGVtZW50ZWQgZWl0aGVyIGJ5IHNlcnZlcnMgb3IgYXMgc3R1YnMpIGJ1dCB0aGV5DQorICAgIC8vLyBpbXBsZW1lbnQgdGhpcyBpdG5lcmZhY2UuIFRoZSBtZXRob2RzIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHRvIGNhbGwNCisgICAgLy8vIHRoZSBtZXRob2RzIG9mIHRoZSBzZXJ2aWNlIHdpdGhvdXQga25vd2luZyBpdHMgZXhhY3QgdHlwZSBhdCBjb21waWxlIHRpbWUNCisgICAgLy8vIChhbmFsYWdvdXMgdG8gdGhlIElNZXNzYWdlIGludGVyZmFjZSkuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBpbnRlcmZhY2UgSVNlcnZpY2UNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBTZXJ2aWNlRGVzY3JpcHRvciBkZXNjcmliaW5nIHRoaXMgc2VydmljZSBhbmQgaXRzIG1ldGhvZHMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgU2VydmljZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgeyBnZXQ7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDYWxsIGEgbWV0aG9kIG9mIHRoZSBzZXJ2aWNlIHNwZWNpZmllZCBieSBNZXRob2REZXNjcmlwdG9yLiAgVGhpcyBpcw0KKyAgICAgICAgLy8vIG5vcm1hbGx5IGltcGxlbWVudGVkIGFzIGEgc2ltcGxlIHN3aXRjaCB0aGF0IGNhbGxzIHRoZSBzdGFuZGFyZA0KKyAgICAgICAgLy8vIGRlZmluaXRpb25zIG9mIHRoZSBzZXJ2aWNlJ3MgbWV0aG9kcy4NCisgICAgICAgIC8vLyA8cGFyYT4NCisgICAgICAgIC8vLyBQcmVjb25kaXRpb25zDQorICAgICAgICAvLy8gPGxpc3Q+DQorICAgICAgICAvLy8gPGl0ZW0+PGM+bWV0aG9kLlNlcnZpY2UgPT0gRGVzY3JpcHRvckZvclR5cGU8L2M+PC9pdGVtPg0KKyAgICAgICAgLy8vIDxpdGVtPnJlcXVlc3QgaXMgb2YgdGhlIGV4YWN0IHNhbWUgY2xhc3MgYXMgdGhlIG9iamVjdCByZXR1cm5lZCBieSBHZXRSZXF1ZXN0UHJvdG90eXBlKG1ldGhvZCk8L2l0ZW0+DQorICAgICAgICAvLy8gPGl0ZW0+Y29udHJvbGxlciBpcyBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGUgUlBDIGltcGxlbWVudGF0aW9uIGJlaW5nIHVzZWQgYnkgdGhpcyBzZXJ2aWNlLg0KKyAgICAgICAgLy8vIEZvciBzdHVicywgdGhlICJjb3JyZWN0IHR5cGUiIGRlcGVuZHMgb24gdGhlIElScGNDaGFubmVsIHdoaWNoIHRoZSBzdHViIGlzIHVzaW5nLiBTZXJ2ZXItc2lkZQ0KKyAgICAgICAgLy8vIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYWNjZXB0IHdoYXRldmVyIHR5cGUgb2YgSVJwY0NvbnRyb2xsZXIgdGhlIHNlcnZlci1zaWRlIFJQQyBpbXBsZW1lbnRhdGlvbg0KKyAgICAgICAgLy8vIHVzZXMuPC9pdGVtPg0KKyAgICAgICAgLy8vIDwvbGlzdD4NCisgICAgICAgIC8vLyA8L3BhcmE+DQorICAgICAgICAvLy8gPHBhcmE+DQorICAgICAgICAvLy8gUG9zdGNvbmRpdGlvbnMNCisgICAgICAgIC8vLyA8bGlzdD4NCisgICAgICAgIC8vLyA8aXRlbT48cGFyYW1yZWYgbmFtZT0iZG9uZSIgLz4gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbWV0aG9kIGlzIGNvbXBsZXRlLg0KKyAgICAgICAgLy8vIFRoaXMgbWF5IGJlZm9yZSBDYWxsTWV0aG9kIHJldHVybnMgb3IgaXQgbWF5IGJlIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS48L2l0ZW0+DQorICAgICAgICAvLy8gPGl0ZW0+VGhlIHBhcmFtZXRlciB0byA8cGFyYW1yZWYgbmFtZT0iZG9uZSIvPiBpcyB0aGUgcmVzcG9uc2UuIEl0IHdpbGwgYmUgb2YgdGhlDQorICAgICAgICAvLy8gZXhhY3Qgc2FtZSB0eXBlIGFzIHdvdWxkIGJlIHJldHVybmVkIGJ5IDxzZWUgY3JlZj0iR2V0UmVzcG9uc2VQcm90b3R5cGUiLz4uPC9pdGVtPg0KKyAgICAgICAgLy8vIDxpdGVtPklmIHRoZSBSUEMgZmFpbGVkLCB0aGUgcGFyYW1ldGVyIHRvIDxwYXJhbXJlZiBuYW1lPSJkb25lIi8+IHdpbGwgYmUgbnVsbC4NCisgICAgICAgIC8vLyBGdXJ0aGVyIGRldGFpbHMgYWJvdXQgdGhlIGZhaWx1cmUgY2FuIGJlIGZvdW5kIGJ5IHF1ZXJ5aW5nIDxwYXJhbXJlZiBuYW1lPSJjb250cm9sbGVyIi8+LjwvaXRlbT4NCisgICAgICAgIC8vLyA8L2xpc3Q+DQorICAgICAgICAvLy8gPC9wYXJhPg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgQ2FsbE1ldGhvZChNZXRob2REZXNjcmlwdG9yIG1ldGhvZCwgSVJwY0NvbnRyb2xsZXIgY29udHJvbGxlciwNCisgICAgICAgICAgICAgICAgICAgICAgICBJTWVzc2FnZSByZXF1ZXN0LCBBY3Rpb248SU1lc3NhZ2U+IGRvbmUpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENhbGxNZXRob2QgcmVxdWlyZXMgdGhhdCB0aGUgcmVxdWVzdCBwYXNzZWQgaW4gaXMgb2YgYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uDQorICAgICAgICAvLy8gb2YgSU1lc3NhZ2UuIFRoaXMgbWV0aG9kIGdldHMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhpcyB0eXBlIG9mIGEgZ2l2ZW4gbWV0aG9kLg0KKyAgICAgICAgLy8vIFlvdSBjYW4gdGhlbiBjYWxsIFdlYWtDcmVhdGVCdWlsZGVyRm9yVHlwZSB0byBjcmVhdGUgYSBidWlsZGVyIHRvIGJ1aWxkIGFuIG9iamVjdCB3aGljaA0KKyAgICAgICAgLy8vIHlvdSBjYW4gdGhlbiBwYXNzIHRvIENhbGxNZXRob2QuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgSU1lc3NhZ2UgR2V0UmVxdWVzdFByb3RvdHlwZShNZXRob2REZXNjcmlwdG9yIG1ldGhvZCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTGlrZSBHZXRSZXF1ZXN0UHJvdG90eXBlLCBidXQgcmV0dXJucyBhIHByb3RvdHlwZSBvZiB0aGUgcmVzcG9uc2UgbWVzc2FnZS4NCisgICAgICAgIC8vLyBUaGlzIGlzIGdlbmVyYWxseSBub3QgbmVlZGVkIGJlY2F1c2UgdGhlIElTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNvbnRydWN0cw0KKyAgICAgICAgLy8vIHRoZSByZXNwb25zZSBtZXNzYWdlIGl0c2VsZiwgYnV0IGl0IG1heSBiZSB1c2VmdWwgaW4gc29tZSBjYXNlcyB0byBrbm93IGFoZWFkDQorICAgICAgICAvLy8gb2YgdGltZSB3aGF0IHR5cGUgb2Ygb2JqZWN0IHdpbGwgYmUgcmV0dXJuZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgSU1lc3NhZ2UgR2V0UmVzcG9uc2VQcm90b3R5cGUoTWV0aG9kRGVzY3JpcHRvciBtZXRob2QpOw0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0ludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL0ludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Q3YjM3Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsMTEyIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtLklPOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBUaHJvd24gd2hlbiBhIHByb3RvY29sIG1lc3NhZ2UgYmVpbmcgcGFyc2VkIGlzIGludmFsaWQgaW4gc29tZSB3YXksDQorICAgIC8vLyBlLmcuIGl0IGNvbnRhaW5zIGEgbWFsZm9ybWVkIHZhcmludCBvciBhIG5lZ2F0aXZlIGJ5dGUgbGVuZ3RoLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiA6IElPRXhjZXB0aW9uDQorICAgIHsNCisgICAgICAgIGludGVybmFsIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkNCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkNCisgICAgICAgIHsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIFRydW5jYXRlZE1lc3NhZ2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAiV2hpbGUgcGFyc2luZyBhIHByb3RvY29sIG1lc3NhZ2UsIHRoZSBpbnB1dCBlbmRlZCB1bmV4cGVjdGVkbHkgIiArDQorICAgICAgICAgICAgICAgICJpbiB0aGUgbWlkZGxlIG9mIGEgZmllbGQuICBUaGlzIGNvdWxkIG1lYW4gZWl0aGVyIHRoYW4gdGhlICIgKw0KKyAgICAgICAgICAgICAgICAiaW5wdXQgaGFzIGJlZW4gdHJ1bmNhdGVkIG9yIHRoYXQgYW4gZW1iZWRkZWQgbWVzc2FnZSAiICsNCisgICAgICAgICAgICAgICAgIm1pc3JlcG9ydGVkIGl0cyBvd24gbGVuZ3RoLiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBOZWdhdGl2ZVNpemUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAiQ29kZWRJbnB1dFN0cmVhbSBlbmNvdW50ZXJlZCBhbiBlbWJlZGRlZCBzdHJpbmcgb3IgbWVzc2FnZSAiICsNCisgICAgICAgICAgICAgICAgIndoaWNoIGNsYWltZWQgdG8gaGF2ZSBuZWdhdGl2ZSBzaXplLiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gTWFsZm9ybWVkVmFyaW50KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgIkNvZGVkSW5wdXRTdHJlYW0gZW5jb3VudGVyZWQgYSBtYWxmb3JtZWQgdmFyaW50LiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gSW52YWxpZFRhZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oDQorICAgICAgICAgICAgICAgICJQcm90b2NvbCBtZXNzYWdlIGNvbnRhaW5lZCBhbiBpbnZhbGlkIHRhZyAoemVybykuIik7DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIEludmFsaWRFbmRUYWcoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAiUHJvdG9jb2wgbWVzc2FnZSBlbmQtZ3JvdXAgdGFnIGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgdGFnLiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBJbnZhbGlkV2lyZVR5cGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAiUHJvdG9jb2wgbWVzc2FnZSB0YWcgaGFkIGludmFsaWQgd2lyZSB0eXBlLiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBSZWN1cnNpb25MaW1pdEV4Y2VlZGVkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgIlByb3RvY29sIG1lc3NhZ2UgaGFkIHRvbyBtYW55IGxldmVscyBvZiBuZXN0aW5nLiAgTWF5IGJlIG1hbGljaW91cy4gICIgKw0KKyAgICAgICAgICAgICAgICAiVXNlIENvZGVkSW5wdXRTdHJlYW0uU2V0UmVjdXJzaW9uTGltaXQoKSB0byBpbmNyZWFzZSB0aGUgZGVwdGggbGltaXQuIik7DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIFNpemVMaW1pdEV4Y2VlZGVkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgIlByb3RvY29sIG1lc3NhZ2Ugd2FzIHRvbyBsYXJnZS4gIE1heSBiZSBtYWxpY2lvdXMuICAiICsNCisgICAgICAgICAgICAgICAgIlVzZSBDb2RlZElucHV0U3RyZWFtLlNldFNpemVMaW1pdCgpIHRvIGluY3JlYXNlIHRoZSBzaXplIGxpbWl0LiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBJbnZhbGlkTWVzc2FnZVN0cmVhbVRhZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oDQorICAgICAgICAgICAgICAgICJTdHJlYW0gb2YgcHJvdG9jb2wgbWVzc2FnZXMgaGFkIGludmFsaWQgdGFnLiBFeHBlY3RlZCB0YWcgaXMgbGVuZ3RoLWRlbGltaXRlZCBmaWVsZCAxLiIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL01lc3NhZ2VTdHJlYW1JdGVyYXRvci5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL01lc3NhZ2VTdHJlYW1JdGVyYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmQ2OTdjCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvTWVzc2FnZVN0cmVhbUl0ZXJhdG9yLmNzCkBAIC0wLDAgKzEsMTcwIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEl0ZXJhdGVzIG92ZXIgZGF0YSBjcmVhdGVkIHVzaW5nIGEgPHNlZSBjcmVmPSJNZXNzYWdlU3RyZWFtV3JpdGVye1R9IiAvPi4NCisgICAgLy8vIFVubGlrZSBNZXNzYWdlU3RyZWFtV3JpdGVyLCB0aGlzIGNsYXNzIGlzIG5vdCB1c3VhbGx5IGNvbnN0cnVjdGVkIGRpcmVjdGx5IHdpdGgNCisgICAgLy8vIGEgc3RyZWFtOyBpbnN0ZWFkIGl0IGlzIHByb3ZpZGVkIHdpdGggYSB3YXkgb2Ygb3BlbmluZyBhIHN0cmVhbSB3aGVuIGl0ZXJhdGlvbg0KKyAgICAvLy8gaXMgc3RhcnRlZC4gVGhlIHN0cmVhbSBpcyBjbG9zZWQgd2hlbiB0aGUgaXRlcmF0aW9uIGlzIGNvbXBsZXRlZCBvciB0aGUgZW51bWVyYXRvcg0KKyAgICAvLy8gaXMgZGlzcG9zZWQuIChUaGlzIG9jY3VycyBuYXR1cmFsbHkgd2hlbiB1c2luZyA8Yz5mb3JlYWNoPC9jPi4pDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBjbGFzcyBNZXNzYWdlU3RyZWFtSXRlcmF0b3I8VE1lc3NhZ2U+IDogSUVudW1lcmFibGU8VE1lc3NhZ2U+DQorICAgICAgICB3aGVyZSBUTWVzc2FnZSA6IElNZXNzYWdlPFRNZXNzYWdlPg0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFN0cmVhbVByb3ZpZGVyIHN0cmVhbVByb3ZpZGVyOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeTsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IHNpemVMaW1pdDsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUaGUgZGVmYXVsdCBpbnN0YW5jZSBvZiBUTWVzc2FnZSB0eXBlIHVzZWQgdG8gY29uc3RydWN0IGJ1aWxkZXJzIHdoaWxlIHJlYWRpbmcNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUTWVzc2FnZSBkZWZhdWx0TWVzc2FnZUluc3RhbmNlID0gQ3JlYXRlRGVmYXVsdEluc3RhbmNlKCk7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQW55IGV4Y2VwdGlvbiAod2l0aGluIHJlYXNvbikgdGhyb3duIGluIHR5cGUgY3RvciBpcyBjYXVnaHQgYW5kIHJldGhyb3duIGluIHRoZSBjb25zdHJ1Y3Rvci4NCisgICAgICAgIC8vLyBUaGlzIG1ha2VzIGxpZmUgYSBsb3Qgc2ltcGxlciBmb3IgdGhlIGNhbGxlci4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyBFeGNlcHRpb24gdHlwZUluaXRpYWxpemF0aW9uRXhjZXB0aW9uOw0KKw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFZhc3RseSBzaW1wbGlmaWVkIHRoZSByZWZsZWN0aW9uIHRvIHNpbXBseSBvYnRhaW4gdGhlIGRlZmF1bHQgaW5zdGFuY2UgYW5kIHVzZSBpdCB0byBjb25zdHJ1Y3QNCisgICAgICAgIC8vLyB0aGUgd2VhayBidWlsZGVyIHdoaWxlIHNpbXBseSBjYXN0aW5nIHRoZSByZXN1bHQuICBJZGVhbGx5IHRoaXMgY2xhc3Mgc2hvdWxkIGhhdmUgcmVxdWlyZWQgYSANCisgICAgICAgIC8vLyBUQnVpbGRlciB0eXBlIGFyZ3VtZW50IHdpdGggYSBuZXcoKSBjb25zdHJhaW50IHRvIGNvbnN0cnVjdCB0aGUgaW5pdGlhbCBpbnN0YW5jZSB0aGVyZWJ5IHRoZQ0KKyAgICAgICAgLy8vIHJlZmxlY3Rpb24gY291bGQgYmUgZWxpbWluYXRlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyBUTWVzc2FnZSBDcmVhdGVEZWZhdWx0SW5zdGFuY2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIChUTWVzc2FnZSl0eXBlb2YoVE1lc3NhZ2UpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR2V0UHJvcGVydHkoIkRlZmF1bHRJbnN0YW5jZSIsIHR5cGVvZihUTWVzc2FnZSksIG5ldyBUeXBlWzBdKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdldFZhbHVlKG51bGwsIG51bGwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0eXBlSW5pdGlhbGl6YXRpb25FeGNlcHRpb24gPSBlOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChUTWVzc2FnZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludCBFeHBlY3RlZFRhZyA9IFdpcmVGb3JtYXQuTWFrZVRhZygxLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7DQorDQorICAgICAgICBwcml2YXRlIE1lc3NhZ2VTdHJlYW1JdGVyYXRvcihTdHJlYW1Qcm92aWRlciBzdHJlYW1Qcm92aWRlciwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnksIGludCBzaXplTGltaXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhkZWZhdWx0TWVzc2FnZUluc3RhbmNlLCBudWxsKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uUmVmbGVjdGlvbi5UYXJnZXRJbnZvY2F0aW9uRXhjZXB0aW9uKHR5cGVJbml0aWFsaXphdGlvbkV4Y2VwdGlvbik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuc3RyZWFtUHJvdmlkZXIgPSBzdHJlYW1Qcm92aWRlcjsNCisgICAgICAgICAgICB0aGlzLmV4dGVuc2lvblJlZ2lzdHJ5ID0gZXh0ZW5zaW9uUmVnaXN0cnk7DQorICAgICAgICAgICAgdGhpcy5zaXplTGltaXQgPSBzaXplTGltaXQ7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIE1lc3NhZ2VTdHJlYW1JdGVyYXRvcihTdHJlYW1Qcm92aWRlciBzdHJlYW1Qcm92aWRlciwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpDQorICAgICAgICAgICAgOiB0aGlzKHN0cmVhbVByb3ZpZGVyLCBleHRlbnNpb25SZWdpc3RyeSwgQ29kZWRJbnB1dFN0cmVhbS5EZWZhdWx0U2l6ZUxpbWl0KQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugd2hpY2ggdXNlcyB0aGUgc2FtZSBzdHJlYW0gcHJvdmlkZXIgYXMgdGhpcyBvbmUsDQorICAgICAgICAvLy8gYnV0IHRoZSBzcGVjaWZpZWQgZXh0ZW5zaW9uIHJlZ2lzdHJ5Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBNZXNzYWdlU3RyZWFtSXRlcmF0b3I8VE1lc3NhZ2U+IFdpdGhFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25SZWdpc3RyeSBuZXdSZWdpc3RyeSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VTdHJlYW1JdGVyYXRvcjxUTWVzc2FnZT4oc3RyZWFtUHJvdmlkZXIsIG5ld1JlZ2lzdHJ5LCBzaXplTGltaXQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugd2hpY2ggdXNlcyB0aGUgc2FtZSBzdHJlYW0gcHJvdmlkZXIgYW5kIGV4dGVuc2lvbiByZWdpc3RyeSBhcyB0aGlzIG9uZSwNCisgICAgICAgIC8vLyBidXQgd2l0aCB0aGUgc3BlY2lmaWVkIHNpemUgbGltaXQuIE5vdGUgdGhhdCB0aGlzIG11c3QgYmUgYmlnIGVub3VnaCBmb3IgdGhlIGxhcmdlc3QgbWVzc2FnZQ0KKyAgICAgICAgLy8vIGFuZCB0aGUgdGFnIGFuZCBzaXplIHByZWNlZGluZyBpdC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgTWVzc2FnZVN0cmVhbUl0ZXJhdG9yPFRNZXNzYWdlPiBXaXRoU2l6ZUxpbWl0KGludCBuZXdTaXplTGltaXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlU3RyZWFtSXRlcmF0b3I8VE1lc3NhZ2U+KHN0cmVhbVByb3ZpZGVyLCBleHRlbnNpb25SZWdpc3RyeSwgbmV3U2l6ZUxpbWl0KTsNCisgICAgICAgIH0NCisNCisjaWYgQ0xJRU5UUFJPRklMRQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlU3RyZWFtSXRlcmF0b3I8VE1lc3NhZ2U+IEZyb21GaWxlKHN0cmluZyBmaWxlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZVN0cmVhbUl0ZXJhdG9yPFRNZXNzYWdlPigoKSA9PiBGaWxlLk9wZW5SZWFkKGZpbGUpLCBFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgICB9DQorI2VuZGlmDQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VTdHJlYW1JdGVyYXRvcjxUTWVzc2FnZT4gRnJvbVN0cmVhbVByb3ZpZGVyKFN0cmVhbVByb3ZpZGVyIHN0cmVhbVByb3ZpZGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZVN0cmVhbUl0ZXJhdG9yPFRNZXNzYWdlPihzdHJlYW1Qcm92aWRlciwgRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIElFbnVtZXJhdG9yPFRNZXNzYWdlPiBHZXRFbnVtZXJhdG9yKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB1c2luZyAoU3RyZWFtIHN0cmVhbSA9IHN0cmVhbVByb3ZpZGVyKCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShzdHJlYW0pOw0KKyAgICAgICAgICAgICAgICBpbnB1dC5TZXRTaXplTGltaXQoc2l6ZUxpbWl0KTsNCisgICAgICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgbmFtZSkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICgodGFnID09IDAgJiYgbmFtZSA9PSAiaXRlbSIpIHx8ICh0YWcgPT0gRXhwZWN0ZWRUYWcpKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIElCdWlsZGVyIGJ1aWxkZXIgPSBkZWZhdWx0TWVzc2FnZUluc3RhbmNlLldlYWtDcmVhdGVCdWlsZGVyRm9yVHlwZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKGJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gKFRNZXNzYWdlKWJ1aWxkZXIuV2Vha0J1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRNZXNzYWdlU3RyZWFtVGFnKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICBpbnB1dC5SZXNldFNpemVDb3VudGVyKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gR2V0RW51bWVyYXRvcigpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL01lc3NhZ2VTdHJlYW1Xcml0ZXIuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9NZXNzYWdlU3RyZWFtV3JpdGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MzBlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9NZXNzYWdlU3RyZWFtV3JpdGVyLmNzCkBAIC0wLDAgKzEsNzAgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW0uSU87DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFdyaXRlcyBtdWx0aXBsZSBtZXNzYWdlcyB0byB0aGUgc2FtZSBzdHJlYW0uIEVhY2ggbWVzc2FnZSBpcyB3cml0dGVuDQorICAgIC8vLyBhcyBpZiBpdCB3ZXJlIGFuIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBmaWVsZCAxIGluIGEgbGFyZ2VyIHByb3RvY29sIGJ1ZmZlci4NCisgICAgLy8vIFRoaXMgY2xhc3MgdGFrZXMgbm8gb3duZXJzaGlwIG9mIHRoZSBzdHJlYW0gaXQgaXMgZ2l2ZW47IGl0IG5ldmVyIGNsb3NlcyB0aGUNCisgICAgLy8vIHN0cmVhbS4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBNZXNzYWdlU3RyZWFtV3JpdGVyPFQ+IHdoZXJlIFQgOiBJTWVzc2FnZTxUPg0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkT3V0cHV0Ow0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENyZWF0ZXMgYW4gaW5zdGFuY2Ugd2hpY2ggd3JpdGVzIHRvIHRoZSBnaXZlbiBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdXRwdXQiPlN0cmVhbSB0byB3cml0ZSBtZXNzYWdlcyB0by48L3BhcmFtPg0KKyAgICAgICAgcHVibGljIE1lc3NhZ2VTdHJlYW1Xcml0ZXIoU3RyZWFtIG91dHB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBjb2RlZE91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKG91dHB1dCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZShUIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgY29kZWRPdXRwdXQuV3JpdGVNZXNzYWdlKDEsICJpdGVtIiwgbWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBGbHVzaCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgY29kZWRPdXRwdXQuRmx1c2goKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9NZXNzYWdlVXRpbC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL01lc3NhZ2VVdGlsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjBkMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9NZXNzYWdlVXRpbC5jcwpAQCAtMCwwICsxLDEwOSBAQAor77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gVXRpbGl0aWVzIGZvciBhcmJpdHJhcnkgbWVzc2FnZXMgb2YgYW4gdW5rbm93biB0eXBlLiBUaGlzIGNsYXNzIGRvZXMgbm90IHVzZQ0KKyAgICAvLy8gZ2VuZXJpY3MgcHJlY2lzZWx5IGJlY2F1c2UgaXQgaXMgZGVzaWduZWQgZm9yIGR5bmFtaWNhbGx5IGRpc2NvdmVyZWQgdHlwZXMuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVzc2FnZVV0aWwNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIGRlZmF1bHQgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIHR5cGUuIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24NCisgICAgICAgIC8vLyAoZGlyZWN0bHkgZnJvbSB0aGlzIGNvZGUpLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHN1aXRhYmxlIHRvIGJlIGRpc3BsYXllZCB0byBhIHVzZXIuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIj5UaGUgdHlwZSBwYXJhbWV0ZXIgaXMgbnVsbC48L2V4Y2VwdGlvbj4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5UaGUgdHlwZSBkb2Vzbid0IGltcGxlbWVudCBJTWVzc2FnZSwgb3IgZG9lc24ndA0KKyAgICAgICAgLy8vIGhhdmUgYSBzdGF0aWMgRGVmYXVsdE1lc3NhZ2UgcHJvcGVydHkgb2YgdGhlIHNhbWUgdHlwZSwgb3IgaXMgZ2VuZXJpYyBvciBhYnN0cmFjdC48L2V4Y2VwdGlvbj4NCisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICBwdWJsaWMgc3RhdGljIElNZXNzYWdlIEdldERlZmF1bHRNZXNzYWdlKFR5cGUgdHlwZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigidHlwZSIsICJObyB0eXBlIHNwZWNpZmllZC4iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHR5cGUuSXNBYnN0cmFjdCB8fCB0eXBlLklzR2VuZXJpY1R5cGVEZWZpbml0aW9uKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gZ2V0IGEgZGVmYXVsdCBtZXNzYWdlIGZvciBhbiBhYnN0cmFjdCBvciBnZW5lcmljIHR5cGUgKCIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5GdWxsTmFtZSArICIpIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghdHlwZW9mKElNZXNzYWdlKS5Jc0Fzc2lnbmFibGVGcm9tKHR5cGUpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gZ2V0IGEgZGVmYXVsdCBtZXNzYWdlIGZvciBub24tbWVzc2FnZSB0eXBlICgiICsgdHlwZS5GdWxsTmFtZSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBQcm9wZXJ0eUluZm8gcHJvcGVydHkgPSB0eXBlLkdldFByb3BlcnR5KCJEZWZhdWx0SW5zdGFuY2UiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ0ZsYWdzLlN0YXRpYyB8IEJpbmRpbmdGbGFncy5QdWJsaWMgfCBCaW5kaW5nRmxhZ3MuTm9uUHVibGljKTsNCisgICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbih0eXBlLkZ1bGxOYW1lICsgIiBkb2Vzbid0IGhhdmUgYSBzdGF0aWMgRGVmYXVsdEluc3RhbmNlIHByb3BlcnR5Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5Qcm9wZXJ0eVR5cGUgIT0gdHlwZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbih0eXBlLkZ1bGxOYW1lICsgIi5EZWZhdWx0SW5zdGFuY2UgcHJvcGVydHkgaXMgb2YgdGhlIHdyb25nIHR5cGUiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIChJTWVzc2FnZSkgcHJvcGVydHkuR2V0VmFsdWUobnVsbCwgbnVsbCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0aGUgZGVmYXVsdCBtZXNzYWdlIGZvciB0aGUgdHlwZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBUaGlzIGlzIGp1c3QNCisgICAgICAgIC8vLyBhIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIGNhbGxpbmcgVHlwZS5HZXRUeXBlIGFuZCB0aGVuIEdldERlZmF1bHRNZXNzYWdlLg0KKyAgICAgICAgLy8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZSBtZXNzYWdlIHdpbGwgYmUgc3VpdGFibGUgdG8gYmUgZGlzcGxheWVkIHRvIGEgdXNlci4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGVOYW1lIj48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIj5UaGUgdHlwZU5hbWUgcGFyYW1ldGVyIGlzIG51bGwuPC9leGNlcHRpb24+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+VGhlIHR5cGUgZG9lc24ndCBpbXBsZW1lbnQgSU1lc3NhZ2UsIG9yIGRvZXNuJ3QNCisgICAgICAgIC8vLyBoYXZlIGEgc3RhdGljIERlZmF1bHRNZXNzYWdlIHByb3BlcnR5IG9mIHRoZSBzYW1lIHR5cGUsIG9yIGNhbid0IGJlIGZvdW5kLjwvZXhjZXB0aW9uPg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBJTWVzc2FnZSBHZXREZWZhdWx0TWVzc2FnZShzdHJpbmcgdHlwZU5hbWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHR5cGVOYW1lID09IG51bGwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ0eXBlTmFtZSIsICJObyB0eXBlIG5hbWUgc3BlY2lmaWVkLiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBUeXBlIHR5cGUgPSBUeXBlLkdldFR5cGUodHlwZU5hbWUpOw0KKyAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIHR5cGUgIiArIHR5cGVOYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIEdldERlZmF1bHRNZXNzYWdlKHR5cGUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL05hbWVIZWxwZXJzLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvTmFtZUhlbHBlcnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhMWY5YQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL05hbWVIZWxwZXJzLmNzCkBAIC0wLDAgKzEsMTQwIEBACivvu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gSGVscGVycyBmb3IgY29udmVydGluZyBuYW1lcyB0byBwYXNjYWwgY2FzZSBldGMuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBjbGFzcyBOYW1lSGVscGVycw0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGFscGhhLW51bWVyaWMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSZWdleCBOb25BbHBoYU51bWVyaWNDaGFyYWN0ZXJzID0gbmV3IFJlZ2V4KEAiW15hLXpBLVowLTldKyIpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIE1hdGNoZXMgbG93ZXItY2FzZSBjaGFyYWN0ZXIgdGhhdCBmb2xsb3cgZWl0aGVyIGFuIHVuZGVyc2NvcmUsIG9yIGEgbnVtYmVyDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUmVnZXggVW5kZXJzY29yZU9yTnVtYmVyV2l0aExvd2VyQ2FzZSA9IG5ldyBSZWdleChAIlswLTlfXVthLXpdIik7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmVtb3ZlcyBub24gYWxwaGEgbnVtZXJpYyBjaGFyYWN0ZXJzIHdoaWxlIGNhcGl0YWxpemluZyBsZXR0ZXJzIHRoYXQgZm9sbG93DQorICAgICAgICAvLy8gYSBudW1iZXIgb3IgdW5kZXJzY29yZS4gIFRoZSBmaXJzdCBsZXR0ZXIgaXMgYWx3YXlzIHVwcGVyIGNhc2UuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgVW5kZXJzY29yZXNUb1Bhc2NhbENhc2Uoc3RyaW5nIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyBuYW1lID0gVW5kZXJzY29yZXNUb1VwcGVyQ2FzZShpbnB1dCk7DQorDQorICAgICAgICAgICAgLy8gUGFzY2FsIGNhc2UgYWx3YXlzIGJlZ2lucyB3aXRoIHVwcGVyLWNhc2UgbGV0dGVyDQorICAgICAgICAgICAgaWYgKENoYXIuSXNMb3dlcihuYW1lWzBdKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG5hbWUuVG9DaGFyQXJyYXkoKTsNCisgICAgICAgICAgICAgICAgY2hhcnNbMF0gPSBjaGFyLlRvVXBwZXIoY2hhcnNbMF0pOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHN0cmluZyhjaGFycyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBuYW1lOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlbW92ZXMgbm9uIGFscGhhIG51bWVyaWMgY2hhcmFjdGVycyB3aGlsZSBjYXBpdGFsaXppbmcgbGV0dGVycyB0aGF0IGZvbGxvdw0KKyAgICAgICAgLy8vIGEgbnVtYmVyIG9yIHVuZGVyc2NvcmUuICBUaGUgZmlyc3QgbGV0dGVyIGlzIGFsd2F5cyBsb3dlciBjYXNlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2Uoc3RyaW5nIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyBuYW1lID0gVW5kZXJzY29yZXNUb1VwcGVyQ2FzZShpbnB1dCk7DQorDQorICAgICAgICAgICAgLy8gQ2FtZWwgY2FzZSBhbHdheXMgYmVnaW5zIHdpdGggbG93ZXItY2FzZSBsZXR0ZXINCisgICAgICAgICAgICBpZiAoQ2hhci5Jc1VwcGVyKG5hbWVbMF0pKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbmFtZS5Ub0NoYXJBcnJheSgpOw0KKyAgICAgICAgICAgICAgICBjaGFyc1swXSA9IGNoYXIuVG9Mb3dlcihjaGFyc1swXSk7DQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc3RyaW5nKGNoYXJzKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIG5hbWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2FwaXRhbGl6ZXMgYW55IGNoYXJhY3RlcnMgZm9sbG93aW5nIGFuICdfJyBvciBhIG51bWJlciAnMCcgLSAnOScgYW5kIHJlbW92ZXMNCisgICAgICAgIC8vLyBhbGwgbm9uIGFscGhhLW51bWVyaWMgY2hhcmFjdGVycy4gIElmIHRoZSByZXN1bHRpbmcgc3RyaW5nIGJlZ2lucyB3aXRoIGEgbnVtYmVyDQorICAgICAgICAvLy8gYW4gJ18nIHdpbGwgYmUgcHJlZml4ZWQuICANCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgVW5kZXJzY29yZXNUb1VwcGVyQ2FzZShzdHJpbmcgaW5wdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSBVbmRlcnNjb3JlT3JOdW1iZXJXaXRoTG93ZXJDYXNlLlJlcGxhY2UoaW5wdXQsIHggPT4geC5WYWx1ZS5Ub1VwcGVyKCkpOw0KKyAgICAgICAgICAgIG5hbWUgPSBOb25BbHBoYU51bWVyaWNDaGFyYWN0ZXJzLlJlcGxhY2UobmFtZSwgU3RyaW5nLkVtcHR5KTsNCisNCisgICAgICAgICAgICBpZiAobmFtZS5MZW5ndGggPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJUaGUgZmllbGQgbmFtZSAnezB9JyBpcyBpbnZhbGlkLiIsIGlucHV0KSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vIEZpZWxkcyBjYW4gbm90IHN0YXJ0IHdpdGggYSBudW1iZXINCisgICAgICAgICAgICBpZiAoQ2hhci5Jc051bWJlcihuYW1lWzBdKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIG5hbWUgPSAnXycgKyBuYW1lOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICByZXR1cm4gbmFtZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgU3RyaXBQcm90byhzdHJpbmcgdGV4dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoIVN0cmlwU3VmZml4KHJlZiB0ZXh0LCAiLnByb3RvZGV2ZWwiKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFN0cmlwU3VmZml4KHJlZiB0ZXh0LCAiLnByb3RvIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0ZXh0Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEF0dGVtcHRzIHRvIHN0cmlwIGEgc3VmZml4IGZyb20gYSBzdHJpbmcsIHJldHVybmluZyB3aGV0aGVyDQorICAgICAgICAvLy8gb3Igbm90IHRoZSBzdWZmaXggd2FzIGFjdHVhbGx5IHByZXNlbnQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIFN0cmlwU3VmZml4KHJlZiBzdHJpbmcgdGV4dCwgc3RyaW5nIHN1ZmZpeCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAodGV4dC5FbmRzV2l0aChzdWZmaXgpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuU3Vic3RyaW5nKDAsIHRleHQuTGVuZ3RoIC0gc3VmZml4Lkxlbmd0aCk7DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmFiNDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw3MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOw0KK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOw0KKw0KKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgDQorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24NCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuDQordXNpbmcgU3lzdGVtLlNlY3VyaXR5Ow0KKw0KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiUHJvdG9jb2xCdWZmZXJzIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJQcm90b2NvbEJ1ZmZlcnMiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMDgiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildDQorDQorLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoNCisvLw0KKy8vICAgICAgTWFqb3IgVmVyc2lvbg0KKy8vICAgICAgTWlub3IgVmVyc2lvbiANCisvLyAgICAgIEJ1aWxkIE51bWJlcg0KKy8vICAgICAgUmV2aXNpb24NCisvLw0KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzIA0KKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6DQorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjIuNC4xLjU1NSIpXQ0KKw0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIyLjQuMS41NTUiKV0NCisNCisjaWYgIU5PRklMRVZFUlNJT04NCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjIuNC4xLjU1NSIpXQ0KKyNlbmRpZg0KKw0KK1thc3NlbWJseTogQ0xTQ29tcGxpYW50KHRydWUpXQ0KKw0KKyNpZiBDTElFTlRQUk9GSUxFIC8vIFJPSyAtIG5vdCBkZWZpbmVkIGluIFNMLCBDRiwgb3IgUEwNCitbYXNzZW1ibHk6IEFsbG93UGFydGlhbGx5VHJ1c3RlZENhbGxlcnNdDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLkNGMjAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLkNGMjAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYWRmMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnMuQ0YyMC5jc3Byb2oKQEAgLTAsMCArMSwxNjYgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DT01QQUNUX0ZSQU1FV09SSzwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPkNGMjA8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVyczwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYyLjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPns0RDYyOEI1Qi0yRkJDLTRBQTYtOEMxNi0xOTcyNDJBRUI4ODR9O3tGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8UGxhdGZvcm1GYW1pbHlOYW1lPlNtYXJ0cGhvbmU8L1BsYXRmb3JtRmFtaWx5TmFtZT4NCisgICAgPFBsYXRmb3JtSUQ+ZjI3ZGEzMjktMzI2OS00MTkxLTk4ZTAtYzg3ZDNkN2YxZGI5PC9QbGF0Zm9ybUlEPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXENGMjBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxDRjIwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9GSUxFVkVSU0lPTjtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXENGMjBcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXENGMjBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PRklMRVZFUlNJT047Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlQXJyYXkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVTdHJpbmcuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXEVudW1lcmFibGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xJUG9wc2ljbGVMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTaXplLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDdXN0b21TZXJpYWxpemF0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZWxlZ2F0ZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xEaWN0aW9uYXJpZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXExpc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xSZWFkT25seURpY3Rpb25hcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcQ1NoYXJwT3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvclByb3Rvc1xEZXNjcmlwdG9yUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yUHJvdG9zXElEZXNjcmlwdG9yUHJvdG8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcUGFydGlhbENsYXNzZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JCYXNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xEZXNjcmlwdG9yUG9vbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRGVzY3JpcHRvclV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xFbnVtRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRW51bVZhbHVlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGREZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZE1hcHBpbmdBdHRyaWJ1dGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmlsZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXElEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xJbmRleGVkRGVzY3JpcHRvckJhc2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1hcHBlZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1lc3NhZ2VEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xNZXRob2REZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xQYWNrYWdlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcU2VydmljZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkR5bmFtaWNNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbnVtTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uSW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uUmVnaXN0cnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVmbGVjdGlvblV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFNpbmdsZUVudW1BY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcU2luZ2xlTWVzc2FnZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xTaW5nbGVQcmltaXRpdmVBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRQcmltaXRpdmVBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRFbnVtQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXElGaWVsZEFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xGaWVsZEFjY2Vzc29yVGFibGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFJlcGVhdGVkTWVzc2FnZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZFNldC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZE1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklCdWlsZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25CYXNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZElucHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJwY0NoYW5uZWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklScGNDb250cm9sbGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJUnBjRGlzcGF0Y2guY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklTZXJ2aWNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlU3RyZWFtSXRlcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1Xcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VVdGlsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJOYW1lSGVscGVycy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJwY1V0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNvcnRlZExpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRGb3JtYXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRUb2tlbml6ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRocm93SGVscGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bkZpZWxkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmtub3duRmllbGRTZXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IldpcmVGb3JtYXQuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNvbXBhY3RGcmFtZXdvcmsuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iPg0KKyAgICAgICAgPEhvc3RpbmdQcm9jZXNzIGRpc2FibGU9IjEiIC8+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnMuQ0YzNS5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnMuQ0YzNS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlMzVjMQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Byb3RvY29sQnVmZmVycy5DRjM1LmNzcHJvagpAQCAtMCwwICsxLDE2NyBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNPTVBBQ1RfRlJBTUVXT1JLPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+Q0YzNTwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+ezRENjI4QjVCLTJGQkMtNEFBNi04QzE2LTE5NzI0MkFFQjg4NH07e0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxQbGF0Zm9ybUZhbWlseU5hbWU+U21hcnRwaG9uZTwvUGxhdGZvcm1GYW1pbHlOYW1lPg0KKyAgICA8UGxhdGZvcm1JRD5mMjdkYTMyOS0zMjY5LTQxOTEtOThlMC1jODdkM2Q3ZjFkYjk8L1BsYXRmb3JtSUQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cQ0YzNVxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXENGMzVcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT0ZJTEVWRVJTSU9OPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxDRjM1XFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxDRjM1XFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT0ZJTEVWRVJTSU9OPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlQXJyYXkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVTdHJpbmcuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXEVudW1lcmFibGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xJUG9wc2ljbGVMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTaXplLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDdXN0b21TZXJpYWxpemF0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZWxlZ2F0ZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xEaWN0aW9uYXJpZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXExpc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xSZWFkT25seURpY3Rpb25hcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcQ1NoYXJwT3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvclByb3Rvc1xEZXNjcmlwdG9yUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yUHJvdG9zXElEZXNjcmlwdG9yUHJvdG8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcUGFydGlhbENsYXNzZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JCYXNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xEZXNjcmlwdG9yUG9vbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRGVzY3JpcHRvclV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xFbnVtRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRW51bVZhbHVlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGREZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZE1hcHBpbmdBdHRyaWJ1dGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmlsZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXElEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xJbmRleGVkRGVzY3JpcHRvckJhc2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1hcHBlZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1lc3NhZ2VEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xNZXRob2REZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xQYWNrYWdlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcU2VydmljZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkR5bmFtaWNNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbnVtTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uSW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uUmVnaXN0cnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVmbGVjdGlvblV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFNpbmdsZUVudW1BY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcU2luZ2xlTWVzc2FnZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xTaW5nbGVQcmltaXRpdmVBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRQcmltaXRpdmVBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRFbnVtQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXElGaWVsZEFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xGaWVsZEFjY2Vzc29yVGFibGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFJlcGVhdGVkTWVzc2FnZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZFNldC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZE1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklCdWlsZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25CYXNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZElucHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJwY0NoYW5uZWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklScGNDb250cm9sbGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJUnBjRGlzcGF0Y2guY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklTZXJ2aWNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlU3RyZWFtSXRlcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1Xcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VVdGlsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJOYW1lSGVscGVycy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJwY1V0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNvcnRlZExpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRGb3JtYXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRUb2tlbml6ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRocm93SGVscGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bkZpZWxkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmtub3duRmllbGRTZXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IldpcmVGb3JtYXQuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNvbXBhY3RGcmFtZXdvcmsuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iPg0KKyAgICAgICAgPEhvc3RpbmdQcm9jZXNzIGRpc2FibGU9IjEiIC8+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnMuTkVUMjAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLk5FVDIwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmJhNzI4Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLk5FVDIwLmNzcHJvagpAQCAtMCwwICsxLDE1NCBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQyMDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djIuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQyMFxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDIwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMjBcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDIwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlQXJyYXkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVTdHJpbmcuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXEVudW1lcmFibGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xJUG9wc2ljbGVMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTaXplLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDdXN0b21TZXJpYWxpemF0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZWxlZ2F0ZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xEaWN0aW9uYXJpZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXExpc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xSZWFkT25seURpY3Rpb25hcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcQ1NoYXJwT3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvclByb3Rvc1xEZXNjcmlwdG9yUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yUHJvdG9zXElEZXNjcmlwdG9yUHJvdG8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcUGFydGlhbENsYXNzZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JCYXNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xEZXNjcmlwdG9yUG9vbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRGVzY3JpcHRvclV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xFbnVtRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRW51bVZhbHVlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGREZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZE1hcHBpbmdBdHRyaWJ1dGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmlsZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXElEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xJbmRleGVkRGVzY3JpcHRvckJhc2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1hcHBlZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1lc3NhZ2VEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xNZXRob2REZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xQYWNrYWdlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcU2VydmljZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkR5bmFtaWNNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbnVtTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uSW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uUmVnaXN0cnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVmbGVjdGlvblV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFNpbmdsZUVudW1BY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcU2luZ2xlTWVzc2FnZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xTaW5nbGVQcmltaXRpdmVBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRQcmltaXRpdmVBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRFbnVtQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXElGaWVsZEFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xGaWVsZEFjY2Vzc29yVGFibGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFJlcGVhdGVkTWVzc2FnZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZFNldC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZE1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklCdWlsZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25CYXNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZElucHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJwY0NoYW5uZWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklScGNDb250cm9sbGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJUnBjRGlzcGF0Y2guY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklTZXJ2aWNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlU3RyZWFtSXRlcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1Xcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VVdGlsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJOYW1lSGVscGVycy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJwY1V0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNvcnRlZExpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRGb3JtYXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRUb2tlbml6ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRocm93SGVscGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bkZpZWxkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmtub3duRmllbGRTZXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IldpcmVGb3JtYXQuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnMuTkVUMzUuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLk5FVDM1LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTc5ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLk5FVDM1LmNzcHJvagpAQCAtMCwwICsxLDE1NSBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQzNTwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDM1XERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdEJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZUFycmF5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlU3RyaW5nLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xFbnVtZXJhYmxlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcSVBvcHNpY2xlTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcUG9wc2ljbGVMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU2l6ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ3VzdG9tU2VyaWFsaXphdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVsZWdhdGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZElucHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZE91dHB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcRGljdGlvbmFyaWVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xMaXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcUmVhZE9ubHlEaWN0aW9uYXJ5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yUHJvdG9zXENTaGFycE9wdGlvbnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcRGVzY3JpcHRvclByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvclByb3Rvc1xJRGVzY3JpcHRvclByb3RvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yUHJvdG9zXFBhcnRpYWxDbGFzc2VzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xEZXNjcmlwdG9yQmFzZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRGVzY3JpcHRvclBvb2wuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JVdGlsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRW51bURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEVudW1WYWx1ZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGRNYXBwaW5nQXR0cmlidXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpbGVEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xJRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcSW5kZXhlZERlc2NyaXB0b3JCYXNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xNYXBwZWRUeXBlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xNZXNzYWdlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcTWV0aG9kRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcUGFja2FnZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXFNlcnZpY2VEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEeW5hbWljTWVzc2FnZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRW51bUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvbkluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvblJlZ2lzdHJ5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25SZWdpc3RyeUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFJlZmxlY3Rpb25VdGlsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xTaW5nbGVFbnVtQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFNpbmdsZU1lc3NhZ2VBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcU2luZ2xlUHJpbWl0aXZlQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFJlcGVhdGVkUHJpbWl0aXZlQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFJlcGVhdGVkRW51bUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xJRmllbGRBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcRmllbGRBY2Nlc3NvclRhYmxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xSZXBlYXRlZE1lc3NhZ2VBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRTZXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZyYW1ld29ya1BvcnRhYmlsaXR5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRCdWlsZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQnVpbGRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkRXh0ZW5zaW9uQmFzZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ29kZWRJbnB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUNvZGVkT3V0cHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJTWVzc2FnZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSU1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklScGNDaGFubmVsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJUnBjQ29udHJvbGxlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJwY0Rpc3BhdGNoLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJU2VydmljZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVN0cmVhbUl0ZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlU3RyZWFtV3JpdGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlVXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTmFtZUhlbHBlcnMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJScGNVdGlsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTb3J0ZWRMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXh0Rm9ybWF0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXh0R2VuZXJhdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXh0VG9rZW5pemVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUaHJvd0hlbHBlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlVua25vd25GaWVsZC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bkZpZWxkU2V0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJXaXJlRm9ybWF0LmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLk5FVDQwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Byb3RvY29sQnVmZmVycy5ORVQ0MC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5NTc3OAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Byb3RvY29sQnVmZmVycy5ORVQ0MC5jc3Byb2oKQEAgLTAsMCArMSwxNTUgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DTElFTlRQUk9GSUxFPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+TkVUNDA8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVyczwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUNDBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQ0MFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUNDBcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDQwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVBcnJheS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZVN0cmluZy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcRW51bWVyYWJsZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXElQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFBvcHNpY2xlTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNpemUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkN1c3RvbVNlcmlhbGl6YXRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlbGVnYXRlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRJbnB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXERpY3Rpb25hcmllcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcTGlzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFJlYWRPbmx5RGljdGlvbmFyeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvclByb3Rvc1xDU2hhcnBPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yUHJvdG9zXERlc2NyaXB0b3JQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcSURlc2NyaXB0b3JQcm90by5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvclByb3Rvc1xQYXJ0aWFsQ2xhc3Nlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRGVzY3JpcHRvckJhc2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JQb29sLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xEZXNjcmlwdG9yVXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEVudW1EZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xFbnVtVmFsdWVEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZERlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkTWFwcGluZ0F0dHJpYnV0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGRUeXBlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWxlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcSURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEluZGV4ZWREZXNjcmlwdG9yQmFzZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcTWFwcGVkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcTWVzc2FnZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1ldGhvZERlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXFBhY2thZ2VEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xTZXJ2aWNlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHluYW1pY01lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkVudW1MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25JbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25SZWdpc3RyeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xSZWZsZWN0aW9uVXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcU2luZ2xlRW51bUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xTaW5nbGVNZXNzYWdlQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFNpbmdsZVByaW1pdGl2ZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xSZXBlYXRlZFByaW1pdGl2ZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xSZXBlYXRlZEVudW1BY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcSUZpZWxkQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXEZpZWxkQWNjZXNzb3JUYWJsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRNZXNzYWdlQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkU2V0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGcmFtZXdvcmtQb3J0YWJpbGl0eS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkQnVpbGRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEV4dGVuc2lvbkxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkTWVzc2FnZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEV4dGVuc2lvbkJhc2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZE91dHB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSU1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJUnBjQ2hhbm5lbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJwY0NvbnRyb2xsZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklScGNEaXNwYXRjaC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVNlcnZpY2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1JdGVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVN0cmVhbVdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik5hbWVIZWxwZXJzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUnBjVXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU29ydGVkTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGV4dEZvcm1hdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGV4dEdlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGV4dFRva2VuaXplci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGhyb3dIZWxwZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmtub3duRmllbGQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlVua25vd25GaWVsZFNldC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iV2lyZUZvcm1hdC5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Byb3RvY29sQnVmZmVycy5QTDQwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Byb3RvY29sQnVmZmVycy5QTDQwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGZmZGRiCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLlBMNDAuY3Nwcm9qCkBAIC0wLDAgKzEsMTU4IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiB4bWxuczpjcz0idXJuOnNjaGVtYXMtY3NoYXJwLXByb2plY3Q6dGVtcGxhdGUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5QT1JUQUJMRV9MSUJSQVJZPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+UEw0MDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgICAgPE1pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uPjEwLjA8L01pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57Nzg2QzgzMEYtMDdBMS00MDhCLUJEN0YtNkVFMDQ4MDlENkRCfTt7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFRhcmdldEZyYW1ld29ya1Byb2ZpbGU+UHJvZmlsZTE8L1RhcmdldEZyYW1ld29ya1Byb2ZpbGU+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cUEw0MFxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXFBMNDBcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxQTDQwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxQTDQwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlQXJyYXkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVTdHJpbmcuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXEVudW1lcmFibGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xJUG9wc2ljbGVMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTaXplLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDdXN0b21TZXJpYWxpemF0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZWxlZ2F0ZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xEaWN0aW9uYXJpZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXExpc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xSZWFkT25seURpY3Rpb25hcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcQ1NoYXJwT3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvclByb3Rvc1xEZXNjcmlwdG9yUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yUHJvdG9zXElEZXNjcmlwdG9yUHJvdG8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcUGFydGlhbENsYXNzZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JCYXNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xEZXNjcmlwdG9yUG9vbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRGVzY3JpcHRvclV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xFbnVtRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRW51bVZhbHVlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGREZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZE1hcHBpbmdBdHRyaWJ1dGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmlsZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXElEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xJbmRleGVkRGVzY3JpcHRvckJhc2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1hcHBlZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1lc3NhZ2VEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xNZXRob2REZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xQYWNrYWdlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcU2VydmljZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkR5bmFtaWNNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbnVtTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uSW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uUmVnaXN0cnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVmbGVjdGlvblV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFNpbmdsZUVudW1BY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcU2luZ2xlTWVzc2FnZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xTaW5nbGVQcmltaXRpdmVBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRQcmltaXRpdmVBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRFbnVtQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXElGaWVsZEFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xGaWVsZEFjY2Vzc29yVGFibGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFJlcGVhdGVkTWVzc2FnZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZFNldC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZE1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklCdWlsZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25CYXNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZElucHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJwY0NoYW5uZWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklScGNDb250cm9sbGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJUnBjRGlzcGF0Y2guY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklTZXJ2aWNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlU3RyZWFtSXRlcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1Xcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VVdGlsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJOYW1lSGVscGVycy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJwY1V0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNvcnRlZExpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRGb3JtYXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRUb2tlbml6ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRocm93SGVscGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bkZpZWxkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmtub3duRmllbGRTZXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IldpcmVGb3JtYXQuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFBvcnRhYmxlXCQoVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbilcTWljcm9zb2Z0LlBvcnRhYmxlLkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLlNMMjAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLlNMMjAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZmM4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnMuU0wyMC5jc3Byb2oKQEAgLTAsMCArMSwxNjkgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiIHhtbG5zOmNzPSJ1cm46c2NoZW1hcy1jc2hhcnAtcHJvamVjdDp0ZW1wbGF0ZSI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPlNJTFZFUkxJR0hUPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+U0wyMDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djIuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+e0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn07e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxTaWx2ZXJsaWdodEFwcGxpY2F0aW9uPmZhbHNlPC9TaWx2ZXJsaWdodEFwcGxpY2F0aW9uPg0KKyAgICA8VmFsaWRhdGVYYW1sPmZhbHNlPC9WYWxpZGF0ZVhhbWw+DQorICAgIDxUaHJvd0Vycm9yc0luVmFsaWRhdGlvbj5mYWxzZTwvVGhyb3dFcnJvcnNJblZhbGlkYXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cU0wyMFxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXFNMMjBcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q7Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDIwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDIwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q7Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlQXJyYXkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVTdHJpbmcuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXEVudW1lcmFibGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xJUG9wc2ljbGVMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTaXplLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDdXN0b21TZXJpYWxpemF0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZWxlZ2F0ZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xEaWN0aW9uYXJpZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXExpc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xSZWFkT25seURpY3Rpb25hcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcQ1NoYXJwT3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvclByb3Rvc1xEZXNjcmlwdG9yUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yUHJvdG9zXElEZXNjcmlwdG9yUHJvdG8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcUGFydGlhbENsYXNzZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JCYXNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xEZXNjcmlwdG9yUG9vbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRGVzY3JpcHRvclV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xFbnVtRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRW51bVZhbHVlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGREZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZE1hcHBpbmdBdHRyaWJ1dGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmlsZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXElEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xJbmRleGVkRGVzY3JpcHRvckJhc2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1hcHBlZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1lc3NhZ2VEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xNZXRob2REZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xQYWNrYWdlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcU2VydmljZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkR5bmFtaWNNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbnVtTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uSW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uUmVnaXN0cnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVmbGVjdGlvblV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFNpbmdsZUVudW1BY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcU2luZ2xlTWVzc2FnZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xTaW5nbGVQcmltaXRpdmVBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRQcmltaXRpdmVBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRFbnVtQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXElGaWVsZEFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xGaWVsZEFjY2Vzc29yVGFibGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFJlcGVhdGVkTWVzc2FnZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZFNldC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZE1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklCdWlsZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25CYXNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZElucHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJwY0NoYW5uZWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklScGNDb250cm9sbGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJUnBjRGlzcGF0Y2guY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklTZXJ2aWNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlU3RyZWFtSXRlcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1Xcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VVdGlsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJOYW1lSGVscGVycy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJwY1V0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNvcnRlZExpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRGb3JtYXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRUb2tlbml6ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRocm93SGVscGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bkZpZWxkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmtub3duRmllbGRTZXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IldpcmVGb3JtYXQuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0XHYyLjBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8VmlzdWFsU3R1ZGlvPg0KKyAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9IntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9Ij4NCisgICAgICAgIDxTaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgICAgICA8U3RhcnRBY3Rpb24+T2ZmbGluZUFwcGxpY2F0aW9uPC9TdGFydEFjdGlvbj4NCisgICAgICAgIDwvU2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+DQorICAgIDwvVmlzdWFsU3R1ZGlvPg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Byb3RvY29sQnVmZmVycy5TTDMwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Byb3RvY29sQnVmZmVycy5TTDMwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmU1NzFjCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLlNMMzAuY3Nwcm9qCkBAIC0wLDAgKzEsMTcwIEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiB4bWxuczpjcz0idXJuOnNjaGVtYXMtY3NoYXJwLXByb2plY3Q6dGVtcGxhdGUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5TSUxWRVJMSUdIVDwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPlNMMzA8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVyczwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9O3tmYWUwNGVjMC0zMDFmLTExZDMtYmY0Yi0wMGMwNGY3OWVmYmN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8U2lsdmVybGlnaHRBcHBsaWNhdGlvbj5mYWxzZTwvU2lsdmVybGlnaHRBcHBsaWNhdGlvbj4NCisgICAgPFZhbGlkYXRlWGFtbD5mYWxzZTwvVmFsaWRhdGVYYW1sPg0KKyAgICA8VGhyb3dFcnJvcnNJblZhbGlkYXRpb24+ZmFsc2U8L1Rocm93RXJyb3JzSW5WYWxpZGF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFNMMzBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDMwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDMwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDMwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVBcnJheS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZVN0cmluZy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcRW51bWVyYWJsZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXElQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFBvcHNpY2xlTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNpemUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkN1c3RvbVNlcmlhbGl6YXRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlbGVnYXRlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRJbnB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXERpY3Rpb25hcmllcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcTGlzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFJlYWRPbmx5RGljdGlvbmFyeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvclByb3Rvc1xDU2hhcnBPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yUHJvdG9zXERlc2NyaXB0b3JQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcSURlc2NyaXB0b3JQcm90by5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvclByb3Rvc1xQYXJ0aWFsQ2xhc3Nlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRGVzY3JpcHRvckJhc2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JQb29sLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xEZXNjcmlwdG9yVXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEVudW1EZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xFbnVtVmFsdWVEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZERlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkTWFwcGluZ0F0dHJpYnV0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGRUeXBlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWxlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcSURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEluZGV4ZWREZXNjcmlwdG9yQmFzZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcTWFwcGVkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcTWVzc2FnZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1ldGhvZERlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXFBhY2thZ2VEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xTZXJ2aWNlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHluYW1pY01lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkVudW1MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25JbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25SZWdpc3RyeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xSZWZsZWN0aW9uVXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcU2luZ2xlRW51bUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xTaW5nbGVNZXNzYWdlQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFNpbmdsZVByaW1pdGl2ZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xSZXBlYXRlZFByaW1pdGl2ZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xSZXBlYXRlZEVudW1BY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcSUZpZWxkQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXEZpZWxkQWNjZXNzb3JUYWJsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRNZXNzYWdlQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkU2V0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGcmFtZXdvcmtQb3J0YWJpbGl0eS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkQnVpbGRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEV4dGVuc2lvbkxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkTWVzc2FnZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEV4dGVuc2lvbkJhc2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZE91dHB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSU1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJUnBjQ2hhbm5lbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJwY0NvbnRyb2xsZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklScGNEaXNwYXRjaC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVNlcnZpY2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1JdGVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVN0cmVhbVdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik5hbWVIZWxwZXJzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUnBjVXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU29ydGVkTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGV4dEZvcm1hdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGV4dEdlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGV4dFRva2VuaXplci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGhyb3dIZWxwZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmtub3duRmllbGQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlVua25vd25GaWVsZFNldC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iV2lyZUZvcm1hdC5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcU2lsdmVybGlnaHRcdjMuMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn0iPg0KKyAgICAgICAgPFNpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgICAgIDxTdGFydEFjdGlvbj5PZmZsaW5lQXBwbGljYXRpb248L1N0YXJ0QWN0aW9uPg0KKyAgICAgICAgPC9TaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4NCisgICAgPC9WaXN1YWxTdHVkaW8+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLlNMNDAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLlNMNDAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NjRlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnMuU0w0MC5jc3Byb2oKQEAgLTAsMCArMSwxNzEgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiIHhtbG5zOmNzPSJ1cm46c2NoZW1hcy1jc2hhcnAtcHJvamVjdDp0ZW1wbGF0ZSI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPlNJTFZFUkxJR0hUPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+U0w0MDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+e0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn07e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxTaWx2ZXJsaWdodEFwcGxpY2F0aW9uPmZhbHNlPC9TaWx2ZXJsaWdodEFwcGxpY2F0aW9uPg0KKyAgICA8VmFsaWRhdGVYYW1sPmZhbHNlPC9WYWxpZGF0ZVhhbWw+DQorICAgIDxUaHJvd0Vycm9yc0luVmFsaWRhdGlvbj5mYWxzZTwvVGhyb3dFcnJvcnNJblZhbGlkYXRpb24+DQorICAgIDxTaWx2ZXJsaWdodFZlcnNpb24+djQuMDwvU2lsdmVybGlnaHRWZXJzaW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFNMNDBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDQwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDQwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDQwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVBcnJheS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZVN0cmluZy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcRW51bWVyYWJsZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXElQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFBvcHNpY2xlTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNpemUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkN1c3RvbVNlcmlhbGl6YXRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlbGVnYXRlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRJbnB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXERpY3Rpb25hcmllcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcTGlzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFJlYWRPbmx5RGljdGlvbmFyeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvclByb3Rvc1xDU2hhcnBPcHRpb25zLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yUHJvdG9zXERlc2NyaXB0b3JQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcSURlc2NyaXB0b3JQcm90by5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvclByb3Rvc1xQYXJ0aWFsQ2xhc3Nlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRGVzY3JpcHRvckJhc2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JQb29sLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xEZXNjcmlwdG9yVXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEVudW1EZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xFbnVtVmFsdWVEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZERlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkTWFwcGluZ0F0dHJpYnV0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGRUeXBlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWxlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcSURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEluZGV4ZWREZXNjcmlwdG9yQmFzZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcTWFwcGVkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcTWVzc2FnZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1ldGhvZERlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXFBhY2thZ2VEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xTZXJ2aWNlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHluYW1pY01lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkVudW1MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25JbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25SZWdpc3RyeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xSZWZsZWN0aW9uVXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcU2luZ2xlRW51bUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xTaW5nbGVNZXNzYWdlQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFNpbmdsZVByaW1pdGl2ZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xSZXBlYXRlZFByaW1pdGl2ZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xSZXBlYXRlZEVudW1BY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcSUZpZWxkQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXEZpZWxkQWNjZXNzb3JUYWJsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRNZXNzYWdlQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkU2V0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGcmFtZXdvcmtQb3J0YWJpbGl0eS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkQnVpbGRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEV4dGVuc2lvbkxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkTWVzc2FnZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEV4dGVuc2lvbkJhc2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZE91dHB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSU1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJUnBjQ2hhbm5lbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJwY0NvbnRyb2xsZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklScGNEaXNwYXRjaC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVNlcnZpY2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1JdGVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVN0cmVhbVdyaXRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik5hbWVIZWxwZXJzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUnBjVXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU29ydGVkTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGV4dEZvcm1hdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGV4dEdlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGV4dFRva2VuaXplci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGhyb3dIZWxwZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmtub3duRmllbGQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlVua25vd25GaWVsZFNldC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iV2lyZUZvcm1hdC5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcU2lsdmVybGlnaHRcJChTaWx2ZXJsaWdodFZlcnNpb24pXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfSI+DQorICAgICAgICA8U2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICAgICAgPFN0YXJ0QWN0aW9uPk9mZmxpbmVBcHBsaWNhdGlvbjwvU3RhcnRBY3Rpb24+DQorICAgICAgICA8L1NpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnMuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTFmMDRhCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzLmNzcHJvagpAQCAtMCwwICsxLDE1NSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q0xJRU5UUFJPRklMRTwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPk5FVDM1PC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+ezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVyczwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlQXJyYXkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVTdHJpbmcuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXEVudW1lcmFibGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xJUG9wc2ljbGVMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTaXplLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDdXN0b21TZXJpYWxpemF0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZWxlZ2F0ZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xEaWN0aW9uYXJpZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXExpc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xSZWFkT25seURpY3Rpb25hcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcQ1NoYXJwT3B0aW9ucy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvclByb3Rvc1xEZXNjcmlwdG9yUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yUHJvdG9zXElEZXNjcmlwdG9yUHJvdG8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JQcm90b3NcUGFydGlhbENsYXNzZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JCYXNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xEZXNjcmlwdG9yUG9vbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRGVzY3JpcHRvclV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xFbnVtRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRW51bVZhbHVlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGREZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZE1hcHBpbmdBdHRyaWJ1dGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmlsZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXElEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xJbmRleGVkRGVzY3JpcHRvckJhc2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1hcHBlZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1lc3NhZ2VEZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xNZXRob2REZXNjcmlwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xQYWNrYWdlRGVzY3JpcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcU2VydmljZURlc2NyaXB0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkR5bmFtaWNNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbnVtTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uSW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uUmVnaXN0cnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVmbGVjdGlvblV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFNpbmdsZUVudW1BY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcU2luZ2xlTWVzc2FnZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xTaW5nbGVQcmltaXRpdmVBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRQcmltaXRpdmVBY2Nlc3Nvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRBY2Nlc3NcUmVwZWF0ZWRFbnVtQWNjZXNzb3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXElGaWVsZEFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZEFjY2Vzc1xGaWVsZEFjY2Vzc29yVGFibGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkQWNjZXNzXFJlcGVhdGVkTWVzc2FnZUFjY2Vzc29yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZFNldC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZE1lc3NhZ2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklCdWlsZGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25CYXNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZElucHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklNZXNzYWdlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJwY0NoYW5uZWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklScGNDb250cm9sbGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJUnBjRGlzcGF0Y2guY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklTZXJ2aWNlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNZXNzYWdlU3RyZWFtSXRlcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VTdHJlYW1Xcml0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VVdGlsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJOYW1lSGVscGVycy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlJwY1V0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNvcnRlZExpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRGb3JtYXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRHZW5lcmF0b3IuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRleHRUb2tlbml6ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRocm93SGVscGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bkZpZWxkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmtub3duRmllbGRTZXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IldpcmVGb3JtYXQuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLkNGMjAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5DRjIwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2YzNzNmCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5DRjIwLmNzcHJvagpAQCAtMCwwICsxLDExMSBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNPTVBBQ1RfRlJBTUVXT1JLPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+Q0YyMDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYyLjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPns0RDYyOEI1Qi0yRkJDLTRBQTYtOEMxNi0xOTcyNDJBRUI4ODR9O3tGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8UGxhdGZvcm1GYW1pbHlOYW1lPlNtYXJ0cGhvbmU8L1BsYXRmb3JtRmFtaWx5TmFtZT4NCisgICAgPFBsYXRmb3JtSUQ+ZjI3ZGEzMjktMzI2OS00MTkxLTk4ZTAtYzg3ZDNkN2YxZGI5PC9QbGF0Zm9ybUlEPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXENGMjBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxDRjIwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFO0xJVEU7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT0ZJTEVWRVJTSU9OO05PRVhURU5TSU9OUzwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cQ0YyMFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcQ0YyMFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0xJVEU7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT0ZJTEVWRVJTSU9OO05PRVhURU5TSU9OUzwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlQXJyYXkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTaXplLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xEaWN0aW9uYXJpZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXEVudW1lcmFibGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xJUG9wc2ljbGVMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xMaXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcUG9wc2ljbGVMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xSZWFkT25seURpY3Rpb25hcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkN1c3RvbVNlcmlhbGl6YXRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkTWFwcGluZ0F0dHJpYnV0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGRUeXBlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xNYXBwZWRUeXBlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbnVtTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkU2V0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGcmFtZXdvcmtQb3J0YWJpbGl0eS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEV4dGVuc2lvbkxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ29kZWRJbnB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUNvZGVkT3V0cHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJUnBjRGlzcGF0Y2guY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlU3RyaW5nLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZElucHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZE91dHB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTb3J0ZWRMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUaHJvd0hlbHBlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IldpcmVGb3JtYXQuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNvbXBhY3RGcmFtZXdvcmsuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iPg0KKyAgICAgICAgPEhvc3RpbmdQcm9jZXNzIGRpc2FibGU9IjEiIC8+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLkNGMzUuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5DRjM1LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWQwMDcxCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5DRjM1LmNzcHJvagpAQCAtMCwwICsxLDExMiBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNPTVBBQ1RfRlJBTUVXT1JLPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+Q0YzNTwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPns0RDYyOEI1Qi0yRkJDLTRBQTYtOEMxNi0xOTcyNDJBRUI4ODR9O3tGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8UGxhdGZvcm1GYW1pbHlOYW1lPlNtYXJ0cGhvbmU8L1BsYXRmb3JtRmFtaWx5TmFtZT4NCisgICAgPFBsYXRmb3JtSUQ+ZjI3ZGEzMjktMzI2OS00MTkxLTk4ZTAtYzg3ZDNkN2YxZGI5PC9QbGF0Zm9ybUlEPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXENGMzVcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxDRjM1XERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFO0xJVEU7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT0ZJTEVWRVJTSU9OPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxDRjM1XFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxDRjM1XFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7TElURTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PRklMRVZFUlNJT048L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZUFycmF5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU2l6ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcRGljdGlvbmFyaWVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xFbnVtZXJhYmxlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcSVBvcHNpY2xlTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcTGlzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFBvcHNpY2xlTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcUmVhZE9ubHlEaWN0aW9uYXJ5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDdXN0b21TZXJpYWxpemF0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZE1hcHBpbmdBdHRyaWJ1dGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcTWFwcGVkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRW51bUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZFNldC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZE91dHB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJwY0Rpc3BhdGNoLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZVN0cmluZy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRJbnB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU29ydGVkTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGhyb3dIZWxwZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJXaXJlRm9ybWF0LmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5Db21wYWN0RnJhbWV3b3JrLkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8VmlzdWFsU3R1ZGlvPg0KKyAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9IntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9Ij4NCisgICAgICAgIDxIb3N0aW5nUHJvY2VzcyBkaXNhYmxlPSIxIiAvPg0KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4NCisgICAgPC9WaXN1YWxTdHVkaW8+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5ORVQyMC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLk5FVDIwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTE2Nzc2Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5ORVQyMC5jc3Byb2oKQEAgLTAsMCArMSw5OSBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQyMDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYyLjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMjBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQyMFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMjBcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDIwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7TElURTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PRVhURU5TSU9OUzwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZUFycmF5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU2l6ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcRGljdGlvbmFyaWVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xFbnVtZXJhYmxlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcSVBvcHNpY2xlTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcTGlzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFBvcHNpY2xlTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcUmVhZE9ubHlEaWN0aW9uYXJ5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDdXN0b21TZXJpYWxpemF0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZE1hcHBpbmdBdHRyaWJ1dGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcTWFwcGVkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRW51bUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZFNldC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZE91dHB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJwY0Rpc3BhdGNoLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZVN0cmluZy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRJbnB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU29ydGVkTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGhyb3dIZWxwZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJXaXJlRm9ybWF0LmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5ORVQzNS5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLk5FVDM1LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODExZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5ORVQzNS5jc3Byb2oKQEAgLTAsMCArMSwxMDAgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DTElFTlRQUk9GSUxFPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+TkVUMzU8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVyczwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZTwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7TElURTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMzVcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDM1XFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7TElURTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlQXJyYXkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTaXplLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xEaWN0aW9uYXJpZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXEVudW1lcmFibGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xJUG9wc2ljbGVMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xMaXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcUG9wc2ljbGVMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xSZWFkT25seURpY3Rpb25hcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkN1c3RvbVNlcmlhbGl6YXRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkTWFwcGluZ0F0dHJpYnV0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGRUeXBlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xNYXBwZWRUeXBlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbnVtTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkU2V0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGcmFtZXdvcmtQb3J0YWJpbGl0eS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEV4dGVuc2lvbkxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ29kZWRJbnB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUNvZGVkT3V0cHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJUnBjRGlzcGF0Y2guY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlU3RyaW5nLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZElucHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZE91dHB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTb3J0ZWRMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUaHJvd0hlbHBlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IldpcmVGb3JtYXQuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLk5FVDQwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Byb3RvY29sQnVmZmVyc0xpdGUuTkVUNDAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkM2FiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLk5FVDQwLmNzcHJvagpAQCAtMCwwICsxLDEwMCBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQ0MDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUNDBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQ0MFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQ0MFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUNDBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVBcnJheS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNpemUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXERpY3Rpb25hcmllcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcRW51bWVyYWJsZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXElQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXExpc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFJlYWRPbmx5RGljdGlvbmFyeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ3VzdG9tU2VyaWFsaXphdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGRNYXBwaW5nQXR0cmlidXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1hcHBlZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkVudW1MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRTZXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZyYW1ld29ya1BvcnRhYmlsaXR5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZElucHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklScGNEaXNwYXRjaC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVTdHJpbmcuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25SZWdpc3RyeUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSU1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNvcnRlZExpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRocm93SGVscGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iV2lyZUZvcm1hdC5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Byb3RvY29sQnVmZmVyc0xpdGUuUEw0MC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlBMNDAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjkwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlBMNDAuY3Nwcm9qCkBAIC0wLDAgKzEsMTAzIEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiB4bWxuczpjcz0idXJuOnNjaGVtYXMtY3NoYXJwLXByb2plY3Q6dGVtcGxhdGUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5QT1JUQUJMRV9MSUJSQVJZPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+UEw0MDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbj4xMC4wPC9NaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbj4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+ezc4NkM4MzBGLTA3QTEtNDA4Qi1CRDdGLTZFRTA0ODA5RDZEQn07e0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlPlByb2ZpbGUxPC9UYXJnZXRGcmFtZXdvcmtQcm9maWxlPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFBMNDBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxQTDQwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFO0xJVEU7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxQTDQwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxQTDQwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7TElURTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZUFycmF5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU2l6ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcRGljdGlvbmFyaWVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xFbnVtZXJhYmxlcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcSVBvcHNpY2xlTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcTGlzdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFBvcHNpY2xlTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcUmVhZE9ubHlEaWN0aW9uYXJ5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDdXN0b21TZXJpYWxpemF0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZE1hcHBpbmdBdHRyaWJ1dGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcTWFwcGVkVHlwZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRW51bUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGaWVsZFNldC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRFeHRlbnNpb25MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZE91dHB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJwY0Rpc3BhdGNoLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZVN0cmluZy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRJbnB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU29ydGVkTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGhyb3dIZWxwZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJXaXJlRm9ybWF0LmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoMzIpXE1pY3Jvc29mdFxQb3J0YWJsZVwkKFRhcmdldEZyYW1ld29ya1ZlcnNpb24pXE1pY3Jvc29mdC5Qb3J0YWJsZS5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Byb3RvY29sQnVmZmVyc0xpdGUuU0wyMC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlNMMjAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYmFkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlNMMjAuY3Nwcm9qCkBAIC0wLDAgKzEsMTE0IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiB4bWxuczpjcz0idXJuOnNjaGVtYXMtY3NoYXJwLXByb2plY3Q6dGVtcGxhdGUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5TSUxWRVJMSUdIVDwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPlNMMjA8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVyczwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZTwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52Mi4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfTt7ZmFlMDRlYzAtMzAxZi0xMWQzLWJmNGItMDBjMDRmNzllZmJjfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFNpbHZlcmxpZ2h0QXBwbGljYXRpb24+ZmFsc2U8L1NpbHZlcmxpZ2h0QXBwbGljYXRpb24+DQorICAgIDxWYWxpZGF0ZVhhbWw+ZmFsc2U8L1ZhbGlkYXRlWGFtbD4NCisgICAgPFRocm93RXJyb3JzSW5WYWxpZGF0aW9uPmZhbHNlPC9UaHJvd0Vycm9yc0luVmFsaWRhdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDIwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0wyMFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUO05PRVhURU5TSU9OUzwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cU0wyMFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0wyMFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0xJVEU7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q7Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVBcnJheS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNpemUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXERpY3Rpb25hcmllcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcRW51bWVyYWJsZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXElQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXExpc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFJlYWRPbmx5RGljdGlvbmFyeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ3VzdG9tU2VyaWFsaXphdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGRNYXBwaW5nQXR0cmlidXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1hcHBlZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkVudW1MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRTZXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZyYW1ld29ya1BvcnRhYmlsaXR5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZElucHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklScGNEaXNwYXRjaC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVTdHJpbmcuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25SZWdpc3RyeUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSU1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNvcnRlZExpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRocm93SGVscGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iV2lyZUZvcm1hdC5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcU2lsdmVybGlnaHRcdjIuMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn0iPg0KKyAgICAgICAgPFNpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgICAgIDxTdGFydEFjdGlvbj5PZmZsaW5lQXBwbGljYXRpb248L1N0YXJ0QWN0aW9uPg0KKyAgICAgICAgPC9TaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4NCisgICAgPC9WaXN1YWxTdHVkaW8+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5TTDMwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Byb3RvY29sQnVmZmVyc0xpdGUuU0wzMC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwZTgwOQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Byb3RvY29sQnVmZmVyc0xpdGUuU0wzMC5jc3Byb2oKQEAgLTAsMCArMSwxMTUgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiIHhtbG5zOmNzPSJ1cm46c2NoZW1hcy1jc2hhcnAtcHJvamVjdDp0ZW1wbGF0ZSI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPlNJTFZFUkxJR0hUPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+U0wzMDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9O3tmYWUwNGVjMC0zMDFmLTExZDMtYmY0Yi0wMGMwNGY3OWVmYmN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8U2lsdmVybGlnaHRBcHBsaWNhdGlvbj5mYWxzZTwvU2lsdmVybGlnaHRBcHBsaWNhdGlvbj4NCisgICAgPFZhbGlkYXRlWGFtbD5mYWxzZTwvVmFsaWRhdGVYYW1sPg0KKyAgICA8VGhyb3dFcnJvcnNJblZhbGlkYXRpb24+ZmFsc2U8L1Rocm93RXJyb3JzSW5WYWxpZGF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFNMMzBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDMwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxOb1dhcm4+MTU5MSwgMTU3MCwgMTU3MSwgMTU3MiwgMTU3MywgMTU3NDwvTm9XYXJuPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFO0xJVEU7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFNMMzBcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXFNMMzBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVBcnJheS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNpemUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXERpY3Rpb25hcmllcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcRW51bWVyYWJsZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXElQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXExpc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFJlYWRPbmx5RGljdGlvbmFyeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ3VzdG9tU2VyaWFsaXphdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGRNYXBwaW5nQXR0cmlidXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1hcHBlZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkVudW1MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRTZXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZyYW1ld29ya1BvcnRhYmlsaXR5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZElucHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklScGNEaXNwYXRjaC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVTdHJpbmcuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25SZWdpc3RyeUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSU1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNvcnRlZExpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRocm93SGVscGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iV2lyZUZvcm1hdC5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcU2lsdmVybGlnaHRcdjMuMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn0iPg0KKyAgICAgICAgPFNpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgICAgIDxTdGFydEFjdGlvbj5PZmZsaW5lQXBwbGljYXRpb248L1N0YXJ0QWN0aW9uPg0KKyAgICAgICAgPC9TaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4NCisgICAgPC9WaXN1YWxTdHVkaW8+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5TTDQwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Byb3RvY29sQnVmZmVyc0xpdGUuU0w0MC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlNWJlMQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Byb3RvY29sQnVmZmVyc0xpdGUuU0w0MC5jc3Byb2oKQEAgLTAsMCArMSwxMTYgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiIHhtbG5zOmNzPSJ1cm46c2NoZW1hcy1jc2hhcnAtcHJvamVjdDp0ZW1wbGF0ZSI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPlNJTFZFUkxJR0hUPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+U0w0MDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9O3tmYWUwNGVjMC0zMDFmLTExZDMtYmY0Yi0wMGMwNGY3OWVmYmN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8U2lsdmVybGlnaHRBcHBsaWNhdGlvbj5mYWxzZTwvU2lsdmVybGlnaHRBcHBsaWNhdGlvbj4NCisgICAgPFZhbGlkYXRlWGFtbD5mYWxzZTwvVmFsaWRhdGVYYW1sPg0KKyAgICA8VGhyb3dFcnJvcnNJblZhbGlkYXRpb24+ZmFsc2U8L1Rocm93RXJyb3JzSW5WYWxpZGF0aW9uPg0KKyAgICA8U2lsdmVybGlnaHRWZXJzaW9uPnY0LjA8L1NpbHZlcmxpZ2h0VmVyc2lvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDQwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0w0MFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDQwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDQwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+JChPdXRwdXRQYXRoKVwkKEFzc2VtYmx5TmFtZSkueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE5vV2Fybj4xNTkxLCAxNTcwLCAxNTcxLCAxNTcyLCAxNTczLCAxNTc0PC9Ob1dhcm4+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7TElURTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdEJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlQXJyYXkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTaXplLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xEaWN0aW9uYXJpZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXEVudW1lcmFibGVzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xJUG9wc2ljbGVMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xMaXN0cy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcUG9wc2ljbGVMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xSZWFkT25seURpY3Rpb25hcnkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkN1c3RvbVNlcmlhbGl6YXRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXEZpZWxkTWFwcGluZ0F0dHJpYnV0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGRUeXBlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xNYXBwZWRUeXBlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbnVtTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXJMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZpZWxkU2V0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGcmFtZXdvcmtQb3J0YWJpbGl0eS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZEV4dGVuc2lvbkxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyYXRlZE1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ29kZWRJbnB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUNvZGVkT3V0cHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJUnBjRGlzcGF0Y2guY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlU3RyaW5nLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZElucHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2RlZE91dHB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTb3J0ZWRMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUaHJvd0hlbHBlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IldpcmVGb3JtYXQuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0XCQoU2lsdmVybGlnaHRWZXJzaW9uKVxNaWNyb3NvZnQuU2lsdmVybGlnaHQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn0iPg0KKyAgICAgICAgPFNpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgICAgIDxTdGFydEFjdGlvbj5PZmZsaW5lQXBwbGljYXRpb248L1N0YXJ0QWN0aW9uPg0KKyAgICAgICAgPC9TaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4NCisgICAgPC9WaXN1YWxTdHVkaW8+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDM3YzJiCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5jc3Byb2oKQEAgLTAsMCArMSwxMDAgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQzNTwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMzVcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4kKE91dHB1dFBhdGgpXCQoQXNzZW1ibHlOYW1lKS54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8Tm9XYXJuPjE1OTEsIDE1NzAsIDE1NzEsIDE1NzIsIDE1NzMsIDE1NzQ8L05vV2Fybj4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtMSVRFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVBcnJheS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNpemUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXERpY3Rpb25hcmllcy5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcRW51bWVyYWJsZXMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXElQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXExpc3RzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xQb3BzaWNsZUxpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFJlYWRPbmx5RGljdGlvbmFyeS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ3VzdG9tU2VyaWFsaXphdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVzY3JpcHRvcnNcRmllbGRNYXBwaW5nQXR0cmlidXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXNjcmlwdG9yc1xGaWVsZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlc2NyaXB0b3JzXE1hcHBlZFR5cGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkVudW1MaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRTZXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkZyYW1ld29ya1BvcnRhYmlsaXR5LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZW5lcmF0ZWRCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkTWVzc2FnZUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklDb2RlZElucHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklScGNEaXNwYXRjaC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVTdHJpbmcuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbnNpb25SZWdpc3RyeUxpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IklCdWlsZGVyTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSU1lc3NhZ2VMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNvcnRlZExpc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRocm93SGVscGVyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iV2lyZUZvcm1hdC5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1JwY1V0aWwuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9ScGNVdGlsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTlkODYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9ScGNVdGlsLmNzCkBAIC0wLDAgKzEsNzkgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEdyYWItYmFnIG9mIHV0aWxpdHkgZnVuY3Rpb25zIHVzZWZ1bCB3aGVuIGRlYWxpbmcgd2l0aCBSUENzLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJwY1V0aWwNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnZlcnRzIGFuIEFjdGlvbltJTWVzc2FnZV0gdG8gYW4gQWN0aW9uW1RdLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQWN0aW9uPFQ+IFNwZWNpYWxpemVDYWxsYmFjazxUPihBY3Rpb248SU1lc3NhZ2U+IGFjdGlvbikNCisgICAgICAgICAgICB3aGVyZSBUIDogSU1lc3NhZ2U8VD4NCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZSA9PiBhY3Rpb24obWVzc2FnZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29udmVydHMgYW4gQWN0aW9uW1RdIHRvIGFuIEFjdGlvbltJTWVzc2FnZV0uDQorICAgICAgICAvLy8gVGhlIGdlbmVyYWxpemVkIGFjdGlvbiB3aWxsIGFjY2VwdCBhbnkgbWVzc2FnZSBvYmplY3Qgd2hpY2ggaGFzDQorICAgICAgICAvLy8gdGhlIHNhbWUgZGVzY3JpcHRvciwgYW5kIHdpbGwgY29udmVydCBpdCB0byB0aGUgY29ycmVjdCBjbGFzcw0KKyAgICAgICAgLy8vIGJlZm9yZSBjYWxsaW5nIHRoZSBvcmlnaW5hbCBhY3Rpb24uIEhvd2V2ZXIsIGlmIHRoZSBnZW5lcmFsaXplZA0KKyAgICAgICAgLy8vIGNhbGxiYWNrIGlzIGdpdmVuIGEgbWVzc2FnZSB3aXRoIGEgZGlmZmVyZW50IGRlc2NyaXB0b3IsIGFuDQorICAgICAgICAvLy8gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQWN0aW9uPElNZXNzYWdlPiBHZW5lcmFsaXplQ2FsbGJhY2s8VE1lc3NhZ2UsIFRCdWlsZGVyPihBY3Rpb248VE1lc3NhZ2U+IGFjdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UpDQorICAgICAgICAgICAgd2hlcmUgVE1lc3NhZ2UgOiBjbGFzcywgSU1lc3NhZ2U8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgICAgIHdoZXJlIFRCdWlsZGVyIDogSUJ1aWxkZXI8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlID0+DQorICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2UgY2FzdE1lc3NhZ2UgPSBtZXNzYWdlIGFzIFRNZXNzYWdlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXN0TWVzc2FnZSA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdE1lc3NhZ2UgPSBkZWZhdWx0SW5zdGFuY2UuQ3JlYXRlQnVpbGRlckZvclR5cGUoKS5NZXJnZUZyb20obWVzc2FnZSkuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKGNhc3RNZXNzYWdlKTsNCisgICAgICAgICAgICAgICAgICAgICAgIH07DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvU29ydGVkTGlzdC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1NvcnRlZExpc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkN2RhOQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1NvcnRlZExpc3QuY3MKQEAgLTAsMCArMSwxNjcgQEAKK++7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCisjaWYgTk9TT1JURURMSVNUDQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBEaWN0aW9uYXJ5IGltcGxlbWVudGF0aW9uIHdoaWNoIGFsd2F5cyB5aWVsZHMga2V5cyBpbiBzb3J0ZWQgb3JkZXIuDQorICAgIC8vLyBUaGlzIGlzIG5vdCBwYXJ0aWN1bGFybHkgZWZmaWNpZW50OiBpdCB3cmFwcyBhIG5vcm1hbCBkaWN0aW9uYXJ5DQorICAgIC8vLyBmb3IgbW9zdCBvcGVyYXRpb25zLCBidXQgc29ydHMgYnkga2V5IHdoZW4gZWl0aGVyIGl0ZXJhdGluZyBvcg0KKyAgICAvLy8gZmV0Y2hpbmcgdGhlIEtleXMvVmFsdWVzIHByb3BlcnRpZXMuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIGludGVybmFsIHNlYWxlZCBjbGFzcyBTb3J0ZWRMaXN0PFRLZXksIFRWYWx1ZT4gOiBJRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+DQorICAgIHsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiB3cmFwcGVkID0gbmV3IERpY3Rpb25hcnk8VEtleSwgVFZhbHVlPigpOw0KKw0KKyAgICAgICAgcHVibGljIFNvcnRlZExpc3QoKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIFNvcnRlZExpc3QoSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiBkaWN0aW9uYXJ5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+IGVudHJ5IGluIGRpY3Rpb25hcnkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBBZGQoZW50cnkuS2V5LCBlbnRyeS5WYWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgQWRkKFRLZXkga2V5LCBUVmFsdWUgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JhcHBlZC5BZGQoa2V5LCB2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBDb250YWluc0tleShUS2V5IGtleSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5Db250YWluc0tleShrZXkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIElDb2xsZWN0aW9uPFRLZXk+IEtleXMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIExpc3Q8VEtleT4ga2V5cyA9IG5ldyBMaXN0PFRLZXk+KHdyYXBwZWQuQ291bnQpOw0KKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFpciBpbiB0aGlzKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBrZXlzLkFkZChwYWlyLktleSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGJvb2wgUmVtb3ZlKFRLZXkga2V5KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLlJlbW92ZShrZXkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGJvb2wgVHJ5R2V0VmFsdWUoVEtleSBrZXksIG91dCBUVmFsdWUgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuVHJ5R2V0VmFsdWUoa2V5LCBvdXQgdmFsdWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIElDb2xsZWN0aW9uPFRWYWx1ZT4gVmFsdWVzDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBMaXN0PFRWYWx1ZT4gdmFsdWVzID0gbmV3IExpc3Q8VFZhbHVlPih3cmFwcGVkLkNvdW50KTsNCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhaXIgaW4gdGhpcykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLkFkZChwYWlyLlZhbHVlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBUVmFsdWUgdGhpc1tUS2V5IGtleV0NCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gd3JhcHBlZFtrZXldOyB9DQorICAgICAgICAgICAgc2V0IHsgd3JhcHBlZFtrZXldID0gdmFsdWU7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZChLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPiBpdGVtKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyYXBwZWQuQWRkKGl0ZW0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHdyYXBwZWQuQ2xlYXIoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBib29sIENvbnRhaW5zKEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+IGl0ZW0pDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuQ29udGFpbnMoaXRlbSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG8oS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT5bXSBhcnJheSwgaW50IGFycmF5SW5kZXgpDQorICAgICAgICB7DQorICAgICAgICAgICAgd3JhcHBlZC5Db3B5VG8oYXJyYXksIGFycmF5SW5kZXgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGludCBDb3VudA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB3cmFwcGVkLkNvdW50OyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgYm9vbCBJc1JlYWRPbmx5DQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHdyYXBwZWQuSXNSZWFkT25seTsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGJvb2wgUmVtb3ZlKEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+IGl0ZW0pDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuUmVtb3ZlKGl0ZW0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIElFbnVtZXJhdG9yPEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+PiBHZXRFbnVtZXJhdG9yKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJQ29tcGFyZXI8VEtleT4gY29tcGFyZXIgPSBDb21wYXJlcjxUS2V5Pi5EZWZhdWx0Ow0KKyAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IExpc3Q8S2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4+KHdyYXBwZWQpOw0KKyAgICAgICAgICAgIGxpc3QuU29ydCgoeCwgeSkgPT4gY29tcGFyZXIuQ29tcGFyZSh4LktleSwgeS5LZXkpKTsNCisgICAgICAgICAgICByZXR1cm4gbGlzdC5HZXRFbnVtZXJhdG9yKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gR2V0RW51bWVyYXRvcigpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KKw0KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1RleHRGb3JtYXQuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9UZXh0Rm9ybWF0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0N2RjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9UZXh0Rm9ybWF0LmNzCkBAIC0wLDAgKzEsODk5IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlRleHQ7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gUHJvdmlkZXMgQVNDSUkgdGV4dCBmb3JtYXR0aW5nIHN1cHBvcnQgZm9yIG1lc3NhZ2VzLg0KKyAgICAvLy8gVE9ETyhqb25za2VldCk6IFN1cHBvcnQgZm9yIGFsdGVybmF0aXZlIGxpbmUgZW5kaW5ncy4NCisgICAgLy8vIChFYXN5IHRvIHByaW50LCB2aWEgVGV4dEdlbmVyYXRvci4gTm90IHN1cmUgYWJvdXQgcGFyc2luZy4pDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGV4dEZvcm1hdA0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIFByb3RvY29sIE1lc3NhZ2Ugc3VwcGxpZWQgaW50bw0KKyAgICAgICAgLy8vIHRoZSBwYXJhbWV0ZXIgb3V0cHV0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBQcmludChJTWVzc2FnZSBtZXNzYWdlLCBUZXh0V3JpdGVyIG91dHB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBUZXh0R2VuZXJhdG9yKG91dHB1dCwgIlxuIik7DQorICAgICAgICAgICAgUHJpbnQobWVzc2FnZSwgZ2VuZXJhdG9yKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBPdXRwdXRzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgUHJvdG9jb2wgTWVzc2FnZSBidWlsZGVyIHN1cHBsaWVkIGludG8NCisgICAgICAgIC8vLyB0aGUgcGFyYW1ldGVyIG91dHB1dC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUHJpbnQoSUJ1aWxkZXIgYnVpbGRlciwgVGV4dFdyaXRlciBvdXRwdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgVGV4dEdlbmVyYXRvcihvdXRwdXQsICJcbiIpOw0KKyAgICAgICAgICAgIFByaW50KGJ1aWxkZXIsIGdlbmVyYXRvcik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgPHBhcmFtcmVmIG5hbWU9ImZpZWxkcyIgLz4gdG8gPHBhcmFtcmVmIG5hbWU9Im91dHB1dCIvPi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUHJpbnQoVW5rbm93bkZpZWxkU2V0IGZpZWxkcywgVGV4dFdyaXRlciBvdXRwdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgVGV4dEdlbmVyYXRvcihvdXRwdXQsICJcbiIpOw0KKyAgICAgICAgICAgIFByaW50VW5rbm93bkZpZWxkcyhmaWVsZHMsIGdlbmVyYXRvcik7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBQcmludFRvU3RyaW5nKElNZXNzYWdlIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHRleHQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQorICAgICAgICAgICAgUHJpbnQobWVzc2FnZSwgdGV4dCk7DQorICAgICAgICAgICAgcmV0dXJuIHRleHQuVG9TdHJpbmcoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFByaW50VG9TdHJpbmcoSUJ1aWxkZXIgYnVpbGRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBTdHJpbmdXcml0ZXIgdGV4dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCisgICAgICAgICAgICBQcmludChidWlsZGVyLCB0ZXh0KTsNCisgICAgICAgICAgICByZXR1cm4gdGV4dC5Ub1N0cmluZygpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgUHJpbnRUb1N0cmluZyhVbmtub3duRmllbGRTZXQgZmllbGRzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciB0ZXh0ID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KKyAgICAgICAgICAgIFByaW50KGZpZWxkcywgdGV4dCk7DQorICAgICAgICAgICAgcmV0dXJuIHRleHQuVG9TdHJpbmcoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHJpbnQoSU1lc3NhZ2UgbWVzc2FnZSwgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3IpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPEZpZWxkRGVzY3JpcHRvciwgb2JqZWN0PiBlbnRyeSBpbiBtZXNzYWdlLkFsbEZpZWxkcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFByaW50RmllbGQoZW50cnkuS2V5LCBlbnRyeS5WYWx1ZSwgZ2VuZXJhdG9yKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgUHJpbnRVbmtub3duRmllbGRzKG1lc3NhZ2UuVW5rbm93bkZpZWxkcywgZ2VuZXJhdG9yKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHJpbnQoSUJ1aWxkZXIgbWVzc2FnZSwgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3IpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPEZpZWxkRGVzY3JpcHRvciwgb2JqZWN0PiBlbnRyeSBpbiBtZXNzYWdlLkFsbEZpZWxkcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFByaW50RmllbGQoZW50cnkuS2V5LCBlbnRyeS5WYWx1ZSwgZ2VuZXJhdG9yKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgUHJpbnRVbmtub3duRmllbGRzKG1lc3NhZ2UuVW5rbm93bkZpZWxkcywgZ2VuZXJhdG9yKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIFByaW50RmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkLCBvYmplY3QgdmFsdWUsIFRleHRHZW5lcmF0b3IgZ2VuZXJhdG9yKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChmaWVsZC5Jc1JlcGVhdGVkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gUmVwZWF0ZWQgZmllbGQuICBQcmludCBlYWNoIGVsZW1lbnQuDQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCBlbGVtZW50IGluIChJRW51bWVyYWJsZSkgdmFsdWUpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIFByaW50U2luZ2xlRmllbGQoZmllbGQsIGVsZW1lbnQsIGdlbmVyYXRvcik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgUHJpbnRTaW5nbGVGaWVsZChmaWVsZCwgdmFsdWUsIGdlbmVyYXRvcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBQcmludFNpbmdsZUZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlLCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZmllbGQuSXNFeHRlbnNpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIlsiKTsNCisgICAgICAgICAgICAgICAgLy8gV2Ugc3BlY2lhbC1jYXNlIE1lc3NhZ2VTZXQgZWxlbWVudHMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcm90bzEuDQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Db250YWluaW5nVHlwZS5PcHRpb25zLk1lc3NhZ2VTZXRXaXJlRm9ybWF0DQorICAgICAgICAgICAgICAgICAgICAmJiBmaWVsZC5GaWVsZFR5cGUgPT0gRmllbGRUeXBlLk1lc3NhZ2UNCisgICAgICAgICAgICAgICAgICAgICYmIGZpZWxkLklzT3B0aW9uYWwNCisgICAgICAgICAgICAgICAgICAgIC8vIG9iamVjdCBlcXVhbGl0eSAoVE9ETyhqb25za2VldCk6IFdvcmsgb3V0IHdoYXQgdGhpcyBjb21tZW50IG1lYW5zISkNCisgICAgICAgICAgICAgICAgICAgICYmIGZpZWxkLkV4dGVuc2lvblNjb3BlID09IGZpZWxkLk1lc3NhZ2VUeXBlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoZmllbGQuTWVzc2FnZVR5cGUuRnVsbE5hbWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KGZpZWxkLkZ1bGxOYW1lKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIl0iKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLkZpZWxkVHlwZSA9PSBGaWVsZFR5cGUuR3JvdXApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIC8vIEdyb3VwcyBtdXN0IGJlIHNlcmlhbGl6ZWQgd2l0aCB0aGVpciBvcmlnaW5hbCBjYXBpdGFsaXphdGlvbi4NCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvci5QcmludChmaWVsZC5NZXNzYWdlVHlwZS5OYW1lKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvci5QcmludChmaWVsZC5OYW1lKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAoZmllbGQuTWFwcGVkVHlwZSA9PSBNYXBwZWRUeXBlLk1lc3NhZ2UpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiB7XG4iKTsNCisgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLkluZGVudCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIjogIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIFByaW50RmllbGRWYWx1ZShmaWVsZCwgdmFsdWUsIGdlbmVyYXRvcik7DQorDQorICAgICAgICAgICAgaWYgKGZpZWxkLk1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5NZXNzYWdlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLk91dGRlbnQoKTsNCisgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJ9Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiXG4iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHJpbnRGaWVsZFZhbHVlKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgb2JqZWN0IHZhbHVlLCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLkZpZWxkVHlwZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgRmxvYXQgYW5kIERvdWJsZSB0eXBlcyBtdXN0IHNwZWNpZnkgdGhlICJyIiBmb3JtYXQgdG8gcHJlc2VydmUgdGhlaXIgcHJlY2lzaW9uLCBvdGhlcndpc2UsDQorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZG91YmxlIHRvL2Zyb20gc3RyaW5nIHdpbGwgdHJpbSB0aGUgcHJlY2lzaW9uIHRvIDYgcGxhY2VzLiAgQXMgd2l0aCBvdGhlciBudW1lcmljIGZvcm1hdHMNCisgICAgICAgICAgICAgICAgICAgIC8vIGJlbG93LCBhbHdheXMgdXNlIHRoZSBpbnZhcmlhbnQgY3VsdHVyZSBzbyBpdCdzIHByZWRpY3RhYmxlLg0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GbG9hdDoNCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvci5QcmludCgoKGZsb2F0KXZhbHVlKS5Ub1N0cmluZygiciIsIEZyYW1ld29ya1BvcnRhYmlsaXR5LkludmFyaWFudEN1bHR1cmUpKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Eb3VibGU6DQorICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoKChkb3VibGUpdmFsdWUpLlRvU3RyaW5nKCJyIiwgRnJhbWV3b3JrUG9ydGFiaWxpdHkuSW52YXJpYW50Q3VsdHVyZSkpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkludDMyOg0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQ2NDoNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ludDMyOg0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TSW50NjQ6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNGaXhlZDMyOg0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TRml4ZWQ2NDoNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuVUludDMyOg0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50NjQ6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkMzI6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkNjQ6DQorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2ltcGxlIE9iamVjdC5Ub1N0cmluZyBjb252ZXJ0cyB1c2luZyB0aGUgY3VycmVudCBjdWx0dXJlLg0KKyAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBhbHdheXMgdXNlIHRoZSBpbnZhcmlhbnQgY3VsdHVyZSBzbyBpdCdzIHByZWRpY3RhYmxlLg0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCgoSUNvbnZlcnRpYmxlKXZhbHVlKS5Ub1N0cmluZyhGcmFtZXdvcmtQb3J0YWJpbGl0eS5JbnZhcmlhbnRDdWx0dXJlKSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuQm9vbDoNCisgICAgICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIHRoZSBKYXZhIHRydWUvZmFsc2UNCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvci5QcmludCgoYm9vbCkgdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TdHJpbmc6DQorICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIlwiIik7DQorICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoRXNjYXBlVGV4dCgoc3RyaW5nKSB2YWx1ZSkpOw0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJcIiIpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkJ5dGVzOg0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiXCIiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoRXNjYXBlQnl0ZXMoKEJ5dGVTdHJpbmcpIHZhbHVlKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJcIiIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5FbnVtOg0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpcyBJRW51bUxpdGUgJiYgISh2YWx1ZSBpcyBFbnVtVmFsdWVEZXNjcmlwdG9yKSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIkxpdGUgZW51bWVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLiIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoKChFbnVtVmFsdWVEZXNjcmlwdG9yKSB2YWx1ZSkuTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLk1lc3NhZ2U6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkdyb3VwOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGlzIElNZXNzYWdlTGl0ZSAmJiAhKHZhbHVlIGlzIElNZXNzYWdlKSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJMaXRlIG1lc3NhZ2VzIGFyZSBub3Qgc3VwcG9ydGVkLiIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgUHJpbnQoKElNZXNzYWdlKSB2YWx1ZSwgZ2VuZXJhdG9yKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHJpbnRVbmtub3duRmllbGRzKFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzLCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoIChLZXlWYWx1ZVBhaXI8aW50LCBVbmtub3duRmllbGQ+IGVudHJ5IGluIHVua25vd25GaWVsZHMuRmllbGREaWN0aW9uYXJ5KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGVudHJ5LktleS5Ub1N0cmluZygpICsgIjogIjsNCisgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkIGZpZWxkID0gZW50cnkuVmFsdWU7DQorDQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKHVsb25nIHZhbHVlIGluIGZpZWxkLlZhcmludExpc3QpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvci5QcmludChwcmVmaXgpOw0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KHZhbHVlLlRvU3RyaW5nKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJcbiIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKHVpbnQgdmFsdWUgaW4gZmllbGQuRml4ZWQzMkxpc3QpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvci5QcmludChwcmVmaXgpOw0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KHN0cmluZy5Gb3JtYXQoIjB4ezA6eDh9IiwgdmFsdWUpKTsNCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiXG4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3JlYWNoICh1bG9uZyB2YWx1ZSBpbiBmaWVsZC5GaXhlZDY0TGlzdCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KHByZWZpeCk7DQorICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoc3RyaW5nLkZvcm1hdCgiMHh7MDp4MTZ9IiwgdmFsdWUpKTsNCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiXG4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChCeXRlU3RyaW5nIHZhbHVlIGluIGZpZWxkLkxlbmd0aERlbGltaXRlZExpc3QpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvci5QcmludChlbnRyeS5LZXkuVG9TdHJpbmcoKSk7DQorICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIjogXCIiKTsNCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvci5QcmludChFc2NhcGVCeXRlcyh2YWx1ZSkpOw0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJcIlxuIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoVW5rbm93bkZpZWxkU2V0IHZhbHVlIGluIGZpZWxkLkdyb3VwTGlzdCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KGVudHJ5LktleS5Ub1N0cmluZygpKTsNCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiIHtcbiIpOw0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLkluZGVudCgpOw0KKyAgICAgICAgICAgICAgICAgICAgUHJpbnRVbmtub3duRmllbGRzKHZhbHVlLCBnZW5lcmF0b3IpOw0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLk91dGRlbnQoKTsNCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvci5QcmludCgifVxuIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdWxvbmcgUGFyc2VVSW50NjQoc3RyaW5nIHRleHQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuICh1bG9uZykgUGFyc2VJbnRlZ2VyKHRleHQsIGZhbHNlLCB0cnVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBQYXJzZUludDY0KHN0cmluZyB0ZXh0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBQYXJzZUludGVnZXIodGV4dCwgdHJ1ZSwgdHJ1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdWludCBQYXJzZVVJbnQzMihzdHJpbmcgdGV4dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gKHVpbnQpIFBhcnNlSW50ZWdlcih0ZXh0LCBmYWxzZSwgZmFsc2UpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgUGFyc2VJbnQzMihzdHJpbmcgdGV4dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gKGludCkgUGFyc2VJbnRlZ2VyKHRleHQsIHRydWUsIGZhbHNlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgUGFyc2VGbG9hdChzdHJpbmcgdGV4dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzd2l0Y2ggKHRleHQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjYXNlICItaW5mIjoNCisgICAgICAgICAgICAgICAgY2FzZSAiLWluZmluaXR5IjoNCisgICAgICAgICAgICAgICAgY2FzZSAiLWluZmYiOg0KKyAgICAgICAgICAgICAgICBjYXNlICItaW5maW5pdHlmIjoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdC5OZWdhdGl2ZUluZmluaXR5Ow0KKyAgICAgICAgICAgICAgICBjYXNlICJpbmYiOg0KKyAgICAgICAgICAgICAgICBjYXNlICJpbmZpbml0eSI6DQorICAgICAgICAgICAgICAgIGNhc2UgImluZmYiOg0KKyAgICAgICAgICAgICAgICBjYXNlICJpbmZpbml0eWYiOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0LlBvc2l0aXZlSW5maW5pdHk7DQorICAgICAgICAgICAgICAgIGNhc2UgIm5hbiI6DQorICAgICAgICAgICAgICAgIGNhc2UgIm5hbmYiOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0Lk5hTjsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdC5QYXJzZSh0ZXh0LCBGcmFtZXdvcmtQb3J0YWJpbGl0eS5JbnZhcmlhbnRDdWx0dXJlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBQYXJzZURvdWJsZShzdHJpbmcgdGV4dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzd2l0Y2ggKHRleHQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjYXNlICItaW5mIjoNCisgICAgICAgICAgICAgICAgY2FzZSAiLWluZmluaXR5IjoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb3VibGUuTmVnYXRpdmVJbmZpbml0eTsNCisgICAgICAgICAgICAgICAgY2FzZSAiaW5mIjoNCisgICAgICAgICAgICAgICAgY2FzZSAiaW5maW5pdHkiOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5Qb3NpdGl2ZUluZmluaXR5Ow0KKyAgICAgICAgICAgICAgICBjYXNlICJuYW4iOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5OYU47DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlLlBhcnNlKHRleHQsIEZyYW1ld29ya1BvcnRhYmlsaXR5LkludmFyaWFudEN1bHR1cmUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQYXJzZXMgYW4gaW50ZWdlciBpbiBoZXggKGxlYWRpbmcgMHgpLCBkZWNpbWFsIChubyBwcmVmaXgpIG9yIG9jdGFsIChsZWFkaW5nIDApLg0KKyAgICAgICAgLy8vIE9ubHkgYSBuZWdhdGl2ZSBzaWduIGlzIHBlcm1pdHRlZCwgYW5kIGl0IG11c3QgY29tZSBiZWZvcmUgdGhlIHJhZGl4IGluZGljYXRvci4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIFBhcnNlSW50ZWdlcihzdHJpbmcgdGV4dCwgYm9vbCBpc1NpZ25lZCwgYm9vbCBpc0xvbmcpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RyaW5nIG9yaWdpbmFsID0gdGV4dDsNCisgICAgICAgICAgICBib29sIG5lZ2F0aXZlID0gZmFsc2U7DQorICAgICAgICAgICAgaWYgKHRleHQuU3RhcnRzV2l0aCgiLSIpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKCFpc1NpZ25lZCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiTnVtYmVyIG11c3QgYmUgcG9zaXRpdmU6ICIgKyBvcmlnaW5hbCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbmVnYXRpdmUgPSB0cnVlOw0KKyAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5TdWJzdHJpbmcoMSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGludCByYWRpeCA9IDEwOw0KKyAgICAgICAgICAgIGlmICh0ZXh0LlN0YXJ0c1dpdGgoIjB4IikpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByYWRpeCA9IDE2Ow0KKyAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5TdWJzdHJpbmcoMik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRleHQuU3RhcnRzV2l0aCgiMCIpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmFkaXggPSA4Ow0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICB1bG9uZyByZXN1bHQ7DQorICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9WaXN1YWxTdHVkaW8vZmVlZGJhY2svVmlld0ZlZWRiYWNrLmFzcHg/RmVlZGJhY2tJRD0yNzg0NDgNCisgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIENvbnZlcnQuVG9VSW50NjQgZm9yIGFsbCBjYXNlcy4NCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmFkaXggPT0gMTAgPyB1bG9uZy5QYXJzZSh0ZXh0KSA6IENvbnZlcnQuVG9VSW50NjQodGV4dCwgcmFkaXgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoT3ZlcmZsb3dFeGNlcHRpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IE92ZXJmbG93RXhjZXB0aW9uIHRvIEZvcm1hdEV4Y2VwdGlvbiBzbyB0aGVyZSdzIGEgc2luZ2xlIGV4Y2VwdGlvbiB0eXBlIHRoaXMgbWV0aG9kIGNhbiB0aHJvdy4NCisgICAgICAgICAgICAgICAgc3RyaW5nIG51bWJlckRlc2NyaXB0aW9uID0gc3RyaW5nLkZvcm1hdCgiezB9LWJpdCB7MX1zaWduZWQgaW50ZWdlciIsIGlzTG9uZyA/IDY0IDogMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaWduZWQgPyAiIiA6ICJ1biIpOw0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciAiICsgbnVtYmVyRGVzY3JpcHRpb24gKyAiOiAiICsgb3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAobmVnYXRpdmUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB1bG9uZyBtYXggPSBpc0xvbmcgPyAweDgwMDAwMDAwMDAwMDAwMDBVTCA6IDB4ODAwMDAwMDBMOw0KKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID4gbWF4KQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbnVtYmVyRGVzY3JpcHRpb24gPSBzdHJpbmcuRm9ybWF0KCJ7MH0tYml0IHNpZ25lZCBpbnRlZ2VyIiwgaXNMb25nID8gNjQgOiAzMik7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciAiICsgbnVtYmVyRGVzY3JpcHRpb24gKyAiOiAiICsgb3JpZ2luYWwpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiAtKChsb25nKSByZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB1bG9uZyBtYXggPSBpc1NpZ25lZA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoaXNMb25nID8gKHVsb25nKSBsb25nLk1heFZhbHVlIDogaW50Lk1heFZhbHVlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaXNMb25nID8gdWxvbmcuTWF4VmFsdWUgOiB1aW50Lk1heFZhbHVlKTsNCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA+IG1heCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG51bWJlckRlc2NyaXB0aW9uID0gc3RyaW5nLkZvcm1hdCgiezB9LWJpdCB7MX1zaWduZWQgaW50ZWdlciIsIGlzTG9uZyA/IDY0IDogMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2lnbmVkID8gIiIgOiAidW4iKTsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oIk51bWJlciBvdXQgb2YgcmFuZ2UgZm9yICIgKyBudW1iZXJEZXNjcmlwdGlvbiArICI6ICIgKyBvcmlnaW5hbCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIChsb25nKSByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRlc3RzIGEgY2hhcmFjdGVyIHRvIHNlZSBpZiBpdCdzIGFuIG9jdGFsIGRpZ2l0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgSXNPY3RhbChjaGFyIGMpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuICcwJyA8PSBjICYmIGMgPD0gJzcnOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRlc3RzIGEgY2hhcmFjdGVyIHRvIHNlZSBpZiBpdCdzIGEgaGV4IGRpZ2l0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgSXNIZXgoY2hhciBjKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8DQorICAgICAgICAgICAgICAgICAgICgnYScgPD0gYyAmJiBjIDw9ICdmJykgfHwNCisgICAgICAgICAgICAgICAgICAgKCdBJyA8PSBjICYmIGMgPD0gJ0YnKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBJbnRlcnByZXRzIGEgY2hhcmFjdGVyIGFzIGEgZGlnaXQgKGluIGFueSBiYXNlIHVwIHRvIDM2KSBhbmQgcmV0dXJucyB0aGUNCisgICAgICAgIC8vLyBudW1lcmljIHZhbHVlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBQYXJzZURpZ2l0KGNoYXIgYykNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gYyAtICcwJzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZiAoJ2EnIDw9IGMgJiYgYyA8PSAneicpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gYyAtICdhJyArIDEwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gYyAtICdBJyArIDEwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVbmVzY2FwZXMgYSB0ZXh0IHN0cmluZyBhcyBlc2NhcGVkIHVzaW5nIDxzZWUgY3JlZj0iRXNjYXBlVGV4dChzdHJpbmcpIiAvPi4NCisgICAgICAgIC8vLyBUd28tZGlnaXQgaGV4IGVzY2FwZXMgKHN0YXJ0aW5nIHdpdGggIlx4IiBhcmUgYWxzbyByZWNvZ25pc2VkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFVuZXNjYXBlVGV4dChzdHJpbmcgaW5wdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIFVuZXNjYXBlQnl0ZXMoaW5wdXQpLlRvU3RyaW5nVXRmOCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIExpa2UgPHNlZSBjcmVmPSJFc2NhcGVCeXRlcyIgLz4gYnV0IGVzY2FwZXMgYSB0ZXh0IHN0cmluZy4NCisgICAgICAgIC8vLyBUaGUgc3RyaW5nIGlzIGZpcnN0IGVuY29kZWQgYXMgVVRGLTgsIHRoZW4gZWFjaCBieXRlIGVzY2FwZWQgaW5kaXZpZHVhbGx5Lg0KKyAgICAgICAgLy8vIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvIGJlIGVudGlyZWx5IEFTQ0lJLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEVzY2FwZVRleHQoc3RyaW5nIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBFc2NhcGVCeXRlcyhCeXRlU3RyaW5nLkNvcHlGcm9tVXRmOChpbnB1dCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEVzY2FwZXMgYnl0ZXMgaW4gdGhlIGZvcm1hdCB1c2VkIGluIHByb3RvY29sIGJ1ZmZlciB0ZXh0IGZvcm1hdCwgd2hpY2gNCisgICAgICAgIC8vLyBpcyB0aGUgc2FtZSBhcyB0aGUgZm9ybWF0IHVzZWQgZm9yIEMgc3RyaW5nIGxpdGVyYWxzLiAgQWxsIGJ5dGVzDQorICAgICAgICAvLy8gdGhhdCBhcmUgbm90IHByaW50YWJsZSA3LWJpdCBBU0NJSSBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLCBhcyB3ZWxsIGFzDQorICAgICAgICAvLy8gYmFja3NsYXNoLCBzaW5nbGUtcXVvdGUsIGFuZCBkb3VibGUtcXVvdGUgY2hhcmFjdGVycy4gIENoYXJhY3RlcnMgZm9yDQorICAgICAgICAvLy8gd2hpY2ggbm8gZGVmaW5lZCBzaG9ydC1oYW5kIGVzY2FwZSBzZXF1ZW5jZSBpcyBkZWZpbmVkIHdpbGwgYmUgZXNjYXBlZA0KKyAgICAgICAgLy8vIHVzaW5nIDMtZGlnaXQgb2N0YWwgc2VxdWVuY2VzLg0KKyAgICAgICAgLy8vIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvIGJlIGVudGlyZWx5IEFTQ0lJLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVzY2FwZUJ5dGVzKEJ5dGVTdHJpbmcgaW5wdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoaW5wdXQuTGVuZ3RoKTsNCisgICAgICAgICAgICBmb3JlYWNoIChieXRlIGIgaW4gaW5wdXQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGIpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDIyBkb2VzIG5vdCB1c2UgXGEgb3IgXHYNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwNzoNCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZCgiXFxhIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnXGInOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKCJcXGIiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdcZic6DQorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoIlxcZiIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ1xuJzoNCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZCgiXFxuIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnXHInOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKCJcXHIiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdcdCc6DQorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoIlxcdCIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDBiOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKCJcXHYiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdcXCc6DQorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoIlxcXFwiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdcJyc6DQorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoIlxcXCciKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICciJzoNCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZCgiXFxcIiIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiA+PSAweDIwICYmIGIgPCAxMjgpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZCgoY2hhcikgYik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKCdcXCcpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZCgoY2hhcikgKCcwJyArICgoYiA+PiA2KSAmIDMpKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKChjaGFyKSAoJzAnICsgKChiID4+IDMpICYgNykpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoKGNoYXIpICgnMCcgKyAoYiAmIDcpKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLlRvU3RyaW5nKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUGVyZm9ybXMgc3RyaW5nIHVuZXNjYXBpbmcgZnJvbSBDIHN0eWxlIChvY3RhbCwgaGV4LCBmb3JtIGZlZWRzLCB0YWIgZXRjKSBpbnRvIGEgYnl0ZSBzdHJpbmcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIFVuZXNjYXBlQnl0ZXMoc3RyaW5nIGlucHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtpbnB1dC5MZW5ndGhdOw0KKyAgICAgICAgICAgIGludCBwb3MgPSAwOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuTGVuZ3RoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBpbnB1dFtpXTsNCisgICAgICAgICAgICAgICAgaWYgKGMgPiAxMjcgfHwgYyA8IDMyKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJFc2NhcGVkIHN0cmluZyBtdXN0IG9ubHkgY29udGFpbiBBU0NJSSIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChjICE9ICdcXCcpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtwb3MrK10gPSAoYnl0ZSkgYzsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChpICsgMSA+PSBpbnB1dC5MZW5ndGgpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgZXNjYXBlIHNlcXVlbmNlOiAnXFwnIGF0IGVuZCBvZiBzdHJpbmcuIik7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgICAgICAgICBjID0gaW5wdXRbaV07DQorICAgICAgICAgICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc3JykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gT2N0YWwgZXNjYXBlLiANCisgICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gUGFyc2VEaWdpdChjKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGlucHV0Lkxlbmd0aCAmJiBJc09jdGFsKGlucHV0W2kgKyAxXSkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlKjggKyBQYXJzZURpZ2l0KGlucHV0W2ldKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGlucHV0Lkxlbmd0aCAmJiBJc09jdGFsKGlucHV0W2kgKyAxXSkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlKjggKyBQYXJzZURpZ2l0KGlucHV0W2ldKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtwb3MrK10gPSAoYnl0ZSkgY29kZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3BvcysrXSA9IDB4MDc7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbcG9zKytdID0gKGJ5dGUpICdcYic7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbcG9zKytdID0gKGJ5dGUpICdcZic7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbcG9zKytdID0gKGJ5dGUpICdcbic7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbcG9zKytdID0gKGJ5dGUpICdccic7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbcG9zKytdID0gKGJ5dGUpICdcdCc7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3YnOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbcG9zKytdID0gMHgwYjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFwnOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbcG9zKytdID0gKGJ5dGUpICdcXCc7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3BvcysrXSA9IChieXRlKSAnXCcnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICciJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3BvcysrXSA9IChieXRlKSAnXCInOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGV4IGVzY2FwZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaW5wdXQuTGVuZ3RoICYmIElzSGV4KGlucHV0W2kgKyAxXSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBQYXJzZURpZ2l0KGlucHV0W2ldKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgZXNjYXBlIHNlcXVlbmNlOiAnXFx4JyB3aXRoIG5vIGRpZ2l0cyIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGlucHV0Lkxlbmd0aCAmJiBJc0hleChpbnB1dFtpICsgMV0pKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gY29kZSoxNiArIFBhcnNlRGlnaXQoaW5wdXRbaV0pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtwb3MrK10gPSAoYnl0ZSkgY29kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBlc2NhcGUgc2VxdWVuY2U6ICdcXCIgKyBjICsgIiciKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICByZXR1cm4gQnl0ZVN0cmluZy5Db3B5RnJvbShyZXN1bHQsIDAsIHBvcyk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWVyZ2Uoc3RyaW5nIHRleHQsIElCdWlsZGVyIGJ1aWxkZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgTWVyZ2UodGV4dCwgRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHksIGJ1aWxkZXIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1lcmdlKFRleHRSZWFkZXIgcmVhZGVyLCBJQnVpbGRlciBidWlsZGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIE1lcmdlKHJlYWRlciwgRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHksIGJ1aWxkZXIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1lcmdlKFRleHRSZWFkZXIgcmVhZGVyLCBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgSUJ1aWxkZXIgYnVpbGRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBNZXJnZShyZWFkZXIuUmVhZFRvRW5kKCksIHJlZ2lzdHJ5LCBidWlsZGVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNZXJnZShzdHJpbmcgdGV4dCwgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnksIElCdWlsZGVyIGJ1aWxkZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGV4dFRva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgVGV4dFRva2VuaXplcih0ZXh0KTsNCisNCisgICAgICAgICAgICB3aGlsZSAoIXRva2VuaXplci5BdEVuZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIE1lcmdlRmllbGQodG9rZW5pemVyLCByZWdpc3RyeSwgYnVpbGRlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBhcnNlcyBhIHNpbmdsZSBmaWVsZCBmcm9tIHRoZSBzcGVjaWZpZWQgdG9rZW5pemVyIGFuZCBtZXJnZXMgaXQgaW50bw0KKyAgICAgICAgLy8vIHRoZSBidWlsZGVyLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgTWVyZ2VGaWVsZChUZXh0VG9rZW5pemVyIHRva2VuaXplciwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJ1aWxkZXIgYnVpbGRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQ7DQorICAgICAgICAgICAgTWVzc2FnZURlc2NyaXB0b3IgdHlwZSA9IGJ1aWxkZXIuRGVzY3JpcHRvckZvclR5cGU7DQorICAgICAgICAgICAgRXh0ZW5zaW9uSW5mbyBleHRlbnNpb24gPSBudWxsOw0KKw0KKyAgICAgICAgICAgIGlmICh0b2tlbml6ZXIuVHJ5Q29uc3VtZSgiWyIpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gQW4gZXh0ZW5zaW9uLg0KKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIG5hbWUgPSBuZXcgU3RyaW5nQnVpbGRlcih0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIoKSk7DQorICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbml6ZXIuVHJ5Q29uc3VtZSgiLiIpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBuYW1lLkFwcGVuZCgiLiIpOw0KKyAgICAgICAgICAgICAgICAgICAgbmFtZS5BcHBlbmQodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvblJlZ2lzdHJ5LkZpbmRCeU5hbWUodHlwZSwgbmFtZS5Ub1N0cmluZygpKTsNCisNCisgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyB0b2tlbml6ZXIuQ3JlYXRlRm9ybWF0RXhjZXB0aW9uUHJldmlvdXNUb2tlbigiRXh0ZW5zaW9uIFwiIiArIG5hbWUgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIG5vdCBmb3VuZCBpbiB0aGUgRXh0ZW5zaW9uUmVnaXN0cnkuIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uLkRlc2NyaXB0b3IuQ29udGFpbmluZ1R5cGUgIT0gdHlwZSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgdG9rZW5pemVyLkNyZWF0ZUZvcm1hdEV4Y2VwdGlvblByZXZpb3VzVG9rZW4oIkV4dGVuc2lvbiBcIiIgKyBuYW1lICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBkb2VzIG5vdCBleHRlbmQgbWVzc2FnZSB0eXBlIFwiIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLkZ1bGxOYW1lICsgIlwiLiIpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHRva2VuaXplci5Db25zdW1lKCJdIik7DQorDQorICAgICAgICAgICAgICAgIGZpZWxkID0gZXh0ZW5zaW9uLkRlc2NyaXB0b3I7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyKCk7DQorICAgICAgICAgICAgICAgIGZpZWxkID0gdHlwZS5GaW5kRGVzY3JpcHRvcjxGaWVsZERlc2NyaXB0b3I+KG5hbWUpOw0KKw0KKyAgICAgICAgICAgICAgICAvLyBHcm91cCBuYW1lcyBhcmUgZXhwZWN0ZWQgdG8gYmUgY2FwaXRhbGl6ZWQgYXMgdGhleSBhcHBlYXIgaW4gdGhlDQorICAgICAgICAgICAgICAgIC8vIC5wcm90byBmaWxlLCB3aGljaCBhY3R1YWxseSBtYXRjaGVzIHRoZWlyIHR5cGUgbmFtZXMsIG5vdCB0aGVpciBmaWVsZA0KKyAgICAgICAgICAgICAgICAvLyBuYW1lcy4NCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkID09IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgaW52YXJpYW50IGN1bHR1cmUgc28gdGhhdCB0aGlzIGNvZGUgZG9lcyBub3QgYnJlYWsgd2hlbg0KKyAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW5nIGluIFR1cmtleS4NCisjaWYgUE9SVEFCTEVfTElCUkFSWQ0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvd2VyTmFtZSA9IG5hbWUuVG9Mb3dlckludmFyaWFudCgpOw0KKyNlbHNlDQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG93ZXJOYW1lID0gbmFtZS5Ub0xvd2VyKEZyYW1ld29ya1BvcnRhYmlsaXR5LkludmFyaWFudEN1bHR1cmUpOw0KKyNlbmRpZg0KKyAgICAgICAgICAgICAgICAgICAgZmllbGQgPSB0eXBlLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4obG93ZXJOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIHdvcmtlZCBidXQgdGhlIGZpZWxkIGlzIE5PVCBhIGdyb3VwLA0KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqb25za2VldCk6IFdoYXQ/IEphdmEgY29tbWVudCBlbmRzIGhlcmUhDQorICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCAmJiBmaWVsZC5GaWVsZFR5cGUgIT0gRmllbGRUeXBlLkdyb3VwKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAvLyBBZ2Fpbiwgc3BlY2lhbC1jYXNlIGdyb3VwIG5hbWVzIGFzIGRlc2NyaWJlZCBhYm92ZS4NCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkICE9IG51bGwgJiYgZmllbGQuRmllbGRUeXBlID09IEZpZWxkVHlwZS5Hcm91cCAmJiBmaWVsZC5NZXNzYWdlVHlwZS5OYW1lICE9IG5hbWUpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gbnVsbDsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgdG9rZW5pemVyLkNyZWF0ZUZvcm1hdEV4Y2VwdGlvblByZXZpb3VzVG9rZW4oDQorICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgdHlwZSBcIiIgKyB0eXBlLkZ1bGxOYW1lICsgIlwiIGhhcyBubyBmaWVsZCBuYW1lZCBcIiIgKyBuYW1lICsgIlwiLiIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIG9iamVjdCB2YWx1ZSA9IG51bGw7DQorDQorICAgICAgICAgICAgaWYgKGZpZWxkLk1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5NZXNzYWdlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdG9rZW5pemVyLlRyeUNvbnN1bWUoIjoiKTsgLy8gb3B0aW9uYWwNCisNCisgICAgICAgICAgICAgICAgU3RyaW5nIGVuZFRva2VuOw0KKyAgICAgICAgICAgICAgICBpZiAodG9rZW5pemVyLlRyeUNvbnN1bWUoIjwiKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZW5kVG9rZW4gPSAiPiI7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXIuQ29uc3VtZSgieyIpOw0KKyAgICAgICAgICAgICAgICAgICAgZW5kVG9rZW4gPSAifSI7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgSUJ1aWxkZXIgc3ViQnVpbGRlcjsNCisgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBzdWJCdWlsZGVyID0gYnVpbGRlci5DcmVhdGVCdWlsZGVyRm9yRmllbGQoZmllbGQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgc3ViQnVpbGRlciA9IGV4dGVuc2lvbi5EZWZhdWx0SW5zdGFuY2UuV2Vha0NyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgYXMgSUJ1aWxkZXI7DQorICAgICAgICAgICAgICAgICAgICBpZiAoc3ViQnVpbGRlciA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIkxpdGUgbWVzc2FnZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgd2hpbGUgKCF0b2tlbml6ZXIuVHJ5Q29uc3VtZShlbmRUb2tlbikpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbml6ZXIuQXRFbmQpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdG9rZW5pemVyLkNyZWF0ZUZvcm1hdEV4Y2VwdGlvbigiRXhwZWN0ZWQgXCIiICsgZW5kVG9rZW4gKyAiXCIuIik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBNZXJnZUZpZWxkKHRva2VuaXplciwgZXh0ZW5zaW9uUmVnaXN0cnksIHN1YkJ1aWxkZXIpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHZhbHVlID0gc3ViQnVpbGRlci5XZWFrQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdG9rZW5pemVyLkNvbnN1bWUoIjoiKTsNCisNCisgICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5GaWVsZFR5cGUpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkludDMyOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ludDMyOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZUludDMyKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQ2NDoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNGaXhlZDY0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVJbnQ2NCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuVUludDMyOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRml4ZWQzMjoNCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lVUludDMyKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50NjQ6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GaXhlZDY0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVVSW50NjQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZsb2F0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVGbG9hdCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRG91YmxlOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVEb3VibGUoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkJvb2w6DQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZUJvb2xlYW4oKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlN0cmluZzoNCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lU3RyaW5nKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5CeXRlczoNCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lQnl0ZVN0cmluZygpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRW51bToNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yIGVudW1UeXBlID0gZmllbGQuRW51bVR5cGU7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbml6ZXIuTG9va2luZ0F0SW50ZWdlcigpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyID0gdG9rZW5pemVyLkNvbnN1bWVJbnQzMigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlbnVtVHlwZS5GaW5kVmFsdWVCeU51bWJlcihudW1iZXIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdG9rZW5pemVyLkNyZWF0ZUZvcm1hdEV4Y2VwdGlvblByZXZpb3VzVG9rZW4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnVtIHR5cGUgXCIiICsgZW51bVR5cGUuRnVsbE5hbWUgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIHZhbHVlIHdpdGggbnVtYmVyICIgKyBudW1iZXIgKyAiLiIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gdG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudW1UeXBlLkZpbmRWYWx1ZUJ5TmFtZShpZCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0b2tlbml6ZXIuQ3JlYXRlRm9ybWF0RXhjZXB0aW9uUHJldmlvdXNUb2tlbigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVudW0gdHlwZSBcIiIgKyBlbnVtVHlwZS5GdWxsTmFtZSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBoYXMgbm8gdmFsdWUgbmFtZWQgXCIiICsgaWQgKyAiXCIuIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuTWVzc2FnZToNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkdyb3VwOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4ndCBnZXQgaGVyZS4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAoZmllbGQuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuV2Vha0FkZFJlcGVhdGVkRmllbGQoZmllbGQsIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYnVpbGRlci5TZXRGaWVsZChmaWVsZCwgdmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9UZXh0R2VuZXJhdG9yLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvVGV4dEdlbmVyYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGNiZjBmCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvVGV4dEdlbmVyYXRvci5jcwpAQCAtMCwwICsxLDE1OSBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlRleHQ7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEhlbHBlciBjbGFzcyB0byBjb250cm9sIGluZGVudGF0aW9uLiBVc2VkIGZvciBUZXh0Rm9ybWF0IGFuZCBieSBQcm90b0dlbi4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBUZXh0R2VuZXJhdG9yDQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUaGUgc3RyaW5nIHRvIHVzZSBhdCB0aGUgZW5kIG9mIGVhY2ggbGluZS4gV2UgYXNzdW1lIHRoYXQgIlByaW50IiBpcyBvbmx5IGNhbGxlZCB1c2luZyBcbg0KKyAgICAgICAgLy8vIHRvIGluZGljYXRlIGEgbGluZSBicmVhazsgdGhhdCdzIHdoYXQgd2UgdXNlIHRvIGRldGVjdCB3aGVuIHdlIG5lZWQgdG8gaW5kZW50IGV0YywgYW5kDQorICAgICAgICAvLy8gKmp1c3QqIHRoZSBcbiBpcyByZXBsYWNlZCB3aXRoIHRoZSBjb250ZW50cyBvZiBsaW5lQnJlYWsuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgbGluZUJyZWFrOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlciB0byB3cml0ZSBmb3JtYXR0ZWQgdGV4dCB0by4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRleHRXcml0ZXIgd3JpdGVyOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlIG5leHQgcGllY2Ugb2YgdGV4dCBzaG91bGQgYmUgaW5kZW50ZWQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIGJvb2wgYXRTdGFydE9mTGluZSA9IHRydWU7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgbGV2ZWwgb2YgaW5kZW50YXRpb24NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFN0cmluZ0J1aWxkZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDcmVhdGVzIGEgZ2VuZXJhdG9yIHdyaXRpbmcgdG8gdGhlIGdpdmVuIHdyaXRlci4gVGhlIHdyaXRlcg0KKyAgICAgICAgLy8vIGlzIG5vdCBjbG9zZWQgYnkgdGhpcyBjbGFzcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgVGV4dEdlbmVyYXRvcihUZXh0V3JpdGVyIHdyaXRlciwgc3RyaW5nIGxpbmVCcmVhaykNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aGlzLndyaXRlciA9IHdyaXRlcjsNCisgICAgICAgICAgICB0aGlzLmxpbmVCcmVhayA9IGxpbmVCcmVhazsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBJbmRlbnRzIHRleHQgYnkgdHdvIHNwYWNlcy4gQWZ0ZXIgY2FsbGluZyBJbmRlbnQoKSwgdHdvIHNwYWNlcw0KKyAgICAgICAgLy8vIHdpbGwgYmUgaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgb2YgdGV4dC4gSW5kZW50KCkgbWF5DQorICAgICAgICAvLy8gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIHByb2R1Y2UgZGVlcGVyIGluZGVudHMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgSW5kZW50KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbmRlbnQuQXBwZW5kKCIgICIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlZHVjZXMgdGhlIGN1cnJlbnQgaW5kZW50IGxldmVsIGJ5IHR3byBzcGFjZXMuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgT3V0ZGVudCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGluZGVudC5MZW5ndGggPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUb28gbWFueSBjYWxscyB0byBPdXRkZW50KCkiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaW5kZW50Lkxlbmd0aCAtPSAyOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVMaW5lKHN0cmluZyB0ZXh0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFByaW50KHRleHQpOw0KKyAgICAgICAgICAgIFByaW50KCJcbiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVMaW5lKHN0cmluZyBmb3JtYXQsIHBhcmFtcyBvYmplY3RbXSBhcmdzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlTGluZShzdHJpbmcuRm9ybWF0KGZvcm1hdCwgYXJncykpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVMaW5lKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBXcml0ZUxpbmUoIiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFByaW50cyB0aGUgZ2l2ZW4gdGV4dCB0byB0aGUgb3V0cHV0IHN0cmVhbSwgaW5kZW50aW5nIGF0IGxpbmUgYm91bmRhcmllcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRleHQiPjwvcGFyYW0+DQorICAgICAgICBwdWJsaWMgdm9pZCBQcmludChzdHJpbmcgdGV4dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgcG9zID0gMDsNCisNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQuTGVuZ3RoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAodGV4dFtpXSA9PSAnXG4nKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAvLyBTdHJpcCBvZmYgdGhlIFxuIGZyb20gd2hhdCB3ZSB3cml0ZQ0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGUodGV4dC5TdWJzdHJpbmcocG9zLCBpIC0gcG9zKSk7DQorICAgICAgICAgICAgICAgICAgICBXcml0ZShsaW5lQnJlYWspOw0KKyAgICAgICAgICAgICAgICAgICAgcG9zID0gaSArIDE7DQorICAgICAgICAgICAgICAgICAgICBhdFN0YXJ0T2ZMaW5lID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBXcml0ZSh0ZXh0LlN1YnN0cmluZyhwb3MpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlKHN0cmluZyBmb3JtYXQsIHBhcmFtcyBvYmplY3RbXSBhcmdzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFdyaXRlKHN0cmluZy5Gb3JtYXQoZm9ybWF0LCBhcmdzKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGUoc3RyaW5nIGRhdGEpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGRhdGEuTGVuZ3RoID09IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChhdFN0YXJ0T2ZMaW5lKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYXRTdGFydE9mTGluZSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoaW5kZW50KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3JpdGVyLldyaXRlKGRhdGEpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1RleHRUb2tlbml6ZXIuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9UZXh0VG9rZW5pemVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYjI3ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9UZXh0VG9rZW5pemVyLmNzCkBAIC0wLDAgKzEsNTAxIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOw0KK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gUmVwcmVzZW50cyBhIHN0cmVhbSBvZiB0b2tlbnMgcGFyc2VkIGZyb20gYSBzdHJpbmcuDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIGludGVybmFsIHNlYWxlZCBjbGFzcyBUZXh0VG9rZW5pemVyDQorICAgIHsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIHRleHQ7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBjdXJyZW50VG9rZW47DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIGNoYXJhY3RlciBpbmRleCB3aXRoaW4gdGhlIHRleHQgdG8gcGVyZm9ybSB0aGUgbmV4dCByZWdleCBtYXRjaCBhdC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIGludCBtYXRjaFBvcyA9IDA7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIGNoYXJhY3RlciBpbmRleCB3aXRoaW4gdGhlIHRleHQgYXQgd2hpY2ggdGhlIGN1cnJlbnQgdG9rZW4gYmVnaW5zLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgaW50IHBvcyA9IDA7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHRva2VuLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgaW50IGxpbmUgPSAwOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBjdXJyZW50IHRva2VuLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgaW50IGNvbHVtbiA9IDA7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyB0b2tlbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIGludCBwcmV2aW91c0xpbmUgPSAwOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBwcmV2aW91cyB0b2tlbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIGludCBwcmV2aW91c0NvbHVtbiA9IDA7DQorDQorICAgICAgICAvLyBOb3RlOiBhdG9taWMgZ3JvdXBzIHVzZWQgdG8gbWltaWMgcG9zc2Vzc2l2ZSBxdWFudGlmaWVycyBpbiBKYXZhIGluIGJvdGggb2YgdGhlc2UgcmVnZXhlcw0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IFJlZ2V4IFdoaXRlc3BhY2VBbmRDb21tZW50UGF0dGVybiA9IG5ldyBSZWdleCgiXFxHKD8+KFxcc3woIy4qJCkpKykiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZXdvcmtQb3J0YWJpbGl0eS4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVkUmVnZXhXaGVyZUF2YWlsYWJsZSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2V4T3B0aW9ucy5NdWx0aWxpbmUpOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUmVnZXggVG9rZW5QYXR0ZXJuID0gbmV3IFJlZ2V4KA0KKyAgICAgICAgICAgICJcXEdbYS16QS1aX10oPz5bMC05YS16QS1aXystXSopfCIgKyAvLyBhbiBpZGVudGlmaWVyDQorICAgICAgICAgICAgIlxcR1swLTkrLV0oPz5bMC05YS16QS1aXy4rLV0qKXwiICsgLy8gYSBudW1iZXINCisgICAgICAgICAgICAiXFxHXCIoPz4oW15cIlxcXG5cXFxcXXxcXFxcLikqKShcInxcXFxcPyQpfCIgKyAvLyBhIGRvdWJsZS1xdW90ZWQgc3RyaW5nDQorICAgICAgICAgICAgIlxcR1wnKD8+KFteXCJcXFxuXFxcXF18XFxcXC4pKikoXCd8XFxcXD8kKSIsIC8vIGEgc2luZ2xlLXF1b3RlZCBzdHJpbmcNCisgICAgICAgICAgICBGcmFtZXdvcmtQb3J0YWJpbGl0eS5Db21waWxlZFJlZ2V4V2hlcmVBdmFpbGFibGUgfCBSZWdleE9wdGlvbnMuTXVsdGlsaW5lKTsNCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJlZ2V4IERvdWJsZUluZmluaXR5ID0gbmV3IFJlZ2V4KCJeLT9pbmYoaW5pdHkpPyQiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWV3b3JrUG9ydGFiaWxpdHkuQ29tcGlsZWRSZWdleFdoZXJlQXZhaWxhYmxlIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2V4T3B0aW9ucy5JZ25vcmVDYXNlKTsNCisNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJlZ2V4IEZsb2F0SW5maW5pdHkgPSBuZXcgUmVnZXgoIl4tP2luZihpbml0eSk/Zj8kIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWV3b3JrUG9ydGFiaWxpdHkuQ29tcGlsZWRSZWdleFdoZXJlQXZhaWxhYmxlIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnZXhPcHRpb25zLklnbm9yZUNhc2UpOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUmVnZXggRmxvYXROYW4gPSBuZXcgUmVnZXgoIl5uYW5mPyQiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWV3b3JrUG9ydGFiaWxpdHkuQ29tcGlsZWRSZWdleFdoZXJlQXZhaWxhYmxlIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2V4T3B0aW9ucy5JZ25vcmVDYXNlKTsNCisNCisgICAgICAgIC8qKiBDb25zdHJ1Y3QgYSB0b2tlbml6ZXIgdGhhdCBwYXJzZXMgdG9rZW5zIGZyb20gdGhlIGdpdmVuIHRleHQuICovDQorDQorICAgICAgICBwdWJsaWMgVGV4dFRva2VuaXplcihzdHJpbmcgdGV4dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KKyAgICAgICAgICAgIFNraXBXaGl0ZXNwYWNlKCk7DQorICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQXJlIHdlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0Pw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBib29sIEF0RW5kDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGN1cnJlbnRUb2tlbi5MZW5ndGggPT0gMDsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFkdmFuY2VzIHRvIHRoZSBuZXh0IHRva2VuLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIE5leHRUb2tlbigpDQorICAgICAgICB7DQorICAgICAgICAgICAgcHJldmlvdXNMaW5lID0gbGluZTsNCisgICAgICAgICAgICBwcmV2aW91c0NvbHVtbiA9IGNvbHVtbjsNCisNCisgICAgICAgICAgICAvLyBBZHZhbmNlIHRoZSBsaW5lIGNvdW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uDQorICAgICAgICAgICAgd2hpbGUgKHBvcyA8IG1hdGNoUG9zKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKHRleHRbcG9zXSA9PSAnXG4nKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICArK2xpbmU7DQorICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAwOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgKytjb2x1bW47DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgKytwb3M7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vIE1hdGNoIHRoZSBuZXh0IHRva2VuLg0KKyAgICAgICAgICAgIGlmIChtYXRjaFBvcyA9PSB0ZXh0Lkxlbmd0aCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIEVPRg0KKyAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4gPSAiIjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgTWF0Y2ggbWF0Y2ggPSBUb2tlblBhdHRlcm4uTWF0Y2godGV4dCwgbWF0Y2hQb3MpOw0KKyAgICAgICAgICAgICAgICBpZiAobWF0Y2guU3VjY2VzcykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuID0gbWF0Y2guVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICBtYXRjaFBvcyArPSBtYXRjaC5MZW5ndGg7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAvLyBUYWtlIG9uZSBjaGFyYWN0ZXIuDQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4gPSB0ZXh0W21hdGNoUG9zXS5Ub1N0cmluZygpOw0KKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hQb3MrKzsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBTa2lwV2hpdGVzcGFjZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTa2lwIG92ZXIgYW55IHdoaXRlc3BhY2Ugc28gdGhhdCBtYXRjaFBvcyBzdGFydHMgYXQgdGhlIG5leHQgdG9rZW4uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNraXBXaGl0ZXNwYWNlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBNYXRjaCBtYXRjaCA9IFdoaXRlc3BhY2VBbmRDb21tZW50UGF0dGVybi5NYXRjaCh0ZXh0LCBtYXRjaFBvcyk7DQorICAgICAgICAgICAgaWYgKG1hdGNoLlN1Y2Nlc3MpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBtYXRjaFBvcyArPSBtYXRjaC5MZW5ndGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIElmIHRoZSBuZXh0IHRva2VuIGV4YWN0bHkgbWF0Y2hlcyB0aGUgZ2l2ZW4gdG9rZW4sIGNvbnN1bWUgaXQgYW5kIHJldHVybg0KKyAgICAgICAgLy8vIHRydWUuIE90aGVyd2lzZSwgcmV0dXJuIGZhbHNlIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGJvb2wgVHJ5Q29uc3VtZShzdHJpbmcgdG9rZW4pDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGN1cnJlbnRUb2tlbiA9PSB0b2tlbikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLyoNCisgICAgICogSWYgdGhlIG5leHQgdG9rZW4gZXhhY3RseSBtYXRjaGVzIHtAY29kZSB0b2tlbn0sIGNvbnN1bWUgaXQuICBPdGhlcndpc2UsDQorICAgICAqIHRocm93IGEge0BsaW5rIFBhcnNlRXhjZXB0aW9ufS4NCisgICAgICovDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSWYgdGhlIG5leHQgdG9rZW4gZXhhY3RseSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgb25lLCBjb25zdW1lIGl0Lg0KKyAgICAgICAgLy8vIE90aGVyd2lzZSwgdGhyb3cgYSBGb3JtYXRFeGNlcHRpb24uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0b2tlbiI+PC9wYXJhbT4NCisgICAgICAgIHB1YmxpYyB2b2lkIENvbnN1bWUoc3RyaW5nIHRva2VuKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICghVHJ5Q29uc3VtZSh0b2tlbikpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBDcmVhdGVGb3JtYXRFeGNlcHRpb24oIkV4cGVjdGVkIFwiIiArIHRva2VuICsgIlwiLiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIG5leHQgdG9rZW4gaXMgYW4gaW50ZWdlciwgYnV0IGRvZXMgbm90IGNvbnN1bWUgaXQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGJvb2wgTG9va2luZ0F0SW50ZWdlcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGN1cnJlbnRUb2tlbi5MZW5ndGggPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgY2hhciBjID0gY3VycmVudFRva2VuWzBdOw0KKyAgICAgICAgICAgIHJldHVybiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8IGMgPT0gJy0nIHx8IGMgPT0gJysnOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIElmIHRoZSBuZXh0IHRva2VuIGlzIGFuIGlkZW50aWZpZXIsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUuDQorICAgICAgICAvLy8gT3RoZXJ3aXNlLCB0aHJvdyBhIEZvcm1hdEV4Y2VwdGlvbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RyaW5nIENvbnN1bWVJZGVudGlmaWVyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoIChjaGFyIGMgaW4gY3VycmVudFRva2VuKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKCgnYScgPD0gYyAmJiBjIDw9ICd6JykgfHwNCisgICAgICAgICAgICAgICAgICAgICgnQScgPD0gYyAmJiBjIDw9ICdaJykgfHwNCisgICAgICAgICAgICAgICAgICAgICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgfHwNCisgICAgICAgICAgICAgICAgICAgIChjID09ICdfJykgfHwgKGMgPT0gJy4nKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gT0sNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IENyZWF0ZUZvcm1hdEV4Y2VwdGlvbigiRXhwZWN0ZWQgaWRlbnRpZmllci4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBzdHJpbmcgcmVzdWx0ID0gY3VycmVudFRva2VuOw0KKyAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSWYgdGhlIG5leHQgdG9rZW4gaXMgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMgDQorICAgICAgICAvLy8gdmFsdWUuIE90aGVyd2lzZSwgdGhyb3cgYSBGb3JtYXRFeGNlcHRpb24uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGludCBDb25zdW1lSW50MzIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IFRleHRGb3JtYXQuUGFyc2VJbnQzMihjdXJyZW50VG9rZW4pOw0KKyAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbiBlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgQ3JlYXRlSW50ZWdlclBhcnNlRXhjZXB0aW9uKGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLCBjb25zdW1lIGl0IGFuZCByZXR1cm4gaXRzDQorICAgICAgICAvLy8gdmFsdWUuIE90aGVyd2lzZSwgdGhyb3cgYSBGb3JtYXRFeGNlcHRpb24uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHVpbnQgQ29uc3VtZVVJbnQzMigpDQorICAgICAgICB7DQorICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB1aW50IHJlc3VsdCA9IFRleHRGb3JtYXQuUGFyc2VVSW50MzIoY3VycmVudFRva2VuKTsNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24gZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IENyZWF0ZUludGVnZXJQYXJzZUV4Y2VwdGlvbihlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSWYgdGhlIG5leHQgdG9rZW4gaXMgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMNCisgICAgICAgIC8vLyB2YWx1ZS4gT3RoZXJ3aXNlLCB0aHJvdyBhIEZvcm1hdEV4Y2VwdGlvbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgbG9uZyBDb25zdW1lSW50NjQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbG9uZyByZXN1bHQgPSBUZXh0Rm9ybWF0LlBhcnNlSW50NjQoY3VycmVudFRva2VuKTsNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24gZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IENyZWF0ZUludGVnZXJQYXJzZUV4Y2VwdGlvbihlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSWYgdGhlIG5leHQgdG9rZW4gaXMgYSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciwgY29uc3VtZSBpdCBhbmQgcmV0dXJuIGl0cw0KKyAgICAgICAgLy8vIHZhbHVlLiBPdGhlcndpc2UsIHRocm93IGEgRm9ybWF0RXhjZXB0aW9uLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB1bG9uZyBDb25zdW1lVUludDY0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHVsb25nIHJlc3VsdCA9IFRleHRGb3JtYXQuUGFyc2VVSW50NjQoY3VycmVudFRva2VuKTsNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24gZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IENyZWF0ZUludGVnZXJQYXJzZUV4Y2VwdGlvbihlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBkb3VibGUsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUuDQorICAgICAgICAvLy8gT3RoZXJ3aXNlLCB0aHJvdyBhIEZvcm1hdEV4Y2VwdGlvbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgZG91YmxlIENvbnN1bWVEb3VibGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcGFyc2UgaW5maW5pdHkgYW5kIG5hbiBzZXBhcmF0ZWx5IGJlY2F1c2UNCisgICAgICAgICAgICAvLyBkb3VibGUuUGFyc2UoKSBkb2VzIG5vdCBhY2NlcHQgImluZiIsICJpbmZpbml0eSIsIG9yICJuYW4iLg0KKyAgICAgICAgICAgIGlmIChEb3VibGVJbmZpbml0eS5Jc01hdGNoKGN1cnJlbnRUb2tlbikpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBib29sIG5lZ2F0aXZlID0gY3VycmVudFRva2VuLlN0YXJ0c1dpdGgoIi0iKTsNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBuZWdhdGl2ZSA/IGRvdWJsZS5OZWdhdGl2ZUluZmluaXR5IDogZG91YmxlLlBvc2l0aXZlSW5maW5pdHk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChjdXJyZW50VG9rZW4uRXF1YWxzKCJuYW4iLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRG91YmxlLk5hTjsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBkb3VibGUgcmVzdWx0ID0gZG91YmxlLlBhcnNlKGN1cnJlbnRUb2tlbiwgRnJhbWV3b3JrUG9ydGFiaWxpdHkuSW52YXJpYW50Q3VsdHVyZSk7DQorICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBDcmVhdGVGbG9hdFBhcnNlRXhjZXB0aW9uKGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoT3ZlcmZsb3dFeGNlcHRpb24gZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IENyZWF0ZUZsb2F0UGFyc2VFeGNlcHRpb24oZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgZmxvYXQsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUuDQorICAgICAgICAvLy8gT3RoZXJ3aXNlLCB0aHJvdyBhIEZvcm1hdEV4Y2VwdGlvbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgZmxvYXQgQ29uc3VtZUZsb2F0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHBhcnNlIGluZmluaXR5IGFuZCBuYW4gc2VwYXJhdGVseSBiZWNhdXNlDQorICAgICAgICAgICAgLy8gRmxvYXQucGFyc2VGbG9hdCgpIGRvZXMgbm90IGFjY2VwdCAiaW5mIiwgImluZmluaXR5Iiwgb3IgIm5hbiIuDQorICAgICAgICAgICAgaWYgKEZsb2F0SW5maW5pdHkuSXNNYXRjaChjdXJyZW50VG9rZW4pKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYm9vbCBuZWdhdGl2ZSA9IGN1cnJlbnRUb2tlbi5TdGFydHNXaXRoKCItIik7DQorICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmVnYXRpdmUgPyBmbG9hdC5OZWdhdGl2ZUluZmluaXR5IDogZmxvYXQuUG9zaXRpdmVJbmZpbml0eTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKEZsb2F0TmFuLklzTWF0Y2goY3VycmVudFRva2VuKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQuTmFOOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAoY3VycmVudFRva2VuLkVuZHNXaXRoKCJmIikpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4gPSBjdXJyZW50VG9rZW4uVHJpbUVuZCgnZicpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGZsb2F0IHJlc3VsdCA9IGZsb2F0LlBhcnNlKGN1cnJlbnRUb2tlbiwgRnJhbWV3b3JrUG9ydGFiaWxpdHkuSW52YXJpYW50Q3VsdHVyZSk7DQorICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBDcmVhdGVGbG9hdFBhcnNlRXhjZXB0aW9uKGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoT3ZlcmZsb3dFeGNlcHRpb24gZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRocm93IENyZWF0ZUZsb2F0UGFyc2VFeGNlcHRpb24oZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgQm9vbGVhbiwgY29uc3VtZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4NCisgICAgICAgIC8vLyBPdGhlcndpc2UsIHRocm93IGEgRm9ybWF0RXhjZXB0aW9uLiAgICANCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgYm9vbCBDb25zdW1lQm9vbGVhbigpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGN1cnJlbnRUb2tlbiA9PSAidHJ1ZSIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChjdXJyZW50VG9rZW4gPT0gImZhbHNlIikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRocm93IENyZWF0ZUZvcm1hdEV4Y2VwdGlvbigiRXhwZWN0ZWQgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiLiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgc3RyaW5nLCBjb25zdW1lIGl0IGFuZCByZXR1cm4gaXRzICh1bmVzY2FwZWQpIHZhbHVlLg0KKyAgICAgICAgLy8vIE90aGVyd2lzZSwgdGhyb3cgYSBGb3JtYXRFeGNlcHRpb24uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0cmluZyBDb25zdW1lU3RyaW5nKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ29uc3VtZUJ5dGVTdHJpbmcoKS5Ub1N0cmluZ1V0ZjgoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIHN0cmluZywgY29uc3VtZSBpdCwgdW5lc2NhcGUgaXQgYXMgYQ0KKyAgICAgICAgLy8vIEJ5dGVTdHJpbmcgYW5kIHJldHVybiBpdC4gT3RoZXJ3aXNlLCB0aHJvdyBhIEZvcm1hdEV4Y2VwdGlvbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgQnl0ZVN0cmluZyBDb25zdW1lQnl0ZVN0cmluZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgY2hhciBxdW90ZSA9IGN1cnJlbnRUb2tlbi5MZW5ndGggPiAwID8gY3VycmVudFRva2VuWzBdIDogJ1wwJzsNCisgICAgICAgICAgICBpZiAocXVvdGUgIT0gJ1wiJyAmJiBxdW90ZSAhPSAnXCcnKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgQ3JlYXRlRm9ybWF0RXhjZXB0aW9uKCJFeHBlY3RlZCBzdHJpbmcuIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmIChjdXJyZW50VG9rZW4uTGVuZ3RoIDwgMiB8fA0KKyAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW5bY3VycmVudFRva2VuLkxlbmd0aCAtIDFdICE9IHF1b3RlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgQ3JlYXRlRm9ybWF0RXhjZXB0aW9uKCJTdHJpbmcgbWlzc2luZyBlbmRpbmcgcXVvdGUuIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3RyaW5nIGVzY2FwZWQgPSBjdXJyZW50VG9rZW4uU3Vic3RyaW5nKDEsIGN1cnJlbnRUb2tlbi5MZW5ndGggLSAyKTsNCisgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyByZXN1bHQgPSBUZXh0Rm9ybWF0LlVuZXNjYXBlQnl0ZXMoZXNjYXBlZCk7DQorICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uIGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBDcmVhdGVGb3JtYXRFeGNlcHRpb24oZS5NZXNzYWdlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyBhIGZvcm1hdCBleGNlcHRpb24gd2l0aCB0aGUgY3VycmVudCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycw0KKyAgICAgICAgLy8vIGluIHRoZSBkZXNjcmlwdGlvbiwgc3VpdGFibGUgZm9yIHRocm93aW5nLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBGb3JtYXRFeGNlcHRpb24gQ3JlYXRlRm9ybWF0RXhjZXB0aW9uKHN0cmluZyBkZXNjcmlwdGlvbikNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBOb3RlOiAgUGVvcGxlIGdlbmVyYWxseSBwcmVmZXIgb25lLWJhc2VkIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzLg0KKyAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybWF0RXhjZXB0aW9uKChsaW5lICsgMSkgKyAiOiIgKyAoY29sdW1uICsgMSkgKyAiOiAiICsgZGVzY3JpcHRpb24pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJldHVybnMgYSBmb3JtYXQgZXhjZXB0aW9uIHdpdGggdGhlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIG9mIHRoZQ0KKyAgICAgICAgLy8vIHByZXZpb3VzIHRva2VuIGluIHRoZSBkZXNjcmlwdGlvbiwgc3VpdGFibGUgZm9yIHRocm93aW5nLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBGb3JtYXRFeGNlcHRpb24gQ3JlYXRlRm9ybWF0RXhjZXB0aW9uUHJldmlvdXNUb2tlbihzdHJpbmcgZGVzY3JpcHRpb24pDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gTm90ZTogIFBlb3BsZSBnZW5lcmFsbHkgcHJlZmVyIG9uZS1iYXNlZCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4NCisgICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1hdEV4Y2VwdGlvbigocHJldmlvdXNMaW5lICsgMSkgKyAiOiIgKyAocHJldmlvdXNDb2x1bW4gKyAxKSArICI6ICIgKyBkZXNjcmlwdGlvbik7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29uc3RydWN0cyBhbiBhcHByb3ByaWF0ZSBGb3JtYXRFeGNlcHRpb24gZm9yIHRoZSBnaXZlbiBleGlzdGluZyBleGNlcHRpb24NCisgICAgICAgIC8vLyB3aGVuIHRyeWluZyB0byBwYXJzZSBhbiBpbnRlZ2VyLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgRm9ybWF0RXhjZXB0aW9uIENyZWF0ZUludGVnZXJQYXJzZUV4Y2VwdGlvbihGb3JtYXRFeGNlcHRpb24gZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlRm9ybWF0RXhjZXB0aW9uKCJDb3VsZG4ndCBwYXJzZSBpbnRlZ2VyOiAiICsgZS5NZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGFuIGFwcHJvcHJpYXRlIEZvcm1hdEV4Y2VwdGlvbiBmb3IgdGhlIGdpdmVuIGV4aXN0aW5nIGV4Y2VwdGlvbg0KKyAgICAgICAgLy8vIHdoZW4gdHJ5aW5nIHRvIHBhcnNlIGEgZmxvYXQgb3IgZG91YmxlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgRm9ybWF0RXhjZXB0aW9uIENyZWF0ZUZsb2F0UGFyc2VFeGNlcHRpb24oRXhjZXB0aW9uIGUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUZvcm1hdEV4Y2VwdGlvbigiQ291bGRuJ3QgcGFyc2UgbnVtYmVyOiAiICsgZS5NZXNzYWdlKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9UaHJvd0hlbHBlci5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Rocm93SGVscGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTVmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9UaHJvd0hlbHBlci5jcwpAQCAtMCwwICsxLDkyIEBACivvu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBIZWxwZXIgbWV0aG9kcyBmb3IgdGhyb3dpbmcgZXhjZXB0aW9ucw0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRocm93SGVscGVyDQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUaHJvd3MgYW4gQXJndW1lbnROdWxsRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBudWxsLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBUaHJvd0lmTnVsbChvYmplY3QgdmFsdWUsIHN0cmluZyBuYW1lKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhyb3dzIGFuIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgbnVsbC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVGhyb3dJZk51bGwob2JqZWN0IHZhbHVlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUaHJvd3MgYW4gQXJndW1lbnROdWxsRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB2YWx1ZSBvciBhbnkgZWxlbWVudCB3aXRoaW4gaXQgaXMgbnVsbC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVGhyb3dJZkFueU51bGw8VD4oSUVudW1lcmFibGU8VD4gc2VxdWVuY2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoVCB0IGluIHNlcXVlbmNlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBFeGNlcHRpb24gQ3JlYXRlTWlzc2luZ01ldGhvZChUeXBlIHR5cGUsIHN0cmluZyBtZXRob2ROYW1lKQ0KKyAgICAgICAgew0KKyNpZiBDTElFTlRQUk9GSUxFDQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTeXN0ZW0uTWlzc2luZ01ldGhvZEV4Y2VwdGlvbih0eXBlLkZ1bGxOYW1lLCBtZXRob2ROYW1lKTsNCisjZWxzZQ0KKyAgICAgICAgICAgIHJldHVybiBuZXcgU3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIlRoZSBtZXRob2QgJ3swfScgd2FzIG5vdCBmb3VuZCBvbiB0eXBlIHsxfS4iLCBtZXRob2ROYW1lLCB0eXBlKSk7DQorI2VuZGlmDQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24uY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9VbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTRmODU2Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24uY3MKQEAgLTAsMCArMSwyMDggQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KKw0KKyNpZiAhTElURQ0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCisNCisjZW5kaWYNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gVE9ETyhqb25za2VldCk6IFdyaXRlIHN1bW1hcnkgdGV4dC4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiA6IEV4Y2VwdGlvbg0KKyAgICB7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElMaXN0PHN0cmluZz4gbWlzc2luZ0ZpZWxkczsNCisNCisgICAgICAgIHByaXZhdGUgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24oSUxpc3Q8c3RyaW5nPiBtaXNzaW5nRmllbGRzKQ0KKyAgICAgICAgICAgIDogYmFzZShCdWlsZERlc2NyaXB0aW9uKG1pc3NpbmdGaWVsZHMpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRoaXMubWlzc2luZ0ZpZWxkcyA9IG5ldyBMaXN0PHN0cmluZz4obWlzc2luZ0ZpZWxkcyk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyBhIHJlYWQtb25seSBsaXN0IG9mIGh1bWFuLXJlYWRhYmxlIG5hbWVzIG9mDQorICAgICAgICAvLy8gcmVxdWlyZWQgZmllbGRzIG1pc3NpbmcgZnJvbSB0aGlzIG1lc3NhZ2UuIEVhY2ggbmFtZQ0KKyAgICAgICAgLy8vIGlzIGEgZnVsbCBwYXRoIHRvIGEgZmllbGQsIGUuZy4gImZvby5iYXJbNV0uYmF6Ig0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBJTGlzdDxzdHJpbmc+IE1pc3NpbmdGaWVsZHMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbWlzc2luZ0ZpZWxkczsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnZlcnRzIHRoaXMgZXhjZXB0aW9uIGludG8gYW4gSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLg0KKyAgICAgICAgLy8vIFdoZW4gYSBwYXJzZWQgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcywgdGhpcyBzaG91bGQgYmUgdGhyb3duDQorICAgICAgICAvLy8gaW5zdGVhZCBvZiBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIEFzSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbihNZXNzYWdlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgZm9yIGEgZ2l2ZW4gbGlzdCBvZiBtaXNzaW5nIGZpZWxkcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgQnVpbGREZXNjcmlwdGlvbihJRW51bWVyYWJsZTxzdHJpbmc+IG1pc3NpbmdGaWVsZHMpDQorICAgICAgICB7DQorICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBkZXNjcmlwdGlvbiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAiKTsNCisgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsNCisgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgZmllbGQgaW4gbWlzc2luZ0ZpZWxkcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChmaXJzdCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLkFwcGVuZCgiLCAiKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5BcHBlbmQoZmllbGQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb24uVG9TdHJpbmcoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBGb3IgTGl0ZSBleGNlcHRpb25zIHRoYXQgZG8gbm90IGtub3duIGhvdyB0byBlbnVtZXJhdGUgbWlzc2luZyBmaWVsZHMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24oSU1lc3NhZ2VMaXRlIG1lc3NhZ2UpDQorICAgICAgICAgICAgOiBiYXNlKFN0cmluZy5Gb3JtYXQoIk1lc3NhZ2UgezB9IGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzIiwgbWVzc2FnZS5HZXRUeXBlKCkpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIG1pc3NpbmdGaWVsZHMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7DQorICAgICAgICB9DQorDQorI2lmICFMSVRFDQorICAgICAgICBwdWJsaWMgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24oSU1lc3NhZ2UgbWVzc2FnZSkNCisgICAgICAgICAgICA6IHRoaXMoRmluZE1pc3NpbmdGaWVsZHMobWVzc2FnZSkpDQorICAgICAgICB7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGZ1bGwgInBhdGhzIiBvZiBtaXNzaW5nIHJlcXVpcmVkDQorICAgICAgICAvLy8gZmllbGRzIGluIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcml2YXRlIHN0YXRpYyBJTGlzdDxTdHJpbmc+IEZpbmRNaXNzaW5nRmllbGRzKElNZXNzYWdlIG1lc3NhZ2UpDQorICAgICAgICB7DQorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3VsdHMgPSBuZXcgTGlzdDxTdHJpbmc+KCk7DQorICAgICAgICAgICAgRmluZE1pc3NpbmdGaWVsZHMobWVzc2FnZSwgIiIsIHJlc3VsdHMpOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHRzOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlY3Vyc2l2ZSBoZWxwZXIgaW1wbGVtZW50aW5nIEZpbmRNaXNzaW5nRmllbGRzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRmluZE1pc3NpbmdGaWVsZHMoSU1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIHByZWZpeCwgTGlzdDxTdHJpbmc+IHJlc3VsdHMpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoRmllbGREZXNjcmlwdG9yIGZpZWxkIGluIG1lc3NhZ2UuRGVzY3JpcHRvckZvclR5cGUuRmllbGRzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzUmVxdWlyZWQgJiYgIW1lc3NhZ2UuSGFzRmllbGQoZmllbGQpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLkFkZChwcmVmaXggKyBmaWVsZC5OYW1lKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBmb3JlYWNoIChLZXlWYWx1ZVBhaXI8RmllbGREZXNjcmlwdG9yLCBvYmplY3Q+IGVudHJ5IGluIG1lc3NhZ2UuQWxsRmllbGRzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZW50cnkuS2V5Ow0KKyAgICAgICAgICAgICAgICBvYmplY3QgdmFsdWUgPSBlbnRyeS5WYWx1ZTsNCisNCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLk1hcHBlZFR5cGUgPT0gTWFwcGVkVHlwZS5NZXNzYWdlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IGVsZW1lbnQgaW4gKElFbnVtZXJhYmxlKSB2YWx1ZSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGlzIElNZXNzYWdlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kTWlzc2luZ0ZpZWxkcygoSU1lc3NhZ2UpIGVsZW1lbnQsIFN1Yk1lc3NhZ2VQcmVmaXgocHJlZml4LCBmaWVsZCwgaSsrKSwgcmVzdWx0cyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLkFkZChwcmVmaXggKyBmaWVsZC5OYW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5IYXNGaWVsZChmaWVsZCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaXMgSU1lc3NhZ2UpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRNaXNzaW5nRmllbGRzKChJTWVzc2FnZSkgdmFsdWUsIFN1Yk1lc3NhZ2VQcmVmaXgocHJlZml4LCBmaWVsZCwgLTEpLCByZXN1bHRzKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuQWRkKHByZWZpeCArIGZpZWxkLk5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFN1Yk1lc3NhZ2VQcmVmaXgoU3RyaW5nIHByZWZpeCwgRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXgpDQorICAgICAgICB7DQorICAgICAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcihwcmVmaXgpOw0KKyAgICAgICAgICAgIGlmIChmaWVsZC5Jc0V4dGVuc2lvbikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5BcHBlbmQoJygnKQ0KKyAgICAgICAgICAgICAgICAgICAgLkFwcGVuZChmaWVsZC5GdWxsTmFtZSkNCisgICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoJyknKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0LkFwcGVuZChmaWVsZC5OYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0LkFwcGVuZCgnWycpDQorICAgICAgICAgICAgICAgICAgICAuQXBwZW5kKGluZGV4KQ0KKyAgICAgICAgICAgICAgICAgICAgLkFwcGVuZCgnXScpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHQuQXBwZW5kKCcuJyk7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5Ub1N0cmluZygpOw0KKyAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Vua25vd25GaWVsZC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Vua25vd25GaWVsZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDM0NzdmCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvVW5rbm93bkZpZWxkLmNzCkBAIC0wLDAgKzEsNDE4IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbDsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBSZXByZXNlbnRzIGEgc2luZ2xlIGZpZWxkIGluIGFuIFVua25vd25GaWVsZFNldC4NCisgICAgLy8vIA0KKyAgICAvLy8gQW4gVW5rbm93bkZpZWxkIGNvbnNpc3RzIG9mIGZpdmUgbGlzdHMgb2YgdmFsdWVzLiBUaGUgbGlzdHMgY29ycmVzcG9uZA0KKyAgICAvLy8gdG8gdGhlIGZpdmUgIndpcmUgdHlwZXMiIHVzZWQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciBiaW5hcnkgZm9ybWF0Lg0KKyAgICAvLy8gVGhlIHdpcmUgdHlwZSBvZiBlYWNoIGZpZWxkIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIGVuY29kZWQgZm9ybSBhbG9uZSwNCisgICAgLy8vIHdpdGhvdXQga25vd2luZyB0aGUgZmllbGQncyBkZWNsYXJlZCB0eXBlLiBTbywgd2UgYXJlIGFibGUgdG8gcGFyc2UNCisgICAgLy8vIHVua25vd24gdmFsdWVzIGF0IGxlYXN0IHRoaXMgZmFyIGFuZCBzZXBhcmF0ZSB0aGVtLiBOb3JtYWxseSwgb25seSBvbmUNCisgICAgLy8vIG9mIHRoZSBmaXZlIGxpc3RzIHdpbGwgY29udGFpbiBhbnkgdmFsdWVzLCBzaW5jZSBpdCBpcyBpbXBvc3NpYmxlIHRvDQorICAgIC8vLyBkZWZpbmUgYSB2YWxpZCBtZXNzYWdlIHR5cGUgdGhhdCBkZWNsYXJlcyB0d28gZGlmZmVyZW50IHR5cGVzIGZvciB0aGUNCisgICAgLy8vIHNhbWUgZmllbGQgbnVtYmVyLiBIb3dldmVyLCB0aGUgY29kZSBpcyBkZXNpZ25lZCB0byBhbGxvdyBmb3IgdGhlIGNhc2UNCisgICAgLy8vIHdoZXJlIHRoZSBzYW1lIHVua25vd24gZmllbGQgbnVtYmVyIGlzIGVuY291bnRlcmVkIHVzaW5nIG11bHRpcGxlIGRpZmZlcmVudA0KKyAgICAvLy8gd2lyZSB0eXBlcy4NCisgICAgLy8vIA0KKyAgICAvLy8gVW5rbm93bkZpZWxkIGlzIGFuIGltbXV0YWJsZSBjbGFzcy4gVG8gY29uc3RydWN0IG9uZSwgeW91IG11c3QgdXNlIGFuDQorICAgIC8vLyBVbmtub3duRmllbGQuQnVpbGRlci4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBVbmtub3duRmllbGQNCisgICAgew0KKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBVbmtub3duRmllbGROYW1lID0gInVua25vd25fZmllbGQiOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVW5rbm93bkZpZWxkIGRlZmF1bHRJbnN0YW5jZSA9IENyZWF0ZUJ1aWxkZXIoKS5CdWlsZCgpOw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSZWFkT25seUNvbGxlY3Rpb248dWxvbmc+IHZhcmludExpc3Q7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJlYWRPbmx5Q29sbGVjdGlvbjx1aW50PiBmaXhlZDMyTGlzdDsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUmVhZE9ubHlDb2xsZWN0aW9uPHVsb25nPiBmaXhlZDY0TGlzdDsNCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUmVhZE9ubHlDb2xsZWN0aW9uPEJ5dGVTdHJpbmc+IGxlbmd0aERlbGltaXRlZExpc3Q7DQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJlYWRPbmx5Q29sbGVjdGlvbjxVbmtub3duRmllbGRTZXQ+IGdyb3VwTGlzdDsNCisNCisgICAgICAgIHByaXZhdGUgVW5rbm93bkZpZWxkKFJlYWRPbmx5Q29sbGVjdGlvbjx1bG9uZz4gdmFyaW50TGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRPbmx5Q29sbGVjdGlvbjx1aW50PiBmaXhlZDMyTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRPbmx5Q29sbGVjdGlvbjx1bG9uZz4gZml4ZWQ2NExpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkT25seUNvbGxlY3Rpb248Qnl0ZVN0cmluZz4gbGVuZ3RoRGVsaW1pdGVkTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRPbmx5Q29sbGVjdGlvbjxVbmtub3duRmllbGRTZXQ+IGdyb3VwTGlzdCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aGlzLnZhcmludExpc3QgPSB2YXJpbnRMaXN0Ow0KKyAgICAgICAgICAgIHRoaXMuZml4ZWQzMkxpc3QgPSBmaXhlZDMyTGlzdDsNCisgICAgICAgICAgICB0aGlzLmZpeGVkNjRMaXN0ID0gZml4ZWQ2NExpc3Q7DQorICAgICAgICAgICAgdGhpcy5sZW5ndGhEZWxpbWl0ZWRMaXN0ID0gbGVuZ3RoRGVsaW1pdGVkTGlzdDsNCisgICAgICAgICAgICB0aGlzLmdyb3VwTGlzdCA9IGdyb3VwTGlzdDsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkIERlZmF1bHRJbnN0YW5jZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUaGUgbGlzdCBvZiB2YXJpbnQgdmFsdWVzIGZvciB0aGlzIGZpZWxkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBJTGlzdDx1bG9uZz4gVmFyaW50TGlzdA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB2YXJpbnRMaXN0OyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIGxpc3Qgb2YgZml4ZWQzMiB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIElMaXN0PHVpbnQ+IEZpeGVkMzJMaXN0DQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpeGVkMzJMaXN0OyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIGxpc3Qgb2YgZml4ZWQ2NCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIElMaXN0PHVsb25nPiBGaXhlZDY0TGlzdA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBmaXhlZDY0TGlzdDsgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBsaXN0IG9mIGxlbmd0aC1kZWxpbWl0ZWQgdmFsdWVzIGZvciB0aGlzIGZpZWxkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBJTGlzdDxCeXRlU3RyaW5nPiBMZW5ndGhEZWxpbWl0ZWRMaXN0DQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGxlbmd0aERlbGltaXRlZExpc3Q7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBUaGUgbGlzdCBvZiBlbWJlZGRlZCBncm91cCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuIFRoZXNlDQorICAgICAgICAvLy8gYXJlIHJlcHJlc2VudGVkIHVzaW5nIFVua25vd25GaWVsZFNldHMgcmF0aGVyIHRoYW4gTWVzc2FnZXMNCisgICAgICAgIC8vLyBzaW5jZSB0aGUgZ3JvdXAncyB0eXBlIGlzIHByZXN1bWFibHkgdW5rbm93bi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgSUxpc3Q8VW5rbm93bkZpZWxkU2V0PiBHcm91cExpc3QNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ3JvdXBMaXN0OyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHModGhpcywgb3RoZXIpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIFVua25vd25GaWVsZCBvdGhlckZpZWxkID0gb3RoZXIgYXMgVW5rbm93bkZpZWxkOw0KKyAgICAgICAgICAgIHJldHVybiBvdGhlckZpZWxkICE9IG51bGwNCisgICAgICAgICAgICAgICAgICAgJiYgTGlzdHMuRXF1YWxzKHZhcmludExpc3QsIG90aGVyRmllbGQudmFyaW50TGlzdCkNCisgICAgICAgICAgICAgICAgICAgJiYgTGlzdHMuRXF1YWxzKGZpeGVkMzJMaXN0LCBvdGhlckZpZWxkLmZpeGVkMzJMaXN0KQ0KKyAgICAgICAgICAgICAgICAgICAmJiBMaXN0cy5FcXVhbHMoZml4ZWQ2NExpc3QsIG90aGVyRmllbGQuZml4ZWQ2NExpc3QpDQorICAgICAgICAgICAgICAgICAgICYmIExpc3RzLkVxdWFscyhsZW5ndGhEZWxpbWl0ZWRMaXN0LCBvdGhlckZpZWxkLmxlbmd0aERlbGltaXRlZExpc3QpDQorICAgICAgICAgICAgICAgICAgICYmIExpc3RzLkVxdWFscyhncm91cExpc3QsIG90aGVyRmllbGQuZ3JvdXBMaXN0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGludCBoYXNoID0gNDM7DQorICAgICAgICAgICAgaGFzaCA9IGhhc2gqNDcgKyBMaXN0cy5HZXRIYXNoQ29kZSh2YXJpbnRMaXN0KTsNCisgICAgICAgICAgICBoYXNoID0gaGFzaCo0NyArIExpc3RzLkdldEhhc2hDb2RlKGZpeGVkMzJMaXN0KTsNCisgICAgICAgICAgICBoYXNoID0gaGFzaCo0NyArIExpc3RzLkdldEhhc2hDb2RlKGZpeGVkNjRMaXN0KTsNCisgICAgICAgICAgICBoYXNoID0gaGFzaCo0NyArIExpc3RzLkdldEhhc2hDb2RlKGxlbmd0aERlbGltaXRlZExpc3QpOw0KKyAgICAgICAgICAgIGhhc2ggPSBoYXNoKjQ3ICsgTGlzdHMuR2V0SGFzaENvZGUoZ3JvdXBMaXN0KTsNCisgICAgICAgICAgICByZXR1cm4gaGFzaDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgbmV3IEJ1aWxkZXIuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYSBuZXcgQnVpbGRlciBhbmQgaW5pdGlhbGl6ZXMgaXQgdG8gYSBjb3B5IG9mIDxwYXJhbXJlZiBuYW1lPSJjb3B5RnJvbSIvPi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihVbmtub3duRmllbGQgY29weUZyb20pDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKGNvcHlGcm9tKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXJpYWxpemVzIHRoZSBmaWVsZCwgaW5jbHVkaW5nIHRoZSBmaWVsZCBudW1iZXIsIGFuZCB3cml0ZXMgaXQgdG8NCisgICAgICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0ib3V0cHV0Ii8+Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8oaW50IGZpZWxkTnVtYmVyLCBJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvcmVhY2ggKHVsb25nIHZhbHVlIGluIHZhcmludExpc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGVVbmtub3duRmllbGQoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50LCB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvcmVhY2ggKHVpbnQgdmFsdWUgaW4gZml4ZWQzMkxpc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGVVbmtub3duRmllbGQoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQzMiwgdmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3JlYWNoICh1bG9uZyB2YWx1ZSBpbiBmaXhlZDY0TGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZVVua25vd25GaWVsZChmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5GaXhlZDY0LCB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvcmVhY2ggKEJ5dGVTdHJpbmcgdmFsdWUgaW4gbGVuZ3RoRGVsaW1pdGVkTGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZVVua25vd25CeXRlcyhmaWVsZE51bWJlciwgdmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3JlYWNoIChVbmtub3duRmllbGRTZXQgdmFsdWUgaW4gZ3JvdXBMaXN0KQ0KKyAgICAgICAgICAgIHsNCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAwNjEyDQorICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZVVua25vd25Hcm91cChmaWVsZE51bWJlciwgdmFsdWUpOw0KKyNwcmFnbWEgd2FybmluZyByZXN0b3JlIDA2MTINCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBlbmNvZGUgdGhpcyBmaWVsZCwgaW5jbHVkaW5nIGZpZWxkDQorICAgICAgICAvLy8gbnVtYmVyLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBpbnQgR2V0U2VyaWFsaXplZFNpemUoaW50IGZpZWxkTnVtYmVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGludCByZXN1bHQgPSAwOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKHVsb25nIHZhbHVlIGluIHZhcmludExpc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQ2NFNpemUoZmllbGROdW1iZXIsIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZm9yZWFjaCAodWludCB2YWx1ZSBpbiBmaXhlZDMyTGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJlc3VsdCArPSBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRml4ZWQzMlNpemUoZmllbGROdW1iZXIsIHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZm9yZWFjaCAodWxvbmcgdmFsdWUgaW4gZml4ZWQ2NExpc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZpeGVkNjRTaXplKGZpZWxkTnVtYmVyLCB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvcmVhY2ggKEJ5dGVTdHJpbmcgdmFsdWUgaW4gbGVuZ3RoRGVsaW1pdGVkTGlzdCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJlc3VsdCArPSBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplKGZpZWxkTnVtYmVyLCB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvcmVhY2ggKFVua25vd25GaWVsZFNldCB2YWx1ZSBpbiBncm91cExpc3QpDQorICAgICAgICAgICAgew0KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDA2MTINCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVbmtub3duR3JvdXBTaXplKGZpZWxkTnVtYmVyLCB2YWx1ZSk7DQorI3ByYWdtYSB3YXJuaW5nIHJlc3RvcmUgMDYxMg0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNlcmlhbGl6ZXMgdGhlIGxlbmd0aC1kZWxpbWl0ZWQgdmFsdWVzIG9mIHRoZSBmaWVsZCwgaW5jbHVkaW5nIGZpZWxkDQorICAgICAgICAvLy8gbnVtYmVyLCBhbmQgd3JpdGVzIHRoZW0gdG8gPHBhcmFtcmVmIG5hbWU9Im91dHB1dCIvPiB1c2luZyB0aGUgTWVzc2FnZVNldCB3aXJlIGZvcm1hdC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpZWxkTnVtYmVyIj48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdXRwdXQiPjwvcGFyYW0+DQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUFzTWVzc2FnZVNldEV4dGVuc2lvblRvKGludCBmaWVsZE51bWJlciwgSUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoIChCeXRlU3RyaW5nIHZhbHVlIGluIGxlbmd0aERlbGltaXRlZExpc3QpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpZWxkTnVtYmVyLCBVbmtub3duRmllbGROYW1lLCB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIGVuY29kZSB0aGlzIGZpZWxkLCBpbmN1ZGluZyBmaWVsZCBudW1iZXIsDQorICAgICAgICAvLy8gdXNpbmcgdGhlIE1lc3NhZ2VTZXQgd2lyZSBmb3JtYXQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGludCBHZXRTZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldEV4dGVuc2lvbihpbnQgZmllbGROdW1iZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50IHJlc3VsdCA9IDA7DQorICAgICAgICAgICAgZm9yZWFjaCAoQnl0ZVN0cmluZyB2YWx1ZSBpbiBsZW5ndGhEZWxpbWl0ZWRMaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVSYXdNZXNzYWdlU2V0RXh0ZW5zaW9uU2l6ZShmaWVsZE51bWJlciwgdmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFVzZWQgdG8gYnVpbGQgaW5zdGFuY2VzIG9mIFVua25vd25GaWVsZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEJ1aWxkZXINCisgICAgICAgIHsNCisgICAgICAgICAgICBwcml2YXRlIExpc3Q8dWxvbmc+IHZhcmludExpc3Q7DQorICAgICAgICAgICAgcHJpdmF0ZSBMaXN0PHVpbnQ+IGZpeGVkMzJMaXN0Ow0KKyAgICAgICAgICAgIHByaXZhdGUgTGlzdDx1bG9uZz4gZml4ZWQ2NExpc3Q7DQorICAgICAgICAgICAgcHJpdmF0ZSBMaXN0PEJ5dGVTdHJpbmc+IGxlbmd0aERlbGltaXRlZExpc3Q7DQorICAgICAgICAgICAgcHJpdmF0ZSBMaXN0PFVua25vd25GaWVsZFNldD4gZ3JvdXBMaXN0Ow0KKw0KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgICAgICAvLy8gQnVpbGRzIHRoZSBmaWVsZC4gQWZ0ZXIgYnVpbGRpbmcsIHRoZSBidWlsZGVyIGlzIHJlc2V0IHRvIGFuIGVtcHR5DQorICAgICAgICAgICAgLy8vIHN0YXRlLiAoVGhpcyBpcyBhY3R1YWxseSBlYXNpZXIgdGhhbiBtYWtpbmcgaXQgdW51c2FibGUuKQ0KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAgICAgcHVibGljIFVua25vd25GaWVsZCBCdWlsZCgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVua25vd25GaWVsZChNYWtlUmVhZE9ubHkocmVmIHZhcmludExpc3QpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlUmVhZE9ubHkocmVmIGZpeGVkMzJMaXN0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZVJlYWRPbmx5KHJlZiBmaXhlZDY0TGlzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VSZWFkT25seShyZWYgbGVuZ3RoRGVsaW1pdGVkTGlzdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VSZWFkT25seShyZWYgZ3JvdXBMaXN0KSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgICAgICAvLy8gTWVyZ2UgdGhlIHZhbHVlcyBpbiA8cGFyYW1yZWYgbmFtZT0ib3RoZXIiIC8+IGludG8gdGhpcyBmaWVsZC4gIEZvciBlYWNoIGxpc3QNCisgICAgICAgICAgICAvLy8gb2YgdmFsdWVzLCA8cGFyYW1yZWYgbmFtZT0ib3RoZXIiLz4ncyB2YWx1ZXMgYXJlIGFwcGVuZCB0byB0aGUgb25lcyBpbiB0aGlzDQorICAgICAgICAgICAgLy8vIGZpZWxkLg0KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VGcm9tKFVua25vd25GaWVsZCBvdGhlcikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhcmludExpc3QgPSBBZGRBbGwodmFyaW50TGlzdCwgb3RoZXIuVmFyaW50TGlzdCk7DQorICAgICAgICAgICAgICAgIGZpeGVkMzJMaXN0ID0gQWRkQWxsKGZpeGVkMzJMaXN0LCBvdGhlci5GaXhlZDMyTGlzdCk7DQorICAgICAgICAgICAgICAgIGZpeGVkNjRMaXN0ID0gQWRkQWxsKGZpeGVkNjRMaXN0LCBvdGhlci5GaXhlZDY0TGlzdCk7DQorICAgICAgICAgICAgICAgIGxlbmd0aERlbGltaXRlZExpc3QgPSBBZGRBbGwobGVuZ3RoRGVsaW1pdGVkTGlzdCwgb3RoZXIuTGVuZ3RoRGVsaW1pdGVkTGlzdCk7DQorICAgICAgICAgICAgICAgIGdyb3VwTGlzdCA9IEFkZEFsbChncm91cExpc3QsIG90aGVyLkdyb3VwTGlzdCk7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAgICAgLy8vIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIGFsbCBvZiB0aGUgZ2l2ZW4gc3BlY2lmaWVkIHZhbHVlcyBmcm9tDQorICAgICAgICAgICAgLy8vIGJvdGggdGhlIDxwYXJhbXJlZiBuYW1lPSJjdXJyZW50Ii8+IGFuZCA8cGFyYW1yZWYgbmFtZT0iZXh0cmFzIi8+IGxpc3RzLg0KKyAgICAgICAgICAgIC8vLyBJZiA8cGFyYW1yZWYgbmFtZT0iY3VycmVudCIgLz4gaXMgbnVsbCBhbmQgPHBhcmFtcmVmIG5hbWU9ImV4dHJhcyIvPiBpcyBlbXB0eSwNCisgICAgICAgICAgICAvLy8gbnVsbCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCBlaXRoZXIgYSBuZXcgbGlzdCBpcyBjcmVhdGVkIChpZiA8cGFyYW1yZWYgbmFtZT0iY3VycmVudCIgLz4NCisgICAgICAgICAgICAvLy8gaXMgbnVsbCkgb3IgdGhlIGVsZW1lbnRzIG9mIDxwYXJhbXJlZiBuYW1lPSJleHRyYXMiLz4gYXJlIGFkZGVkIHRvIDxwYXJhbXJlZiBuYW1lPSJjdXJyZW50IiAvPi4NCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8VD4gQWRkQWxsPFQ+KExpc3Q8VD4gY3VycmVudCwgSUxpc3Q8VD4gZXh0cmFzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKGV4dHJhcy5Db3VudCA9PSAwKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbmV3IExpc3Q8VD4oZXh0cmFzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuQWRkUmFuZ2UoZXh0cmFzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIC8vLyBDbGVhcnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVpbGRlci4NCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyKCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhcmludExpc3QgPSBudWxsOw0KKyAgICAgICAgICAgICAgICBmaXhlZDMyTGlzdCA9IG51bGw7DQorICAgICAgICAgICAgICAgIGZpeGVkNjRMaXN0ID0gbnVsbDsNCisgICAgICAgICAgICAgICAgbGVuZ3RoRGVsaW1pdGVkTGlzdCA9IG51bGw7DQorICAgICAgICAgICAgICAgIGdyb3VwTGlzdCA9IG51bGw7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAgICAgLy8vIEFkZHMgYSB2YXJpbnQgdmFsdWUuDQorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGRWYXJpbnQodWxvbmcgdmFsdWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YXJpbnRMaXN0ID0gQWRkKHZhcmludExpc3QsIHZhbHVlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgICAgICAvLy8gQWRkcyBhIGZpeGVkMzIgdmFsdWUuDQorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGRGaXhlZDMyKHVpbnQgdmFsdWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBmaXhlZDMyTGlzdCA9IEFkZChmaXhlZDMyTGlzdCwgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIC8vLyBBZGRzIGEgZml4ZWQ2NCB2YWx1ZS4NCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEZpeGVkNjQodWxvbmcgdmFsdWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBmaXhlZDY0TGlzdCA9IEFkZChmaXhlZDY0TGlzdCwgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIC8vLyBBZGRzIGEgbGVuZ3RoLWRlbGltaXRlZCB2YWx1ZS4NCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZExlbmd0aERlbGltaXRlZChCeXRlU3RyaW5nIHZhbHVlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbGVuZ3RoRGVsaW1pdGVkTGlzdCA9IEFkZChsZW5ndGhEZWxpbWl0ZWRMaXN0LCB2YWx1ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAgICAgLy8vIEFkZHMgYW4gZW1iZWRkZWQgZ3JvdXAuDQorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPg0KKyAgICAgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkR3JvdXAoVW5rbm93bkZpZWxkU2V0IHZhbHVlKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZ3JvdXBMaXN0ID0gQWRkKGdyb3VwTGlzdCwgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIC8vLyBBZGRzIDxwYXJhbXJlZiBuYW1lPSJ2YWx1ZSIvPiB0byB0aGUgPHBhcmFtcmVmIG5hbWU9Imxpc3QiLz4sIGNyZWF0aW5nDQorICAgICAgICAgICAgLy8vIGEgbmV3IGxpc3QgaWYgPHBhcmFtcmVmIG5hbWU9Imxpc3QiLz4gaXMgbnVsbC4gVGhlIGxpc3QgaXMgcmV0dXJuZWQgLSBlaXRoZXINCisgICAgICAgICAgICAvLy8gdGhlIG9yaWdpbmFsIHJlZmVyZW5jZSBvciB0aGUgbmV3IGxpc3QuDQorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFQ+IEFkZDxUPihMaXN0PFQ+IGxpc3QsIFQgdmFsdWUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAobGlzdCA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBsaXN0ID0gbmV3IExpc3Q8VD4oKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBsaXN0LkFkZCh2YWx1ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiBsaXN0Ow0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAgICAgLy8vIFJldHVybnMgYSByZWFkLW9ubHkgdmVyc2lvbiBvZiB0aGUgZ2l2ZW4gSUxpc3QsIGFuZCBjbGVhcnMNCisgICAgICAgICAgICAvLy8gdGhlIGZpZWxkIHVzZWQgZm9yIDxwYXJhbXJlZiBuYW1lPSJsaXN0Ii8+LiBJZiB0aGUgdmFsdWUNCisgICAgICAgICAgICAvLy8gaXMgbnVsbCwgYW4gZW1wdHkgbGlzdCBpcyBwcm9kdWNlZCB1c2luZyBMaXN0cy5FbXB0eS4NCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+DQorICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgUmVhZE9ubHlDb2xsZWN0aW9uPFQ+IE1ha2VSZWFkT25seTxUPihyZWYgTGlzdDxUPiBsaXN0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgUmVhZE9ubHlDb2xsZWN0aW9uPFQ+IHJldCA9IGxpc3QgPT0gbnVsbCA/IExpc3RzPFQ+LkVtcHR5IDogbmV3IFJlYWRPbmx5Q29sbGVjdGlvbjxUPihsaXN0KTsNCisgICAgICAgICAgICAgICAgbGlzdCA9IG51bGw7DQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Vua25vd25GaWVsZFNldC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1Vua25vd25GaWVsZFNldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWVkNjgwCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnMvVW5rbm93bkZpZWxkU2V0LmNzCkBAIC0wLDAgKzEsMTA0MyBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgZmllbGRzIHdoaWNoIHdlcmUgc2VlbiB3aGVuIHBhcnNpbmcgYSBwcm90b2NvbCBtZXNzYWdlDQorICAgIC8vLyBidXQgd2hvc2UgZmllbGQgbnVtYmVycyBvciB0eXBlcyBhcmUgdW5yZWNvZ25pemVkLiBUaGlzIG1vc3QgZnJlcXVlbnRseQ0KKyAgICAvLy8gb2NjdXJzIHdoZW4gbmV3IGZpZWxkcyBhcmUgYWRkZWQgdG8gYSBtZXNzYWdlIHR5cGUgYW5kIHRoZW4gbWVzc2FnZXMgY29udGFpbmluZw0KKyAgICAvLy8gdGhvc2UgZmllbGRzIGFyZSByZWFkIGJ5IG9sZCBzb2Z0d2FyZSB0aGF0IHdhcyBidWlsdCBiZWZvcmUgdGhlIG5ldyB0eXBlcyB3ZXJlDQorICAgIC8vLyBhZGRlZC4NCisgICAgLy8vIA0KKyAgICAvLy8gRXZlcnkgbWVzc2FnZSBjb250YWlucyBhbiBVbmtub3duRmllbGRTZXQuDQorICAgIC8vLyANCisgICAgLy8vIE1vc3QgdXNlcnMgd2lsbCBuZXZlciBuZWVkIHRvIHVzZSB0aGlzIGNsYXNzIGRpcmVjdGx5Lg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVW5rbm93bkZpZWxkU2V0IDogSU1lc3NhZ2VMaXRlDQorICAgIHsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFVua25vd25GaWVsZFNldCBkZWZhdWx0SW5zdGFuY2UgPQ0KKyAgICAgICAgICAgIG5ldyBVbmtub3duRmllbGRTZXQobmV3IERpY3Rpb25hcnk8aW50LCBVbmtub3duRmllbGQ+KCkpOw0KKw0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJRGljdGlvbmFyeTxpbnQsIFVua25vd25GaWVsZD4gZmllbGRzOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBVbmtub3duRmllbGRTZXQoSURpY3Rpb25hcnk8aW50LCBVbmtub3duRmllbGQ+IGZpZWxkcykNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkczsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDcmVhdGVzIGEgbmV3IHVua25vd24gZmllbGQgc2V0IGJ1aWxkZXIuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgdW5rbm93biBmaWVsZCBzZXQgYnVpbGRlciANCisgICAgICAgIC8vLyBhbmQgaW5pdGlhbGl6ZSBpdCBmcm9tIDxwYXJhbXJlZiBuYW1lPSJvcmlnaW5hbCIvPi4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihVbmtub3duRmllbGRTZXQgb3JpZ2luYWwpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkU2V0IERlZmF1bHRJbnN0YW5jZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIGEgcmVhZC1vbmx5IHZpZXcgb2YgdGhlIG1hcHBpbmcgZnJvbSBmaWVsZCBudW1iZXJzIHRvIHZhbHVlcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8aW50LCBVbmtub3duRmllbGQ+IEZpZWxkRGljdGlvbmFyeQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBEaWN0aW9uYXJpZXMuQXNSZWFkT25seShmaWVsZHMpOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBmaWVsZCBudW1iZXIgaXMgcHJlc2VudCBpbiB0aGUgc2V0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkKGludCBmaWVsZCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gZmllbGRzLkNvbnRhaW5zS2V5KGZpZWxkKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBGZXRjaGVzIGEgZmllbGQgYnkgbnVtYmVyLCByZXR1cm5pbmcgYW4gZW1wdHkgZmllbGQgaWYgbm90IHByZXNlbnQuDQorICAgICAgICAvLy8gTmV2ZXIgcmV0dXJucyBudWxsLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBVbmtub3duRmllbGQgdGhpc1tpbnQgbnVtYmVyXQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkIHJldDsNCisgICAgICAgICAgICAgICAgaWYgKCFmaWVsZHMuVHJ5R2V0VmFsdWUobnVtYmVyLCBvdXQgcmV0KSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gVW5rbm93bkZpZWxkLkRlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXJpYWxpemVzIHRoZSBzZXQgYW5kIHdyaXRlcyBpdCB0byA8cGFyYW1yZWYgbmFtZT0ib3V0cHV0Ii8+Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8oSUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3JlYWNoIChLZXlWYWx1ZVBhaXI8aW50LCBVbmtub3duRmllbGQ+IGVudHJ5IGluIGZpZWxkcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGVudHJ5LlZhbHVlLldyaXRlVG8oZW50cnkuS2V5LCBvdXRwdXQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gZW5jb2RlIHRoaXMgc2V0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBpbnQgU2VyaWFsaXplZFNpemUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSAwOw0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChLZXlWYWx1ZVBhaXI8aW50LCBVbmtub3duRmllbGQ+IGVudHJ5IGluIGZpZWxkcykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGVudHJ5LlZhbHVlLkdldFNlcmlhbGl6ZWRTaXplKGVudHJ5LktleSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29udmVydHMgdGhlIHNldCB0byBhIHN0cmluZyBpbiBwcm90b2NvbCBidWZmZXIgdGV4dCBmb3JtYXQuIFRoaXMNCisgICAgICAgIC8vLyBpcyBqdXN0IGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCBUZXh0Rm9ybWF0LlByaW50VG9TdHJpbmcuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFN0cmluZyBUb1N0cmluZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIFRleHRGb3JtYXQuUHJpbnRUb1N0cmluZyh0aGlzKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb252ZXJ0cyB0aGUgc2V0IHRvIGEgc3RyaW5nIGluIHByb3RvY29sIGJ1ZmZlciB0ZXh0IGZvcm1hdC4gVGhpcw0KKyAgICAgICAgLy8vIGlzIGp1c3QgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kIFRleHRGb3JtYXQuUHJpbnRUb1N0cmluZy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdm9pZCBQcmludFRvKFRleHRXcml0ZXIgd3JpdGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRleHRGb3JtYXQuUHJpbnQodGhpcywgd3JpdGVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGEgQnl0ZVN0cmluZyBhbmQgcmV0dXJucyBpdC4gVGhpcyBpcw0KKyAgICAgICAgLy8vIGp1c3QgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kIFdyaXRlVG8oSUNvZGVkT3V0cHV0U3RyZWFtKS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgcHVibGljIEJ5dGVTdHJpbmcgVG9CeXRlU3RyaW5nKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBCeXRlU3RyaW5nLkNvZGVkQnVpbGRlciBjb2RlZEJ1aWxkZXIgPSBuZXcgQnl0ZVN0cmluZy5Db2RlZEJ1aWxkZXIoU2VyaWFsaXplZFNpemUpOw0KKyAgICAgICAgICAgIFdyaXRlVG8oY29kZWRCdWlsZGVyLkNvZGVkT3V0cHV0KTsNCisgICAgICAgICAgICByZXR1cm4gY29kZWRCdWlsZGVyLkJ1aWxkKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBhIGJ5dGUgYXJyYXkgYW5kIHJldHVybnMgaXQuIFRoaXMgaXMNCisgICAgICAgIC8vLyBqdXN0IGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCBXcml0ZVRvKElDb2RlZE91dHB1dFN0cmVhbSkuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4NCisgICAgICAgIHB1YmxpYyBieXRlW10gVG9CeXRlQXJyYXkoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbU2VyaWFsaXplZFNpemVdOw0KKyAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKGRhdGEpOw0KKyAgICAgICAgICAgIFdyaXRlVG8ob3V0cHV0KTsNCisgICAgICAgICAgICBvdXRwdXQuQ2hlY2tOb1NwYWNlTGVmdCgpOw0KKyAgICAgICAgICAgIHJldHVybiBkYXRhOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgYW5kIHdyaXRlcyBpdCB0byA8cGFyYW1yZWYgbmFtZT0ib3V0cHV0Ii8+LiBUaGlzIGlzDQorICAgICAgICAvLy8ganVzdCBhIHRyaXZpYWwgd3JhcHBlciBhcm91bmQgV3JpdGVUbyhJQ29kZWRPdXRwdXRTdHJlYW0pLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0Ij48L3BhcmFtPg0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVUbyhTdHJlYW0gb3V0cHV0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkT3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2Uob3V0cHV0KTsNCisgICAgICAgICAgICBXcml0ZVRvKGNvZGVkT3V0cHV0KTsNCisgICAgICAgICAgICBjb2RlZE91dHB1dC5GbHVzaCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFNlcmlhbGl6ZXMgdGhlIHNldCBhbmQgd3JpdGVzIGl0IHRvIDxwYXJhbXJlZiBuYW1lPSJvdXRwdXQiLz4gdXNpbmcNCisgICAgICAgIC8vLyB0aGUgTWVzc2FnZVNldCB3aXJlIGZvcm1hdC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUFzTWVzc2FnZVNldFRvKElDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPGludCwgVW5rbm93bkZpZWxkPiBlbnRyeSBpbiBmaWVsZHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBlbnRyeS5WYWx1ZS5Xcml0ZUFzTWVzc2FnZVNldEV4dGVuc2lvblRvKGVudHJ5LktleSwgb3V0cHV0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIGVuY29kZSB0aGlzIHNldCB1c2luZyB0aGUgTWVzc2FnZVNldA0KKyAgICAgICAgLy8vIHdpcmUgZm9ybWF0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBpbnQgU2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSAwOw0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChLZXlWYWx1ZVBhaXI8aW50LCBVbmtub3duRmllbGQ+IGVudHJ5IGluIGZpZWxkcykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGVudHJ5LlZhbHVlLkdldFNlcmlhbGl6ZWRTaXplQXNNZXNzYWdlU2V0RXh0ZW5zaW9uKGVudHJ5LktleSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHModGhpcywgb3RoZXIpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIFVua25vd25GaWVsZFNldCBvdGhlclNldCA9IG90aGVyIGFzIFVua25vd25GaWVsZFNldDsNCisgICAgICAgICAgICByZXR1cm4gb3RoZXJTZXQgIT0gbnVsbCAmJiBEaWN0aW9uYXJpZXMuRXF1YWxzKGZpZWxkcywgb3RoZXJTZXQuZmllbGRzKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBEaWN0aW9uYXJpZXMuR2V0SGFzaENvZGUoZmllbGRzKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQYXJzZXMgYW4gVW5rbm93bkZpZWxkU2V0IGZyb20gdGhlIGdpdmVuIGlucHV0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkU2V0IFBhcnNlRnJvbShJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkuQnVpbGQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQYXJzZXMgYW4gVW5rbm93bkZpZWxkU2V0IGZyb20gdGhlIGdpdmVuIGRhdGEuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHN0YXRpYyBVbmtub3duRmllbGRTZXQgUGFyc2VGcm9tKEJ5dGVTdHJpbmcgZGF0YSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKS5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFBhcnNlcyBhbiBVbmtub3duRmllbGRTZXQgZnJvbSB0aGUgZ2l2ZW4gZGF0YS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIFVua25vd25GaWVsZFNldCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkuQnVpbGQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBQYXJzZXMgYW4gVW5rbm93bkZpZWxkU2V0IGZyb20gdGhlIGdpdmVuIGlucHV0Lg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkU2V0IFBhcnNlRnJvbShTdHJlYW0gaW5wdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpLkJ1aWxkKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAjcmVnaW9uIElNZXNzYWdlTGl0ZSBNZW1iZXJzDQorDQorICAgICAgICBwdWJsaWMgYm9vbCBJc0luaXRpYWxpemVkDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkcyAhPSBudWxsOyB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZURlbGltaXRlZFRvKFN0cmVhbSBvdXRwdXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRPdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShvdXRwdXQpOw0KKyAgICAgICAgICAgIGNvZGVkT3V0cHV0LldyaXRlUmF3VmFyaW50MzIoKHVpbnQpIFNlcmlhbGl6ZWRTaXplKTsNCisgICAgICAgICAgICBXcml0ZVRvKGNvZGVkT3V0cHV0KTsNCisgICAgICAgICAgICBjb2RlZE91dHB1dC5GbHVzaCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIElCdWlsZGVyTGl0ZSBXZWFrQ3JlYXRlQnVpbGRlckZvclR5cGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIElCdWlsZGVyTGl0ZSBXZWFrVG9CdWlsZGVyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoZmllbGRzKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBJTWVzc2FnZUxpdGUgV2Vha0RlZmF1bHRJbnN0YW5jZUZvclR5cGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQnVpbGRlciBmb3IgVW5rbm93bkZpZWxkU2V0cy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IElCdWlsZGVyTGl0ZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgICAgICAvLy8gTWFwcGluZyBmcm9tIG51bWJlciB0byBmaWVsZC4gTm90ZSB0aGF0IGJ5IHVzaW5nIGEgU29ydGVkTGlzdCB3ZSBlbnN1cmUNCisgICAgICAgICAgICAvLy8gdGhhdCB0aGUgZmllbGRzIHdpbGwgYmUgc2VyaWFsaXplZCBpbiBhc2NlbmRpbmcgb3JkZXIuDQorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgICAgICBwcml2YXRlIElEaWN0aW9uYXJ5PGludCwgVW5rbm93bkZpZWxkPiBmaWVsZHM7DQorDQorICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uOiAgV2Uga2VlcCBhcm91bmQgYSBidWlsZGVyIGZvciB0aGUgbGFzdCBmaWVsZCB0aGF0IHdhcw0KKyAgICAgICAgICAgIC8vIG1vZGlmaWVkIHNvIHRoYXQgd2UgY2FuIGVmZmljaWVudGx5IGFkZCB0byBpdCBtdWx0aXBsZSB0aW1lcyBpbiBhDQorICAgICAgICAgICAgLy8gcm93IChpbXBvcnRhbnQgd2hlbiBwYXJzaW5nIGFuIHVua25vd24gcmVwZWF0ZWQgZmllbGQpLg0KKyAgICAgICAgICAgIHByaXZhdGUgaW50IGxhc3RGaWVsZE51bWJlcjsNCisgICAgICAgICAgICBwcml2YXRlIFVua25vd25GaWVsZC5CdWlsZGVyIGxhc3RGaWVsZDsNCisNCisgICAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGZpZWxkcyA9IG5ldyBTb3J0ZWRMaXN0PGludCwgVW5rbm93bkZpZWxkPigpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKElEaWN0aW9uYXJ5PGludCwgVW5rbm93bkZpZWxkPiBkaWN0aW9uYXJ5KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZmllbGRzID0gbmV3IFNvcnRlZExpc3Q8aW50LCBVbmtub3duRmllbGQ+KGRpY3Rpb25hcnkpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAgICAgLy8vIFJldHVybnMgYSBmaWVsZCBidWlsZGVyIGZvciB0aGUgc3BlY2lmaWVkIGZpZWxkIG51bWJlciwgaW5jbHVkaW5nIGFueSB2YWx1ZXMNCisgICAgICAgICAgICAvLy8gd2hpY2ggYWxyZWFkeSBleGlzdC4NCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIHByaXZhdGUgVW5rbm93bkZpZWxkLkJ1aWxkZXIgR2V0RmllbGRCdWlsZGVyKGludCBudW1iZXIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAobGFzdEZpZWxkICE9IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT0gbGFzdEZpZWxkTnVtYmVyKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0RmllbGQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBBZGRGaWVsZCgpIHdpbGwgcmVzZXQgbGFzdEZpZWxkIGFuZCBsYXN0RmllbGROdW1iZXIuDQorICAgICAgICAgICAgICAgICAgICBBZGRGaWVsZChsYXN0RmllbGROdW1iZXIsIGxhc3RGaWVsZC5CdWlsZCgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09IDApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIGxhc3RGaWVsZCA9IFVua25vd25GaWVsZC5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICAgIFVua25vd25GaWVsZCBleGlzdGluZzsNCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkcy5UcnlHZXRWYWx1ZShudW1iZXIsIG91dCBleGlzdGluZykpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGxhc3RGaWVsZC5NZXJnZUZyb20oZXhpc3RpbmcpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGxhc3RGaWVsZE51bWJlciA9IG51bWJlcjsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RGaWVsZDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIC8vLyBCdWlsZCB0aGUgVW5rbm93bkZpZWxkU2V0IGFuZCByZXR1cm4gaXQuIE9uY2UgdGhpcyBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLA0KKyAgICAgICAgICAgIC8vLyB0aGlzIGluc3RhbmNlIHdpbGwgbm8gbG9uZ2VyIGJlIHVzYWJsZS4gQ2FsbGluZyBhbnkgbWV0aG9kIGFmdGVyIHRoaXMNCisgICAgICAgICAgICAvLy8gd2lsbCB0aHJvdyBhIE51bGxSZWZlcmVuY2VFeGNlcHRpb24uDQorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgICAgICBwdWJsaWMgVW5rbm93bkZpZWxkU2V0IEJ1aWxkKCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEdldEZpZWxkQnVpbGRlcigwKTsgLy8gRm9yY2UgbGFzdEZpZWxkIHRvIGJlIGJ1aWx0Lg0KKyAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQgcmVzdWx0ID0gZmllbGRzLkNvdW50ID09IDAgPyBEZWZhdWx0SW5zdGFuY2UgOiBuZXcgVW5rbm93bkZpZWxkU2V0KGZpZWxkcyk7DQorICAgICAgICAgICAgICAgIGZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgICAgICAvLy8gQWRkcyBhIGZpZWxkIHRvIHRoZSBzZXQuIElmIGEgZmllbGQgd2l0aCB0aGUgc2FtZSBudW1iZXIgYWxyZWFkeSBleGlzdHMsIGl0DQorICAgICAgICAgICAgLy8vIGlzIHJlcGxhY2VkLg0KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkRmllbGQoaW50IG51bWJlciwgVW5rbm93bkZpZWxkIGZpZWxkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PSAwKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJudW1iZXIiLCAiWmVybyBpcyBub3QgYSB2YWxpZCBmaWVsZCBudW1iZXIuIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKGxhc3RGaWVsZCAhPSBudWxsICYmIGxhc3RGaWVsZE51bWJlciA9PSBudW1iZXIpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgdGhpcy4NCisgICAgICAgICAgICAgICAgICAgIGxhc3RGaWVsZCA9IG51bGw7DQorICAgICAgICAgICAgICAgICAgICBsYXN0RmllbGROdW1iZXIgPSAwOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGZpZWxkc1tudW1iZXJdID0gZmllbGQ7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAgICAgLy8vIFJlc2V0cyB0aGUgYnVpbGRlciB0byBhbiBlbXB0eSBzZXQuDQorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhcigpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBmaWVsZHMuQ2xlYXIoKTsNCisgICAgICAgICAgICAgICAgbGFzdEZpZWxkTnVtYmVyID0gMDsNCisgICAgICAgICAgICAgICAgbGFzdEZpZWxkID0gbnVsbDsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgICAgICAvLy8gUGFyc2UgYW4gZW50aXJlIG1lc3NhZ2UgZnJvbSA8cGFyYW1yZWYgbmFtZT0iaW5wdXQiLz4gYW5kIG1lcmdlDQorICAgICAgICAgICAgLy8vIGl0cyBmaWVsZHMgaW50byB0aGlzIHNldC4NCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlRnJvbShJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZTsNCisgICAgICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IG5hbWUpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBpZiAodGFnID09IDApDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LlNraXBGaWVsZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vY2FuJ3QgbWVyZ2UgdW5rbm93biB3aXRob3V0IGZpZWxkIHRhZw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgIGlmICghTWVyZ2VGaWVsZEZyb20odGFnLCBpbnB1dCkpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgICAgICAvLy8gUGFyc2UgYSBzaW5nbGUgZmllbGQgZnJvbSA8cGFyYW1yZWYgbmFtZT0iaW5wdXQiLz4gYW5kIG1lcmdlIGl0DQorICAgICAgICAgICAgLy8vIGludG8gdGhpcyBzZXQuDQorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRhZyI+VGhlIGZpZWxkJ3MgdGFnIG51bWJlciwgd2hpY2ggd2FzIGFscmVhZHkgcGFyc2VkLjwvcGFyYW0+DQorICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dCI+VGhlIGNvZGVkIGlucHV0IHN0cmVhbSBjb250YWluaW5nIHRoZSBmaWVsZDwvcGFyYW0+DQorICAgICAgICAgICAgLy8vIDxyZXR1cm5zPmZhbHNlIGlmIHRoZSB0YWcgaXMgYW4gImVuZCBncm91cCIgdGFnLCB0cnVlIG90aGVyd2lzZTwvcmV0dXJucz4NCisgICAgICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBNZXJnZUZpZWxkRnJvbSh1aW50IHRhZywgSUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAodGFnID09IDApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlucHV0LlNraXBGaWVsZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgaW50IG51bWJlciA9IFdpcmVGb3JtYXQuR2V0VGFnRmllbGROdW1iZXIodGFnKTsNCisgICAgICAgICAgICAgICAgc3dpdGNoIChXaXJlRm9ybWF0LkdldFRhZ1dpcmVUeXBlKHRhZykpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bG9uZyB1aW50NjQgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuUmVhZFVJbnQ2NChyZWYgdWludDY0KSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RmllbGRCdWlsZGVyKG51bWJlcikuQWRkVmFyaW50KHVpbnQ2NCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldpcmVUeXBlLkZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50IHVpbnQzMiA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5SZWFkRml4ZWQzMihyZWYgdWludDMyKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RmllbGRCdWlsZGVyKG51bWJlcikuQWRkRml4ZWQzMih1aW50MzIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XaXJlVHlwZS5GaXhlZDY0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxvbmcgdWludDY0ID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LlJlYWRGaXhlZDY0KHJlZiB1aW50NjQpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5BZGRGaXhlZDY0KHVpbnQ2NCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZDoNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcgYnl0ZXMgPSBudWxsOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuUmVhZEJ5dGVzKHJlZiBieXRlcykpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEZpZWxkQnVpbGRlcihudW1iZXIpLkFkZExlbmd0aERlbGltaXRlZChieXRlcyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldpcmVUeXBlLlN0YXJ0R3JvdXA6DQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyIHN1YkJ1aWxkZXIgPSBDcmVhdGVCdWlsZGVyKCk7DQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMDYxMg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5SZWFkVW5rbm93bkdyb3VwKG51bWJlciwgc3ViQnVpbGRlcik7DQorI3ByYWdtYSB3YXJuaW5nIHJlc3RvcmUgMDYxMg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5BZGRHcm91cChzdWJCdWlsZGVyLkJ1aWxkKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYXNlIFdpcmVGb3JtYXQuV2lyZVR5cGUuRW5kR3JvdXA6DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFdpcmVUeXBlKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIC8vLyBQYXJzZXMgPHBhcmFtcmVmIG5hbWU9ImlucHV0Ii8+IGFzIGFuIFVua25vd25GaWVsZFNldCBhbmQgbWVyZ2UgaXQNCisgICAgICAgICAgICAvLy8gd2l0aCB0aGUgc2V0IGJlaW5nIGJ1aWx0LiBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZA0KKyAgICAgICAgICAgIC8vLyBNZXJnZUZyb20oSUNvZGVkSW5wdXRTdHJlYW0pLg0KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VGcm9tKFN0cmVhbSBpbnB1dCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRJbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UoaW5wdXQpOw0KKyAgICAgICAgICAgICAgICBNZXJnZUZyb20oY29kZWRJbnB1dCk7DQorICAgICAgICAgICAgICAgIGNvZGVkSW5wdXQuQ2hlY2tMYXN0VGFnV2FzKDApOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIC8vLyBQYXJzZXMgPHBhcmFtcmVmIG5hbWU9ImRhdGEiLz4gYXMgYW4gVW5rbm93bkZpZWxkU2V0IGFuZCBtZXJnZSBpdA0KKyAgICAgICAgICAgIC8vLyB3aXRoIHRoZSBzZXQgYmVpbmcgYnVpbHQuIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kDQorICAgICAgICAgICAgLy8vIE1lcmdlRnJvbShJQ29kZWRJbnB1dFN0cmVhbSkuDQorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUZyb20oQnl0ZVN0cmluZyBkYXRhKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IGRhdGEuQ3JlYXRlQ29kZWRJbnB1dCgpOw0KKyAgICAgICAgICAgICAgICBNZXJnZUZyb20oaW5wdXQpOw0KKyAgICAgICAgICAgICAgICBpbnB1dC5DaGVja0xhc3RUYWdXYXMoMCk7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAgICAgLy8vIFBhcnNlcyA8cGFyYW1yZWYgbmFtZT0iZGF0YSIvPiBhcyBhbiBVbmtub3duRmllbGRTZXQgYW5kIG1lcmdlIGl0DQorICAgICAgICAgICAgLy8vIHdpdGggdGhlIHNldCBiZWluZyBidWlsdC4gVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQNCisgICAgICAgICAgICAvLy8gTWVyZ2VGcm9tKElDb2RlZElucHV0U3RyZWFtKS4NCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlRnJvbShieXRlW10gZGF0YSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKGRhdGEpOw0KKyAgICAgICAgICAgICAgICBNZXJnZUZyb20oaW5wdXQpOw0KKyAgICAgICAgICAgICAgICBpbnB1dC5DaGVja0xhc3RUYWdXYXMoMCk7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAgICAgLy8vIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgbWVyZ2luZyBhIG5ldyBmaWVsZCBjb250YWluaW5nIGEgc2luZ2xlIHZhcmludA0KKyAgICAgICAgICAgIC8vLyB2YWx1ZS4gIFRoaXMgaXMgdXNlZCBpbiBwYXJ0aWN1bGFyIHdoZW4gYW4gdW5rbm93biBlbnVtIHZhbHVlIGlzDQorICAgICAgICAgICAgLy8vIGVuY291bnRlcmVkLg0KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VWYXJpbnRGaWVsZChpbnQgbnVtYmVyLCB1bG9uZyB2YWx1ZSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT0gMCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigibnVtYmVyIiwgIlplcm8gaXMgbm90IGEgdmFsaWQgZmllbGQgbnVtYmVyLiIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEdldEZpZWxkQnVpbGRlcihudW1iZXIpLkFkZFZhcmludCh2YWx1ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAgICAgLy8vIE1lcmdlcyB0aGUgZmllbGRzIGZyb20gPHBhcmFtcmVmIG5hbWU9Im90aGVyIi8+IGludG8gdGhpcyBzZXQuDQorICAgICAgICAgICAgLy8vIElmIGEgZmllbGQgbnVtYmVyIGV4aXN0cyBpbiBib3RoIHNldHMsIHRoZSB2YWx1ZXMgaW4gPHBhcmFtcmVmIG5hbWU9Im90aGVyIi8+DQorICAgICAgICAgICAgLy8vIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHZhbHVlcyBpbiB0aGlzIHNldC4NCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlRnJvbShVbmtub3duRmllbGRTZXQgb3RoZXIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAob3RoZXIgIT0gRGVmYXVsdEluc3RhbmNlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChLZXlWYWx1ZVBhaXI8aW50LCBVbmtub3duRmllbGQ+IGVudHJ5IGluIG90aGVyLmZpZWxkcykNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBNZXJnZUZpZWxkKGVudHJ5LktleSwgZW50cnkuVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAgICAgLy8vIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyIGlzIHByZXNlbnQgaW4gdGhlIHNldC4NCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgICAgIHB1YmxpYyBib29sIEhhc0ZpZWxkKGludCBudW1iZXIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09IDApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIm51bWJlciIsICJaZXJvIGlzIG5vdCBhIHZhbGlkIGZpZWxkIG51bWJlci4iKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyID09IGxhc3RGaWVsZE51bWJlciB8fCBmaWVsZHMuQ29udGFpbnNLZXkobnVtYmVyKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIC8vLyBBZGRzIGEgZmllbGQgdG8gdGhlIHVua25vd24gZmllbGQgc2V0LiBJZiBhIGZpZWxkIHdpdGggdGhlIHNhbWUNCisgICAgICAgICAgICAvLy8gbnVtYmVyIGFscmVhZHkgZXhpc3RzLCB0aGUgdHdvIGFyZSBtZXJnZWQuDQorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUZpZWxkKGludCBudW1iZXIsIFVua25vd25GaWVsZCBmaWVsZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT0gMCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigibnVtYmVyIiwgIlplcm8gaXMgbm90IGEgdmFsaWQgZmllbGQgbnVtYmVyLiIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChIYXNGaWVsZChudW1iZXIpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBHZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5NZXJnZUZyb20oZmllbGQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uOiAgV2UgY291bGQgY2FsbCBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5tZXJnZUZyb20oZmllbGQpDQorICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UsIGJ1dCB0aGF0IHdvdWxkIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIEZpZWxkIG9iamVjdC4NCisgICAgICAgICAgICAgICAgICAgIC8vIFdlJ2QgcmF0aGVyIHJldXNlIHRoZSBvbmUgcGFzc2VkIHRvIHVzLCBzbyBjYWxsIEFkZEZpZWxkKCkgaW5zdGVhZC4NCisgICAgICAgICAgICAgICAgICAgIEFkZEZpZWxkKG51bWJlciwgZmllbGQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpbnRlcm5hbCB2b2lkIE1lcmdlRnJvbShJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnksIElCdWlsZGVyIGJ1aWxkZXIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWU7DQorICAgICAgICAgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBuYW1lKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyA9PSAwICYmIG5hbWUgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGRCeU5hbWUgPSBidWlsZGVyLkRlc2NyaXB0b3JGb3JUeXBlLkZpbmRGaWVsZEJ5TmFtZShuYW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRCeU5hbWUgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZyA9IFdpcmVGb3JtYXQuTWFrZVRhZyhmaWVsZEJ5TmFtZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkluZm8gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uUmVnaXN0cnkuRmluZEJ5TmFtZShidWlsZGVyLkRlc2NyaXB0b3JGb3JUeXBlLCBuYW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcgPSBXaXJlRm9ybWF0Lk1ha2VUYWcoZXh0ZW5zaW9uLkRlc2NyaXB0b3IpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyA9PSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5Ta2lwRmllbGQoKSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL2Nhbid0IG1lcmdlIHVua25vd24gd2l0aG91dCBmaWVsZCB0YWcNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICBpZiAoIU1lcmdlRmllbGRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgYnVpbGRlciwgdGFnLCBuYW1lKSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmQgZ3JvdXAgdGFnDQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgICAgIC8vLyBMaWtlIDxzZWUgY3JlZj0iTWVyZ2VGcm9tKElDb2RlZElucHV0U3RyZWFtLCBFeHRlbnNpb25SZWdpc3RyeSwgSUJ1aWxkZXIpIiAvPg0KKyAgICAgICAgICAgIC8vLyBidXQgcGFyc2VzIGEgc2luZ2xlIGZpZWxkLg0KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dCI+VGhlIGlucHV0IHRvIHJlYWQgdGhlIGZpZWxkIGZyb208L3BhcmFtPg0KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXh0ZW5zaW9uUmVnaXN0cnkiPlJlZ2lzdHJ5IHRvIHVzZSB3aGVuIGFuIGV4dGVuc2lvbiBmaWVsZCBpcyBlbmNvdW50ZXJlZDwvcGFyYW0+DQorICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWlsZGVyIj5CdWlsZGVyIHRvIG1lcmdlIGZpZWxkIGludG8sIGlmIGl0J3MgYSBrbm93biBmaWVsZDwvcGFyYW0+DQorICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0YWciPlRoZSB0YWcsIHdoaWNoIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiByZWFkIGZyb20gdGhlIGlucHV0PC9wYXJhbT4NCisgICAgICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSB1bmxlc3MgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAgdGFnPC9yZXR1cm5zPg0KKyAgICAgICAgICAgIGludGVybmFsIGJvb2wgTWVyZ2VGaWVsZEZyb20oSUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSwgSUJ1aWxkZXIgYnVpbGRlciwgdWludCB0YWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKHRhZyA9PSAwICYmIGZpZWxkTmFtZSAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGRCeU5hbWUgPSBidWlsZGVyLkRlc2NyaXB0b3JGb3JUeXBlLkZpbmRGaWVsZEJ5TmFtZShmaWVsZE5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkQnlOYW1lICE9IG51bGwpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdGFnID0gV2lyZUZvcm1hdC5NYWtlVGFnKGZpZWxkQnlOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25JbmZvIGV4dGVuc2lvbiA9IGV4dGVuc2lvblJlZ2lzdHJ5LkZpbmRCeU5hbWUoYnVpbGRlci5EZXNjcmlwdG9yRm9yVHlwZSwgZmllbGROYW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcgPSBXaXJlRm9ybWF0Lk1ha2VUYWcoZXh0ZW5zaW9uLkRlc2NyaXB0b3IpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBNZXNzYWdlRGVzY3JpcHRvciB0eXBlID0gYnVpbGRlci5EZXNjcmlwdG9yRm9yVHlwZTsNCisgICAgICAgICAgICAgICAgaWYgKHR5cGUuT3B0aW9ucy5NZXNzYWdlU2V0V2lyZUZvcm1hdCAmJiB0YWcgPT0gV2lyZUZvcm1hdC5NZXNzYWdlU2V0VGFnLkl0ZW1TdGFydCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgTWVyZ2VNZXNzYWdlU2V0RXh0ZW5zaW9uRnJvbUNvZGVkU3RyZWFtKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgYnVpbGRlcik7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBXaXJlRm9ybWF0LldpcmVUeXBlIHdpcmVUeXBlID0gV2lyZUZvcm1hdC5HZXRUYWdXaXJlVHlwZSh0YWcpOw0KKyAgICAgICAgICAgICAgICBpbnQgZmllbGROdW1iZXIgPSBXaXJlRm9ybWF0LkdldFRhZ0ZpZWxkTnVtYmVyKHRhZyk7DQorDQorICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZDsNCisgICAgICAgICAgICAgICAgSU1lc3NhZ2VMaXRlIGRlZmF1bHRGaWVsZEluc3RhbmNlID0gbnVsbDsNCisNCisgICAgICAgICAgICAgICAgaWYgKHR5cGUuSXNFeHRlbnNpb25OdW1iZXIoZmllbGROdW1iZXIpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25JbmZvIGV4dGVuc2lvbiA9IGV4dGVuc2lvblJlZ2lzdHJ5W3R5cGUsIGZpZWxkTnVtYmVyXTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IG51bGw7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBleHRlbnNpb24uRGVzY3JpcHRvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmllbGRJbnN0YW5jZSA9IGV4dGVuc2lvbi5EZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IHR5cGUuRmluZEZpZWxkQnlOdW1iZXIoZmllbGROdW1iZXIpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIC8vIFVua25vd24gZmllbGQgb3Igd3Jvbmcgd2lyZSB0eXBlLiBTa2lwLg0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRmllbGRGcm9tKHRhZywgaW5wdXQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmICh3aXJlVHlwZSAhPSBXaXJlRm9ybWF0LkdldFdpcmVUeXBlKGZpZWxkKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdC5XaXJlVHlwZSBleHBlY3RlZFR5cGUgPSBXaXJlRm9ybWF0LkdldFdpcmVUeXBlKGZpZWxkLkZpZWxkVHlwZSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAod2lyZVR5cGUgPT0gZXhwZWN0ZWRUeXBlKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vQWxsb3dlZCBhcyBvZiAyLjMsIHRoaXMgaXMgdW5wYWNrZWQgZGF0YSBmb3IgYSBwYWNrZWQgYXJyYXkNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkLklzUmVwZWF0ZWQgJiYgd2lyZVR5cGUgPT0gV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHBlY3RlZFR5cGUgPT0gV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQgfHwgZXhwZWN0ZWRUeXBlID09IFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQzMiB8fA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSA9PSBXaXJlRm9ybWF0LldpcmVUeXBlLkZpeGVkNjQpKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vQWxsb3dlZCBhcyBvZiAyLjMsIHRoaXMgaXMgcGFja2VkIGRhdGEgZm9yIGFuIHVucGFja2VkIGFycmF5DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRmllbGRGcm9tKHRhZywgaW5wdXQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuRmllbGRUeXBlKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Hcm91cDoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLk1lc3NhZ2U6DQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQnVpbGRlckxpdGUgc3ViQnVpbGRlciA9IChkZWZhdWx0RmllbGRJbnN0YW5jZSAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlZmF1bHRGaWVsZEluc3RhbmNlLldlYWtDcmVhdGVCdWlsZGVyRm9yVHlwZSgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYnVpbGRlci5DcmVhdGVCdWlsZGVyRm9yRmllbGQoZmllbGQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLklzUmVwZWF0ZWQpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuV2Vha01lcmdlRnJvbSgoSU1lc3NhZ2VMaXRlKSBidWlsZGVyW2ZpZWxkXSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuRmllbGRUeXBlID09IEZpZWxkVHlwZS5Hcm91cCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5SZWFkR3JvdXAoZmllbGQuRmllbGROdW1iZXIsIHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyW2ZpZWxkXSA9IHN1YkJ1aWxkZXIuV2Vha0J1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PElNZXNzYWdlTGl0ZT4gbGlzdCA9IG5ldyBMaXN0PElNZXNzYWdlTGl0ZT4oKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5GaWVsZFR5cGUgPT0gRmllbGRUeXBlLkdyb3VwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LlJlYWRHcm91cEFycmF5KHRhZywgZmllbGROYW1lLCBsaXN0LCBzdWJCdWlsZGVyLldlYWtEZWZhdWx0SW5zdGFuY2VGb3JUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGROYW1lLCBsaXN0LCBzdWJCdWlsZGVyLldlYWtEZWZhdWx0SW5zdGFuY2VGb3JUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoSU1lc3NhZ2VMaXRlIG0gaW4gbGlzdCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLldlYWtBZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCBtKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkVudW06DQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLklzUmVwZWF0ZWQpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1MaXRlIHZhbHVlID0gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5SZWFkRW51bShyZWYgdmFsdWUsIG91dCB1bmtub3duLCBmaWVsZC5FbnVtVHlwZSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlcltmaWVsZF0gPSB2YWx1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVua25vd24gaXMgaW50KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lcmdlVmFyaW50RmllbGQoZmllbGROdW1iZXIsICh1bG9uZykgKGludCkgdW5rbm93bik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd247DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PElFbnVtTGl0ZT4gbGlzdCA9IG5ldyBMaXN0PElFbnVtTGl0ZT4oKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXkodGFnLCBmaWVsZE5hbWUsIGxpc3QsIG91dCB1bmtub3duLCBmaWVsZC5FbnVtVHlwZSk7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChJRW51bUxpdGUgZW4gaW4gbGlzdCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLldlYWtBZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCBlbik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5rbm93biAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCBvdmFsIGluIHVua25vd24pDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3ZhbCBpcyBpbnQpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lcmdlVmFyaW50RmllbGQoZmllbGROdW1iZXIsICh1bG9uZykgKGludCkgb3ZhbCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQuSXNSZXBlYXRlZCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHZhbHVlID0gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5SZWFkUHJpbWl0aXZlRmllbGQoZmllbGQuRmllbGRUeXBlLCByZWYgdmFsdWUpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXJbZmllbGRdID0gdmFsdWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PG9iamVjdD4gbGlzdCA9IG5ldyBMaXN0PG9iamVjdD4oKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LlJlYWRQcmltaXRpdmVBcnJheShmaWVsZC5GaWVsZFR5cGUsIHRhZywgZmllbGROYW1lLCBsaXN0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCBvdmFsIGluIGxpc3QpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5XZWFrQWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgb3ZhbCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAgICAgLy8vIENhbGxlZCBieSBNZXJnZUZpZWxkRnJvbSB0byBwYXJzZSBhIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uLg0KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIE1lcmdlTWVzc2FnZVNldEV4dGVuc2lvbkZyb21Db2RlZFN0cmVhbShJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5LCBJQnVpbGRlciBidWlsZGVyKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgTWVzc2FnZURlc2NyaXB0b3IgdHlwZSA9IGJ1aWxkZXIuRGVzY3JpcHRvckZvclR5cGU7DQorDQorICAgICAgICAgICAgICAgIC8vIFRoZSB3aXJlIGZvcm1hdCBmb3IgTWVzc2FnZVNldCBpczoNCisgICAgICAgICAgICAgICAgLy8gICBtZXNzYWdlIE1lc3NhZ2VTZXQgew0KKyAgICAgICAgICAgICAgICAvLyAgICAgcmVwZWF0ZWQgZ3JvdXAgSXRlbSA9IDEgew0KKyAgICAgICAgICAgICAgICAvLyAgICAgICByZXF1aXJlZCBpbnQzMiB0eXBlSWQgPSAyOw0KKyAgICAgICAgICAgICAgICAvLyAgICAgICByZXF1aXJlZCBieXRlcyBtZXNzYWdlID0gMzsNCisgICAgICAgICAgICAgICAgLy8gICAgIH0NCisgICAgICAgICAgICAgICAgLy8gICB9DQorICAgICAgICAgICAgICAgIC8vICJ0eXBlSWQiIGlzIHRoZSBleHRlbnNpb24ncyBmaWVsZCBudW1iZXIuICBUaGUgZXh0ZW5zaW9uIGNhbiBvbmx5IGJlDQorICAgICAgICAgICAgICAgIC8vIGEgbWVzc2FnZSB0eXBlLCB3aGVyZSAibWVzc2FnZSIgY29udGFpbnMgdGhlIGVuY29kZWQgYnl0ZXMgb2YgdGhhdA0KKyAgICAgICAgICAgICAgICAvLyBtZXNzYWdlLg0KKyAgICAgICAgICAgICAgICAvLw0KKyAgICAgICAgICAgICAgICAvLyBJbiBwcmFjdGljZSwgd2Ugd2lsbCBwcm9iYWJseSBuZXZlciBzZWUgYSBNZXNzYWdlU2V0IGl0ZW0gaW4gd2hpY2gNCisgICAgICAgICAgICAgICAgLy8gdGhlIG1lc3NhZ2UgYXBwZWFycyBiZWZvcmUgdGhlIHR5cGUgSUQsIG9yIHdoZXJlIGVpdGhlciBmaWVsZCBkb2VzIG5vdA0KKyAgICAgICAgICAgICAgICAvLyBhcHBlYXIgZXhhY3RseSBvbmNlLiAgSG93ZXZlciwgaW4gdGhlb3J5IHN1Y2ggY2FzZXMgYXJlIHZhbGlkLCBzbyB3ZQ0KKyAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgcHJlcGFyZWQgdG8gYWNjZXB0IHRoZW0uDQorDQorICAgICAgICAgICAgICAgIGludCB0eXBlSWQgPSAwOw0KKyAgICAgICAgICAgICAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbnVsbDsgLy8gSWYgd2UgZW5jb3VudGVyICJtZXNzYWdlIiBiZWZvcmUgInR5cGVJZCINCisgICAgICAgICAgICAgICAgSUJ1aWxkZXJMaXRlIHN1YkJ1aWxkZXIgPSBudWxsOw0KKyAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBudWxsOw0KKw0KKyAgICAgICAgICAgICAgICB1aW50IGxhc3RUYWcgPSBXaXJlRm9ybWF0Lk1lc3NhZ2VTZXRUYWcuSXRlbVN0YXJ0Ow0KKyAgICAgICAgICAgICAgICB1aW50IHRhZzsNCisgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWU7DQorICAgICAgICAgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBuYW1lKSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyA9PSAwICYmIG5hbWUgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSAidHlwZV9pZCIpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcgPSBXaXJlRm9ybWF0Lk1lc3NhZ2VTZXRUYWcuVHlwZUlEOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lID09ICJtZXNzYWdlIikNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZyA9IFdpcmVGb3JtYXQuTWVzc2FnZVNldFRhZy5NZXNzYWdlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmICh0YWcgPT0gMCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuU2tpcEZpZWxkKCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy9jYW4ndCBtZXJnZSB1bmtub3duIHdpdGhvdXQgZmllbGQgdGFnDQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgbGFzdFRhZyA9IHRhZzsNCisgICAgICAgICAgICAgICAgICAgIGlmICh0YWcgPT0gV2lyZUZvcm1hdC5NZXNzYWdlU2V0VGFnLlR5cGVJRCkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlSWQgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFplcm8gaXMgbm90IGEgdmFsaWQgdHlwZSBJRC4NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuUmVhZEludDMyKHJlZiB0eXBlSWQpICYmIHR5cGVJZCAhPSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uSW5mbyBleHRlbnNpb24gPSBleHRlbnNpb25SZWdpc3RyeVt0eXBlLCB0eXBlSWRdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZXh0ZW5zaW9uLkRlc2NyaXB0b3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJCdWlsZGVyID0gZXh0ZW5zaW9uLkRlZmF1bHRJbnN0YW5jZS5XZWFrQ3JlYXRlQnVpbGRlckZvclR5cGUoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNZXNzYWdlTGl0ZSBvcmlnaW5hbE1lc3NhZ2UgPSAoSU1lc3NhZ2VMaXRlKSBidWlsZGVyW2ZpZWxkXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbE1lc3NhZ2UgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLldlYWtNZXJnZUZyb20ob3JpZ2luYWxNZXNzYWdlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdCeXRlcyAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgZW5jb3VudGVyZWQgdGhlIG1lc3NhZ2UuICBQYXJzZSBpdCBub3cuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqb25za2VldCk6IENoZWNrIHRoaXMgaXMgb2theS4gSXQncyBzdWJ0bHkgZGlmZmVyZW50IGZyb20gdGhlIEphdmEsIGFzIGl0IGRvZXNuJ3QgY3JlYXRlIGFuIGlucHV0IHN0cmVhbSBmcm9tIHJhd0J5dGVzLg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGZhY3QsIHdoeSBkb24ndCB3ZSBqdXN0IGNhbGwgTWVyZ2VGcm9tKHJhd0J5dGVzKT8gQW5kIHdoYXQgYWJvdXQgdGhlIGV4dGVuc2lvbiByZWdpc3RyeT8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLldlYWtNZXJnZUZyb20ocmF3Qnl0ZXMuQ3JlYXRlQ29kZWRJbnB1dCgpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdCeXRlcyA9IG51bGw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duIGV4dGVuc2lvbiBudW1iZXIuICBJZiB3ZSBhbHJlYWR5IHNhdyBkYXRhLCBwdXQgaXQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHJhd0J5dGVzLg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd0J5dGVzICE9IG51bGwpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVyZ2VGaWVsZCh0eXBlSWQsIFVua25vd25GaWVsZC5DcmVhdGVCdWlsZGVyKCkuQWRkTGVuZ3RoRGVsaW1pdGVkKHJhd0J5dGVzKS5CdWlsZCgpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdCeXRlcyA9IG51bGw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0YWcgPT0gV2lyZUZvcm1hdC5NZXNzYWdlU2V0VGFnLk1lc3NhZ2UpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkJ1aWxkZXIgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUgdHlwZSwgc28gd2UgY2FuIHBhcnNlIGRpcmVjdGx5IGZyb20gdGhlIGlucHV0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbm8gY29weWluZy4gIEhvb3JheSENCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbnB1dC5SZWFkQnl0ZXMocmVmIHJhd0J5dGVzKSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlSWQgIT0gMCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyBob3cgdG8gcGFyc2UgdGhpcy4gIElnbm9yZSBpdC4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lcmdlRmllbGQodHlwZUlkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGQuQ3JlYXRlQnVpbGRlcigpLkFkZExlbmd0aERlbGltaXRlZChyYXdCeXRlcykuQnVpbGQoKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5rbm93biB0YWcuICBTa2lwIGl0Lg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXQuU2tpcEZpZWxkKCkpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZW5kIG9mIGdyb3VwDQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIGlmIChsYXN0VGFnICE9IFdpcmVGb3JtYXQuTWVzc2FnZVNldFRhZy5JdGVtRW5kKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZEVuZFRhZygpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIGlmIChzdWJCdWlsZGVyICE9IG51bGwpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXJbZmllbGRdID0gc3ViQnVpbGRlci5XZWFrQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAjcmVnaW9uIElCdWlsZGVyTGl0ZSBNZW1iZXJzDQorDQorICAgICAgICAgICAgYm9vbCBJQnVpbGRlckxpdGUuSXNJbml0aWFsaXplZA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkcyAhPSBudWxsOyB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIElCdWlsZGVyTGl0ZSBJQnVpbGRlckxpdGUuV2Vha0NsZWFyKCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBDbGVhcigpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBJQnVpbGRlckxpdGUgSUJ1aWxkZXJMaXRlLldlYWtNZXJnZUZyb20oSU1lc3NhZ2VMaXRlIG1lc3NhZ2UpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChVbmtub3duRmllbGRTZXQpIG1lc3NhZ2UpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBJQnVpbGRlckxpdGUgSUJ1aWxkZXJMaXRlLldlYWtNZXJnZUZyb20oQnl0ZVN0cmluZyBkYXRhKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShkYXRhKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgSUJ1aWxkZXJMaXRlIElCdWlsZGVyTGl0ZS5XZWFrTWVyZ2VGcm9tKEJ5dGVTdHJpbmcgZGF0YSwgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGRhdGEpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBJQnVpbGRlckxpdGUgSUJ1aWxkZXJMaXRlLldlYWtNZXJnZUZyb20oSUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0KTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgSUJ1aWxkZXJMaXRlIElCdWlsZGVyTGl0ZS5XZWFrTWVyZ2VGcm9tKElDb2RlZElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBJTWVzc2FnZUxpdGUgSUJ1aWxkZXJMaXRlLldlYWtCdWlsZCgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgSU1lc3NhZ2VMaXRlIElCdWlsZGVyTGl0ZS5XZWFrQnVpbGRQYXJ0aWFsKCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBCdWlsZCgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBJQnVpbGRlckxpdGUgSUJ1aWxkZXJMaXRlLldlYWtDbG9uZSgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gQnVpbGQoKS5XZWFrVG9CdWlsZGVyKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIElNZXNzYWdlTGl0ZSBJQnVpbGRlckxpdGUuV2Vha0RlZmF1bHRJbnN0YW5jZUZvclR5cGUNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzL1dpcmVGb3JtYXQuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9XaXJlRm9ybWF0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwM2YxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVycy9XaXJlRm9ybWF0LmNzCkBAIC0wLDAgKzEsMTkyIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBQcm90b2NvbCBCdWZmZXIgTGlicmFyeSBhbmQgZ2VuZXJhdGVkDQorICAgIC8vLyBtZXNzYWdlIGltcGxlbWVudGF0aW9ucy4gSXQgaXMgcHVibGljIG9ubHkgZm9yIHRoZSBzYWtlIG9mIHRob3NlIGdlbmVyYXRlZA0KKyAgICAvLy8gbWVzc2FnZXMuIE90aGVycyBzaG91bGQgbm90IHVzZSB0aGlzIGNsYXNzIGRpcmVjdGx5Lg0KKyAgICAvLy8gPHBhcmE+DQorICAgIC8vLyBUaGlzIGNsYXNzIGNvbnRhaW5zIGNvbnN0YW50cyBhbmQgaGVscGVyIGZ1bmN0aW9ucyB1c2VmdWwgZm9yIGRlYWxpbmcgd2l0aA0KKyAgICAvLy8gdGhlIFByb3RvY29sIEJ1ZmZlciB3aXJlIGZvcm1hdC4NCisgICAgLy8vIDwvcGFyYT4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXaXJlRm9ybWF0DQorICAgIHsNCisgICAgICAgICNyZWdpb24gRml4ZWQgc2l6ZXMuDQorDQorICAgICAgICAvLyBUT0RPKGpvbnNrZWV0KTogTW92ZSB0aGVzZSBzb21ld2hlcmUgZWxzZS4gVGhleSdyZSBtZXNzeS4gQ29uc2lkZXIgbWFraW5nIEZpZWxkVHlwZSBhIHNtYXJ0ZXIga2luZCBvZiBlbnVtDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEZpeGVkMzJTaXplID0gNDsNCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRml4ZWQ2NFNpemUgPSA4Ow0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBTRml4ZWQzMlNpemUgPSA0Ow0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBTRml4ZWQ2NFNpemUgPSA4Ow0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGbG9hdFNpemUgPSA0Ow0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBEb3VibGVTaXplID0gODsNCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgQm9vbFNpemUgPSAxOw0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgZW51bSBXaXJlVHlwZSA6IHVpbnQNCisgICAgICAgIHsNCisgICAgICAgICAgICBWYXJpbnQgPSAwLA0KKyAgICAgICAgICAgIEZpeGVkNjQgPSAxLA0KKyAgICAgICAgICAgIExlbmd0aERlbGltaXRlZCA9IDIsDQorICAgICAgICAgICAgU3RhcnRHcm91cCA9IDMsDQorICAgICAgICAgICAgRW5kR3JvdXAgPSA0LA0KKyAgICAgICAgICAgIEZpeGVkMzIgPSA1DQorICAgICAgICB9DQorDQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgTWVzc2FnZVNldEZpZWxkDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50ZXJuYWwgY29uc3QgaW50IEl0ZW0gPSAxOw0KKyAgICAgICAgICAgIGludGVybmFsIGNvbnN0IGludCBUeXBlSUQgPSAyOw0KKyAgICAgICAgICAgIGludGVybmFsIGNvbnN0IGludCBNZXNzYWdlID0gMzsNCisgICAgICAgIH0NCisNCisgICAgICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBNZXNzYWdlU2V0VGFnDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IHVpbnQgSXRlbVN0YXJ0ID0gTWFrZVRhZyhNZXNzYWdlU2V0RmllbGQuSXRlbSwgV2lyZVR5cGUuU3RhcnRHcm91cCk7DQorICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IHVpbnQgSXRlbUVuZCA9IE1ha2VUYWcoTWVzc2FnZVNldEZpZWxkLkl0ZW0sIFdpcmVUeXBlLkVuZEdyb3VwKTsNCisgICAgICAgICAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgdWludCBUeXBlSUQgPSBNYWtlVGFnKE1lc3NhZ2VTZXRGaWVsZC5UeXBlSUQsIFdpcmVUeXBlLlZhcmludCk7DQorICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IHVpbnQgTWVzc2FnZSA9IE1ha2VUYWcoTWVzc2FnZVNldEZpZWxkLk1lc3NhZ2UsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBUYWdUeXBlQml0cyA9IDM7DQorICAgICAgICBwcml2YXRlIGNvbnN0IHVpbnQgVGFnVHlwZU1hc2sgPSAoMSA8PCBUYWdUeXBlQml0cykgLSAxOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEdpdmVuIGEgdGFnIHZhbHVlLCBkZXRlcm1pbmVzIHRoZSB3aXJlIHR5cGUgKGxvd2VyIDMgYml0cykuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgc3RhdGljIFdpcmVUeXBlIEdldFRhZ1dpcmVUeXBlKHVpbnQgdGFnKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiAoV2lyZVR5cGUpICh0YWcgJiBUYWdUeXBlTWFzayk7DQorICAgICAgICB9DQorDQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBJc0VuZEdyb3VwVGFnKHVpbnQgdGFnKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiAoV2lyZVR5cGUpICh0YWcgJiBUYWdUeXBlTWFzaykgPT0gV2lyZVR5cGUuRW5kR3JvdXA7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gR2l2ZW4gYSB0YWcgdmFsdWUsIGRldGVybWluZXMgdGhlIGZpZWxkIG51bWJlciAodGhlIHVwcGVyIDI5IGJpdHMpLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgR2V0VGFnRmllbGROdW1iZXIodWludCB0YWcpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIChpbnQpIHRhZyA+PiBUYWdUeXBlQml0czsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBNYWtlcyBhIHRhZyB2YWx1ZSBnaXZlbiBhIGZpZWxkIG51bWJlciBhbmQgd2lyZSB0eXBlLg0KKyAgICAgICAgLy8vIFRPRE8oam9uc2tlZXQpOiBTaG91bGQgd2UganVzdCBoYXZlIGEgVGFnIHN0cnVjdHVyZT8NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdWludCBNYWtlVGFnKGludCBmaWVsZE51bWJlciwgV2lyZVR5cGUgd2lyZVR5cGUpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuICh1aW50KSAoZmllbGROdW1iZXIgPDwgVGFnVHlwZUJpdHMpIHwgKHVpbnQpIHdpcmVUeXBlOw0KKyAgICAgICAgfQ0KKw0KKyNpZiAhTElURQ0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgc3RhdGljIHVpbnQgTWFrZVRhZyhGaWVsZERlc2NyaXB0b3IgZmllbGQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIE1ha2VUYWcoZmllbGQuRmllbGROdW1iZXIsIEdldFdpcmVUeXBlKGZpZWxkKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0aGUgd2lyZSB0eXBlIGZvciB0aGUgZ2l2ZW4gZmllbGQgZGVzY3JpcHRvci4gVGhpcyBkaWZmZXJzDQorICAgICAgICAvLy8gZnJvbSBHZXRXaXJlVHlwZShGaWVsZFR5cGUpIGZvciBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIHN0YXRpYyBXaXJlVHlwZSBHZXRXaXJlVHlwZShGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvcikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5Jc1BhY2tlZCA/IFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCA6IEdldFdpcmVUeXBlKGRlc2NyaXB0b3IuRmllbGRUeXBlKTsNCisgICAgICAgIH0NCisNCisjZW5kaWYNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb252ZXJ0cyBhIGZpZWxkIHR5cGUgdG8gaXRzIHdpcmUgdHlwZS4gRG9uZSB3aXRoIGEgc3dpdGNoIGZvciB0aGUgc2FrZQ0KKyAgICAgICAgLy8vIG9mIHNwZWVkIC0gdGhpcyBpcyBzaWduaWZpY2FudGx5IGZhc3RlciB0aGFuIGEgZGljdGlvbmFyeSBsb29rdXAuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgICBwdWJsaWMgc3RhdGljIFdpcmVUeXBlIEdldFdpcmVUeXBlKEZpZWxkVHlwZSBmaWVsZFR5cGUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Eb3VibGU6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2lyZVR5cGUuRml4ZWQ2NDsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRmxvYXQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2lyZVR5cGUuRml4ZWQzMjsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuSW50NjQ6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQ2NDoNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuSW50MzI6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2lyZVR5cGUuVmFyaW50Ow0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GaXhlZDY0Og0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdpcmVUeXBlLkZpeGVkNjQ7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2lyZVR5cGUuRml4ZWQzMjsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuQm9vbDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXaXJlVHlwZS5WYXJpbnQ7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlN0cmluZzoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQ7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkdyb3VwOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdpcmVUeXBlLlN0YXJ0R3JvdXA7DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLk1lc3NhZ2U6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkJ5dGVzOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZDsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuVUludDMyOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdpcmVUeXBlLlZhcmludDsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkMzI6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2lyZVR5cGUuRml4ZWQzMjsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkNjQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2lyZVR5cGUuRml4ZWQ2NDsNCisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ludDMyOg0KKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TSW50NjQ6DQorICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkVudW06DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2lyZVR5cGUuVmFyaW50Ow0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiTm8gc3VjaCBmaWVsZCB0eXBlIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGlicmFyeS5DRjIwLnNsbiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGlicmFyeS5DRjIwLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjE4MzZmCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaWJyYXJ5LkNGMjAuc2xuCkBAIC0wLDAgKzEsNTUgQEAKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEwLjAwDQorIyBWaXN1YWwgU3R1ZGlvIDIwMDgNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVycyIsICJQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzLkNGMjAuY3Nwcm9qIiwgIns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVyc0xpdGUiLCAiUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVyc0xpdGUuQ0YyMC5jc3Byb2oiLCAiezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24iLCAiUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uQ0YyMC5jc3Byb2oiLCAiezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uIiwgIlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXFByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5DRjIwLmNzcHJvaiIsICJ7RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnMuVGVzdCIsICJQcm90b2NvbEJ1ZmZlcnMuVGVzdFxQcm90b2NvbEJ1ZmZlcnMuVGVzdC5DRjIwLmNzcHJvaiIsICJ7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QiLCAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XFByb3RvY29sQnVmZmVyc0xpdGUuVGVzdC5DRjIwLmNzcHJvaiIsICJ7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnNMaXRlTWl4ZWQuVGVzdCIsICJQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3RcUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QuQ0YyMC5jc3Byb2oiLCAie0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0iDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUNCisJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQorCQl7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXs2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXs2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXs2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXtFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXtERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXtFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXtFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaWJyYXJ5LkNGMzUuc2xuIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaWJyYXJ5LkNGMzUuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4M2UyMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpYnJhcnkuQ0YzNS5zbG4KQEAgLTAsMCArMSw1NSBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTAuMDANCisjIFZpc3VhbCBTdHVkaW8gMjAwOA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzIiwgIlByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuQ0YzNS5jc3Byb2oiLCAiezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZSIsICJQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzTGl0ZS5DRjM1LmNzcHJvaiIsICJ7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbiIsICJQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5DRjM1LmNzcHJvaiIsICJ7MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24iLCAiUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLkNGMzUuY3Nwcm9qIiwgIntFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVycy5UZXN0IiwgIlByb3RvY29sQnVmZmVycy5UZXN0XFByb3RvY29sQnVmZmVycy5UZXN0LkNGMzUuY3Nwcm9qIiwgIntERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVyc0xpdGUuVGVzdCIsICJQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3RcUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0LkNGMzUuY3Nwcm9qIiwgIntFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0IiwgIlByb3RvY29sQnVmZmVyc0xpdGUuVGVzdFxQcm90b2NvbEJ1ZmZlcnNMaXRlTWl4ZWQuVGVzdC5DRjM1LmNzcHJvaiIsICJ7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfSINCitFbmRQcm9qZWN0DQorR2xvYmFsDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQ0KKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCisJCXs2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpYnJhcnkuTkVUMjAuc2xuIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaWJyYXJ5Lk5FVDIwLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGU4ZWQyCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaWJyYXJ5Lk5FVDIwLnNsbgpAQCAtMCwwICsxLDU1IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMC4wMA0KKyMgVmlzdWFsIFN0dWRpbyAyMDA4DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnMiLCAiUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5ORVQyMC5jc3Byb2oiLCAiezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZSIsICJQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzTGl0ZS5ORVQyMC5jc3Byb2oiLCAiezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24iLCAiUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uTkVUMjAuY3Nwcm9qIiwgInsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbiIsICJQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24uTkVUMjAuY3Nwcm9qIiwgIntFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVycy5UZXN0IiwgIlByb3RvY29sQnVmZmVycy5UZXN0XFByb3RvY29sQnVmZmVycy5UZXN0Lk5FVDIwLmNzcHJvaiIsICJ7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QiLCAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XFByb3RvY29sQnVmZmVyc0xpdGUuVGVzdC5ORVQyMC5jc3Byb2oiLCAie0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QiLCAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XFByb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0Lk5FVDIwLmNzcHJvaiIsICJ7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfSINCitFbmRQcm9qZWN0DQorR2xvYmFsDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQ0KKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCisJCXs2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpYnJhcnkuTkVUMzUuc2xuIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaWJyYXJ5Lk5FVDM1LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzlhYjE3Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaWJyYXJ5Lk5FVDM1LnNsbgpAQCAtMCwwICsxLDU1IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMC4wMA0KKyMgVmlzdWFsIFN0dWRpbyAyMDA4DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnMiLCAiUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5ORVQzNS5jc3Byb2oiLCAiezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZSIsICJQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzTGl0ZS5ORVQzNS5jc3Byb2oiLCAiezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24iLCAiUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uTkVUMzUuY3Nwcm9qIiwgInsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbiIsICJQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24uTkVUMzUuY3Nwcm9qIiwgIntFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVycy5UZXN0IiwgIlByb3RvY29sQnVmZmVycy5UZXN0XFByb3RvY29sQnVmZmVycy5UZXN0Lk5FVDM1LmNzcHJvaiIsICJ7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QiLCAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XFByb3RvY29sQnVmZmVyc0xpdGUuVGVzdC5ORVQzNS5jc3Byb2oiLCAie0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QiLCAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XFByb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0Lk5FVDM1LmNzcHJvaiIsICJ7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfSINCitFbmRQcm9qZWN0DQorR2xvYmFsDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQ0KKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCisJCXs2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpYnJhcnkuTkVUNDAuc2xuIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaWJyYXJ5Lk5FVDQwLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDkyNjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaWJyYXJ5Lk5FVDQwLnNsbgpAQCAtMCwwICsxLDU1IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMS4wMA0KKyMgVmlzdWFsIFN0dWRpbyAyMDEwDQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnMiLCAiUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5ORVQ0MC5jc3Byb2oiLCAiezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZSIsICJQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzTGl0ZS5ORVQ0MC5jc3Byb2oiLCAiezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24iLCAiUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uTkVUNDAuY3Nwcm9qIiwgInsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbiIsICJQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24uTkVUNDAuY3Nwcm9qIiwgIntFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVycy5UZXN0IiwgIlByb3RvY29sQnVmZmVycy5UZXN0XFByb3RvY29sQnVmZmVycy5UZXN0Lk5FVDQwLmNzcHJvaiIsICJ7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QiLCAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XFByb3RvY29sQnVmZmVyc0xpdGUuVGVzdC5ORVQ0MC5jc3Byb2oiLCAie0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QiLCAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XFByb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0Lk5FVDQwLmNzcHJvaiIsICJ7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfSINCitFbmRQcm9qZWN0DQorR2xvYmFsDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQ0KKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCisJCXs2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpYnJhcnkuUEw0MC5zbG4gYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpYnJhcnkuUEw0MC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhODNjMgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGlicmFyeS5QTDQwLnNsbgpAQCAtMCwwICsxLDU1IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMS4wMA0KKyMgVmlzdWFsIFN0dWRpbyAyMDEwDQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnMiLCAiUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5QTDQwLmNzcHJvaiIsICJ7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnNMaXRlIiwgIlByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnNMaXRlLlBMNDAuY3Nwcm9qIiwgIns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uIiwgIlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXFByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLlBMNDAuY3Nwcm9qIiwgInsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbiIsICJQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24uUEw0MC5jc3Byb2oiLCAie0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzLlRlc3QiLCAiUHJvdG9jb2xCdWZmZXJzLlRlc3RcUHJvdG9jb2xCdWZmZXJzLlRlc3QuUEw0MC5jc3Byb2oiLCAie0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0IiwgIlByb3RvY29sQnVmZmVyc0xpdGUuVGVzdFxQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QuUEw0MC5jc3Byb2oiLCAie0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QiLCAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XFByb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0LlBMNDAuY3Nwcm9qIiwgIntFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9Ig0KK0VuZFByb2plY3QNCitHbG9iYWwNCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVDQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCisJRW5kR2xvYmFsU2VjdGlvbg0KK0VuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGlicmFyeS5TTDIwLnNsbiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGlicmFyeS5TTDIwLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmE0YWRhCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaWJyYXJ5LlNMMjAuc2xuCkBAIC0wLDAgKzEsNTUgQEAKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEwLjAwDQorIyBWaXN1YWwgU3R1ZGlvIDIwMDgNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVycyIsICJQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzLlNMMjAuY3Nwcm9qIiwgIns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVyc0xpdGUiLCAiUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVyc0xpdGUuU0wyMC5jc3Byb2oiLCAiezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24iLCAiUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb24uU0wyMC5jc3Byb2oiLCAiezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uIiwgIlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXFByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5TTDIwLmNzcHJvaiIsICJ7RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnMuVGVzdCIsICJQcm90b2NvbEJ1ZmZlcnMuVGVzdFxQcm90b2NvbEJ1ZmZlcnMuVGVzdC5TTDIwLmNzcHJvaiIsICJ7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QiLCAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XFByb3RvY29sQnVmZmVyc0xpdGUuVGVzdC5TTDIwLmNzcHJvaiIsICJ7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnNMaXRlTWl4ZWQuVGVzdCIsICJQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3RcUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QuU0wyMC5jc3Byb2oiLCAie0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0iDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUNCisJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQorCQl7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXs2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXs2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXs2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXtFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXtERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXtFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXtFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaWJyYXJ5LlNMMzAuc2xuIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaWJyYXJ5LlNMMzAuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MGMyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpYnJhcnkuU0wzMC5zbG4KQEAgLTAsMCArMSw1NSBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTAuMDANCisjIFZpc3VhbCBTdHVkaW8gMjAwOA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzIiwgIlByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuU0wzMC5jc3Byb2oiLCAiezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZSIsICJQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzTGl0ZS5TTDMwLmNzcHJvaiIsICJ7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbiIsICJQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5TTDMwLmNzcHJvaiIsICJ7MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24iLCAiUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLlNMMzAuY3Nwcm9qIiwgIntFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVycy5UZXN0IiwgIlByb3RvY29sQnVmZmVycy5UZXN0XFByb3RvY29sQnVmZmVycy5UZXN0LlNMMzAuY3Nwcm9qIiwgIntERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVyc0xpdGUuVGVzdCIsICJQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3RcUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0LlNMMzAuY3Nwcm9qIiwgIntFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0IiwgIlByb3RvY29sQnVmZmVyc0xpdGUuVGVzdFxQcm90b2NvbEJ1ZmZlcnNMaXRlTWl4ZWQuVGVzdC5TTDMwLmNzcHJvaiIsICJ7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfSINCitFbmRQcm9qZWN0DQorR2xvYmFsDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQ0KKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCisJCXs2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXs2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpYnJhcnkuU0w0MC5zbG4gYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpYnJhcnkuU0w0MC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlYTU3NAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGlicmFyeS5TTDQwLnNsbgpAQCAtMCwwICsxLDU1IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMS4wMA0KKyMgVmlzdWFsIFN0dWRpbyAyMDEwDQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnMiLCAiUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5TTDQwLmNzcHJvaiIsICJ7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnNMaXRlIiwgIlByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnNMaXRlLlNMNDAuY3Nwcm9qIiwgIns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uIiwgIlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXFByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uLlNMNDAuY3Nwcm9qIiwgInsyMzEzOTFBRi00NDlDLTRBMzktOTg2Qy1BRDdGMjcwRjQ3NTB9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbiIsICJQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24uU0w0MC5jc3Byb2oiLCAie0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzLlRlc3QiLCAiUHJvdG9jb2xCdWZmZXJzLlRlc3RcUHJvdG9jb2xCdWZmZXJzLlRlc3QuU0w0MC5jc3Byb2oiLCAie0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0IiwgIlByb3RvY29sQnVmZmVyc0xpdGUuVGVzdFxQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QuU0w0MC5jc3Byb2oiLCAie0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QiLCAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0XFByb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0LlNMNDAuY3Nwcm9qIiwgIntFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9Ig0KK0VuZFByb2plY3QNCitHbG9iYWwNCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVDQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCisJRW5kR2xvYmFsU2VjdGlvbg0KK0VuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGlicmFyeS5zbG4gYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpYnJhcnkuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MTMxNGEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpYnJhcnkuc2xuCkBAIC0wLDAgKzEsNTUgQEAKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEwLjAwDQorIyBWaXN1YWwgU3R1ZGlvIDIwMDgNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVycyIsICJQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzLmNzcHJvaiIsICJ7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnNMaXRlIiwgIlByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnNMaXRlLmNzcHJvaiIsICJ7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbiIsICJQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvbi5jc3Byb2oiLCAiezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uIiwgIlByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXFByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5jc3Byb2oiLCAie0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUHJvdG9jb2xCdWZmZXJzLlRlc3QiLCAiUHJvdG9jb2xCdWZmZXJzLlRlc3RcUHJvdG9jb2xCdWZmZXJzLlRlc3QuY3Nwcm9qIiwgIntERDAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlByb3RvY29sQnVmZmVyc0xpdGUuVGVzdCIsICJQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3RcUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0LmNzcHJvaiIsICJ7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJQcm90b2NvbEJ1ZmZlcnNMaXRlTWl4ZWQuVGVzdCIsICJQcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3RcUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QuY3Nwcm9qIiwgIntFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9Ig0KK0VuZFByb2plY3QNCitHbG9iYWwNCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVDQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KKwkJezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJezIzMTM5MUFGLTQ0OUMtNEEzOS05ODZDLUFEN0YyNzBGNDc1MH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7MjMxMzkxQUYtNDQ5Qy00QTM5LTk4NkMtQUQ3RjI3MEY0NzUwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0REMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwkJe0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCisJRW5kR2xvYmFsU2VjdGlvbg0KK0VuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L0Fic3RyYWN0QnVpbGRlckxpdGVUZXN0LmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvQWJzdHJhY3RCdWlsZGVyTGl0ZVRlc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3OTFhZgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L0Fic3RyYWN0QnVpbGRlckxpdGVUZXN0LmNzCkBAIC0wLDAgKzEsMzQwIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvczsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIEFic3RyYWN0QnVpbGRlckxpdGVUZXN0DQorICAgIHsNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE1lcmdlRnJvbUNvZGVkSW5wdXRTdHJlYW0oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUgY29weSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IFRlc3RBbGxUeXBlc0xpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsVWludDMyKHVpbnQuTWF4VmFsdWUpLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgY29weSA9IFRlc3RBbGxUeXBlc0xpdGUuRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbChtc2cuVG9CeXRlQXJyYXkoKSwgY29weS5Ub0J5dGVBcnJheSgpKTsNCisNCisgICAgICAgICAgICB1c2luZyAoTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbShtc2cuVG9CeXRlQXJyYXkoKSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGNpID0gQ29kZWRJbnB1dFN0cmVhbS5DcmVhdGVJbnN0YW5jZShtcyk7DQorICAgICAgICAgICAgICAgIGNvcHkgPSBjb3B5LlRvQnVpbGRlcigpLk1lcmdlRnJvbShjaSkuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChtc2cuVG9CeXRlQXJyYXkoKSwgY29weS5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdElCdWlsZGVyTGl0ZVdlYWtDbGVhcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZSBjb3B5LCBtc2cgPSBUZXN0QWxsVHlwZXNMaXRlLkRlZmF1bHRJbnN0YW5jZTsNCisNCisgICAgICAgICAgICBjb3B5ID0gbXNnLlRvQnVpbGRlcigpLlNldE9wdGlvbmFsU3RyaW5nKCJTaG91bGQgYmUgcmVtb3ZlZC4iKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbChtc2cuVG9CeXRlQXJyYXkoKSwgY29weS5Ub0J5dGVBcnJheSgpKTsNCisNCisgICAgICAgICAgICBjb3B5ID0gKFRlc3RBbGxUeXBlc0xpdGUpICgoSUJ1aWxkZXJMaXRlKSBjb3B5LlRvQnVpbGRlcigpKS5XZWFrQ2xlYXIoKS5XZWFrQnVpbGQoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKG1zZy5Ub0J5dGVBcnJheSgpLCBjb3B5LlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0QnVpbGRlckxpdGVNZXJnZUZyb21Db2RlZElucHV0U3RyZWFtKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlIGNvcHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBUZXN0QWxsVHlwZXNMaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbFN0cmluZygiU2hvdWxkIGJlIG1lcmdlZC4iKS5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIGNvcHkgPSBUZXN0QWxsVHlwZXNMaXRlLkRlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwobXNnLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorDQorICAgICAgICAgICAgY29weSA9DQorICAgICAgICAgICAgICAgIGNvcHkuVG9CdWlsZGVyKCkuTWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UobmV3IE1lbW9yeVN0cmVhbShtc2cuVG9CeXRlQXJyYXkoKSkpKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwobXNnLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RCdWlsZGVyTGl0ZU1lcmdlRGVsaW1pdGVkRnJvbSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZSBjb3B5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gVGVzdEFsbFR5cGVzTGl0ZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2V0T3B0aW9uYWxTdHJpbmcoIlNob3VsZCBiZSBtZXJnZWQuIikuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBjb3B5ID0gVGVzdEFsbFR5cGVzTGl0ZS5EZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdEVxdWFsKG1zZy5Ub0J5dGVBcnJheSgpLCBjb3B5LlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgICAgIFN0cmVhbSBzID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKyAgICAgICAgICAgIG1zZy5Xcml0ZURlbGltaXRlZFRvKHMpOw0KKyAgICAgICAgICAgIHMuUG9zaXRpb24gPSAwOw0KKyAgICAgICAgICAgIGNvcHkgPSBjb3B5LlRvQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShzKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwobXNnLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RCdWlsZGVyTGl0ZU1lcmdlRGVsaW1pdGVkRnJvbUV4dGVuc2lvbnMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBjb3B5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaG91bGQgYmUgbWVyZ2VkLiIpLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgY29weSA9IFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdEVxdWFsKG1zZy5Ub0J5dGVBcnJheSgpLCBjb3B5LlRvQnl0ZUFycmF5KCkpOw0KKw0KKyAgICAgICAgICAgIFN0cmVhbSBzID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKyAgICAgICAgICAgIG1zZy5Xcml0ZURlbGltaXRlZFRvKHMpOw0KKyAgICAgICAgICAgIHMuUG9zaXRpb24gPSAwOw0KKw0KKyAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgICAgICBVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisNCisgICAgICAgICAgICBjb3B5ID0gY29weS5Ub0J1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20ocywgcmVnaXN0cnkpLkJ1aWxkKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChtc2cuVG9CeXRlQXJyYXkoKSwgY29weS5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlNob3VsZCBiZSBtZXJnZWQuIiwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0QnVpbGRlckxpdGVNZXJnZUZyb21TdHJlYW0oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUgY29weSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IFRlc3RBbGxUeXBlc0xpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsU3RyaW5nKCJTaG91bGQgYmUgbWVyZ2VkLiIpLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgY29weSA9IFRlc3RBbGxUeXBlc0xpdGUuRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbChtc2cuVG9CeXRlQXJyYXkoKSwgY29weS5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgICAgICBTdHJlYW0gcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsNCisgICAgICAgICAgICBtc2cuV3JpdGVUbyhzKTsNCisgICAgICAgICAgICBzLlBvc2l0aW9uID0gMDsNCisgICAgICAgICAgICBjb3B5ID0gY29weS5Ub0J1aWxkZXIoKS5NZXJnZUZyb20ocykuQnVpbGQoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKG1zZy5Ub0J5dGVBcnJheSgpLCBjb3B5LlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0QnVpbGRlckxpdGVNZXJnZUZyb21TdHJlYW1FeHRlbnNpb25zKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgY29weSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdFeHRlbnNpb25MaXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2hvdWxkIGJlIG1lcmdlZC4iKS5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIGNvcHkgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbChtc2cuVG9CeXRlQXJyYXkoKSwgY29weS5Ub0J5dGVBcnJheSgpKTsNCisNCisgICAgICAgICAgICBTdHJlYW0gcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsNCisgICAgICAgICAgICBtc2cuV3JpdGVUbyhzKTsNCisgICAgICAgICAgICBzLlBvc2l0aW9uID0gMDsNCisNCisgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICAgICAgVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorDQorICAgICAgICAgICAgY29weSA9IGNvcHkuVG9CdWlsZGVyKCkuTWVyZ2VGcm9tKHMsIHJlZ2lzdHJ5KS5CdWlsZCgpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwobXNnLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJTaG91bGQgYmUgbWVyZ2VkLiIsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdElCdWlsZGVyTGl0ZVdlYWtNZXJnZUZyb21JTWVzc2FnZUxpdGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUgY29weSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IFRlc3RBbGxUeXBlc0xpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsU3RyaW5nKCJTaG91bGQgYmUgbWVyZ2VkLiIpLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgY29weSA9IFRlc3RBbGxUeXBlc0xpdGUuRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbChtc2cuVG9CeXRlQXJyYXkoKSwgY29weS5Ub0J5dGVBcnJheSgpKTsNCisNCisgICAgICAgICAgICBjb3B5ID0gKFRlc3RBbGxUeXBlc0xpdGUpICgoSUJ1aWxkZXJMaXRlKSBjb3B5LlRvQnVpbGRlcigpKS5XZWFrTWVyZ2VGcm9tKChJTWVzc2FnZUxpdGUpIG1zZykuV2Vha0J1aWxkKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChtc2cuVG9CeXRlQXJyYXkoKSwgY29weS5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdElCdWlsZGVyTGl0ZVdlYWtNZXJnZUZyb21CeXRlU3RyaW5nKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlIGNvcHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBUZXN0QWxsVHlwZXNMaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbFN0cmluZygiU2hvdWxkIGJlIG1lcmdlZC4iKS5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIGNvcHkgPSBUZXN0QWxsVHlwZXNMaXRlLkRlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwobXNnLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorDQorICAgICAgICAgICAgY29weSA9IChUZXN0QWxsVHlwZXNMaXRlKSAoKElCdWlsZGVyTGl0ZSkgY29weS5Ub0J1aWxkZXIoKSkuV2Vha01lcmdlRnJvbShtc2cuVG9CeXRlU3RyaW5nKCkpLldlYWtCdWlsZCgpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwobXNnLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RJQnVpbGRlckxpdGVXZWFrTWVyZ2VGcm9tQnl0ZVN0cmluZ0V4dGVuc2lvbnMoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBjb3B5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaG91bGQgYmUgbWVyZ2VkLiIpLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgY29weSA9IFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdEVxdWFsKG1zZy5Ub0J5dGVBcnJheSgpLCBjb3B5LlRvQnl0ZUFycmF5KCkpOw0KKw0KKyAgICAgICAgICAgIGNvcHkgPQ0KKyAgICAgICAgICAgICAgICAoVGVzdEFsbEV4dGVuc2lvbnNMaXRlKQ0KKyAgICAgICAgICAgICAgICAoKElCdWlsZGVyTGl0ZSkgY29weS5Ub0J1aWxkZXIoKSkuV2Vha01lcmdlRnJvbShtc2cuVG9CeXRlU3RyaW5nKCksIEV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KS5XZWFrQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwobXNnLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorDQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKw0KKyAgICAgICAgICAgIGNvcHkgPQ0KKyAgICAgICAgICAgICAgICAoVGVzdEFsbEV4dGVuc2lvbnNMaXRlKQ0KKyAgICAgICAgICAgICAgICAoKElCdWlsZGVyTGl0ZSkgY29weS5Ub0J1aWxkZXIoKSkuV2Vha01lcmdlRnJvbShtc2cuVG9CeXRlU3RyaW5nKCksIHJlZ2lzdHJ5KS5XZWFrQnVpbGQoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKG1zZy5Ub0J5dGVBcnJheSgpLCBjb3B5LlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiU2hvdWxkIGJlIG1lcmdlZC4iLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdFeHRlbnNpb25MaXRlKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RJQnVpbGRlckxpdGVXZWFrTWVyZ2VGcm9tQ29kZWRJbnB1dFN0cmVhbSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZSBjb3B5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gVGVzdEFsbFR5cGVzTGl0ZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU2V0T3B0aW9uYWxVaW50MzIodWludC5NYXhWYWx1ZSkuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBjb3B5ID0gVGVzdEFsbFR5cGVzTGl0ZS5EZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdEVxdWFsKG1zZy5Ub0J5dGVBcnJheSgpLCBjb3B5LlRvQnl0ZUFycmF5KCkpOw0KKw0KKyAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKG1zZy5Ub0J5dGVBcnJheSgpKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gY2kgPSBDb2RlZElucHV0U3RyZWFtLkNyZWF0ZUluc3RhbmNlKG1zKTsNCisgICAgICAgICAgICAgICAgY29weSA9IChUZXN0QWxsVHlwZXNMaXRlKSAoKElCdWlsZGVyTGl0ZSkgY29weS5Ub0J1aWxkZXIoKSkuV2Vha01lcmdlRnJvbShjaSkuV2Vha0J1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwobXNnLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RJQnVpbGRlckxpdGVXZWFrQnVpbGRQYXJ0aWFsKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJQnVpbGRlckxpdGUgYnVpbGRlciA9IFRlc3RSZXF1aXJlZExpdGUuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGJ1aWxkZXIuSXNJbml0aWFsaXplZCk7DQorDQorICAgICAgICAgICAgSU1lc3NhZ2VMaXRlIG1zZyA9IGJ1aWxkZXIuV2Vha0J1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1zZy5Jc0luaXRpYWxpemVkKTsNCisNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKG1zZy5Ub0J5dGVBcnJheSgpLCBUZXN0UmVxdWlyZWRMaXRlLkRlZmF1bHRJbnN0YW5jZS5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24pKV0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RJQnVpbGRlckxpdGVXZWFrQnVpbGRVbmluaXRpYWxpemVkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJQnVpbGRlckxpdGUgYnVpbGRlciA9IFRlc3RSZXF1aXJlZExpdGUuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGJ1aWxkZXIuSXNJbml0aWFsaXplZCk7DQorICAgICAgICAgICAgYnVpbGRlci5XZWFrQnVpbGQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdElCdWlsZGVyTGl0ZVdlYWtCdWlsZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgSUJ1aWxkZXJMaXRlIGJ1aWxkZXIgPSBUZXN0UmVxdWlyZWRMaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0RCgwKQ0KKyAgICAgICAgICAgICAgICAuU2V0RW4oRXh0cmFFbnVtLkVYTElURV9CQVopOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoYnVpbGRlci5Jc0luaXRpYWxpemVkKTsNCisgICAgICAgICAgICBidWlsZGVyLldlYWtCdWlsZCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0SUJ1aWxkZXJMaXRlV2Vha0Nsb25lKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0UmVxdWlyZWRMaXRlIG1zZyA9IFRlc3RSZXF1aXJlZExpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXREKDEpLlNldEVuKEV4dHJhRW51bS5FWExJVEVfQkFSKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobXNnLklzSW5pdGlhbGl6ZWQpOw0KKw0KKyAgICAgICAgICAgIElNZXNzYWdlTGl0ZSBjb3B5ID0gKChJQnVpbGRlckxpdGUpIG1zZy5Ub0J1aWxkZXIoKSkuV2Vha0Nsb25lKCkuV2Vha0J1aWxkKCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChtc2cuVG9CeXRlQXJyYXkoKSwgY29weS5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdElCdWlsZGVyTGl0ZVdlYWtEZWZhdWx0SW5zdGFuY2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoUmVmZXJlbmNlRXF1YWxzKFRlc3RSZXF1aXJlZExpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSUJ1aWxkZXJMaXRlKSBUZXN0UmVxdWlyZWRMaXRlLkNyZWF0ZUJ1aWxkZXIoKSkuV2Vha0RlZmF1bHRJbnN0YW5jZUZvclR5cGUpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEdlbmVyYXRlZEJ1aWxkZXJMaXRlQWRkUmFuZ2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUgY29weSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IFRlc3RBbGxUeXBlc0xpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsVWludDMyKDEyMykNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWRJbnQzMigxKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRSZXBlYXRlZEludDMyKDIpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkSW50MzIoMykNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBjb3B5ID0gbXNnLkRlZmF1bHRJbnN0YW5jZUZvclR5cGUuVG9CdWlsZGVyKCkuTWVyZ2VGcm9tKG1zZykuQnVpbGQoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKG1zZy5Ub0J5dGVBcnJheSgpLCBjb3B5LlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gUk9LIDUvNy8yMDEzIElzc3VlICM1NDogc2hvdWxkIHJldGlyZSBhbGwgYnl0ZXMgaW4gYnVmZmVyIChidWZmZXJTaXplKQ0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0QnVmZmVyUmVmaWxsSXNzdWUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhciBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsNCisgICAgICAgICAgICBCdWNrZXRPZkJ5dGVzLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0VmFsdWUoQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVszMDAwXSkpDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpLldyaXRlRGVsaW1pdGVkVG8obXMpOw0KKyAgICAgICAgICAgIEJ1Y2tldE9mQnl0ZXNFeC5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldFZhbHVlKEJ5dGVTdHJpbmcuQ29weUZyb20obmV3IGJ5dGVbMTAwMF0pKQ0KKyAgICAgICAgICAgICAgICAuU2V0VmFsdWUyKEJ5dGVTdHJpbmcuQ29weUZyb20obmV3IGJ5dGVbMTEwMF0pKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKS5Xcml0ZURlbGltaXRlZFRvKG1zKTsNCisgICAgICAgICAgICBCdWNrZXRPZkJ5dGVzLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0VmFsdWUoQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVsxMDBdKSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCkuV3JpdGVEZWxpbWl0ZWRUbyhtcyk7DQorDQorICAgICAgICAgICAgbXMuUG9zaXRpb24gPSAwOw0KKyAgICAgICAgICAgIHZhciBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlSW5zdGFuY2UobXMpOw0KKyAgICAgICAgICAgIHZhciBidWlsZGVyID0gQnVja2V0T2ZCeXRlcy5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2UoYnVpbGRlciwgRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMDA1TCwgaW5wdXQuUG9zaXRpb24pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMDAwLCBidWlsZGVyLlZhbHVlLkxlbmd0aCk7DQorICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2UoYnVpbGRlciwgRXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MTE0LCBpbnB1dC5Qb3NpdGlvbik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwMDAsIGJ1aWxkZXIuVmFsdWUuTGVuZ3RoKTsNCisgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShidWlsZGVyLCBFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUyMTdMLCBpbnB1dC5Qb3NpdGlvbik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGlucHV0LlBvc2l0aW9uLCBtcy5MZW5ndGgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDAsIGJ1aWxkZXIuVmFsdWUuTGVuZ3RoKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9BYnN0cmFjdE1lc3NhZ2VMaXRlVGVzdC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L0Fic3RyYWN0TWVzc2FnZUxpdGVUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYWQ2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9BYnN0cmFjdE1lc3NhZ2VMaXRlVGVzdC5jcwpAQCAtMCwwICsxLDEzNiBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVyczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3M7DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIFtUZXN0Q2xhc3NdDQorICAgIHB1YmxpYyBjbGFzcyBBYnN0cmFjdE1lc3NhZ2VMaXRlVGVzdA0KKyAgICB7DQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RNZXNzYWdlTGl0ZVRvQnl0ZVN0cmluZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdFJlcXVpcmVkTGl0ZSBtc2cgPSBUZXN0UmVxdWlyZWRMaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0RCg0MikNCisgICAgICAgICAgICAgICAgLlNldEVuKEV4dHJhRW51bS5FWExJVEVfQkFaKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBCeXRlU3RyaW5nIGIgPSBtc2cuVG9CeXRlU3RyaW5nKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQsIGIuTGVuZ3RoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdFJlcXVpcmVkTGl0ZS5ERmllbGROdW1iZXIgPDwgMywgYlswXSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQyLCBiWzFdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdFJlcXVpcmVkTGl0ZS5FbkZpZWxkTnVtYmVyIDw8IDMsIGJbMl0pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoaW50KSBFeHRyYUVudW0uRVhMSVRFX0JBWiwgYlszXSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RNZXNzYWdlTGl0ZVRvQnl0ZUFycmF5KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0UmVxdWlyZWRMaXRlIG1zZyA9IFRlc3RSZXF1aXJlZExpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXREKDQyKQ0KKyAgICAgICAgICAgICAgICAuU2V0RW4oRXh0cmFFbnVtLkVYTElURV9CQVopDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgYiA9IG1zZy5Ub0J5dGVTdHJpbmcoKTsNCisgICAgICAgICAgICBCeXRlU3RyaW5nIGNvcHkgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKG1zZy5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYiwgY29weSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RNZXNzYWdlTGl0ZVdyaXRlVG8oKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RSZXF1aXJlZExpdGUgbXNnID0gVGVzdFJlcXVpcmVkTGl0ZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldEQoNDIpDQorICAgICAgICAgICAgICAgIC5TZXRFbihFeHRyYUVudW0uRVhMSVRFX0JBWikNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOw0KKyAgICAgICAgICAgIG1zZy5Xcml0ZVRvKG1zKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKG1zZy5Ub0J5dGVBcnJheSgpLCBtcy5Ub0FycmF5KCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TWVzc2FnZUxpdGVXcml0ZURlbGltaXRlZFRvKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0UmVxdWlyZWRMaXRlIG1zZyA9IFRlc3RSZXF1aXJlZExpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXREKDQyKQ0KKyAgICAgICAgICAgICAgICAuU2V0RW4oRXh0cmFFbnVtLkVYTElURV9CQVopDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsNCisgICAgICAgICAgICBtc2cuV3JpdGVEZWxpbWl0ZWRUbyhtcyk7DQorICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG1zLlRvQXJyYXkoKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNSwgYnVmZmVyLkxlbmd0aCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQsIGJ1ZmZlclswXSk7DQorICAgICAgICAgICAgYnl0ZVtdIG1zZ0J5dGVzID0gbmV3IGJ5dGVbNF07DQorICAgICAgICAgICAgQXJyYXkuQ29weShidWZmZXIsIDEsIG1zZ0J5dGVzLCAwLCA0KTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKG1zZy5Ub0J5dGVBcnJheSgpLCBtc2dCeXRlcyk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RJTWVzc2FnZUxpdGVXZWFrQ3JlYXRlQnVpbGRlckZvclR5cGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIElNZXNzYWdlTGl0ZSBtc2cgPSBUZXN0UmVxdWlyZWRMaXRlLkRlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHlwZW9mKFRlc3RSZXF1aXJlZExpdGUuQnVpbGRlciksIG1zZy5XZWFrQ3JlYXRlQnVpbGRlckZvclR5cGUoKS5HZXRUeXBlKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TWVzc2FnZUxpdGVXZWFrVG9CdWlsZGVyKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJTWVzc2FnZUxpdGUgbXNnID0gVGVzdFJlcXVpcmVkTGl0ZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldEQoNDIpDQorICAgICAgICAgICAgICAgIC5TZXRFbihFeHRyYUVudW0uRVhMSVRFX0JBWikNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgSU1lc3NhZ2VMaXRlIGNvcHkgPSBtc2cuV2Vha1RvQnVpbGRlcigpLldlYWtCdWlsZCgpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwobXNnLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RNZXNzYWdlTGl0ZVdlYWtEZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJTWVzc2FnZUxpdGUgbXNnID0gVGVzdFJlcXVpcmVkTGl0ZS5EZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShPYmplY3QuUmVmZXJlbmNlRXF1YWxzKFRlc3RSZXF1aXJlZExpdGUuRGVmYXVsdEluc3RhbmNlLCBtc2cuV2Vha0RlZmF1bHRJbnN0YW5jZUZvclR5cGUpKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9BcHAueGFtbCBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L0FwcC54YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjFmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9BcHAueGFtbApAQCAtMCwwICsxLDggQEAKK++7vzxBcHBsaWNhdGlvbiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93aW5meC8yMDA2L3hhbWwvcHJlc2VudGF0aW9uIg0KKyAgICAgICAgICAgICB4bWxuczp4PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dpbmZ4LzIwMDYveGFtbCIgDQorICAgICAgICAgICAgIHg6Q2xhc3M9IlByb3RvY29sQnVmZmVycy5TaWx2ZXJsaWdodFRlc3QuQXBwIg0KKyAgICAgICAgICAgICA+DQorICAgIDxBcHBsaWNhdGlvbi5SZXNvdXJjZXM+DQorICAgICAgICANCisgICAgPC9BcHBsaWNhdGlvbi5SZXNvdXJjZXM+DQorPC9BcHBsaWNhdGlvbj4NCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9BcHAueGFtbC5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L0FwcC54YW1sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOWZkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9BcHAueGFtbC5jcwpAQCAtMCwwICsxLDYwIEBACivvu791c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLldpbmRvd3M7DQordXNpbmcgTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3Rpbmc7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIHB1YmxpYyBwYXJ0aWFsIGNsYXNzIEFwcCA6IEFwcGxpY2F0aW9uDQorICAgIHsNCisNCisgICAgICAgIHB1YmxpYyBBcHAoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRoaXMuU3RhcnR1cCArPSB0aGlzLkFwcGxpY2F0aW9uX1N0YXJ0dXA7DQorICAgICAgICAgICAgdGhpcy5FeGl0ICs9IHRoaXMuQXBwbGljYXRpb25fRXhpdDsNCisgICAgICAgICAgICB0aGlzLlVuaGFuZGxlZEV4Y2VwdGlvbiArPSB0aGlzLkFwcGxpY2F0aW9uX1VuaGFuZGxlZEV4Y2VwdGlvbjsNCisNCisgICAgICAgICAgICAvL0luaXRpYWxpemVDb21wb25lbnQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgdm9pZCBBcHBsaWNhdGlvbl9TdGFydHVwKG9iamVjdCBzZW5kZXIsIFN0YXJ0dXBFdmVudEFyZ3MgZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aGlzLlJvb3RWaXN1YWwgPSBVbml0VGVzdFN5c3RlbS5DcmVhdGVUZXN0UGFnZSgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFwcGxpY2F0aW9uX0V4aXQob2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGUpDQorICAgICAgICB7DQorDQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIHZvaWQgQXBwbGljYXRpb25fVW5oYW5kbGVkRXhjZXB0aW9uKG9iamVjdCBzZW5kZXIsIEFwcGxpY2F0aW9uVW5oYW5kbGVkRXhjZXB0aW9uRXZlbnRBcmdzIGUpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gSWYgdGhlIGFwcCBpcyBydW5uaW5nIG91dHNpZGUgb2YgdGhlIGRlYnVnZ2VyIHRoZW4gcmVwb3J0IHRoZSBleGNlcHRpb24gdXNpbmcNCisgICAgICAgICAgICAvLyB0aGUgYnJvd3NlcidzIGV4Y2VwdGlvbiBtZWNoYW5pc20uIE9uIElFIHRoaXMgd2lsbCBkaXNwbGF5IGl0IGEgeWVsbG93IGFsZXJ0IA0KKyAgICAgICAgICAgIC8vIGljb24gaW4gdGhlIHN0YXR1cyBiYXIgYW5kIEZpcmVmb3ggd2lsbCBkaXNwbGF5IGEgc2NyaXB0IGVycm9yLg0KKyAgICAgICAgICAgIGlmICghU3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyLklzQXR0YWNoZWQpDQorICAgICAgICAgICAgew0KKw0KKyAgICAgICAgICAgICAgICAvLyBOT1RFOiBUaGlzIHdpbGwgYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGNvbnRpbnVlIHJ1bm5pbmcgYWZ0ZXIgYW4gZXhjZXB0aW9uIGhhcyBiZWVuIHRocm93bg0KKyAgICAgICAgICAgICAgICAvLyBidXQgbm90IGhhbmRsZWQuIA0KKyAgICAgICAgICAgICAgICAvLyBGb3IgcHJvZHVjdGlvbiBhcHBsaWNhdGlvbnMgdGhpcyBlcnJvciBoYW5kbGluZyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBzb21ldGhpbmcgdGhhdCB3aWxsIA0KKyAgICAgICAgICAgICAgICAvLyByZXBvcnQgdGhlIGVycm9yIHRvIHRoZSB3ZWJzaXRlIGFuZCBzdG9wIHRoZSBhcHBsaWNhdGlvbi4NCisgICAgICAgICAgICAgICAgZS5IYW5kbGVkID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgRGVwbG95bWVudC5DdXJyZW50LkRpc3BhdGNoZXIuQmVnaW5JbnZva2UoDQorICAgICAgICAgICAgICAgICAgICBuZXcgRXZlbnRIYW5kbGVyPEFwcGxpY2F0aW9uVW5oYW5kbGVkRXhjZXB0aW9uRXZlbnRBcmdzPihSZXBvcnRFcnJvclRvRE9NKSwgDQorICAgICAgICAgICAgICAgICAgICBuZXcgb2JqZWN0W10geyBzZW5kZXIsIGUgfSApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgdm9pZCBSZXBvcnRFcnJvclRvRE9NKG9iamVjdCBzZW5kZXIsIEFwcGxpY2F0aW9uVW5oYW5kbGVkRXhjZXB0aW9uRXZlbnRBcmdzIGUpDQorICAgICAgICB7DQorICAgICAgICAgICAgdHJ5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBzdHJpbmcgZXJyb3JNc2cgPSBlLkV4Y2VwdGlvbk9iamVjdC5NZXNzYWdlICsgZS5FeGNlcHRpb25PYmplY3QuU3RhY2tUcmFjZTsNCisgICAgICAgICAgICAgICAgZXJyb3JNc2cgPSBlcnJvck1zZy5SZXBsYWNlKCciJywgJ1wnJykuUmVwbGFjZSgiXHJcbiIsIEAiXG4iKTsNCisNCisgICAgICAgICAgICAgICAgU3lzdGVtLldpbmRvd3MuQnJvd3Nlci5IdG1sUGFnZS5XaW5kb3cuRXZhbCgidGhyb3cgbmV3IEVycm9yKFwiVW5oYW5kbGVkIEVycm9yIGluIFNpbHZlcmxpZ2h0IDIgQXBwbGljYXRpb24gIiArIGVycm9yTXNnICsgIlwiKTsiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L0V4dGVuZGFibGVCdWlsZGVyTGl0ZVRlc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9FeHRlbmRhYmxlQnVpbGRlckxpdGVUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMGViYWYKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9FeHRlbmRhYmxlQnVpbGRlckxpdGVUZXN0LmNzCkBAIC0wLDAgKzEsMjg5IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvczsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIEV4dGVuZGFibGVCdWlsZGVyTGl0ZVRlc3QNCisgICAgew0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0SGFzRXh0ZW5zaW9uVCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIDEyMyk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShidWlsZGVyLkhhc0V4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEhhc0V4dGVuc2lvblRNaXNzaW5nKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShidWlsZGVyLkhhc0V4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEdldEV4dGVuc2lvbkNvdW50VCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUsIDEpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLCAyKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSwgMyk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIGJ1aWxkZXIuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RHZXRFeHRlbnNpb25Db3VudFRFbXB0eSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIGJ1aWxkZXIuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RHZXRFeHRlbnNpb25UTnVsbCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgc3RyaW5nIHZhbHVlID0gYnVpbGRlci5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCh2YWx1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RHZXRFeHRlbnNpb25UVmFsdWUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlLCAzKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgYnVpbGRlci5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RHZXRFeHRlbnNpb25URW1wdHkoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBidWlsZGVyLkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUpLkNvdW50KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEdldEV4dGVuc2lvblRMaXN0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSwgMSkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUsIDIpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLCAzKTsNCisNCisgICAgICAgICAgICBJTGlzdDxpbnQ+IHZhbHVlcyA9IGJ1aWxkZXIuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIHZhbHVlcy5Db3VudCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RHZXRFeHRlbnNpb25USW5kZXgoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLCAwKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSwgMSkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUsIDIpOw0KKw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoaSwgYnVpbGRlci5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLCBpKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbikpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEdldEV4dGVuc2lvblRJbmRleE91dE9mUmFuZ2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSwgMCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RTZXRFeHRlbnNpb25USW5kZXgoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLCAwKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSwgMSkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUsIDIpOw0KKw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoaSwgYnVpbGRlci5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLCBpKSk7DQorDQorICAgICAgICAgICAgYnVpbGRlci5TZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLCAwLCA1KTsNCisgICAgICAgICAgICBidWlsZGVyLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUsIDEsIDYpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSwgMiwgNyk7DQorDQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ICsgaSwgYnVpbGRlci5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLCBpKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbikpXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFNldEV4dGVuc2lvblRJbmRleE91dE9mUmFuZ2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSwgMCwgLTEpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0Q2xlYXJFeHRlbnNpb25UTGlzdCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUsIDApOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBidWlsZGVyLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSkpOw0KKw0KKyAgICAgICAgICAgIGJ1aWxkZXIuQ2xlYXJFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgYnVpbGRlci5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdENsZWFyRXh0ZW5zaW9uVFZhbHVlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSwgMCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShidWlsZGVyLkhhc0V4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpKTsNCisNCisgICAgICAgICAgICBidWlsZGVyLkNsZWFyRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYnVpbGRlci5IYXNFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RJbmRleGVkQnlEZXNjcmlwdG9yKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShidWlsZGVyLkhhc0V4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpKTsNCisNCisgICAgICAgICAgICBidWlsZGVyW1VuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZS5EZXNjcmlwdG9yXSA9IDEyMzsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGJ1aWxkZXIuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGJ1aWxkZXIuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0SW5kZXhlZEJ5RGVzY3JpcHRvckFuZE9yZGluYWwoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLCAwKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgYnVpbGRlci5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUpKTsNCisNCisgICAgICAgICAgICBJRmllbGREZXNjcmlwdG9yTGl0ZSBmID0gVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLkRlc2NyaXB0b3I7DQorICAgICAgICAgICAgYnVpbGRlcltmLCAwXSA9IDEyMzsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgYnVpbGRlci5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBidWlsZGVyLkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUsIDApKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKSldDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0SW5kZXhlZEJ5RGVzY3JpcHRvckFuZE9yZGluYWxPdXRPZlJhbmdlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgYnVpbGRlci5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUpKTsNCisNCisgICAgICAgICAgICBJRmllbGREZXNjcmlwdG9yTGl0ZSBmID0gVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLkRlc2NyaXB0b3I7DQorICAgICAgICAgICAgYnVpbGRlcltmLCAwXSA9IDEyMzsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdENsZWFyRmllbGRCeURlc2NyaXB0b3IoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLCAwKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgYnVpbGRlci5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUpKTsNCisNCisgICAgICAgICAgICBJRmllbGREZXNjcmlwdG9yTGl0ZSBmID0gVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLkRlc2NyaXB0b3I7DQorICAgICAgICAgICAgYnVpbGRlci5DbGVhckZpZWxkKGYpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBidWlsZGVyLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0QWRkUmVwZWF0ZWRGaWVsZEJ5RGVzY3JpcHRvcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUsIDApOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBidWlsZGVyLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSkpOw0KKw0KKyAgICAgICAgICAgIElGaWVsZERlc2NyaXB0b3JMaXRlIGYgPSBVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUuRGVzY3JpcHRvcjsNCisgICAgICAgICAgICBidWlsZGVyLkFkZFJlcGVhdGVkRmllbGQoZiwgMTIzKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgYnVpbGRlci5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBidWlsZGVyLkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUsIDEpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE1pc3NpbmdFeHRlbnNpb25zTGl0ZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgY29uc3QgaW50IG9wdGlvbmFsSW50MzIgPSAxMjM0NTY3ODsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBidWlsZGVyLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIG9wdGlvbmFsSW50MzIpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUsIDEuMSk7DQorICAgICAgICAgICAgYnVpbGRlci5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSwgMS4yKTsNCisgICAgICAgICAgICBidWlsZGVyLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlLCAxLjMpOw0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtc2cgPSBidWlsZGVyLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtc2cuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBtc2cuR2V0RXh0ZW5zaW9uQ291bnQoVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSkpOw0KKw0KKyAgICAgICAgICAgIGJ5dGVbXSBiaXRzID0gbXNnLlRvQnl0ZUFycmF5KCk7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIGNvcHkgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuUGFyc2VGcm9tKGJpdHMpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGNvcHkuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBjb3B5LkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwobXNnLCBjb3B5KTsNCisNCisgICAgICAgICAgICAvL1RoZSBsaXRlIHJ1bnRpbWUgcmVtb3ZlcyBhbGwgdW5rbm93biBmaWVsZHMgYW5kIGV4dGVuc2lvbnMNCisgICAgICAgICAgICBieXRlW10gY29weWJpdHMgPSBjb3B5LlRvQnl0ZUFycmF5KCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIGNvcHliaXRzLkxlbmd0aCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RNaXNzaW5nRmllbGRzTGl0ZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZSBtc2cgPSBUZXN0QWxsVHlwZXNMaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0T3B0aW9uYWxJbnQzMigxMjMpDQorICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbFN0cmluZygiMTIzIikNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgYnl0ZVtdIGJpdHMgPSBtc2cuVG9CeXRlQXJyYXkoKTsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgY29weSA9IFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5QYXJzZUZyb20oYml0cyk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdEVxdWFsKG1zZywgY29weSk7DQorDQorICAgICAgICAgICAgLy9UaGUgbGl0ZSBydW50aW1lIHJlbW92ZXMgYWxsIHVua25vd24gZmllbGRzIGFuZCBleHRlbnNpb25zDQorICAgICAgICAgICAgYnl0ZVtdIGNvcHliaXRzID0gY29weS5Ub0J5dGVBcnJheSgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBjb3B5Yml0cy5MZW5ndGgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L0V4dGVuZGFibGVNZXNzYWdlTGl0ZVRlc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9FeHRlbmRhYmxlTWVzc2FnZUxpdGVUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMjM2YWEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9FeHRlbmRhYmxlTWVzc2FnZUxpdGVUZXN0LmNzCkBAIC0wLDAgKzEsMzc5IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zOw0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KKw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzDQorew0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlVGVzdA0KKyAgICB7DQorICAgICAgICAvL1RoZSBsaXRlIGZyYW1ld29yayBkb2VzIG5vdCBtYWtlIHRoaXMgYXNzZXJ0aW9uDQorICAgICAgICAvL1tUZXN0TWV0aG9kLCBJZ25vcmUsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQ0KKyAgICAgICAgLy9wdWJsaWMgdm9pZCBFeHRlbnNpb25Xcml0ZXJJbnZhbGlkRXh0ZW5zaW9uKCkNCisgICAgICAgIC8vew0KKyAgICAgICAgLy8gICAgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKVsNCisgICAgICAgIC8vICAgICAgICBVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUuRGVzY3JpcHRvcl0gPQ0KKyAgICAgICAgLy8gICAgICAgIEZvcmVpZ25NZXNzYWdlTGl0ZS5EZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAvL30NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgRXh0ZW5zaW9uV3JpdGVyVGVzdE1lc3NhZ2VzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBiID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRFeHRlbnNpb24oDQorICAgICAgICAgICAgICAgIFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwNCisgICAgICAgICAgICAgICAgRm9yZWlnbk1lc3NhZ2VMaXRlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRDKDEyMykuQnVpbGQoKSk7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIGNvcHksIG1zZyA9IGIuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICAgICAgVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorDQorICAgICAgICAgICAgY29weSA9IFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5QYXJzZUZyb20obXNnLlRvQnl0ZUFycmF5KCksIHJlZ2lzdHJ5KTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKG1zZy5Ub0J5dGVBcnJheSgpLCBjb3B5LlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBFeHRlbnNpb25Xcml0ZXJJc0luaXRpYWxpemVkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKEZvcmVpZ25NZXNzYWdlTGl0ZS5EZWZhdWx0SW5zdGFuY2UuSXNJbml0aWFsaXplZCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUuQ3JlYXRlQnVpbGRlcigpLklzSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRFeHRlbnNpb24oDQorICAgICAgICAgICAgICAgIFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwgRm9yZWlnbk1lc3NhZ2VMaXRlLkRlZmF1bHRJbnN0YW5jZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSXNJbml0aWFsaXplZCk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEV4dGVuc2lvbldyaXRlclRlc3RTZXRFeHRlbnNpb25MaXN0cygpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIG1zZywgY29weTsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlLCBuZXdbXSB7dHJ1ZSwgZmFsc2V9KQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlLCBuZXdbXSB7IjEyMyIsICI0NTYifSkNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3W10ge0ZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFaLCBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0ZPT30pDQorICAgICAgICAgICAgICAgIDsNCisNCisgICAgICAgICAgICBtc2cgPSBidWlsZGVyLkJ1aWxkKCk7DQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKw0KKyAgICAgICAgICAgIGNvcHkgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuUGFyc2VGcm9tKG1zZy5Ub0J5dGVBcnJheSgpLCByZWdpc3RyeSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChtc2cuVG9CeXRlQXJyYXkoKSwgY29weS5Ub0J5dGVBcnJheSgpKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9GT08sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSwgMSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBFeHRlbnNpb25Xcml0ZXJUZXN0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0Qm9vbEV4dGVuc2lvbkxpdGUsIHRydWUpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRCeXRlc0V4dGVuc2lvbkxpdGUsIEJ5dGVTdHJpbmcuQ29weUZyb21VdGY4KCIxMjMiKSkNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdENvcmRFeHRlbnNpb25MaXRlLCAiMTIzIikNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdERvdWJsZUV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEZpeGVkMzJFeHRlbnNpb25MaXRlLCAxMjN1KQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDEyM3UpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRGbG9hdEV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSwgRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVopDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSwgSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfQkFaKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0SW50MzJFeHRlbnNpb25MaXRlLCAxMjMpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRJbnQ2NEV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bS5GT08pDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0U2ludDMyRXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0U2ludDY0RXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0U3RyaW5nRXh0ZW5zaW9uTGl0ZSwgIjEyMyIpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUsICIxMjMiKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0VWludDMyRXh0ZW5zaW9uTGl0ZSwgMTIzdSkNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdFVpbnQ2NEV4dGVuc2lvbkxpdGUsIDEyM3UpDQorICAgICAgICAgICAgICAgIC8vT3B0aW9uYWwNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxCb29sRXh0ZW5zaW9uTGl0ZSwgdHJ1ZSkNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxCeXRlc0V4dGVuc2lvbkxpdGUsIEJ5dGVTdHJpbmcuQ29weUZyb21VdGY4KCIxMjMiKSkNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZSwgIjEyMyIpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEZpeGVkMzJFeHRlbnNpb25MaXRlLCAxMjN1KQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEZpeGVkNjRFeHRlbnNpb25MaXRlLCAxMjN1KQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEZsb2F0RXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSwgRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVopDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUsIEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBWikNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxJbnQ2NEV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0uRk9PKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFNpbnQzMkV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxTaW50NjRFeHRlbnNpb25MaXRlLCAxMjMpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZSwgIjEyMyIpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAiMTIzIikNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxVaW50MzJFeHRlbnNpb25MaXRlLCAxMjN1KQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFVpbnQ2NEV4dGVuc2lvbkxpdGUsIDEyM3UpDQorICAgICAgICAgICAgICAgIC8vUmVwZWF0ZWQNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZSwgdHJ1ZSkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkxpdGUsIEJ5dGVTdHJpbmcuQ29weUZyb21VdGY4KCIxMjMiKSkNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZSwgIjEyMyIpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlLCAxMjN1KQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25MaXRlLCAxMjN1KQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSwgRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVopDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUsIEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBWikNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0uRk9PKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlLCAxMjMpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSwgIjEyMyIpDQorICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAiMTIzIikNCisgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRVaW50MzJFeHRlbnNpb25MaXRlLCAxMjN1KQ0KKyAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUsIDEyM3UpDQorICAgICAgICAgICAgICAgIDsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbXNnID0gYnVpbGRlci5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgICAgICBVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBjb3B5QnVpbGRlciA9DQorICAgICAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5DcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKG1zZy5Ub0J5dGVBcnJheSgpLCByZWdpc3RyeSk7DQorICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIGNvcHkgPSBjb3B5QnVpbGRlci5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwobXNnLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0Qm9vbEV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQnl0ZVN0cmluZy5Db3B5RnJvbVV0ZjgoIjEyMyIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEJ5dGVzRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTIzIiwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRDb3JkRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0RG91YmxlRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjN1LCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEZpeGVkMzJFeHRlbnNpb25MaXRlKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyM3UsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEZsb2F0RXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBWiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfQkFaLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb25MaXRlKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRJbnQzMkV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0uRk9PLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0U2ludDMyRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0U2ludDY0RXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTIzIiwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdFeHRlbnNpb25MaXRlKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMjMiLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjN1LCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdFVpbnQzMkV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzdSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRVaW50NjRFeHRlbnNpb25MaXRlKSk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEJvb2xFeHRlbnNpb25MaXRlKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEJ5dGVTdHJpbmcuQ29weUZyb21VdGY4KCIxMjMiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsQnl0ZXNFeHRlbnNpb25MaXRlKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMjMiLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbERvdWJsZUV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzdSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzdSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxGbG9hdEV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb25MaXRlKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsSW50NjRFeHRlbnNpb25MaXRlKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bS5GT08sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb25MaXRlKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFNpbnQ2NEV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjEyMyIsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjEyMyIsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjN1LCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxVaW50MzJFeHRlbnNpb25MaXRlKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyM3UsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFVpbnQ2NEV4dGVuc2lvbkxpdGUpKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGUsIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQnl0ZVN0cmluZy5Db3B5RnJvbVV0ZjgoIjEyMyIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkxpdGUsIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjEyMyIsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjN1LCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjN1LCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBWiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBWiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUsIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUsIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUsIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRFbnVtLkZPTywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUsIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZSwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTIzIiwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTIzIiwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyM3UsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUsIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzdSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZSwgMCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgQnVpbGRQYWNrZWRFeHRlbnNpb25zKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZSwgdHJ1ZSkNCisgICAgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkRG91YmxlRXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMTIzdSkNCisgICAgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDEyM3UpDQorICAgICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEZsb2F0RXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRJbnQzMkV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkSW50NjRFeHRlbnNpb25MaXRlLCAxMjMpDQorICAgICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkU2ludDMyRXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRTaW50NjRFeHRlbnNpb25MaXRlLCAxMjMpDQorICAgICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGUsIDEyM3UpDQorICAgICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGUsIDEyM3UpDQorICAgICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEJvb2xFeHRlbnNpb25MaXRlLCB0cnVlKQ0KKyAgICAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWREb3VibGVFeHRlbnNpb25MaXRlLCAxMjMpDQorICAgICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEZpeGVkMzJFeHRlbnNpb25MaXRlLCAxMjN1KQ0KKyAgICAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMTIzdSkNCisgICAgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkRmxvYXRFeHRlbnNpb25MaXRlLCAxMjMpDQorICAgICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRJbnQ2NEV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAxMjMpDQorICAgICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMTIzKQ0KKyAgICAgICAgICAgICAgICAgICAuQWRkRXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRTaW50MzJFeHRlbnNpb25MaXRlLCAxMjMpDQorICAgICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkVWludDMyRXh0ZW5zaW9uTGl0ZSwgMTIzdSkNCisgICAgICAgICAgICAgICAgICAgLkFkZEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkVWludDY0RXh0ZW5zaW9uTGl0ZSwgMTIzdSk7DQorDQorICAgICAgICAgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIG1zZyA9IGJ1aWxkZXIuQnVpbGQoKTsNCisgICAgICAgICAgICByZXR1cm4gbXNnOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFzc2VydFBhY2tlZEV4dGVuc2lvbnMoVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIGNvcHkpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZSwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWREb3VibGVFeHRlbnNpb25MaXRlLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyM3UsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjN1LCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkRmxvYXRFeHRlbnNpb25MaXRlLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZSwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRJbnQ2NEV4dGVuc2lvbkxpdGUsIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRTaW50MzJFeHRlbnNpb25MaXRlLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGUsIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzdSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGUsIDApKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzdSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGUsIDApKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEJvb2xFeHRlbnNpb25MaXRlLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZERvdWJsZUV4dGVuc2lvbkxpdGUsIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzdSwgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEZpeGVkMzJFeHRlbnNpb25MaXRlLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyM3UsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRGbG9hdEV4dGVuc2lvbkxpdGUsIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkSW50MzJFeHRlbnNpb25MaXRlLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEludDY0RXh0ZW5zaW9uTGl0ZSwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIGNvcHkuR2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCAxKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMywgY29weS5HZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZFNpbnQzMkV4dGVuc2lvbkxpdGUsIDEpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkU2ludDY0RXh0ZW5zaW9uTGl0ZSwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjN1LCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkVWludDMyRXh0ZW5zaW9uTGl0ZSwgMSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjN1LCBjb3B5LkdldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkVWludDY0RXh0ZW5zaW9uTGl0ZSwgMSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBFeHRlbnNpb25Xcml0ZXJUZXN0UGFja2VkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgbXNnID0gQnVpbGRQYWNrZWRFeHRlbnNpb25zKCk7DQorDQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKw0KKyAgICAgICAgICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIGNvcHlCdWlsZGVyID0NCisgICAgICAgICAgICAgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20obXNnLlRvQnl0ZUFycmF5KCksIHJlZ2lzdHJ5KTsNCisgICAgICAgICAgICBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgY29weSA9IGNvcHlCdWlsZGVyLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChtc2cuVG9CeXRlQXJyYXkoKSwgY29weS5Ub0J5dGVBcnJheSgpKTsNCisNCisgICAgICAgICAgICBBc3NlcnRQYWNrZWRFeHRlbnNpb25zKGNvcHkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0VW5wYWNrZWRBbmRQYWNrZWRFeHRlbnNpb25zKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgb3JpZ2luYWwgPSBCdWlsZFBhY2tlZEV4dGVuc2lvbnMoKTsNCisgICAgICAgICAgICBBc3NlcnRQYWNrZWRFeHRlbnNpb25zKG9yaWdpbmFsKTsNCisNCisgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICAgICAgVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICAgICAgVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorDQorICAgICAgICAgICAgVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUgdW5wYWNrZWQgPSBUZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZS5QYXJzZUZyb20ob3JpZ2luYWwuVG9CeXRlQXJyYXkoKSwgcmVnaXN0cnkpOw0KKw0KKyAgICAgICAgICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBwYWNrZWQgPSBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUuUGFyc2VGcm9tKHVucGFja2VkLlRvQnl0ZUFycmF5KCksIHJlZ2lzdHJ5KTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwob3JpZ2luYWwsIHBhY2tlZCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChvcmlnaW5hbC5Ub0J5dGVBcnJheSgpLCBwYWNrZWQuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICAgICAgQXNzZXJ0UGFja2VkRXh0ZW5zaW9ucyhwYWNrZWQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0VW5wYWNrZWRGcm9tUGFja2VkSW5wdXQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJ5dGVbXSBwYWNrZWREYXRhID0gQnVpbGRQYWNrZWRFeHRlbnNpb25zKCkuVG9CeXRlQXJyYXkoKTsNCisNCisgICAgICAgICAgICBUZXN0VW5wYWNrZWRUeXBlc0xpdGUgdW5wYWNrZWQgPSBUZXN0VW5wYWNrZWRUeXBlc0xpdGUuUGFyc2VGcm9tKHBhY2tlZERhdGEpOw0KKyAgICAgICAgICAgIFRlc3RQYWNrZWRUeXBlc0xpdGUgcGFja2VkID0gVGVzdFBhY2tlZFR5cGVzTGl0ZS5QYXJzZUZyb20odW5wYWNrZWQuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChwYWNrZWREYXRhLCBwYWNrZWQuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgdW5wYWNrZWQgPSBUZXN0VW5wYWNrZWRUeXBlc0xpdGUuUGFyc2VGcm9tKHBhY2tlZC5Ub0J5dGVBcnJheSgpKTsNCisNCisgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICAgICAgVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICAgICAgQXNzZXJ0UGFja2VkRXh0ZW5zaW9ucyhUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUuUGFyc2VGcm9tKHVucGFja2VkLlRvQnl0ZUFycmF5KCksIHJlZ2lzdHJ5KSk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvSW50ZXJvcExpdGVUZXN0LmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvSW50ZXJvcExpdGVUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NzM5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9JbnRlcm9wTGl0ZVRlc3QuY3MKQEAgLTAsMCArMSwxODYgQEAKKyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQ0KKw0KKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdA0KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIGh0dHA6Ly9naXRodWIuY29tL2pza2VldC9kb3RuZXQtcHJvdG9idWZzLw0KKy8vIE9yaWdpbmFsIEMrKy9KYXZhL1B5dGhvbiBjb2RlOg0KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8NCisvLw0KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisvLyBtZXQ6DQorLy8NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisvLyBkaXN0cmlidXRpb24uDQorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisvLw0KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKw0KKyNlbmRyZWdpb24NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQordXNpbmcgR29vZ2xlLlByb3RvY29sQnVmZmVyczsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3M7DQordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7DQorDQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMNCit7DQorICAgIFtUZXN0Q2xhc3NdDQorICAgIHB1YmxpYyBjbGFzcyBJbnRlcm9wTGl0ZVRlc3QNCisgICAgew0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0Q29udmVydEZyb21GdWxsTWluaW1hbCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEludGVyb3BQZXJzb24gcGVyc29uID0gVGVzdEludGVyb3BQZXJzb24uQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRJZCgxMjMpDQorICAgICAgICAgICAgICAgIC5TZXROYW1lKCJhYmMiKQ0KKyAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHBlcnNvbi5Jc0luaXRpYWxpemVkKTsNCisNCisgICAgICAgICAgICBUZXN0SW50ZXJvcFBlcnNvbkxpdGUgY29weSA9IFRlc3RJbnRlcm9wUGVyc29uTGl0ZS5QYXJzZUZyb20ocGVyc29uLlRvQnl0ZUFycmF5KCkpOw0KKw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwocGVyc29uLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RDb252ZXJ0RnJvbUZ1bGxDb21wbGV0ZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEludGVyb3BQZXJzb24gcGVyc29uID0gVGVzdEludGVyb3BQZXJzb24uQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRJZCgxMjMpDQorICAgICAgICAgICAgICAgIC5TZXROYW1lKCJhYmMiKQ0KKyAgICAgICAgICAgICAgICAuU2V0RW1haWwoImFiY0AxMjMuY29tIikNCisgICAgICAgICAgICAgICAgLkFkZFJhbmdlQ29kZXMobmV3W10gezEsIDIsIDN9KQ0KKyAgICAgICAgICAgICAgICAuQWRkUGhvbmUoVGVzdEludGVyb3BQZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIuQ3JlYXRlQnVpbGRlcigpLlNldE51bWJlcigiNTU1LTEyMzQiKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAuQWRkUGhvbmUoVGVzdEludGVyb3BQZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIuQ3JlYXRlQnVpbGRlcigpLlNldE51bWJlcigiNTU1LTU2NzgiKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAuQWRkQWRkcmVzc2VzKA0KKyAgICAgICAgICAgICAgICAgICAgVGVzdEludGVyb3BQZXJzb24uVHlwZXMuQWRkcmVzc2VzLkNyZWF0ZUJ1aWxkZXIoKS5TZXRBZGRyZXNzKCIxMjMgU2VzZW1lIikuU2V0Q2l0eSgiV29uZGVybGFuZCIpLg0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFN0YXRlKCJOQSIpLlNldFppcCgxMjM0NSkuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdEV4dHJhc0Z1bGxQcm90b0ZpbGUuRW1wbG95ZWVJZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0SW50ZXJvcEVtcGxveWVlSWQuQ3JlYXRlQnVpbGRlcigpLlNldE51bWJlcigiMTIzIikuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShwZXJzb24uSXNJbml0aWFsaXplZCk7DQorDQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKw0KKyAgICAgICAgICAgIFRlc3RJbnRlcm9wUGVyc29uTGl0ZSBjb3B5ID0gVGVzdEludGVyb3BQZXJzb25MaXRlLlBhcnNlRnJvbShwZXJzb24uVG9CeXRlQXJyYXkoKSwgcmVnaXN0cnkpOw0KKw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwocGVyc29uLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RDb252ZXJ0RnJvbUxpdGVNaW5pbWFsKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0SW50ZXJvcFBlcnNvbkxpdGUgcGVyc29uID0gVGVzdEludGVyb3BQZXJzb25MaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0SWQoMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0TmFtZSgiYWJjIikNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShwZXJzb24uSXNJbml0aWFsaXplZCk7DQorDQorICAgICAgICAgICAgVGVzdEludGVyb3BQZXJzb24gY29weSA9IFRlc3RJbnRlcm9wUGVyc29uLlBhcnNlRnJvbShwZXJzb24uVG9CeXRlQXJyYXkoKSk7DQorDQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChwZXJzb24uVG9CeXRlQXJyYXkoKSwgY29weS5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdENvbnZlcnRGcm9tTGl0ZUNvbXBsZXRlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0SW50ZXJvcFBlcnNvbkxpdGUgcGVyc29uID0gVGVzdEludGVyb3BQZXJzb25MaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0SWQoMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0TmFtZSgiYWJjIikNCisgICAgICAgICAgICAgICAgLlNldEVtYWlsKCJhYmNAMTIzLmNvbSIpDQorICAgICAgICAgICAgICAgIC5BZGRSYW5nZUNvZGVzKG5ld1tdIHsxLCAyLCAzfSkNCisgICAgICAgICAgICAgICAgLkFkZFBob25lKFRlc3RJbnRlcm9wUGVyc29uTGl0ZS5UeXBlcy5QaG9uZU51bWJlci5DcmVhdGVCdWlsZGVyKCkuU2V0TnVtYmVyKCI1NTUtMTIzNCIpLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgIC5BZGRQaG9uZShUZXN0SW50ZXJvcFBlcnNvbkxpdGUuVHlwZXMuUGhvbmVOdW1iZXIuQ3JlYXRlQnVpbGRlcigpLlNldE51bWJlcigiNTU1LTU2NzgiKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAuQWRkQWRkcmVzc2VzKA0KKyAgICAgICAgICAgICAgICAgICAgVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLkFkZHJlc3Nlcy5DcmVhdGVCdWlsZGVyKCkuU2V0QWRkcmVzcygiMTIzIFNlc2VtZSIpLlNldENpdHkoIldvbmRlcmxhbmQiKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRTdGF0ZSgiTkEiKS5TZXRaaXAoMTIzNDUpLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLkVtcGxveWVlSWRMaXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUuQ3JlYXRlQnVpbGRlcigpLlNldE51bWJlcigiMTIzIikuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShwZXJzb24uSXNJbml0aWFsaXplZCk7DQorDQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFVuaXRUZXN0RXh0cmFzRnVsbFByb3RvRmlsZS5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKw0KKyAgICAgICAgICAgIFRlc3RJbnRlcm9wUGVyc29uIGNvcHkgPSBUZXN0SW50ZXJvcFBlcnNvbi5QYXJzZUZyb20ocGVyc29uLlRvQnl0ZUFycmF5KCksIHJlZ2lzdHJ5KTsNCisNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKHBlcnNvbi5Ub0J5dGVBcnJheSgpLCBjb3B5LlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIEJ5dGVTdHJpbmcgQWxsQnl0ZXMNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzI1Nl07DQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMuTGVuZ3RoOyBpKyspDQorICAgICAgICAgICAgICAgICAgICBieXRlc1tpXSA9IChieXRlKSBpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gQnl0ZVN0cmluZy5Db3B5RnJvbShieXRlcyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0Q29tcGFyZVN0cmluZ1ZhbHVlcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEludGVyb3BQZXJzb25MaXRlIHBlcnNvbiA9IFRlc3RJbnRlcm9wUGVyc29uTGl0ZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldElkKDEyMykNCisgICAgICAgICAgICAgICAgLlNldE5hbWUoImFiYyIpDQorICAgICAgICAgICAgICAgIC5TZXRFbWFpbCgiYWJjQDEyMy5jb20iKQ0KKyAgICAgICAgICAgICAgICAuQWRkUmFuZ2VDb2RlcyhuZXdbXSB7MSwgMiwgM30pDQorICAgICAgICAgICAgICAgIC5BZGRQaG9uZShUZXN0SW50ZXJvcFBlcnNvbkxpdGUuVHlwZXMuUGhvbmVOdW1iZXIuQ3JlYXRlQnVpbGRlcigpLlNldE51bWJlcigiNTU1LTEyMzQiKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAuQWRkUGhvbmUoDQorICAgICAgICAgICAgICAgICAgICBUZXN0SW50ZXJvcFBlcnNvbkxpdGUuVHlwZXMuUGhvbmVOdW1iZXIuQ3JlYXRlQnVpbGRlcigpLlNldE51bWJlcigNCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGV4dC5FbmNvZGluZy5VVEY4LkdldFN0cmluZyhBbGxCeXRlcy5Ub0J5dGVBcnJheSgpLCAwLCBBbGxCeXRlcy5MZW5ndGgpKS5CdWlsZCgpKQ0KKyAgICAgICAgICAgICAgICAuQWRkQWRkcmVzc2VzKA0KKyAgICAgICAgICAgICAgICAgICAgVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLkFkZHJlc3Nlcy5DcmVhdGVCdWlsZGVyKCkuU2V0QWRkcmVzcygiMTIzIFNlc2VtZSIpLlNldENpdHkoIldvbmRlcmxhbmQiKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRTdGF0ZSgiTkEiKS5TZXRaaXAoMTIzNDUpLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLkVtcGxveWVlSWRMaXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUuQ3JlYXRlQnVpbGRlcigpLlNldE51bWJlcigiMTIzIikuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShwZXJzb24uSXNJbml0aWFsaXplZCk7DQorDQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFVuaXRUZXN0RXh0cmFzRnVsbFByb3RvRmlsZS5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKw0KKyAgICAgICAgICAgIFRlc3RJbnRlcm9wUGVyc29uIGNvcHkgPSBUZXN0SW50ZXJvcFBlcnNvbi5QYXJzZUZyb20ocGVyc29uLlRvQnl0ZUFycmF5KCksIHJlZ2lzdHJ5KTsNCisNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKHBlcnNvbi5Ub0J5dGVBcnJheSgpLCBjb3B5LlRvQnl0ZUFycmF5KCkpOw0KKw0KKyAgICAgICAgICAgIFRlc3RJbnRlcm9wUGVyc29uLkJ1aWxkZXIgY29weUJ1aWxkZXIgPSBUZXN0SW50ZXJvcFBlcnNvbi5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgVGV4dEZvcm1hdC5NZXJnZSgNCisgICAgICAgICAgICAgICAgcGVyc29uLlRvU3RyaW5nKCkuUmVwbGFjZSgiW3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhLmVtcGxveWVlX2lkX2xpdGVdIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhLmVtcGxveWVlX2lkXSIpLCByZWdpc3RyeSwgY29weUJ1aWxkZXIpOw0KKw0KKyAgICAgICAgICAgIGNvcHkgPSBjb3B5QnVpbGRlci5CdWlsZCgpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwocGVyc29uLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorDQorICAgICAgICAgICAgc3RyaW5nIGxpdGVUZXh0ID0gcGVyc29uLlRvU3RyaW5nKCkuVHJpbUVuZCgpLlJlcGxhY2UoIlxyIiwgIiIpOw0KKyAgICAgICAgICAgIHN0cmluZyBmdWxsVGV4dCA9IGNvcHkuVG9TdHJpbmcoKS5UcmltRW5kKCkuUmVwbGFjZSgiXHIiLCAiIik7DQorICAgICAgICAgICAgLy9tYXAgdGhlIGV4dGVuc2lvbiB0eXBlDQorICAgICAgICAgICAgbGl0ZVRleHQgPSBsaXRlVGV4dC5SZXBsYWNlKCJbcHJvdG9idWZfdW5pdHRlc3RfZXh0cmEuZW1wbG95ZWVfaWRfbGl0ZV0iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhLmVtcGxveWVlX2lkXSIpOw0KKyAgICAgICAgICAgIC8vbGl0ZSB2ZXJzaW9uIGRvZXMgbm90IGluZGVudA0KKyAgICAgICAgICAgIHdoaWxlIChmdWxsVGV4dC5JbmRleE9mKCJcbiAiKSA+PSAwKQ0KKyAgICAgICAgICAgICAgICBmdWxsVGV4dCA9IGZ1bGxUZXh0LlJlcGxhY2UoIlxuICIsICJcbiIpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmdWxsVGV4dCwgbGl0ZVRleHQpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L0xpdGVUZXN0LmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvTGl0ZVRlc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU2MTg3NgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L0xpdGVUZXN0LmNzCkBAIC0wLDAgKzEsMTE4IEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIFN5c3RlbS5JTzsNCit1c2luZyBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvczsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gTWlzY2VsbGFuZW91cyB0ZXN0cyBmb3IgbWVzc2FnZSBvcGVyYXRpb25zIHRoYXQgYXBwbHkgdG8gYm90aA0KKyAgICAvLy8gZ2VuZXJhdGVkIGFuZCBkeW5hbWljIG1lc3NhZ2VzLg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBbVGVzdENsYXNzXQ0KKyAgICBwdWJsaWMgY2xhc3MgTGl0ZVRlc3QNCisgICAgew0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TGl0ZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gU2luY2UgbGl0ZSBtZXNzYWdlcyBhcmUgYSBzdWJzZXQgb2YgcmVndWxhciBtZXNzYWdlcywgd2UgY2FuIG1vc3RseQ0KKyAgICAgICAgICAgIC8vIGFzc3VtZSB0aGF0IHRoZSBmdW5jdGlvbmFsaXR5IG9mIGxpdGUgbWVzc2FnZXMgaXMgYWxyZWFkeSB0aG9yb3VnaGx5DQorICAgICAgICAgICAgLy8gdGVzdGVkIGJ5IHRoZSByZWd1bGFyIHRlc3RzLiAgQWxsIHRoaXMgdGVzdCByZWFsbHkgdmVyaWZpZXMgaXMgdGhhdA0KKyAgICAgICAgICAgIC8vIGEgcHJvdG8gd2l0aCBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUUgY29tcGlsZXMgY29ycmVjdGx5IHdoZW4NCisgICAgICAgICAgICAvLyBsaW5rZWQgb25seSBhZ2FpbnN0IHRoZSBsaXRlIGxpYnJhcnkuICBUaGF0IGlzIGFsbCB0ZXN0ZWQgYXQgY29tcGlsZQ0KKyAgICAgICAgICAgIC8vIHRpbWUsIGxlYXZpbmcgbm90IG11Y2ggdG8gZG8gaW4gdGhpcyBtZXRob2QuICBMZXQncyBqdXN0IGRvIHNvbWUgcmFuZG9tDQorICAgICAgICAgICAgLy8gc3R1ZmYgdG8gbWFrZSBzdXJlIHRoZSBsaXRlIG1lc3NhZ2UgaXMgYWN0dWFsbHkgaGVyZSBhbmQgdXNhYmxlLg0KKw0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZSA9DQorICAgICAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgICAgICAuU2V0T3B0aW9uYWxJbnQzMigxMjMpDQorICAgICAgICAgICAgICAgICAgICAuQWRkUmVwZWF0ZWRTdHJpbmcoImhlbGxvIikNCisgICAgICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoDQorICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRCYig3KSkNCisgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIEJ5dGVTdHJpbmcgZGF0YSA9IG1lc3NhZ2UuVG9CeXRlU3RyaW5nKCk7DQorDQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZSBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlc0xpdGUuUGFyc2VGcm9tKGRhdGEpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMsIG1lc3NhZ2UyLk9wdGlvbmFsSW50MzIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBtZXNzYWdlMi5SZXBlYXRlZFN0cmluZ0NvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImhlbGxvIiwgbWVzc2FnZTIuUmVwZWF0ZWRTdHJpbmdMaXN0WzBdKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNywgbWVzc2FnZTIuT3B0aW9uYWxOZXN0ZWRNZXNzYWdlLkJiKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdExpdGVFeHRlbnNpb25zKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBUT0RPKGtlbnRvbik6ICBVbmxpa2Ugb3RoZXIgZmVhdHVyZXMgb2YgdGhlIGxpdGUgbGlicmFyeSwgZXh0ZW5zaW9ucyBhcmUNCisgICAgICAgICAgICAvLyAgIGltcGxlbWVudGVkIGNvbXBsZXRlbHkgZGlmZmVyZW50bHkgZnJvbSB0aGUgcmVndWxhciBsaWJyYXJ5LiAgV2UNCisgICAgICAgICAgICAvLyAgIHNob3VsZCBwcm9iYWJseSB0ZXN0IHRoZW0gbW9yZSB0aG9yb3VnaGx5Lg0KKw0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlID0NCisgICAgICAgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgLlNldEV4dGVuc2lvbihVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIDEyMykNCisgICAgICAgICAgICAgICAgICAgIC5BZGRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSwgImhlbGxvIikNCisgICAgICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bS5CQVopDQorICAgICAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpLlNldEJiKDcpLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsNCisNCisgICAgICAgICAgICAvLyBUZXN0IGNvcHlpbmcgYSBtZXNzYWdlLCBzaW5jZSBjb3BpbmcgZXh0ZW5zaW9ucyBhY3R1YWxseSBkb2VzIHVzZSBhDQorICAgICAgICAgICAgLy8gZGlmZmVyZW50IGNvZGUgcGF0aCBiZXR3ZWVuIGxpdGUgYW5kIHJlZ3VsYXIgbGlicmFyaWVzLCBhbmQgYXMgb2YgdGhpcw0KKyAgICAgICAgICAgIC8vIHdyaXRpbmcsIHBhcnNpbmcgaGFzbid0IGJlZW4gaW1wbGVtZW50ZWQgeWV0Lg0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlMiA9IG1lc3NhZ2UuVG9CdWlsZGVyKCkuQnVpbGQoKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIzLCAoaW50KSBtZXNzYWdlMi5HZXRFeHRlbnNpb24oDQorICAgICAgICAgICAgICAgIFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBtZXNzYWdlMi5HZXRFeHRlbnNpb25Db3VudCgNCisgICAgICAgICAgICAgICAgVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBtZXNzYWdlMi5HZXRFeHRlbnNpb24oDQorICAgICAgICAgICAgICAgIFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUpLkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImhlbGxvIiwgbWVzc2FnZTIuR2V0RXh0ZW5zaW9uKA0KKyAgICAgICAgICAgICAgICBVbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlLCAwKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bS5CQVosIG1lc3NhZ2UyLkdldEV4dGVuc2lvbigNCisgICAgICAgICAgICAgICAgVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNywgbWVzc2FnZTIuR2V0RXh0ZW5zaW9uKA0KKyAgICAgICAgICAgICAgICBVbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSkuQmIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L01pc3NpbmdGaWVsZEFuZEV4dGVuc2lvblRlc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9NaXNzaW5nRmllbGRBbmRFeHRlbnNpb25UZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NWNiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9NaXNzaW5nRmllbGRBbmRFeHRlbnNpb25UZXN0LmNzCkBAIC0wLDAgKzEsMjQwIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UNCisNCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQNCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBodHRwOi8vZ2l0aHViLmNvbS9qc2tlZXQvZG90bmV0LXByb3RvYnVmcy8NCisvLyBPcmlnaW5hbCBDKysvSmF2YS9QeXRob24gY29kZToNCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvDQorLy8NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorLy8gZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjZW5kcmVnaW9uDQorDQordXNpbmcgU3lzdGVtLklPOw0KK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvczsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIE1pc3NpbmdGaWVsZEFuZEV4dGVuc2lvblRlc3QNCisgICAgew0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UmVjb3Zlck1pc3NpbmdFeHRlbnNpb25zKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBjb25zdCBpbnQgb3B0aW9uYWxJbnQzMiA9IDEyMzQ1Njc4Ow0KKyAgICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBidWlsZGVyLlNldEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uLCBvcHRpb25hbEludDMyKTsNCisgICAgICAgICAgICBidWlsZGVyLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbiwgMS4xKTsNCisgICAgICAgICAgICBidWlsZGVyLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbiwgMS4yKTsNCisgICAgICAgICAgICBidWlsZGVyLkFkZEV4dGVuc2lvbihVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbiwgMS4zKTsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtc2cgPSBidWlsZGVyLkJ1aWxkKCk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtc2cuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgbXNnLkdldEV4dGVuc2lvbkNvdW50KFVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uKSk7DQorDQorICAgICAgICAgICAgYnl0ZVtdIGJpdHMgPSBtc2cuVG9CeXRlQXJyYXkoKTsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucyBjb3B5ID0gVGVzdEFsbEV4dGVuc2lvbnMuUGFyc2VGcm9tKGJpdHMpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGNvcHkuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgY29weS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbikpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbChtc2csIGNvcHkpOw0KKw0KKyAgICAgICAgICAgIC8vRXZlbiB0aG91Z2ggY29weSBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZSB0eXBlZXMgdGhleSBzZXJpYWxpemUgY29ycmVjdGx5DQorICAgICAgICAgICAgYnl0ZVtdIGNvcHliaXRzID0gY29weS5Ub0J5dGVBcnJheSgpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwoYml0cywgY29weWJpdHMpOw0KKw0KKyAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgICAgICBVbml0VGVzdFByb3RvRmlsZS5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKw0KKyAgICAgICAgICAgIC8vTm93IHdlIGNhbiB0YWtlIHRob3NlIGNvcHkgYml0cyBhbmQgcmVzdG9yZSB0aGUgZnVsbCBtZXNzYWdlIHdpdGggZXh0ZW5zaW9ucw0KKyAgICAgICAgICAgIGNvcHkgPSBUZXN0QWxsRXh0ZW5zaW9ucy5QYXJzZUZyb20oY29weWJpdHMsIHJlZ2lzdHJ5KTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGNvcHkuSGFzRXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24pKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgY29weS5HZXRFeHRlbnNpb25Db3VudChVbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbikpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtc2csIGNvcHkpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwoYml0cywgY29weS5Ub0J5dGVBcnJheSgpKTsNCisNCisgICAgICAgICAgICAvL0lmIHdlIG1vZGlmeSB0aGUgb2JqZWN0IHRoaXMgc2hvdWxkIGFsbCBjb250aW51ZSB0byB3b3JrIGFzIGJlZm9yZQ0KKyAgICAgICAgICAgIGNvcHliaXRzID0gY29weS5Ub0J1aWxkZXIoKS5CdWlsZCgpLlRvQnl0ZUFycmF5KCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChiaXRzLCBjb3B5Yml0cyk7DQorDQorICAgICAgICAgICAgLy9JZiB3ZSByZXBsYWNlIGV4dGVuc2lvbiB0aGUgb2JqZWN0IHRoaXMgc2hvdWxkIGFsbCBjb250aW51ZSB0byB3b3JrIGFzIGJlZm9yZQ0KKyAgICAgICAgICAgIGNvcHliaXRzID0gY29weS5Ub0J1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24sIG9wdGlvbmFsSW50MzIpDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpLlRvQnl0ZUFycmF5KCk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChiaXRzLCBjb3B5Yml0cyk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RSZWNvdmVyTWlzc2luZ0ZpZWxkcygpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdE1pc3NpbmdGaWVsZHNBIG1zZ2EgPSBUZXN0TWlzc2luZ0ZpZWxkc0EuQ3JlYXRlQnVpbGRlcigpDQorICAgICAgICAgICAgICAgIC5TZXRJZCgxMDAxKQ0KKyAgICAgICAgICAgICAgICAuU2V0TmFtZSgiTmFtZSIpDQorICAgICAgICAgICAgICAgIC5TZXRFbWFpbCgibWlzc2luZ0BmaWVsZC52YWx1ZSIpDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIC8vc2VyaWFsaXplIHRvIHR5cGUgQiBhbmQgdmVyaWZ5IGFsbCBmaWVsZHMgZXhpc3QNCisgICAgICAgICAgICBUZXN0TWlzc2luZ0ZpZWxkc0IgbXNnYiA9IFRlc3RNaXNzaW5nRmllbGRzQi5QYXJzZUZyb20obXNnYS5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAwMSwgbXNnYi5JZCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJOYW1lIiwgbXNnYi5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtc2diLkhhc1dlYnNpdGUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBtc2diLlVua25vd25GaWVsZHMuRmllbGREaWN0aW9uYXJ5LkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIm1pc3NpbmdAZmllbGQudmFsdWUiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2diLlVua25vd25GaWVsZHNbVGVzdE1pc3NpbmdGaWVsZHNBLkVtYWlsRmllbGROdW1iZXJdLkxlbmd0aERlbGltaXRlZExpc3RbMF0uVG9TdHJpbmdVdGY4KCkpOw0KKw0KKyAgICAgICAgICAgIC8vc2VyaWFsaXplcyBleGFjdGx5IHRoZSBzYW1lIChhdCBsZWFzdCBmb3IgdGhpcyBzaW1wbGUgZXhhbXBsZSkNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKG1zZ2EuVG9CeXRlQXJyYXkoKSwgbXNnYi5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobXNnYSwgVGVzdE1pc3NpbmdGaWVsZHNBLlBhcnNlRnJvbShtc2diLlRvQnl0ZUFycmF5KCkpKTsNCisNCisgICAgICAgICAgICAvL25vdyByZS1jcmVhdGUgYW4gZXhhY3QgY29weSBvZiBBIGZyb20gc2VyaWFsaXplZCBCDQorICAgICAgICAgICAgVGVzdE1pc3NpbmdGaWVsZHNBIGNvcHlhID0gVGVzdE1pc3NpbmdGaWVsZHNBLlBhcnNlRnJvbShtc2diLlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtc2dhLCBjb3B5YSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwMDEsIGNvcHlhLklkKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIk5hbWUiLCBjb3B5YS5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIm1pc3NpbmdAZmllbGQudmFsdWUiLCBjb3B5YS5FbWFpbCk7DQorDQorICAgICAgICAgICAgLy9Ob3cgd2UgbW9kaWZ5IEIuLi4gYW5kIHRyeSBhZ2Fpbg0KKyAgICAgICAgICAgIG1zZ2IgPSBtc2diLlRvQnVpbGRlcigpLlNldFdlYnNpdGUoImh0dHA6Ly9uZXcubWlzc2luZy5maWVsZCIpLkJ1aWxkKCk7DQorICAgICAgICAgICAgLy9Eb2VzIEIgc3RpbGwgaGF2ZSB0aGUgbWlzc2luZyBmaWVsZD8NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgbXNnYi5Vbmtub3duRmllbGRzLkZpZWxkRGljdGlvbmFyeS5Db3VudCk7DQorDQorICAgICAgICAgICAgLy9Db252ZXJ0IGJhY2sgdG8gQSBhbmQgc2VlIGlmIGFsbCBmaWVsZHMgYXJlIHRoZXJlPw0KKyAgICAgICAgICAgIGNvcHlhID0gVGVzdE1pc3NpbmdGaWVsZHNBLlBhcnNlRnJvbShtc2diLlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbChtc2dhLCBjb3B5YSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwMDEsIGNvcHlhLklkKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIk5hbWUiLCBjb3B5YS5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIm1pc3NpbmdAZmllbGQudmFsdWUiLCBjb3B5YS5FbWFpbCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGNvcHlhLlVua25vd25GaWVsZHMuRmllbGREaWN0aW9uYXJ5LkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImh0dHA6Ly9uZXcubWlzc2luZy5maWVsZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlhLlVua25vd25GaWVsZHNbVGVzdE1pc3NpbmdGaWVsZHNCLldlYnNpdGVGaWVsZE51bWJlcl0uTGVuZ3RoRGVsaW1pdGVkTGlzdFswXS4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvU3RyaW5nVXRmOCgpKTsNCisNCisgICAgICAgICAgICAvL0xhc3RseSB3ZSBjYW4gZXZlbiBzdGlsbCB0cmlwIGJhY2sgdG8gdHlwZSBCIGFuZCBzZWUgYWxsIGZpZWxkczoNCisgICAgICAgICAgICBUZXN0TWlzc2luZ0ZpZWxkc0IgY29weWIgPSBUZXN0TWlzc2luZ0ZpZWxkc0IuUGFyc2VGcm9tKGNvcHlhLlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChjb3B5YS5Ub0J5dGVBcnJheSgpLkxlbmd0aCwgY29weWIuVG9CeXRlQXJyYXkoKS5MZW5ndGgpOyAvL25vdCBleGFjdCBvcmRlci4NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAwMSwgY29weWIuSWQpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiTmFtZSIsIGNvcHliLk5hbWUpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaHR0cDovL25ldy5taXNzaW5nLmZpZWxkIiwgY29weWIuV2Vic2l0ZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGNvcHliLlVua25vd25GaWVsZHMuRmllbGREaWN0aW9uYXJ5LkNvdW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIm1pc3NpbmdAZmllbGQudmFsdWUiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5Yi5Vbmtub3duRmllbGRzW1Rlc3RNaXNzaW5nRmllbGRzQS5FbWFpbEZpZWxkTnVtYmVyXS5MZW5ndGhEZWxpbWl0ZWRMaXN0WzBdLlRvU3RyaW5nVXRmOA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UmVjb3Zlck1pc3NpbmdNZXNzYWdlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0TWlzc2luZ0ZpZWxkc0EuVHlwZXMuU3ViQSBzdWJhID0NCisgICAgICAgICAgICAgICAgVGVzdE1pc3NpbmdGaWVsZHNBLlR5cGVzLlN1YkEuQ3JlYXRlQnVpbGRlcigpLlNldENvdW50KDMpLkFkZFZhbHVlcygiYSIpLkFkZFZhbHVlcygiYiIpLkFkZFZhbHVlcygiYyIpLg0KKyAgICAgICAgICAgICAgICAgICAgQnVpbGQoKTsNCisgICAgICAgICAgICBUZXN0TWlzc2luZ0ZpZWxkc0EgbXNnYSA9IFRlc3RNaXNzaW5nRmllbGRzQS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldElkKDEwMDEpDQorICAgICAgICAgICAgICAgIC5TZXROYW1lKCJOYW1lIikNCisgICAgICAgICAgICAgICAgLlNldFRlc3RBKHN1YmEpDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKw0KKyAgICAgICAgICAgIC8vc2VyaWFsaXplIHRvIHR5cGUgQiBhbmQgdmVyaWZ5IGFsbCBmaWVsZHMgZXhpc3QNCisgICAgICAgICAgICBUZXN0TWlzc2luZ0ZpZWxkc0IgbXNnYiA9IFRlc3RNaXNzaW5nRmllbGRzQi5QYXJzZUZyb20obXNnYS5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAwMSwgbXNnYi5JZCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJOYW1lIiwgbXNnYi5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgbXNnYi5Vbmtub3duRmllbGRzLkZpZWxkRGljdGlvbmFyeS5Db3VudCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHN1YmEuVG9TdHJpbmcoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdE1pc3NpbmdGaWVsZHNBLlR5cGVzLlN1YkEuUGFyc2VGcm9tKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnYi5Vbmtub3duRmllbGRzW1Rlc3RNaXNzaW5nRmllbGRzQS5UZXN0QUZpZWxkTnVtYmVyXS5MZW5ndGhEZWxpbWl0ZWRMaXN0WzBdKS5Ub1N0cmluZw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkpOw0KKw0KKyAgICAgICAgICAgIC8vc2VyaWFsaXplcyBleGFjdGx5IHRoZSBzYW1lIChhdCBsZWFzdCBmb3IgdGhpcyBzaW1wbGUgZXhhbXBsZSkNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKG1zZ2EuVG9CeXRlQXJyYXkoKSwgbXNnYi5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobXNnYSwgVGVzdE1pc3NpbmdGaWVsZHNBLlBhcnNlRnJvbShtc2diLlRvQnl0ZUFycmF5KCkpKTsNCisNCisgICAgICAgICAgICAvL25vdyByZS1jcmVhdGUgYW4gZXhhY3QgY29weSBvZiBBIGZyb20gc2VyaWFsaXplZCBCDQorICAgICAgICAgICAgVGVzdE1pc3NpbmdGaWVsZHNBIGNvcHlhID0gVGVzdE1pc3NpbmdGaWVsZHNBLlBhcnNlRnJvbShtc2diLlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtc2dhLCBjb3B5YSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwMDEsIGNvcHlhLklkKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIk5hbWUiLCBjb3B5YS5OYW1lKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoc3ViYSwgY29weWEuVGVzdEEpOw0KKw0KKyAgICAgICAgICAgIC8vTm93IHdlIG1vZGlmeSBCLi4uIGFuZCB0cnkgYWdhaW4NCisgICAgICAgICAgICBUZXN0TWlzc2luZ0ZpZWxkc0IuVHlwZXMuU3ViQiBzdWJiID0NCisgICAgICAgICAgICAgICAgVGVzdE1pc3NpbmdGaWVsZHNCLlR5cGVzLlN1YkIuQ3JlYXRlQnVpbGRlcigpLkFkZFZhbHVlcygidGVzdC1iIikuQnVpbGQoKTsNCisgICAgICAgICAgICBtc2diID0gbXNnYi5Ub0J1aWxkZXIoKS5TZXRUZXN0QihzdWJiKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIC8vRG9lcyBCIHN0aWxsIGhhdmUgdGhlIG1pc3NpbmcgZmllbGQ/DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG1zZ2IuVW5rbm93bkZpZWxkcy5GaWVsZERpY3Rpb25hcnkuQ291bnQpOw0KKw0KKyAgICAgICAgICAgIC8vQ29udmVydCBiYWNrIHRvIEEgYW5kIHNlZSBpZiBhbGwgZmllbGRzIGFyZSB0aGVyZT8NCisgICAgICAgICAgICBjb3B5YSA9IFRlc3RNaXNzaW5nRmllbGRzQS5QYXJzZUZyb20obXNnYi5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwobXNnYSwgY29weWEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDAxLCBjb3B5YS5JZCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJOYW1lIiwgY29weWEuTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHN1YmEsIGNvcHlhLlRlc3RBKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgY29weWEuVW5rbm93bkZpZWxkcy5GaWVsZERpY3Rpb25hcnkuQ291bnQpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwoc3ViYi5Ub0J5dGVBcnJheSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5YS5Vbmtub3duRmllbGRzW1Rlc3RNaXNzaW5nRmllbGRzQi5UZXN0QkZpZWxkTnVtYmVyXS5MZW5ndGhEZWxpbWl0ZWRMaXN0WzBdLlRvQnl0ZUFycmF5KCkpOw0KKw0KKyAgICAgICAgICAgIC8vTGFzdGx5IHdlIGNhbiBldmVuIHN0aWxsIHRyaXAgYmFjayB0byB0eXBlIEIgYW5kIHNlZSBhbGwgZmllbGRzOg0KKyAgICAgICAgICAgIFRlc3RNaXNzaW5nRmllbGRzQiBjb3B5YiA9IFRlc3RNaXNzaW5nRmllbGRzQi5QYXJzZUZyb20oY29weWEuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGNvcHlhLlRvQnl0ZUFycmF5KCkuTGVuZ3RoLCBjb3B5Yi5Ub0J5dGVBcnJheSgpLkxlbmd0aCk7IC8vbm90IGV4YWN0IG9yZGVyLg0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDAxLCBjb3B5Yi5JZCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJOYW1lIiwgY29weWIuTmFtZSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHN1YmIsIGNvcHliLlRlc3RCKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgY29weWIuVW5rbm93bkZpZWxkcy5GaWVsZERpY3Rpb25hcnkuQ291bnQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UmVzdG9yZUZyb21PdGhlclR5cGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RJbnRlcm9wUGVyc29uIHBlcnNvbiA9IFRlc3RJbnRlcm9wUGVyc29uLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0SWQoMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0TmFtZSgiYWJjIikNCisgICAgICAgICAgICAgICAgLlNldEVtYWlsKCJhYmNAMTIzLmNvbSIpDQorICAgICAgICAgICAgICAgIC5BZGRSYW5nZUNvZGVzKG5ld1tdIHsxLCAyLCAzfSkNCisgICAgICAgICAgICAgICAgLkFkZFBob25lKFRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLlBob25lTnVtYmVyLkNyZWF0ZUJ1aWxkZXIoKS5TZXROdW1iZXIoIjU1NS0xMjM0IikuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgLkFkZFBob25lKFRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLlBob25lTnVtYmVyLkNyZWF0ZUJ1aWxkZXIoKS5TZXROdW1iZXIoIjU1NS01Njc4IikuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgLkFkZEFkZHJlc3NlcygNCisgICAgICAgICAgICAgICAgICAgIFRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLkFkZHJlc3Nlcy5DcmVhdGVCdWlsZGVyKCkuU2V0QWRkcmVzcygiMTIzIFNlc2VtZSIpLlNldENpdHkoIldvbmRlcmxhbmQiKS4NCisgICAgICAgICAgICAgICAgICAgICAgICBTZXRTdGF0ZSgiTkEiKS5TZXRaaXAoMTIzNDUpLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgIC5TZXRFeHRlbnNpb24oVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLkVtcGxveWVlSWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEludGVyb3BFbXBsb3llZUlkLkNyZWF0ZUJ1aWxkZXIoKS5TZXROdW1iZXIoIjEyMyIpLkJ1aWxkKCkpDQorICAgICAgICAgICAgICAgIC5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocGVyc29uLklzSW5pdGlhbGl6ZWQpOw0KKw0KKyAgICAgICAgICAgIFRlc3RFbXB0eU1lc3NhZ2UgdGVtcCA9IFRlc3RFbXB0eU1lc3NhZ2UuUGFyc2VGcm9tKHBlcnNvbi5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNywgdGVtcC5Vbmtub3duRmllbGRzLkZpZWxkRGljdGlvbmFyeS5Db3VudCk7DQorICAgICAgICAgICAgdGVtcCA9IHRlbXAuVG9CdWlsZGVyKCkuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNywgdGVtcC5Vbmtub3duRmllbGRzLkZpZWxkRGljdGlvbmFyeS5Db3VudCk7DQorDQorICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFVuaXRUZXN0RXh0cmFzRnVsbFByb3RvRmlsZS5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKw0KKyAgICAgICAgICAgIFRlc3RJbnRlcm9wUGVyc29uIGNvcHkgPSBUZXN0SW50ZXJvcFBlcnNvbi5QYXJzZUZyb20odGVtcC5Ub0J5dGVBcnJheSgpLCByZWdpc3RyeSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHBlcnNvbiwgY29weSk7DQorICAgICAgICAgICAgVGVzdFV0aWwuQXNzZXJ0Qnl0ZXNFcXVhbChwZXJzb24uVG9CeXRlQXJyYXkoKSwgY29weS5Ub0J5dGVBcnJheSgpKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm9wZXJ0aWVzL0FwcE1hbmlmZXN0LnhtbCBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3BlcnRpZXMvQXBwTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NTUyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm9wZXJ0aWVzL0FwcE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDYgQEAKK++7vzxEZXBsb3ltZW50IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2NsaWVudC8yMDA3L2RlcGxveW1lbnQiDQorICAgICAgICB4bWxuczp4PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dpbmZ4LzIwMDYveGFtbCINCis+DQorICAgIDxEZXBsb3ltZW50LlBhcnRzPg0KKyAgICA8L0RlcGxveW1lbnQuUGFydHM+DQorPC9EZXBsb3ltZW50Pg0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3BlcnRpZXMvT3V0T2ZCcm93c2VyU2V0dGluZ3MueG1sIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvcGVydGllcy9PdXRPZkJyb3dzZXJTZXR0aW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0ZjQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3BlcnRpZXMvT3V0T2ZCcm93c2VyU2V0dGluZ3MueG1sCkBAIC0wLDAgKzEsNyBAQAorPE91dE9mQnJvd3NlclNldHRpbmdzIFNob3J0TmFtZT0iUHJvdG9jb2xCdWZmZXJzLlRlc3QiIEVuYWJsZUdQVUFjY2VsZXJhdGlvbj0iRmFsc2UiIFNob3dJbnN0YWxsTWVudUl0ZW09IkZhbHNlIj4NCisgIDxPdXRPZkJyb3dzZXJTZXR0aW5ncy5CbHVyYj5Qcm90b2NvbEJ1ZmZlcnMuVGVzdDwvT3V0T2ZCcm93c2VyU2V0dGluZ3MuQmx1cmI+DQorICA8T3V0T2ZCcm93c2VyU2V0dGluZ3MuV2luZG93U2V0dGluZ3M+DQorICAgIDxXaW5kb3dTZXR0aW5ncyBUaXRsZT0iUHJvdG9jb2xCdWZmZXJzLlRlc3QiIC8+DQorICA8L091dE9mQnJvd3NlclNldHRpbmdzLldpbmRvd1NldHRpbmdzPg0KKyAgPE91dE9mQnJvd3NlclNldHRpbmdzLkljb25zIC8+DQorPC9PdXRPZkJyb3dzZXJTZXR0aW5ncz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QuQ0YyMC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QuQ0YyMC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJiOWY2MQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC5DRjIwLmNzcHJvagpAQCAtMCwwICsxLDEzMyBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNPTVBBQ1RfRlJBTUVXT1JLPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+Q0YyMDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPEVudmlyb25tZW50UHJvamVjdFR5cGU+VEVTVDwvRW52aXJvbm1lbnRQcm9qZWN0VHlwZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3Q8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djIuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+ezRENjI4QjVCLTJGQkMtNEFBNi04QzE2LTE5NzI0MkFFQjg4NH07e0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxQbGF0Zm9ybUZhbWlseU5hbWU+U21hcnRwaG9uZTwvUGxhdGZvcm1GYW1pbHlOYW1lPg0KKyAgICA8UGxhdGZvcm1JRD5mMjdkYTMyOS0zMjY5LTQxOTEtOThlMC1jODdkM2Q3ZjFkYjk8L1BsYXRmb3JtSUQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cQ0YyMFxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXENGMjBcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9GSUxFVkVSU0lPTjtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxDRjIwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxDRjIwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9GSUxFVkVSU0lPTjtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJudW5pdC5mcmFtZXdvcmsiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE5Vbml0XGxpYlxudW5pdC5mcmFtZXdvcmsuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyAhPSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZywgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTlVuaXQtY29uZmlnXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzIj4NCisgICAgICA8TGluaz5NaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyI+DQorICAgICAgPExpbms+UHJvcGVydGllc1xBc3NlbWJseUluZm8uY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzIj4NCisgICAgICA8TGluaz5TZXJpYWxpemFibGVBdHRyaWJ1dGUuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcVGVzdFJwY0Zvck1pbWVUeXBlcy5jcyI+DQorICAgICAgPExpbms+VGVzdFJwY0Zvck1pbWVUeXBlcy5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxUZXN0UnBjR2VuZXJhdG9yLmNzIj4NCisgICAgICA8TGluaz5UZXN0UnBjR2VuZXJhdG9yLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcmlhbGl6YWJsZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0TGl0ZUJ5QXBpLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0UnBjSW50ZXJvcExpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RVdGlsLmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24uQ0YyMC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0PntFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbjwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzTGl0ZS5DRjIwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzTGl0ZTwvTmFtZT4NCisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNvbXBhY3RGcmFtZXdvcmsuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iPg0KKyAgICAgICAgPEhvc3RpbmdQcm9jZXNzIGRpc2FibGU9IjEiIC8+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFN0YXJ0QWN0aW9uPlByb2dyYW08L1N0YXJ0QWN0aW9uPg0KKyAgICA8U3RhcnRQcm9ncmFtPiQoUHJvamVjdERpcikuLlwuLlxsaWJcTlVuaXRcdG9vbHNcbnVuaXQtY29uc29sZS5leGU8L1N0YXJ0UHJvZ3JhbT4NCisgICAgPFN0YXJ0QXJndW1lbnRzPi9ub2xvZ28gL25vc2hhZG93IC9sYWJlbHMgL3dhaXQgJChBc3NlbWJseU5hbWUpLmRsbDwvU3RhcnRBcmd1bWVudHM+DQorICAgIDxTdGFydFdvcmtpbmdEaXJlY3Rvcnk+JChQcm9qZWN0RGlyKSQoT3V0cHV0UGF0aCk8L1N0YXJ0V29ya2luZ0RpcmVjdG9yeT4NCisgIDwvUHJvcGVydHlHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0LkNGMzUuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0LkNGMzUuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZWRhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QuQ0YzNS5jc3Byb2oKQEAgLTAsMCArMSwxMzQgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DT01QQUNUX0ZSQU1FV09SSzwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPkNGMzU8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxFbnZpcm9ubWVudFByb2plY3RUeXBlPlRFU1Q8L0Vudmlyb25tZW50UHJvamVjdFR5cGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVyczwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0PC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPns0RDYyOEI1Qi0yRkJDLTRBQTYtOEMxNi0xOTcyNDJBRUI4ODR9O3tGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8UGxhdGZvcm1GYW1pbHlOYW1lPlNtYXJ0cGhvbmU8L1BsYXRmb3JtRmFtaWx5TmFtZT4NCisgICAgPFBsYXRmb3JtSUQ+ZjI3ZGEzMjktMzI2OS00MTkxLTk4ZTAtYzg3ZDNkN2YxZGI5PC9QbGF0Zm9ybUlEPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXENGMzVcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxDRjM1XERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PRklMRVZFUlNJT048L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxDRjM1XFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxDRjM1XFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9GSUxFVkVSU0lPTjwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yayI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTlVuaXRcbGliXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknICE9ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodCwgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxOVW5pdC1jb25maWdcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3MiPg0KKyAgICAgIDxMaW5rPk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIj4NCisgICAgICA8TGluaz5Qcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxTZXJpYWxpemFibGVBdHRyaWJ1dGUuY3MiPg0KKyAgICAgIDxMaW5rPlNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxUZXN0UnBjRm9yTWltZVR5cGVzLmNzIj4NCisgICAgICA8TGluaz5UZXN0UnBjRm9yTWltZVR5cGVzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RScGNHZW5lcmF0b3IuY3MiPg0KKyAgICAgIDxMaW5rPlRlc3RScGNHZW5lcmF0b3IuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VyaWFsaXphYmxlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RMaXRlQnlBcGkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RScGNJbnRlcm9wTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFV0aWwuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXFByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5DRjM1LmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+e0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnNMaXRlLkNGMzUuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9OYW1lPg0KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ29tcGFjdEZyYW1ld29yay5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSI+DQorICAgICAgICA8SG9zdGluZ1Byb2Nlc3MgZGlzYWJsZT0iMSIgLz4NCisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+DQorICAgIDwvVmlzdWFsU3R1ZGlvPg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8U3RhcnRBY3Rpb24+UHJvZ3JhbTwvU3RhcnRBY3Rpb24+DQorICAgIDxTdGFydFByb2dyYW0+JChQcm9qZWN0RGlyKS4uXC4uXGxpYlxOVW5pdFx0b29sc1xudW5pdC1jb25zb2xlLmV4ZTwvU3RhcnRQcm9ncmFtPg0KKyAgICA8U3RhcnRBcmd1bWVudHM+L25vbG9nbyAvbm9zaGFkb3cgL2xhYmVscyAvd2FpdCAkKEFzc2VtYmx5TmFtZSkuZGxsPC9TdGFydEFyZ3VtZW50cz4NCisgICAgPFN0YXJ0V29ya2luZ0RpcmVjdG9yeT4kKFByb2plY3REaXIpJChPdXRwdXRQYXRoKTwvU3RhcnRXb3JraW5nRGlyZWN0b3J5Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QuTkVUMjAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0Lk5FVDIwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWY5Mzc1Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0Lk5FVDIwLmNzcHJvagpAQCAtMCwwICsxLDEyMSBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQyMDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPEVudmlyb25tZW50UHJvamVjdFR5cGU+VEVTVDwvRW52aXJvbm1lbnRQcm9qZWN0VHlwZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3Q8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djIuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQyMFxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDIwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PRVhURU5TSU9OUzwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQyMFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMjBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibnVuaXQuZnJhbWV3b3JrIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxOVW5pdFxsaWJcbnVuaXQuZnJhbWV3b3JrLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgIT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodC5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE5Vbml0LWNvbmZpZ1xNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jcyI+DQorICAgICAgPExpbms+TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiPg0KKyAgICAgIDxMaW5rPlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jcyI+DQorICAgICAgPExpbms+U2VyaWFsaXphYmxlQXR0cmlidXRlLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RScGNGb3JNaW1lVHlwZXMuY3MiPg0KKyAgICAgIDxMaW5rPlRlc3RScGNGb3JNaW1lVHlwZXMuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcVGVzdFJwY0dlbmVyYXRvci5jcyI+DQorICAgICAgPExpbms+VGVzdFJwY0dlbmVyYXRvci5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdEJ1aWxkZXJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJpYWxpemFibGVMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdExpdGVCeUFwaS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFJwY0ludGVyb3BMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0VXRpbC5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLk5FVDIwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+e0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnNMaXRlLk5FVDIwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzTGl0ZTwvTmFtZT4NCisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFN0YXJ0QWN0aW9uPlByb2dyYW08L1N0YXJ0QWN0aW9uPg0KKyAgICA8U3RhcnRQcm9ncmFtPiQoUHJvamVjdERpcikuLlwuLlxsaWJcTlVuaXRcdG9vbHNcbnVuaXQtY29uc29sZS5leGU8L1N0YXJ0UHJvZ3JhbT4NCisgICAgPFN0YXJ0QXJndW1lbnRzPi9ub2xvZ28gL25vc2hhZG93IC9sYWJlbHMgL3dhaXQgJChBc3NlbWJseU5hbWUpLmRsbDwvU3RhcnRBcmd1bWVudHM+DQorICAgIDxTdGFydFdvcmtpbmdEaXJlY3Rvcnk+JChQcm9qZWN0RGlyKSQoT3V0cHV0UGF0aCk8L1N0YXJ0V29ya2luZ0RpcmVjdG9yeT4NCisgIDwvUHJvcGVydHlHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0Lk5FVDM1LmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC5ORVQzNS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlYmZlMQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC5ORVQzNS5jc3Byb2oKQEAgLTAsMCArMSwxMjIgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DTElFTlRQUk9GSUxFPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+TkVUMzU8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxFbnZpcm9ubWVudFByb2plY3RUeXBlPlRFU1Q8L0Vudmlyb25tZW50UHJvamVjdFR5cGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57RUUwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVyczwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0PC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMzVcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJudW5pdC5mcmFtZXdvcmsiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE5Vbml0XGxpYlxudW5pdC5mcmFtZXdvcmsuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyAhPSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZywgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTlVuaXQtY29uZmlnXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzIj4NCisgICAgICA8TGluaz5NaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyI+DQorICAgICAgPExpbms+UHJvcGVydGllc1xBc3NlbWJseUluZm8uY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzIj4NCisgICAgICA8TGluaz5TZXJpYWxpemFibGVBdHRyaWJ1dGUuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcVGVzdFJwY0Zvck1pbWVUeXBlcy5jcyI+DQorICAgICAgPExpbms+VGVzdFJwY0Zvck1pbWVUeXBlcy5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxUZXN0UnBjR2VuZXJhdG9yLmNzIj4NCisgICAgICA8TGluaz5UZXN0UnBjR2VuZXJhdG9yLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcmlhbGl6YWJsZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0TGl0ZUJ5QXBpLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0UnBjSW50ZXJvcExpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RVdGlsLmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24uTkVUMzUuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb248L05hbWU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVyc0xpdGUuTkVUMzUuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9OYW1lPg0KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8U3RhcnRBY3Rpb24+UHJvZ3JhbTwvU3RhcnRBY3Rpb24+DQorICAgIDxTdGFydFByb2dyYW0+JChQcm9qZWN0RGlyKS4uXC4uXGxpYlxOVW5pdFx0b29sc1xudW5pdC1jb25zb2xlLmV4ZTwvU3RhcnRQcm9ncmFtPg0KKyAgICA8U3RhcnRBcmd1bWVudHM+L25vbG9nbyAvbm9zaGFkb3cgL2xhYmVscyAvd2FpdCAkKEFzc2VtYmx5TmFtZSkuZGxsPC9TdGFydEFyZ3VtZW50cz4NCisgICAgPFN0YXJ0V29ya2luZ0RpcmVjdG9yeT4kKFByb2plY3REaXIpJChPdXRwdXRQYXRoKTwvU3RhcnRXb3JraW5nRGlyZWN0b3J5Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QuTkVUNDAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0Lk5FVDQwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDJhYzc3Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0Lk5FVDQwLmNzcHJvagpAQCAtMCwwICsxLDEyMiBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQ0MDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPEVudmlyb25tZW50UHJvamVjdFR5cGU+VEVTVDwvRW52aXJvbm1lbnRQcm9qZWN0VHlwZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3Q8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQ0MFxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDQwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDQwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQ0MFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yayI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTlVuaXRcbGliXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknICE9ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodCwgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxOVW5pdC1jb25maWdcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3MiPg0KKyAgICAgIDxMaW5rPk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIj4NCisgICAgICA8TGluaz5Qcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxTZXJpYWxpemFibGVBdHRyaWJ1dGUuY3MiPg0KKyAgICAgIDxMaW5rPlNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxUZXN0UnBjRm9yTWltZVR5cGVzLmNzIj4NCisgICAgICA8TGluaz5UZXN0UnBjRm9yTWltZVR5cGVzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RScGNHZW5lcmF0b3IuY3MiPg0KKyAgICAgIDxMaW5rPlRlc3RScGNHZW5lcmF0b3IuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VyaWFsaXphYmxlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RMaXRlQnlBcGkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RScGNJbnRlcm9wTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFV0aWwuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXFByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5ORVQ0MC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0PntFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbjwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzTGl0ZS5ORVQ0MC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyc0xpdGU8L05hbWU+DQorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxTdGFydEFjdGlvbj5Qcm9ncmFtPC9TdGFydEFjdGlvbj4NCisgICAgPFN0YXJ0UHJvZ3JhbT4kKFByb2plY3REaXIpLi5cLi5cbGliXE5Vbml0XHRvb2xzXG51bml0LWNvbnNvbGUuZXhlPC9TdGFydFByb2dyYW0+DQorICAgIDxTdGFydEFyZ3VtZW50cz4vbm9sb2dvIC9ub3NoYWRvdyAvbGFiZWxzIC93YWl0ICQoQXNzZW1ibHlOYW1lKS5kbGw8L1N0YXJ0QXJndW1lbnRzPg0KKyAgICA8U3RhcnRXb3JraW5nRGlyZWN0b3J5PiQoUHJvamVjdERpcikkKE91dHB1dFBhdGgpPC9TdGFydFdvcmtpbmdEaXJlY3Rvcnk+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC5QTDQwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC5QTDQwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjQ1YTAxCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0LlBMNDAuY3Nwcm9qCkBAIC0wLDAgKzEsMTU2IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiB4bWxuczpjcz0idXJuOnNjaGVtYXMtY3NoYXJwLXByb2plY3Q6dGVtcGxhdGUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5QT1JUQUJMRV9MSUJSQVJZPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+UEw0MDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPEVudmlyb25tZW50UHJvamVjdFR5cGU+VEVTVDwvRW52aXJvbm1lbnRQcm9qZWN0VHlwZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3Q8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgICAgPE1pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uPjEwLjA8L01pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfTt7ZmFlMDRlYzAtMzAxZi0xMWQzLWJmNGItMDBjMDRmNzllZmJjfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFRhcmdldEZyYW1ld29ya1Byb2ZpbGUgLz4NCisgICAgPFZhbGlkYXRlWGFtbD5mYWxzZTwvVmFsaWRhdGVYYW1sPg0KKyAgICA8VGhyb3dFcnJvcnNJblZhbGlkYXRpb24+ZmFsc2U8L1Rocm93RXJyb3JzSW5WYWxpZGF0aW9uPg0KKyAgICA8U2lsdmVybGlnaHRBcHBsaWNhdGlvbj50cnVlPC9TaWx2ZXJsaWdodEFwcGxpY2F0aW9uPg0KKyAgICA8WGFwT3V0cHV0cz50cnVlPC9YYXBPdXRwdXRzPg0KKyAgICA8R2VuZXJhdGVTaWx2ZXJsaWdodE1hbmlmZXN0PnRydWU8L0dlbmVyYXRlU2lsdmVybGlnaHRNYW5pZmVzdD4NCisgICAgPFhhcEZpbGVuYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QueGFwPC9YYXBGaWxlbmFtZT4NCisgICAgPFNpbHZlcmxpZ2h0TWFuaWZlc3RUZW1wbGF0ZT5Qcm9wZXJ0aWVzXEFwcE1hbmlmZXN0LnhtbDwvU2lsdmVybGlnaHRNYW5pZmVzdFRlbXBsYXRlPg0KKyAgICA8U2lsdmVybGlnaHRBcHBFbnRyeT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLkFwcDwvU2lsdmVybGlnaHRBcHBFbnRyeT4NCisgICAgPFRlc3RQYWdlRmlsZU5hbWU+VGVzdFBhZ2UuaHRtbDwvVGVzdFBhZ2VGaWxlTmFtZT4NCisgICAgPENyZWF0ZVRlc3RQYWdlPnRydWU8L0NyZWF0ZVRlc3RQYWdlPg0KKyAgICA8U2lsdmVybGlnaHRWZXJzaW9uPnY0LjA8L1NpbHZlcmxpZ2h0VmVyc2lvbj4NCisgICAgPE91dE9mQnJvd3NlclNldHRpbmdzRmlsZT5Qcm9wZXJ0aWVzXE91dE9mQnJvd3NlclNldHRpbmdzLnhtbDwvT3V0T2ZCcm93c2VyU2V0dGluZ3NGaWxlPg0KKyAgICA8RW5hYmxlT3V0T2ZCcm93c2VyPnRydWU8L0VuYWJsZU91dE9mQnJvd3Nlcj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxQTDQwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcUEw0MFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cUEw0MFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcUEw0MFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldpbmRvd3MiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldpbmRvd3MuQnJvd3NlciIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yayI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTlVuaXRcbGliXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknICE9ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodCwgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxOVW5pdC1jb25maWdcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3MiPg0KKyAgICAgIDxMaW5rPk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIj4NCisgICAgICA8TGluaz5Qcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxTZXJpYWxpemFibGVBdHRyaWJ1dGUuY3MiPg0KKyAgICAgIDxMaW5rPlNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxUZXN0UnBjRm9yTWltZVR5cGVzLmNzIj4NCisgICAgICA8TGluaz5UZXN0UnBjRm9yTWltZVR5cGVzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RScGNHZW5lcmF0b3IuY3MiPg0KKyAgICAgIDxMaW5rPlRlc3RScGNHZW5lcmF0b3IuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VyaWFsaXphYmxlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RMaXRlQnlBcGkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RScGNJbnRlcm9wTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFwcC54YW1sLmNzIj4NCisgICAgICA8RGVwZW5kZW50VXBvbj5BcHAueGFtbDwvRGVwZW5kZW50VXBvbj4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFwcE1hbmlmZXN0LnhtbCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iUHJvcGVydGllc1xPdXRPZkJyb3dzZXJTZXR0aW5ncy54bWwiIC8+DQorICAgIDxBcHBsaWNhdGlvbkRlZmluaXRpb24gSW5jbHVkZT0iQXBwLnhhbWwiPg0KKyAgICAgIDxHZW5lcmF0b3I+TVNCdWlsZDpDb21waWxlPC9HZW5lcmF0b3I+DQorICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+DQorICAgIDwvQXBwbGljYXRpb25EZWZpbml0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24uUEw0MC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0PntFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbjwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzTGl0ZS5QTDQwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzTGl0ZTwvTmFtZT4NCisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0XCQoU2lsdmVybGlnaHRWZXJzaW9uKVxNaWNyb3NvZnQuU2lsdmVybGlnaHQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn0iPg0KKyAgICAgICAgPFNpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXMgLz4NCisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+DQorICAgIDwvVmlzdWFsU3R1ZGlvPg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8U3RhcnRBY3Rpb24+UHJvZ3JhbTwvU3RhcnRBY3Rpb24+DQorICAgIDxTdGFydFByb2dyYW0+JChQcm9qZWN0RGlyKS4uXC4uXGxpYlxOVW5pdFx0b29sc1xudW5pdC1jb25zb2xlLmV4ZTwvU3RhcnRQcm9ncmFtPg0KKyAgICA8U3RhcnRBcmd1bWVudHM+L25vbG9nbyAvbm9zaGFkb3cgL2xhYmVscyAvd2FpdCAkKEFzc2VtYmx5TmFtZSkuZGxsPC9TdGFydEFyZ3VtZW50cz4NCisgICAgPFN0YXJ0V29ya2luZ0RpcmVjdG9yeT4kKFByb2plY3REaXIpJChPdXRwdXRQYXRoKTwvU3RhcnRXb3JraW5nRGlyZWN0b3J5Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QuU0wyMC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QuU0wyMC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhZDk0NgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC5TTDIwLmNzcHJvagpAQCAtMCwwICsxLDE1NyBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyIgeG1sbnM6Y3M9InVybjpzY2hlbWFzLWNzaGFycC1wcm9qZWN0OnRlbXBsYXRlIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+U0lMVkVSTElHSFQ8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5TTDIwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8RW52aXJvbm1lbnRQcm9qZWN0VHlwZT5URVNUPC9FbnZpcm9ubWVudFByb2plY3RUeXBlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVyc0xpdGUuVGVzdDwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52Mi4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfTt7ZmFlMDRlYzAtMzAxZi0xMWQzLWJmNGItMDBjMDRmNzllZmJjfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFNpbHZlcmxpZ2h0QXBwbGljYXRpb24+dHJ1ZTwvU2lsdmVybGlnaHRBcHBsaWNhdGlvbj4NCisgICAgPFZhbGlkYXRlWGFtbD5mYWxzZTwvVmFsaWRhdGVYYW1sPg0KKyAgICA8VGhyb3dFcnJvcnNJblZhbGlkYXRpb24+ZmFsc2U8L1Rocm93RXJyb3JzSW5WYWxpZGF0aW9uPg0KKyAgICA8WGFwT3V0cHV0cz50cnVlPC9YYXBPdXRwdXRzPg0KKyAgICA8R2VuZXJhdGVTaWx2ZXJsaWdodE1hbmlmZXN0PnRydWU8L0dlbmVyYXRlU2lsdmVybGlnaHRNYW5pZmVzdD4NCisgICAgPFhhcEZpbGVuYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QueGFwPC9YYXBGaWxlbmFtZT4NCisgICAgPFNpbHZlcmxpZ2h0TWFuaWZlc3RUZW1wbGF0ZT5Qcm9wZXJ0aWVzXEFwcE1hbmlmZXN0LnhtbDwvU2lsdmVybGlnaHRNYW5pZmVzdFRlbXBsYXRlPg0KKyAgICA8U2lsdmVybGlnaHRBcHBFbnRyeT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLkFwcDwvU2lsdmVybGlnaHRBcHBFbnRyeT4NCisgICAgPFRlc3RQYWdlRmlsZU5hbWU+VGVzdFBhZ2UuaHRtbDwvVGVzdFBhZ2VGaWxlTmFtZT4NCisgICAgPENyZWF0ZVRlc3RQYWdlPnRydWU8L0NyZWF0ZVRlc3RQYWdlPg0KKyAgICA8U2lsdmVybGlnaHRWZXJzaW9uPnYyLjA8L1NpbHZlcmxpZ2h0VmVyc2lvbj4NCisgICAgPE91dE9mQnJvd3NlclNldHRpbmdzRmlsZT5Qcm9wZXJ0aWVzXE91dE9mQnJvd3NlclNldHRpbmdzLnhtbDwvT3V0T2ZCcm93c2VyU2V0dGluZ3NGaWxlPg0KKyAgICA8RW5hYmxlT3V0T2ZCcm93c2VyPnRydWU8L0VuYWJsZU91dE9mQnJvd3Nlcj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDIwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0wyMFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q7Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cU0wyMFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0wyMFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldpbmRvd3MiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldpbmRvd3MuQnJvd3NlciIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yayI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTlVuaXRcbGliXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknICE9ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodCwgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxOVW5pdC1jb25maWdcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3MiPg0KKyAgICAgIDxMaW5rPk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIj4NCisgICAgICA8TGluaz5Qcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxTZXJpYWxpemFibGVBdHRyaWJ1dGUuY3MiPg0KKyAgICAgIDxMaW5rPlNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxUZXN0UnBjRm9yTWltZVR5cGVzLmNzIj4NCisgICAgICA8TGluaz5UZXN0UnBjRm9yTWltZVR5cGVzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RScGNHZW5lcmF0b3IuY3MiPg0KKyAgICAgIDxMaW5rPlRlc3RScGNHZW5lcmF0b3IuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VyaWFsaXphYmxlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RMaXRlQnlBcGkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RScGNJbnRlcm9wTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFwcC54YW1sLmNzIj4NCisgICAgICA8RGVwZW5kZW50VXBvbj5BcHAueGFtbDwvRGVwZW5kZW50VXBvbj4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFwcE1hbmlmZXN0LnhtbCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iUHJvcGVydGllc1xPdXRPZkJyb3dzZXJTZXR0aW5ncy54bWwiIC8+DQorICAgIDxBcHBsaWNhdGlvbkRlZmluaXRpb24gSW5jbHVkZT0iQXBwLnhhbWwiPg0KKyAgICAgIDxHZW5lcmF0b3I+TVNCdWlsZDpDb21waWxlPC9HZW5lcmF0b3I+DQorICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+DQorICAgIDwvQXBwbGljYXRpb25EZWZpbml0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuU2VyaWFsaXphdGlvblxQcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb24uU0wyMC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0PntFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbjwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzTGl0ZS5TTDIwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezY5NjlCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzTGl0ZTwvTmFtZT4NCisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0XHYyLjBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8VmlzdWFsU3R1ZGlvPg0KKyAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9IntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9Ij4NCisgICAgICAgIDxTaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgICAgICA8U3RhcnRBY3Rpb24+T2ZmbGluZUFwcGxpY2F0aW9uPC9TdGFydEFjdGlvbj4NCisgICAgICAgIDwvU2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+DQorICAgIDwvVmlzdWFsU3R1ZGlvPg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8U3RhcnRBY3Rpb24+UHJvZ3JhbTwvU3RhcnRBY3Rpb24+DQorICAgIDxTdGFydFByb2dyYW0+JChQcm9qZWN0RGlyKS4uXC4uXGxpYlxOVW5pdFx0b29sc1xudW5pdC1jb25zb2xlLmV4ZTwvU3RhcnRQcm9ncmFtPg0KKyAgICA8U3RhcnRBcmd1bWVudHM+L25vbG9nbyAvbm9zaGFkb3cgL2xhYmVscyAvd2FpdCAkKEFzc2VtYmx5TmFtZSkuZGxsPC9TdGFydEFyZ3VtZW50cz4NCisgICAgPFN0YXJ0V29ya2luZ0RpcmVjdG9yeT4kKFByb2plY3REaXIpJChPdXRwdXRQYXRoKTwvU3RhcnRXb3JraW5nRGlyZWN0b3J5Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QuU0wzMC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QuU0wzMC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4NzBlZAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC5TTDMwLmNzcHJvagpAQCAtMCwwICsxLDE1OCBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyIgeG1sbnM6Y3M9InVybjpzY2hlbWFzLWNzaGFycC1wcm9qZWN0OnRlbXBsYXRlIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+U0lMVkVSTElHSFQ8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5TTDMwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8RW52aXJvbm1lbnRQcm9qZWN0VHlwZT5URVNUPC9FbnZpcm9ubWVudFByb2plY3RUeXBlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0VFMDFFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVyc0xpdGUuVGVzdDwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfTt7ZmFlMDRlYzAtMzAxZi0xMWQzLWJmNGItMDBjMDRmNzllZmJjfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFNpbHZlcmxpZ2h0QXBwbGljYXRpb24+dHJ1ZTwvU2lsdmVybGlnaHRBcHBsaWNhdGlvbj4NCisgICAgPFZhbGlkYXRlWGFtbD5mYWxzZTwvVmFsaWRhdGVYYW1sPg0KKyAgICA8VGhyb3dFcnJvcnNJblZhbGlkYXRpb24+ZmFsc2U8L1Rocm93RXJyb3JzSW5WYWxpZGF0aW9uPg0KKyAgICA8WGFwT3V0cHV0cz50cnVlPC9YYXBPdXRwdXRzPg0KKyAgICA8R2VuZXJhdGVTaWx2ZXJsaWdodE1hbmlmZXN0PnRydWU8L0dlbmVyYXRlU2lsdmVybGlnaHRNYW5pZmVzdD4NCisgICAgPFhhcEZpbGVuYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QueGFwPC9YYXBGaWxlbmFtZT4NCisgICAgPFNpbHZlcmxpZ2h0TWFuaWZlc3RUZW1wbGF0ZT5Qcm9wZXJ0aWVzXEFwcE1hbmlmZXN0LnhtbDwvU2lsdmVybGlnaHRNYW5pZmVzdFRlbXBsYXRlPg0KKyAgICA8U2lsdmVybGlnaHRBcHBFbnRyeT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLkFwcDwvU2lsdmVybGlnaHRBcHBFbnRyeT4NCisgICAgPFRlc3RQYWdlRmlsZU5hbWU+VGVzdFBhZ2UuaHRtbDwvVGVzdFBhZ2VGaWxlTmFtZT4NCisgICAgPENyZWF0ZVRlc3RQYWdlPnRydWU8L0NyZWF0ZVRlc3RQYWdlPg0KKyAgICA8U2lsdmVybGlnaHRWZXJzaW9uPnYzLjU8L1NpbHZlcmxpZ2h0VmVyc2lvbj4NCisgICAgPE91dE9mQnJvd3NlclNldHRpbmdzRmlsZT5Qcm9wZXJ0aWVzXE91dE9mQnJvd3NlclNldHRpbmdzLnhtbDwvT3V0T2ZCcm93c2VyU2V0dGluZ3NGaWxlPg0KKyAgICA8RW5hYmxlT3V0T2ZCcm93c2VyPnRydWU8L0VuYWJsZU91dE9mQnJvd3Nlcj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDMwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0wzMFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDMwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDMwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XaW5kb3dzIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XaW5kb3dzLkJyb3dzZXIiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJudW5pdC5mcmFtZXdvcmsiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE5Vbml0XGxpYlxudW5pdC5mcmFtZXdvcmsuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyAhPSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZywgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTlVuaXQtY29uZmlnXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzIj4NCisgICAgICA8TGluaz5NaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyI+DQorICAgICAgPExpbms+UHJvcGVydGllc1xBc3NlbWJseUluZm8uY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzIj4NCisgICAgICA8TGluaz5TZXJpYWxpemFibGVBdHRyaWJ1dGUuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcVGVzdFJwY0Zvck1pbWVUeXBlcy5jcyI+DQorICAgICAgPExpbms+VGVzdFJwY0Zvck1pbWVUeXBlcy5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxUZXN0UnBjR2VuZXJhdG9yLmNzIj4NCisgICAgICA8TGluaz5UZXN0UnBjR2VuZXJhdG9yLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcmlhbGl6YWJsZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0TGl0ZUJ5QXBpLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0UnBjSW50ZXJvcExpdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RVdGlsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBcHAueGFtbC5jcyI+DQorICAgICAgPERlcGVuZGVudFVwb24+QXBwLnhhbWw8L0RlcGVuZGVudFVwb24+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iUHJvcGVydGllc1xBcHBNYW5pZmVzdC54bWwiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9IlByb3BlcnRpZXNcT3V0T2ZCcm93c2VyU2V0dGluZ3MueG1sIiAvPg0KKyAgICA8QXBwbGljYXRpb25EZWZpbml0aW9uIEluY2x1ZGU9IkFwcC54YW1sIj4NCisgICAgICA8R2VuZXJhdG9yPk1TQnVpbGQ6Q29tcGlsZTwvR2VuZXJhdG9yPg0KKyAgICAgIDxTdWJUeXBlPkRlc2lnbmVyPC9TdWJUeXBlPg0KKyAgICA8L0FwcGxpY2F0aW9uRGVmaW5pdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlNlcmlhbGl6YXRpb25cUHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uLlNMMzAuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57RTA2N0E1OUQtOUQwQS00QTFGLTkyQjEtMzhFNDQ1NzI0MUQxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlNlcmlhbGl6YXRpb248L05hbWU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVyc0xpdGUuU0wzMC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyc0xpdGU8L05hbWU+DQorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoMzIpXE1pY3Jvc29mdFxTaWx2ZXJsaWdodFx2My4wXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfSI+DQorICAgICAgICA8U2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICAgICAgPFN0YXJ0QWN0aW9uPk9mZmxpbmVBcHBsaWNhdGlvbjwvU3RhcnRBY3Rpb24+DQorICAgICAgICA8L1NpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFN0YXJ0QWN0aW9uPlByb2dyYW08L1N0YXJ0QWN0aW9uPg0KKyAgICA8U3RhcnRQcm9ncmFtPiQoUHJvamVjdERpcikuLlwuLlxsaWJcTlVuaXRcdG9vbHNcbnVuaXQtY29uc29sZS5leGU8L1N0YXJ0UHJvZ3JhbT4NCisgICAgPFN0YXJ0QXJndW1lbnRzPi9ub2xvZ28gL25vc2hhZG93IC9sYWJlbHMgL3dhaXQgJChBc3NlbWJseU5hbWUpLmRsbDwvU3RhcnRBcmd1bWVudHM+DQorICAgIDxTdGFydFdvcmtpbmdEaXJlY3Rvcnk+JChQcm9qZWN0RGlyKSQoT3V0cHV0UGF0aCk8L1N0YXJ0V29ya2luZ0RpcmVjdG9yeT4NCisgIDwvUHJvcGVydHlHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0LlNMNDAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0LlNMNDAuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTU0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QuU0w0MC5jc3Byb2oKQEAgLTAsMCArMSwxNTggQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiIHhtbG5zOmNzPSJ1cm46c2NoZW1hcy1jc2hhcnAtcHJvamVjdDp0ZW1wbGF0ZSI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPlNJTFZFUkxJR0hUPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+U0w0MDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPEVudmlyb25tZW50UHJvamVjdFR5cGU+VEVTVDwvRW52aXJvbm1lbnRQcm9qZWN0VHlwZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3Q8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+e0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn07e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxTaWx2ZXJsaWdodEFwcGxpY2F0aW9uPnRydWU8L1NpbHZlcmxpZ2h0QXBwbGljYXRpb24+DQorICAgIDxWYWxpZGF0ZVhhbWw+ZmFsc2U8L1ZhbGlkYXRlWGFtbD4NCisgICAgPFRocm93RXJyb3JzSW5WYWxpZGF0aW9uPmZhbHNlPC9UaHJvd0Vycm9yc0luVmFsaWRhdGlvbj4NCisgICAgPFNpbHZlcmxpZ2h0VmVyc2lvbj52NC4wPC9TaWx2ZXJsaWdodFZlcnNpb24+DQorICAgIDxYYXBPdXRwdXRzPnRydWU8L1hhcE91dHB1dHM+DQorICAgIDxHZW5lcmF0ZVNpbHZlcmxpZ2h0TWFuaWZlc3Q+dHJ1ZTwvR2VuZXJhdGVTaWx2ZXJsaWdodE1hbmlmZXN0Pg0KKyAgICA8WGFwRmlsZW5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVyc0xpdGUuVGVzdC54YXA8L1hhcEZpbGVuYW1lPg0KKyAgICA8U2lsdmVybGlnaHRNYW5pZmVzdFRlbXBsYXRlPlByb3BlcnRpZXNcQXBwTWFuaWZlc3QueG1sPC9TaWx2ZXJsaWdodE1hbmlmZXN0VGVtcGxhdGU+DQorICAgIDxTaWx2ZXJsaWdodEFwcEVudHJ5Pkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQXBwPC9TaWx2ZXJsaWdodEFwcEVudHJ5Pg0KKyAgICA8VGVzdFBhZ2VGaWxlTmFtZT5UZXN0UGFnZS5odG1sPC9UZXN0UGFnZUZpbGVOYW1lPg0KKyAgICA8Q3JlYXRlVGVzdFBhZ2U+dHJ1ZTwvQ3JlYXRlVGVzdFBhZ2U+DQorICAgIDxPdXRPZkJyb3dzZXJTZXR0aW5nc0ZpbGU+UHJvcGVydGllc1xPdXRPZkJyb3dzZXJTZXR0aW5ncy54bWw8L091dE9mQnJvd3NlclNldHRpbmdzRmlsZT4NCisgICAgPEVuYWJsZU91dE9mQnJvd3Nlcj50cnVlPC9FbmFibGVPdXRPZkJyb3dzZXI+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cU0w0MFxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXFNMNDBcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cU0w0MFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0w0MFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2luZG93cyIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2luZG93cy5Ccm93c2VyIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibnVuaXQuZnJhbWV3b3JrIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxOVW5pdFxsaWJcbnVuaXQuZnJhbWV3b3JrLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgIT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodC5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE5Vbml0LWNvbmZpZ1xNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jcyI+DQorICAgICAgPExpbms+TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiPg0KKyAgICAgIDxMaW5rPlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jcyI+DQorICAgICAgPExpbms+U2VyaWFsaXphYmxlQXR0cmlidXRlLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RScGNGb3JNaW1lVHlwZXMuY3MiPg0KKyAgICAgIDxMaW5rPlRlc3RScGNGb3JNaW1lVHlwZXMuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcVGVzdFJwY0dlbmVyYXRvci5jcyI+DQorICAgICAgPExpbms+VGVzdFJwY0dlbmVyYXRvci5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdEJ1aWxkZXJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJpYWxpemFibGVMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdExpdGVCeUFwaS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFJwY0ludGVyb3BMaXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0VXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXBwLnhhbWwuY3MiPg0KKyAgICAgIDxEZXBlbmRlbnRVcG9uPkFwcC54YW1sPC9EZXBlbmRlbnRVcG9uPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxOb25lIEluY2x1ZGU9IlByb3BlcnRpZXNcQXBwTWFuaWZlc3QueG1sIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXE91dE9mQnJvd3NlclNldHRpbmdzLnhtbCIgLz4NCisgICAgPEFwcGxpY2F0aW9uRGVmaW5pdGlvbiBJbmNsdWRlPSJBcHAueGFtbCI+DQorICAgICAgPEdlbmVyYXRvcj5NU0J1aWxkOkNvbXBpbGU8L0dlbmVyYXRvcj4NCisgICAgICA8U3ViVHlwZT5EZXNpZ25lcjwvU3ViVHlwZT4NCisgICAgPC9BcHBsaWNhdGlvbkRlZmluaXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXFByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5TTDQwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+e0UwNjdBNTlELTlEMEEtNEExRi05MkIxLTM4RTQ0NTcyNDFEMX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzTGl0ZS5TZXJpYWxpemF0aW9uPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnNMaXRlLlNMNDAuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57Njk2OUJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnNMaXRlPC9OYW1lPg0KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcU2lsdmVybGlnaHRcJChTaWx2ZXJsaWdodFZlcnNpb24pXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfSI+DQorICAgICAgICA8U2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICAgICAgPFN0YXJ0QWN0aW9uPk9mZmxpbmVBcHBsaWNhdGlvbjwvU3RhcnRBY3Rpb24+DQorICAgICAgICA8L1NpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFN0YXJ0QWN0aW9uPlByb2dyYW08L1N0YXJ0QWN0aW9uPg0KKyAgICA8U3RhcnRQcm9ncmFtPiQoUHJvamVjdERpcikuLlwuLlxsaWJcTlVuaXRcdG9vbHNcbnVuaXQtY29uc29sZS5leGU8L1N0YXJ0UHJvZ3JhbT4NCisgICAgPFN0YXJ0QXJndW1lbnRzPi9ub2xvZ28gL25vc2hhZG93IC9sYWJlbHMgL3dhaXQgJChBc3NlbWJseU5hbWUpLmRsbDwvU3RhcnRBcmd1bWVudHM+DQorICAgIDxTdGFydFdvcmtpbmdEaXJlY3Rvcnk+JChQcm9qZWN0RGlyKSQoT3V0cHV0UGF0aCk8L1N0YXJ0V29ya2luZ0RpcmVjdG9yeT4NCisgIDwvUHJvcGVydHlHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0LmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxYWFmOAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC5jc3Byb2oKQEAgLTAsMCArMSwxMjIgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQzNTwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPEVudmlyb25tZW50UHJvamVjdFR5cGU+VEVTVDwvRW52aXJvbm1lbnRQcm9qZWN0VHlwZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntFRTAxRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3Q8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDM1XERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yayI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTlVuaXRcbGliXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknICE9ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodCwgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxOVW5pdC1jb25maWdcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3MiPg0KKyAgICAgIDxMaW5rPk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIj4NCisgICAgICA8TGluaz5Qcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxTZXJpYWxpemFibGVBdHRyaWJ1dGUuY3MiPg0KKyAgICAgIDxMaW5rPlNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxUZXN0UnBjRm9yTWltZVR5cGVzLmNzIj4NCisgICAgICA8TGluaz5UZXN0UnBjRm9yTWltZVR5cGVzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFRlc3RScGNHZW5lcmF0b3IuY3MiPg0KKyAgICAgIDxMaW5rPlRlc3RScGNHZW5lcmF0b3IuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VyaWFsaXphYmxlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RMaXRlQnlBcGkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RScGNJbnRlcm9wTGl0ZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFV0aWwuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5TZXJpYWxpemF0aW9uXFByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbi5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0PntFMDY3QTU5RC05RDBBLTRBMUYtOTJCMS0zOEU0NDU3MjQxRDF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyc0xpdGUuU2VyaWFsaXphdGlvbjwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzTGl0ZS5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTY5QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyc0xpdGU8L05hbWU+DQorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxTdGFydEFjdGlvbj5Qcm9ncmFtPC9TdGFydEFjdGlvbj4NCisgICAgPFN0YXJ0UHJvZ3JhbT4kKFByb2plY3REaXIpLi5cLi5cbGliXE5Vbml0XHRvb2xzXG51bml0LWNvbnNvbGUuZXhlPC9TdGFydFByb2dyYW0+DQorICAgIDxTdGFydEFyZ3VtZW50cz4vbm9sb2dvIC9ub3NoYWRvdyAvbGFiZWxzIC93YWl0ICQoQXNzZW1ibHlOYW1lKS5kbGw8L1N0YXJ0QXJndW1lbnRzPg0KKyAgICA8U3RhcnRXb3JraW5nRGlyZWN0b3J5PiQoUHJvamVjdERpcikkKE91dHB1dFBhdGgpPC9TdGFydFdvcmtpbmdEaXJlY3Rvcnk+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0LkNGMjAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QuQ0YyMC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkM2IzNgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0LkNGMjAuY3Nwcm9qCkBAIC0wLDAgKzEsMTI2IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q09NUEFDVF9GUkFNRVdPUks8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5DRjIwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8RW52aXJvbm1lbnRQcm9qZWN0VHlwZT5URVNUPC9FbnZpcm9ubWVudFByb2plY3RUeXBlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVyc01peGVkTGl0ZS5UZXN0PC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYyLjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPns0RDYyOEI1Qi0yRkJDLTRBQTYtOEMxNi0xOTcyNDJBRUI4ODR9O3tGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8UGxhdGZvcm1GYW1pbHlOYW1lPlNtYXJ0cGhvbmU8L1BsYXRmb3JtRmFtaWx5TmFtZT4NCisgICAgPFBsYXRmb3JtSUQ+ZjI3ZGEzMjktMzI2OS00MTkxLTk4ZTAtYzg3ZDNkN2YxZGI5PC9QbGF0Zm9ybUlEPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXENGMjBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxDRjIwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PRklMRVZFUlNJT047Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cQ0YyMFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcQ0YyMFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PRklMRVZFUlNJT047Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibnVuaXQuZnJhbWV3b3JrIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxOVW5pdFxsaWJcbnVuaXQuZnJhbWV3b3JrLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgIT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodC5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE5Vbml0LWNvbmZpZ1xNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jcyI+DQorICAgICAgPExpbms+TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiPg0KKyAgICAgIDxMaW5rPlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jcyI+DQorICAgICAgPExpbms+U2VyaWFsaXphYmxlQXR0cmlidXRlLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSW50ZXJvcExpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWlzc2luZ0ZpZWxkQW5kRXh0ZW5zaW9uVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdExpdGVCeUFwaS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc0Z1bGxQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdExpdGVJbXBvcnROb25MaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFV0aWwuY3MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuQ0YyMC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5Db21wYWN0RnJhbWV3b3JrLkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8VmlzdWFsU3R1ZGlvPg0KKyAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9IntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9Ij4NCisgICAgICAgIDxIb3N0aW5nUHJvY2VzcyBkaXNhYmxlPSIxIiAvPg0KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4NCisgICAgPC9WaXN1YWxTdHVkaW8+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxTdGFydEFjdGlvbj5Qcm9ncmFtPC9TdGFydEFjdGlvbj4NCisgICAgPFN0YXJ0UHJvZ3JhbT4kKFByb2plY3REaXIpLi5cLi5cbGliXE5Vbml0XHRvb2xzXG51bml0LWNvbnNvbGUuZXhlPC9TdGFydFByb2dyYW0+DQorICAgIDxTdGFydEFyZ3VtZW50cz4vbm9sb2dvIC9ub3NoYWRvdyAvbGFiZWxzIC93YWl0ICQoQXNzZW1ibHlOYW1lKS5kbGw8L1N0YXJ0QXJndW1lbnRzPg0KKyAgICA8U3RhcnRXb3JraW5nRGlyZWN0b3J5PiQoUHJvamVjdERpcikkKE91dHB1dFBhdGgpPC9TdGFydFdvcmtpbmdEaXJlY3Rvcnk+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0LkNGMzUuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QuQ0YzNS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkNGU2NAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0LkNGMzUuY3Nwcm9qCkBAIC0wLDAgKzEsMTI3IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q09NUEFDVF9GUkFNRVdPUks8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5DRjM1PC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8RW52aXJvbm1lbnRQcm9qZWN0VHlwZT5URVNUPC9FbnZpcm9ubWVudFByb2plY3RUeXBlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVyc01peGVkTGl0ZS5UZXN0PC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPns0RDYyOEI1Qi0yRkJDLTRBQTYtOEMxNi0xOTcyNDJBRUI4ODR9O3tGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8UGxhdGZvcm1GYW1pbHlOYW1lPlNtYXJ0cGhvbmU8L1BsYXRmb3JtRmFtaWx5TmFtZT4NCisgICAgPFBsYXRmb3JtSUQ+ZjI3ZGEzMjktMzI2OS00MTkxLTk4ZTAtYzg3ZDNkN2YxZGI5PC9QbGF0Zm9ybUlEPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXENGMzVcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxDRjM1XERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PRklMRVZFUlNJT048L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxDRjM1XFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxDRjM1XFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9GSUxFVkVSU0lPTjwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yayI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTlVuaXRcbGliXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknICE9ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodCwgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxOVW5pdC1jb25maWdcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3MiPg0KKyAgICAgIDxMaW5rPk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIj4NCisgICAgICA8TGluaz5Qcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxTZXJpYWxpemFibGVBdHRyaWJ1dGUuY3MiPg0KKyAgICAgIDxMaW5rPlNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdEJ1aWxkZXJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkludGVyb3BMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1pc3NpbmdGaWVsZEFuZEV4dGVuc2lvblRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RMaXRlQnlBcGkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RMaXRlSW1wb3J0Tm9uTGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RVdGlsLmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzLkNGMzUuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnM8L05hbWU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ29tcGFjdEZyYW1ld29yay5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSI+DQorICAgICAgICA8SG9zdGluZ1Byb2Nlc3MgZGlzYWJsZT0iMSIgLz4NCisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+DQorICAgIDwvVmlzdWFsU3R1ZGlvPg0KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4NCisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCisgIDwvVGFyZ2V0Pg0KKyAgLS0+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8U3RhcnRBY3Rpb24+UHJvZ3JhbTwvU3RhcnRBY3Rpb24+DQorICAgIDxTdGFydFByb2dyYW0+JChQcm9qZWN0RGlyKS4uXC4uXGxpYlxOVW5pdFx0b29sc1xudW5pdC1jb25zb2xlLmV4ZTwvU3RhcnRQcm9ncmFtPg0KKyAgICA8U3RhcnRBcmd1bWVudHM+L25vbG9nbyAvbm9zaGFkb3cgL2xhYmVscyAvd2FpdCAkKEFzc2VtYmx5TmFtZSkuZGxsPC9TdGFydEFyZ3VtZW50cz4NCisgICAgPFN0YXJ0V29ya2luZ0RpcmVjdG9yeT4kKFByb2plY3REaXIpJChPdXRwdXRQYXRoKTwvU3RhcnRXb3JraW5nRGlyZWN0b3J5Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm90b2NvbEJ1ZmZlcnNMaXRlTWl4ZWQuVGVzdC5ORVQyMC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm90b2NvbEJ1ZmZlcnNMaXRlTWl4ZWQuVGVzdC5ORVQyMC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1OTNhNAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0Lk5FVDIwLmNzcHJvagpAQCAtMCwwICsxLDExNCBAQAor77u/PFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPkNMSUVOVFBST0ZJTEU8L0Vudmlyb25tZW50Rmxhdm9yPg0KKyAgICA8RW52aXJvbm1lbnRUZW1wbGF0ZT5ORVQyMDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPEVudmlyb25tZW50UHJvamVjdFR5cGU+VEVTVDwvRW52aXJvbm1lbnRQcm9qZWN0VHlwZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNNaXhlZExpdGUuVGVzdDwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52Mi4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDIwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMjBcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9FWFRFTlNJT05TPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDIwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQyMFxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PRVhURU5TSU9OUzwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJudW5pdC5mcmFtZXdvcmsiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE5Vbml0XGxpYlxudW5pdC5mcmFtZXdvcmsuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyAhPSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZywgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTlVuaXQtY29uZmlnXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzIj4NCisgICAgICA8TGluaz5NaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyI+DQorICAgICAgPExpbms+UHJvcGVydGllc1xBc3NlbWJseUluZm8uY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzIj4NCisgICAgICA8TGluaz5TZXJpYWxpemFibGVBdHRyaWJ1dGUuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJbnRlcm9wTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNaXNzaW5nRmllbGRBbmRFeHRlbnNpb25UZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0TGl0ZUJ5QXBpLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzRnVsbFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0TGl0ZUltcG9ydE5vbkxpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0VXRpbC5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5ORVQyMC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxTdGFydEFjdGlvbj5Qcm9ncmFtPC9TdGFydEFjdGlvbj4NCisgICAgPFN0YXJ0UHJvZ3JhbT4kKFByb2plY3REaXIpLi5cLi5cbGliXE5Vbml0XHRvb2xzXG51bml0LWNvbnNvbGUuZXhlPC9TdGFydFByb2dyYW0+DQorICAgIDxTdGFydEFyZ3VtZW50cz4vbm9sb2dvIC9ub3NoYWRvdyAvbGFiZWxzIC93YWl0ICQoQXNzZW1ibHlOYW1lKS5kbGw8L1N0YXJ0QXJndW1lbnRzPg0KKyAgICA8U3RhcnRXb3JraW5nRGlyZWN0b3J5PiQoUHJvamVjdERpcikkKE91dHB1dFBhdGgpPC9TdGFydFdvcmtpbmdEaXJlY3Rvcnk+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0Lk5FVDM1LmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0Lk5FVDM1LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGI2ZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QuTkVUMzUuY3Nwcm9qCkBAIC0wLDAgKzEsMTE1IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q0xJRU5UUFJPRklMRTwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPk5FVDM1PC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8RW52aXJvbm1lbnRQcm9qZWN0VHlwZT5URVNUPC9FbnZpcm9ubWVudFByb2plY3RUeXBlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVyc01peGVkTGl0ZS5UZXN0PC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUMzVcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUMzVcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJudW5pdC5mcmFtZXdvcmsiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE5Vbml0XGxpYlxudW5pdC5mcmFtZXdvcmsuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyAhPSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZywgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTlVuaXQtY29uZmlnXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzIj4NCisgICAgICA8TGluaz5NaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyI+DQorICAgICAgPExpbms+UHJvcGVydGllc1xBc3NlbWJseUluZm8uY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzIj4NCisgICAgICA8TGluaz5TZXJpYWxpemFibGVBdHRyaWJ1dGUuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJbnRlcm9wTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNaXNzaW5nRmllbGRBbmRFeHRlbnNpb25UZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0TGl0ZUJ5QXBpLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzRnVsbFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0TGl0ZUltcG9ydE5vbkxpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0VXRpbC5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5ORVQzNS5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxTdGFydEFjdGlvbj5Qcm9ncmFtPC9TdGFydEFjdGlvbj4NCisgICAgPFN0YXJ0UHJvZ3JhbT4kKFByb2plY3REaXIpLi5cLi5cbGliXE5Vbml0XHRvb2xzXG51bml0LWNvbnNvbGUuZXhlPC9TdGFydFByb2dyYW0+DQorICAgIDxTdGFydEFyZ3VtZW50cz4vbm9sb2dvIC9ub3NoYWRvdyAvbGFiZWxzIC93YWl0ICQoQXNzZW1ibHlOYW1lKS5kbGw8L1N0YXJ0QXJndW1lbnRzPg0KKyAgICA8U3RhcnRXb3JraW5nRGlyZWN0b3J5PiQoUHJvamVjdERpcikkKE91dHB1dFBhdGgpPC9TdGFydFdvcmtpbmdEaXJlY3Rvcnk+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0Lk5FVDQwLmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0Lk5FVDQwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmZmZWZkCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QuTkVUNDAuY3Nwcm9qCkBAIC0wLDAgKzEsMTE1IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8RW52aXJvbm1lbnRGbGF2b3I+Q0xJRU5UUFJPRklMRTwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPk5FVDQwPC9FbnZpcm9ubWVudFRlbXBsYXRlPg0KKyAgICA8RW52aXJvbm1lbnRQcm9qZWN0VHlwZT5URVNUPC9FbnZpcm9ubWVudFByb2plY3RUeXBlPg0KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KKyAgICA8UHJvamVjdEd1aWQ+e0VFRkZFRDI0LTM3NTAtNDU2Ny05QTIzLTFEQjY3NkExNTYxMH08L1Byb2plY3RHdWlkPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQorICAgIDxSb290TmFtZXNwYWNlPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVyc01peGVkTGl0ZS5UZXN0PC9Bc3NlbWJseU5hbWU+DQorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+DQorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXGtleXNcR29vZ2xlLlByb3RvY29sQnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+DQorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cTkVUNDBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQ0MFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQ0MFxSZWxlYXNlPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcTkVUNDBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJudW5pdC5mcmFtZXdvcmsiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE5Vbml0XGxpYlxudW5pdC5mcmFtZXdvcmsuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyAhPSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZywgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTlVuaXQtY29uZmlnXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzIj4NCisgICAgICA8TGluaz5NaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyI+DQorICAgICAgPExpbms+UHJvcGVydGllc1xBc3NlbWJseUluZm8uY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzIj4NCisgICAgICA8TGluaz5TZXJpYWxpemFibGVBdHRyaWJ1dGUuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJbnRlcm9wTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNaXNzaW5nRmllbGRBbmRFeHRlbnNpb25UZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0TGl0ZUJ5QXBpLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzRnVsbFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0TGl0ZUltcG9ydE5vbkxpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0VXRpbC5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5ORVQ0MC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxTdGFydEFjdGlvbj5Qcm9ncmFtPC9TdGFydEFjdGlvbj4NCisgICAgPFN0YXJ0UHJvZ3JhbT4kKFByb2plY3REaXIpLi5cLi5cbGliXE5Vbml0XHRvb2xzXG51bml0LWNvbnNvbGUuZXhlPC9TdGFydFByb2dyYW0+DQorICAgIDxTdGFydEFyZ3VtZW50cz4vbm9sb2dvIC9ub3NoYWRvdyAvbGFiZWxzIC93YWl0ICQoQXNzZW1ibHlOYW1lKS5kbGw8L1N0YXJ0QXJndW1lbnRzPg0KKyAgICA8U3RhcnRXb3JraW5nRGlyZWN0b3J5PiQoUHJvamVjdERpcikkKE91dHB1dFBhdGgpPC9TdGFydFdvcmtpbmdEaXJlY3Rvcnk+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0LlBMNDAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QuUEw0MC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxYTc3YgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0LlBMNDAuY3Nwcm9qCkBAIC0wLDAgKzEsMTQ5IEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiB4bWxuczpjcz0idXJuOnNjaGVtYXMtY3NoYXJwLXByb2plY3Q6dGVtcGxhdGUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5QT1JUQUJMRV9MSUJSQVJZPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+UEw0MDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPEVudmlyb25tZW50UHJvamVjdFR5cGU+VEVTVDwvRW52aXJvbm1lbnRQcm9qZWN0VHlwZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNNaXhlZExpdGUuVGVzdDwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgICA8TWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24+MTAuMDwvTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24+DQorICAgIDxQcm9qZWN0VHlwZUd1aWRzPntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9O3tmYWUwNGVjMC0zMDFmLTExZDMtYmY0Yi0wMGMwNGY3OWVmYmN9PC9Qcm9qZWN0VHlwZUd1aWRzPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrUHJvZmlsZSAvPg0KKyAgICA8VmFsaWRhdGVYYW1sPmZhbHNlPC9WYWxpZGF0ZVhhbWw+DQorICAgIDxUaHJvd0Vycm9yc0luVmFsaWRhdGlvbj5mYWxzZTwvVGhyb3dFcnJvcnNJblZhbGlkYXRpb24+DQorICAgIDxTaWx2ZXJsaWdodEFwcGxpY2F0aW9uPnRydWU8L1NpbHZlcmxpZ2h0QXBwbGljYXRpb24+DQorICAgIDxYYXBPdXRwdXRzPnRydWU8L1hhcE91dHB1dHM+DQorICAgIDxHZW5lcmF0ZVNpbHZlcmxpZ2h0TWFuaWZlc3Q+dHJ1ZTwvR2VuZXJhdGVTaWx2ZXJsaWdodE1hbmlmZXN0Pg0KKyAgICA8WGFwRmlsZW5hbWU+R29vZ2xlLlByb3RvY29sQnVmZmVyc01peGVkTGl0ZS5UZXN0LnhhcDwvWGFwRmlsZW5hbWU+DQorICAgIDxTaWx2ZXJsaWdodE1hbmlmZXN0VGVtcGxhdGU+UHJvcGVydGllc1xBcHBNYW5pZmVzdC54bWw8L1NpbHZlcmxpZ2h0TWFuaWZlc3RUZW1wbGF0ZT4NCisgICAgPFNpbHZlcmxpZ2h0QXBwRW50cnk+R29vZ2xlLlByb3RvY29sQnVmZmVycy5BcHA8L1NpbHZlcmxpZ2h0QXBwRW50cnk+DQorICAgIDxUZXN0UGFnZUZpbGVOYW1lPlRlc3RQYWdlLmh0bWw8L1Rlc3RQYWdlRmlsZU5hbWU+DQorICAgIDxDcmVhdGVUZXN0UGFnZT50cnVlPC9DcmVhdGVUZXN0UGFnZT4NCisgICAgPFNpbHZlcmxpZ2h0VmVyc2lvbj52NC4wPC9TaWx2ZXJsaWdodFZlcnNpb24+DQorICAgIDxPdXRPZkJyb3dzZXJTZXR0aW5nc0ZpbGU+UHJvcGVydGllc1xPdXRPZkJyb3dzZXJTZXR0aW5ncy54bWw8L091dE9mQnJvd3NlclNldHRpbmdzRmlsZT4NCisgICAgPEVuYWJsZU91dE9mQnJvd3Nlcj50cnVlPC9FbmFibGVPdXRPZkJyb3dzZXI+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cUEw0MFxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXFBMNDBcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFBMNDBcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXFBMNDBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XaW5kb3dzIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XaW5kb3dzLkJyb3dzZXIiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJudW5pdC5mcmFtZXdvcmsiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE5Vbml0XGxpYlxudW5pdC5mcmFtZXdvcmsuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyAhPSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZywgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTlVuaXQtY29uZmlnXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzIj4NCisgICAgICA8TGluaz5NaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyI+DQorICAgICAgPExpbms+UHJvcGVydGllc1xBc3NlbWJseUluZm8uY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzIj4NCisgICAgICA8TGluaz5TZXJpYWxpemFibGVBdHRyaWJ1dGUuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJbnRlcm9wTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNaXNzaW5nRmllbGRBbmRFeHRlbnNpb25UZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0TGl0ZUJ5QXBpLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzRnVsbFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0TGl0ZUltcG9ydE5vbkxpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0VXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXBwLnhhbWwuY3MiPg0KKyAgICAgIDxEZXBlbmRlbnRVcG9uPkFwcC54YW1sPC9EZXBlbmRlbnRVcG9uPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxOb25lIEluY2x1ZGU9IlByb3BlcnRpZXNcQXBwTWFuaWZlc3QueG1sIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXE91dE9mQnJvd3NlclNldHRpbmdzLnhtbCIgLz4NCisgICAgPEFwcGxpY2F0aW9uRGVmaW5pdGlvbiBJbmNsdWRlPSJBcHAueGFtbCI+DQorICAgICAgPEdlbmVyYXRvcj5NU0J1aWxkOkNvbXBpbGU8L0dlbmVyYXRvcj4NCisgICAgICA8U3ViVHlwZT5EZXNpZ25lcjwvU3ViVHlwZT4NCisgICAgPC9BcHBsaWNhdGlvbkRlZmluaXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuUEw0MC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoMzIpXE1pY3Jvc29mdFxTaWx2ZXJsaWdodFwkKFNpbHZlcmxpZ2h0VmVyc2lvbilcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LkNTaGFycC50YXJnZXRzIiAvPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8VmlzdWFsU3R1ZGlvPg0KKyAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9IntBMTU5MTI4Mi0xMTk4LTQ2NDctQTJCMS0yN0U1RkY1RjZGM0J9Ij4NCisgICAgICAgIDxTaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzIC8+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFN0YXJ0QWN0aW9uPlByb2dyYW08L1N0YXJ0QWN0aW9uPg0KKyAgICA8U3RhcnRQcm9ncmFtPiQoUHJvamVjdERpcikuLlwuLlxsaWJcTlVuaXRcdG9vbHNcbnVuaXQtY29uc29sZS5leGU8L1N0YXJ0UHJvZ3JhbT4NCisgICAgPFN0YXJ0QXJndW1lbnRzPi9ub2xvZ28gL25vc2hhZG93IC9sYWJlbHMgL3dhaXQgJChBc3NlbWJseU5hbWUpLmRsbDwvU3RhcnRBcmd1bWVudHM+DQorICAgIDxTdGFydFdvcmtpbmdEaXJlY3Rvcnk+JChQcm9qZWN0RGlyKSQoT3V0cHV0UGF0aCk8L1N0YXJ0V29ya2luZ0RpcmVjdG9yeT4NCisgIDwvUHJvcGVydHlHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QuU0wyMC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm90b2NvbEJ1ZmZlcnNMaXRlTWl4ZWQuVGVzdC5TTDIwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmIyYzI3Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QuU0wyMC5jc3Byb2oKQEAgLTAsMCArMSwxNTAgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiIHhtbG5zOmNzPSJ1cm46c2NoZW1hcy1jc2hhcnAtcHJvamVjdDp0ZW1wbGF0ZSI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPlNJTFZFUkxJR0hUPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+U0wyMDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPEVudmlyb25tZW50UHJvamVjdFR5cGU+VEVTVDwvRW52aXJvbm1lbnRQcm9qZWN0VHlwZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNNaXhlZExpdGUuVGVzdDwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52Mi4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfTt7ZmFlMDRlYzAtMzAxZi0xMWQzLWJmNGItMDBjMDRmNzllZmJjfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFNpbHZlcmxpZ2h0QXBwbGljYXRpb24+dHJ1ZTwvU2lsdmVybGlnaHRBcHBsaWNhdGlvbj4NCisgICAgPFZhbGlkYXRlWGFtbD5mYWxzZTwvVmFsaWRhdGVYYW1sPg0KKyAgICA8VGhyb3dFcnJvcnNJblZhbGlkYXRpb24+ZmFsc2U8L1Rocm93RXJyb3JzSW5WYWxpZGF0aW9uPg0KKyAgICA8WGFwT3V0cHV0cz50cnVlPC9YYXBPdXRwdXRzPg0KKyAgICA8R2VuZXJhdGVTaWx2ZXJsaWdodE1hbmlmZXN0PnRydWU8L0dlbmVyYXRlU2lsdmVybGlnaHRNYW5pZmVzdD4NCisgICAgPFhhcEZpbGVuYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNNaXhlZExpdGUuVGVzdC54YXA8L1hhcEZpbGVuYW1lPg0KKyAgICA8U2lsdmVybGlnaHRNYW5pZmVzdFRlbXBsYXRlPlByb3BlcnRpZXNcQXBwTWFuaWZlc3QueG1sPC9TaWx2ZXJsaWdodE1hbmlmZXN0VGVtcGxhdGU+DQorICAgIDxTaWx2ZXJsaWdodEFwcEVudHJ5Pkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQXBwPC9TaWx2ZXJsaWdodEFwcEVudHJ5Pg0KKyAgICA8VGVzdFBhZ2VGaWxlTmFtZT5UZXN0UGFnZS5odG1sPC9UZXN0UGFnZUZpbGVOYW1lPg0KKyAgICA8Q3JlYXRlVGVzdFBhZ2U+dHJ1ZTwvQ3JlYXRlVGVzdFBhZ2U+DQorICAgIDxTaWx2ZXJsaWdodFZlcnNpb24+djIuMDwvU2lsdmVybGlnaHRWZXJzaW9uPg0KKyAgICA8T3V0T2ZCcm93c2VyU2V0dGluZ3NGaWxlPlByb3BlcnRpZXNcT3V0T2ZCcm93c2VyU2V0dGluZ3MueG1sPC9PdXRPZkJyb3dzZXJTZXR0aW5nc0ZpbGU+DQorICAgIDxFbmFibGVPdXRPZkJyb3dzZXI+dHJ1ZTwvRW5hYmxlT3V0T2ZCcm93c2VyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFNMMjBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDIwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDtOT0VYVEVOU0lPTlM8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDIwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDIwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUO05PRVhURU5TSU9OUzwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2luZG93cyIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2luZG93cy5Ccm93c2VyIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibnVuaXQuZnJhbWV3b3JrIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxOVW5pdFxsaWJcbnVuaXQuZnJhbWV3b3JrLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgIT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodC5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbGliXE5Vbml0LWNvbmZpZ1xNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jcyI+DQorICAgICAgPExpbms+TWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiPg0KKyAgICAgIDxMaW5rPlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jcyI+DQorICAgICAgPExpbms+U2VyaWFsaXphYmxlQXR0cmlidXRlLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0QnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdE1lc3NhZ2VMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZUJ1aWxkZXJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXh0ZW5kYWJsZU1lc3NhZ2VMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iSW50ZXJvcExpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWlzc2luZ0ZpZWxkQW5kRXh0ZW5zaW9uVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdExpdGVCeUFwaS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc0Z1bGxQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdExpdGVJbXBvcnROb25MaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFV0aWwuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFwcC54YW1sLmNzIj4NCisgICAgICA8RGVwZW5kZW50VXBvbj5BcHAueGFtbDwvRGVwZW5kZW50VXBvbj4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFwcE1hbmlmZXN0LnhtbCIgLz4NCisgICAgPE5vbmUgSW5jbHVkZT0iUHJvcGVydGllc1xPdXRPZkJyb3dzZXJTZXR0aW5ncy54bWwiIC8+DQorICAgIDxBcHBsaWNhdGlvbkRlZmluaXRpb24gSW5jbHVkZT0iQXBwLnhhbWwiPg0KKyAgICAgIDxHZW5lcmF0b3I+TVNCdWlsZDpDb21waWxlPC9HZW5lcmF0b3I+DQorICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+DQorICAgIDwvQXBwbGljYXRpb25EZWZpbml0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzLlNMMjAuY3Nwcm9qIj4NCisgICAgICA8UHJvamVjdD57NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdD4NCisgICAgICA8TmFtZT5Qcm90b2NvbEJ1ZmZlcnM8L05hbWU+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcU2lsdmVybGlnaHRcdjIuMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn0iPg0KKyAgICAgICAgPFNpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgICAgIDxTdGFydEFjdGlvbj5PZmZsaW5lQXBwbGljYXRpb248L1N0YXJ0QWN0aW9uPg0KKyAgICAgICAgPC9TaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4NCisgICAgPC9WaXN1YWxTdHVkaW8+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxTdGFydEFjdGlvbj5Qcm9ncmFtPC9TdGFydEFjdGlvbj4NCisgICAgPFN0YXJ0UHJvZ3JhbT4kKFByb2plY3REaXIpLi5cLi5cbGliXE5Vbml0XHRvb2xzXG51bml0LWNvbnNvbGUuZXhlPC9TdGFydFByb2dyYW0+DQorICAgIDxTdGFydEFyZ3VtZW50cz4vbm9sb2dvIC9ub3NoYWRvdyAvbGFiZWxzIC93YWl0ICQoQXNzZW1ibHlOYW1lKS5kbGw8L1N0YXJ0QXJndW1lbnRzPg0KKyAgICA8U3RhcnRXb3JraW5nRGlyZWN0b3J5PiQoUHJvamVjdERpcikkKE91dHB1dFBhdGgpPC9TdGFydFdvcmtpbmdEaXJlY3Rvcnk+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0LlNMMzAuY3Nwcm9qIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QuU0wzMC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyN2I3NgotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0LlNMMzAuY3Nwcm9qCkBAIC0wLDAgKzEsMTUxIEBACivvu788UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiB4bWxuczpjcz0idXJuOnNjaGVtYXMtY3NoYXJwLXByb2plY3Q6dGVtcGxhdGUiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5TSUxWRVJMSUdIVDwvRW52aXJvbm1lbnRGbGF2b3I+DQorICAgIDxFbnZpcm9ubWVudFRlbXBsYXRlPlNMMzA8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxFbnZpcm9ubWVudFByb2plY3RUeXBlPlRFU1Q8L0Vudmlyb25tZW50UHJvamVjdFR5cGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVyczwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTWl4ZWRMaXRlLlRlc3Q8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgICAgPFByb2plY3RUeXBlR3VpZHM+e0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn07e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+DQorICAgIDxTaWx2ZXJsaWdodEFwcGxpY2F0aW9uPnRydWU8L1NpbHZlcmxpZ2h0QXBwbGljYXRpb24+DQorICAgIDxWYWxpZGF0ZVhhbWw+ZmFsc2U8L1ZhbGlkYXRlWGFtbD4NCisgICAgPFRocm93RXJyb3JzSW5WYWxpZGF0aW9uPmZhbHNlPC9UaHJvd0Vycm9yc0luVmFsaWRhdGlvbj4NCisgICAgPFhhcE91dHB1dHM+dHJ1ZTwvWGFwT3V0cHV0cz4NCisgICAgPEdlbmVyYXRlU2lsdmVybGlnaHRNYW5pZmVzdD50cnVlPC9HZW5lcmF0ZVNpbHZlcmxpZ2h0TWFuaWZlc3Q+DQorICAgIDxYYXBGaWxlbmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTWl4ZWRMaXRlLlRlc3QueGFwPC9YYXBGaWxlbmFtZT4NCisgICAgPFNpbHZlcmxpZ2h0TWFuaWZlc3RUZW1wbGF0ZT5Qcm9wZXJ0aWVzXEFwcE1hbmlmZXN0LnhtbDwvU2lsdmVybGlnaHRNYW5pZmVzdFRlbXBsYXRlPg0KKyAgICA8U2lsdmVybGlnaHRBcHBFbnRyeT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLkFwcDwvU2lsdmVybGlnaHRBcHBFbnRyeT4NCisgICAgPFRlc3RQYWdlRmlsZU5hbWU+VGVzdFBhZ2UuaHRtbDwvVGVzdFBhZ2VGaWxlTmFtZT4NCisgICAgPENyZWF0ZVRlc3RQYWdlPnRydWU8L0NyZWF0ZVRlc3RQYWdlPg0KKyAgICA8U2lsdmVybGlnaHRWZXJzaW9uPnYzLjU8L1NpbHZlcmxpZ2h0VmVyc2lvbj4NCisgICAgPE91dE9mQnJvd3NlclNldHRpbmdzRmlsZT5Qcm9wZXJ0aWVzXE91dE9mQnJvd3NlclNldHRpbmdzLnhtbDwvT3V0T2ZCcm93c2VyU2V0dGluZ3NGaWxlPg0KKyAgICA8RW5hYmxlT3V0T2ZCcm93c2VyPnRydWU8L0VuYWJsZU91dE9mQnJvd3Nlcj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDMwXERlYnVnPC9PdXRwdXRQYXRoPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcU0wzMFxEZWJ1Z1w8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxTTDMwXFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDMwXFJlbGVhc2VcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk7Tk9TRVJJQUxJWkFCTEU7Tk9TT1JURURMSVNUPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im1zY29ybGliIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XaW5kb3dzIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XaW5kb3dzLkJyb3dzZXIiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJudW5pdC5mcmFtZXdvcmsiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE5Vbml0XGxpYlxudW5pdC5mcmFtZXdvcmsuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyAhPSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZywgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmcuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQsIFZlcnNpb249Mi4wLjUuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LlRlc3RpbmdcQXByaWwyMDEwXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0aW5nLlNpbHZlcmxpZ2h0LmRsbDwvSGludFBhdGg+DQorICAgIDwvUmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxsaWJcTlVuaXQtY29uZmlnXE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzIj4NCisgICAgICA8TGluaz5NaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyI+DQorICAgICAgPExpbms+UHJvcGVydGllc1xBc3NlbWJseUluZm8uY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzLlRlc3RcU2VyaWFsaXphYmxlQXR0cmlidXRlLmNzIj4NCisgICAgICA8TGluaz5TZXJpYWxpemFibGVBdHRyaWJ1dGUuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFic3RyYWN0TWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlQnVpbGRlckxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeHRlbmRhYmxlTWVzc2FnZUxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJbnRlcm9wTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkxpdGVUZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNaXNzaW5nRmllbGRBbmRFeHRlbnNpb25UZXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0TGl0ZUJ5QXBpLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzRnVsbFByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0TGl0ZUltcG9ydE5vbkxpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RMaXRlUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0UHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0VXRpbC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXBwLnhhbWwuY3MiPg0KKyAgICAgIDxEZXBlbmRlbnRVcG9uPkFwcC54YW1sPC9EZXBlbmRlbnRVcG9uPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxOb25lIEluY2x1ZGU9IlByb3BlcnRpZXNcQXBwTWFuaWZlc3QueG1sIiAvPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXE91dE9mQnJvd3NlclNldHRpbmdzLnhtbCIgLz4NCisgICAgPEFwcGxpY2F0aW9uRGVmaW5pdGlvbiBJbmNsdWRlPSJBcHAueGFtbCI+DQorICAgICAgPEdlbmVyYXRvcj5NU0J1aWxkOkNvbXBpbGU8L0dlbmVyYXRvcj4NCisgICAgICA8U3ViVHlwZT5EZXNpZ25lcjwvU3ViVHlwZT4NCisgICAgPC9BcHBsaWNhdGlvbkRlZmluaXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVyc1xQcm90b2NvbEJ1ZmZlcnMuU0wzMC5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns2OTA4QkRDRS1EOTI1LTQzRjMtOTRBQy1BNTMxRTZERjI1OTF9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPlByb3RvY29sQnVmZmVyczwvTmFtZT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoMzIpXE1pY3Jvc29mdFxTaWx2ZXJsaWdodFx2My4wXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4NCisgICAgPFZpc3VhbFN0dWRpbz4NCisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfSI+DQorICAgICAgICA8U2lsdmVybGlnaHRQcm9qZWN0UHJvcGVydGllcz4NCisgICAgICAgICAgPFN0YXJ0QWN0aW9uPk9mZmxpbmVBcHBsaWNhdGlvbjwvU3RhcnRBY3Rpb24+DQorICAgICAgICA8L1NpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPg0KKyAgICA8L1Zpc3VhbFN0dWRpbz4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFN0YXJ0QWN0aW9uPlByb2dyYW08L1N0YXJ0QWN0aW9uPg0KKyAgICA8U3RhcnRQcm9ncmFtPiQoUHJvamVjdERpcikuLlwuLlxsaWJcTlVuaXRcdG9vbHNcbnVuaXQtY29uc29sZS5leGU8L1N0YXJ0UHJvZ3JhbT4NCisgICAgPFN0YXJ0QXJndW1lbnRzPi9ub2xvZ28gL25vc2hhZG93IC9sYWJlbHMgL3dhaXQgJChBc3NlbWJseU5hbWUpLmRsbDwvU3RhcnRBcmd1bWVudHM+DQorICAgIDxTdGFydFdvcmtpbmdEaXJlY3Rvcnk+JChQcm9qZWN0RGlyKSQoT3V0cHV0UGF0aCk8L1N0YXJ0V29ya2luZ0RpcmVjdG9yeT4NCisgIDwvUHJvcGVydHlHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QuU0w0MC5jc3Byb2ogYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9Qcm90b2NvbEJ1ZmZlcnNMaXRlTWl4ZWQuVGVzdC5TTDQwLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOThjNGQzCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QuU0w0MC5jc3Byb2oKQEAgLTAsMCArMSwxNTEgQEAKK++7vzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiIHhtbG5zOmNzPSJ1cm46c2NoZW1hcy1jc2hhcnAtcHJvamVjdDp0ZW1wbGF0ZSI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPEVudmlyb25tZW50Rmxhdm9yPlNJTFZFUkxJR0hUPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+U0w0MDwvRW52aXJvbm1lbnRUZW1wbGF0ZT4NCisgICAgPEVudmlyb25tZW50UHJvamVjdFR5cGU+VEVTVDwvRW52aXJvbm1lbnRQcm9qZWN0VHlwZT4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntFRUZGRUQyNC0zNzUwLTQ1NjctOUEyMy0xREI2NzZBMTU2MTB9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnNNaXhlZExpdGUuVGVzdDwvQXNzZW1ibHlOYW1lPg0KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5Pg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4uLlwuLlxrZXlzXEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57QTE1OTEyODItMTE5OC00NjQ3LUEyQjEtMjdFNUZGNUY2RjNCfTt7ZmFlMDRlYzAtMzAxZi0xMWQzLWJmNGItMDBjMDRmNzllZmJjfTwvUHJvamVjdFR5cGVHdWlkcz4NCisgICAgPFNpbHZlcmxpZ2h0QXBwbGljYXRpb24+dHJ1ZTwvU2lsdmVybGlnaHRBcHBsaWNhdGlvbj4NCisgICAgPFZhbGlkYXRlWGFtbD5mYWxzZTwvVmFsaWRhdGVYYW1sPg0KKyAgICA8VGhyb3dFcnJvcnNJblZhbGlkYXRpb24+ZmFsc2U8L1Rocm93RXJyb3JzSW5WYWxpZGF0aW9uPg0KKyAgICA8U2lsdmVybGlnaHRWZXJzaW9uPnY0LjA8L1NpbHZlcmxpZ2h0VmVyc2lvbj4NCisgICAgPFhhcE91dHB1dHM+dHJ1ZTwvWGFwT3V0cHV0cz4NCisgICAgPEdlbmVyYXRlU2lsdmVybGlnaHRNYW5pZmVzdD50cnVlPC9HZW5lcmF0ZVNpbHZlcmxpZ2h0TWFuaWZlc3Q+DQorICAgIDxYYXBGaWxlbmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTWl4ZWRMaXRlLlRlc3QueGFwPC9YYXBGaWxlbmFtZT4NCisgICAgPFNpbHZlcmxpZ2h0TWFuaWZlc3RUZW1wbGF0ZT5Qcm9wZXJ0aWVzXEFwcE1hbmlmZXN0LnhtbDwvU2lsdmVybGlnaHRNYW5pZmVzdFRlbXBsYXRlPg0KKyAgICA8U2lsdmVybGlnaHRBcHBFbnRyeT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzLkFwcDwvU2lsdmVybGlnaHRBcHBFbnRyeT4NCisgICAgPFRlc3RQYWdlRmlsZU5hbWU+VGVzdFBhZ2UuaHRtbDwvVGVzdFBhZ2VGaWxlTmFtZT4NCisgICAgPENyZWF0ZVRlc3RQYWdlPnRydWU8L0NyZWF0ZVRlc3RQYWdlPg0KKyAgICA8T3V0T2ZCcm93c2VyU2V0dGluZ3NGaWxlPlByb3BlcnRpZXNcT3V0T2ZCcm93c2VyU2V0dGluZ3MueG1sPC9PdXRPZkJyb3dzZXJTZXR0aW5nc0ZpbGU+DQorICAgIDxFbmFibGVPdXRPZkJyb3dzZXI+dHJ1ZTwvRW5hYmxlT3V0T2ZCcm93c2VyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFNMNDBcRGVidWc8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxTTDQwXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpO05PU0VSSUFMSVpBQkxFO05PU09SVEVETElTVDwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPg0KKyAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+DQorICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4NCisgICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXFNMNDBcUmVsZWFzZTwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXFNMNDBcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTtOT1NFUklBTElaQUJMRTtOT1NPUlRFRExJU1Q8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4NCisgICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPg0KKyAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+DQorICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibXNjb3JsaWIiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldpbmRvd3MiIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldpbmRvd3MuQnJvd3NlciIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yayI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTlVuaXRcbGliXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknICE9ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodCwgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxOVW5pdC1jb25maWdcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3MiPg0KKyAgICAgIDxMaW5rPk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIj4NCisgICAgICA8TGluaz5Qcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxTZXJpYWxpemFibGVBdHRyaWJ1dGUuY3MiPg0KKyAgICAgIDxMaW5rPlNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdEJ1aWxkZXJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkludGVyb3BMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1pc3NpbmdGaWVsZEFuZEV4dGVuc2lvblRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RMaXRlQnlBcGkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RMaXRlSW1wb3J0Tm9uTGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RVdGlsLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBcHAueGFtbC5jcyI+DQorICAgICAgPERlcGVuZGVudFVwb24+QXBwLnhhbWw8L0RlcGVuZGVudFVwb24+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iUHJvcGVydGllc1xBcHBNYW5pZmVzdC54bWwiIC8+DQorICAgIDxOb25lIEluY2x1ZGU9IlByb3BlcnRpZXNcT3V0T2ZCcm93c2VyU2V0dGluZ3MueG1sIiAvPg0KKyAgICA8QXBwbGljYXRpb25EZWZpbml0aW9uIEluY2x1ZGU9IkFwcC54YW1sIj4NCisgICAgICA8R2VuZXJhdG9yPk1TQnVpbGQ6Q29tcGlsZTwvR2VuZXJhdG9yPg0KKyAgICAgIDxTdWJUeXBlPkRlc2lnbmVyPC9TdWJUeXBlPg0KKyAgICA8L0FwcGxpY2F0aW9uRGVmaW5pdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cUHJvdG9jb2xCdWZmZXJzXFByb3RvY29sQnVmZmVycy5TTDQwLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0XCQoU2lsdmVybGlnaHRWZXJzaW9uKVxNaWNyb3NvZnQuU2lsdmVybGlnaHQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxWaXN1YWxTdHVkaW8+DQorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0ie0ExNTkxMjgyLTExOTgtNDY0Ny1BMkIxLTI3RTVGRjVGNkYzQn0iPg0KKyAgICAgICAgPFNpbHZlcmxpZ2h0UHJvamVjdFByb3BlcnRpZXM+DQorICAgICAgICAgIDxTdGFydEFjdGlvbj5PZmZsaW5lQXBwbGljYXRpb248L1N0YXJ0QWN0aW9uPg0KKyAgICAgICAgPC9TaWx2ZXJsaWdodFByb2plY3RQcm9wZXJ0aWVzPg0KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4NCisgICAgPC9WaXN1YWxTdHVkaW8+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KKyAgPC9UYXJnZXQ+DQorICAtLT4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKEVudmlyb25tZW50Rmxhdm9yKScgPT0gJ0NMSUVOVFBST0ZJTEUnICI+DQorICAgIDxTdGFydEFjdGlvbj5Qcm9ncmFtPC9TdGFydEFjdGlvbj4NCisgICAgPFN0YXJ0UHJvZ3JhbT4kKFByb2plY3REaXIpLi5cLi5cbGliXE5Vbml0XHRvb2xzXG51bml0LWNvbnNvbGUuZXhlPC9TdGFydFByb2dyYW0+DQorICAgIDxTdGFydEFyZ3VtZW50cz4vbm9sb2dvIC9ub3NoYWRvdyAvbGFiZWxzIC93YWl0ICQoQXNzZW1ibHlOYW1lKS5kbGw8L1N0YXJ0QXJndW1lbnRzPg0KKyAgICA8U3RhcnRXb3JraW5nRGlyZWN0b3J5PiQoUHJvamVjdERpcikkKE91dHB1dFBhdGgpPC9TdGFydFdvcmtpbmdEaXJlY3Rvcnk+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0LmNzcHJvaiBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Byb3RvY29sQnVmZmVyc0xpdGVNaXhlZC5UZXN0LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWJkMGFiCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvUHJvdG9jb2xCdWZmZXJzTGl0ZU1peGVkLlRlc3QuY3Nwcm9qCkBAIC0wLDAgKzEsMTE1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxFbnZpcm9ubWVudEZsYXZvcj5DTElFTlRQUk9GSUxFPC9FbnZpcm9ubWVudEZsYXZvcj4NCisgICAgPEVudmlyb25tZW50VGVtcGxhdGU+TkVUMzU8L0Vudmlyb25tZW50VGVtcGxhdGU+DQorICAgIDxFbnZpcm9ubWVudFByb2plY3RUeXBlPlRFU1Q8L0Vudmlyb25tZW50UHJvamVjdFR5cGU+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxQcm9qZWN0R3VpZD57RUVGRkVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfTwvUHJvamVjdEd1aWQ+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCisgICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvY29sQnVmZmVyczwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9jb2xCdWZmZXJzTWl4ZWRMaXRlLlRlc3Q8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4NCisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9jb2xCdWZmZXJzLnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQorICAgIDxPdXRwdXRQYXRoPmJpblxORVQzNVxEZWJ1ZzwvT3V0cHV0UGF0aD4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXE5FVDM1XERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCisgICAgPE91dHB1dFBhdGg+YmluXE5FVDM1XFJlbGVhc2U8L091dHB1dFBhdGg+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxORVQzNVxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPFRyZWF0V2FybmluZ3NBc0Vycm9ycz50cnVlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+DQorICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4NCisgICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknID09ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yayI+DQorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxsaWJcTlVuaXRcbGliXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cCBDb25kaXRpb249IiAnJChFbnZpcm9ubWVudEZsYXZvciknICE9ICdDTElFTlRQUk9GSUxFJyAiPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nLCBWZXJzaW9uPTIuMC41LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCisgICAgICA8SGludFBhdGg+Li5cLi5cbGliXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5UZXN0aW5nXEFwcmlsMjAxMFxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZy5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdGluZy5TaWx2ZXJsaWdodCwgVmVyc2lvbj0yLjAuNS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXGxpYlxNaWNyb3NvZnQuU2lsdmVybGlnaHQuVGVzdGluZ1xBcHJpbDIwMTBcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RpbmcuU2lsdmVybGlnaHQuZGxsPC9IaW50UGF0aD4NCisgICAgPC9SZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGxpYlxOVW5pdC1jb25maWdcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuY3MiPg0KKyAgICAgIDxMaW5rPk1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXFByb3RvY29sQnVmZmVycy5UZXN0XFByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIj4NCisgICAgICA8TGluaz5Qcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnMuVGVzdFxTZXJpYWxpemFibGVBdHRyaWJ1dGUuY3MiPg0KKyAgICAgIDxMaW5rPlNlcmlhbGl6YWJsZUF0dHJpYnV0ZS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBYnN0cmFjdEJ1aWxkZXJMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWJzdHJhY3RNZXNzYWdlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVCdWlsZGVyTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4dGVuZGFibGVNZXNzYWdlTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkludGVyb3BMaXRlVGVzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTGl0ZVRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1pc3NpbmdGaWVsZEFuZEV4dGVuc2lvblRlc3QuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RMaXRlQnlBcGkuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdEltcG9ydExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RMaXRlSW1wb3J0Tm9uTGl0ZVByb3RvRmlsZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0VGVzdExpdGVQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdFRlc3RQcm90b0ZpbGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RVdGlsLmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxQcm90b2NvbEJ1ZmZlcnNcUHJvdG9jb2xCdWZmZXJzLmNzcHJvaiI+DQorICAgICAgPFByb2plY3Q+ezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+DQorICAgICAgPE5hbWU+UHJvdG9jb2xCdWZmZXJzPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiANCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLg0KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+DQorICA8L1RhcmdldD4NCisgIC0tPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoRW52aXJvbm1lbnRGbGF2b3IpJyA9PSAnQ0xJRU5UUFJPRklMRScgIj4NCisgICAgPFN0YXJ0QWN0aW9uPlByb2dyYW08L1N0YXJ0QWN0aW9uPg0KKyAgICA8U3RhcnRQcm9ncmFtPiQoUHJvamVjdERpcikuLlwuLlxsaWJcTlVuaXRcdG9vbHNcbnVuaXQtY29uc29sZS5leGU8L1N0YXJ0UHJvZ3JhbT4NCisgICAgPFN0YXJ0QXJndW1lbnRzPi9ub2xvZ28gL25vc2hhZG93IC9sYWJlbHMgL3dhaXQgJChBc3NlbWJseU5hbWUpLmRsbDwvU3RhcnRBcmd1bWVudHM+DQorICAgIDxTdGFydFdvcmtpbmdEaXJlY3Rvcnk+JChQcm9qZWN0RGlyKSQoT3V0cHV0UGF0aCk8L1N0YXJ0V29ya2luZ0RpcmVjdG9yeT4NCisgIDwvUHJvcGVydHlHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvU2VyaWFsaXphYmxlTGl0ZVRlc3QuY3MgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9TZXJpYWxpemFibGVMaXRlVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWZiOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvU2VyaWFsaXphYmxlTGl0ZVRlc3QuY3MKQEAgLTAsMCArMSw1NSBAQAor77u/dXNpbmcgU3lzdGVtOw0KKyNpZiAhTk9TRVJJQUxJWkFCTEUNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuQmluYXJ5Ow0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvczsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIFNlcmlhbGl6YWJsZUxpdGVUZXN0DQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBKdXN0IGtlZXAgaXQgZnJvbSBldmVuIGNvbXBpbGluZyBpZiB3ZSB0aGVzZSBvYmplY3RzIGRvbid0IGltcGxlbWVudCB0aGUgZXhwZWN0ZWQgaW50ZXJmYWNlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSVNlcmlhbGl6YWJsZSBDb21waWxlVGltZUNoZWNrU2VyaWFsaXphYmxlTWVzc2FnZSA9IFRlc3RSZXF1aXJlZExpdGUuRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBJU2VyaWFsaXphYmxlIENvbXBpbGVUaW1lQ2hlY2tTZXJpYWxpemFibGVCdWlsZGVyID0gbmV3IFRlc3RSZXF1aXJlZExpdGUuQnVpbGRlcigpOw0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UGxhaW5NZXNzYWdlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0UmVxdWlyZWRMaXRlIG1lc3NhZ2UgPSBUZXN0UmVxdWlyZWRMaXRlLkNyZWF0ZUJ1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0RCg0MikNCisgICAgICAgICAgICAgICAgLkJ1aWxkUGFydGlhbCgpOw0KKw0KKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsNCisgICAgICAgICAgICBuZXcgQmluYXJ5Rm9ybWF0dGVyKCkuU2VyaWFsaXplKG1zLCBtZXNzYWdlKTsNCisNCisgICAgICAgICAgICBtcy5Qb3NpdGlvbiA9IDA7DQorICAgICAgICAgICAgVGVzdFJlcXVpcmVkTGl0ZSBjb3B5ID0gKFRlc3RSZXF1aXJlZExpdGUpbmV3IEJpbmFyeUZvcm1hdHRlcigpLkRlc2VyaWFsaXplKG1zKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZSwgY29weSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQbGFpbkJ1aWxkZXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RSZXF1aXJlZExpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdFJlcXVpcmVkTGl0ZS5DcmVhdGVCdWlsZGVyKCkNCisgICAgICAgICAgICAgICAgLlNldEQoNDIpDQorICAgICAgICAgICAgICAgIDsNCisNCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7DQorICAgICAgICAgICAgbmV3IEJpbmFyeUZvcm1hdHRlcigpLlNlcmlhbGl6ZShtcywgYnVpbGRlcik7DQorDQorICAgICAgICAgICAgbXMuUG9zaXRpb24gPSAwOw0KKyAgICAgICAgICAgIFRlc3RSZXF1aXJlZExpdGUuQnVpbGRlciBjb3B5ID0gKFRlc3RSZXF1aXJlZExpdGUuQnVpbGRlciluZXcgQmluYXJ5Rm9ybWF0dGVyKCkuRGVzZXJpYWxpemUobXMpOw0KKw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChidWlsZGVyLkJ1aWxkUGFydGlhbCgpLCBjb3B5LkJ1aWxkUGFydGlhbCgpKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9UZXN0TGl0ZUJ5QXBpLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvVGVzdExpdGVCeUFwaS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTM3MzAyCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvVGVzdExpdGVCeUFwaS5jcwpAQCAtMCwwICsxLDEyMSBAQAorI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlDQorDQorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0DQorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gaHR0cDovL2dpdGh1Yi5jb20vanNrZWV0L2RvdG5ldC1wcm90b2J1ZnMvDQorLy8gT3JpZ2luYWwgQysrL0phdmEvUHl0aG9uIGNvZGU6DQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLw0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorI2VuZHJlZ2lvbg0KKw0KK3VzaW5nIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvczsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgW1Rlc3RDbGFzc10NCisgICAgcHVibGljIGNsYXNzIFRlc3RMaXRlQnlBcGkNCisgICAgew0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0QWxsVHlwZXNFcXVhbGl0eSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZSBtc2cgPSBUZXN0QWxsVHlwZXNMaXRlLkRlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlIGNvcHkgPSBtc2cuVG9CdWlsZGVyKCkuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobXNnLkdldEhhc2hDb2RlKCksIGNvcHkuR2V0SGFzaENvZGUoKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtc2cuRXF1YWxzKGNvcHkpKTsNCisgICAgICAgICAgICBtc2cgPSBtc2cuVG9CdWlsZGVyKCkuU2V0T3B0aW9uYWxTdHJpbmcoIkhpIikuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwobXNnLkdldEhhc2hDb2RlKCksIGNvcHkuR2V0SGFzaENvZGUoKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobXNnLkVxdWFscyhjb3B5KSk7DQorICAgICAgICAgICAgY29weSA9IGNvcHkuVG9CdWlsZGVyKCkuU2V0T3B0aW9uYWxTdHJpbmcoIkhpIikuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobXNnLkdldEhhc2hDb2RlKCksIGNvcHkuR2V0SGFzaENvZGUoKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtc2cuRXF1YWxzKGNvcHkpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0TWV0aG9kXQ0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEVxdWFsaXR5T25FeHRlbnNpb25zKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbXNnID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgY29weSA9IG1zZy5Ub0J1aWxkZXIoKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtc2cuR2V0SGFzaENvZGUoKSwgY29weS5HZXRIYXNoQ29kZSgpKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1zZy5FcXVhbHMoY29weSkpOw0KKyAgICAgICAgICAgIG1zZyA9IG1zZy5Ub0J1aWxkZXIoKS5TZXRFeHRlbnNpb24oVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZSwgIkhpIikuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwobXNnLkdldEhhc2hDb2RlKCksIGNvcHkuR2V0SGFzaENvZGUoKSk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobXNnLkVxdWFscyhjb3B5KSk7DQorICAgICAgICAgICAgY29weSA9IGNvcHkuVG9CdWlsZGVyKCkuU2V0RXh0ZW5zaW9uKFVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGUsICJIaSIpLkJ1aWxkKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1zZy5HZXRIYXNoQ29kZSgpLCBjb3B5LkdldEhhc2hDb2RlKCkpOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobXNnLkVxdWFscyhjb3B5KSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RBbGxUeXBlc1RvU3RyaW5nKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlIG1zZyA9IFRlc3RBbGxUeXBlc0xpdGUuRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUgY29weSA9IG1zZy5Ub0J1aWxkZXIoKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtc2cuVG9TdHJpbmcoKSwgY29weS5Ub1N0cmluZygpKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbXNnLlRvU3RyaW5nKCkuTGVuZ3RoKTsNCisgICAgICAgICAgICBtc2cgPSBtc2cuVG9CdWlsZGVyKCkuU2V0T3B0aW9uYWxJbnQzMigtMSkuQnVpbGQoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIm9wdGlvbmFsX2ludDMyOiAtMSIsIG1zZy5Ub1N0cmluZygpLlRyaW1FbmQoKSk7DQorICAgICAgICAgICAgbXNnID0gbXNnLlRvQnVpbGRlcigpLlNldE9wdGlvbmFsU3RyaW5nKCJhYmMxMjMiKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgib3B0aW9uYWxfaW50MzI6IC0xXG5vcHRpb25hbF9zdHJpbmc6IFwiYWJjMTIzXCIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuVG9TdHJpbmcoKS5SZXBsYWNlKCJcciIsICIiKS5UcmltRW5kKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RNZXRob2RdDQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0QWxsVHlwZXNEZWZhdWx0ZWRSb3VuZFRyaXAoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUgbXNnID0gVGVzdEFsbFR5cGVzTGl0ZS5EZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtc2cuSXNJbml0aWFsaXplZCk7DQorICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZSBjb3B5ID0gVGVzdEFsbFR5cGVzTGl0ZS5DcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKG1zZy5Ub0J5dGVBcnJheSgpKS5CdWlsZCgpOw0KKyAgICAgICAgICAgIFRlc3RVdGlsLkFzc2VydEJ5dGVzRXF1YWwobXNnLlRvQnl0ZUFycmF5KCksIGNvcHkuVG9CeXRlQXJyYXkoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdE1ldGhvZF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RBbGxUeXBlc01vZGlmaWVkUm91bmRUcmlwKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlIG1zZyA9IFRlc3RBbGxUeXBlc0xpdGUuRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIG1zZy5Ub0J1aWxkZXIoKQ0KKyAgICAgICAgICAgICAgICAuU2V0T3B0aW9uYWxCb29sKHRydWUpDQorICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbENvcmQoIkhpIikNCisgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsRG91YmxlKDEuMTIzKQ0KKyAgICAgICAgICAgICAgICAuU2V0T3B0aW9uYWxGb3JlaWduRW51bShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0ZPTykNCisgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2VMaXRlLkNyZWF0ZUJ1aWxkZXIoKS5TZXRDKCdjJykuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsR3JvdXAoVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5PcHRpb25hbEdyb3VwLkNyZWF0ZUJ1aWxkZXIoKS5TZXRBKCdhJykuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsSW1wb3J0RW51bShJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVIpDQorICAgICAgICAgICAgICAgIC5TZXRPcHRpb25hbEludDMyKDMyKQ0KKyAgICAgICAgICAgICAgICAuU2V0T3B0aW9uYWxJbnQ2NCg2NCkNCisgICAgICAgICAgICAgICAgLlNldE9wdGlvbmFsTmVzdGVkRW51bShUZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0uRk9PKQ0KKyAgICAgICAgICAgICAgICAuU2V0T3B0aW9uYWxTdHJpbmcoIlNldE9wdGlvbmFsU3RyaW5nIikNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkR3JvdXAoVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5SZXBlYXRlZEdyb3VwLkNyZWF0ZUJ1aWxkZXIoKS5TZXRBKCdhJykuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgLkFkZFJlcGVhdGVkR3JvdXAoVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5SZXBlYXRlZEdyb3VwLkNyZWF0ZUJ1aWxkZXIoKS5TZXRBKCdBJykuQnVpbGQoKSkNCisgICAgICAgICAgICAgICAgOw0KKyAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUgY29weSA9IFRlc3RBbGxUeXBlc0xpdGUuQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShtc2cuVG9CeXRlQXJyYXkoKSkuQnVpbGQoKTsNCisgICAgICAgICAgICBUZXN0VXRpbC5Bc3NlcnRCeXRlc0VxdWFsKG1zZy5Ub0J5dGVBcnJheSgpLCBjb3B5LlRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdEV4dHJhc0Z1bGxQcm90b0ZpbGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlZjAzMAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLmNzCkBAIC0wLDAgKzEsMjE0NCBAQAorLy8gR2VuZXJhdGVkIGJ5IFByb3RvR2VuLCBWZXJzaW9uPTIuNC4xLjU1NSwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj01NWY3MTI1MjM0YmViNTg5LiAgRE8gTk9UIEVESVQhDQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQ0KKyNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCisNCit1c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVyczsNCit1c2luZyBwYmMgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnM7DQordXNpbmcgcGJkID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcyB7DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlIHsNCisgIA0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLkVtcGxveWVlSWQpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBFeHRlbnNpb25zDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRW1wbG95ZWVJZEZpZWxkTnVtYmVyID0gMTI2Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wRW1wbG95ZWVJZD4gRW1wbG95ZWVJZDsNCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgI3JlZ2lvbiBTdGF0aWMgdmFyaWFibGVzDQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdEludGVyb3BQZXJzb25fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RJbnRlcm9wUGVyc29uX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdEludGVyb3BQZXJzb25fUGhvbmVOdW1iZXJfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLlBob25lTnVtYmVyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5QaG9uZU51bWJlci5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RJbnRlcm9wUGVyc29uX1Bob25lTnVtYmVyX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdEludGVyb3BQZXJzb25fQWRkcmVzc2VzX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5BZGRyZXNzZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLkFkZHJlc3Nlcy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RJbnRlcm9wUGVyc29uX0FkZHJlc3Nlc19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RJbnRlcm9wRW1wbG95ZWVJZF9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BFbXBsb3llZUlkLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcEVtcGxveWVlSWQuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0SW50ZXJvcEVtcGxveWVlSWRfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0TWlzc2luZ0ZpZWxkc0FfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNaXNzaW5nRmllbGRzQSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1pc3NpbmdGaWVsZHNBLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdE1pc3NpbmdGaWVsZHNBX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdE1pc3NpbmdGaWVsZHNBX1N1YkFfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNaXNzaW5nRmllbGRzQS5UeXBlcy5TdWJBLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0EuVHlwZXMuU3ViQS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RNaXNzaW5nRmllbGRzQV9TdWJBX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdE1pc3NpbmdGaWVsZHNCX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0IsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNaXNzaW5nRmllbGRzQi5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RNaXNzaW5nRmllbGRzQl9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RNaXNzaW5nRmllbGRzQl9TdWJCX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0IuVHlwZXMuU3ViQiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1pc3NpbmdGaWVsZHNCLlR5cGVzLlN1YkIuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0TWlzc2luZ0ZpZWxkc0JfU3ViQl9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gRGVzY3JpcHRvcg0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3I7DQorICAgIA0KKyAgICBzdGF0aWMgVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlKCkgew0KKyAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygNCisgICAgICAgICAgc3RyaW5nLkNvbmNhdCgNCisgICAgICAgICAgICAiQ2lGbGVIUmxjM1F2ZFc1cGRIUmxjM1JmWlhoMGNtRnpYMloxYkd3dWNISnZkRzhTRjNCeWIzUnZZblZtIiwgDQorICAgICAgICAgICAgIlgzVnVhWFIwWlhOMFgyVjRkSEpoR2lSbmIyOW5iR1V2Y0hKdmRHOWlkV1l2WTNOb1lYSndYMjl3ZEdsdiIsIA0KKyAgICAgICAgICAgICJibk11Y0hKdmRHOGkxZ01LRVZSbGMzUkpiblJsY205d1VHVnljMjl1RWd3S0JHNWhiV1VZQVNBQ0tBa1MiLCANCisgICAgICAgICAgICAiQ2dvQ2FXUVlBaUFDS0FVU0RRb0ZaVzFoYVd3WUF5QUJLQWtTRVFvRlkyOWtaWE1ZQ2lBREtBVkNBaEFCIiwgDQorICAgICAgICAgICAgIkVrVUtCWEJvYjI1bEdBUWdBeWdMTWpZdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNSZlpYaDBjbUV1VkdWeiIsIA0KKyAgICAgICAgICAgICJkRWx1ZEdWeWIzQlFaWEp6YjI0dVVHaHZibVZPZFcxaVpYSVNSd29KWVdSa2NtVnpjMlZ6R0FVZ0F5Z0siLCANCisgICAgICAgICAgICAiTWpRdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNSZlpYaDBjbUV1VkdWemRFbHVkR1Z5YjNCUVpYSnpiMjR1IiwgDQorICAgICAgICAgICAgIlFXUmtjbVZ6YzJWekdtY0tDMUJvYjI1bFRuVnRZbVZ5RWc0S0JtNTFiV0psY2hnQklBSW9DUkpJQ2dSMCIsIA0KKyAgICAgICAgICAgICJlWEJsR0FJZ0FTZ09NalF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1JmWlhoMGNtRXVWR1Z6ZEVsdWRHVnkiLCANCisgICAgICAgICAgICAiYjNCUVpYSnpiMjR1VUdodmJtVlVlWEJsT2dSSVQwMUZHbGdLQ1VGa1pISmxjM05sY3hJUENnZGhaR1J5IiwgDQorICAgICAgICAgICAgIlpYTnpHQUVnQWlnSkVoQUtDR0ZrWkhKbGMzTXlHQUlnQVNnSkVnd0tCR05wZEhrWUF5QUNLQWtTRFFvRiIsIA0KKyAgICAgICAgICAgICJjM1JoZEdVWUJDQUNLQWtTQ3dvRGVtbHdHQVVnQWlnSElpc0tDVkJvYjI1bFZIbHdaUklLQ2daTlQwSkoiLCANCisgICAgICAgICAgICAiVEVVUUFCSUlDZ1JJVDAxRkVBRVNDQW9FVjA5U1N4QUNLZ1VJWkJESUFTSW5DaFZVWlhOMFNXNTBaWEp2IiwgDQorICAgICAgICAgICAgImNFVnRjR3h2ZVdWbFNXUVNEZ29HYm5WdFltVnlHQUVnQWlnSklxVUJDaEpVWlhOMFRXbHpjMmx1WjBacCIsIA0KKyAgICAgICAgICAgICJaV3hrYzBFU0RBb0VibUZ0WlJnQklBSW9DUklLQ2dKcFpCZ0NJQUlvQlJJTkNnVmxiV0ZwYkJnRElBRW8iLCANCisgICAgICAgICAgICAiQ1JJL0NnVjBaWE4wUVJnTElBRW9Dekl3TG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wWDJWNGRISmhMbFJsIiwgDQorICAgICAgICAgICAgImMzUk5hWE56YVc1blJtbGxiR1J6UVM1VGRXSkJHaVVLQkZOMVlrRVNEUW9GWTI5MWJuUVlCU0FDS0FVUyIsIA0KKyAgICAgICAgICAgICJEZ29HZG1Gc2RXVnpHQVlnQXlnSklwZ0JDaEpVWlhOMFRXbHpjMmx1WjBacFpXeGtjMElTREFvRWJtRnQiLCANCisgICAgICAgICAgICAiWlJnQklBSW9DUklLQ2dKcFpCZ0NJQUlvQlJJUENnZDNaV0p6YVhSbEdBUWdBU2dKRWo4S0JYUmxjM1JDIiwgDQorICAgICAgICAgICAgIkdBd2dBU2dMTWpBdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNSZlpYaDBjbUV1VkdWemRFMXBjM05wYm1kRyIsIA0KKyAgICAgICAgICAgICJhV1ZzWkhOQ0xsTjFZa0lhRmdvRVUzVmlRaElPQ2daMllXeDFaWE1ZQnlBREtBazZid29MWlcxd2JHOTUiLCANCisgICAgICAgICAgICAiWldWZmFXUVNLaTV3Y205MGIySjFabDkxYm1sMGRHVnpkRjlsZUhSeVlTNVVaWE4wU1c1MFpYSnZjRkJsIiwgDQorICAgICAgICAgICAgImNuTnZiaGgrSUFJb0N6SXVMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBYMlY0ZEhKaExsUmxjM1JKYm5SbCIsIA0KKyAgICAgICAgICAgICJjbTl3Ulcxd2JHOTVaV1ZKWkVKYUNoTmpiMjB1WjI5dloyeGxMbkJ5YjNSdlluVm1TQUxDUGtBS0lVZHYiLCANCisgICAgICAgICAgICAiYjJkc1pTNVFjbTkwYjJOdmJFSjFabVpsY25NdVZHVnpkRkJ5YjNSdmN4SWJWVzVwZEZSbGMzUkZlSFJ5IiwgDQorICAgICAgICAgICJZWE5HZFd4c1VISnZkRzlHYVd4bCIpKTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyIGFzc2lnbmVyID0gZGVsZWdhdGUocGJkOjpGaWxlRGVzY3JpcHRvciByb290KSB7DQorICAgICAgICBkZXNjcmlwdG9yID0gcm9vdDsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdEludGVyb3BQZXJzb25fX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdEludGVyb3BQZXJzb25fX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RJbnRlcm9wUGVyc29uX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiTmFtZSIsICJJZCIsICJFbWFpbCIsICJDb2RlcyIsICJQaG9uZSIsICJBZGRyZXNzZXMiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdEludGVyb3BQZXJzb25fUGhvbmVOdW1iZXJfX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RJbnRlcm9wUGVyc29uX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0SW50ZXJvcFBlcnNvbl9QaG9uZU51bWJlcl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLlBob25lTnVtYmVyLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdEludGVyb3BQZXJzb25fUGhvbmVOdW1iZXJfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJOdW1iZXIiLCAiVHlwZSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0SW50ZXJvcFBlcnNvbl9BZGRyZXNzZXNfX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RJbnRlcm9wUGVyc29uX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0SW50ZXJvcFBlcnNvbl9BZGRyZXNzZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLkFkZHJlc3NlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb24uVHlwZXMuQWRkcmVzc2VzLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdEludGVyb3BQZXJzb25fQWRkcmVzc2VzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQWRkcmVzcyIsICJBZGRyZXNzMiIsICJDaXR5IiwgIlN0YXRlIiwgIlppcCIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0SW50ZXJvcEVtcGxveWVlSWRfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdEludGVyb3BFbXBsb3llZUlkX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcEVtcGxveWVlSWQsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wRW1wbG95ZWVJZC5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RJbnRlcm9wRW1wbG95ZWVJZF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIk51bWJlciIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0TWlzc2luZ0ZpZWxkc0FfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdE1pc3NpbmdGaWVsZHNBX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0EsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNaXNzaW5nRmllbGRzQS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RNaXNzaW5nRmllbGRzQV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIk5hbWUiLCAiSWQiLCAiRW1haWwiLCAiVGVzdEEiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdE1pc3NpbmdGaWVsZHNBX1N1YkFfX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RNaXNzaW5nRmllbGRzQV9fRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdE1pc3NpbmdGaWVsZHNBX1N1YkFfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNaXNzaW5nRmllbGRzQS5UeXBlcy5TdWJBLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0EuVHlwZXMuU3ViQS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RNaXNzaW5nRmllbGRzQV9TdWJBX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQ291bnQiLCAiVmFsdWVzIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RNaXNzaW5nRmllbGRzQl9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzNdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0TWlzc2luZ0ZpZWxkc0JfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNaXNzaW5nRmllbGRzQiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1pc3NpbmdGaWVsZHNCLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdE1pc3NpbmdGaWVsZHNCX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiTmFtZSIsICJJZCIsICJXZWJzaXRlIiwgIlRlc3RCIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RNaXNzaW5nRmllbGRzQl9TdWJCX19EZXNjcmlwdG9yID0gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0TWlzc2luZ0ZpZWxkc0JfX0Rlc2NyaXB0b3IuTmVzdGVkVHlwZXNbMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RNaXNzaW5nRmllbGRzQl9TdWJCX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0IuVHlwZXMuU3ViQiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1pc3NpbmdGaWVsZHNCLlR5cGVzLlN1YkIuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0TWlzc2luZ0ZpZWxkc0JfU3ViQl9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIlZhbHVlcyIsIH0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLkVtcGxveWVlSWQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wRW1wbG95ZWVJZD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1swXSk7DQorICAgICAgICBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuQ3JlYXRlSW5zdGFuY2UoKTsNCisgICAgICAgIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvclByb3Rvcy5DU2hhcnBPcHRpb25zLlJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7DQorICAgICAgICByZXR1cm4gcmVnaXN0cnk7DQorICAgICAgfTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbShkZXNjcmlwdG9yRGF0YSwNCisgICAgICAgICAgbmV3IHBiZDo6RmlsZURlc2NyaXB0b3JbXSB7DQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuRGVzY3JpcHRvciwgDQorICAgICAgICAgIH0sIGFzc2lnbmVyKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgfQ0KKyAgI3JlZ2lvbiBNZXNzYWdlcw0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0SW50ZXJvcFBlcnNvbiA6IHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxUZXN0SW50ZXJvcFBlcnNvbiwgVGVzdEludGVyb3BQZXJzb24uQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RJbnRlcm9wUGVyc29uKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RJbnRlcm9wUGVyc29uIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0SW50ZXJvcFBlcnNvbigpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wUGVyc29uIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEludGVyb3BQZXJzb24gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEludGVyb3BQZXJzb24gVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdEludGVyb3BQZXJzb25fX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdEludGVyb3BQZXJzb24sIFRlc3RJbnRlcm9wUGVyc29uLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0Z1bGxQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0SW50ZXJvcFBlcnNvbl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgICNyZWdpb24gTmVzdGVkIHR5cGVzDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7DQorICAgICAgcHVibGljIGVudW0gUGhvbmVUeXBlIHsNCisgICAgICAgIE1PQklMRSA9IDAsDQorICAgICAgICBIT01FID0gMSwNCisgICAgICAgIFdPUksgPSAyLA0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBQaG9uZU51bWJlciA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFBob25lTnVtYmVyLCBQaG9uZU51bWJlci5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIFBob25lTnVtYmVyKCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQaG9uZU51bWJlciBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgUGhvbmVOdW1iZXIoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgUGhvbmVOdW1iZXIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFBob25lTnVtYmVyIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdEludGVyb3BQZXJzb25fUGhvbmVOdW1iZXJfX0Rlc2NyaXB0b3I7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8UGhvbmVOdW1iZXIsIFBob25lTnVtYmVyLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdEludGVyb3BQZXJzb25fUGhvbmVOdW1iZXJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IE51bWJlckZpZWxkTnVtYmVyID0gMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNOdW1iZXI7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBudW1iZXJfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNOdW1iZXIgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzTnVtYmVyOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIE51bWJlciB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBudW1iZXJfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgVHlwZUZpZWxkTnVtYmVyID0gMjsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNUeXBlOw0KKyAgICAgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5QaG9uZVR5cGUgdHlwZV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5QaG9uZVR5cGUuSE9NRTsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc1R5cGUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzVHlwZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLlBob25lVHlwZSBUeXBlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHR5cGVfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFBob25lTnVtYmVyIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBQaG9uZU51bWJlciBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBQaG9uZU51bWJlciBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBQaG9uZU51bWJlciBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBQaG9uZU51bWJlciBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBQaG9uZU51bWJlciBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBQaG9uZU51bWJlciBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpdmF0ZSBQaG9uZU51bWJlciBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoUGhvbmVOdW1iZXIgcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxQaG9uZU51bWJlciwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihQaG9uZU51bWJlciBjbG9uZUZyb20pIHsNCisgICAgICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgICAgICBwcml2YXRlIFBob25lTnVtYmVyIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgUGhvbmVOdW1iZXIgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIFBob25lTnVtYmVyIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBob25lTnVtYmVyKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFBob25lTnVtYmVyIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLlBob25lTnVtYmVyLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIFBob25lTnVtYmVyIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5QaG9uZU51bWJlci5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIFBob25lTnVtYmVyIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc051bWJlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOdW1iZXI7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgc3RyaW5nIE51bWJlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OdW1iZXI7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXROdW1iZXIodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TnVtYmVyKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzTnVtYmVyID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQubnVtYmVyXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTnVtYmVyKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc051bWJlciA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5udW1iZXJfID0gIiI7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc1R5cGUgew0KKyAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNUeXBlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLlBob25lVHlwZSBUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlR5cGU7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRUeXBlKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFR5cGUoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb24uVHlwZXMuUGhvbmVUeXBlIHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzVHlwZSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LnR5cGVfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJUeXBlKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc1R5cGUgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQudHlwZV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5QaG9uZVR5cGUuSE9NRTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIFBob25lTnVtYmVyKCkgew0KKyAgICAgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzRnVsbFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQWRkcmVzc2VzIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8QWRkcmVzc2VzLCBBZGRyZXNzZXMuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBBZGRyZXNzZXMoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFkZHJlc3NlcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQWRkcmVzc2VzKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NlcyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBBZGRyZXNzZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEFkZHJlc3NlcyBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzRnVsbFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RJbnRlcm9wUGVyc29uX0FkZHJlc3Nlc19fRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxBZGRyZXNzZXMsIEFkZHJlc3Nlcy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzRnVsbFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RJbnRlcm9wUGVyc29uX0FkZHJlc3Nlc19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgQWRkcmVzc0ZpZWxkTnVtYmVyID0gMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNBZGRyZXNzOw0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgYWRkcmVzc18gPSAiIjsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0FkZHJlc3Mgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzQWRkcmVzczsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBBZGRyZXNzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGFkZHJlc3NfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgQWRkcmVzczJGaWVsZE51bWJlciA9IDI7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzQWRkcmVzczI7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBhZGRyZXNzMl8gPSAiIjsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0FkZHJlc3MyIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0FkZHJlc3MyOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIEFkZHJlc3MyIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGFkZHJlc3MyXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IENpdHlGaWVsZE51bWJlciA9IDM7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzQ2l0eTsNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIGNpdHlfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNDaXR5IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0NpdHk7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgQ2l0eSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBjaXR5XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IFN0YXRlRmllbGROdW1iZXIgPSA0Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc1N0YXRlOw0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgc3RhdGVfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNTdGF0ZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNTdGF0ZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBTdGF0ZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBzdGF0ZV87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBaaXBGaWVsZE51bWJlciA9IDU7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzWmlwOw0KKyAgICAgICAgcHJpdmF0ZSB1aW50IHppcF87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNaaXAgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzWmlwOyB9DQorICAgICAgICB9DQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB1aW50IFppcCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB6aXBfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc2VzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBBZGRyZXNzZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc2VzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBBZGRyZXNzZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc2VzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NlcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBBZGRyZXNzZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgQWRkcmVzc2VzIE1ha2VSZWFkT25seSgpIHsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihBZGRyZXNzZXMgcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxBZGRyZXNzZXMsIEJ1aWxkZXI+IHsNCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludGVybmFsIEJ1aWxkZXIoQWRkcmVzc2VzIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgQWRkcmVzc2VzIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgQWRkcmVzc2VzIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICBBZGRyZXNzZXMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQWRkcmVzc2VzKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEFkZHJlc3NlcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5BZGRyZXNzZXMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQWRkcmVzc2VzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5BZGRyZXNzZXMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBBZGRyZXNzZXMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzQWRkcmVzcyB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBZGRyZXNzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBBZGRyZXNzIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkFkZHJlc3M7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRBZGRyZXNzKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEFkZHJlc3Moc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNBZGRyZXNzID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuYWRkcmVzc18gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckFkZHJlc3MoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQWRkcmVzcyA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5hZGRyZXNzXyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNBZGRyZXNzMiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBZGRyZXNzMjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgQWRkcmVzczIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQWRkcmVzczI7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRBZGRyZXNzMih2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRBZGRyZXNzMihzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0FkZHJlc3MyID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuYWRkcmVzczJfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBZGRyZXNzMigpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNBZGRyZXNzMiA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5hZGRyZXNzMl8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzQ2l0eSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNDaXR5OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBDaXR5IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkNpdHk7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRDaXR5KHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldENpdHkoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNDaXR5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuY2l0eV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckNpdHkoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQ2l0eSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5jaXR5XyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNTdGF0ZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNTdGF0ZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgU3RhdGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuU3RhdGU7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRTdGF0ZSh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRTdGF0ZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc1N0YXRlID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuc3RhdGVfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTdGF0ZSgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNTdGF0ZSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5zdGF0ZV8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzWmlwIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1ppcDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgICBwdWJsaWMgdWludCBaaXAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuWmlwOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0WmlwKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRaaXAodWludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc1ppcCA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LnppcF8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclppcCgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNaaXAgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuemlwXyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0YXRpYyBBZGRyZXNzZXMoKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE5hbWVGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOYW1lOw0KKyAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmFtZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG5hbWVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgSWRGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNJZDsNCisgICAgcHJpdmF0ZSBpbnQgaWRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNJZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0lkOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBJZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGlkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEVtYWlsRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRW1haWw7DQorICAgIHByaXZhdGUgc3RyaW5nIGVtYWlsXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNFbWFpbCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0VtYWlsOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBFbWFpbCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGVtYWlsXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IENvZGVzRmllbGROdW1iZXIgPSAxMDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IGNvZGVzXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gQ29kZXNMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KGNvZGVzXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IENvZGVzQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBjb2Rlc18uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldENvZGVzKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBjb2Rlc19baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBob25lRmllbGROdW1iZXIgPSA0Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLlBob25lTnVtYmVyPiBwaG9uZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb24uVHlwZXMuUGhvbmVOdW1iZXI+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLlBob25lTnVtYmVyPiBQaG9uZUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwaG9uZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBob25lQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwaG9uZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIgR2V0UGhvbmUoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBob25lX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQWRkcmVzc2VzRmllbGROdW1iZXIgPSA1Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLkFkZHJlc3Nlcz4gYWRkcmVzc2VzXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5BZGRyZXNzZXM+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLkFkZHJlc3Nlcz4gQWRkcmVzc2VzTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGFkZHJlc3Nlc187IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEFkZHJlc3Nlc0NvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gYWRkcmVzc2VzXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5BZGRyZXNzZXMgR2V0QWRkcmVzc2VzKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBhZGRyZXNzZXNfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBUZXN0SW50ZXJvcFBlcnNvbiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0SW50ZXJvcFBlcnNvbiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0SW50ZXJvcFBlcnNvbiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BQZXJzb24gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wUGVyc29uIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wUGVyc29uIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wUGVyc29uIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wUGVyc29uIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wUGVyc29uIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wUGVyc29uIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RJbnRlcm9wUGVyc29uIE1ha2VSZWFkT25seSgpIHsNCisgICAgICBjb2Rlc18uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGhvbmVfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIGFkZHJlc3Nlc18uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0SW50ZXJvcFBlcnNvbiBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6RXh0ZW5kYWJsZUJ1aWxkZXI8VGVzdEludGVyb3BQZXJzb24sIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RJbnRlcm9wUGVyc29uIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdEludGVyb3BQZXJzb24gcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdEludGVyb3BQZXJzb24gUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0SW50ZXJvcFBlcnNvbiBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RJbnRlcm9wUGVyc29uKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0SW50ZXJvcFBlcnNvbiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RJbnRlcm9wUGVyc29uIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEludGVyb3BQZXJzb24gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmFtZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc05hbWU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmFtZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TmFtZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TmFtZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05hbWUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm5hbWVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOYW1lKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubmFtZV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNJZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0lkOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgSWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5JZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0SWQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldElkKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJZCA9IHRydWU7DQorICAgICAgICByZXN1bHQuaWRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJJZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSWQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5pZF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0VtYWlsIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRW1haWw7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBFbWFpbCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkVtYWlsOyB9DQorICAgICAgICBzZXQgeyBTZXRFbWFpbCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RW1haWwoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNFbWFpbCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZW1haWxfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJFbWFpbCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRW1haWwgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5lbWFpbF8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gQ29kZXNMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmNvZGVzXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IENvZGVzQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Db2Rlc0NvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0Q29kZXMoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldENvZGVzKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Q29kZXMoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuY29kZXNfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZENvZGVzKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5jb2Rlc18uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUNvZGVzKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuY29kZXNfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQ29kZXMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmNvZGVzXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb24uVHlwZXMuUGhvbmVOdW1iZXI+IFBob25lTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5waG9uZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQaG9uZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGhvbmVDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIgR2V0UGhvbmUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBob25lKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGhvbmUoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5QaG9uZU51bWJlciB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGhvbmVfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBob25lKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGhvbmVfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBob25lKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLlBob25lTnVtYmVyIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5waG9uZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQaG9uZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5QaG9uZU51bWJlci5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5waG9uZV8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBob25lKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb24uVHlwZXMuUGhvbmVOdW1iZXI+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5waG9uZV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQaG9uZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGhvbmVfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5BZGRyZXNzZXM+IEFkZHJlc3Nlc0xpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuYWRkcmVzc2VzXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEFkZHJlc3Nlc0NvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQWRkcmVzc2VzQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLkFkZHJlc3NlcyBHZXRBZGRyZXNzZXMoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldEFkZHJlc3NlcyhpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEFkZHJlc3NlcyhpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLkFkZHJlc3NlcyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuYWRkcmVzc2VzX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRBZGRyZXNzZXMoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5BZGRyZXNzZXMuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuYWRkcmVzc2VzX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRBZGRyZXNzZXMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb24uVHlwZXMuQWRkcmVzc2VzIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5hZGRyZXNzZXNfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkQWRkcmVzc2VzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uLlR5cGVzLkFkZHJlc3Nlcy5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5hZGRyZXNzZXNfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VBZGRyZXNzZXMoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbi5UeXBlcy5BZGRyZXNzZXM+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5hZGRyZXNzZXNfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQWRkcmVzc2VzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5hZGRyZXNzZXNfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RJbnRlcm9wUGVyc29uKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdEludGVyb3BFbXBsb3llZUlkIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdEludGVyb3BFbXBsb3llZUlkLCBUZXN0SW50ZXJvcEVtcGxveWVlSWQuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RJbnRlcm9wRW1wbG95ZWVJZCgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0SW50ZXJvcEVtcGxveWVlSWQgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RJbnRlcm9wRW1wbG95ZWVJZCgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wRW1wbG95ZWVJZCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RJbnRlcm9wRW1wbG95ZWVJZCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0SW50ZXJvcEVtcGxveWVlSWQgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdEludGVyb3BFbXBsb3llZUlkX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RJbnRlcm9wRW1wbG95ZWVJZCwgVGVzdEludGVyb3BFbXBsb3llZUlkLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0Z1bGxQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0SW50ZXJvcEVtcGxveWVlSWRfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE51bWJlckZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc051bWJlcjsNCisgICAgcHJpdmF0ZSBzdHJpbmcgbnVtYmVyXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOdW1iZXIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNOdW1iZXI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIE51bWJlciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG51bWJlcl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBUZXN0SW50ZXJvcEVtcGxveWVlSWQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BFbXBsb3llZUlkIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wRW1wbG95ZWVJZCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BFbXBsb3llZUlkIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0SW50ZXJvcEVtcGxveWVlSWQgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BFbXBsb3llZUlkIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wRW1wbG95ZWVJZCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0SW50ZXJvcEVtcGxveWVlSWQgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BFbXBsb3llZUlkIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wRW1wbG95ZWVJZCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0SW50ZXJvcEVtcGxveWVlSWQgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdEludGVyb3BFbXBsb3llZUlkIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RJbnRlcm9wRW1wbG95ZWVJZCwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdEludGVyb3BFbXBsb3llZUlkIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdEludGVyb3BFbXBsb3llZUlkIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RJbnRlcm9wRW1wbG95ZWVJZCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RJbnRlcm9wRW1wbG95ZWVJZCBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RJbnRlcm9wRW1wbG95ZWVJZCgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEludGVyb3BFbXBsb3llZUlkIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BFbXBsb3llZUlkLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RJbnRlcm9wRW1wbG95ZWVJZCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcEVtcGxveWVlSWQuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0SW50ZXJvcEVtcGxveWVlSWQgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTnVtYmVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTnVtYmVyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgTnVtYmVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTnVtYmVyOyB9DQorICAgICAgICBzZXQgeyBTZXROdW1iZXIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE51bWJlcihzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc051bWJlciA9IHRydWU7DQorICAgICAgICByZXN1bHQubnVtYmVyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTnVtYmVyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOdW1iZXIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5udW1iZXJfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RJbnRlcm9wRW1wbG95ZWVJZCgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzRnVsbFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RNaXNzaW5nRmllbGRzQSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RNaXNzaW5nRmllbGRzQSwgVGVzdE1pc3NpbmdGaWVsZHNBLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0TWlzc2luZ0ZpZWxkc0EoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdE1pc3NpbmdGaWVsZHNBIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0TWlzc2luZ0ZpZWxkc0EoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWlzc2luZ0ZpZWxkc0EgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TWlzc2luZ0ZpZWxkc0EgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdE1pc3NpbmdGaWVsZHNBIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzRnVsbFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RNaXNzaW5nRmllbGRzQV9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0TWlzc2luZ0ZpZWxkc0EsIFRlc3RNaXNzaW5nRmllbGRzQS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdE1pc3NpbmdGaWVsZHNBX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMNCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsNCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBTdWJBIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8U3ViQSwgU3ViQS5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIFN1YkEoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFN1YkEgZGVmYXVsdEluc3RhbmNlID0gbmV3IFN1YkEoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3ViQSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdWJBIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBTdWJBIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdE1pc3NpbmdGaWVsZHNBX1N1YkFfX0Rlc2NyaXB0b3I7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8U3ViQSwgU3ViQS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzRnVsbFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2V4dHJhX1Rlc3RNaXNzaW5nRmllbGRzQV9TdWJBX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBDb3VudEZpZWxkTnVtYmVyID0gNTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNDb3VudDsNCisgICAgICAgIHByaXZhdGUgaW50IGNvdW50XzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0NvdW50IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0NvdW50OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IENvdW50IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGNvdW50XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IFZhbHVlc0ZpZWxkTnVtYmVyID0gNjsNCisgICAgICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiB2YWx1ZXNfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gVmFsdWVzTGlzdCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodmFsdWVzXyk7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgVmFsdWVzQ291bnQgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdmFsdWVzXy5Db3VudDsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBHZXRWYWx1ZXMoaW50IGluZGV4KSB7DQorICAgICAgICAgIHJldHVybiB2YWx1ZXNfW2luZGV4XTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBTdWJBIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFN1YkEgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3ViQSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3ViQSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3ViQSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBTdWJBIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFN1YkEgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3ViQSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBTdWJBIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFN1YkEgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgU3ViQSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgICAgIHZhbHVlc18uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoU3ViQSBwcm90b3R5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFN1YkEsIEJ1aWxkZXI+IHsNCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludGVybmFsIEJ1aWxkZXIoU3ViQSBjbG9uZUZyb20pIHsNCisgICAgICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgICAgICBwcml2YXRlIFN1YkEgcmVzdWx0Ow0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBTdWJBIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICBTdWJBIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN1YkEoKTsNCisgICAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU3ViQSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0EuVHlwZXMuU3ViQS5EZXNjcmlwdG9yOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdWJBIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0EuVHlwZXMuU3ViQS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIFN1YkEgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzQ291bnQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQ291bnQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IENvdW50IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkNvdW50OyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0Q291bnQodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Q291bnQoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQ291bnQgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5jb3VudF8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckNvdW50KCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0NvdW50ID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmNvdW50XyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBWYWx1ZXNMaXN0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS52YWx1ZXNfOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBWYWx1ZXNDb3VudCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5WYWx1ZXNDb3VudDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgR2V0VmFsdWVzKGludCBpbmRleCkgew0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuR2V0VmFsdWVzKGluZGV4KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRWYWx1ZXMoaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LnZhbHVlc19baW5kZXhdID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVmFsdWVzKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQudmFsdWVzXy5BZGQodmFsdWUpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVmFsdWVzKHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC52YWx1ZXNfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVmFsdWVzKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LnZhbHVlc18uQ2xlYXIoKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIFN1YkEoKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE5hbWVGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOYW1lOw0KKyAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmFtZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG5hbWVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgSWRGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNJZDsNCisgICAgcHJpdmF0ZSBpbnQgaWRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNJZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0lkOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBJZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGlkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEVtYWlsRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRW1haWw7DQorICAgIHByaXZhdGUgc3RyaW5nIGVtYWlsXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNFbWFpbCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0VtYWlsOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBFbWFpbCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGVtYWlsXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFRlc3RBRmllbGROdW1iZXIgPSAxMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc1Rlc3RBOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNaXNzaW5nRmllbGRzQS5UeXBlcy5TdWJBIHRlc3RBXzsNCisgICAgcHVibGljIGJvb2wgSGFzVGVzdEEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNUZXN0QTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0EuVHlwZXMuU3ViQSBUZXN0QSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRlc3RBXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0EuVHlwZXMuU3ViQS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWlzc2luZ0ZpZWxkc0EgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1pc3NpbmdGaWVsZHNBIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNaXNzaW5nRmllbGRzQSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1pc3NpbmdGaWVsZHNBIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWlzc2luZ0ZpZWxkc0EgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1pc3NpbmdGaWVsZHNBIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNaXNzaW5nRmllbGRzQSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWlzc2luZ0ZpZWxkc0EgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1pc3NpbmdGaWVsZHNBIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNaXNzaW5nRmllbGRzQSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0TWlzc2luZ0ZpZWxkc0EgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdE1pc3NpbmdGaWVsZHNBIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RNaXNzaW5nRmllbGRzQSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdE1pc3NpbmdGaWVsZHNBIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdE1pc3NpbmdGaWVsZHNBIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RNaXNzaW5nRmllbGRzQSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RNaXNzaW5nRmllbGRzQSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RNaXNzaW5nRmllbGRzQSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdE1pc3NpbmdGaWVsZHNBIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1pc3NpbmdGaWVsZHNBLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RNaXNzaW5nRmllbGRzQSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0EuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TWlzc2luZ0ZpZWxkc0EgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmFtZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc05hbWU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmFtZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TmFtZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TmFtZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05hbWUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm5hbWVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOYW1lKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubmFtZV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNJZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0lkOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgSWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5JZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0SWQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldElkKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJZCA9IHRydWU7DQorICAgICAgICByZXN1bHQuaWRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJJZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSWQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5pZF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0VtYWlsIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRW1haWw7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBFbWFpbCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkVtYWlsOyB9DQorICAgICAgICBzZXQgeyBTZXRFbWFpbCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RW1haWwoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNFbWFpbCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZW1haWxfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJFbWFpbCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRW1haWwgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5lbWFpbF8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNUZXN0QSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzVGVzdEE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNaXNzaW5nRmllbGRzQS5UeXBlcy5TdWJBIFRlc3RBIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVGVzdEE7IH0NCisgICAgICAgIHNldCB7IFNldFRlc3RBKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRUZXN0QShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0EuVHlwZXMuU3ViQSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzVGVzdEEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnRlc3RBXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFRlc3RBKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNaXNzaW5nRmllbGRzQS5UeXBlcy5TdWJBLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1Rlc3RBID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC50ZXN0QV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZVRlc3RBKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNaXNzaW5nRmllbGRzQS5UeXBlcy5TdWJBIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzVGVzdEEgJiYNCisgICAgICAgICAgICByZXN1bHQudGVzdEFfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNaXNzaW5nRmllbGRzQS5UeXBlcy5TdWJBLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC50ZXN0QV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0EuVHlwZXMuU3ViQS5DcmVhdGVCdWlsZGVyKHJlc3VsdC50ZXN0QV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQudGVzdEFfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzVGVzdEEgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVGVzdEEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1Rlc3RBID0gZmFsc2U7DQorICAgICAgICByZXN1bHQudGVzdEFfID0gbnVsbDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdE1pc3NpbmdGaWVsZHNBKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdE1pc3NpbmdGaWVsZHNCIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdE1pc3NpbmdGaWVsZHNCLCBUZXN0TWlzc2luZ0ZpZWxkc0IuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RNaXNzaW5nRmllbGRzQigpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0TWlzc2luZ0ZpZWxkc0IgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RNaXNzaW5nRmllbGRzQigpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNaXNzaW5nRmllbGRzQiBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RNaXNzaW5nRmllbGRzQiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0TWlzc2luZ0ZpZWxkc0IgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdE1pc3NpbmdGaWVsZHNCX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RNaXNzaW5nRmllbGRzQiwgVGVzdE1pc3NpbmdGaWVsZHNCLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0Z1bGxQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0TWlzc2luZ0ZpZWxkc0JfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgew0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFN1YkIgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxTdWJCLCBTdWJCLkJ1aWxkZXI+IHsNCisgICAgICAgIHByaXZhdGUgU3ViQigpIHsgfQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU3ViQiBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgU3ViQigpLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgcHVibGljIHN0YXRpYyBTdWJCIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFN1YkIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFN1YkIgVGhpc01lc3NhZ2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0Z1bGxQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9leHRyYV9UZXN0TWlzc2luZ0ZpZWxkc0JfU3ViQl9fRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxTdWJCLCBTdWJCLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNGdWxsUHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfZXh0cmFfVGVzdE1pc3NpbmdGaWVsZHNCX1N1YkJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IFZhbHVlc0ZpZWxkTnVtYmVyID0gNzsNCisgICAgICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiB2YWx1ZXNfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gVmFsdWVzTGlzdCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodmFsdWVzXyk7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgVmFsdWVzQ291bnQgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdmFsdWVzXy5Db3VudDsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBHZXRWYWx1ZXMoaW50IGluZGV4KSB7DQorICAgICAgICAgIHJldHVybiB2YWx1ZXNfW2luZGV4XTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBTdWJCIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFN1YkIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3ViQiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3ViQiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3ViQiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBTdWJCIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFN1YkIgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3ViQiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBTdWJCIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFN1YkIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgU3ViQiBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgICAgIHZhbHVlc18uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoU3ViQiBwcm90b3R5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFN1YkIsIEJ1aWxkZXI+IHsNCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludGVybmFsIEJ1aWxkZXIoU3ViQiBjbG9uZUZyb20pIHsNCisgICAgICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgICAgICBwcml2YXRlIFN1YkIgcmVzdWx0Ow0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBTdWJCIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICBTdWJCIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN1YkIoKTsNCisgICAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU3ViQiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0IuVHlwZXMuU3ViQi5EZXNjcmlwdG9yOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdWJCIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0IuVHlwZXMuU3ViQi5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIFN1YkIgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxzdHJpbmc+IFZhbHVlc0xpc3Qgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnZhbHVlc187IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IFZhbHVlc0NvdW50IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlZhbHVlc0NvdW50OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBHZXRWYWx1ZXMoaW50IGluZGV4KSB7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRWYWx1ZXMoaW5kZXgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFZhbHVlcyhpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQudmFsdWVzX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGRWYWx1ZXMoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC52YWx1ZXNfLkFkZCh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VWYWx1ZXMoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0LnZhbHVlc18uQWRkKHZhbHVlcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJWYWx1ZXMoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQudmFsdWVzXy5DbGVhcigpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgU3ViQigpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0Z1bGxQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTmFtZUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc05hbWU7DQorICAgIHByaXZhdGUgc3RyaW5nIG5hbWVfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc05hbWUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNOYW1lOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBOYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gbmFtZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBJZEZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0lkOw0KKyAgICBwcml2YXRlIGludCBpZF87DQorICAgIHB1YmxpYyBib29sIEhhc0lkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzSWQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IElkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaWRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgV2Vic2l0ZUZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc1dlYnNpdGU7DQorICAgIHByaXZhdGUgc3RyaW5nIHdlYnNpdGVfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc1dlYnNpdGUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNXZWJzaXRlOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBXZWJzaXRlIHsNCisgICAgICBnZXQgeyByZXR1cm4gd2Vic2l0ZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBUZXN0QkZpZWxkTnVtYmVyID0gMTI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNUZXN0QjsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TWlzc2luZ0ZpZWxkc0IuVHlwZXMuU3ViQiB0ZXN0Ql87DQorICAgIHB1YmxpYyBib29sIEhhc1Rlc3RCIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzVGVzdEI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1pc3NpbmdGaWVsZHNCLlR5cGVzLlN1YkIgVGVzdEIgew0KKyAgICAgIGdldCB7IHJldHVybiB0ZXN0Ql8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1pc3NpbmdGaWVsZHNCLlR5cGVzLlN1YkIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1pc3NpbmdGaWVsZHNCIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNaXNzaW5nRmllbGRzQiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWlzc2luZ0ZpZWxkc0IgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNaXNzaW5nRmllbGRzQiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1pc3NpbmdGaWVsZHNCIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNaXNzaW5nRmllbGRzQiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWlzc2luZ0ZpZWxkc0IgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE1pc3NpbmdGaWVsZHNCIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNaXNzaW5nRmllbGRzQiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TWlzc2luZ0ZpZWxkc0IgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdE1pc3NpbmdGaWVsZHNCIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RNaXNzaW5nRmllbGRzQiBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0TWlzc2luZ0ZpZWxkc0IsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RNaXNzaW5nRmllbGRzQiBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RNaXNzaW5nRmllbGRzQiByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0TWlzc2luZ0ZpZWxkc0IgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0TWlzc2luZ0ZpZWxkc0Igb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0TWlzc2luZ0ZpZWxkc0IoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNaXNzaW5nRmllbGRzQiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNaXNzaW5nRmllbGRzQi5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TWlzc2luZ0ZpZWxkc0IgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1pc3NpbmdGaWVsZHNCLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE1pc3NpbmdGaWVsZHNCIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc05hbWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOYW1lOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk5hbWU7IH0NCisgICAgICAgIHNldCB7IFNldE5hbWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5hbWUoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5uYW1lXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTmFtZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmFtZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5hbWVfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzSWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNJZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IElkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSWQ7IH0NCisgICAgICAgIHNldCB7IFNldElkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRJZChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSWQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmlkXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFySWQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0lkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuaWRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNXZWJzaXRlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzV2Vic2l0ZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIFdlYnNpdGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5XZWJzaXRlOyB9DQorICAgICAgICBzZXQgeyBTZXRXZWJzaXRlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRXZWJzaXRlKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzV2Vic2l0ZSA9IHRydWU7DQorICAgICAgICByZXN1bHQud2Vic2l0ZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhcldlYnNpdGUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1dlYnNpdGUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC53ZWJzaXRlXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1Rlc3RCIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNUZXN0QjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1pc3NpbmdGaWVsZHNCLlR5cGVzLlN1YkIgVGVzdEIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5UZXN0QjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0VGVzdEIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFRlc3RCKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNaXNzaW5nRmllbGRzQi5UeXBlcy5TdWJCIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNUZXN0QiA9IHRydWU7DQorICAgICAgICByZXN1bHQudGVzdEJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VGVzdEIoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1pc3NpbmdGaWVsZHNCLlR5cGVzLlN1YkIuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzVGVzdEIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnRlc3RCXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlVGVzdEIoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1pc3NpbmdGaWVsZHNCLlR5cGVzLlN1YkIgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNUZXN0QiAmJg0KKyAgICAgICAgICAgIHJlc3VsdC50ZXN0Ql8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE1pc3NpbmdGaWVsZHNCLlR5cGVzLlN1YkIuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LnRlc3RCXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNaXNzaW5nRmllbGRzQi5UeXBlcy5TdWJCLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LnRlc3RCXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC50ZXN0Ql8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNUZXN0QiA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJUZXN0QigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzVGVzdEIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC50ZXN0Ql8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0TWlzc2luZ0ZpZWxkc0IoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0Z1bGxQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorfQ0KKw0KKyNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWI1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5jcwpAQCAtMCwwICsxLDQyMjYgQEAKKy8vIEdlbmVyYXRlZCBieSBQcm90b0dlbiwgVmVyc2lvbj0yLjQuMS41NTUsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49NTVmNzEyNTIzNGJlYjU4OS4gIERPIE5PVCBFRElUIQ0KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjENCisjcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQorDQordXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM7DQordXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KK3VzaW5nIHBiZCA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCit1c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3Mgew0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZSB7DQorICANCisgICAgI3JlZ2lvbiBFeHRlbnNpb24gcmVnaXN0cmF0aW9uDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3RlckFsbEV4dGVuc2lvbnMocGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5FbXBsb3llZUlkTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZEludDY0RXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuVW5wYWNrZWRVaW50NjRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkU2ludDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuVW5wYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZEZpeGVkNjRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkU2ZpeGVkMzJFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkU2ZpeGVkNjRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkRmxvYXRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkRG91YmxlRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZEJvb2xFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkRW51bUV4dGVuc2lvbkxpdGUpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBFeHRlbnNpb25zDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRW1wbG95ZWVJZExpdGVGaWVsZE51bWJlciA9IDEyNjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbkxpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGU+IEVtcGxveWVlSWRMaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkSW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA5MDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSwgaW50PiBVbnBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEludDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gOTE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUsIGxvbmc+IFVucGFja2VkSW50NjRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkVWludDMyRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gOTI7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLCB1aW50PiBVbnBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRVaW50NjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA5MzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUsIHVsb25nPiBVbnBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRTaW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA5NDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSwgaW50PiBVbnBhY2tlZFNpbnQzMkV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRTaW50NjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA5NTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSwgbG9uZz4gVW5wYWNrZWRTaW50NjRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkRml4ZWQzMkV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDk2Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSwgdWludD4gVW5wYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEZpeGVkNjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA5NzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUsIHVsb25nPiBVbnBhY2tlZEZpeGVkNjRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkU2ZpeGVkMzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA5ODsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSwgaW50PiBVbnBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gOTk7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUsIGxvbmc+IFVucGFja2VkU2ZpeGVkNjRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkRmxvYXRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSAxMDA7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUsIGZsb2F0PiBVbnBhY2tlZEZsb2F0RXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZERvdWJsZUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDEwMTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSwgZG91YmxlPiBVbnBhY2tlZERvdWJsZUV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gMTAyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLCBib29sPiBVbnBhY2tlZEJvb2xFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkRW51bUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDEwMzsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5wYWNrZWRUeXBlc0ZvcmVpZ25FbnVtTGl0ZT4gVW5wYWNrZWRFbnVtRXh0ZW5zaW9uTGl0ZTsNCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgI3JlZ2lvbiBTdGF0aWMgdmFyaWFibGVzDQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBFeHRlbnNpb25zDQorICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBvYmplY3QgRGVzY3JpcHRvcjsNCisgICAgc3RhdGljIFVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZSgpIHsNCisgICAgICBEZXNjcmlwdG9yID0gbnVsbDsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuRW1wbG95ZWVJZExpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbkxpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGU+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3RfZXh0cmEuZW1wbG95ZWVfaWRfbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuRW1wbG95ZWVJZExpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuTWVzc2FnZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkSW50MzJFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUsIGludD4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdF9leHRyYS51bnBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkSW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkludDMyLA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkSW50NjRFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUsIGxvbmc+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3RfZXh0cmEudW5wYWNrZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZEludDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5JbnQ2NCwNCisgICAgICAgICAgZmFsc2UpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSwgdWludD4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdF9leHRyYS51bnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuVUludDMyLA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkVWludDY0RXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLCB1bG9uZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdF9leHRyYS51bnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuVUludDY0LA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkU2ludDMyRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLCBpbnQ+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3RfZXh0cmEudW5wYWNrZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuVW5wYWNrZWRTaW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLlNJbnQzMiwNCisgICAgICAgICAgZmFsc2UpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSwgbG9uZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdF9leHRyYS51bnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuU0ludDY0LA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkRml4ZWQzMkV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSwgdWludD4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdF9leHRyYS51bnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuVW5wYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5GaXhlZDMyLA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSwgdWxvbmc+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3RfZXh0cmEudW5wYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuRml4ZWQ2NCwNCisgICAgICAgICAgZmFsc2UpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLCBpbnQ+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3RfZXh0cmEudW5wYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5TRml4ZWQzMiwNCisgICAgICAgICAgZmFsc2UpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLCBsb25nPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0X2V4dHJhLnVucGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuVW5wYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuU0ZpeGVkNjQsDQorICAgICAgICAgIGZhbHNlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuVW5wYWNrZWRGbG9hdEV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSwgZmxvYXQ+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3RfZXh0cmEudW5wYWNrZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZEZsb2F0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5GbG9hdCwNCisgICAgICAgICAgZmFsc2UpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZERvdWJsZUV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSwgZG91YmxlPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0X2V4dHJhLnVucGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLlVucGFja2VkRG91YmxlRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5Eb3VibGUsDQorICAgICAgICAgIGZhbHNlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuVW5wYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLCBib29sPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0X2V4dHJhLnVucGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5VbnBhY2tlZEJvb2xFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkJvb2wsDQorICAgICAgICAgIGZhbHNlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuVW5wYWNrZWRFbnVtRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5VbnBhY2tlZFR5cGVzRm9yZWlnbkVudW1MaXRlPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0X2V4dHJhLnVucGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG5ldyBFbnVtTGl0ZU1hcDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5VbnBhY2tlZFR5cGVzRm9yZWlnbkVudW1MaXRlPigpLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuVW5wYWNrZWRFbnVtRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5FbnVtLA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgIH0NCisgICNyZWdpb24gRW51bXMNCisgIHB1YmxpYyBlbnVtIEV4dHJhRW51bSB7DQorICAgIERFRkFVTFQgPSAxMCwNCisgICAgRVhMSVRFX0ZPTyA9IDcsDQorICAgIEVYTElURV9CQVIgPSA4LA0KKyAgICBFWExJVEVfQkFaID0gOSwNCisgIH0NCisgIA0KKyAgcHVibGljIGVudW0gVW5wYWNrZWRUeXBlc0ZvcmVpZ25FbnVtTGl0ZSB7DQorICAgIEZPUkVJR05fTElURV9GT08gPSA0LA0KKyAgICBGT1JFSUdOX0xJVEVfQkFSID0gNSwNCisgICAgRk9SRUlHTl9MSVRFX0JBWiA9IDYsDQorICB9DQorICANCisgICNlbmRyZWdpb24NCisgIA0KKyAgI3JlZ2lvbiBNZXNzYWdlcw0KKyAgW2dsb2JhbDo6U3lzdGVtLlNlcmlhbGl6YWJsZUF0dHJpYnV0ZSgpXQ0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0UmVxdWlyZWRMaXRlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2VMaXRlPFRlc3RSZXF1aXJlZExpdGUsIFRlc3RSZXF1aXJlZExpdGUuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RSZXF1aXJlZExpdGUoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdFJlcXVpcmVkTGl0ZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFJlcXVpcmVkTGl0ZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFJlcXVpcmVkTGl0ZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiZCIsICJlbiIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0UmVxdWlyZWRMaXRlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDgsIDE2IH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkTGl0ZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZXF1aXJlZExpdGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFJlcXVpcmVkTGl0ZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBERmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRDsNCisgICAgcHJpdmF0ZSBpbnQgZF87DQorICAgIHB1YmxpYyBib29sIEhhc0Qgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEIHsNCisgICAgICBnZXQgeyByZXR1cm4gZF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBFbkZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0VuOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkV4dHJhRW51bSBlbl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5FeHRyYUVudW0uREVGQVVMVDsNCisgICAgcHVibGljIGJvb2wgSGFzRW4gew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNFbjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5FeHRyYUVudW0gRW4gew0KKyAgICAgIGdldCB7IHJldHVybiBlbl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmICghaGFzRCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgaWYgKCFoYXNFbikgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFJlcXVpcmVkTGl0ZUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0QpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzBdLCBEKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0VuKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDIsIGZpZWxkX25hbWVzWzFdLCAoaW50KSBFbiwgRW4pOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgRCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNFbikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDIsIChpbnQpIEVuKTsNCisgICAgICB9DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgI3JlZ2lvbiBMaXRlIHJ1bnRpbWUgbWV0aG9kcw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgew0KKyAgICAgIGludCBoYXNoID0gR2V0VHlwZSgpLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc0QpIGhhc2ggXj0gZF8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzRW4pIGhhc2ggXj0gZW5fLkdldEhhc2hDb2RlKCk7DQorICAgICAgcmV0dXJuIGhhc2g7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKSB7DQorICAgICAgVGVzdFJlcXVpcmVkTGl0ZSBvdGhlciA9IG9iaiBhcyBUZXN0UmVxdWlyZWRMaXRlOw0KKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc0QgIT0gb3RoZXIuaGFzRCB8fCAoaGFzRCAmJiAhZF8uRXF1YWxzKG90aGVyLmRfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzRW4gIT0gb3RoZXIuaGFzRW4gfHwgKGhhc0VuICYmICFlbl8uRXF1YWxzKG90aGVyLmVuXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFByaW50VG8oZ2xvYmFsOjpTeXN0ZW0uSU8uVGV4dFdyaXRlciB3cml0ZXIpIHsNCisgICAgICBQcmludEZpZWxkKCJkIiwgaGFzRCwgZF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgiZW4iLCBoYXNFbiwgZW5fLCB3cml0ZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkTGl0ZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRMaXRlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZExpdGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZExpdGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZExpdGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkTGl0ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRMaXRlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZExpdGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkTGl0ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRMaXRlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RSZXF1aXJlZExpdGUgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdFJlcXVpcmVkTGl0ZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLlNlcmlhbGl6YWJsZUF0dHJpYnV0ZSgpXQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyTGl0ZTxUZXN0UmVxdWlyZWRMaXRlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0UmVxdWlyZWRMaXRlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdFJlcXVpcmVkTGl0ZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0UmVxdWlyZWRMaXRlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFJlcXVpcmVkTGl0ZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RSZXF1aXJlZExpdGUoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RSZXF1aXJlZExpdGUgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVxdWlyZWRMaXRlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZExpdGUuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVxdWlyZWRMaXRlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2VMaXRlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFJlcXVpcmVkTGl0ZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0UmVxdWlyZWRMaXRlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdFJlcXVpcmVkTGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZExpdGUuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRCkgew0KKyAgICAgICAgICBEID0gb3RoZXIuRDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNFbikgew0KKyAgICAgICAgICBFbiA9IG90aGVyLkVuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RSZXF1aXJlZExpdGVGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFJlcXVpcmVkTGl0ZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2OiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQuZW5fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0VuID0gdHJ1ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZih1bmtub3duIGlzIGludCkgew0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EOyB9DQorICAgICAgICBzZXQgeyBTZXREKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNFbiB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRW47IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkV4dHJhRW51bSBFbiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkVuOyB9DQorICAgICAgICBzZXQgeyBTZXRFbih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RW4oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRXh0cmFFbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0VuID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5lbl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckVuKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNFbiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmVuXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkV4dHJhRW51bS5ERUZBVUxUOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0UmVxdWlyZWRMaXRlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGVBdHRyaWJ1dGUoKV0NCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdEludGVyb3BQZXJzb25MaXRlIDogcGI6OkV4dGVuZGFibGVNZXNzYWdlTGl0ZTxUZXN0SW50ZXJvcFBlcnNvbkxpdGUsIFRlc3RJbnRlcm9wUGVyc29uTGl0ZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdEludGVyb3BQZXJzb25MaXRlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RJbnRlcm9wUGVyc29uTGl0ZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdEludGVyb3BQZXJzb25MaXRlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0SW50ZXJvcFBlcnNvbkxpdGVGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImFkZHJlc3NlcyIsICJjb2RlcyIsICJlbWFpbCIsICJpZCIsICJuYW1lIiwgInBob25lIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RJbnRlcm9wUGVyc29uTGl0ZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyA0MywgODIsIDI2LCAxNiwgMTAsIDM0IH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BQZXJzb25MaXRlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEludGVyb3BQZXJzb25MaXRlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RJbnRlcm9wUGVyc29uTGl0ZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMNCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsNCisgICAgICBwdWJsaWMgZW51bSBQaG9uZVR5cGUgew0KKyAgICAgICAgTU9CSUxFID0gMCwNCisgICAgICAgIEhPTUUgPSAxLA0KKyAgICAgICAgV09SSyA9IDIsDQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGVBdHRyaWJ1dGUoKV0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBQaG9uZU51bWJlciA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxQaG9uZU51bWJlciwgUGhvbmVOdW1iZXIuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBQaG9uZU51bWJlcigpIHsgfQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUGhvbmVOdW1iZXIgZGVmYXVsdEluc3RhbmNlID0gbmV3IFBob25lTnVtYmVyKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfcGhvbmVOdW1iZXJGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIm51bWJlciIsICJ0eXBlIiB9Ow0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9waG9uZU51bWJlckZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCwgMTYgfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgUGhvbmVOdW1iZXIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFBob25lTnVtYmVyIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBOdW1iZXJGaWVsZE51bWJlciA9IDE7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzTnVtYmVyOw0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgbnVtYmVyXyA9ICIiOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzTnVtYmVyIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc051bWJlcjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBOdW1iZXIgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gbnVtYmVyXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IFR5cGVGaWVsZE51bWJlciA9IDI7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzVHlwZTsNCisgICAgICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLlBob25lVHlwZSB0eXBlXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uTGl0ZS5UeXBlcy5QaG9uZVR5cGUuSE9NRTsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc1R5cGUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzVHlwZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uTGl0ZS5UeXBlcy5QaG9uZVR5cGUgVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0eXBlXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpZiAoIWhhc051bWJlcikgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Bob25lTnVtYmVyRmllbGROYW1lczsNCisgICAgICAgICAgaWYgKGhhc051bWJlcikgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxLCBmaWVsZF9uYW1lc1swXSwgTnVtYmVyKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzVHlwZSkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUVudW0oMiwgZmllbGRfbmFtZXNbMV0sIChpbnQpIFR5cGUsIFR5cGUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgIA0KKyAgICAgICAgICBzaXplID0gMDsNCisgICAgICAgICAgaWYgKGhhc051bWJlcikgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDEsIE51bWJlcik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc1R5cGUpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoMiwgKGludCkgVHlwZSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgICAgIHJldHVybiBzaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgI3JlZ2lvbiBMaXRlIHJ1bnRpbWUgbWV0aG9kcw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsNCisgICAgICAgICAgaW50IGhhc2ggPSBHZXRUeXBlKCkuR2V0SGFzaENvZGUoKTsNCisgICAgICAgICAgaWYgKGhhc051bWJlcikgaGFzaCBePSBudW1iZXJfLkdldEhhc2hDb2RlKCk7DQorICAgICAgICAgIGlmIChoYXNUeXBlKSBoYXNoIF49IHR5cGVfLkdldEhhc2hDb2RlKCk7DQorICAgICAgICAgIHJldHVybiBoYXNoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikgew0KKyAgICAgICAgICBQaG9uZU51bWJlciBvdGhlciA9IG9iaiBhcyBQaG9uZU51bWJlcjsNCisgICAgICAgICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgaWYgKGhhc051bWJlciAhPSBvdGhlci5oYXNOdW1iZXIgfHwgKGhhc051bWJlciAmJiAhbnVtYmVyXy5FcXVhbHMob3RoZXIubnVtYmVyXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgICAgIGlmIChoYXNUeXBlICE9IG90aGVyLmhhc1R5cGUgfHwgKGhhc1R5cGUgJiYgIXR5cGVfLkVxdWFscyhvdGhlci50eXBlXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludFRvKGdsb2JhbDo6U3lzdGVtLklPLlRleHRXcml0ZXIgd3JpdGVyKSB7DQorICAgICAgICAgIFByaW50RmllbGQoIm51bWJlciIsIGhhc051bWJlciwgbnVtYmVyXywgd3JpdGVyKTsNCisgICAgICAgICAgUHJpbnRGaWVsZCgidHlwZSIsIGhhc1R5cGUsIHR5cGVfLCB3cml0ZXIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIFBob25lTnVtYmVyIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFBob25lTnVtYmVyIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFBob25lTnVtYmVyIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBQaG9uZU51bWJlciBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGhvbmVOdW1iZXIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgUGhvbmVOdW1iZXIgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFBob25lTnVtYmVyIHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLlNlcmlhbGl6YWJsZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXJMaXRlPFBob25lTnVtYmVyLCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKFBob25lTnVtYmVyIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgUGhvbmVOdW1iZXIgcmVzdWx0Ow0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBQaG9uZU51bWJlciBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgUGhvbmVOdW1iZXIgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUGhvbmVOdW1iZXIoKTsNCisgICAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgUGhvbmVOdW1iZXIgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBQaG9uZU51bWJlciBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLlBob25lTnVtYmVyLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgUGhvbmVOdW1iZXIgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlTGl0ZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciBpcyBQaG9uZU51bWJlcikgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoUGhvbmVOdW1iZXIpIG90aGVyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oUGhvbmVOdW1iZXIgb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLlBob25lTnVtYmVyLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzTnVtYmVyKSB7DQorICAgICAgICAgICAgICBOdW1iZXIgPSBvdGhlci5OdW1iZXI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNUeXBlKSB7DQorICAgICAgICAgICAgICBUeXBlID0gb3RoZXIuVHlwZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9waG9uZU51bWJlckZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX3Bob25lTnVtYmVyRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzTnVtYmVyID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0Lm51bWJlcl8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgICAgICBpZihpbnB1dC5SZWFkRW51bShyZWYgcmVzdWx0LnR5cGVfLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNUeXBlID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNOdW1iZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTnVtYmVyOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBOdW1iZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTnVtYmVyOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0TnVtYmVyKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE51bWJlcihzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc051bWJlciA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0Lm51bWJlcl8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck51bWJlcigpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNOdW1iZXIgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQubnVtYmVyXyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNUeXBlIHsNCisgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzVHlwZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbkxpdGUuVHlwZXMuUGhvbmVUeXBlIFR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVHlwZTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldFR5cGUodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VHlwZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbkxpdGUuVHlwZXMuUGhvbmVUeXBlIHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzVHlwZSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LnR5cGVfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJUeXBlKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc1R5cGUgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQudHlwZV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbkxpdGUuVHlwZXMuUGhvbmVUeXBlLkhPTUU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0YXRpYyBQaG9uZU51bWJlcigpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGVBdHRyaWJ1dGUoKV0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBBZGRyZXNzZXMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZUxpdGU8QWRkcmVzc2VzLCBBZGRyZXNzZXMuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBBZGRyZXNzZXMoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFkZHJlc3NlcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQWRkcmVzc2VzKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfYWRkcmVzc2VzRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhZGRyZXNzIiwgImFkZHJlc3MyIiwgImNpdHkiLCAic3RhdGUiLCAiemlwIiB9Ow0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9hZGRyZXNzZXNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAsIDE4LCAyNiwgMzQsIDQ1IH07DQorICAgICAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NlcyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBBZGRyZXNzZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEFkZHJlc3NlcyBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgQWRkcmVzc0ZpZWxkTnVtYmVyID0gMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNBZGRyZXNzOw0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgYWRkcmVzc18gPSAiIjsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0FkZHJlc3Mgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzQWRkcmVzczsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBBZGRyZXNzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGFkZHJlc3NfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgQWRkcmVzczJGaWVsZE51bWJlciA9IDI7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzQWRkcmVzczI7DQorICAgICAgICBwcml2YXRlIHN0cmluZyBhZGRyZXNzMl8gPSAiIjsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0FkZHJlc3MyIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0FkZHJlc3MyOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RyaW5nIEFkZHJlc3MyIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGFkZHJlc3MyXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IENpdHlGaWVsZE51bWJlciA9IDM7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzQ2l0eTsNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIGNpdHlfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNDaXR5IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0NpdHk7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgQ2l0eSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBjaXR5XzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IFN0YXRlRmllbGROdW1iZXIgPSA0Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc1N0YXRlOw0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgc3RhdGVfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNTdGF0ZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNTdGF0ZTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBTdGF0ZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBzdGF0ZV87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBaaXBGaWVsZE51bWJlciA9IDU7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzWmlwOw0KKyAgICAgICAgcHJpdmF0ZSB1aW50IHppcF87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNaaXAgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzWmlwOyB9DQorICAgICAgICB9DQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICAgIHB1YmxpYyB1aW50IFppcCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB6aXBfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGlmICghaGFzQWRkcmVzcykgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIGlmICghaGFzQ2l0eSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIGlmICghaGFzU3RhdGUpIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICBpZiAoIWhhc1ppcCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2FkZHJlc3Nlc0ZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNBZGRyZXNzKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzBdLCBBZGRyZXNzKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzQWRkcmVzczIpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMiwgZmllbGRfbmFtZXNbMV0sIEFkZHJlc3MyKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzQ2l0eSkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygzLCBmaWVsZF9uYW1lc1syXSwgQ2l0eSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc1N0YXRlKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDQsIGZpZWxkX25hbWVzWzNdLCBTdGF0ZSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGhhc1ppcCkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkMzIoNSwgZmllbGRfbmFtZXNbNF0sIFppcCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgDQorICAgICAgICAgIHNpemUgPSAwOw0KKyAgICAgICAgICBpZiAoaGFzQWRkcmVzcykgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDEsIEFkZHJlc3MpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNBZGRyZXNzMikgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDIsIEFkZHJlc3MyKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzQ2l0eSkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDMsIENpdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNTdGF0ZSkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDQsIFN0YXRlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaGFzWmlwKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZpeGVkMzJTaXplKDUsIFppcCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgICAgIHJldHVybiBzaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgI3JlZ2lvbiBMaXRlIHJ1bnRpbWUgbWV0aG9kcw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsNCisgICAgICAgICAgaW50IGhhc2ggPSBHZXRUeXBlKCkuR2V0SGFzaENvZGUoKTsNCisgICAgICAgICAgaWYgKGhhc0FkZHJlc3MpIGhhc2ggXj0gYWRkcmVzc18uR2V0SGFzaENvZGUoKTsNCisgICAgICAgICAgaWYgKGhhc0FkZHJlc3MyKSBoYXNoIF49IGFkZHJlc3MyXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgICAgICBpZiAoaGFzQ2l0eSkgaGFzaCBePSBjaXR5Xy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgICAgICBpZiAoaGFzU3RhdGUpIGhhc2ggXj0gc3RhdGVfLkdldEhhc2hDb2RlKCk7DQorICAgICAgICAgIGlmIChoYXNaaXApIGhhc2ggXj0gemlwXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgICAgICByZXR1cm4gaGFzaDsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopIHsNCisgICAgICAgICAgQWRkcmVzc2VzIG90aGVyID0gb2JqIGFzIEFkZHJlc3NlczsNCisgICAgICAgICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgaWYgKGhhc0FkZHJlc3MgIT0gb3RoZXIuaGFzQWRkcmVzcyB8fCAoaGFzQWRkcmVzcyAmJiAhYWRkcmVzc18uRXF1YWxzKG90aGVyLmFkZHJlc3NfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgaWYgKGhhc0FkZHJlc3MyICE9IG90aGVyLmhhc0FkZHJlc3MyIHx8IChoYXNBZGRyZXNzMiAmJiAhYWRkcmVzczJfLkVxdWFscyhvdGhlci5hZGRyZXNzMl8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICBpZiAoaGFzQ2l0eSAhPSBvdGhlci5oYXNDaXR5IHx8IChoYXNDaXR5ICYmICFjaXR5Xy5FcXVhbHMob3RoZXIuY2l0eV8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICBpZiAoaGFzU3RhdGUgIT0gb3RoZXIuaGFzU3RhdGUgfHwgKGhhc1N0YXRlICYmICFzdGF0ZV8uRXF1YWxzKG90aGVyLnN0YXRlXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgICAgIGlmIChoYXNaaXAgIT0gb3RoZXIuaGFzWmlwIHx8IChoYXNaaXAgJiYgIXppcF8uRXF1YWxzKG90aGVyLnppcF8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUHJpbnRUbyhnbG9iYWw6OlN5c3RlbS5JTy5UZXh0V3JpdGVyIHdyaXRlcikgew0KKyAgICAgICAgICBQcmludEZpZWxkKCJhZGRyZXNzIiwgaGFzQWRkcmVzcywgYWRkcmVzc18sIHdyaXRlcik7DQorICAgICAgICAgIFByaW50RmllbGQoImFkZHJlc3MyIiwgaGFzQWRkcmVzczIsIGFkZHJlc3MyXywgd3JpdGVyKTsNCisgICAgICAgICAgUHJpbnRGaWVsZCgiY2l0eSIsIGhhc0NpdHksIGNpdHlfLCB3cml0ZXIpOw0KKyAgICAgICAgICBQcmludEZpZWxkKCJzdGF0ZSIsIGhhc1N0YXRlLCBzdGF0ZV8sIHdyaXRlcik7DQorICAgICAgICAgIFByaW50RmllbGQoInppcCIsIGhhc1ppcCwgemlwXywgd3JpdGVyKTsNCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBBZGRyZXNzZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc2VzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc2VzIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBBZGRyZXNzZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc2VzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBBZGRyZXNzZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc2VzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NlcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpdmF0ZSBBZGRyZXNzZXMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKEFkZHJlc3NlcyBwcm90b3R5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyTGl0ZTxBZGRyZXNzZXMsIEJ1aWxkZXI+IHsNCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludGVybmFsIEJ1aWxkZXIoQWRkcmVzc2VzIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgQWRkcmVzc2VzIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgQWRkcmVzc2VzIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICBBZGRyZXNzZXMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQWRkcmVzc2VzKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEFkZHJlc3NlcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEFkZHJlc3NlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLkFkZHJlc3Nlcy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEFkZHJlc3NlcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2VMaXRlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGlzIEFkZHJlc3Nlcykgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoQWRkcmVzc2VzKSBvdGhlcik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEFkZHJlc3NlcyBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbkxpdGUuVHlwZXMuQWRkcmVzc2VzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzQWRkcmVzcykgew0KKyAgICAgICAgICAgICAgQWRkcmVzcyA9IG90aGVyLkFkZHJlc3M7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNBZGRyZXNzMikgew0KKyAgICAgICAgICAgICAgQWRkcmVzczIgPSBvdGhlci5BZGRyZXNzMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0NpdHkpIHsNCisgICAgICAgICAgICAgIENpdHkgPSBvdGhlci5DaXR5Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzU3RhdGUpIHsNCisgICAgICAgICAgICAgIFN0YXRlID0gb3RoZXIuU3RhdGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNaaXApIHsNCisgICAgICAgICAgICAgIFppcCA9IG90aGVyLlppcDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9hZGRyZXNzZXNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgICAgIHRhZyA9IF9hZGRyZXNzZXNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNBZGRyZXNzID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmFkZHJlc3NfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDE4OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0FkZHJlc3MyID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmFkZHJlc3MyXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAyNjogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNDaXR5ID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmNpdHlfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDM0OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc1N0YXRlID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LnN0YXRlXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSA0NTogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNaaXAgPSBpbnB1dC5SZWFkRml4ZWQzMihyZWYgcmVzdWx0LnppcF8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzQWRkcmVzcyB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBZGRyZXNzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBBZGRyZXNzIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkFkZHJlc3M7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRBZGRyZXNzKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEFkZHJlc3Moc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNBZGRyZXNzID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuYWRkcmVzc18gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckFkZHJlc3MoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQWRkcmVzcyA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5hZGRyZXNzXyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNBZGRyZXNzMiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBZGRyZXNzMjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgQWRkcmVzczIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQWRkcmVzczI7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRBZGRyZXNzMih2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRBZGRyZXNzMihzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0FkZHJlc3MyID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuYWRkcmVzczJfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBZGRyZXNzMigpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNBZGRyZXNzMiA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5hZGRyZXNzMl8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzQ2l0eSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNDaXR5OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBDaXR5IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkNpdHk7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRDaXR5KHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldENpdHkoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNDaXR5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuY2l0eV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckNpdHkoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQ2l0eSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5jaXR5XyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNTdGF0ZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNTdGF0ZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgU3RhdGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuU3RhdGU7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRTdGF0ZSh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRTdGF0ZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc1N0YXRlID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuc3RhdGVfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTdGF0ZSgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNTdGF0ZSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5zdGF0ZV8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzWmlwIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1ppcDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgICBwdWJsaWMgdWludCBaaXAgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuWmlwOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0WmlwKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRaaXAodWludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc1ppcCA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LnppcF8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclppcCgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNaaXAgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuemlwXyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0YXRpYyBBZGRyZXNzZXMoKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE5hbWVGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOYW1lOw0KKyAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOYW1lIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmFtZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG5hbWVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgSWRGaWVsZE51bWJlciA9IDI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNJZDsNCisgICAgcHJpdmF0ZSBpbnQgaWRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNJZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0lkOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBJZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGlkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEVtYWlsRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRW1haWw7DQorICAgIHByaXZhdGUgc3RyaW5nIGVtYWlsXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNFbWFpbCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0VtYWlsOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBFbWFpbCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGVtYWlsXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IENvZGVzRmllbGROdW1iZXIgPSAxMDsNCisgICAgcHJpdmF0ZSBpbnQgY29kZXNNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gY29kZXNfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBDb2Rlc0xpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkoY29kZXNfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgQ29kZXNDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGNvZGVzXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgR2V0Q29kZXMoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIGNvZGVzX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGhvbmVGaWVsZE51bWJlciA9IDQ7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLlBob25lTnVtYmVyPiBwaG9uZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLlBob25lTnVtYmVyPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbkxpdGUuVHlwZXMuUGhvbmVOdW1iZXI+IFBob25lTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBob25lXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGhvbmVDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBob25lXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbkxpdGUuVHlwZXMuUGhvbmVOdW1iZXIgR2V0UGhvbmUoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBob25lX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQWRkcmVzc2VzRmllbGROdW1iZXIgPSA1Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uTGl0ZS5UeXBlcy5BZGRyZXNzZXM+IGFkZHJlc3Nlc18gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLkFkZHJlc3Nlcz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLkFkZHJlc3Nlcz4gQWRkcmVzc2VzTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGFkZHJlc3Nlc187IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEFkZHJlc3Nlc0NvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gYWRkcmVzc2VzXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbkxpdGUuVHlwZXMuQWRkcmVzc2VzIEdldEFkZHJlc3NlcyhpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gYWRkcmVzc2VzX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIWhhc05hbWUpIHJldHVybiBmYWxzZTsNCisgICAgICAgIGlmICghaGFzSWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uTGl0ZS5UeXBlcy5QaG9uZU51bWJlciBlbGVtZW50IGluIFBob25lTGlzdCkgew0KKyAgICAgICAgICBpZiAoIWVsZW1lbnQuSXNJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFFeHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RJbnRlcm9wUGVyc29uTGl0ZUZpZWxkTmFtZXM7DQorICAgICAgcGI6OkV4dGVuZGFibGVNZXNzYWdlTGl0ZTxUZXN0SW50ZXJvcFBlcnNvbkxpdGUsIFRlc3RJbnRlcm9wUGVyc29uTGl0ZS5CdWlsZGVyPi5FeHRlbnNpb25Xcml0ZXIgZXh0ZW5zaW9uV3JpdGVyID0gQ3JlYXRlRXh0ZW5zaW9uV3JpdGVyKHRoaXMpOw0KKyAgICAgIGlmIChoYXNOYW1lKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMSwgZmllbGRfbmFtZXNbNF0sIE5hbWUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSWQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIsIGZpZWxkX25hbWVzWzNdLCBJZCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNFbWFpbCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDMsIGZpZWxkX25hbWVzWzJdLCBFbWFpbCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwaG9uZV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlQXJyYXkoNCwgZmllbGRfbmFtZXNbNV0sIHBob25lXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChhZGRyZXNzZXNfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlR3JvdXBBcnJheSg1LCBmaWVsZF9uYW1lc1swXSwgYWRkcmVzc2VzXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChjb2Rlc18uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRJbnQzMkFycmF5KDEwLCBmaWVsZF9uYW1lc1sxXSwgY29kZXNNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBjb2Rlc18pOw0KKyAgICAgIH0NCisgICAgICBleHRlbnNpb25Xcml0ZXIuV3JpdGVVbnRpbCgyMDAsIG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNOYW1lKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxLCBOYW1lKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0lkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIsIElkKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0VtYWlsKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgzLCBFbWFpbCk7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChpbnQgZWxlbWVudCBpbiBDb2Rlc0xpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAoY29kZXNfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBjb2Rlc01lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLlBob25lTnVtYmVyIGVsZW1lbnQgaW4gUGhvbmVMaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoNCwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uTGl0ZS5UeXBlcy5BZGRyZXNzZXMgZWxlbWVudCBpbiBBZGRyZXNzZXNMaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlR3JvdXBTaXplKDUsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IEV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICAjcmVnaW9uIExpdGUgcnVudGltZSBtZXRob2RzDQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7DQorICAgICAgaW50IGhhc2ggPSBHZXRUeXBlKCkuR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzTmFtZSkgaGFzaCBePSBuYW1lXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNJZCkgaGFzaCBePSBpZF8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzRW1haWwpIGhhc2ggXj0gZW1haWxfLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChpbnQgaSBpbiBjb2Rlc18pDQorICAgICAgICBoYXNoIF49IGkuR2V0SGFzaENvZGUoKTsNCisgICAgICBmb3JlYWNoKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uTGl0ZS5UeXBlcy5QaG9uZU51bWJlciBpIGluIHBob25lXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2goZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLkFkZHJlc3NlcyBpIGluIGFkZHJlc3Nlc18pDQorICAgICAgICBoYXNoIF49IGkuR2V0SGFzaENvZGUoKTsNCisgICAgICBoYXNoIF49IGJhc2UuR2V0SGFzaENvZGUoKTsNCisgICAgICByZXR1cm4gaGFzaDsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopIHsNCisgICAgICBUZXN0SW50ZXJvcFBlcnNvbkxpdGUgb3RoZXIgPSBvYmogYXMgVGVzdEludGVyb3BQZXJzb25MaXRlOw0KKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc05hbWUgIT0gb3RoZXIuaGFzTmFtZSB8fCAoaGFzTmFtZSAmJiAhbmFtZV8uRXF1YWxzKG90aGVyLm5hbWVfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzSWQgIT0gb3RoZXIuaGFzSWQgfHwgKGhhc0lkICYmICFpZF8uRXF1YWxzKG90aGVyLmlkXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc0VtYWlsICE9IG90aGVyLmhhc0VtYWlsIHx8IChoYXNFbWFpbCAmJiAhZW1haWxfLkVxdWFscyhvdGhlci5lbWFpbF8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKGNvZGVzXy5Db3VudCAhPSBvdGhlci5jb2Rlc18uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgY29kZXNfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIWNvZGVzX1tpeF0uRXF1YWxzKG90aGVyLmNvZGVzX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocGhvbmVfLkNvdW50ICE9IG90aGVyLnBob25lXy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCBwaG9uZV8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcGhvbmVfW2l4XS5FcXVhbHMob3RoZXIucGhvbmVfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZihhZGRyZXNzZXNfLkNvdW50ICE9IG90aGVyLmFkZHJlc3Nlc18uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgYWRkcmVzc2VzXy5Db3VudDsgaXgrKykNCisgICAgICAgIGlmKCFhZGRyZXNzZXNfW2l4XS5FcXVhbHMob3RoZXIuYWRkcmVzc2VzX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKCFiYXNlLkVxdWFscyhvdGhlcikpIHJldHVybiBmYWxzZTsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUHJpbnRUbyhnbG9iYWw6OlN5c3RlbS5JTy5UZXh0V3JpdGVyIHdyaXRlcikgew0KKyAgICAgIFByaW50RmllbGQoIm5hbWUiLCBoYXNOYW1lLCBuYW1lXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJpZCIsIGhhc0lkLCBpZF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgiZW1haWwiLCBoYXNFbWFpbCwgZW1haWxfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoInBob25lIiwgcGhvbmVfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoIkFkZHJlc3NlcyIsIGFkZHJlc3Nlc18sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgiY29kZXMiLCBjb2Rlc18sIHdyaXRlcik7DQorICAgICAgYmFzZS5QcmludFRvKHdyaXRlcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBUZXN0SW50ZXJvcFBlcnNvbkxpdGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BQZXJzb25MaXRlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wUGVyc29uTGl0ZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BQZXJzb25MaXRlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0SW50ZXJvcFBlcnNvbkxpdGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BQZXJzb25MaXRlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wUGVyc29uTGl0ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0SW50ZXJvcFBlcnNvbkxpdGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BQZXJzb25MaXRlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wUGVyc29uTGl0ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0SW50ZXJvcFBlcnNvbkxpdGUgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIGNvZGVzXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwaG9uZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgYWRkcmVzc2VzXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RJbnRlcm9wUGVyc29uTGl0ZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLlNlcmlhbGl6YWJsZUF0dHJpYnV0ZSgpXQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpFeHRlbmRhYmxlQnVpbGRlckxpdGU8VGVzdEludGVyb3BQZXJzb25MaXRlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0SW50ZXJvcFBlcnNvbkxpdGUgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0SW50ZXJvcFBlcnNvbkxpdGUgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdEludGVyb3BQZXJzb25MaXRlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdEludGVyb3BQZXJzb25MaXRlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdEludGVyb3BQZXJzb25MaXRlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0SW50ZXJvcFBlcnNvbkxpdGUgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0SW50ZXJvcFBlcnNvbkxpdGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEludGVyb3BQZXJzb25MaXRlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2VMaXRlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdEludGVyb3BQZXJzb25MaXRlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RJbnRlcm9wUGVyc29uTGl0ZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RJbnRlcm9wUGVyc29uTGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uTGl0ZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNOYW1lKSB7DQorICAgICAgICAgIE5hbWUgPSBvdGhlci5OYW1lOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0lkKSB7DQorICAgICAgICAgIElkID0gb3RoZXIuSWQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRW1haWwpIHsNCisgICAgICAgICAgRW1haWwgPSBvdGhlci5FbWFpbDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5jb2Rlc18uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQuY29kZXNfLkFkZChvdGhlci5jb2Rlc18pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBob25lXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5waG9uZV8uQWRkKG90aGVyLnBob25lXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuYWRkcmVzc2VzXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5hZGRyZXNzZXNfLkFkZChvdGhlci5hZGRyZXNzZXNfKTsNCisgICAgICAgIH0NCisgICAgICAgICAgdGhpcy5NZXJnZUV4dGVuc2lvbkZpZWxkcyhvdGhlcik7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdEludGVyb3BQZXJzb25MaXRlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RJbnRlcm9wUGVyc29uTGl0ZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc05hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQubmFtZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNJZCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmlkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0VtYWlsID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmVtYWlsXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzNDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5waG9uZV8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uTGl0ZS5UeXBlcy5QaG9uZU51bWJlci5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQzOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkR3JvdXBBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5hZGRyZXNzZXNfLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbkxpdGUuVHlwZXMuQWRkcmVzc2VzLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODI6DQorICAgICAgICAgICAgY2FzZSA4MDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuY29kZXNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmFtZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc05hbWU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmFtZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TmFtZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TmFtZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05hbWUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm5hbWVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOYW1lKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubmFtZV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNJZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0lkOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgSWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5JZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0SWQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldElkKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJZCA9IHRydWU7DQorICAgICAgICByZXN1bHQuaWRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJJZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSWQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5pZF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0VtYWlsIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRW1haWw7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBFbWFpbCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkVtYWlsOyB9DQorICAgICAgICBzZXQgeyBTZXRFbWFpbCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RW1haWwoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNFbWFpbCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZW1haWxfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJFbWFpbCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRW1haWwgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5lbWFpbF8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gQ29kZXNMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLmNvZGVzXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IENvZGVzQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Db2Rlc0NvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0Q29kZXMoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldENvZGVzKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Q29kZXMoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuY29kZXNfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZENvZGVzKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5jb2Rlc18uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUNvZGVzKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuY29kZXNfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQ29kZXMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmNvZGVzXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLlBob25lTnVtYmVyPiBQaG9uZUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGhvbmVfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGhvbmVDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBob25lQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uTGl0ZS5UeXBlcy5QaG9uZU51bWJlciBHZXRQaG9uZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGhvbmUoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQaG9uZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uTGl0ZS5UeXBlcy5QaG9uZU51bWJlciB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGhvbmVfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBob25lKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLlBob25lTnVtYmVyLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBob25lX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQaG9uZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbkxpdGUuVHlwZXMuUGhvbmVOdW1iZXIgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBob25lXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBob25lKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uTGl0ZS5UeXBlcy5QaG9uZU51bWJlci5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5waG9uZV8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBob25lKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLlBob25lTnVtYmVyPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGhvbmVfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGhvbmUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBob25lXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLkFkZHJlc3Nlcz4gQWRkcmVzc2VzTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5hZGRyZXNzZXNfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgQWRkcmVzc2VzQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BZGRyZXNzZXNDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLkFkZHJlc3NlcyBHZXRBZGRyZXNzZXMoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldEFkZHJlc3NlcyhpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEFkZHJlc3NlcyhpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uTGl0ZS5UeXBlcy5BZGRyZXNzZXMgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmFkZHJlc3Nlc19baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QWRkcmVzc2VzKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLkFkZHJlc3Nlcy5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5hZGRyZXNzZXNfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZEFkZHJlc3NlcyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0SW50ZXJvcFBlcnNvbkxpdGUuVHlwZXMuQWRkcmVzc2VzIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5hZGRyZXNzZXNfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkQWRkcmVzc2VzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RJbnRlcm9wUGVyc29uTGl0ZS5UeXBlcy5BZGRyZXNzZXMuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuYWRkcmVzc2VzXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlQWRkcmVzc2VzKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BQZXJzb25MaXRlLlR5cGVzLkFkZHJlc3Nlcz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmFkZHJlc3Nlc18uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBZGRyZXNzZXMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmFkZHJlc3Nlc18uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdEludGVyb3BQZXJzb25MaXRlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGVBdHRyaWJ1dGUoKV0NCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxUZXN0SW50ZXJvcEVtcGxveWVlSWRMaXRlLCBUZXN0SW50ZXJvcEVtcGxveWVlSWRMaXRlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0SW50ZXJvcEVtcGxveWVlSWRMaXRlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGVGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIm51bWJlciIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0SW50ZXJvcEVtcGxveWVlSWRMaXRlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOdW1iZXJGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOdW1iZXI7DQorICAgIHByaXZhdGUgc3RyaW5nIG51bWJlcl8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzTnVtYmVyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTnVtYmVyOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBOdW1iZXIgew0KKyAgICAgIGdldCB7IHJldHVybiBudW1iZXJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIWhhc051bWJlcikgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc051bWJlcikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzBdLCBOdW1iZXIpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc051bWJlcikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMSwgTnVtYmVyKTsNCisgICAgICB9DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgI3JlZ2lvbiBMaXRlIHJ1bnRpbWUgbWV0aG9kcw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgew0KKyAgICAgIGludCBoYXNoID0gR2V0VHlwZSgpLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc051bWJlcikgaGFzaCBePSBudW1iZXJfLkdldEhhc2hDb2RlKCk7DQorICAgICAgcmV0dXJuIGhhc2g7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKSB7DQorICAgICAgVGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZSBvdGhlciA9IG9iaiBhcyBUZXN0SW50ZXJvcEVtcGxveWVlSWRMaXRlOw0KKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc051bWJlciAhPSBvdGhlci5oYXNOdW1iZXIgfHwgKGhhc051bWJlciAmJiAhbnVtYmVyXy5FcXVhbHMob3RoZXIubnVtYmVyXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFByaW50VG8oZ2xvYmFsOjpTeXN0ZW0uSU8uVGV4dFdyaXRlciB3cml0ZXIpIHsNCisgICAgICBQcmludEZpZWxkKCJudW1iZXIiLCBoYXNOdW1iZXIsIG51bWJlcl8sIHdyaXRlcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBUZXN0SW50ZXJvcEVtcGxveWVlSWRMaXRlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0SW50ZXJvcEVtcGxveWVlSWRMaXRlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0SW50ZXJvcEVtcGxveWVlSWRMaXRlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0SW50ZXJvcEVtcGxveWVlSWRMaXRlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uU2VyaWFsaXphYmxlQXR0cmlidXRlKCldDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXJMaXRlPFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0SW50ZXJvcEVtcGxveWVlSWRMaXRlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0SW50ZXJvcEVtcGxveWVlSWRMaXRlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZUxpdGUgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0SW50ZXJvcEVtcGxveWVlSWRMaXRlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0SW50ZXJvcEVtcGxveWVlSWRMaXRlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNOdW1iZXIpIHsNCisgICAgICAgICAgTnVtYmVyID0gb3RoZXIuTnVtYmVyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGVGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdEludGVyb3BFbXBsb3llZUlkTGl0ZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc051bWJlciA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5udW1iZXJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTnVtYmVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTnVtYmVyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgTnVtYmVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTnVtYmVyOyB9DQorICAgICAgICBzZXQgeyBTZXROdW1iZXIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE51bWJlcihzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc051bWJlciA9IHRydWU7DQorICAgICAgICByZXN1bHQubnVtYmVyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTnVtYmVyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOdW1iZXIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5udW1iZXJfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RJbnRlcm9wRW1wbG95ZWVJZExpdGUoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLlNlcmlhbGl6YWJsZUF0dHJpYnV0ZSgpXQ0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSA6IHBiOjpFeHRlbmRhYmxlTWVzc2FnZUxpdGU8VGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUsIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIUV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGVGaWVsZE5hbWVzOw0KKyAgICAgIHBiOjpFeHRlbmRhYmxlTWVzc2FnZUxpdGU8VGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUsIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXI+LkV4dGVuc2lvbldyaXRlciBleHRlbnNpb25Xcml0ZXIgPSBDcmVhdGVFeHRlbnNpb25Xcml0ZXIodGhpcyk7DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoNTM2ODcwOTEyLCBvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IEV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICAjcmVnaW9uIExpdGUgcnVudGltZSBtZXRob2RzDQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7DQorICAgICAgaW50IGhhc2ggPSBHZXRUeXBlKCkuR2V0SGFzaENvZGUoKTsNCisgICAgICBoYXNoIF49IGJhc2UuR2V0SGFzaENvZGUoKTsNCisgICAgICByZXR1cm4gaGFzaDsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopIHsNCisgICAgICBUZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSBvdGhlciA9IG9iaiBhcyBUZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZTsNCisgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmICghYmFzZS5FcXVhbHMob3RoZXIpKSByZXR1cm4gZmFsc2U7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFByaW50VG8oZ2xvYmFsOjpTeXN0ZW0uSU8uVGV4dFdyaXRlciB3cml0ZXIpIHsNCisgICAgICBiYXNlLlByaW50VG8od3JpdGVyKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGVBdHRyaWJ1dGUoKV0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6RXh0ZW5kYWJsZUJ1aWxkZXJMaXRlPFRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2VMaXRlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdFVucGFja2VkRXh0ZW5zaW9uc0xpdGUpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICB0aGlzLk1lcmdlRXh0ZW5zaW9uRmllbGRzKG90aGVyKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0VW5wYWNrZWRFeHRlbnNpb25zTGl0ZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uU2VyaWFsaXphYmxlQXR0cmlidXRlKCldDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RVbnBhY2tlZFR5cGVzTGl0ZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxUZXN0VW5wYWNrZWRUeXBlc0xpdGUsIFRlc3RVbnBhY2tlZFR5cGVzTGl0ZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdFVucGFja2VkVHlwZXNMaXRlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RVbnBhY2tlZFR5cGVzTGl0ZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFVucGFja2VkVHlwZXNMaXRlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0VW5wYWNrZWRUeXBlc0xpdGVGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInVucGFja2VkX2Jvb2wiLCAidW5wYWNrZWRfZG91YmxlIiwgInVucGFja2VkX2VudW0iLCAidW5wYWNrZWRfZml4ZWQzMiIsICJ1bnBhY2tlZF9maXhlZDY0IiwgInVucGFja2VkX2Zsb2F0IiwgInVucGFja2VkX2ludDMyIiwgInVucGFja2VkX2ludDY0IiwgInVucGFja2VkX3NmaXhlZDMyIiwgInVucGFja2VkX3NmaXhlZDY0IiwgInVucGFja2VkX3NpbnQzMiIsICJ1bnBhY2tlZF9zaW50NjQiLCAidW5wYWNrZWRfdWludDMyIiwgInVucGFja2VkX3VpbnQ2NCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0VW5wYWNrZWRUeXBlc0xpdGVGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgODE2LCA4MDksIDgyNCwgNzczLCA3NzcsIDgwNSwgNzIwLCA3MjgsIDc4OSwgNzkzLCA3NTIsIDc2MCwgNzM2LCA3NDQgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRUeXBlc0xpdGUgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0VW5wYWNrZWRUeXBlc0xpdGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFVucGFja2VkVHlwZXNMaXRlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkSW50MzJGaWVsZE51bWJlciA9IDkwOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gdW5wYWNrZWRJbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFVucGFja2VkSW50MzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHVucGFja2VkSW50MzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRJbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRJbnQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFVucGFja2VkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVucGFja2VkSW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEludDY0RmllbGROdW1iZXIgPSA5MTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiB1bnBhY2tlZEludDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBVbnBhY2tlZEludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZEludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkSW50NjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkSW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0VW5wYWNrZWRJbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRJbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkVWludDMyRmllbGROdW1iZXIgPSA5MjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PiB1bnBhY2tlZFVpbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVpbnQ+IFVucGFja2VkVWludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFVpbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFVpbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRVaW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IEdldFVucGFja2VkVWludDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZFVpbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkVWludDY0RmllbGROdW1iZXIgPSA5MzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4gdW5wYWNrZWRVaW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IFVucGFja2VkVWludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFVpbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFVpbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRVaW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBHZXRVbnBhY2tlZFVpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRVaW50NjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFNpbnQzMkZpZWxkTnVtYmVyID0gOTQ7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiB1bnBhY2tlZFNpbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFVucGFja2VkU2ludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFNpbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFNpbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRTaW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRVbnBhY2tlZFNpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRTaW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFNpbnQ2NEZpZWxkTnVtYmVyID0gOTU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gdW5wYWNrZWRTaW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGxvbmc+IFVucGFja2VkU2ludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFNpbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFNpbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRTaW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0VW5wYWNrZWRTaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVucGFja2VkU2ludDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRGaXhlZDMyRmllbGROdW1iZXIgPSA5NjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PiB1bnBhY2tlZEZpeGVkMzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1aW50PiBVbnBhY2tlZEZpeGVkMzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHVucGFja2VkRml4ZWQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZEZpeGVkMzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkRml4ZWQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgR2V0VW5wYWNrZWRGaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZEZpeGVkMzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEZpeGVkNjRGaWVsZE51bWJlciA9IDk3Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiB1bnBhY2tlZEZpeGVkNjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IFVucGFja2VkRml4ZWQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRGaXhlZDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkRml4ZWQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRGaXhlZDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgR2V0VW5wYWNrZWRGaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZEZpeGVkNjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFNmaXhlZDMyRmllbGROdW1iZXIgPSA5ODsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IHVucGFja2VkU2ZpeGVkMzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBVbnBhY2tlZFNmaXhlZDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZFNmaXhlZDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkU2ZpeGVkMzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkU2ZpeGVkMzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRVbnBhY2tlZFNmaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZFNmaXhlZDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRTZml4ZWQ2NEZpZWxkTnVtYmVyID0gOTk7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gdW5wYWNrZWRTZml4ZWQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gVW5wYWNrZWRTZml4ZWQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRTZml4ZWQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFNmaXhlZDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZFNmaXhlZDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEdldFVucGFja2VkU2ZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVucGFja2VkU2ZpeGVkNjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEZsb2F0RmllbGROdW1iZXIgPSAxMDA7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8ZmxvYXQ+IHVucGFja2VkRmxvYXRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGZsb2F0PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxmbG9hdD4gVW5wYWNrZWRGbG9hdExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRGbG9hdF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZEZsb2F0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZEZsb2F0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBHZXRVbnBhY2tlZEZsb2F0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZEZsb2F0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWREb3VibGVGaWVsZE51bWJlciA9IDEwMTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxkb3VibGU+IHVucGFja2VkRG91YmxlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxkb3VibGU+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGRvdWJsZT4gVW5wYWNrZWREb3VibGVMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHVucGFja2VkRG91YmxlXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkRG91YmxlQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZERvdWJsZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZG91YmxlIEdldFVucGFja2VkRG91YmxlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZERvdWJsZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkQm9vbEZpZWxkTnVtYmVyID0gMTAyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGJvb2w+IHVucGFja2VkQm9vbF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Ym9vbD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Ym9vbD4gVW5wYWNrZWRCb29sTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZEJvb2xfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRCb29sQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZEJvb2xfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgR2V0VW5wYWNrZWRCb29sKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZEJvb2xfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEVudW1GaWVsZE51bWJlciA9IDEwMzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5VbnBhY2tlZFR5cGVzRm9yZWlnbkVudW1MaXRlPiB1bnBhY2tlZEVudW1fID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVucGFja2VkVHlwZXNGb3JlaWduRW51bUxpdGU+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVucGFja2VkVHlwZXNGb3JlaWduRW51bUxpdGU+IFVucGFja2VkRW51bUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRFbnVtXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkRW51bUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRFbnVtXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5VbnBhY2tlZFR5cGVzRm9yZWlnbkVudW1MaXRlIEdldFVucGFja2VkRW51bShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRFbnVtX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0VW5wYWNrZWRUeXBlc0xpdGVGaWVsZE5hbWVzOw0KKyAgICAgIGlmICh1bnBhY2tlZEludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyQXJyYXkoOTAsIGZpZWxkX25hbWVzWzZdLCB1bnBhY2tlZEludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1bnBhY2tlZEludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0QXJyYXkoOTEsIGZpZWxkX25hbWVzWzddLCB1bnBhY2tlZEludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1bnBhY2tlZFVpbnQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50MzJBcnJheSg5MiwgZmllbGRfbmFtZXNbMTJdLCB1bnBhY2tlZFVpbnQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRVaW50NjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlVUludDY0QXJyYXkoOTMsIGZpZWxkX25hbWVzWzEzXSwgdW5wYWNrZWRVaW50NjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHVucGFja2VkU2ludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNJbnQzMkFycmF5KDk0LCBmaWVsZF9uYW1lc1sxMF0sIHVucGFja2VkU2ludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1bnBhY2tlZFNpbnQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTSW50NjRBcnJheSg5NSwgZmllbGRfbmFtZXNbMTFdLCB1bnBhY2tlZFNpbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRGaXhlZDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkMzJBcnJheSg5NiwgZmllbGRfbmFtZXNbM10sIHVucGFja2VkRml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRGaXhlZDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkNjRBcnJheSg5NywgZmllbGRfbmFtZXNbNF0sIHVucGFja2VkRml4ZWQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRTZml4ZWQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQzMkFycmF5KDk4LCBmaWVsZF9uYW1lc1s4XSwgdW5wYWNrZWRTZml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQ2NEFycmF5KDk5LCBmaWVsZF9uYW1lc1s5XSwgdW5wYWNrZWRTZml4ZWQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRGbG9hdF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdEFycmF5KDEwMCwgZmllbGRfbmFtZXNbNV0sIHVucGFja2VkRmxvYXRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHVucGFja2VkRG91YmxlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZURvdWJsZUFycmF5KDEwMSwgZmllbGRfbmFtZXNbMV0sIHVucGFja2VkRG91YmxlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1bnBhY2tlZEJvb2xfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbEFycmF5KDEwMiwgZmllbGRfbmFtZXNbMF0sIHVucGFja2VkQm9vbF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW1BcnJheSgxMDMsIGZpZWxkX25hbWVzWzJdLCB1bnBhY2tlZEVudW1fKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChpbnQgZWxlbWVudCBpbiBVbnBhY2tlZEludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkSW50MzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAobG9uZyBlbGVtZW50IGluIFVucGFja2VkSW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRJbnQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoICh1aW50IGVsZW1lbnQgaW4gVW5wYWNrZWRVaW50MzJMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkVWludDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHVsb25nIGVsZW1lbnQgaW4gVW5wYWNrZWRVaW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkVWludDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIFVucGFja2VkU2ludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZFNpbnQzMl8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChsb25nIGVsZW1lbnQgaW4gVW5wYWNrZWRTaW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkU2ludDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHVucGFja2VkRml4ZWQzMl8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRGaXhlZDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHVucGFja2VkRml4ZWQ2NF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRGaXhlZDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHVucGFja2VkU2ZpeGVkMzJfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkU2ZpeGVkMzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogdW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDQgKiB1bnBhY2tlZEZsb2F0Xy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZEZsb2F0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHVucGFja2VkRG91YmxlXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZERvdWJsZV8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDEgKiB1bnBhY2tlZEJvb2xfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkQm9vbF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBpZiAodW5wYWNrZWRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5wYWNrZWRUeXBlc0ZvcmVpZ25FbnVtTGl0ZSBlbGVtZW50IGluIHVucGFja2VkRW51bV8pIHsNCisgICAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplTm9UYWcoKGludCkgZWxlbWVudCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRFbnVtXy5Db3VudDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgI3JlZ2lvbiBMaXRlIHJ1bnRpbWUgbWV0aG9kcw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgew0KKyAgICAgIGludCBoYXNoID0gR2V0VHlwZSgpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChpbnQgaSBpbiB1bnBhY2tlZEludDMyXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2gobG9uZyBpIGluIHVucGFja2VkSW50NjRfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaCh1aW50IGkgaW4gdW5wYWNrZWRVaW50MzJfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaCh1bG9uZyBpIGluIHVucGFja2VkVWludDY0XykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2goaW50IGkgaW4gdW5wYWNrZWRTaW50MzJfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChsb25nIGkgaW4gdW5wYWNrZWRTaW50NjRfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaCh1aW50IGkgaW4gdW5wYWNrZWRGaXhlZDMyXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2godWxvbmcgaSBpbiB1bnBhY2tlZEZpeGVkNjRfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChpbnQgaSBpbiB1bnBhY2tlZFNmaXhlZDMyXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2gobG9uZyBpIGluIHVucGFja2VkU2ZpeGVkNjRfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChmbG9hdCBpIGluIHVucGFja2VkRmxvYXRfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChkb3VibGUgaSBpbiB1bnBhY2tlZERvdWJsZV8pDQorICAgICAgICBoYXNoIF49IGkuR2V0SGFzaENvZGUoKTsNCisgICAgICBmb3JlYWNoKGJvb2wgaSBpbiB1bnBhY2tlZEJvb2xfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5VbnBhY2tlZFR5cGVzRm9yZWlnbkVudW1MaXRlIGkgaW4gdW5wYWNrZWRFbnVtXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIHJldHVybiBoYXNoOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikgew0KKyAgICAgIFRlc3RVbnBhY2tlZFR5cGVzTGl0ZSBvdGhlciA9IG9iaiBhcyBUZXN0VW5wYWNrZWRUeXBlc0xpdGU7DQorICAgICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsNCisgICAgICBpZih1bnBhY2tlZEludDMyXy5Db3VudCAhPSBvdGhlci51bnBhY2tlZEludDMyXy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCB1bnBhY2tlZEludDMyXy5Db3VudDsgaXgrKykNCisgICAgICAgIGlmKCF1bnBhY2tlZEludDMyX1tpeF0uRXF1YWxzKG90aGVyLnVucGFja2VkSW50MzJfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZih1bnBhY2tlZEludDY0Xy5Db3VudCAhPSBvdGhlci51bnBhY2tlZEludDY0Xy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCB1bnBhY2tlZEludDY0Xy5Db3VudDsgaXgrKykNCisgICAgICAgIGlmKCF1bnBhY2tlZEludDY0X1tpeF0uRXF1YWxzKG90aGVyLnVucGFja2VkSW50NjRfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZih1bnBhY2tlZFVpbnQzMl8uQ291bnQgIT0gb3RoZXIudW5wYWNrZWRVaW50MzJfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHVucGFja2VkVWludDMyXy5Db3VudDsgaXgrKykNCisgICAgICAgIGlmKCF1bnBhY2tlZFVpbnQzMl9baXhdLkVxdWFscyhvdGhlci51bnBhY2tlZFVpbnQzMl9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHVucGFja2VkVWludDY0Xy5Db3VudCAhPSBvdGhlci51bnBhY2tlZFVpbnQ2NF8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgdW5wYWNrZWRVaW50NjRfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXVucGFja2VkVWludDY0X1tpeF0uRXF1YWxzKG90aGVyLnVucGFja2VkVWludDY0X1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYodW5wYWNrZWRTaW50MzJfLkNvdW50ICE9IG90aGVyLnVucGFja2VkU2ludDMyXy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCB1bnBhY2tlZFNpbnQzMl8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighdW5wYWNrZWRTaW50MzJfW2l4XS5FcXVhbHMob3RoZXIudW5wYWNrZWRTaW50MzJfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZih1bnBhY2tlZFNpbnQ2NF8uQ291bnQgIT0gb3RoZXIudW5wYWNrZWRTaW50NjRfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHVucGFja2VkU2ludDY0Xy5Db3VudDsgaXgrKykNCisgICAgICAgIGlmKCF1bnBhY2tlZFNpbnQ2NF9baXhdLkVxdWFscyhvdGhlci51bnBhY2tlZFNpbnQ2NF9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHVucGFja2VkRml4ZWQzMl8uQ291bnQgIT0gb3RoZXIudW5wYWNrZWRGaXhlZDMyXy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCB1bnBhY2tlZEZpeGVkMzJfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXVucGFja2VkRml4ZWQzMl9baXhdLkVxdWFscyhvdGhlci51bnBhY2tlZEZpeGVkMzJfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZih1bnBhY2tlZEZpeGVkNjRfLkNvdW50ICE9IG90aGVyLnVucGFja2VkRml4ZWQ2NF8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgdW5wYWNrZWRGaXhlZDY0Xy5Db3VudDsgaXgrKykNCisgICAgICAgIGlmKCF1bnBhY2tlZEZpeGVkNjRfW2l4XS5FcXVhbHMob3RoZXIudW5wYWNrZWRGaXhlZDY0X1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYodW5wYWNrZWRTZml4ZWQzMl8uQ291bnQgIT0gb3RoZXIudW5wYWNrZWRTZml4ZWQzMl8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgdW5wYWNrZWRTZml4ZWQzMl8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighdW5wYWNrZWRTZml4ZWQzMl9baXhdLkVxdWFscyhvdGhlci51bnBhY2tlZFNmaXhlZDMyX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYodW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQgIT0gb3RoZXIudW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgdW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighdW5wYWNrZWRTZml4ZWQ2NF9baXhdLkVxdWFscyhvdGhlci51bnBhY2tlZFNmaXhlZDY0X1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYodW5wYWNrZWRGbG9hdF8uQ291bnQgIT0gb3RoZXIudW5wYWNrZWRGbG9hdF8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgdW5wYWNrZWRGbG9hdF8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighdW5wYWNrZWRGbG9hdF9baXhdLkVxdWFscyhvdGhlci51bnBhY2tlZEZsb2F0X1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYodW5wYWNrZWREb3VibGVfLkNvdW50ICE9IG90aGVyLnVucGFja2VkRG91YmxlXy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCB1bnBhY2tlZERvdWJsZV8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighdW5wYWNrZWREb3VibGVfW2l4XS5FcXVhbHMob3RoZXIudW5wYWNrZWREb3VibGVfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZih1bnBhY2tlZEJvb2xfLkNvdW50ICE9IG90aGVyLnVucGFja2VkQm9vbF8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgdW5wYWNrZWRCb29sXy5Db3VudDsgaXgrKykNCisgICAgICAgIGlmKCF1bnBhY2tlZEJvb2xfW2l4XS5FcXVhbHMob3RoZXIudW5wYWNrZWRCb29sX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYodW5wYWNrZWRFbnVtXy5Db3VudCAhPSBvdGhlci51bnBhY2tlZEVudW1fLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHVucGFja2VkRW51bV8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighdW5wYWNrZWRFbnVtX1tpeF0uRXF1YWxzKG90aGVyLnVucGFja2VkRW51bV9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludFRvKGdsb2JhbDo6U3lzdGVtLklPLlRleHRXcml0ZXIgd3JpdGVyKSB7DQorICAgICAgUHJpbnRGaWVsZCgidW5wYWNrZWRfaW50MzIiLCB1bnBhY2tlZEludDMyXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJ1bnBhY2tlZF9pbnQ2NCIsIHVucGFja2VkSW50NjRfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoInVucGFja2VkX3VpbnQzMiIsIHVucGFja2VkVWludDMyXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJ1bnBhY2tlZF91aW50NjQiLCB1bnBhY2tlZFVpbnQ2NF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgidW5wYWNrZWRfc2ludDMyIiwgdW5wYWNrZWRTaW50MzJfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoInVucGFja2VkX3NpbnQ2NCIsIHVucGFja2VkU2ludDY0Xywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJ1bnBhY2tlZF9maXhlZDMyIiwgdW5wYWNrZWRGaXhlZDMyXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJ1bnBhY2tlZF9maXhlZDY0IiwgdW5wYWNrZWRGaXhlZDY0Xywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJ1bnBhY2tlZF9zZml4ZWQzMiIsIHVucGFja2VkU2ZpeGVkMzJfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoInVucGFja2VkX3NmaXhlZDY0IiwgdW5wYWNrZWRTZml4ZWQ2NF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgidW5wYWNrZWRfZmxvYXQiLCB1bnBhY2tlZEZsb2F0Xywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJ1bnBhY2tlZF9kb3VibGUiLCB1bnBhY2tlZERvdWJsZV8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgidW5wYWNrZWRfYm9vbCIsIHVucGFja2VkQm9vbF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgidW5wYWNrZWRfZW51bSIsIHVucGFja2VkRW51bV8sIHdyaXRlcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRUeXBlc0xpdGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXNMaXRlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzTGl0ZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXNMaXRlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRUeXBlc0xpdGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXNMaXRlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzTGl0ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRUeXBlc0xpdGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXNMaXRlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzTGl0ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0VW5wYWNrZWRUeXBlc0xpdGUgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHVucGFja2VkSW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkSW50NjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkVWludDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB1bnBhY2tlZFVpbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRTaW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkU2ludDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB1bnBhY2tlZEZpeGVkMzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkRml4ZWQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRTZml4ZWQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRTZml4ZWQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRGbG9hdF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWREb3VibGVfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkQm9vbF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRFbnVtXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RVbnBhY2tlZFR5cGVzTGl0ZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLlNlcmlhbGl6YWJsZUF0dHJpYnV0ZSgpXQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyTGl0ZTxUZXN0VW5wYWNrZWRUeXBlc0xpdGUsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RVbnBhY2tlZFR5cGVzTGl0ZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RVbnBhY2tlZFR5cGVzTGl0ZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0VW5wYWNrZWRUeXBlc0xpdGUgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0VW5wYWNrZWRUeXBlc0xpdGUgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0VW5wYWNrZWRUeXBlc0xpdGUoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RVbnBhY2tlZFR5cGVzTGl0ZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RVbnBhY2tlZFR5cGVzTGl0ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRUeXBlc0xpdGUuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0VW5wYWNrZWRUeXBlc0xpdGUgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZUxpdGUgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0VW5wYWNrZWRUeXBlc0xpdGUpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdFVucGFja2VkVHlwZXNMaXRlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdFVucGFja2VkVHlwZXNMaXRlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkVHlwZXNMaXRlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkSW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVucGFja2VkSW50MzJfLkFkZChvdGhlci51bnBhY2tlZEludDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRJbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRJbnQ2NF8uQWRkKG90aGVyLnVucGFja2VkSW50NjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZFVpbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50MzJfLkFkZChvdGhlci51bnBhY2tlZFVpbnQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkVWludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZFVpbnQ2NF8uQWRkKG90aGVyLnVucGFja2VkVWludDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRTaW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVucGFja2VkU2ludDMyXy5BZGQob3RoZXIudW5wYWNrZWRTaW50MzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZFNpbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50NjRfLkFkZChvdGhlci51bnBhY2tlZFNpbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkRml4ZWQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRGaXhlZDMyXy5BZGQob3RoZXIudW5wYWNrZWRGaXhlZDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRGaXhlZDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkNjRfLkFkZChvdGhlci51bnBhY2tlZEZpeGVkNjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZFNmaXhlZDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZFNmaXhlZDMyXy5BZGQob3RoZXIudW5wYWNrZWRTZml4ZWQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkU2ZpeGVkNjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVucGFja2VkU2ZpeGVkNjRfLkFkZChvdGhlci51bnBhY2tlZFNmaXhlZDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRGbG9hdF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRGbG9hdF8uQWRkKG90aGVyLnVucGFja2VkRmxvYXRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZERvdWJsZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWREb3VibGVfLkFkZChvdGhlci51bnBhY2tlZERvdWJsZV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkQm9vbF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRCb29sXy5BZGQob3RoZXIudW5wYWNrZWRCb29sXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRFbnVtXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZEVudW1fLkFkZChvdGhlci51bnBhY2tlZEVudW1fKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0VW5wYWNrZWRUeXBlc0xpdGVGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFVucGFja2VkVHlwZXNMaXRlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDcyMjoNCisgICAgICAgICAgICBjYXNlIDcyMDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRJbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzMwOg0KKyAgICAgICAgICAgIGNhc2UgNzI4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZEludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3Mzg6DQorICAgICAgICAgICAgY2FzZSA3MzY6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRVSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZFVpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzQ2Og0KKyAgICAgICAgICAgIGNhc2UgNzQ0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkVUludDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRVaW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc1NDoNCisgICAgICAgICAgICBjYXNlIDc1Mjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkU2ludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NjI6DQorICAgICAgICAgICAgY2FzZSA3NjA6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZFNpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzcwOg0KKyAgICAgICAgICAgIGNhc2UgNzczOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRml4ZWQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkRml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzc4Og0KKyAgICAgICAgICAgIGNhc2UgNzc3OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRml4ZWQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkRml4ZWQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzg2Og0KKyAgICAgICAgICAgIGNhc2UgNzg5OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ZpeGVkMzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZFNmaXhlZDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3OTQ6DQorICAgICAgICAgICAgY2FzZSA3OTM6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTRml4ZWQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkU2ZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgwMjoNCisgICAgICAgICAgICBjYXNlIDgwNTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEZsb2F0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODEwOg0KKyAgICAgICAgICAgIGNhc2UgODA5OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRG91YmxlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWREb3VibGVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgxODoNCisgICAgICAgICAgICBjYXNlIDgxNjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEJvb2xBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZEJvb2xfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgyNjoNCisgICAgICAgICAgICBjYXNlIDgyNDogew0KKyAgICAgICAgICAgICAgc2NnOjpJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd25JdGVtczsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXk8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5wYWNrZWRUeXBlc0ZvcmVpZ25FbnVtTGl0ZT4odGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRFbnVtXywgb3V0IHVua25vd25JdGVtcyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBVbnBhY2tlZEludDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZEludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkSW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkSW50MzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFVucGFja2VkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkSW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZEludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkSW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkSW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZEludDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRJbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gVW5wYWNrZWRJbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRJbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZEludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbnBhY2tlZEludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0VW5wYWNrZWRJbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRJbnQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkSW50NjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkSW50NjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkSW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRJbnQ2NChzY2c6OklFbnVtZXJhYmxlPGxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEludDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkSW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkSW50NjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1aW50PiBVbnBhY2tlZFVpbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRVaW50MzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRVaW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkVWludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgR2V0VW5wYWNrZWRVaW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkVWludDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRVaW50MzIoaW50IGluZGV4LCB1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkVWludDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZFVpbnQzMih1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkVWludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRVaW50MzIoc2NnOjpJRW51bWVyYWJsZTx1aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRVaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkVWludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IFVucGFja2VkVWludDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZFVpbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZFVpbnQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRVaW50NjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgR2V0VW5wYWNrZWRVaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkVWludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRVaW50NjQoaW50IGluZGV4LCB1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFVpbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRVaW50NjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50NjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZFVpbnQ2NChzY2c6OklFbnVtZXJhYmxlPHVsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRVaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkVWludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBVbnBhY2tlZFNpbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRTaW50MzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRTaW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkU2ludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXRVbnBhY2tlZFNpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRTaW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZFNpbnQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNpbnQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRTaW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRTaW50MzIoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNpbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZFNpbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50MzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBVbnBhY2tlZFNpbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRTaW50NjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRTaW50NjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkU2ludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0VW5wYWNrZWRTaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkU2ludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRTaW50NjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ludDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZFNpbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRTaW50NjQoc2NnOjpJRW51bWVyYWJsZTxsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRTaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWludD4gVW5wYWNrZWRGaXhlZDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZEZpeGVkMzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRGaXhlZDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbnBhY2tlZEZpeGVkMzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBHZXRVbnBhY2tlZEZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkRml4ZWQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkRml4ZWQzMihpbnQgaW5kZXgsIHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRGaXhlZDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZEZpeGVkMzIodWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkMzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZEZpeGVkMzIoc2NnOjpJRW51bWVyYWJsZTx1aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRGaXhlZDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkRml4ZWQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRGaXhlZDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IFVucGFja2VkRml4ZWQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRGaXhlZDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkRml4ZWQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRGaXhlZDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEdldFVucGFja2VkRml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRGaXhlZDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRGaXhlZDY0KGludCBpbmRleCwgdWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRGaXhlZDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZEZpeGVkNjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRGaXhlZDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRGaXhlZDY0KHNjZzo6SUVudW1lcmFibGU8dWxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkNjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRGaXhlZDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkNjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IFVucGFja2VkU2ZpeGVkMzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkU2ZpeGVkMzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRTZml4ZWQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRTZml4ZWQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0VW5wYWNrZWRTZml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRTZml4ZWQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkU2ZpeGVkMzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRTZml4ZWQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkU2ZpeGVkMzIoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNmaXhlZDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkU2ZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ZpeGVkMzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBVbnBhY2tlZFNmaXhlZDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZFNmaXhlZDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkU2ZpeGVkNjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkU2ZpeGVkNjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBHZXRVbnBhY2tlZFNmaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZFNmaXhlZDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRTZml4ZWQ2NChpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRTZml4ZWQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ZpeGVkNjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZFNmaXhlZDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ZpeGVkNjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRTZml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGZsb2F0PiBVbnBhY2tlZEZsb2F0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZEZsb2F0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkRmxvYXRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkRmxvYXRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgR2V0VW5wYWNrZWRGbG9hdChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRGbG9hdChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkRmxvYXQoaW50IGluZGV4LCBmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZsb2F0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZEZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRmxvYXRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZEZsb2F0KHNjZzo6SUVudW1lcmFibGU8ZmxvYXQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZsb2F0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRmxvYXRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxkb3VibGU+IFVucGFja2VkRG91YmxlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZERvdWJsZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZERvdWJsZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWREb3VibGVDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZG91YmxlIEdldFVucGFja2VkRG91YmxlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZERvdWJsZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkRG91YmxlKGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRG91YmxlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZERvdWJsZShkb3VibGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWREb3VibGVfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZERvdWJsZShzY2c6OklFbnVtZXJhYmxlPGRvdWJsZT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRG91YmxlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkRG91YmxlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZERvdWJsZV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGJvb2w+IFVucGFja2VkQm9vbExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRCb29sXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkQm9vbENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRCb29sQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgR2V0VW5wYWNrZWRCb29sKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZEJvb2woaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZEJvb2woaW50IGluZGV4LCBib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkQm9vbF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRCb29sKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRCb29sXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRCb29sKHNjZzo6SUVudW1lcmFibGU8Ym9vbD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkQm9vbF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZEJvb2woKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkQm9vbF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVucGFja2VkVHlwZXNGb3JlaWduRW51bUxpdGU+IFVucGFja2VkRW51bUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRFbnVtXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkRW51bUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRFbnVtQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVucGFja2VkVHlwZXNGb3JlaWduRW51bUxpdGUgR2V0VW5wYWNrZWRFbnVtKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZEVudW0oaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZEVudW0oaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5VbnBhY2tlZFR5cGVzRm9yZWlnbkVudW1MaXRlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRW51bV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRFbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVucGFja2VkVHlwZXNGb3JlaWduRW51bUxpdGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRFbnVtXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRFbnVtKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5wYWNrZWRUeXBlc0ZvcmVpZ25FbnVtTGl0ZT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRW51bV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZEVudW0oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRW51bV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXNMaXRlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RFeHRyYXNMaXRlUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGVBdHRyaWJ1dGUoKV0NCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVja2V0T2ZCeXRlcyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxCdWNrZXRPZkJ5dGVzLCBCdWNrZXRPZkJ5dGVzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBCdWNrZXRPZkJ5dGVzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEJ1Y2tldE9mQnl0ZXMgZGVmYXVsdEluc3RhbmNlID0gbmV3IEJ1Y2tldE9mQnl0ZXMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2J1Y2tldE9mQnl0ZXNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInZhbHVlIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2J1Y2tldE9mQnl0ZXNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAgfTsNCisgICAgcHVibGljIHN0YXRpYyBCdWNrZXRPZkJ5dGVzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVja2V0T2ZCeXRlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWNrZXRPZkJ5dGVzIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFZhbHVlRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzVmFsdWU7DQorICAgIHByaXZhdGUgcGI6OkJ5dGVTdHJpbmcgdmFsdWVfID0gcGI6OkJ5dGVTdHJpbmcuRW1wdHk7DQorICAgIHB1YmxpYyBib29sIEhhc1ZhbHVlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzVmFsdWU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgVmFsdWUgew0KKyAgICAgIGdldCB7IHJldHVybiB2YWx1ZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2J1Y2tldE9mQnl0ZXNGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNWYWx1ZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQnl0ZXMoMSwgZmllbGRfbmFtZXNbMF0sIFZhbHVlKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNWYWx1ZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJ5dGVzU2l6ZSgxLCBWYWx1ZSk7DQorICAgICAgfQ0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgICNyZWdpb24gTGl0ZSBydW50aW1lIG1ldGhvZHMNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsNCisgICAgICBpbnQgaGFzaCA9IEdldFR5cGUoKS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNWYWx1ZSkgaGFzaCBePSB2YWx1ZV8uR2V0SGFzaENvZGUoKTsNCisgICAgICByZXR1cm4gaGFzaDsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopIHsNCisgICAgICBCdWNrZXRPZkJ5dGVzIG90aGVyID0gb2JqIGFzIEJ1Y2tldE9mQnl0ZXM7DQorICAgICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzVmFsdWUgIT0gb3RoZXIuaGFzVmFsdWUgfHwgKGhhc1ZhbHVlICYmICF2YWx1ZV8uRXF1YWxzKG90aGVyLnZhbHVlXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFByaW50VG8oZ2xvYmFsOjpTeXN0ZW0uSU8uVGV4dFdyaXRlciB3cml0ZXIpIHsNCisgICAgICBQcmludEZpZWxkKCJ2YWx1ZSIsIGhhc1ZhbHVlLCB2YWx1ZV8sIHdyaXRlcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWNrZXRPZkJ5dGVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1Y2tldE9mQnl0ZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVja2V0T2ZCeXRlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVja2V0T2ZCeXRlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVja2V0T2ZCeXRlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCdWNrZXRPZkJ5dGVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1Y2tldE9mQnl0ZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVja2V0T2ZCeXRlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCdWNrZXRPZkJ5dGVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1Y2tldE9mQnl0ZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgQnVja2V0T2ZCeXRlcyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihCdWNrZXRPZkJ5dGVzIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uU2VyaWFsaXphYmxlQXR0cmlidXRlKCldDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXJMaXRlPEJ1Y2tldE9mQnl0ZXMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEJ1Y2tldE9mQnl0ZXMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBCdWNrZXRPZkJ5dGVzIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIEJ1Y2tldE9mQnl0ZXMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBCdWNrZXRPZkJ5dGVzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgQnVja2V0T2ZCeXRlcygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVja2V0T2ZCeXRlcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1Y2tldE9mQnl0ZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQnVja2V0T2ZCeXRlcy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1Y2tldE9mQnl0ZXMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZUxpdGUgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBCdWNrZXRPZkJ5dGVzKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEJ1Y2tldE9mQnl0ZXMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShCdWNrZXRPZkJ5dGVzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQnVja2V0T2ZCeXRlcy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNWYWx1ZSkgew0KKyAgICAgICAgICBWYWx1ZSA9IG90aGVyLlZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2J1Y2tldE9mQnl0ZXNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfYnVja2V0T2ZCeXRlc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1ZhbHVlID0gaW5wdXQuUmVhZEJ5dGVzKHJlZiByZXN1bHQudmFsdWVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzVmFsdWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNWYWx1ZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgVmFsdWUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5WYWx1ZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0VmFsdWUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFZhbHVlKHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNWYWx1ZSA9IHRydWU7DQorICAgICAgICByZXN1bHQudmFsdWVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJWYWx1ZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzVmFsdWUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC52YWx1ZV8gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgQnVja2V0T2ZCeXRlcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0RXh0cmFzTGl0ZVByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uU2VyaWFsaXphYmxlQXR0cmlidXRlKCldDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1Y2tldE9mQnl0ZXNFeCA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxCdWNrZXRPZkJ5dGVzRXgsIEJ1Y2tldE9mQnl0ZXNFeC5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgQnVja2V0T2ZCeXRlc0V4KCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEJ1Y2tldE9mQnl0ZXNFeCBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQnVja2V0T2ZCeXRlc0V4KCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9idWNrZXRPZkJ5dGVzRXhGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInZhbHVlIiwgInZhbHVlMiIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9idWNrZXRPZkJ5dGVzRXhGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAsIDIwNDIgfTsNCisgICAgcHVibGljIHN0YXRpYyBCdWNrZXRPZkJ5dGVzRXggRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWNrZXRPZkJ5dGVzRXggRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVja2V0T2ZCeXRlc0V4IFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFZhbHVlRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzVmFsdWU7DQorICAgIHByaXZhdGUgcGI6OkJ5dGVTdHJpbmcgdmFsdWVfID0gcGI6OkJ5dGVTdHJpbmcuRW1wdHk7DQorICAgIHB1YmxpYyBib29sIEhhc1ZhbHVlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzVmFsdWU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgVmFsdWUgew0KKyAgICAgIGdldCB7IHJldHVybiB2YWx1ZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBWYWx1ZTJGaWVsZE51bWJlciA9IDI1NTsNCisgICAgcHJpdmF0ZSBib29sIGhhc1ZhbHVlMjsNCisgICAgcHJpdmF0ZSBwYjo6Qnl0ZVN0cmluZyB2YWx1ZTJfID0gcGI6OkJ5dGVTdHJpbmcuRW1wdHk7DQorICAgIHB1YmxpYyBib29sIEhhc1ZhbHVlMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1ZhbHVlMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBWYWx1ZTIgew0KKyAgICAgIGdldCB7IHJldHVybiB2YWx1ZTJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9idWNrZXRPZkJ5dGVzRXhGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNWYWx1ZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQnl0ZXMoMSwgZmllbGRfbmFtZXNbMF0sIFZhbHVlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1ZhbHVlMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQnl0ZXMoMjU1LCBmaWVsZF9uYW1lc1sxXSwgVmFsdWUyKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNWYWx1ZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJ5dGVzU2l6ZSgxLCBWYWx1ZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNWYWx1ZTIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCeXRlc1NpemUoMjU1LCBWYWx1ZTIpOw0KKyAgICAgIH0NCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICAjcmVnaW9uIExpdGUgcnVudGltZSBtZXRob2RzDQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7DQorICAgICAgaW50IGhhc2ggPSBHZXRUeXBlKCkuR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzVmFsdWUpIGhhc2ggXj0gdmFsdWVfLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc1ZhbHVlMikgaGFzaCBePSB2YWx1ZTJfLkdldEhhc2hDb2RlKCk7DQorICAgICAgcmV0dXJuIGhhc2g7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKSB7DQorICAgICAgQnVja2V0T2ZCeXRlc0V4IG90aGVyID0gb2JqIGFzIEJ1Y2tldE9mQnl0ZXNFeDsNCisgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNWYWx1ZSAhPSBvdGhlci5oYXNWYWx1ZSB8fCAoaGFzVmFsdWUgJiYgIXZhbHVlXy5FcXVhbHMob3RoZXIudmFsdWVfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzVmFsdWUyICE9IG90aGVyLmhhc1ZhbHVlMiB8fCAoaGFzVmFsdWUyICYmICF2YWx1ZTJfLkVxdWFscyhvdGhlci52YWx1ZTJfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUHJpbnRUbyhnbG9iYWw6OlN5c3RlbS5JTy5UZXh0V3JpdGVyIHdyaXRlcikgew0KKyAgICAgIFByaW50RmllbGQoInZhbHVlIiwgaGFzVmFsdWUsIHZhbHVlXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJ2YWx1ZTIiLCBoYXNWYWx1ZTIsIHZhbHVlMl8sIHdyaXRlcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWNrZXRPZkJ5dGVzRXggUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVja2V0T2ZCeXRlc0V4IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1Y2tldE9mQnl0ZXNFeCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVja2V0T2ZCeXRlc0V4IFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCdWNrZXRPZkJ5dGVzRXggUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVja2V0T2ZCeXRlc0V4IFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1Y2tldE9mQnl0ZXNFeCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCdWNrZXRPZkJ5dGVzRXggUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVja2V0T2ZCeXRlc0V4IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1Y2tldE9mQnl0ZXNFeCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBCdWNrZXRPZkJ5dGVzRXggTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQnVja2V0T2ZCeXRlc0V4IHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uU2VyaWFsaXphYmxlQXR0cmlidXRlKCldDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXJMaXRlPEJ1Y2tldE9mQnl0ZXNFeCwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoQnVja2V0T2ZCeXRlc0V4IGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgQnVja2V0T2ZCeXRlc0V4IHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIEJ1Y2tldE9mQnl0ZXNFeCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEJ1Y2tldE9mQnl0ZXNFeCBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEJ1Y2tldE9mQnl0ZXNFeCgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVja2V0T2ZCeXRlc0V4IE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVja2V0T2ZCeXRlc0V4IERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJ1Y2tldE9mQnl0ZXNFeC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1Y2tldE9mQnl0ZXNFeCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlTGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEJ1Y2tldE9mQnl0ZXNFeCkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChCdWNrZXRPZkJ5dGVzRXgpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShCdWNrZXRPZkJ5dGVzRXggb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CdWNrZXRPZkJ5dGVzRXguRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzVmFsdWUpIHsNCisgICAgICAgICAgVmFsdWUgPSBvdGhlci5WYWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNWYWx1ZTIpIHsNCisgICAgICAgICAgVmFsdWUyID0gb3RoZXIuVmFsdWUyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2J1Y2tldE9mQnl0ZXNFeEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9idWNrZXRPZkJ5dGVzRXhGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNWYWx1ZSA9IGlucHV0LlJlYWRCeXRlcyhyZWYgcmVzdWx0LnZhbHVlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMDQyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzVmFsdWUyID0gaW5wdXQuUmVhZEJ5dGVzKHJlZiByZXN1bHQudmFsdWUyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1ZhbHVlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzVmFsdWU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIFZhbHVlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVmFsdWU7IH0NCisgICAgICAgIHNldCB7IFNldFZhbHVlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRWYWx1ZShwYjo6Qnl0ZVN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzVmFsdWUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnZhbHVlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVmFsdWUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ZhbHVlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQudmFsdWVfID0gcGI6OkJ5dGVTdHJpbmcuRW1wdHk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzVmFsdWUyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzVmFsdWUyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBWYWx1ZTIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5WYWx1ZTI7IH0NCisgICAgICAgIHNldCB7IFNldFZhbHVlMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VmFsdWUyKHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNWYWx1ZTIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnZhbHVlMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclZhbHVlMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzVmFsdWUyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQudmFsdWUyXyA9IHBiOjpCeXRlU3RyaW5nLkVtcHR5Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBCdWNrZXRPZkJ5dGVzRXgoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEV4dHJhc0xpdGVQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorfQ0KKw0KKyNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMWY0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0SW1wb3J0TGl0ZVByb3RvRmlsZS5jcwpAQCAtMCwwICsxLDMwOCBAQAorLy8gR2VuZXJhdGVkIGJ5IFByb3RvR2VuLCBWZXJzaW9uPTIuNC4xLjU1NSwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj01NWY3MTI1MjM0YmViNTg5LiAgRE8gTk9UIEVESVQhDQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQ0KKyNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCisNCit1c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVyczsNCit1c2luZyBwYmMgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnM7DQordXNpbmcgcGJkID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcyB7DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlIHsNCisgIA0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gU3RhdGljIHZhcmlhYmxlcw0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gRXh0ZW5zaW9ucw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgb2JqZWN0IERlc2NyaXB0b3I7DQorICAgIHN0YXRpYyBVbml0VGVzdEltcG9ydExpdGVQcm90b0ZpbGUoKSB7DQorICAgICAgRGVzY3JpcHRvciA9IG51bGw7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgIH0NCisgICNyZWdpb24gRW51bXMNCisgIHB1YmxpYyBlbnVtIEltcG9ydEVudW1MaXRlIHsNCisgICAgSU1QT1JUX0xJVEVfRk9PID0gNywNCisgICAgSU1QT1JUX0xJVEVfQkFSID0gOCwNCisgICAgSU1QT1JUX0xJVEVfQkFaID0gOSwNCisgIH0NCisgIA0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorICAjcmVnaW9uIE1lc3NhZ2VzDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEltcG9ydE1lc3NhZ2VMaXRlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2VMaXRlPEltcG9ydE1lc3NhZ2VMaXRlLCBJbXBvcnRNZXNzYWdlTGl0ZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgSW1wb3J0TWVzc2FnZUxpdGUoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSW1wb3J0TWVzc2FnZUxpdGUgZGVmYXVsdEluc3RhbmNlID0gbmV3IEltcG9ydE1lc3NhZ2VMaXRlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9pbXBvcnRNZXNzYWdlTGl0ZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiZCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9pbXBvcnRNZXNzYWdlTGl0ZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZUxpdGUgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBJbXBvcnRNZXNzYWdlTGl0ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBJbXBvcnRNZXNzYWdlTGl0ZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBERmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRDsNCisgICAgcHJpdmF0ZSBpbnQgZF87DQorICAgIHB1YmxpYyBib29sIEhhc0Qgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEIHsNCisgICAgICBnZXQgeyByZXR1cm4gZF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2ltcG9ydE1lc3NhZ2VMaXRlRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzRCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgRCk7DQorICAgICAgfQ0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgICNyZWdpb24gTGl0ZSBydW50aW1lIG1ldGhvZHMNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsNCisgICAgICBpbnQgaGFzaCA9IEdldFR5cGUoKS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNEKSBoYXNoIF49IGRfLkdldEhhc2hDb2RlKCk7DQorICAgICAgcmV0dXJuIGhhc2g7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKSB7DQorICAgICAgSW1wb3J0TWVzc2FnZUxpdGUgb3RoZXIgPSBvYmogYXMgSW1wb3J0TWVzc2FnZUxpdGU7DQorICAgICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzRCAhPSBvdGhlci5oYXNEIHx8IChoYXNEICYmICFkXy5FcXVhbHMob3RoZXIuZF8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludFRvKGdsb2JhbDo6U3lzdGVtLklPLlRleHRXcml0ZXIgd3JpdGVyKSB7DQorICAgICAgUHJpbnRGaWVsZCgiZCIsIGhhc0QsIGRfLCB3cml0ZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZUxpdGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZUxpdGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZUxpdGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydE1lc3NhZ2VMaXRlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlTGl0ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlTGl0ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlTGl0ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlTGl0ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlTGl0ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlTGl0ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBJbXBvcnRNZXNzYWdlTGl0ZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihJbXBvcnRNZXNzYWdlTGl0ZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlckxpdGU8SW1wb3J0TWVzc2FnZUxpdGUsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEltcG9ydE1lc3NhZ2VMaXRlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgSW1wb3J0TWVzc2FnZUxpdGUgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgSW1wb3J0TWVzc2FnZUxpdGUgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBJbXBvcnRNZXNzYWdlTGl0ZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEltcG9ydE1lc3NhZ2VMaXRlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBJbXBvcnRNZXNzYWdlTGl0ZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEltcG9ydE1lc3NhZ2VMaXRlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2VMaXRlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgSW1wb3J0TWVzc2FnZUxpdGUgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZUxpdGUgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBJbXBvcnRNZXNzYWdlTGl0ZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChJbXBvcnRNZXNzYWdlTGl0ZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEltcG9ydE1lc3NhZ2VMaXRlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRCkgew0KKyAgICAgICAgICBEID0gb3RoZXIuRDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9pbXBvcnRNZXNzYWdlTGl0ZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9pbXBvcnRNZXNzYWdlTGl0ZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0Q7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0QgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIEltcG9ydE1lc3NhZ2VMaXRlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RJbXBvcnRMaXRlUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgICNlbmRyZWdpb24NCisgIA0KK30NCisNCisjZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdEltcG9ydFByb3RvRmlsZS5jcyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhZTJiOAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuY3MKQEAgLTAsMCArMSwzNDYgQEAKKy8vIEdlbmVyYXRlZCBieSBQcm90b0dlbiwgVmVyc2lvbj0yLjQuMS41NTUsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49NTVmNzEyNTIzNGJlYjU4OS4gIERPIE5PVCBFRElUIQ0KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjENCisjcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQorDQordXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM7DQordXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KK3VzaW5nIHBiZCA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCit1c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3Mgew0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlIHsNCisgIA0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gU3RhdGljIHZhcmlhYmxlcw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydF9JbXBvcnRNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0X0ltcG9ydE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIERlc2NyaXB0b3INCisgICAgcHVibGljIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcGJkOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOw0KKyAgICANCisgICAgc3RhdGljIFVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlKCkgew0KKyAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygNCisgICAgICAgICAgc3RyaW5nLkNvbmNhdCgNCisgICAgICAgICAgICAiQ2lWbmIyOW5iR1V2Y0hKdmRHOWlkV1l2ZFc1cGRIUmxjM1JmYVcxd2IzSjBMbkJ5YjNSdkVoaHdjbTkwIiwgDQorICAgICAgICAgICAgImIySjFabDkxYm1sMGRHVnpkRjlwYlhCdmNuUWFKR2R2YjJkc1pTOXdjbTkwYjJKMVppOWpjMmhoY25CZiIsIA0KKyAgICAgICAgICAgICJiM0IwYVc5dWN5NXdjbTkwYnlJYUNnMUpiWEJ2Y25STlpYTnpZV2RsRWdrS0FXUVlBU0FCS0FVcVBBb0siLCANCisgICAgICAgICAgICAiU1cxd2IzSjBSVzUxYlJJT0NncEpUVkJQVWxSZlJrOVBFQWNTRGdvS1NVMVFUMUpVWDBKQlVoQUlFZzRLIiwgDQorICAgICAgICAgICAgIkNrbE5VRTlTVkY5Q1FWb1FDVUpiQ2hoamIyMHVaMjl2WjJ4bExuQnliM1J2WW5WbUxuUmxjM1JJQWNJKyIsIA0KKyAgICAgICAgICAgICJQQW9oUjI5dloyeGxMbEJ5YjNSdlkyOXNRblZtWm1WeWN5NVVaWE4wVUhKdmRHOXpFaGRWYm1sMFZHVnoiLCANCisgICAgICAgICAgImRFbHRjRzl5ZEZCeWIzUnZSbWxzWlE9PSIpKTsNCisgICAgICBwYmQ6OkZpbGVEZXNjcmlwdG9yLkludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyIGFzc2lnbmVyID0gZGVsZWdhdGUocGJkOjpGaWxlRGVzY3JpcHRvciByb290KSB7DQorICAgICAgICBkZXNjcmlwdG9yID0gcm9vdDsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0X0ltcG9ydE1lc3NhZ2VfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0X0ltcG9ydE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9pbXBvcnRfSW1wb3J0TWVzc2FnZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkQiLCB9KTsNCisgICAgICAgIHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IHBiOjpFeHRlbnNpb25SZWdpc3RyeS5DcmVhdGVJbnN0YW5jZSgpOw0KKyAgICAgICAgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yUHJvdG9zLkNTaGFycE9wdGlvbnMuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIHJldHVybiByZWdpc3RyeTsNCisgICAgICB9Ow0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKGRlc2NyaXB0b3JEYXRhLA0KKyAgICAgICAgICBuZXcgcGJkOjpGaWxlRGVzY3JpcHRvcltdIHsNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5EZXNjcmlwdG9yLCANCisgICAgICAgICAgfSwgYXNzaWduZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICB9DQorICAjcmVnaW9uIEVudW1zDQorICBwdWJsaWMgZW51bSBJbXBvcnRFbnVtIHsNCisgICAgSU1QT1JUX0ZPTyA9IDcsDQorICAgIElNUE9SVF9CQVIgPSA4LA0KKyAgICBJTVBPUlRfQkFaID0gOSwNCisgIH0NCisgIA0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorICAjcmVnaW9uIE1lc3NhZ2VzDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEltcG9ydE1lc3NhZ2UgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxJbXBvcnRNZXNzYWdlLCBJbXBvcnRNZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBJbXBvcnRNZXNzYWdlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEltcG9ydE1lc3NhZ2UgZGVmYXVsdEluc3RhbmNlID0gbmV3IEltcG9ydE1lc3NhZ2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2ltcG9ydE1lc3NhZ2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImQiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfaW1wb3J0TWVzc2FnZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEltcG9ydE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgSW1wb3J0TWVzc2FnZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdEltcG9ydFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydF9JbXBvcnRNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEltcG9ydE1lc3NhZ2UsIEltcG9ydE1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0X0ltcG9ydE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEOw0KKyAgICBwcml2YXRlIGludCBkXzsNCisgICAgcHVibGljIGJvb2wgSGFzRCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0Q7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEQgew0KKyAgICAgIGdldCB7IHJldHVybiBkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfaW1wb3J0TWVzc2FnZUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0QpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzBdLCBEKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNEKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIEQpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydE1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0TWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBJbXBvcnRNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgSW1wb3J0TWVzc2FnZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihJbXBvcnRNZXNzYWdlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPEltcG9ydE1lc3NhZ2UsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEltcG9ydE1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBJbXBvcnRNZXNzYWdlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIEltcG9ydE1lc3NhZ2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBJbXBvcnRNZXNzYWdlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgSW1wb3J0TWVzc2FnZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgSW1wb3J0TWVzc2FnZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgSW1wb3J0TWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgSW1wb3J0TWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgSW1wb3J0TWVzc2FnZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChJbXBvcnRNZXNzYWdlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oSW1wb3J0TWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRCkgew0KKyAgICAgICAgICBEID0gb3RoZXIuRDsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2ltcG9ydE1lc3NhZ2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfaW1wb3J0TWVzc2FnZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EOyB9DQorICAgICAgICBzZXQgeyBTZXREKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgSW1wb3J0TWVzc2FnZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0SW1wb3J0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgICNlbmRyZWdpb24NCisgIA0KK30NCisNCisjZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdExpdGVJbXBvcnROb25MaXRlUHJvdG9GaWxlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdExpdGVJbXBvcnROb25MaXRlUHJvdG9GaWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZDI5NjkKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0TGl0ZUltcG9ydE5vbkxpdGVQcm90b0ZpbGUuY3MKQEAgLTAsMCArMSwzMjQgQEAKKy8vIEdlbmVyYXRlZCBieSBQcm90b0dlbiwgVmVyc2lvbj0yLjQuMS41NTUsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49NTVmNzEyNTIzNGJlYjU4OS4gIERPIE5PVCBFRElUIQ0KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjENCisjcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQorDQordXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnM7DQordXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkNvbGxlY3Rpb25zOw0KK3VzaW5nIHBiZCA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5EZXNjcmlwdG9yczsNCit1c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KK25hbWVzcGFjZSBHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3Mgew0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXRUZXN0TGl0ZUltcG9ydE5vbkxpdGVQcm90b0ZpbGUgew0KKyAgDQorICAgICNyZWdpb24gRXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbg0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgew0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBTdGF0aWMgdmFyaWFibGVzDQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBFeHRlbnNpb25zDQorICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBvYmplY3QgRGVzY3JpcHRvcjsNCisgICAgc3RhdGljIFVuaXRUZXN0TGl0ZUltcG9ydE5vbkxpdGVQcm90b0ZpbGUoKSB7DQorICAgICAgRGVzY3JpcHRvciA9IG51bGw7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgIH0NCisgICNyZWdpb24gTWVzc2FnZXMNCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdExpdGVJbXBvcnRzTm9ubGl0ZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxUZXN0TGl0ZUltcG9ydHNOb25saXRlLCBUZXN0TGl0ZUltcG9ydHNOb25saXRlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0TGl0ZUltcG9ydHNOb25saXRlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RMaXRlSW1wb3J0c05vbmxpdGUgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RMaXRlSW1wb3J0c05vbmxpdGUoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RMaXRlSW1wb3J0c05vbmxpdGVGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIm1lc3NhZ2UiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdExpdGVJbXBvcnRzTm9ubGl0ZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RMaXRlSW1wb3J0c05vbmxpdGUgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TGl0ZUltcG9ydHNOb25saXRlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RMaXRlSW1wb3J0c05vbmxpdGUgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTWVzc2FnZUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc01lc3NhZ2U7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzIG1lc3NhZ2VfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTWVzc2FnZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMgTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG1lc3NhZ2VfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RMaXRlSW1wb3J0c05vbmxpdGVGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNNZXNzYWdlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDEsIGZpZWxkX25hbWVzWzBdLCBNZXNzYWdlKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNNZXNzYWdlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMSwgTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgICNyZWdpb24gTGl0ZSBydW50aW1lIG1ldGhvZHMNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsNCisgICAgICBpbnQgaGFzaCA9IEdldFR5cGUoKS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNNZXNzYWdlKSBoYXNoIF49IG1lc3NhZ2VfLkdldEhhc2hDb2RlKCk7DQorICAgICAgcmV0dXJuIGhhc2g7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKSB7DQorICAgICAgVGVzdExpdGVJbXBvcnRzTm9ubGl0ZSBvdGhlciA9IG9iaiBhcyBUZXN0TGl0ZUltcG9ydHNOb25saXRlOw0KKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc01lc3NhZ2UgIT0gb3RoZXIuaGFzTWVzc2FnZSB8fCAoaGFzTWVzc2FnZSAmJiAhbWVzc2FnZV8uRXF1YWxzKG90aGVyLm1lc3NhZ2VfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUHJpbnRUbyhnbG9iYWw6OlN5c3RlbS5JTy5UZXh0V3JpdGVyIHdyaXRlcikgew0KKyAgICAgIFByaW50RmllbGQoIm1lc3NhZ2UiLCBoYXNNZXNzYWdlLCBtZXNzYWdlXywgd3JpdGVyKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RMaXRlSW1wb3J0c05vbmxpdGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdExpdGVJbXBvcnRzTm9ubGl0ZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TGl0ZUltcG9ydHNOb25saXRlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TGl0ZUltcG9ydHNOb25saXRlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TGl0ZUltcG9ydHNOb25saXRlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RMaXRlSW1wb3J0c05vbmxpdGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdExpdGVJbXBvcnRzTm9ubGl0ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TGl0ZUltcG9ydHNOb25saXRlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RMaXRlSW1wb3J0c05vbmxpdGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdExpdGVJbXBvcnRzTm9ubGl0ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0TGl0ZUltcG9ydHNOb25saXRlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RMaXRlSW1wb3J0c05vbmxpdGUgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXJMaXRlPFRlc3RMaXRlSW1wb3J0c05vbmxpdGUsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RMaXRlSW1wb3J0c05vbmxpdGUgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0TGl0ZUltcG9ydHNOb25saXRlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RMaXRlSW1wb3J0c05vbmxpdGUgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0TGl0ZUltcG9ydHNOb25saXRlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdExpdGVJbXBvcnRzTm9ubGl0ZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdExpdGVJbXBvcnRzTm9ubGl0ZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RMaXRlSW1wb3J0c05vbmxpdGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdExpdGVJbXBvcnRzTm9ubGl0ZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RMaXRlSW1wb3J0c05vbmxpdGUgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZUxpdGUgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0TGl0ZUltcG9ydHNOb25saXRlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RMaXRlSW1wb3J0c05vbmxpdGUpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0TGl0ZUltcG9ydHNOb25saXRlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdExpdGVJbXBvcnRzTm9ubGl0ZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNNZXNzYWdlKSB7DQorICAgICAgICAgIE1lcmdlTWVzc2FnZShvdGhlci5NZXNzYWdlKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0TGl0ZUltcG9ydHNOb25saXRlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RMaXRlSW1wb3J0c05vbmxpdGVGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNNZXNzYWdlKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKE1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgTWVzc2FnZSA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc01lc3NhZ2Ugew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc01lc3NhZ2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcyBNZXNzYWdlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTWVzc2FnZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TWVzc2FnZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc01lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXN1bHQubWVzc2FnZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzTWVzc2FnZSAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5tZXNzYWdlXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm1lc3NhZ2VfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJNZXNzYWdlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNZXNzYWdlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubWVzc2FnZV8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0TGl0ZUltcG9ydHNOb25saXRlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlSW1wb3J0Tm9uTGl0ZVByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCit9DQorDQorI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RMaXRlUHJvdG9GaWxlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdExpdGVQcm90b0ZpbGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkYzcyNwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Rlc3RQcm90b3MvVW5pdFRlc3RMaXRlUHJvdG9GaWxlLmNzCkBAIC0wLDAgKzEsODk0OCBAQAorLy8gR2VuZXJhdGVkIGJ5IFByb3RvR2VuLCBWZXJzaW9uPTIuNC4xLjU1NSwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj01NWY3MTI1MjM0YmViNTg5LiAgRE8gTk9UIEVESVQhDQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQ0KKyNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCisNCit1c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVyczsNCit1c2luZyBwYmMgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuQ29sbGVjdGlvbnM7DQordXNpbmcgcGJkID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JzOw0KK3VzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQorbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcyB7DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVW5pdFRlc3RMaXRlUHJvdG9GaWxlIHsNCisgIA0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsSW50NjRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFVpbnQ2NEV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxTaW50MzJFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEZpeGVkMzJFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxGbG9hdEV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxEb3VibGVFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsQm9vbEV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsQnl0ZXNFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsR3JvdXBFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEludDY0RXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRVaW50NjRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEludDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0SW50NjRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRVaW50MzJFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRVaW50NjRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRTaW50MzJFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRTaW50NjRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRGbG9hdEV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdERvdWJsZUV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEJvb2xFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRCeXRlc0V4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdENvcmRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRJbnQ2NEV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkVWludDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRVaW50NjRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZFNpbnQzMkV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkU2ludDY0RXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkU2ZpeGVkNjRFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEZsb2F0RXh0ZW5zaW9uTGl0ZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWREb3VibGVFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEJvb2xFeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEVudW1FeHRlbnNpb25MaXRlKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUuTmVzdGVkRXh0ZW5zaW9uKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gRXh0ZW5zaW9ucw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSAxOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgaW50PiBPcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEludDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gMjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGxvbmc+IE9wdGlvbmFsSW50NjRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gMzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCB1aW50PiBPcHRpb25hbFVpbnQzMkV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxVaW50NjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA0Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHVsb25nPiBPcHRpb25hbFVpbnQ2NEV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTaW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA1Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgaW50PiBPcHRpb25hbFNpbnQzMkV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTaW50NjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA2Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgbG9uZz4gT3B0aW9uYWxTaW50NjRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDc7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgdWludD4gT3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEZpeGVkNjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA4Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHVsb25nPiBPcHRpb25hbEZpeGVkNjRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA5Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgaW50PiBPcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gMTA7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBsb25nPiBPcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEZsb2F0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gMTE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBmbG9hdD4gT3B0aW9uYWxGbG9hdEV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxEb3VibGVFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSAxMjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGRvdWJsZT4gT3B0aW9uYWxEb3VibGVFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQm9vbEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDEzOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgYm9vbD4gT3B0aW9uYWxCb29sRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDE0Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgc3RyaW5nPiBPcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxCeXRlc0V4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDE1Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgcGI6OkJ5dGVTdHJpbmc+IE9wdGlvbmFsQnl0ZXNFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsR3JvdXBFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSAxNjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGU+IE9wdGlvbmFsR3JvdXBFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDE4Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRNZXNzYWdlPiBPcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSAxOTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlTGl0ZT4gT3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gMjA7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlTGl0ZT4gT3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSAyMTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bT4gT3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gMjI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bUxpdGU+IE9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDIzOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGU+IE9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDI0Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgc3RyaW5nPiBPcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbENvcmRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSAyNTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHN0cmluZz4gT3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gMzE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBpbnQ+IFJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSAzMjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGxvbmc+IFJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gMzM7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgdWludD4gUmVwZWF0ZWRVaW50MzJFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gMzQ7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgdWxvbmc+IFJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDM1Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgaW50PiBSZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSAzNjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGxvbmc+IFJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSAzNzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCB1aW50PiBSZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDM4Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHVsb25nPiBSZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSAzOTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGludD4gUmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDQwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgbG9uZz4gUmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDQxOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgZmxvYXQ+IFJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gNDI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBkb3VibGU+IFJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA0MzsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGJvb2w+IFJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA0NDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHN0cmluZz4gUmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA0NTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHBiOjpCeXRlU3RyaW5nPiBSZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gNDY7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlPiBSZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA0ODsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkTWVzc2FnZT4gUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gNDk7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZUxpdGU+IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDUwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGU+IFJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gNTE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0+IFJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDUyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlPiBSZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA1MzsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW1MaXRlPiBSZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA1NDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHN0cmluZz4gUmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gNTU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBzdHJpbmc+IFJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEludDMyRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gNjE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBpbnQ+IERlZmF1bHRJbnQzMkV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gNjI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBsb25nPiBEZWZhdWx0SW50NjRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRVaW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA2MzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCB1aW50PiBEZWZhdWx0VWludDMyRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0VWludDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gNjQ7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgdWxvbmc+IERlZmF1bHRVaW50NjRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTaW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA2NTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGludD4gRGVmYXVsdFNpbnQzMkV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDY2Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgbG9uZz4gRGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEZpeGVkMzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA2NzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCB1aW50PiBEZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEZpeGVkNjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA2ODsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCB1bG9uZz4gRGVmYXVsdEZpeGVkNjRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDY5Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgaW50PiBEZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDcwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgbG9uZz4gRGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0RmxvYXRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA3MTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGZsb2F0PiBEZWZhdWx0RmxvYXRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHREb3VibGVFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA3MjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGRvdWJsZT4gRGVmYXVsdERvdWJsZUV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEJvb2xFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA3MzsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGJvb2w+IERlZmF1bHRCb29sRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0U3RyaW5nRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gNzQ7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBzdHJpbmc+IERlZmF1bHRTdHJpbmdFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRCeXRlc0V4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDc1Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgcGI6OkJ5dGVTdHJpbmc+IERlZmF1bHRCeXRlc0V4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA4MTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bT4gRGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDgyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlPiBEZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gODM7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtTGl0ZT4gRGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDg0Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgc3RyaW5nPiBEZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRDb3JkRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gODU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBzdHJpbmc+IERlZmF1bHRDb3JkRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRJbnQzMkV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDkwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSwgaW50PiBQYWNrZWRJbnQzMkV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkSW50NjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA5MTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUsIGxvbmc+IFBhY2tlZEludDY0RXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRVaW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA5MjsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLCB1aW50PiBQYWNrZWRVaW50MzJFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDkzOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUsIHVsb25nPiBQYWNrZWRVaW50NjRFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFNpbnQzMkV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDk0Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSwgaW50PiBQYWNrZWRTaW50MzJFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDk1Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSwgbG9uZz4gUGFja2VkU2ludDY0RXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gOTY7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSwgdWludD4gUGFja2VkRml4ZWQzMkV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDk3Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUsIHVsb25nPiBQYWNrZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDk4Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSwgaW50PiBQYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkU2ZpeGVkNjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSA5OTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUsIGxvbmc+IFBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRGbG9hdEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciA9IDEwMDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUsIGZsb2F0PiBQYWNrZWRGbG9hdEV4dGVuc2lvbkxpdGU7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRG91YmxlRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gMTAxOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSwgZG91YmxlPiBQYWNrZWREb3VibGVFeHRlbnNpb25MaXRlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEJvb2xFeHRlbnNpb25MaXRlRmllbGROdW1iZXIgPSAxMDI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLCBib29sPiBQYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZTsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRFbnVtRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyID0gMTAzOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlPiBQYWNrZWRFbnVtRXh0ZW5zaW9uTGl0ZTsNCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgI3JlZ2lvbiBTdGF0aWMgdmFyaWFibGVzDQorICAgICNlbmRyZWdpb24NCisgICAgI3JlZ2lvbiBFeHRlbnNpb25zDQorICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBvYmplY3QgRGVzY3JpcHRvcjsNCisgICAgc3RhdGljIFVuaXRUZXN0TGl0ZVByb3RvRmlsZSgpIHsNCisgICAgICBEZXNjcmlwdG9yID0gbnVsbDsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZS5OZXN0ZWRFeHRlbnNpb24gPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGludD4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5UZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZS5uZXN0ZWRfZXh0ZW5zaW9uIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgZGVmYXVsdChpbnQpLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZS5OZXN0ZWRFeHRlbnNpb25GaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuSW50MzIpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgaW50PigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgZGVmYXVsdChpbnQpLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuSW50MzIpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEludDY0RXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgbG9uZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQ2NF9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIGRlZmF1bHQobG9uZyksDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEludDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5JbnQ2NCk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgdWludD4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBkZWZhdWx0KHVpbnQpLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxVaW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLlVJbnQzMik7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsVWludDY0RXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgdWxvbmc+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgZGVmYXVsdCh1bG9uZyksDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFVpbnQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuVUludDY0KTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxTaW50MzJFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBpbnQ+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgZGVmYXVsdChpbnQpLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxTaW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLlNJbnQzMik7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgbG9uZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBkZWZhdWx0KGxvbmcpLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxTaW50NjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLlNJbnQ2NCk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHVpbnQ+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIGRlZmF1bHQodWludCksDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEZpeGVkMzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkZpeGVkMzIpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEZpeGVkNjRFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCB1bG9uZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgZGVmYXVsdCh1bG9uZyksDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEZpeGVkNjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkZpeGVkNjQpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgaW50PigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgZGVmYXVsdChpbnQpLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuU0ZpeGVkMzIpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgbG9uZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIGRlZmF1bHQobG9uZyksDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5TRml4ZWQ2NCk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsRmxvYXRFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBmbG9hdD4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9mbG9hdF9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIGRlZmF1bHQoZmxvYXQpLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxGbG9hdEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuRmxvYXQpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbERvdWJsZUV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGRvdWJsZT4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBkZWZhdWx0KGRvdWJsZSksDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbERvdWJsZUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuRG91YmxlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxCb29sRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgYm9vbD4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9ib29sX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgZGVmYXVsdChib29sKSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsQm9vbEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuQm9vbCk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgc3RyaW5nPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuU3RyaW5nKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxCeXRlc0V4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHBiOjpCeXRlU3RyaW5nPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsQnl0ZXNFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkJ5dGVzKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGU+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxncm91cF9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuR3JvdXApOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZE1lc3NhZ2U+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5NZXNzYWdlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlTGl0ZT4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZUxpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuTWVzc2FnZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLk9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2VMaXRlPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5NZXNzYWdlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRFbnVtPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgZGVmYXVsdChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0pLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBuZXcgRW51bUxpdGVNYXA8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRFbnVtPigpLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5FbnVtKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtTGl0ZT4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBkZWZhdWx0KGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtTGl0ZSksDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG5ldyBFbnVtTGl0ZU1hcDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bUxpdGU+KCksDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5PcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5FbnVtKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGU+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBkZWZhdWx0KGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW1MaXRlKSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbmV3IEVudW1MaXRlTWFwPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW1MaXRlPigpLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5FbnVtKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHN0cmluZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuU3RyaW5nKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgc3RyaW5nPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuT3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5TdHJpbmcpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgaW50PigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkludDMyLA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBsb25nPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkludDY0LA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgdWludD4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRVaW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLlVJbnQzMiwNCisgICAgICAgICAgZmFsc2UpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHVsb25nPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuVUludDY0LA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgaW50PigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuU0ludDMyLA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgbG9uZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLlNJbnQ2NCwNCisgICAgICAgICAgZmFsc2UpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCB1aW50PigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5GaXhlZDMyLA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHVsb25nPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5GaXhlZDY0LA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBpbnQ+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuU0ZpeGVkMzIsDQorICAgICAgICAgIGZhbHNlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGxvbmc+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuU0ZpeGVkNjQsDQorICAgICAgICAgIGZhbHNlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGZsb2F0PigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkZsb2F0LA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgZG91YmxlPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuRG91YmxlLA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGJvb2w+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfYm9vbF9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkJvb2wsDQorICAgICAgICAgIGZhbHNlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBzdHJpbmc+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5TdHJpbmcsDQorICAgICAgICAgIGZhbHNlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHBiOjpCeXRlU3RyaW5nPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkJ5dGVzLA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkdyb3VwLA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkTWVzc2FnZT4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLk1lc3NhZ2UsDQorICAgICAgICAgIGZhbHNlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlTGl0ZT4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZUxpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuTWVzc2FnZSwNCisgICAgICAgICAgZmFsc2UpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlTGl0ZT4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2VMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuTWVzc2FnZSwNCisgICAgICAgICAgZmFsc2UpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBuZXcgRW51bUxpdGVNYXA8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRFbnVtPigpLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5FbnVtLA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bUxpdGU+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbmV3IEVudW1MaXRlTWFwPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtTGl0ZT4oKSwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkVudW0sDQorICAgICAgICAgIGZhbHNlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGU+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBuZXcgRW51bUxpdGVNYXA8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGU+KCksDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5SZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkVudW0sDQorICAgICAgICAgIGZhbHNlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHN0cmluZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuU3RyaW5nLA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHN0cmluZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9jb3JkX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuU3RyaW5nLA0KKyAgICAgICAgICBmYWxzZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRJbnQzMkV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGludD4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ludDMyX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgNDEsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0SW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkludDMyKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgbG9uZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ludDY0X2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgNDJMLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5JbnQ2NCk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRVaW50MzJFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCB1aW50PigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgNDMsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0VWludDMyRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5VSW50MzIpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0VWludDY0RXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgdWxvbmc+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICA0NFVMLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdFVpbnQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuVUludDY0KTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdFNpbnQzMkV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGludD4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3NpbnQzMl9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIC00NSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRTaW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLlNJbnQzMik7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRTaW50NjRFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBsb25nPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgNDYsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0U2ludDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5TSW50NjQpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHVpbnQ+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgNDcsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuRml4ZWQzMik7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgdWxvbmc+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgNDgsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuRml4ZWQ2NCk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGludD4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgNDksDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLlNGaXhlZDMyKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgbG9uZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgLTUwLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5TRml4ZWQ2NCk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRGbG9hdEV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGZsb2F0PigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICA1MS41RiwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRGbG9hdEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuRmxvYXQpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0RG91YmxlRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgZG91YmxlPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgNTIwMDBELA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdERvdWJsZUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuRG91YmxlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEJvb2xFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBib29sPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfYm9vbF9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIHRydWUsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0Qm9vbEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuQm9vbCk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBzdHJpbmc+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICAiaGVsbG8iLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdFN0cmluZ0V4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuU3RyaW5nKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEJ5dGVzRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgcGI6OkJ5dGVTdHJpbmc+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9ieXRlc19leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIHBiOjpCeXRlU3RyaW5nLkZyb21CYXNlNjQoImQyOXliR1E9IiksDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0Qnl0ZXNFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkJ5dGVzKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bS5CQVIsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG5ldyBFbnVtTGl0ZU1hcDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0+KCksDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuRW51bSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtTGl0ZT4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFSLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBuZXcgRW51bUxpdGVNYXA8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlPigpLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5FbnVtKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtTGl0ZT4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfQkFSLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBuZXcgRW51bUxpdGVNYXA8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGU+KCksDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuRW51bSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHN0cmluZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgICJhYmMiLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5TdHJpbmcpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZWZhdWx0Q29yZEV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIHN0cmluZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2NvcmRfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICAiMTIzIiwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlZmF1bHRDb3JkRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5TdHJpbmcpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRJbnQzMkV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUsIGludD4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5wYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkSW50MzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkludDMyLA0KKyAgICAgICAgICB0cnVlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkSW50NjRFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLCBsb25nPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRJbnQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuSW50NjQsDQorICAgICAgICAgIHRydWUpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRVaW50MzJFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLCB1aW50PigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkVWludDMyRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5VSW50MzIsDQorICAgICAgICAgIHRydWUpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRVaW50NjRFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLCB1bG9uZz4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5wYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuVUludDY0LA0KKyAgICAgICAgICB0cnVlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkU2ludDMyRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSwgaW50PigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkU2ludDMyRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5TSW50MzIsDQorICAgICAgICAgIHRydWUpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRTaW50NjRFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLCBsb25nPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkU2ludDY0RXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5TSW50NjQsDQorICAgICAgICAgIHRydWUpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSwgdWludD4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5wYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZUZpZWxkTnVtYmVyLA0KKyAgICAgICAgICBwYmQ6OkZpZWxkVHlwZS5GaXhlZDMyLA0KKyAgICAgICAgICB0cnVlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUsIHVsb25nPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEZpeGVkNjRFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkZpeGVkNjQsDQorICAgICAgICAgIHRydWUpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUsIGludD4oDQorICAgICAgICAgICJwcm90b2J1Zl91bml0dGVzdC5wYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUiLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBudWxsLA0KKyAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkU2ZpeGVkMzJFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLlNGaXhlZDMyLA0KKyAgICAgICAgICB0cnVlKTsNCisgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuUGFja2VkU2ZpeGVkNjRFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLCBsb25nPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuU0ZpeGVkNjQsDQorICAgICAgICAgIHRydWUpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRGbG9hdEV4dGVuc2lvbkxpdGUgPSANCisgICAgICAgIG5ldyBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uTGl0ZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUsIGZsb2F0PigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRGbG9hdEV4dGVuc2lvbkxpdGVGaWVsZE51bWJlciwNCisgICAgICAgICAgcGJkOjpGaWVsZFR5cGUuRmxvYXQsDQorICAgICAgICAgIHRydWUpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWREb3VibGVFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLCBkb3VibGU+KA0KKyAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QucGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSIsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIG51bGwsDQorICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWREb3VibGVFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkRvdWJsZSwNCisgICAgICAgICAgdHJ1ZSk7DQorICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEJvb2xFeHRlbnNpb25MaXRlID0gDQorICAgICAgICBuZXcgcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbkxpdGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLCBib29sPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnBhY2tlZF9ib29sX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEJvb2xFeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkJvb2wsDQorICAgICAgICAgIHRydWUpOw0KKyAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5QYWNrZWRFbnVtRXh0ZW5zaW9uTGl0ZSA9IA0KKyAgICAgICAgbmV3IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlPigNCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LnBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlIiwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZSwNCisgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgbmV3IEVudW1MaXRlTWFwPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtTGl0ZT4oKSwNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLlBhY2tlZEVudW1FeHRlbnNpb25MaXRlRmllbGROdW1iZXIsDQorICAgICAgICAgIHBiZDo6RmllbGRUeXBlLkVudW0sDQorICAgICAgICAgIHRydWUpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICB9DQorICAjcmVnaW9uIEVudW1zDQorICBwdWJsaWMgZW51bSBGb3JlaWduRW51bUxpdGUgew0KKyAgICBGT1JFSUdOX0xJVEVfRk9PID0gNCwNCisgICAgRk9SRUlHTl9MSVRFX0JBUiA9IDUsDQorICAgIEZPUkVJR05fTElURV9CQVogPSA2LA0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCisgICNyZWdpb24gTWVzc2FnZXMNCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdEFsbFR5cGVzTGl0ZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxUZXN0QWxsVHlwZXNMaXRlLCBUZXN0QWxsVHlwZXNMaXRlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0QWxsVHlwZXNMaXRlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RBbGxUeXBlc0xpdGUgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RBbGxUeXBlc0xpdGUoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RBbGxUeXBlc0xpdGVGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImRlZmF1bHRfYm9vbCIsICJkZWZhdWx0X2J5dGVzIiwgImRlZmF1bHRfY29yZCIsICJkZWZhdWx0X2RvdWJsZSIsICJkZWZhdWx0X2ZpeGVkMzIiLCAiZGVmYXVsdF9maXhlZDY0IiwgImRlZmF1bHRfZmxvYXQiLCAiZGVmYXVsdF9mb3JlaWduX2VudW0iLCAiZGVmYXVsdF9pbXBvcnRfZW51bSIsICJkZWZhdWx0X2ludDMyIiwgImRlZmF1bHRfaW50NjQiLCAiZGVmYXVsdF9uZXN0ZWRfZW51bSIsICJkZWZhdWx0X3NmaXhlZDMyIiwgImRlZmF1bHRfc2ZpeGVkNjQiLCAiZGVmYXVsdF9zaW50MzIiLCAiZGVmYXVsdF9zaW50NjQiLCAiZGVmYXVsdF9zdHJpbmciLCAiZGVmYXVsdF9zdHJpbmdfcGllY2UiLCAiZGVmYXVsdF91aW50MzIiLCAiZGVmYXVsdF91aW50NjQiLCAib3B0aW9uYWxfYm9vbCIsICJvcHRpb25hbF9ieXRlcyIsICJvcHRpb25hbF9jb3JkIiwgIm9wdGlvbmFsX2RvdWJsZSIsICJvcHRpb25hbF9maXhlZDMyIiwgIm9wdGlvbmFsX2ZpeGVkNjQiLCAib3B0aW9uYWxfZmxvYXQiLCAib3B0aW9uYWxfZm9yZWlnbl9lbnVtIiwgIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIsICJvcHRpb25hbF9pbXBvcnRfZW51bSIsICJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIsICJvcHRpb25hbF9pbnQzMiIsICJvcHRpb25hbF9pbnQ2NCIsICJvcHRpb25hbF9uZXN0ZWRfZW51bSIsICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIsICJvcHRpb25hbF9zZml4ZWQzMiIsICJvcHRpb25hbF9zZml4ZWQ2NCIsICJvcHRpb25hbF9zaW50MzIiLCAib3B0aW9uYWxfc2ludDY0IiwgIm9wdGlvbmFsX3N0cmluZyIsICJvcHRpb25hbF9zdHJpbmdfcGllY2UiLCAib3B0aW9uYWxfdWludDMyIiwgIm9wdGlvbmFsX3VpbnQ2NCIsICJvcHRpb25hbGdyb3VwIiwgInJlcGVhdGVkX2Jvb2wiLCAicmVwZWF0ZWRfYnl0ZXMiLCAicmVwZWF0ZWRfY29yZCIsICJyZXBlYXRlZF9kb3VibGUiLCAicmVwZWF0ZWRfZml4ZWQzMiIsICJyZXBlYXRlZF9maXhlZDY0IiwgInJlcGVhdGVkX2Zsb2F0IiwgInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIsICJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiLCAicmVwZWF0ZWRfaW1wb3J0X2VudW0iLCAicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiLCAicmVwZWF0ZWRfaW50MzIiLCAicmVwZWF0ZWRfaW50NjQiLCAicmVwZWF0ZWRfbmVzdGVkX2VudW0iLCAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiLCAicmVwZWF0ZWRfc2ZpeGVkMzIiLCAicmVwZWF0ZWRfc2ZpeGVkNjQiLCAicmVwZWF0ZWRfc2ludDMyIiwgInJlcGVhdGVkX3NpbnQ2NCIsICJyZXBlYXRlZF9zdHJpbmciLCAicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiwgInJlcGVhdGVkX3VpbnQzMiIsICJyZXBlYXRlZF91aW50NjQiLCAicmVwZWF0ZWRncm91cCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0QWxsVHlwZXNMaXRlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDU4NCwgNjAyLCA2ODIsIDU3NywgNTQxLCA1NDUsIDU3MywgNjU2LCA2NjQsIDQ4OCwgNDk2LCA2NDgsIDU1NywgNTYxLCA1MjAsIDUyOCwgNTk0LCA2NzQsIDUwNCwgNTEyLCAxMDQsIDEyMiwgMjAyLCA5NywgNjEsIDY1LCA5MywgMTc2LCAxNTQsIDE4NCwgMTYyLCA4LCAxNiwgMTY4LCAxNDYsIDc3LCA4MSwgNDAsIDQ4LCAxMTQsIDE5NCwgMjQsIDMyLCAxMzEsIDM0NCwgMzYyLCA0NDIsIDMzNywgMzAxLCAzMDUsIDMzMywgNDE2LCAzOTQsIDQyNCwgNDAyLCAyNDgsIDI1NiwgNDA4LCAzODYsIDMxNywgMzIxLCAyODAsIDI4OCwgMzU0LCA0MzQsIDI2NCwgMjcyLCAzNzEgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXNMaXRlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEFsbFR5cGVzTGl0ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0QWxsVHlwZXNMaXRlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgew0KKyAgICAgIHB1YmxpYyBlbnVtIE5lc3RlZEVudW0gew0KKyAgICAgICAgRk9PID0gMSwNCisgICAgICAgIEJBUiA9IDIsDQorICAgICAgICBCQVogPSAzLA0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBOZXN0ZWRNZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2VMaXRlPE5lc3RlZE1lc3NhZ2UsIE5lc3RlZE1lc3NhZ2UuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBOZXN0ZWRNZXNzYWdlKCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBOZXN0ZWRNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBOZXN0ZWRNZXNzYWdlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfbmVzdGVkTWVzc2FnZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYmIiIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX25lc3RlZE1lc3NhZ2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCB9Ow0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgVGhpc01lc3NhZ2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEJiRmllbGROdW1iZXIgPSAxOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0JiOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgYmJfOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzQmIgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzQmI7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgQmIgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gYmJfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX25lc3RlZE1lc3NhZ2VGaWVsZE5hbWVzOw0KKyAgICAgICAgICBpZiAoaGFzQmIpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgQmIpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgIA0KKyAgICAgICAgICBzaXplID0gMDsNCisgICAgICAgICAgaWYgKGhhc0JiKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBCYik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgICAgIHJldHVybiBzaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgI3JlZ2lvbiBMaXRlIHJ1bnRpbWUgbWV0aG9kcw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsNCisgICAgICAgICAgaW50IGhhc2ggPSBHZXRUeXBlKCkuR2V0SGFzaENvZGUoKTsNCisgICAgICAgICAgaWYgKGhhc0JiKSBoYXNoIF49IGJiXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgICAgICByZXR1cm4gaGFzaDsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopIHsNCisgICAgICAgICAgTmVzdGVkTWVzc2FnZSBvdGhlciA9IG9iaiBhcyBOZXN0ZWRNZXNzYWdlOw0KKyAgICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICBpZiAoaGFzQmIgIT0gb3RoZXIuaGFzQmIgfHwgKGhhc0JiICYmICFiYl8uRXF1YWxzKG90aGVyLmJiXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludFRvKGdsb2JhbDo6U3lzdGVtLklPLlRleHRXcml0ZXIgd3JpdGVyKSB7DQorICAgICAgICAgIFByaW50RmllbGQoImJiIiwgaGFzQmIsIGJiXywgd3JpdGVyKTsNCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgTmVzdGVkTWVzc2FnZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoTmVzdGVkTWVzc2FnZSBwcm90b3R5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyTGl0ZTxOZXN0ZWRNZXNzYWdlLCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKE5lc3RlZE1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICAgICAgcHJpdmF0ZSBOZXN0ZWRNZXNzYWdlIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgTmVzdGVkTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgTmVzdGVkTWVzc2FnZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBOZXN0ZWRNZXNzYWdlKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBOZXN0ZWRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBOZXN0ZWRNZXNzYWdlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZUxpdGUgb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgaXMgTmVzdGVkTWVzc2FnZSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoTmVzdGVkTWVzc2FnZSkgb3RoZXIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShOZXN0ZWRNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0JiKSB7DQorICAgICAgICAgICAgICBCYiA9IG90aGVyLkJiOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX25lc3RlZE1lc3NhZ2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgICAgIHRhZyA9IF9uZXN0ZWRNZXNzYWdlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNCYiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmJiXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNCYiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNCYjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgQmIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQmI7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRCYih2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRCYihpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNCYiA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmJiXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQmIoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQmIgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuYmJfID0gMDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIE5lc3RlZE1lc3NhZ2UoKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBPcHRpb25hbEdyb3VwIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2VMaXRlPE9wdGlvbmFsR3JvdXAsIE9wdGlvbmFsR3JvdXAuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBPcHRpb25hbEdyb3VwKCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPcHRpb25hbEdyb3VwIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBPcHRpb25hbEdyb3VwKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfb3B0aW9uYWxHcm91cEZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYSIgfTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfb3B0aW9uYWxHcm91cEZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMzYgfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBPcHRpb25hbEdyb3VwIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBPcHRpb25hbEdyb3VwIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBBRmllbGROdW1iZXIgPSAxNzsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgYV87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0E7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9vcHRpb25hbEdyb3VwRmllbGROYW1lczsNCisgICAgICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxNywgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgIA0KKyAgICAgICAgICBzaXplID0gMDsNCisgICAgICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDE3LCBBKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICAjcmVnaW9uIExpdGUgcnVudGltZSBtZXRob2RzDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgew0KKyAgICAgICAgICBpbnQgaGFzaCA9IEdldFR5cGUoKS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgICAgICBpZiAoaGFzQSkgaGFzaCBePSBhXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgICAgICByZXR1cm4gaGFzaDsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopIHsNCisgICAgICAgICAgT3B0aW9uYWxHcm91cCBvdGhlciA9IG9iaiBhcyBPcHRpb25hbEdyb3VwOw0KKyAgICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICBpZiAoaGFzQSAhPSBvdGhlci5oYXNBIHx8IChoYXNBICYmICFhXy5FcXVhbHMob3RoZXIuYV8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUHJpbnRUbyhnbG9iYWw6OlN5c3RlbS5JTy5UZXh0V3JpdGVyIHdyaXRlcikgew0KKyAgICAgICAgICBQcmludEZpZWxkKCJhIiwgaGFzQSwgYV8sIHdyaXRlcik7DQorICAgICAgICB9DQorICAgICAgICAjZW5kcmVnaW9uDQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXAgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXAgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXAgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXAgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIE9wdGlvbmFsR3JvdXAgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKE9wdGlvbmFsR3JvdXAgcHJvdG90eXBlKSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlckxpdGU8T3B0aW9uYWxHcm91cCwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihPcHRpb25hbEdyb3VwIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgT3B0aW9uYWxHcm91cCByZXN1bHQ7DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIE9wdGlvbmFsR3JvdXAgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIE9wdGlvbmFsR3JvdXAgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgT3B0aW9uYWxHcm91cCgpOw0KKyAgICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBPcHRpb25hbEdyb3VwIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgT3B0aW9uYWxHcm91cCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5PcHRpb25hbEdyb3VwLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgT3B0aW9uYWxHcm91cCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2VMaXRlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGlzIE9wdGlvbmFsR3JvdXApIHsNCisgICAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKE9wdGlvbmFsR3JvdXApIG90aGVyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oT3B0aW9uYWxHcm91cCBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk9wdGlvbmFsR3JvdXAuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9vcHRpb25hbEdyb3VwRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgICAgICB0YWcgPSBfb3B0aW9uYWxHcm91cEZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDEzNjogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYV8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRBKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuYV8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgT3B0aW9uYWxHcm91cCgpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFJlcGVhdGVkR3JvdXAgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZUxpdGU8UmVwZWF0ZWRHcm91cCwgUmVwZWF0ZWRHcm91cC5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIFJlcGVhdGVkR3JvdXAoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJlcGVhdGVkR3JvdXAgZGVmYXVsdEluc3RhbmNlID0gbmV3IFJlcGVhdGVkR3JvdXAoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9yZXBlYXRlZEdyb3VwRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiB9Ow0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9yZXBlYXRlZEdyb3VwRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDM3NiB9Ow0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFJlcGVhdGVkR3JvdXAgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFJlcGVhdGVkR3JvdXAgVGhpc01lc3NhZ2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IEFGaWVsZE51bWJlciA9IDQ3Ow0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0E7DQorICAgICAgICBwcml2YXRlIGludCBhXzsNCisgICAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzQTsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGFfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3JlcGVhdGVkR3JvdXBGaWVsZE5hbWVzOw0KKyAgICAgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDQ3LCBmaWVsZF9uYW1lc1swXSwgQSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgDQorICAgICAgICAgIHNpemUgPSAwOw0KKyAgICAgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNDcsIEEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgICAgICByZXR1cm4gc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgICNyZWdpb24gTGl0ZSBydW50aW1lIG1ldGhvZHMNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7DQorICAgICAgICAgIGludCBoYXNoID0gR2V0VHlwZSgpLkdldEhhc2hDb2RlKCk7DQorICAgICAgICAgIGlmIChoYXNBKSBoYXNoIF49IGFfLkdldEhhc2hDb2RlKCk7DQorICAgICAgICAgIHJldHVybiBoYXNoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikgew0KKyAgICAgICAgICBSZXBlYXRlZEdyb3VwIG90aGVyID0gb2JqIGFzIFJlcGVhdGVkR3JvdXA7DQorICAgICAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7DQorICAgICAgICAgIGlmIChoYXNBICE9IG90aGVyLmhhc0EgfHwgKGhhc0EgJiYgIWFfLkVxdWFscyhvdGhlci5hXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludFRvKGdsb2JhbDo6U3lzdGVtLklPLlRleHRXcml0ZXIgd3JpdGVyKSB7DQorICAgICAgICAgIFByaW50RmllbGQoImEiLCBoYXNBLCBhXywgd3JpdGVyKTsNCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoUmVwZWF0ZWRHcm91cCBwcm90b3R5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyTGl0ZTxSZXBlYXRlZEdyb3VwLCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKFJlcGVhdGVkR3JvdXAgY2xvbmVGcm9tKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICAgICAgcHJpdmF0ZSBSZXBlYXRlZEdyb3VwIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgUmVwZWF0ZWRHcm91cCBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZXBlYXRlZEdyb3VwKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFJlcGVhdGVkR3JvdXAgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBSZXBlYXRlZEdyb3VwIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLlJlcGVhdGVkR3JvdXAuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBSZXBlYXRlZEdyb3VwIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZUxpdGUgb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgaXMgUmVwZWF0ZWRHcm91cCkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoUmVwZWF0ZWRHcm91cCkgb3RoZXIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShSZXBlYXRlZEdyb3VwIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuUmVwZWF0ZWRHcm91cC5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0EpIHsNCisgICAgICAgICAgICAgIEEgPSBvdGhlci5BOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3JlcGVhdGVkR3JvdXBGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgICAgIHRhZyA9IF9yZXBlYXRlZEdyb3VwRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMzc2OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5hXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0E7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5hXyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0YXRpYyBSZXBlYXRlZEdyb3VwKCkgew0KKyAgICAgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEludDMyRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxJbnQzMjsNCisgICAgcHJpdmF0ZSBpbnQgb3B0aW9uYWxJbnQzMl87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbEludDMyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBPcHRpb25hbEludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxJbnQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEludDY0RmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxJbnQ2NDsNCisgICAgcHJpdmF0ZSBsb25nIG9wdGlvbmFsSW50NjRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxJbnQ2NDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIE9wdGlvbmFsSW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEludDY0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsVWludDMyRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxVaW50MzI7DQorICAgIHByaXZhdGUgdWludCBvcHRpb25hbFVpbnQzMl87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsVWludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxVaW50MzI7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgT3B0aW9uYWxVaW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFVpbnQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFVpbnQ2NEZpZWxkTnVtYmVyID0gNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsVWludDY0Ow0KKyAgICBwcml2YXRlIHVsb25nIG9wdGlvbmFsVWludDY0XzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxVaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbFVpbnQ2NDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgT3B0aW9uYWxVaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFVpbnQ2NF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFNpbnQzMkZpZWxkTnVtYmVyID0gNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsU2ludDMyOw0KKyAgICBwcml2YXRlIGludCBvcHRpb25hbFNpbnQzMl87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU2ludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxTaW50MzI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IE9wdGlvbmFsU2ludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxTaW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTaW50NjRGaWVsZE51bWJlciA9IDY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbFNpbnQ2NDsNCisgICAgcHJpdmF0ZSBsb25nIG9wdGlvbmFsU2ludDY0XzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbFNpbnQ2NDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIE9wdGlvbmFsU2ludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxTaW50NjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxGaXhlZDMyRmllbGROdW1iZXIgPSA3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxGaXhlZDMyOw0KKyAgICBwcml2YXRlIHVpbnQgb3B0aW9uYWxGaXhlZDMyXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGaXhlZDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxGaXhlZDMyOyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IE9wdGlvbmFsRml4ZWQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsRml4ZWQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEZpeGVkNjRGaWVsZE51bWJlciA9IDg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbEZpeGVkNjQ7DQorICAgIHByaXZhdGUgdWxvbmcgb3B0aW9uYWxGaXhlZDY0XzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGaXhlZDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxGaXhlZDY0OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBPcHRpb25hbEZpeGVkNjQgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEZpeGVkNjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTZml4ZWQzMkZpZWxkTnVtYmVyID0gOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsU2ZpeGVkMzI7DQorICAgIHByaXZhdGUgaW50IG9wdGlvbmFsU2ZpeGVkMzJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFNmaXhlZDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxTZml4ZWQzMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgT3B0aW9uYWxTZml4ZWQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU2ZpeGVkMzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTZml4ZWQ2NEZpZWxkTnVtYmVyID0gMTA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbFNmaXhlZDY0Ow0KKyAgICBwcml2YXRlIGxvbmcgb3B0aW9uYWxTZml4ZWQ2NF87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU2ZpeGVkNjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbFNmaXhlZDY0OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgT3B0aW9uYWxTZml4ZWQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU2ZpeGVkNjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxGbG9hdEZpZWxkTnVtYmVyID0gMTE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbEZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IG9wdGlvbmFsRmxvYXRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxGbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBPcHRpb25hbEZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbERvdWJsZUZpZWxkTnVtYmVyID0gMTI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbERvdWJsZTsNCisgICAgcHJpdmF0ZSBkb3VibGUgb3B0aW9uYWxEb3VibGVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbERvdWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsRG91YmxlOyB9DQorICAgIH0NCisgICAgcHVibGljIGRvdWJsZSBPcHRpb25hbERvdWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsRG91YmxlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQm9vbEZpZWxkTnVtYmVyID0gMTM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbEJvb2w7DQorICAgIHByaXZhdGUgYm9vbCBvcHRpb25hbEJvb2xfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEJvb2wgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbEJvb2w7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBPcHRpb25hbEJvb2wgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEJvb2xfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTdHJpbmdGaWVsZE51bWJlciA9IDE0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxTdHJpbmc7DQorICAgIHByaXZhdGUgc3RyaW5nIG9wdGlvbmFsU3RyaW5nXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFN0cmluZyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsU3RyaW5nOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBPcHRpb25hbFN0cmluZyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU3RyaW5nXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQnl0ZXNGaWVsZE51bWJlciA9IDE1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxCeXRlczsNCisgICAgcHJpdmF0ZSBwYjo6Qnl0ZVN0cmluZyBvcHRpb25hbEJ5dGVzXyA9IHBiOjpCeXRlU3RyaW5nLkVtcHR5Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEJ5dGVzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxCeXRlczsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBPcHRpb25hbEJ5dGVzIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxCeXRlc187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEdyb3VwRmllbGROdW1iZXIgPSAxNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsR3JvdXA7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5PcHRpb25hbEdyb3VwIG9wdGlvbmFsR3JvdXBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEdyb3VwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxHcm91cDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk9wdGlvbmFsR3JvdXAgT3B0aW9uYWxHcm91cCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsR3JvdXBfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuT3B0aW9uYWxHcm91cC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbE5lc3RlZE1lc3NhZ2VGaWVsZE51bWJlciA9IDE4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkTWVzc2FnZSBvcHRpb25hbE5lc3RlZE1lc3NhZ2VfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2U7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRNZXNzYWdlIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VGaWVsZE51bWJlciA9IDE5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZUxpdGUgb3B0aW9uYWxGb3JlaWduTWVzc2FnZV87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlTGl0ZSBPcHRpb25hbEZvcmVpZ25NZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2VMaXRlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsSW1wb3J0TWVzc2FnZUZpZWxkTnVtYmVyID0gMjA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbEltcG9ydE1lc3NhZ2U7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUgb3B0aW9uYWxJbXBvcnRNZXNzYWdlXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2VMaXRlIE9wdGlvbmFsSW1wb3J0TWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsSW1wb3J0TWVzc2FnZV8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxOZXN0ZWRFbnVtRmllbGROdW1iZXIgPSAyMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsTmVzdGVkRW51bTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0gb3B0aW9uYWxOZXN0ZWRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bS5GT087DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsTmVzdGVkRW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsTmVzdGVkRW51bTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0gT3B0aW9uYWxOZXN0ZWRFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxOZXN0ZWRFbnVtXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRm9yZWlnbkVudW1GaWVsZE51bWJlciA9IDIyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxGb3JlaWduRW51bTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bUxpdGUgb3B0aW9uYWxGb3JlaWduRW51bV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0ZPTzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGb3JlaWduRW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsRm9yZWlnbkVudW07IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlIE9wdGlvbmFsRm9yZWlnbkVudW0gew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEZvcmVpZ25FbnVtXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsSW1wb3J0RW51bUZpZWxkTnVtYmVyID0gMjM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbEltcG9ydEVudW07DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGUgb3B0aW9uYWxJbXBvcnRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0ZPTzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxJbXBvcnRFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxJbXBvcnRFbnVtOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW1MaXRlIE9wdGlvbmFsSW1wb3J0RW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsSW1wb3J0RW51bV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFN0cmluZ1BpZWNlRmllbGROdW1iZXIgPSAyNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsU3RyaW5nUGllY2U7DQorICAgIHByaXZhdGUgc3RyaW5nIG9wdGlvbmFsU3RyaW5nUGllY2VfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU3RyaW5nUGllY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbFN0cmluZ1BpZWNlOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBPcHRpb25hbFN0cmluZ1BpZWNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxTdHJpbmdQaWVjZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbENvcmRGaWVsZE51bWJlciA9IDI1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxDb3JkOw0KKyAgICBwcml2YXRlIHN0cmluZyBvcHRpb25hbENvcmRfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsQ29yZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsQ29yZDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgT3B0aW9uYWxDb3JkIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxDb3JkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW50MzJGaWVsZE51bWJlciA9IDMxOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gcmVwZWF0ZWRJbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFJlcGVhdGVkSW50MzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkSW50MzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRJbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRJbnQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkSW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEludDY0RmllbGROdW1iZXIgPSAzMjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiByZXBlYXRlZEludDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBSZXBlYXRlZEludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW50NjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkSW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRJbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRJbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkVWludDMyRmllbGROdW1iZXIgPSAzMzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PiByZXBlYXRlZFVpbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVpbnQ+IFJlcGVhdGVkVWludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFVpbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFVpbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRVaW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IEdldFJlcGVhdGVkVWludDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFVpbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkVWludDY0RmllbGROdW1iZXIgPSAzNDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4gcmVwZWF0ZWRVaW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IFJlcGVhdGVkVWludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFVpbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFVpbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRVaW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBHZXRSZXBlYXRlZFVpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRVaW50NjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNpbnQzMkZpZWxkTnVtYmVyID0gMzU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiByZXBlYXRlZFNpbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFJlcGVhdGVkU2ludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFNpbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFNpbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRTaW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRSZXBlYXRlZFNpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRTaW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNpbnQ2NEZpZWxkTnVtYmVyID0gMzY7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gcmVwZWF0ZWRTaW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGxvbmc+IFJlcGVhdGVkU2ludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFNpbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFNpbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRTaW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRTaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkU2ludDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRGaXhlZDMyRmllbGROdW1iZXIgPSAzNzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PiByZXBlYXRlZEZpeGVkMzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1aW50PiBSZXBlYXRlZEZpeGVkMzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkRml4ZWQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEZpeGVkMzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRml4ZWQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgR2V0UmVwZWF0ZWRGaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEZpeGVkMzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZpeGVkNjRGaWVsZE51bWJlciA9IDM4Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiByZXBlYXRlZEZpeGVkNjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IFJlcGVhdGVkRml4ZWQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRGaXhlZDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRml4ZWQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGaXhlZDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgR2V0UmVwZWF0ZWRGaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEZpeGVkNjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNmaXhlZDMyRmllbGROdW1iZXIgPSAzOTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IHJlcGVhdGVkU2ZpeGVkMzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBSZXBlYXRlZFNmaXhlZDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFNmaXhlZDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ZpeGVkMzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU2ZpeGVkMzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRSZXBlYXRlZFNmaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFNmaXhlZDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTZml4ZWQ2NEZpZWxkTnVtYmVyID0gNDA7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gcmVwZWF0ZWRTZml4ZWQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gUmVwZWF0ZWRTZml4ZWQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRTZml4ZWQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFNmaXhlZDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFNmaXhlZDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEdldFJlcGVhdGVkU2ZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkU2ZpeGVkNjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZsb2F0RmllbGROdW1iZXIgPSA0MTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxmbG9hdD4gcmVwZWF0ZWRGbG9hdF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8ZmxvYXQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGZsb2F0PiBSZXBlYXRlZEZsb2F0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEZsb2F0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRmxvYXRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRmxvYXRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IEdldFJlcGVhdGVkRmxvYXQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRmxvYXRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZERvdWJsZUZpZWxkTnVtYmVyID0gNDI7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8ZG91YmxlPiByZXBlYXRlZERvdWJsZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8ZG91YmxlPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxkb3VibGU+IFJlcGVhdGVkRG91YmxlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZERvdWJsZV8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZERvdWJsZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWREb3VibGVfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGRvdWJsZSBHZXRSZXBlYXRlZERvdWJsZShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWREb3VibGVfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEJvb2xGaWVsZE51bWJlciA9IDQzOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGJvb2w+IHJlcGVhdGVkQm9vbF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Ym9vbD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Ym9vbD4gUmVwZWF0ZWRCb29sTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEJvb2xfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRCb29sQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEJvb2xfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgR2V0UmVwZWF0ZWRCb29sKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEJvb2xfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFN0cmluZ0ZpZWxkTnVtYmVyID0gNDQ7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiByZXBlYXRlZFN0cmluZ18gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxzdHJpbmc+IFJlcGVhdGVkU3RyaW5nTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFN0cmluZ18pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFN0cmluZ0NvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRTdHJpbmdfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZFN0cmluZyhpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRTdHJpbmdfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEJ5dGVzRmllbGROdW1iZXIgPSA0NTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxwYjo6Qnl0ZVN0cmluZz4gcmVwZWF0ZWRCeXRlc18gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8cGI6OkJ5dGVTdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHBiOjpCeXRlU3RyaW5nPiBSZXBlYXRlZEJ5dGVzTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEJ5dGVzXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkQnl0ZXNDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkQnl0ZXNfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIEdldFJlcGVhdGVkQnl0ZXMoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkQnl0ZXNfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEdyb3VwRmllbGROdW1iZXIgPSA0NjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLlJlcGVhdGVkR3JvdXA+IHJlcGVhdGVkR3JvdXBfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuUmVwZWF0ZWRHcm91cD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5SZXBlYXRlZEdyb3VwPiBSZXBlYXRlZEdyb3VwTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkR3JvdXBfOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEdyb3VwQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEdyb3VwXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLlJlcGVhdGVkR3JvdXAgR2V0UmVwZWF0ZWRHcm91cChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRHcm91cF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkTmVzdGVkTWVzc2FnZUZpZWxkTnVtYmVyID0gNDg7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRNZXNzYWdlPiByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkTWVzc2FnZT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRNZXNzYWdlPiBSZXBlYXRlZE5lc3RlZE1lc3NhZ2VMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWROZXN0ZWRNZXNzYWdlQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkTWVzc2FnZSBHZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkTmVzdGVkTWVzc2FnZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VGaWVsZE51bWJlciA9IDQ5Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlTGl0ZT4gcmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2VMaXRlPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZUxpdGU+IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGb3JlaWduTWVzc2FnZV87IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlTGl0ZSBHZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEZvcmVpZ25NZXNzYWdlX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbXBvcnRNZXNzYWdlRmllbGROdW1iZXIgPSA1MDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlTGl0ZT4gcmVwZWF0ZWRJbXBvcnRNZXNzYWdlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlTGl0ZT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGU+IFJlcGVhdGVkSW1wb3J0TWVzc2FnZUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEltcG9ydE1lc3NhZ2VfOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEltcG9ydE1lc3NhZ2VDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUgR2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEltcG9ydE1lc3NhZ2VfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZE5lc3RlZEVudW1GaWVsZE51bWJlciA9IDUxOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bT4gcmVwZWF0ZWROZXN0ZWRFbnVtXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bT4gUmVwZWF0ZWROZXN0ZWRFbnVtTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZE5lc3RlZEVudW1fKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWROZXN0ZWRFbnVtQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZE5lc3RlZEVudW1fLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bSBHZXRSZXBlYXRlZE5lc3RlZEVudW0oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkTmVzdGVkRW51bV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRm9yZWlnbkVudW1GaWVsZE51bWJlciA9IDUyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtTGl0ZT4gcmVwZWF0ZWRGb3JlaWduRW51bV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bUxpdGU+IFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkRm9yZWlnbkVudW1fKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGb3JlaWduRW51bUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGb3JlaWduRW51bV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlIEdldFJlcGVhdGVkRm9yZWlnbkVudW0oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRm9yZWlnbkVudW1fW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEltcG9ydEVudW1GaWVsZE51bWJlciA9IDUzOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW1MaXRlPiByZXBlYXRlZEltcG9ydEVudW1fID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW1MaXRlPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtTGl0ZT4gUmVwZWF0ZWRJbXBvcnRFbnVtTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEltcG9ydEVudW1fKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRJbXBvcnRFbnVtQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEltcG9ydEVudW1fLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW1MaXRlIEdldFJlcGVhdGVkSW1wb3J0RW51bShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRJbXBvcnRFbnVtX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkTnVtYmVyID0gNTQ7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiByZXBlYXRlZFN0cmluZ1BpZWNlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gUmVwZWF0ZWRTdHJpbmdQaWVjZUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRTdHJpbmdQaWVjZV8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFN0cmluZ1BpZWNlQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFN0cmluZ1BpZWNlXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgR2V0UmVwZWF0ZWRTdHJpbmdQaWVjZShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRTdHJpbmdQaWVjZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkQ29yZEZpZWxkTnVtYmVyID0gNTU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiByZXBlYXRlZENvcmRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBSZXBlYXRlZENvcmRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkQ29yZF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZENvcmRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkQ29yZF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkQ29yZChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRDb3JkX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEludDMyRmllbGROdW1iZXIgPSA2MTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRJbnQzMjsNCisgICAgcHJpdmF0ZSBpbnQgZGVmYXVsdEludDMyXyA9IDQxOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0SW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0SW50MzI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IERlZmF1bHRJbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0SW50NjRGaWVsZE51bWJlciA9IDYyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdEludDY0Ow0KKyAgICBwcml2YXRlIGxvbmcgZGVmYXVsdEludDY0XyA9IDQyTDsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdEludDY0OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRGVmYXVsdEludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEludDY0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRVaW50MzJGaWVsZE51bWJlciA9IDYzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdFVpbnQzMjsNCisgICAgcHJpdmF0ZSB1aW50IGRlZmF1bHRVaW50MzJfID0gNDM7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRVaW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0VWludDMyOyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IERlZmF1bHRVaW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0VWludDMyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRVaW50NjRGaWVsZE51bWJlciA9IDY0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdFVpbnQ2NDsNCisgICAgcHJpdmF0ZSB1bG9uZyBkZWZhdWx0VWludDY0XyA9IDQ0VUw7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRVaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0VWludDY0OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBEZWZhdWx0VWludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdFVpbnQ2NF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0U2ludDMyRmllbGROdW1iZXIgPSA2NTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRTaW50MzI7DQorICAgIHByaXZhdGUgaW50IGRlZmF1bHRTaW50MzJfID0gLTQ1Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U2ludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdFNpbnQzMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRGVmYXVsdFNpbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRTaW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFNpbnQ2NEZpZWxkTnVtYmVyID0gNjY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0U2ludDY0Ow0KKyAgICBwcml2YXRlIGxvbmcgZGVmYXVsdFNpbnQ2NF8gPSA0NjsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFNpbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRTaW50NjQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBEZWZhdWx0U2ludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdFNpbnQ2NF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0Rml4ZWQzMkZpZWxkTnVtYmVyID0gNjc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0Rml4ZWQzMjsNCisgICAgcHJpdmF0ZSB1aW50IGRlZmF1bHRGaXhlZDMyXyA9IDQ3Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Rml4ZWQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRGaXhlZDMyOyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IERlZmF1bHRGaXhlZDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEZpeGVkMzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEZpeGVkNjRGaWVsZE51bWJlciA9IDY4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdEZpeGVkNjQ7DQorICAgIHByaXZhdGUgdWxvbmcgZGVmYXVsdEZpeGVkNjRfID0gNDg7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRGaXhlZDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdEZpeGVkNjQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIERlZmF1bHRGaXhlZDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEZpeGVkNjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFNmaXhlZDMyRmllbGROdW1iZXIgPSA2OTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRTZml4ZWQzMjsNCisgICAgcHJpdmF0ZSBpbnQgZGVmYXVsdFNmaXhlZDMyXyA9IDQ5Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U2ZpeGVkMzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0U2ZpeGVkMzI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IERlZmF1bHRTZml4ZWQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRTZml4ZWQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0U2ZpeGVkNjRGaWVsZE51bWJlciA9IDcwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdFNmaXhlZDY0Ow0KKyAgICBwcml2YXRlIGxvbmcgZGVmYXVsdFNmaXhlZDY0XyA9IC01MDsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFNmaXhlZDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdFNmaXhlZDY0OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgRGVmYXVsdFNmaXhlZDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdFNmaXhlZDY0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRGbG9hdEZpZWxkTnVtYmVyID0gNzE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0RmxvYXQ7DQorICAgIHByaXZhdGUgZmxvYXQgZGVmYXVsdEZsb2F0XyA9IDUxLjVGOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0RmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0RmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgRGVmYXVsdEZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEZsb2F0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHREb3VibGVGaWVsZE51bWJlciA9IDcyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdERvdWJsZTsNCisgICAgcHJpdmF0ZSBkb3VibGUgZGVmYXVsdERvdWJsZV8gPSA1MjAwMEQ7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHREb3VibGUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0RG91YmxlOyB9DQorICAgIH0NCisgICAgcHVibGljIGRvdWJsZSBEZWZhdWx0RG91YmxlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdERvdWJsZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0Qm9vbEZpZWxkTnVtYmVyID0gNzM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0Qm9vbDsNCisgICAgcHJpdmF0ZSBib29sIGRlZmF1bHRCb29sXyA9IHRydWU7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRCb29sIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdEJvb2w7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBEZWZhdWx0Qm9vbCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRCb29sXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTdHJpbmdGaWVsZE51bWJlciA9IDc0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdFN0cmluZzsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZGVmYXVsdFN0cmluZ18gPSAiaGVsbG8iOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U3RyaW5nIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdFN0cmluZzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRGVmYXVsdFN0cmluZyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRTdHJpbmdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEJ5dGVzRmllbGROdW1iZXIgPSA3NTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRCeXRlczsNCisgICAgcHJpdmF0ZSBwYjo6Qnl0ZVN0cmluZyBkZWZhdWx0Qnl0ZXNfID0gcGI6OkJ5dGVTdHJpbmcuRnJvbUJhc2U2NCgiZDI5eWJHUT0iKTsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEJ5dGVzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdEJ5dGVzOyB9DQorICAgIH0NCisgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIERlZmF1bHRCeXRlcyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRCeXRlc187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0TmVzdGVkRW51bUZpZWxkTnVtYmVyID0gODE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0TmVzdGVkRW51bTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0gZGVmYXVsdE5lc3RlZEVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRFbnVtLkJBUjsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdE5lc3RlZEVudW0gew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0TmVzdGVkRW51bTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0gRGVmYXVsdE5lc3RlZEVudW0gew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0TmVzdGVkRW51bV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0Rm9yZWlnbkVudW1GaWVsZE51bWJlciA9IDgyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdEZvcmVpZ25FbnVtOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtTGl0ZSBkZWZhdWx0Rm9yZWlnbkVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVI7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRGb3JlaWduRW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRGb3JlaWduRW51bTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bUxpdGUgRGVmYXVsdEZvcmVpZ25FbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEZvcmVpZ25FbnVtXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRJbXBvcnRFbnVtRmllbGROdW1iZXIgPSA4MzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRJbXBvcnRFbnVtOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW1MaXRlIGRlZmF1bHRJbXBvcnRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBUjsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEltcG9ydEVudW0gew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0SW1wb3J0RW51bTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtTGl0ZSBEZWZhdWx0SW1wb3J0RW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbXBvcnRFbnVtXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTdHJpbmdQaWVjZUZpZWxkTnVtYmVyID0gODQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0U3RyaW5nUGllY2U7DQorICAgIHByaXZhdGUgc3RyaW5nIGRlZmF1bHRTdHJpbmdQaWVjZV8gPSAiYWJjIjsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFN0cmluZ1BpZWNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdFN0cmluZ1BpZWNlOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBEZWZhdWx0U3RyaW5nUGllY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0U3RyaW5nUGllY2VfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdENvcmRGaWVsZE51bWJlciA9IDg1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdENvcmQ7DQorICAgIHByaXZhdGUgc3RyaW5nIGRlZmF1bHRDb3JkXyA9ICIxMjMiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Q29yZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRDb3JkOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBEZWZhdWx0Q29yZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRDb3JkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdEFsbFR5cGVzTGl0ZUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW50MzIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzMxXSwgT3B0aW9uYWxJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEludDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NCgyLCBmaWVsZF9uYW1lc1szMl0sIE9wdGlvbmFsSW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxVaW50MzIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQzMigzLCBmaWVsZF9uYW1lc1s0MV0sIE9wdGlvbmFsVWludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsVWludDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50NjQoNCwgZmllbGRfbmFtZXNbNDJdLCBPcHRpb25hbFVpbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFNpbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ludDMyKDUsIGZpZWxkX25hbWVzWzM3XSwgT3B0aW9uYWxTaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTaW50NjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNJbnQ2NCg2LCBmaWVsZF9uYW1lc1szOF0sIE9wdGlvbmFsU2ludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRml4ZWQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQzMig3LCBmaWVsZF9uYW1lc1syNF0sIE9wdGlvbmFsRml4ZWQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZpeGVkNjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkNjQoOCwgZmllbGRfbmFtZXNbMjVdLCBPcHRpb25hbEZpeGVkNjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTZml4ZWQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ZpeGVkMzIoOSwgZmllbGRfbmFtZXNbMzVdLCBPcHRpb25hbFNmaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsU2ZpeGVkNjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNGaXhlZDY0KDEwLCBmaWVsZF9uYW1lc1szNl0sIE9wdGlvbmFsU2ZpeGVkNjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxGbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoMTEsIGZpZWxkX25hbWVzWzI2XSwgT3B0aW9uYWxGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbERvdWJsZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRG91YmxlKDEyLCBmaWVsZF9uYW1lc1syM10sIE9wdGlvbmFsRG91YmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsQm9vbCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCgxMywgZmllbGRfbmFtZXNbMjBdLCBPcHRpb25hbEJvb2wpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTdHJpbmcpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxNCwgZmllbGRfbmFtZXNbMzldLCBPcHRpb25hbFN0cmluZyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEJ5dGVzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCeXRlcygxNSwgZmllbGRfbmFtZXNbMjFdLCBPcHRpb25hbEJ5dGVzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsR3JvdXApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUdyb3VwKDE2LCBmaWVsZF9uYW1lc1s0M10sIE9wdGlvbmFsR3JvdXApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDE4LCBmaWVsZF9uYW1lc1szNF0sIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDE5LCBmaWVsZF9uYW1lc1syOF0sIE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDIwLCBmaWVsZF9uYW1lc1szMF0sIE9wdGlvbmFsSW1wb3J0TWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbE5lc3RlZEVudW0pIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW0oMjEsIGZpZWxkX25hbWVzWzMzXSwgKGludCkgT3B0aW9uYWxOZXN0ZWRFbnVtLCBPcHRpb25hbE5lc3RlZEVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxGb3JlaWduRW51bSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSgyMiwgZmllbGRfbmFtZXNbMjddLCAoaW50KSBPcHRpb25hbEZvcmVpZ25FbnVtLCBPcHRpb25hbEZvcmVpZ25FbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW1wb3J0RW51bSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSgyMywgZmllbGRfbmFtZXNbMjldLCAoaW50KSBPcHRpb25hbEltcG9ydEVudW0sIE9wdGlvbmFsSW1wb3J0RW51bSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFN0cmluZ1BpZWNlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMjQsIGZpZWxkX25hbWVzWzQwXSwgT3B0aW9uYWxTdHJpbmdQaWVjZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbENvcmQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygyNSwgZmllbGRfbmFtZXNbMjJdLCBPcHRpb25hbENvcmQpOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRJbnQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMkFycmF5KDMxLCBmaWVsZF9uYW1lc1s1NV0sIHJlcGVhdGVkSW50MzJfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkSW50NjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50NjRBcnJheSgzMiwgZmllbGRfbmFtZXNbNTZdLCByZXBlYXRlZEludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFVpbnQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50MzJBcnJheSgzMywgZmllbGRfbmFtZXNbNjVdLCByZXBlYXRlZFVpbnQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRVaW50NjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlVUludDY0QXJyYXkoMzQsIGZpZWxkX25hbWVzWzY2XSwgcmVwZWF0ZWRVaW50NjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkU2ludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNJbnQzMkFycmF5KDM1LCBmaWVsZF9uYW1lc1s2MV0sIHJlcGVhdGVkU2ludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFNpbnQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTSW50NjRBcnJheSgzNiwgZmllbGRfbmFtZXNbNjJdLCByZXBlYXRlZFNpbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRGaXhlZDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkMzJBcnJheSgzNywgZmllbGRfbmFtZXNbNDhdLCByZXBlYXRlZEZpeGVkMzJfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkRml4ZWQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDY0QXJyYXkoMzgsIGZpZWxkX25hbWVzWzQ5XSwgcmVwZWF0ZWRGaXhlZDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFNmaXhlZDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNGaXhlZDMyQXJyYXkoMzksIGZpZWxkX25hbWVzWzU5XSwgcmVwZWF0ZWRTZml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRTZml4ZWQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQ2NEFycmF5KDQwLCBmaWVsZF9uYW1lc1s2MF0sIHJlcGVhdGVkU2ZpeGVkNjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkRmxvYXRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXRBcnJheSg0MSwgZmllbGRfbmFtZXNbNTBdLCByZXBlYXRlZEZsb2F0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZERvdWJsZV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGVBcnJheSg0MiwgZmllbGRfbmFtZXNbNDddLCByZXBlYXRlZERvdWJsZV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRCb29sXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2xBcnJheSg0MywgZmllbGRfbmFtZXNbNDRdLCByZXBlYXRlZEJvb2xfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkU3RyaW5nXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZ0FycmF5KDQ0LCBmaWVsZF9uYW1lc1s2M10sIHJlcGVhdGVkU3RyaW5nXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEJ5dGVzXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzQXJyYXkoNDUsIGZpZWxkX25hbWVzWzQ1XSwgcmVwZWF0ZWRCeXRlc18pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRHcm91cF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVHcm91cEFycmF5KDQ2LCBmaWVsZF9uYW1lc1s2N10sIHJlcGVhdGVkR3JvdXBfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlQXJyYXkoNDgsIGZpZWxkX25hbWVzWzU4XSwgcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSg0OSwgZmllbGRfbmFtZXNbNTJdLCByZXBlYXRlZEZvcmVpZ25NZXNzYWdlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEltcG9ydE1lc3NhZ2VfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDUwLCBmaWVsZF9uYW1lc1s1NF0sIHJlcGVhdGVkSW1wb3J0TWVzc2FnZV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWROZXN0ZWRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW1BcnJheSg1MSwgZmllbGRfbmFtZXNbNTddLCByZXBlYXRlZE5lc3RlZEVudW1fKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkRm9yZWlnbkVudW1fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bUFycmF5KDUyLCBmaWVsZF9uYW1lc1s1MV0sIHJlcGVhdGVkRm9yZWlnbkVudW1fKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkSW1wb3J0RW51bV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtQXJyYXkoNTMsIGZpZWxkX25hbWVzWzUzXSwgcmVwZWF0ZWRJbXBvcnRFbnVtXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFN0cmluZ1BpZWNlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZ0FycmF5KDU0LCBmaWVsZF9uYW1lc1s2NF0sIHJlcGVhdGVkU3RyaW5nUGllY2VfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkQ29yZF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmdBcnJheSg1NSwgZmllbGRfbmFtZXNbNDZdLCByZXBlYXRlZENvcmRfKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRJbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNjEsIGZpZWxkX25hbWVzWzldLCBEZWZhdWx0SW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEludDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NCg2MiwgZmllbGRfbmFtZXNbMTBdLCBEZWZhdWx0SW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFVpbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlVUludDMyKDYzLCBmaWVsZF9uYW1lc1sxOF0sIERlZmF1bHRVaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFVpbnQ2NCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlVUludDY0KDY0LCBmaWVsZF9uYW1lc1sxOV0sIERlZmF1bHRVaW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFNpbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ludDMyKDY1LCBmaWVsZF9uYW1lc1sxNF0sIERlZmF1bHRTaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFNpbnQ2NCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ludDY0KDY2LCBmaWVsZF9uYW1lc1sxNV0sIERlZmF1bHRTaW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEZpeGVkMzIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkMzIoNjcsIGZpZWxkX25hbWVzWzRdLCBEZWZhdWx0Rml4ZWQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0Rml4ZWQ2NCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQ2NCg2OCwgZmllbGRfbmFtZXNbNV0sIERlZmF1bHRGaXhlZDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTZml4ZWQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ZpeGVkMzIoNjksIGZpZWxkX25hbWVzWzEyXSwgRGVmYXVsdFNmaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTZml4ZWQ2NCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ZpeGVkNjQoNzAsIGZpZWxkX25hbWVzWzEzXSwgRGVmYXVsdFNmaXhlZDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRGbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoNzEsIGZpZWxkX25hbWVzWzZdLCBEZWZhdWx0RmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdERvdWJsZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRG91YmxlKDcyLCBmaWVsZF9uYW1lc1szXSwgRGVmYXVsdERvdWJsZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0Qm9vbCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCg3MywgZmllbGRfbmFtZXNbMF0sIERlZmF1bHRCb29sKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTdHJpbmcpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyg3NCwgZmllbGRfbmFtZXNbMTZdLCBEZWZhdWx0U3RyaW5nKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRCeXRlcykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQnl0ZXMoNzUsIGZpZWxkX25hbWVzWzFdLCBEZWZhdWx0Qnl0ZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdE5lc3RlZEVudW0pIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW0oODEsIGZpZWxkX25hbWVzWzExXSwgKGludCkgRGVmYXVsdE5lc3RlZEVudW0sIERlZmF1bHROZXN0ZWRFbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRGb3JlaWduRW51bSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSg4MiwgZmllbGRfbmFtZXNbN10sIChpbnQpIERlZmF1bHRGb3JlaWduRW51bSwgRGVmYXVsdEZvcmVpZ25FbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRJbXBvcnRFbnVtKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDgzLCBmaWVsZF9uYW1lc1s4XSwgKGludCkgRGVmYXVsdEltcG9ydEVudW0sIERlZmF1bHRJbXBvcnRFbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTdHJpbmdQaWVjZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDg0LCBmaWVsZF9uYW1lc1sxN10sIERlZmF1bHRTdHJpbmdQaWVjZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0Q29yZCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDg1LCBmaWVsZF9uYW1lc1syXSwgRGVmYXVsdENvcmQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgT3B0aW9uYWxJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEludDY0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKDIsIE9wdGlvbmFsSW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxVaW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50MzJTaXplKDMsIE9wdGlvbmFsVWludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsVWludDY0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDY0U2l6ZSg0LCBPcHRpb25hbFVpbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFNpbnQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQzMlNpemUoNSwgT3B0aW9uYWxTaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTaW50NjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50NjRTaXplKDYsIE9wdGlvbmFsU2ludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRml4ZWQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZpeGVkMzJTaXplKDcsIE9wdGlvbmFsRml4ZWQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZpeGVkNjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGaXhlZDY0U2l6ZSg4LCBPcHRpb25hbEZpeGVkNjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTZml4ZWQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNGaXhlZDMyU2l6ZSg5LCBPcHRpb25hbFNmaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsU2ZpeGVkNjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTRml4ZWQ2NFNpemUoMTAsIE9wdGlvbmFsU2ZpeGVkNjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxGbG9hdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSgxMSwgT3B0aW9uYWxGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbERvdWJsZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZURvdWJsZVNpemUoMTIsIE9wdGlvbmFsRG91YmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsQm9vbCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDEzLCBPcHRpb25hbEJvb2wpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTdHJpbmcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDE0LCBPcHRpb25hbFN0cmluZyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEJ5dGVzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplKDE1LCBPcHRpb25hbEJ5dGVzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsR3JvdXApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVHcm91cFNpemUoMTYsIE9wdGlvbmFsR3JvdXApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMTgsIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMTksIE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMjAsIE9wdGlvbmFsSW1wb3J0TWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbE5lc3RlZEVudW0pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgyMSwgKGludCkgT3B0aW9uYWxOZXN0ZWRFbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRm9yZWlnbkVudW0pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgyMiwgKGludCkgT3B0aW9uYWxGb3JlaWduRW51bSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEltcG9ydEVudW0pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgyMywgKGludCkgT3B0aW9uYWxJbXBvcnRFbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsU3RyaW5nUGllY2UpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDI0LCBPcHRpb25hbFN0cmluZ1BpZWNlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsQ29yZCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMjUsIE9wdGlvbmFsQ29yZCk7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChpbnQgZWxlbWVudCBpbiBSZXBlYXRlZEludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkSW50MzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAobG9uZyBlbGVtZW50IGluIFJlcGVhdGVkSW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRJbnQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoICh1aW50IGVsZW1lbnQgaW4gUmVwZWF0ZWRVaW50MzJMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkVWludDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHVsb25nIGVsZW1lbnQgaW4gUmVwZWF0ZWRVaW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkVWludDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIFJlcGVhdGVkU2ludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZFNpbnQzMl8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChsb25nIGVsZW1lbnQgaW4gUmVwZWF0ZWRTaW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkU2ludDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHJlcGVhdGVkRml4ZWQzMl8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRGaXhlZDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHJlcGVhdGVkRml4ZWQ2NF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRGaXhlZDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHJlcGVhdGVkU2ZpeGVkMzJfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkU2ZpeGVkMzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogcmVwZWF0ZWRTZml4ZWQ2NF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRTZml4ZWQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDQgKiByZXBlYXRlZEZsb2F0Xy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZEZsb2F0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHJlcGVhdGVkRG91YmxlXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZERvdWJsZV8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDEgKiByZXBlYXRlZEJvb2xfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkQm9vbF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChzdHJpbmcgZWxlbWVudCBpbiBSZXBlYXRlZFN0cmluZ0xpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRTdHJpbmdfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAocGI6OkJ5dGVTdHJpbmcgZWxlbWVudCBpbiBSZXBlYXRlZEJ5dGVzTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJ5dGVzU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkQnl0ZXNfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLlJlcGVhdGVkR3JvdXAgZWxlbWVudCBpbiBSZXBlYXRlZEdyb3VwTGlzdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUdyb3VwU2l6ZSg0NiwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkTWVzc2FnZSBlbGVtZW50IGluIFJlcGVhdGVkTmVzdGVkTWVzc2FnZUxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSg0OCwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlTGl0ZSBlbGVtZW50IGluIFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoNDksIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlTGl0ZSBlbGVtZW50IGluIFJlcGVhdGVkSW1wb3J0TWVzc2FnZUxpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSg1MCwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBpZiAocmVwZWF0ZWROZXN0ZWRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRFbnVtIGVsZW1lbnQgaW4gcmVwZWF0ZWROZXN0ZWRFbnVtXykgew0KKyAgICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemVOb1RhZygoaW50KSBlbGVtZW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZE5lc3RlZEVudW1fLkNvdW50Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKHJlcGVhdGVkRm9yZWlnbkVudW1fLkNvdW50ID4gMCkgew0KKyAgICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bUxpdGUgZWxlbWVudCBpbiByZXBlYXRlZEZvcmVpZ25FbnVtXykgew0KKyAgICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemVOb1RhZygoaW50KSBlbGVtZW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZEZvcmVpZ25FbnVtXy5Db3VudDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGlmIChyZXBlYXRlZEltcG9ydEVudW1fLkNvdW50ID4gMCkgew0KKyAgICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtTGl0ZSBlbGVtZW50IGluIHJlcGVhdGVkSW1wb3J0RW51bV8pIHsNCisgICAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplTm9UYWcoKGludCkgZWxlbWVudCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRJbXBvcnRFbnVtXy5Db3VudDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIFJlcGVhdGVkU3RyaW5nUGllY2VMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkU3RyaW5nUGllY2VfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGVsZW1lbnQgaW4gUmVwZWF0ZWRDb3JkTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZENvcmRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEludDMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDYxLCBEZWZhdWx0SW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEludDY0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKDYyLCBEZWZhdWx0SW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFVpbnQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQzMlNpemUoNjMsIERlZmF1bHRVaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFVpbnQ2NCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQ2NFNpemUoNjQsIERlZmF1bHRVaW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFNpbnQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQzMlNpemUoNjUsIERlZmF1bHRTaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFNpbnQ2NCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQ2NFNpemUoNjYsIERlZmF1bHRTaW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEZpeGVkMzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGaXhlZDMyU2l6ZSg2NywgRGVmYXVsdEZpeGVkMzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEZpeGVkNjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGaXhlZDY0U2l6ZSg2OCwgRGVmYXVsdEZpeGVkNjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFNmaXhlZDMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ZpeGVkMzJTaXplKDY5LCBEZWZhdWx0U2ZpeGVkMzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFNmaXhlZDY0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ZpeGVkNjRTaXplKDcwLCBEZWZhdWx0U2ZpeGVkNjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDcxLCBEZWZhdWx0RmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdERvdWJsZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZURvdWJsZVNpemUoNzIsIERlZmF1bHREb3VibGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEJvb2wpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSg3MywgRGVmYXVsdEJvb2wpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFN0cmluZykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoNzQsIERlZmF1bHRTdHJpbmcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEJ5dGVzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplKDc1LCBEZWZhdWx0Qnl0ZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdE5lc3RlZEVudW0pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSg4MSwgKGludCkgRGVmYXVsdE5lc3RlZEVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEZvcmVpZ25FbnVtKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoODIsIChpbnQpIERlZmF1bHRGb3JlaWduRW51bSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0SW1wb3J0RW51bSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDgzLCAoaW50KSBEZWZhdWx0SW1wb3J0RW51bSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0U3RyaW5nUGllY2UpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDg0LCBEZWZhdWx0U3RyaW5nUGllY2UpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdENvcmQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDg1LCBEZWZhdWx0Q29yZCk7DQorICAgICAgfQ0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgICNyZWdpb24gTGl0ZSBydW50aW1lIG1ldGhvZHMNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsNCisgICAgICBpbnQgaGFzaCA9IEdldFR5cGUoKS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbEludDMyKSBoYXNoIF49IG9wdGlvbmFsSW50MzJfLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW50NjQpIGhhc2ggXj0gb3B0aW9uYWxJbnQ2NF8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxVaW50MzIpIGhhc2ggXj0gb3B0aW9uYWxVaW50MzJfLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc09wdGlvbmFsVWludDY0KSBoYXNoIF49IG9wdGlvbmFsVWludDY0Xy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbFNpbnQzMikgaGFzaCBePSBvcHRpb25hbFNpbnQzMl8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxTaW50NjQpIGhhc2ggXj0gb3B0aW9uYWxTaW50NjRfLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc09wdGlvbmFsRml4ZWQzMikgaGFzaCBePSBvcHRpb25hbEZpeGVkMzJfLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc09wdGlvbmFsRml4ZWQ2NCkgaGFzaCBePSBvcHRpb25hbEZpeGVkNjRfLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc09wdGlvbmFsU2ZpeGVkMzIpIGhhc2ggXj0gb3B0aW9uYWxTZml4ZWQzMl8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxTZml4ZWQ2NCkgaGFzaCBePSBvcHRpb25hbFNmaXhlZDY0Xy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZsb2F0KSBoYXNoIF49IG9wdGlvbmFsRmxvYXRfLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc09wdGlvbmFsRG91YmxlKSBoYXNoIF49IG9wdGlvbmFsRG91YmxlXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbEJvb2wpIGhhc2ggXj0gb3B0aW9uYWxCb29sXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbFN0cmluZykgaGFzaCBePSBvcHRpb25hbFN0cmluZ18uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxCeXRlcykgaGFzaCBePSBvcHRpb25hbEJ5dGVzXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbEdyb3VwKSBoYXNoIF49IG9wdGlvbmFsR3JvdXBfLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSkgaGFzaCBePSBvcHRpb25hbE5lc3RlZE1lc3NhZ2VfLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpIGhhc2ggXj0gb3B0aW9uYWxGb3JlaWduTWVzc2FnZV8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlKSBoYXNoIF49IG9wdGlvbmFsSW1wb3J0TWVzc2FnZV8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxOZXN0ZWRFbnVtKSBoYXNoIF49IG9wdGlvbmFsTmVzdGVkRW51bV8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxGb3JlaWduRW51bSkgaGFzaCBePSBvcHRpb25hbEZvcmVpZ25FbnVtXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbEltcG9ydEVudW0pIGhhc2ggXj0gb3B0aW9uYWxJbXBvcnRFbnVtXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbFN0cmluZ1BpZWNlKSBoYXNoIF49IG9wdGlvbmFsU3RyaW5nUGllY2VfLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc09wdGlvbmFsQ29yZCkgaGFzaCBePSBvcHRpb25hbENvcmRfLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChpbnQgaSBpbiByZXBlYXRlZEludDMyXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2gobG9uZyBpIGluIHJlcGVhdGVkSW50NjRfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaCh1aW50IGkgaW4gcmVwZWF0ZWRVaW50MzJfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaCh1bG9uZyBpIGluIHJlcGVhdGVkVWludDY0XykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2goaW50IGkgaW4gcmVwZWF0ZWRTaW50MzJfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChsb25nIGkgaW4gcmVwZWF0ZWRTaW50NjRfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaCh1aW50IGkgaW4gcmVwZWF0ZWRGaXhlZDMyXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2godWxvbmcgaSBpbiByZXBlYXRlZEZpeGVkNjRfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChpbnQgaSBpbiByZXBlYXRlZFNmaXhlZDMyXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2gobG9uZyBpIGluIHJlcGVhdGVkU2ZpeGVkNjRfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChmbG9hdCBpIGluIHJlcGVhdGVkRmxvYXRfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChkb3VibGUgaSBpbiByZXBlYXRlZERvdWJsZV8pDQorICAgICAgICBoYXNoIF49IGkuR2V0SGFzaENvZGUoKTsNCisgICAgICBmb3JlYWNoKGJvb2wgaSBpbiByZXBlYXRlZEJvb2xfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChzdHJpbmcgaSBpbiByZXBlYXRlZFN0cmluZ18pDQorICAgICAgICBoYXNoIF49IGkuR2V0SGFzaENvZGUoKTsNCisgICAgICBmb3JlYWNoKHBiOjpCeXRlU3RyaW5nIGkgaW4gcmVwZWF0ZWRCeXRlc18pDQorICAgICAgICBoYXNoIF49IGkuR2V0SGFzaENvZGUoKTsNCisgICAgICBmb3JlYWNoKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuUmVwZWF0ZWRHcm91cCBpIGluIHJlcGVhdGVkR3JvdXBfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZE1lc3NhZ2UgaSBpbiByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZUxpdGUgaSBpbiByZXBlYXRlZEZvcmVpZ25NZXNzYWdlXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2goZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUgaSBpbiByZXBlYXRlZEltcG9ydE1lc3NhZ2VfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0gaSBpbiByZXBlYXRlZE5lc3RlZEVudW1fKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bUxpdGUgaSBpbiByZXBlYXRlZEZvcmVpZ25FbnVtXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2goZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGUgaSBpbiByZXBlYXRlZEltcG9ydEVudW1fKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChzdHJpbmcgaSBpbiByZXBlYXRlZFN0cmluZ1BpZWNlXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2goc3RyaW5nIGkgaW4gcmVwZWF0ZWRDb3JkXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNEZWZhdWx0SW50MzIpIGhhc2ggXj0gZGVmYXVsdEludDMyXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNEZWZhdWx0SW50NjQpIGhhc2ggXj0gZGVmYXVsdEludDY0Xy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNEZWZhdWx0VWludDMyKSBoYXNoIF49IGRlZmF1bHRVaW50MzJfLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc0RlZmF1bHRVaW50NjQpIGhhc2ggXj0gZGVmYXVsdFVpbnQ2NF8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzRGVmYXVsdFNpbnQzMikgaGFzaCBePSBkZWZhdWx0U2ludDMyXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNEZWZhdWx0U2ludDY0KSBoYXNoIF49IGRlZmF1bHRTaW50NjRfLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc0RlZmF1bHRGaXhlZDMyKSBoYXNoIF49IGRlZmF1bHRGaXhlZDMyXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNEZWZhdWx0Rml4ZWQ2NCkgaGFzaCBePSBkZWZhdWx0Rml4ZWQ2NF8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzRGVmYXVsdFNmaXhlZDMyKSBoYXNoIF49IGRlZmF1bHRTZml4ZWQzMl8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzRGVmYXVsdFNmaXhlZDY0KSBoYXNoIF49IGRlZmF1bHRTZml4ZWQ2NF8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzRGVmYXVsdEZsb2F0KSBoYXNoIF49IGRlZmF1bHRGbG9hdF8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzRGVmYXVsdERvdWJsZSkgaGFzaCBePSBkZWZhdWx0RG91YmxlXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNEZWZhdWx0Qm9vbCkgaGFzaCBePSBkZWZhdWx0Qm9vbF8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzRGVmYXVsdFN0cmluZykgaGFzaCBePSBkZWZhdWx0U3RyaW5nXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNEZWZhdWx0Qnl0ZXMpIGhhc2ggXj0gZGVmYXVsdEJ5dGVzXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGlmIChoYXNEZWZhdWx0TmVzdGVkRW51bSkgaGFzaCBePSBkZWZhdWx0TmVzdGVkRW51bV8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzRGVmYXVsdEZvcmVpZ25FbnVtKSBoYXNoIF49IGRlZmF1bHRGb3JlaWduRW51bV8uR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzRGVmYXVsdEltcG9ydEVudW0pIGhhc2ggXj0gZGVmYXVsdEltcG9ydEVudW1fLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc0RlZmF1bHRTdHJpbmdQaWVjZSkgaGFzaCBePSBkZWZhdWx0U3RyaW5nUGllY2VfLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc0RlZmF1bHRDb3JkKSBoYXNoIF49IGRlZmF1bHRDb3JkXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIHJldHVybiBoYXNoOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikgew0KKyAgICAgIFRlc3RBbGxUeXBlc0xpdGUgb3RoZXIgPSBvYmogYXMgVGVzdEFsbFR5cGVzTGl0ZTsNCisgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbEludDMyICE9IG90aGVyLmhhc09wdGlvbmFsSW50MzIgfHwgKGhhc09wdGlvbmFsSW50MzIgJiYgIW9wdGlvbmFsSW50MzJfLkVxdWFscyhvdGhlci5vcHRpb25hbEludDMyXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW50NjQgIT0gb3RoZXIuaGFzT3B0aW9uYWxJbnQ2NCB8fCAoaGFzT3B0aW9uYWxJbnQ2NCAmJiAhb3B0aW9uYWxJbnQ2NF8uRXF1YWxzKG90aGVyLm9wdGlvbmFsSW50NjRfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxVaW50MzIgIT0gb3RoZXIuaGFzT3B0aW9uYWxVaW50MzIgfHwgKGhhc09wdGlvbmFsVWludDMyICYmICFvcHRpb25hbFVpbnQzMl8uRXF1YWxzKG90aGVyLm9wdGlvbmFsVWludDMyXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc09wdGlvbmFsVWludDY0ICE9IG90aGVyLmhhc09wdGlvbmFsVWludDY0IHx8IChoYXNPcHRpb25hbFVpbnQ2NCAmJiAhb3B0aW9uYWxVaW50NjRfLkVxdWFscyhvdGhlci5vcHRpb25hbFVpbnQ2NF8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbFNpbnQzMiAhPSBvdGhlci5oYXNPcHRpb25hbFNpbnQzMiB8fCAoaGFzT3B0aW9uYWxTaW50MzIgJiYgIW9wdGlvbmFsU2ludDMyXy5FcXVhbHMob3RoZXIub3B0aW9uYWxTaW50MzJfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxTaW50NjQgIT0gb3RoZXIuaGFzT3B0aW9uYWxTaW50NjQgfHwgKGhhc09wdGlvbmFsU2ludDY0ICYmICFvcHRpb25hbFNpbnQ2NF8uRXF1YWxzKG90aGVyLm9wdGlvbmFsU2ludDY0XykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc09wdGlvbmFsRml4ZWQzMiAhPSBvdGhlci5oYXNPcHRpb25hbEZpeGVkMzIgfHwgKGhhc09wdGlvbmFsRml4ZWQzMiAmJiAhb3B0aW9uYWxGaXhlZDMyXy5FcXVhbHMob3RoZXIub3B0aW9uYWxGaXhlZDMyXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc09wdGlvbmFsRml4ZWQ2NCAhPSBvdGhlci5oYXNPcHRpb25hbEZpeGVkNjQgfHwgKGhhc09wdGlvbmFsRml4ZWQ2NCAmJiAhb3B0aW9uYWxGaXhlZDY0Xy5FcXVhbHMob3RoZXIub3B0aW9uYWxGaXhlZDY0XykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc09wdGlvbmFsU2ZpeGVkMzIgIT0gb3RoZXIuaGFzT3B0aW9uYWxTZml4ZWQzMiB8fCAoaGFzT3B0aW9uYWxTZml4ZWQzMiAmJiAhb3B0aW9uYWxTZml4ZWQzMl8uRXF1YWxzKG90aGVyLm9wdGlvbmFsU2ZpeGVkMzJfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxTZml4ZWQ2NCAhPSBvdGhlci5oYXNPcHRpb25hbFNmaXhlZDY0IHx8IChoYXNPcHRpb25hbFNmaXhlZDY0ICYmICFvcHRpb25hbFNmaXhlZDY0Xy5FcXVhbHMob3RoZXIub3B0aW9uYWxTZml4ZWQ2NF8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZsb2F0ICE9IG90aGVyLmhhc09wdGlvbmFsRmxvYXQgfHwgKGhhc09wdGlvbmFsRmxvYXQgJiYgIW9wdGlvbmFsRmxvYXRfLkVxdWFscyhvdGhlci5vcHRpb25hbEZsb2F0XykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc09wdGlvbmFsRG91YmxlICE9IG90aGVyLmhhc09wdGlvbmFsRG91YmxlIHx8IChoYXNPcHRpb25hbERvdWJsZSAmJiAhb3B0aW9uYWxEb3VibGVfLkVxdWFscyhvdGhlci5vcHRpb25hbERvdWJsZV8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbEJvb2wgIT0gb3RoZXIuaGFzT3B0aW9uYWxCb29sIHx8IChoYXNPcHRpb25hbEJvb2wgJiYgIW9wdGlvbmFsQm9vbF8uRXF1YWxzKG90aGVyLm9wdGlvbmFsQm9vbF8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbFN0cmluZyAhPSBvdGhlci5oYXNPcHRpb25hbFN0cmluZyB8fCAoaGFzT3B0aW9uYWxTdHJpbmcgJiYgIW9wdGlvbmFsU3RyaW5nXy5FcXVhbHMob3RoZXIub3B0aW9uYWxTdHJpbmdfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxCeXRlcyAhPSBvdGhlci5oYXNPcHRpb25hbEJ5dGVzIHx8IChoYXNPcHRpb25hbEJ5dGVzICYmICFvcHRpb25hbEJ5dGVzXy5FcXVhbHMob3RoZXIub3B0aW9uYWxCeXRlc18pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbEdyb3VwICE9IG90aGVyLmhhc09wdGlvbmFsR3JvdXAgfHwgKGhhc09wdGlvbmFsR3JvdXAgJiYgIW9wdGlvbmFsR3JvdXBfLkVxdWFscyhvdGhlci5vcHRpb25hbEdyb3VwXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSAhPSBvdGhlci5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UgfHwgKGhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSAmJiAhb3B0aW9uYWxOZXN0ZWRNZXNzYWdlXy5FcXVhbHMob3RoZXIub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgIT0gb3RoZXIuaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSB8fCAoaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSAmJiAhb3B0aW9uYWxGb3JlaWduTWVzc2FnZV8uRXF1YWxzKG90aGVyLm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlICE9IG90aGVyLmhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSB8fCAoaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlICYmICFvcHRpb25hbEltcG9ydE1lc3NhZ2VfLkVxdWFscyhvdGhlci5vcHRpb25hbEltcG9ydE1lc3NhZ2VfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxOZXN0ZWRFbnVtICE9IG90aGVyLmhhc09wdGlvbmFsTmVzdGVkRW51bSB8fCAoaGFzT3B0aW9uYWxOZXN0ZWRFbnVtICYmICFvcHRpb25hbE5lc3RlZEVudW1fLkVxdWFscyhvdGhlci5vcHRpb25hbE5lc3RlZEVudW1fKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxGb3JlaWduRW51bSAhPSBvdGhlci5oYXNPcHRpb25hbEZvcmVpZ25FbnVtIHx8IChoYXNPcHRpb25hbEZvcmVpZ25FbnVtICYmICFvcHRpb25hbEZvcmVpZ25FbnVtXy5FcXVhbHMob3RoZXIub3B0aW9uYWxGb3JlaWduRW51bV8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbEltcG9ydEVudW0gIT0gb3RoZXIuaGFzT3B0aW9uYWxJbXBvcnRFbnVtIHx8IChoYXNPcHRpb25hbEltcG9ydEVudW0gJiYgIW9wdGlvbmFsSW1wb3J0RW51bV8uRXF1YWxzKG90aGVyLm9wdGlvbmFsSW1wb3J0RW51bV8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbFN0cmluZ1BpZWNlICE9IG90aGVyLmhhc09wdGlvbmFsU3RyaW5nUGllY2UgfHwgKGhhc09wdGlvbmFsU3RyaW5nUGllY2UgJiYgIW9wdGlvbmFsU3RyaW5nUGllY2VfLkVxdWFscyhvdGhlci5vcHRpb25hbFN0cmluZ1BpZWNlXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc09wdGlvbmFsQ29yZCAhPSBvdGhlci5oYXNPcHRpb25hbENvcmQgfHwgKGhhc09wdGlvbmFsQ29yZCAmJiAhb3B0aW9uYWxDb3JkXy5FcXVhbHMob3RoZXIub3B0aW9uYWxDb3JkXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocmVwZWF0ZWRJbnQzMl8uQ291bnQgIT0gb3RoZXIucmVwZWF0ZWRJbnQzMl8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcmVwZWF0ZWRJbnQzMl8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcmVwZWF0ZWRJbnQzMl9baXhdLkVxdWFscyhvdGhlci5yZXBlYXRlZEludDMyX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocmVwZWF0ZWRJbnQ2NF8uQ291bnQgIT0gb3RoZXIucmVwZWF0ZWRJbnQ2NF8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcmVwZWF0ZWRJbnQ2NF8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcmVwZWF0ZWRJbnQ2NF9baXhdLkVxdWFscyhvdGhlci5yZXBlYXRlZEludDY0X1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocmVwZWF0ZWRVaW50MzJfLkNvdW50ICE9IG90aGVyLnJlcGVhdGVkVWludDMyXy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCByZXBlYXRlZFVpbnQzMl8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcmVwZWF0ZWRVaW50MzJfW2l4XS5FcXVhbHMob3RoZXIucmVwZWF0ZWRVaW50MzJfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZihyZXBlYXRlZFVpbnQ2NF8uQ291bnQgIT0gb3RoZXIucmVwZWF0ZWRVaW50NjRfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHJlcGVhdGVkVWludDY0Xy5Db3VudDsgaXgrKykNCisgICAgICAgIGlmKCFyZXBlYXRlZFVpbnQ2NF9baXhdLkVxdWFscyhvdGhlci5yZXBlYXRlZFVpbnQ2NF9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHJlcGVhdGVkU2ludDMyXy5Db3VudCAhPSBvdGhlci5yZXBlYXRlZFNpbnQzMl8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcmVwZWF0ZWRTaW50MzJfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXJlcGVhdGVkU2ludDMyX1tpeF0uRXF1YWxzKG90aGVyLnJlcGVhdGVkU2ludDMyX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocmVwZWF0ZWRTaW50NjRfLkNvdW50ICE9IG90aGVyLnJlcGVhdGVkU2ludDY0Xy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCByZXBlYXRlZFNpbnQ2NF8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcmVwZWF0ZWRTaW50NjRfW2l4XS5FcXVhbHMob3RoZXIucmVwZWF0ZWRTaW50NjRfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZihyZXBlYXRlZEZpeGVkMzJfLkNvdW50ICE9IG90aGVyLnJlcGVhdGVkRml4ZWQzMl8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcmVwZWF0ZWRGaXhlZDMyXy5Db3VudDsgaXgrKykNCisgICAgICAgIGlmKCFyZXBlYXRlZEZpeGVkMzJfW2l4XS5FcXVhbHMob3RoZXIucmVwZWF0ZWRGaXhlZDMyX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocmVwZWF0ZWRGaXhlZDY0Xy5Db3VudCAhPSBvdGhlci5yZXBlYXRlZEZpeGVkNjRfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHJlcGVhdGVkRml4ZWQ2NF8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcmVwZWF0ZWRGaXhlZDY0X1tpeF0uRXF1YWxzKG90aGVyLnJlcGVhdGVkRml4ZWQ2NF9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHJlcGVhdGVkU2ZpeGVkMzJfLkNvdW50ICE9IG90aGVyLnJlcGVhdGVkU2ZpeGVkMzJfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHJlcGVhdGVkU2ZpeGVkMzJfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXJlcGVhdGVkU2ZpeGVkMzJfW2l4XS5FcXVhbHMob3RoZXIucmVwZWF0ZWRTZml4ZWQzMl9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHJlcGVhdGVkU2ZpeGVkNjRfLkNvdW50ICE9IG90aGVyLnJlcGVhdGVkU2ZpeGVkNjRfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHJlcGVhdGVkU2ZpeGVkNjRfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXJlcGVhdGVkU2ZpeGVkNjRfW2l4XS5FcXVhbHMob3RoZXIucmVwZWF0ZWRTZml4ZWQ2NF9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHJlcGVhdGVkRmxvYXRfLkNvdW50ICE9IG90aGVyLnJlcGVhdGVkRmxvYXRfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHJlcGVhdGVkRmxvYXRfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXJlcGVhdGVkRmxvYXRfW2l4XS5FcXVhbHMob3RoZXIucmVwZWF0ZWRGbG9hdF9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHJlcGVhdGVkRG91YmxlXy5Db3VudCAhPSBvdGhlci5yZXBlYXRlZERvdWJsZV8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcmVwZWF0ZWREb3VibGVfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXJlcGVhdGVkRG91YmxlX1tpeF0uRXF1YWxzKG90aGVyLnJlcGVhdGVkRG91YmxlX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocmVwZWF0ZWRCb29sXy5Db3VudCAhPSBvdGhlci5yZXBlYXRlZEJvb2xfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHJlcGVhdGVkQm9vbF8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcmVwZWF0ZWRCb29sX1tpeF0uRXF1YWxzKG90aGVyLnJlcGVhdGVkQm9vbF9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHJlcGVhdGVkU3RyaW5nXy5Db3VudCAhPSBvdGhlci5yZXBlYXRlZFN0cmluZ18uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcmVwZWF0ZWRTdHJpbmdfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXJlcGVhdGVkU3RyaW5nX1tpeF0uRXF1YWxzKG90aGVyLnJlcGVhdGVkU3RyaW5nX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocmVwZWF0ZWRCeXRlc18uQ291bnQgIT0gb3RoZXIucmVwZWF0ZWRCeXRlc18uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcmVwZWF0ZWRCeXRlc18uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcmVwZWF0ZWRCeXRlc19baXhdLkVxdWFscyhvdGhlci5yZXBlYXRlZEJ5dGVzX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocmVwZWF0ZWRHcm91cF8uQ291bnQgIT0gb3RoZXIucmVwZWF0ZWRHcm91cF8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcmVwZWF0ZWRHcm91cF8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcmVwZWF0ZWRHcm91cF9baXhdLkVxdWFscyhvdGhlci5yZXBlYXRlZEdyb3VwX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5Db3VudCAhPSBvdGhlci5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcmVwZWF0ZWROZXN0ZWRNZXNzYWdlX1tpeF0uRXF1YWxzKG90aGVyLnJlcGVhdGVkTmVzdGVkTWVzc2FnZV9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkNvdW50ICE9IG90aGVyLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfW2l4XS5FcXVhbHMob3RoZXIucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQ291bnQgIT0gb3RoZXIucmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCByZXBlYXRlZEltcG9ydE1lc3NhZ2VfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXJlcGVhdGVkSW1wb3J0TWVzc2FnZV9baXhdLkVxdWFscyhvdGhlci5yZXBlYXRlZEltcG9ydE1lc3NhZ2VfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZihyZXBlYXRlZE5lc3RlZEVudW1fLkNvdW50ICE9IG90aGVyLnJlcGVhdGVkTmVzdGVkRW51bV8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcmVwZWF0ZWROZXN0ZWRFbnVtXy5Db3VudDsgaXgrKykNCisgICAgICAgIGlmKCFyZXBlYXRlZE5lc3RlZEVudW1fW2l4XS5FcXVhbHMob3RoZXIucmVwZWF0ZWROZXN0ZWRFbnVtX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocmVwZWF0ZWRGb3JlaWduRW51bV8uQ291bnQgIT0gb3RoZXIucmVwZWF0ZWRGb3JlaWduRW51bV8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcmVwZWF0ZWRGb3JlaWduRW51bV8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcmVwZWF0ZWRGb3JlaWduRW51bV9baXhdLkVxdWFscyhvdGhlci5yZXBlYXRlZEZvcmVpZ25FbnVtX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocmVwZWF0ZWRJbXBvcnRFbnVtXy5Db3VudCAhPSBvdGhlci5yZXBlYXRlZEltcG9ydEVudW1fLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHJlcGVhdGVkSW1wb3J0RW51bV8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcmVwZWF0ZWRJbXBvcnRFbnVtX1tpeF0uRXF1YWxzKG90aGVyLnJlcGVhdGVkSW1wb3J0RW51bV9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHJlcGVhdGVkU3RyaW5nUGllY2VfLkNvdW50ICE9IG90aGVyLnJlcGVhdGVkU3RyaW5nUGllY2VfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHJlcGVhdGVkU3RyaW5nUGllY2VfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXJlcGVhdGVkU3RyaW5nUGllY2VfW2l4XS5FcXVhbHMob3RoZXIucmVwZWF0ZWRTdHJpbmdQaWVjZV9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHJlcGVhdGVkQ29yZF8uQ291bnQgIT0gb3RoZXIucmVwZWF0ZWRDb3JkXy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCByZXBlYXRlZENvcmRfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXJlcGVhdGVkQ29yZF9baXhdLkVxdWFscyhvdGhlci5yZXBlYXRlZENvcmRfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzRGVmYXVsdEludDMyICE9IG90aGVyLmhhc0RlZmF1bHRJbnQzMiB8fCAoaGFzRGVmYXVsdEludDMyICYmICFkZWZhdWx0SW50MzJfLkVxdWFscyhvdGhlci5kZWZhdWx0SW50MzJfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzRGVmYXVsdEludDY0ICE9IG90aGVyLmhhc0RlZmF1bHRJbnQ2NCB8fCAoaGFzRGVmYXVsdEludDY0ICYmICFkZWZhdWx0SW50NjRfLkVxdWFscyhvdGhlci5kZWZhdWx0SW50NjRfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzRGVmYXVsdFVpbnQzMiAhPSBvdGhlci5oYXNEZWZhdWx0VWludDMyIHx8IChoYXNEZWZhdWx0VWludDMyICYmICFkZWZhdWx0VWludDMyXy5FcXVhbHMob3RoZXIuZGVmYXVsdFVpbnQzMl8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNEZWZhdWx0VWludDY0ICE9IG90aGVyLmhhc0RlZmF1bHRVaW50NjQgfHwgKGhhc0RlZmF1bHRVaW50NjQgJiYgIWRlZmF1bHRVaW50NjRfLkVxdWFscyhvdGhlci5kZWZhdWx0VWludDY0XykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc0RlZmF1bHRTaW50MzIgIT0gb3RoZXIuaGFzRGVmYXVsdFNpbnQzMiB8fCAoaGFzRGVmYXVsdFNpbnQzMiAmJiAhZGVmYXVsdFNpbnQzMl8uRXF1YWxzKG90aGVyLmRlZmF1bHRTaW50MzJfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzRGVmYXVsdFNpbnQ2NCAhPSBvdGhlci5oYXNEZWZhdWx0U2ludDY0IHx8IChoYXNEZWZhdWx0U2ludDY0ICYmICFkZWZhdWx0U2ludDY0Xy5FcXVhbHMob3RoZXIuZGVmYXVsdFNpbnQ2NF8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNEZWZhdWx0Rml4ZWQzMiAhPSBvdGhlci5oYXNEZWZhdWx0Rml4ZWQzMiB8fCAoaGFzRGVmYXVsdEZpeGVkMzIgJiYgIWRlZmF1bHRGaXhlZDMyXy5FcXVhbHMob3RoZXIuZGVmYXVsdEZpeGVkMzJfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzRGVmYXVsdEZpeGVkNjQgIT0gb3RoZXIuaGFzRGVmYXVsdEZpeGVkNjQgfHwgKGhhc0RlZmF1bHRGaXhlZDY0ICYmICFkZWZhdWx0Rml4ZWQ2NF8uRXF1YWxzKG90aGVyLmRlZmF1bHRGaXhlZDY0XykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc0RlZmF1bHRTZml4ZWQzMiAhPSBvdGhlci5oYXNEZWZhdWx0U2ZpeGVkMzIgfHwgKGhhc0RlZmF1bHRTZml4ZWQzMiAmJiAhZGVmYXVsdFNmaXhlZDMyXy5FcXVhbHMob3RoZXIuZGVmYXVsdFNmaXhlZDMyXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc0RlZmF1bHRTZml4ZWQ2NCAhPSBvdGhlci5oYXNEZWZhdWx0U2ZpeGVkNjQgfHwgKGhhc0RlZmF1bHRTZml4ZWQ2NCAmJiAhZGVmYXVsdFNmaXhlZDY0Xy5FcXVhbHMob3RoZXIuZGVmYXVsdFNmaXhlZDY0XykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc0RlZmF1bHRGbG9hdCAhPSBvdGhlci5oYXNEZWZhdWx0RmxvYXQgfHwgKGhhc0RlZmF1bHRGbG9hdCAmJiAhZGVmYXVsdEZsb2F0Xy5FcXVhbHMob3RoZXIuZGVmYXVsdEZsb2F0XykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc0RlZmF1bHREb3VibGUgIT0gb3RoZXIuaGFzRGVmYXVsdERvdWJsZSB8fCAoaGFzRGVmYXVsdERvdWJsZSAmJiAhZGVmYXVsdERvdWJsZV8uRXF1YWxzKG90aGVyLmRlZmF1bHREb3VibGVfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzRGVmYXVsdEJvb2wgIT0gb3RoZXIuaGFzRGVmYXVsdEJvb2wgfHwgKGhhc0RlZmF1bHRCb29sICYmICFkZWZhdWx0Qm9vbF8uRXF1YWxzKG90aGVyLmRlZmF1bHRCb29sXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc0RlZmF1bHRTdHJpbmcgIT0gb3RoZXIuaGFzRGVmYXVsdFN0cmluZyB8fCAoaGFzRGVmYXVsdFN0cmluZyAmJiAhZGVmYXVsdFN0cmluZ18uRXF1YWxzKG90aGVyLmRlZmF1bHRTdHJpbmdfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzRGVmYXVsdEJ5dGVzICE9IG90aGVyLmhhc0RlZmF1bHRCeXRlcyB8fCAoaGFzRGVmYXVsdEJ5dGVzICYmICFkZWZhdWx0Qnl0ZXNfLkVxdWFscyhvdGhlci5kZWZhdWx0Qnl0ZXNfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzRGVmYXVsdE5lc3RlZEVudW0gIT0gb3RoZXIuaGFzRGVmYXVsdE5lc3RlZEVudW0gfHwgKGhhc0RlZmF1bHROZXN0ZWRFbnVtICYmICFkZWZhdWx0TmVzdGVkRW51bV8uRXF1YWxzKG90aGVyLmRlZmF1bHROZXN0ZWRFbnVtXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc0RlZmF1bHRGb3JlaWduRW51bSAhPSBvdGhlci5oYXNEZWZhdWx0Rm9yZWlnbkVudW0gfHwgKGhhc0RlZmF1bHRGb3JlaWduRW51bSAmJiAhZGVmYXVsdEZvcmVpZ25FbnVtXy5FcXVhbHMob3RoZXIuZGVmYXVsdEZvcmVpZ25FbnVtXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKGhhc0RlZmF1bHRJbXBvcnRFbnVtICE9IG90aGVyLmhhc0RlZmF1bHRJbXBvcnRFbnVtIHx8IChoYXNEZWZhdWx0SW1wb3J0RW51bSAmJiAhZGVmYXVsdEltcG9ydEVudW1fLkVxdWFscyhvdGhlci5kZWZhdWx0SW1wb3J0RW51bV8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNEZWZhdWx0U3RyaW5nUGllY2UgIT0gb3RoZXIuaGFzRGVmYXVsdFN0cmluZ1BpZWNlIHx8IChoYXNEZWZhdWx0U3RyaW5nUGllY2UgJiYgIWRlZmF1bHRTdHJpbmdQaWVjZV8uRXF1YWxzKG90aGVyLmRlZmF1bHRTdHJpbmdQaWVjZV8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNEZWZhdWx0Q29yZCAhPSBvdGhlci5oYXNEZWZhdWx0Q29yZCB8fCAoaGFzRGVmYXVsdENvcmQgJiYgIWRlZmF1bHRDb3JkXy5FcXVhbHMob3RoZXIuZGVmYXVsdENvcmRfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUHJpbnRUbyhnbG9iYWw6OlN5c3RlbS5JTy5UZXh0V3JpdGVyIHdyaXRlcikgew0KKyAgICAgIFByaW50RmllbGQoIm9wdGlvbmFsX2ludDMyIiwgaGFzT3B0aW9uYWxJbnQzMiwgb3B0aW9uYWxJbnQzMl8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgib3B0aW9uYWxfaW50NjQiLCBoYXNPcHRpb25hbEludDY0LCBvcHRpb25hbEludDY0Xywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJvcHRpb25hbF91aW50MzIiLCBoYXNPcHRpb25hbFVpbnQzMiwgb3B0aW9uYWxVaW50MzJfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoIm9wdGlvbmFsX3VpbnQ2NCIsIGhhc09wdGlvbmFsVWludDY0LCBvcHRpb25hbFVpbnQ2NF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgib3B0aW9uYWxfc2ludDMyIiwgaGFzT3B0aW9uYWxTaW50MzIsIG9wdGlvbmFsU2ludDMyXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJvcHRpb25hbF9zaW50NjQiLCBoYXNPcHRpb25hbFNpbnQ2NCwgb3B0aW9uYWxTaW50NjRfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoIm9wdGlvbmFsX2ZpeGVkMzIiLCBoYXNPcHRpb25hbEZpeGVkMzIsIG9wdGlvbmFsRml4ZWQzMl8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgib3B0aW9uYWxfZml4ZWQ2NCIsIGhhc09wdGlvbmFsRml4ZWQ2NCwgb3B0aW9uYWxGaXhlZDY0Xywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJvcHRpb25hbF9zZml4ZWQzMiIsIGhhc09wdGlvbmFsU2ZpeGVkMzIsIG9wdGlvbmFsU2ZpeGVkMzJfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoIm9wdGlvbmFsX3NmaXhlZDY0IiwgaGFzT3B0aW9uYWxTZml4ZWQ2NCwgb3B0aW9uYWxTZml4ZWQ2NF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgib3B0aW9uYWxfZmxvYXQiLCBoYXNPcHRpb25hbEZsb2F0LCBvcHRpb25hbEZsb2F0Xywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJvcHRpb25hbF9kb3VibGUiLCBoYXNPcHRpb25hbERvdWJsZSwgb3B0aW9uYWxEb3VibGVfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoIm9wdGlvbmFsX2Jvb2wiLCBoYXNPcHRpb25hbEJvb2wsIG9wdGlvbmFsQm9vbF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgib3B0aW9uYWxfc3RyaW5nIiwgaGFzT3B0aW9uYWxTdHJpbmcsIG9wdGlvbmFsU3RyaW5nXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJvcHRpb25hbF9ieXRlcyIsIGhhc09wdGlvbmFsQnl0ZXMsIG9wdGlvbmFsQnl0ZXNfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoIk9wdGlvbmFsR3JvdXAiLCBoYXNPcHRpb25hbEdyb3VwLCBvcHRpb25hbEdyb3VwXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIsIGhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSwgb3B0aW9uYWxOZXN0ZWRNZXNzYWdlXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiLCBoYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlLCBvcHRpb25hbEZvcmVpZ25NZXNzYWdlXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIsIGhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSwgb3B0aW9uYWxJbXBvcnRNZXNzYWdlXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIsIGhhc09wdGlvbmFsTmVzdGVkRW51bSwgb3B0aW9uYWxOZXN0ZWRFbnVtXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJvcHRpb25hbF9mb3JlaWduX2VudW0iLCBoYXNPcHRpb25hbEZvcmVpZ25FbnVtLCBvcHRpb25hbEZvcmVpZ25FbnVtXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJvcHRpb25hbF9pbXBvcnRfZW51bSIsIGhhc09wdGlvbmFsSW1wb3J0RW51bSwgb3B0aW9uYWxJbXBvcnRFbnVtXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiLCBoYXNPcHRpb25hbFN0cmluZ1BpZWNlLCBvcHRpb25hbFN0cmluZ1BpZWNlXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJvcHRpb25hbF9jb3JkIiwgaGFzT3B0aW9uYWxDb3JkLCBvcHRpb25hbENvcmRfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoInJlcGVhdGVkX2ludDMyIiwgcmVwZWF0ZWRJbnQzMl8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgicmVwZWF0ZWRfaW50NjQiLCByZXBlYXRlZEludDY0Xywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJyZXBlYXRlZF91aW50MzIiLCByZXBlYXRlZFVpbnQzMl8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgicmVwZWF0ZWRfdWludDY0IiwgcmVwZWF0ZWRVaW50NjRfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoInJlcGVhdGVkX3NpbnQzMiIsIHJlcGVhdGVkU2ludDMyXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJyZXBlYXRlZF9zaW50NjQiLCByZXBlYXRlZFNpbnQ2NF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgicmVwZWF0ZWRfZml4ZWQzMiIsIHJlcGVhdGVkRml4ZWQzMl8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgicmVwZWF0ZWRfZml4ZWQ2NCIsIHJlcGVhdGVkRml4ZWQ2NF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgicmVwZWF0ZWRfc2ZpeGVkMzIiLCByZXBlYXRlZFNmaXhlZDMyXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJyZXBlYXRlZF9zZml4ZWQ2NCIsIHJlcGVhdGVkU2ZpeGVkNjRfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoInJlcGVhdGVkX2Zsb2F0IiwgcmVwZWF0ZWRGbG9hdF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgicmVwZWF0ZWRfZG91YmxlIiwgcmVwZWF0ZWREb3VibGVfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoInJlcGVhdGVkX2Jvb2wiLCByZXBlYXRlZEJvb2xfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoInJlcGVhdGVkX3N0cmluZyIsIHJlcGVhdGVkU3RyaW5nXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJyZXBlYXRlZF9ieXRlcyIsIHJlcGVhdGVkQnl0ZXNfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoIlJlcGVhdGVkR3JvdXAiLCByZXBlYXRlZEdyb3VwXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIsIHJlcGVhdGVkTmVzdGVkTWVzc2FnZV8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIiwgcmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiLCByZXBlYXRlZEltcG9ydE1lc3NhZ2VfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoInJlcGVhdGVkX25lc3RlZF9lbnVtIiwgcmVwZWF0ZWROZXN0ZWRFbnVtXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iLCByZXBlYXRlZEZvcmVpZ25FbnVtXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIsIHJlcGVhdGVkSW1wb3J0RW51bV8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiwgcmVwZWF0ZWRTdHJpbmdQaWVjZV8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgicmVwZWF0ZWRfY29yZCIsIHJlcGVhdGVkQ29yZF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgiZGVmYXVsdF9pbnQzMiIsIGhhc0RlZmF1bHRJbnQzMiwgZGVmYXVsdEludDMyXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJkZWZhdWx0X2ludDY0IiwgaGFzRGVmYXVsdEludDY0LCBkZWZhdWx0SW50NjRfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoImRlZmF1bHRfdWludDMyIiwgaGFzRGVmYXVsdFVpbnQzMiwgZGVmYXVsdFVpbnQzMl8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgiZGVmYXVsdF91aW50NjQiLCBoYXNEZWZhdWx0VWludDY0LCBkZWZhdWx0VWludDY0Xywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJkZWZhdWx0X3NpbnQzMiIsIGhhc0RlZmF1bHRTaW50MzIsIGRlZmF1bHRTaW50MzJfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoImRlZmF1bHRfc2ludDY0IiwgaGFzRGVmYXVsdFNpbnQ2NCwgZGVmYXVsdFNpbnQ2NF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgiZGVmYXVsdF9maXhlZDMyIiwgaGFzRGVmYXVsdEZpeGVkMzIsIGRlZmF1bHRGaXhlZDMyXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJkZWZhdWx0X2ZpeGVkNjQiLCBoYXNEZWZhdWx0Rml4ZWQ2NCwgZGVmYXVsdEZpeGVkNjRfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoImRlZmF1bHRfc2ZpeGVkMzIiLCBoYXNEZWZhdWx0U2ZpeGVkMzIsIGRlZmF1bHRTZml4ZWQzMl8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgiZGVmYXVsdF9zZml4ZWQ2NCIsIGhhc0RlZmF1bHRTZml4ZWQ2NCwgZGVmYXVsdFNmaXhlZDY0Xywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJkZWZhdWx0X2Zsb2F0IiwgaGFzRGVmYXVsdEZsb2F0LCBkZWZhdWx0RmxvYXRfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoImRlZmF1bHRfZG91YmxlIiwgaGFzRGVmYXVsdERvdWJsZSwgZGVmYXVsdERvdWJsZV8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgiZGVmYXVsdF9ib29sIiwgaGFzRGVmYXVsdEJvb2wsIGRlZmF1bHRCb29sXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJkZWZhdWx0X3N0cmluZyIsIGhhc0RlZmF1bHRTdHJpbmcsIGRlZmF1bHRTdHJpbmdfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoImRlZmF1bHRfYnl0ZXMiLCBoYXNEZWZhdWx0Qnl0ZXMsIGRlZmF1bHRCeXRlc18sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgiZGVmYXVsdF9uZXN0ZWRfZW51bSIsIGhhc0RlZmF1bHROZXN0ZWRFbnVtLCBkZWZhdWx0TmVzdGVkRW51bV8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgiZGVmYXVsdF9mb3JlaWduX2VudW0iLCBoYXNEZWZhdWx0Rm9yZWlnbkVudW0sIGRlZmF1bHRGb3JlaWduRW51bV8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgiZGVmYXVsdF9pbXBvcnRfZW51bSIsIGhhc0RlZmF1bHRJbXBvcnRFbnVtLCBkZWZhdWx0SW1wb3J0RW51bV8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgiZGVmYXVsdF9zdHJpbmdfcGllY2UiLCBoYXNEZWZhdWx0U3RyaW5nUGllY2UsIGRlZmF1bHRTdHJpbmdQaWVjZV8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgiZGVmYXVsdF9jb3JkIiwgaGFzRGVmYXVsdENvcmQsIGRlZmF1bHRDb3JkXywgd3JpdGVyKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlc0xpdGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzTGl0ZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXNMaXRlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXNMaXRlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXNMaXRlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlc0xpdGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzTGl0ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXNMaXRlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlc0xpdGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzTGl0ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0QWxsVHlwZXNMaXRlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXBlYXRlZEludDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEludDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZFVpbnQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRVaW50NjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU2ludDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZFNpbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRGaXhlZDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEZpeGVkNjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU2ZpeGVkMzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU2ZpeGVkNjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkRmxvYXRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkRG91YmxlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEJvb2xfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU3RyaW5nXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEJ5dGVzXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEdyb3VwXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWROZXN0ZWRFbnVtXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEZvcmVpZ25FbnVtXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEltcG9ydEVudW1fLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU3RyaW5nUGllY2VfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkQ29yZF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0QWxsVHlwZXNMaXRlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyTGl0ZTxUZXN0QWxsVHlwZXNMaXRlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0QWxsVHlwZXNMaXRlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdEFsbFR5cGVzTGl0ZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0QWxsVHlwZXNMaXRlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RBbGxUeXBlc0xpdGUoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RBbGxUeXBlc0xpdGUgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0QWxsVHlwZXNMaXRlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0QWxsVHlwZXNMaXRlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2VMaXRlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdEFsbFR5cGVzTGl0ZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0QWxsVHlwZXNMaXRlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdEFsbFR5cGVzTGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxJbnQzMikgew0KKyAgICAgICAgICBPcHRpb25hbEludDMyID0gb3RoZXIuT3B0aW9uYWxJbnQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEludDY0KSB7DQorICAgICAgICAgIE9wdGlvbmFsSW50NjQgPSBvdGhlci5PcHRpb25hbEludDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsVWludDMyKSB7DQorICAgICAgICAgIE9wdGlvbmFsVWludDMyID0gb3RoZXIuT3B0aW9uYWxVaW50MzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxVaW50NjQpIHsNCisgICAgICAgICAgT3B0aW9uYWxVaW50NjQgPSBvdGhlci5PcHRpb25hbFVpbnQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbFNpbnQzMikgew0KKyAgICAgICAgICBPcHRpb25hbFNpbnQzMiA9IG90aGVyLk9wdGlvbmFsU2ludDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsU2ludDY0KSB7DQorICAgICAgICAgIE9wdGlvbmFsU2ludDY0ID0gb3RoZXIuT3B0aW9uYWxTaW50NjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxGaXhlZDMyKSB7DQorICAgICAgICAgIE9wdGlvbmFsRml4ZWQzMiA9IG90aGVyLk9wdGlvbmFsRml4ZWQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEZpeGVkNjQpIHsNCisgICAgICAgICAgT3B0aW9uYWxGaXhlZDY0ID0gb3RoZXIuT3B0aW9uYWxGaXhlZDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsU2ZpeGVkMzIpIHsNCisgICAgICAgICAgT3B0aW9uYWxTZml4ZWQzMiA9IG90aGVyLk9wdGlvbmFsU2ZpeGVkMzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxTZml4ZWQ2NCkgew0KKyAgICAgICAgICBPcHRpb25hbFNmaXhlZDY0ID0gb3RoZXIuT3B0aW9uYWxTZml4ZWQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEZsb2F0KSB7DQorICAgICAgICAgIE9wdGlvbmFsRmxvYXQgPSBvdGhlci5PcHRpb25hbEZsb2F0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsRG91YmxlKSB7DQorICAgICAgICAgIE9wdGlvbmFsRG91YmxlID0gb3RoZXIuT3B0aW9uYWxEb3VibGU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxCb29sKSB7DQorICAgICAgICAgIE9wdGlvbmFsQm9vbCA9IG90aGVyLk9wdGlvbmFsQm9vbDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbFN0cmluZykgew0KKyAgICAgICAgICBPcHRpb25hbFN0cmluZyA9IG90aGVyLk9wdGlvbmFsU3RyaW5nOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsQnl0ZXMpIHsNCisgICAgICAgICAgT3B0aW9uYWxCeXRlcyA9IG90aGVyLk9wdGlvbmFsQnl0ZXM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxHcm91cCkgew0KKyAgICAgICAgICBNZXJnZU9wdGlvbmFsR3JvdXAob3RoZXIuT3B0aW9uYWxHcm91cCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKSB7DQorICAgICAgICAgIE1lcmdlT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKG90aGVyLk9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSkgew0KKyAgICAgICAgICBNZXJnZU9wdGlvbmFsRm9yZWlnbk1lc3NhZ2Uob3RoZXIuT3B0aW9uYWxGb3JlaWduTWVzc2FnZSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlKSB7DQorICAgICAgICAgIE1lcmdlT3B0aW9uYWxJbXBvcnRNZXNzYWdlKG90aGVyLk9wdGlvbmFsSW1wb3J0TWVzc2FnZSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxOZXN0ZWRFbnVtKSB7DQorICAgICAgICAgIE9wdGlvbmFsTmVzdGVkRW51bSA9IG90aGVyLk9wdGlvbmFsTmVzdGVkRW51bTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEZvcmVpZ25FbnVtKSB7DQorICAgICAgICAgIE9wdGlvbmFsRm9yZWlnbkVudW0gPSBvdGhlci5PcHRpb25hbEZvcmVpZ25FbnVtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsSW1wb3J0RW51bSkgew0KKyAgICAgICAgICBPcHRpb25hbEltcG9ydEVudW0gPSBvdGhlci5PcHRpb25hbEltcG9ydEVudW07DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxTdHJpbmdQaWVjZSkgew0KKyAgICAgICAgICBPcHRpb25hbFN0cmluZ1BpZWNlID0gb3RoZXIuT3B0aW9uYWxTdHJpbmdQaWVjZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbENvcmQpIHsNCisgICAgICAgICAgT3B0aW9uYWxDb3JkID0gb3RoZXIuT3B0aW9uYWxDb3JkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkSW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50MzJfLkFkZChvdGhlci5yZXBlYXRlZEludDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRJbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQ2NF8uQWRkKG90aGVyLnJlcGVhdGVkSW50NjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFVpbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50MzJfLkFkZChvdGhlci5yZXBlYXRlZFVpbnQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkVWludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQ2NF8uQWRkKG90aGVyLnJlcGVhdGVkVWludDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRTaW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDMyXy5BZGQob3RoZXIucmVwZWF0ZWRTaW50MzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFNpbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRTaW50NjRfLkFkZChvdGhlci5yZXBlYXRlZFNpbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkRml4ZWQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXy5BZGQob3RoZXIucmVwZWF0ZWRGaXhlZDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRGaXhlZDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkNjRfLkFkZChvdGhlci5yZXBlYXRlZEZpeGVkNjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFNmaXhlZDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNmaXhlZDMyXy5BZGQob3RoZXIucmVwZWF0ZWRTZml4ZWQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkU2ZpeGVkNjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkNjRfLkFkZChvdGhlci5yZXBlYXRlZFNmaXhlZDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRGbG9hdF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRGbG9hdF8uQWRkKG90aGVyLnJlcGVhdGVkRmxvYXRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZERvdWJsZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWREb3VibGVfLkFkZChvdGhlci5yZXBlYXRlZERvdWJsZV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkQm9vbF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRCb29sXy5BZGQob3RoZXIucmVwZWF0ZWRCb29sXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRTdHJpbmdfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nXy5BZGQob3RoZXIucmVwZWF0ZWRTdHJpbmdfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEJ5dGVzXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJ5dGVzXy5BZGQob3RoZXIucmVwZWF0ZWRCeXRlc18pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkR3JvdXBfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkR3JvdXBfLkFkZChvdGhlci5yZXBlYXRlZEdyb3VwXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfLkFkZChvdGhlci5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5BZGQob3RoZXIucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5BZGQob3RoZXIucmVwZWF0ZWRJbXBvcnRNZXNzYWdlXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWROZXN0ZWRFbnVtXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZE5lc3RlZEVudW1fLkFkZChvdGhlci5yZXBlYXRlZE5lc3RlZEVudW1fKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEZvcmVpZ25FbnVtXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25FbnVtXy5BZGQob3RoZXIucmVwZWF0ZWRGb3JlaWduRW51bV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkSW1wb3J0RW51bV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRFbnVtXy5BZGQob3RoZXIucmVwZWF0ZWRJbXBvcnRFbnVtXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRTdHJpbmdQaWVjZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdQaWVjZV8uQWRkKG90aGVyLnJlcGVhdGVkU3RyaW5nUGllY2VfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZENvcmRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkQ29yZF8uQWRkKG90aGVyLnJlcGVhdGVkQ29yZF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRJbnQzMikgew0KKyAgICAgICAgICBEZWZhdWx0SW50MzIgPSBvdGhlci5EZWZhdWx0SW50MzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdEludDY0KSB7DQorICAgICAgICAgIERlZmF1bHRJbnQ2NCA9IG90aGVyLkRlZmF1bHRJbnQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0VWludDMyKSB7DQorICAgICAgICAgIERlZmF1bHRVaW50MzIgPSBvdGhlci5EZWZhdWx0VWludDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRVaW50NjQpIHsNCisgICAgICAgICAgRGVmYXVsdFVpbnQ2NCA9IG90aGVyLkRlZmF1bHRVaW50NjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdFNpbnQzMikgew0KKyAgICAgICAgICBEZWZhdWx0U2ludDMyID0gb3RoZXIuRGVmYXVsdFNpbnQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0U2ludDY0KSB7DQorICAgICAgICAgIERlZmF1bHRTaW50NjQgPSBvdGhlci5EZWZhdWx0U2ludDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRGaXhlZDMyKSB7DQorICAgICAgICAgIERlZmF1bHRGaXhlZDMyID0gb3RoZXIuRGVmYXVsdEZpeGVkMzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdEZpeGVkNjQpIHsNCisgICAgICAgICAgRGVmYXVsdEZpeGVkNjQgPSBvdGhlci5EZWZhdWx0Rml4ZWQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0U2ZpeGVkMzIpIHsNCisgICAgICAgICAgRGVmYXVsdFNmaXhlZDMyID0gb3RoZXIuRGVmYXVsdFNmaXhlZDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRTZml4ZWQ2NCkgew0KKyAgICAgICAgICBEZWZhdWx0U2ZpeGVkNjQgPSBvdGhlci5EZWZhdWx0U2ZpeGVkNjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdEZsb2F0KSB7DQorICAgICAgICAgIERlZmF1bHRGbG9hdCA9IG90aGVyLkRlZmF1bHRGbG9hdDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0RG91YmxlKSB7DQorICAgICAgICAgIERlZmF1bHREb3VibGUgPSBvdGhlci5EZWZhdWx0RG91YmxlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRCb29sKSB7DQorICAgICAgICAgIERlZmF1bHRCb29sID0gb3RoZXIuRGVmYXVsdEJvb2w7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdFN0cmluZykgew0KKyAgICAgICAgICBEZWZhdWx0U3RyaW5nID0gb3RoZXIuRGVmYXVsdFN0cmluZzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0Qnl0ZXMpIHsNCisgICAgICAgICAgRGVmYXVsdEJ5dGVzID0gb3RoZXIuRGVmYXVsdEJ5dGVzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHROZXN0ZWRFbnVtKSB7DQorICAgICAgICAgIERlZmF1bHROZXN0ZWRFbnVtID0gb3RoZXIuRGVmYXVsdE5lc3RlZEVudW07DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdEZvcmVpZ25FbnVtKSB7DQorICAgICAgICAgIERlZmF1bHRGb3JlaWduRW51bSA9IG90aGVyLkRlZmF1bHRGb3JlaWduRW51bTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0SW1wb3J0RW51bSkgew0KKyAgICAgICAgICBEZWZhdWx0SW1wb3J0RW51bSA9IG90aGVyLkRlZmF1bHRJbXBvcnRFbnVtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRTdHJpbmdQaWVjZSkgew0KKyAgICAgICAgICBEZWZhdWx0U3RyaW5nUGllY2UgPSBvdGhlci5EZWZhdWx0U3RyaW5nUGllY2U7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdENvcmQpIHsNCisgICAgICAgICAgRGVmYXVsdENvcmQgPSBvdGhlci5EZWZhdWx0Q29yZDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0QWxsVHlwZXNMaXRlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RBbGxUeXBlc0xpdGVGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW50MzIgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5vcHRpb25hbEludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW50NjQgPSBpbnB1dC5SZWFkSW50NjQocmVmIHJlc3VsdC5vcHRpb25hbEludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsVWludDMyID0gaW5wdXQuUmVhZFVJbnQzMihyZWYgcmVzdWx0Lm9wdGlvbmFsVWludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsVWludDY0ID0gaW5wdXQuUmVhZFVJbnQ2NChyZWYgcmVzdWx0Lm9wdGlvbmFsVWludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU2ludDMyID0gaW5wdXQuUmVhZFNJbnQzMihyZWYgcmVzdWx0Lm9wdGlvbmFsU2ludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU2ludDY0ID0gaW5wdXQuUmVhZFNJbnQ2NChyZWYgcmVzdWx0Lm9wdGlvbmFsU2ludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2MTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRml4ZWQzMiA9IGlucHV0LlJlYWRGaXhlZDMyKHJlZiByZXN1bHQub3B0aW9uYWxGaXhlZDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2NTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRml4ZWQ2NCA9IGlucHV0LlJlYWRGaXhlZDY0KHJlZiByZXN1bHQub3B0aW9uYWxGaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3Nzogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU2ZpeGVkMzIgPSBpbnB1dC5SZWFkU0ZpeGVkMzIocmVmIHJlc3VsdC5vcHRpb25hbFNmaXhlZDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4MTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU2ZpeGVkNjQgPSBpbnB1dC5SZWFkU0ZpeGVkNjQocmVmIHJlc3VsdC5vcHRpb25hbFNmaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA5Mzogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5vcHRpb25hbEZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA5Nzogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRG91YmxlID0gaW5wdXQuUmVhZERvdWJsZShyZWYgcmVzdWx0Lm9wdGlvbmFsRG91YmxlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEJvb2wgPSBpbnB1dC5SZWFkQm9vbChyZWYgcmVzdWx0Lm9wdGlvbmFsQm9vbF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTE0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTdHJpbmcgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQub3B0aW9uYWxTdHJpbmdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEyMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsQnl0ZXMgPSBpbnB1dC5SZWFkQnl0ZXMocmVmIHJlc3VsdC5vcHRpb25hbEJ5dGVzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMzE6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuT3B0aW9uYWxHcm91cC5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk9wdGlvbmFsR3JvdXAuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbEdyb3VwKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKE9wdGlvbmFsR3JvdXApOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEdyb3VwKDE2LCBzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBPcHRpb25hbEdyb3VwID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE0Njogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkTWVzc2FnZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShPcHRpb25hbE5lc3RlZE1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE1NDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2VMaXRlLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlTGl0ZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oT3B0aW9uYWxGb3JlaWduTWVzc2FnZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBPcHRpb25hbEZvcmVpZ25NZXNzYWdlID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2Mjogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oT3B0aW9uYWxJbXBvcnRNZXNzYWdlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIE9wdGlvbmFsSW1wb3J0TWVzc2FnZSA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjg6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5vcHRpb25hbE5lc3RlZEVudW1fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkRW51bSA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE3Njogew0KKyAgICAgICAgICAgICAgb2JqZWN0IHVua25vd247DQorICAgICAgICAgICAgICBpZihpbnB1dC5SZWFkRW51bShyZWYgcmVzdWx0Lm9wdGlvbmFsRm9yZWlnbkVudW1fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRm9yZWlnbkVudW0gPSB0cnVlOw0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmKHVua25vd24gaXMgaW50KSB7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODQ6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5vcHRpb25hbEltcG9ydEVudW1fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW1wb3J0RW51bSA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE5NDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nUGllY2UgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQub3B0aW9uYWxTdHJpbmdQaWVjZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjAyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxDb3JkID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0Lm9wdGlvbmFsQ29yZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjUwOg0KKyAgICAgICAgICAgIGNhc2UgMjQ4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNTg6DQorICAgICAgICAgICAgY2FzZSAyNTY6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRJbnQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkSW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI2NjoNCisgICAgICAgICAgICBjYXNlIDI2NDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFVJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkVWludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNzQ6DQorICAgICAgICAgICAgY2FzZSAyNzI6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRVSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZFVpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjgyOg0KKyAgICAgICAgICAgIGNhc2UgMjgwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTaW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI5MDoNCisgICAgICAgICAgICBjYXNlIDI4ODogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNJbnQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkU2ludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyOTg6DQorICAgICAgICAgICAgY2FzZSAzMDE6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzMDY6DQorICAgICAgICAgICAgY2FzZSAzMDU6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzMTQ6DQorICAgICAgICAgICAgY2FzZSAzMTc6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTRml4ZWQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkMzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMyMjoNCisgICAgICAgICAgICBjYXNlIDMyMTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNGaXhlZDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTZml4ZWQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzMwOg0KKyAgICAgICAgICAgIGNhc2UgMzMzOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRmxvYXRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzMzg6DQorICAgICAgICAgICAgY2FzZSAzMzc6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWREb3VibGVBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZERvdWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzQ2Og0KKyAgICAgICAgICAgIGNhc2UgMzQ0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkQm9vbEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkQm9vbF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzU0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU3RyaW5nQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTdHJpbmdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM2Mjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEJ5dGVzQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRCeXRlc18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzcxOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkR3JvdXBBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEdyb3VwXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5SZXBlYXRlZEdyb3VwLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzg2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkTmVzdGVkTWVzc2FnZV8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM5NDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2VBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2VMaXRlLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDAyOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkSW1wb3J0TWVzc2FnZV8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2VMaXRlLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDEwOg0KKyAgICAgICAgICAgIGNhc2UgNDA4OiB7DQorICAgICAgICAgICAgICBzY2c6OklDb2xsZWN0aW9uPG9iamVjdD4gdW5rbm93bkl0ZW1zOw0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEVudW1BcnJheTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0+KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkTmVzdGVkRW51bV8sIG91dCB1bmtub3duSXRlbXMpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDE4Og0KKyAgICAgICAgICAgIGNhc2UgNDE2OiB7DQorICAgICAgICAgICAgICBzY2c6OklDb2xsZWN0aW9uPG9iamVjdD4gdW5rbm93bkl0ZW1zOw0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEVudW1BcnJheTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bUxpdGU+KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbkVudW1fLCBvdXQgdW5rbm93bkl0ZW1zKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQyNjoNCisgICAgICAgICAgICBjYXNlIDQyNDogew0KKyAgICAgICAgICAgICAgc2NnOjpJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd25JdGVtczsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXk8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGU+KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkSW1wb3J0RW51bV8sIG91dCB1bmtub3duSXRlbXMpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDM0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU3RyaW5nQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTdHJpbmdQaWVjZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDQyOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU3RyaW5nQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRDb3JkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0ODg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0SW50MzIgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kZWZhdWx0SW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQ5Njogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRJbnQ2NCA9IGlucHV0LlJlYWRJbnQ2NChyZWYgcmVzdWx0LmRlZmF1bHRJbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTA0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFVpbnQzMiA9IGlucHV0LlJlYWRVSW50MzIocmVmIHJlc3VsdC5kZWZhdWx0VWludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1MTI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0VWludDY0ID0gaW5wdXQuUmVhZFVJbnQ2NChyZWYgcmVzdWx0LmRlZmF1bHRVaW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDUyMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTaW50MzIgPSBpbnB1dC5SZWFkU0ludDMyKHJlZiByZXN1bHQuZGVmYXVsdFNpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTI4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNpbnQ2NCA9IGlucHV0LlJlYWRTSW50NjQocmVmIHJlc3VsdC5kZWZhdWx0U2ludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1NDE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Rml4ZWQzMiA9IGlucHV0LlJlYWRGaXhlZDMyKHJlZiByZXN1bHQuZGVmYXVsdEZpeGVkMzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU0NTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGaXhlZDY0ID0gaW5wdXQuUmVhZEZpeGVkNjQocmVmIHJlc3VsdC5kZWZhdWx0Rml4ZWQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTU3OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNmaXhlZDMyID0gaW5wdXQuUmVhZFNGaXhlZDMyKHJlZiByZXN1bHQuZGVmYXVsdFNmaXhlZDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1NjE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ZpeGVkNjQgPSBpbnB1dC5SZWFkU0ZpeGVkNjQocmVmIHJlc3VsdC5kZWZhdWx0U2ZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU3Mzogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0LmRlZmF1bHRGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTc3OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdERvdWJsZSA9IGlucHV0LlJlYWREb3VibGUocmVmIHJlc3VsdC5kZWZhdWx0RG91YmxlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1ODQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Qm9vbCA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQuZGVmYXVsdEJvb2xfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU5NDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTdHJpbmcgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZGVmYXVsdFN0cmluZ18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjAyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEJ5dGVzID0gaW5wdXQuUmVhZEJ5dGVzKHJlZiByZXN1bHQuZGVmYXVsdEJ5dGVzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2NDg6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5kZWZhdWx0TmVzdGVkRW51bV8sIG91dCB1bmtub3duKSkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdE5lc3RlZEVudW0gPSB0cnVlOw0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmKHVua25vd24gaXMgaW50KSB7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2NTY6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5kZWZhdWx0Rm9yZWlnbkVudW1fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGb3JlaWduRW51bSA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY2NDogew0KKyAgICAgICAgICAgICAgb2JqZWN0IHVua25vd247DQorICAgICAgICAgICAgICBpZihpbnB1dC5SZWFkRW51bShyZWYgcmVzdWx0LmRlZmF1bHRJbXBvcnRFbnVtXywgb3V0IHVua25vd24pKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0SW1wb3J0RW51bSA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY3NDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTdHJpbmdQaWVjZSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5kZWZhdWx0U3RyaW5nUGllY2VfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY4Mjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRDb3JkID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmRlZmF1bHRDb3JkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgT3B0aW9uYWxJbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsSW50MzI7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsSW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW50MzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEludDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbnQzMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEludDY0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIE9wdGlvbmFsSW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEludDY0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEludDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbnQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbnQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsSW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW50NjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEludDY0XyA9IDBMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsVWludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxVaW50MzI7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgT3B0aW9uYWxVaW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbFVpbnQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxVaW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsVWludDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxVaW50MzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsVWludDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxVaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsVWludDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxVaW50MzJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFVpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsVWludDY0OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBPcHRpb25hbFVpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsVWludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbFVpbnQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxVaW50NjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxVaW50NjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsVWludDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxVaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsVWludDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxVaW50NjRfID0gMFVMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU2ludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxTaW50MzI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBPcHRpb25hbFNpbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsU2ludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbFNpbnQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxTaW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU2ludDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFNpbnQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsU2ludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNpbnQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsU2ludDMyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTaW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbFNpbnQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBPcHRpb25hbFNpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsU2ludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbFNpbnQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxTaW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNpbnQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTaW50NjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbFNpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTaW50NjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFNpbnQ2NF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRml4ZWQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsRml4ZWQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBPcHRpb25hbEZpeGVkMzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEZpeGVkMzI7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsRml4ZWQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxGaXhlZDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGaXhlZDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZpeGVkMzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRml4ZWQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRml4ZWQzMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsRml4ZWQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgT3B0aW9uYWxGaXhlZDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxGaXhlZDY0OyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEZpeGVkNjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsRml4ZWQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZpeGVkNjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRml4ZWQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsRml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGaXhlZDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxGaXhlZDY0XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTZml4ZWQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsU2ZpeGVkMzI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBPcHRpb25hbFNmaXhlZDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxTZml4ZWQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxTZml4ZWQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxTZml4ZWQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTZml4ZWQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTZml4ZWQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsU2ZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU2ZpeGVkMzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFNmaXhlZDMyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTZml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsU2ZpeGVkNjQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgT3B0aW9uYWxTZml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsU2ZpeGVkNjQ7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsU2ZpeGVkNjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsU2ZpeGVkNjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNmaXhlZDY0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFNmaXhlZDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxTZml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTZml4ZWQ2NCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsU2ZpeGVkNjRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxGbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgT3B0aW9uYWxGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsRmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsRmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsRmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxGbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZsb2F0XyA9IDBGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRG91YmxlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxEb3VibGU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGRvdWJsZSBPcHRpb25hbERvdWJsZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsRG91YmxlOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbERvdWJsZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxEb3VibGUoZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRG91YmxlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbERvdWJsZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsRG91YmxlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbERvdWJsZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRG91YmxlXyA9IDBEOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsQm9vbCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsQm9vbDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBPcHRpb25hbEJvb2wgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEJvb2w7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsQm9vbCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxCb29sKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxCb29sID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEJvb2xfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEJvb2woKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsQm9vbCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsQm9vbF8gPSBmYWxzZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFN0cmluZyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgT3B0aW9uYWxTdHJpbmcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbFN0cmluZzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxTdHJpbmcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsU3RyaW5nKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTdHJpbmcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsU3RyaW5nXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxTdHJpbmcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTdHJpbmdfID0gIiI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxCeXRlcyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsQnl0ZXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIE9wdGlvbmFsQnl0ZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEJ5dGVzOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEJ5dGVzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEJ5dGVzKHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEJ5dGVzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEJ5dGVzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxCeXRlcygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxCeXRlcyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsQnl0ZXNfID0gcGI6OkJ5dGVTdHJpbmcuRW1wdHk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxHcm91cCB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxHcm91cDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5PcHRpb25hbEdyb3VwIE9wdGlvbmFsR3JvdXAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEdyb3VwOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEdyb3VwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEdyb3VwKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuT3B0aW9uYWxHcm91cCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxHcm91cCA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxHcm91cF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEdyb3VwKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuT3B0aW9uYWxHcm91cC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEdyb3VwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEdyb3VwXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlT3B0aW9uYWxHcm91cChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk9wdGlvbmFsR3JvdXAgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbEdyb3VwICYmDQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsR3JvdXBfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuT3B0aW9uYWxHcm91cC5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxHcm91cF8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk9wdGlvbmFsR3JvdXAuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxHcm91cF8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQub3B0aW9uYWxHcm91cF8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEdyb3VwID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsR3JvdXAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsR3JvdXAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEdyb3VwXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkTWVzc2FnZSBPcHRpb25hbE5lc3RlZE1lc3NhZ2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbE5lc3RlZE1lc3NhZ2U7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbmFsTmVzdGVkTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UgJiYNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsTmVzdGVkTWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2VMaXRlIE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEZvcmVpZ25NZXNzYWdlOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlTGl0ZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlTGl0ZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZvcmVpZ25NZXNzYWdlXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlT3B0aW9uYWxGb3JlaWduTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZUxpdGUgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlICYmDQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlTGl0ZS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZUxpdGUuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxGb3JlaWduTWVzc2FnZV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQub3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZvcmVpZ25NZXNzYWdlXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2VMaXRlIE9wdGlvbmFsSW1wb3J0TWVzc2FnZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsSW1wb3J0TWVzc2FnZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxJbXBvcnRNZXNzYWdlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEltcG9ydE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbXBvcnRNZXNzYWdlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsSW1wb3J0TWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlTGl0ZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW1wb3J0TWVzc2FnZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbmFsSW1wb3J0TWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlTGl0ZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbEltcG9ydE1lc3NhZ2VfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2VMaXRlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbEltcG9ydE1lc3NhZ2VfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUuQ3JlYXRlQnVpbGRlcihyZXN1bHQub3B0aW9uYWxJbXBvcnRNZXNzYWdlXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5vcHRpb25hbEltcG9ydE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsSW1wb3J0TWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbXBvcnRNZXNzYWdlXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxOZXN0ZWRFbnVtIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZEVudW07IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bSBPcHRpb25hbE5lc3RlZEVudW0gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbE5lc3RlZEVudW07IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsTmVzdGVkRW51bSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxOZXN0ZWRFbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZEVudW0gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkRW51bV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsTmVzdGVkRW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRFbnVtID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bS5GT087DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGb3JlaWduRW51bSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxGb3JlaWduRW51bTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlIE9wdGlvbmFsRm9yZWlnbkVudW0gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEZvcmVpZ25FbnVtOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEZvcmVpZ25FbnVtKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEZvcmVpZ25FbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtTGl0ZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25FbnVtID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZvcmVpZ25FbnVtXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxGb3JlaWduRW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGb3JlaWduRW51bSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRm9yZWlnbkVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9GT087DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxJbXBvcnRFbnVtIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEltcG9ydEVudW07IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW1MaXRlIE9wdGlvbmFsSW1wb3J0RW51bSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsSW1wb3J0RW51bTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxJbXBvcnRFbnVtKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEltcG9ydEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRFbnVtID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEltcG9ydEVudW1fID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEltcG9ydEVudW0oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW1wb3J0RW51bSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW1wb3J0RW51bV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9GT087DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTdHJpbmdQaWVjZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nUGllY2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBPcHRpb25hbFN0cmluZ1BpZWNlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxTdHJpbmdQaWVjZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxTdHJpbmdQaWVjZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxTdHJpbmdQaWVjZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nUGllY2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsU3RyaW5nUGllY2VfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbFN0cmluZ1BpZWNlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFN0cmluZ1BpZWNlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTdHJpbmdQaWVjZV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbENvcmQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbENvcmQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBPcHRpb25hbENvcmQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbENvcmQ7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsQ29yZCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxDb3JkKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxDb3JkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbENvcmRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbENvcmQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsQ29yZCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsQ29yZF8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gUmVwZWF0ZWRJbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRJbnQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEludDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXRSZXBlYXRlZEludDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEludDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRJbnQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRJbnQzMihzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRJbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGxvbmc+IFJlcGVhdGVkSW50NjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkSW50NjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRJbnQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRJbnQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEdldFJlcGVhdGVkSW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkSW50NjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEludDY0KGludCBpbmRleCwgbG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEludDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkSW50NjQoc2NnOjpJRW51bWVyYWJsZTxsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWludD4gUmVwZWF0ZWRVaW50MzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkVWludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkVWludDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFVpbnQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1aW50IEdldFJlcGVhdGVkVWludDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZFVpbnQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkVWludDMyKGludCBpbmRleCwgdWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRVaW50MzIodWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkVWludDMyKHNjZzo6SUVudW1lcmFibGU8dWludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkVWludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVsb25nPiBSZXBlYXRlZFVpbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRVaW50NjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRVaW50NjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkVWludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEdldFJlcGVhdGVkVWludDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZFVpbnQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkVWludDY0KGludCBpbmRleCwgdWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50NjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkVWludDY0KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRVaW50NjQoc2NnOjpJRW51bWVyYWJsZTx1bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkVWludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gUmVwZWF0ZWRTaW50MzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkU2ludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ludDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFNpbnQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0UmVwZWF0ZWRTaW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkU2ludDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRTaW50MzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTaW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkU2ludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkU2ludDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTaW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRTaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gUmVwZWF0ZWRTaW50NjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkU2ludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFNpbnQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEdldFJlcGVhdGVkU2ludDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZFNpbnQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkU2ludDY0KGludCBpbmRleCwgbG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRTaW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkU2ludDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkU2ludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVpbnQ+IFJlcGVhdGVkRml4ZWQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRGaXhlZDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRml4ZWQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRGaXhlZDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgR2V0UmVwZWF0ZWRGaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEZpeGVkMzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEZpeGVkMzIoaW50IGluZGV4LCB1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRGaXhlZDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRGaXhlZDMyKHNjZzo6SUVudW1lcmFibGU8dWludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVsb25nPiBSZXBlYXRlZEZpeGVkNjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkRml4ZWQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEZpeGVkNjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkRml4ZWQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBHZXRSZXBlYXRlZEZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRml4ZWQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkRml4ZWQ2NChpbnQgaW5kZXgsIHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRGaXhlZDY0KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkRml4ZWQ2NChzY2c6OklFbnVtZXJhYmxlPHVsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBSZXBlYXRlZFNmaXhlZDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFNmaXhlZDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ZpeGVkMzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkU2ZpeGVkMzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkU2ZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkU2ZpeGVkMzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZFNmaXhlZDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkMzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkU2ZpeGVkMzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkMzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZFNmaXhlZDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTZml4ZWQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZFNmaXhlZDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNmaXhlZDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gUmVwZWF0ZWRTZml4ZWQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRTZml4ZWQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZFNmaXhlZDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFNmaXhlZDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRTZml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRTZml4ZWQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkU2ZpeGVkNjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkNjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkU2ZpeGVkNjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNmaXhlZDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRTZml4ZWQ2NChzY2c6OklFbnVtZXJhYmxlPGxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNmaXhlZDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkU2ZpeGVkNjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkNjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxmbG9hdD4gUmVwZWF0ZWRGbG9hdExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRGbG9hdF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEZsb2F0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEZsb2F0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEdldFJlcGVhdGVkRmxvYXQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRmxvYXQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEZsb2F0KGludCBpbmRleCwgZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGbG9hdF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRGbG9hdChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRGbG9hdChzY2c6OklFbnVtZXJhYmxlPGZsb2F0PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGbG9hdF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8ZG91YmxlPiBSZXBlYXRlZERvdWJsZUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWREb3VibGVfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWREb3VibGVDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkRG91YmxlQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGRvdWJsZSBHZXRSZXBlYXRlZERvdWJsZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWREb3VibGUoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZERvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZERvdWJsZV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWREb3VibGUoZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRG91YmxlXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWREb3VibGUoc2NnOjpJRW51bWVyYWJsZTxkb3VibGU+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZERvdWJsZV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZERvdWJsZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWREb3VibGVfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxib29sPiBSZXBlYXRlZEJvb2xMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkQm9vbF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEJvb2xDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkQm9vbENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEdldFJlcGVhdGVkQm9vbChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRCb29sKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRCb29sKGludCBpbmRleCwgYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJvb2xfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkQm9vbChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQm9vbF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkQm9vbChzY2c6OklFbnVtZXJhYmxlPGJvb2w+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJvb2xfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRCb29sKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJvb2xfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxzdHJpbmc+IFJlcGVhdGVkU3RyaW5nTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFN0cmluZ187IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZFN0cmluZ0NvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRTdHJpbmdDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZFN0cmluZyhpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkU3RyaW5nKGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ19baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRTdHJpbmcoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ18uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkU3RyaW5nKHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRTdHJpbmcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8cGI6OkJ5dGVTdHJpbmc+IFJlcGVhdGVkQnl0ZXNMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkQnl0ZXNfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRCeXRlc0NvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRCeXRlc0NvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBHZXRSZXBlYXRlZEJ5dGVzKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEJ5dGVzKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRCeXRlcyhpbnQgaW5kZXgsIHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJ5dGVzX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEJ5dGVzKHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJ5dGVzXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRCeXRlcyhzY2c6OklFbnVtZXJhYmxlPHBiOjpCeXRlU3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRCeXRlc18uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEJ5dGVzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJ5dGVzXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5SZXBlYXRlZEdyb3VwPiBSZXBlYXRlZEdyb3VwTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEdyb3VwXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkR3JvdXBDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkR3JvdXBDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5SZXBlYXRlZEdyb3VwIEdldFJlcGVhdGVkR3JvdXAoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkR3JvdXAoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEdyb3VwKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5SZXBlYXRlZEdyb3VwIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEdyb3VwX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEdyb3VwKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5SZXBlYXRlZEdyb3VwLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkR3JvdXBfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkR3JvdXAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5SZXBlYXRlZEdyb3VwIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEdyb3VwXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkR3JvdXAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5SZXBlYXRlZEdyb3VwLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkR3JvdXBfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEdyb3VwKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5SZXBlYXRlZEdyb3VwPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRHcm91cF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEdyb3VwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEdyb3VwXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRNZXNzYWdlPiBSZXBlYXRlZE5lc3RlZE1lc3NhZ2VMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkTmVzdGVkTWVzc2FnZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZE5lc3RlZE1lc3NhZ2VDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkTmVzdGVkTWVzc2FnZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZE1lc3NhZ2UgR2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTmVzdGVkTWVzc2FnZV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTmVzdGVkTWVzc2FnZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRNZXNzYWdlPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkTmVzdGVkTWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2VMaXRlPiBSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2VMaXRlIEdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2VMaXRlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2VMaXRlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2VMaXRlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2VMaXRlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2VMaXRlPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGU+IFJlcGVhdGVkSW1wb3J0TWVzc2FnZUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRJbXBvcnRNZXNzYWdlXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW1wb3J0TWVzc2FnZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRJbXBvcnRNZXNzYWdlQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2VMaXRlIEdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0TWVzc2FnZV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRNZXNzYWdlX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEltcG9ydE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEltcG9ydE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGUuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRJbXBvcnRNZXNzYWdlKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZUxpdGU+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEltcG9ydE1lc3NhZ2VfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRJbXBvcnRNZXNzYWdlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEltcG9ydE1lc3NhZ2VfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0+IFJlcGVhdGVkTmVzdGVkRW51bUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWROZXN0ZWRFbnVtXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkTmVzdGVkRW51bUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWROZXN0ZWRFbnVtQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bSBHZXRSZXBlYXRlZE5lc3RlZEVudW0oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkTmVzdGVkRW51bShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkTmVzdGVkRW51bShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE5lc3RlZEVudW1fW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkTmVzdGVkRW51bShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXNMaXRlLlR5cGVzLk5lc3RlZEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRFbnVtXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWROZXN0ZWRFbnVtKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRFbnVtPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRFbnVtXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkTmVzdGVkRW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRFbnVtXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlPiBSZXBlYXRlZEZvcmVpZ25FbnVtTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEZvcmVpZ25FbnVtXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRm9yZWlnbkVudW1Db3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkRm9yZWlnbkVudW1Db3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlIEdldFJlcGVhdGVkRm9yZWlnbkVudW0oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRm9yZWlnbkVudW0oaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEZvcmVpZ25FbnVtKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbkVudW1fW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkRm9yZWlnbkVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbkVudW1fLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEZvcmVpZ25FbnVtKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduRW51bV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEZvcmVpZ25FbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25FbnVtXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGU+IFJlcGVhdGVkSW1wb3J0RW51bUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRJbXBvcnRFbnVtXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW1wb3J0RW51bUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRJbXBvcnRFbnVtQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW1MaXRlIEdldFJlcGVhdGVkSW1wb3J0RW51bShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRJbXBvcnRFbnVtKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRJbXBvcnRFbnVtKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRFbnVtX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEltcG9ydEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRFbnVtXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRJbXBvcnRFbnVtKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGU+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEltcG9ydEVudW1fLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRJbXBvcnRFbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEltcG9ydEVudW1fLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxzdHJpbmc+IFJlcGVhdGVkU3RyaW5nUGllY2VMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkU3RyaW5nUGllY2VfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRTdHJpbmdQaWVjZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRTdHJpbmdQaWVjZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgR2V0UmVwZWF0ZWRTdHJpbmdQaWVjZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRTdHJpbmdQaWVjZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkU3RyaW5nUGllY2UoaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkU3RyaW5nUGllY2Uoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ1BpZWNlXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRTdHJpbmdQaWVjZShzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRTdHJpbmdQaWVjZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdQaWVjZV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gUmVwZWF0ZWRDb3JkTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZENvcmRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRDb3JkQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZENvcmRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkQ29yZChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRDb3JkKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRDb3JkKGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZENvcmRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkQ29yZChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQ29yZF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkQ29yZChzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQ29yZF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZENvcmQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQ29yZF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0SW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0SW50MzI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEZWZhdWx0SW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0SW50MzI7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRJbnQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdEludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0SW50MzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRJbnQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRJbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEludDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEludDMyXyA9IDQxOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRJbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRJbnQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBEZWZhdWx0SW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0SW50NjQ7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRJbnQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdEludDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEludDY0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0SW50NjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0SW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRJbnQ2NCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRJbnQ2NF8gPSA0Mkw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFVpbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRVaW50MzI7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgRGVmYXVsdFVpbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRVaW50MzI7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRVaW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRVaW50MzIodWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0VWludDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0VWludDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdFVpbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFVpbnQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRVaW50MzJfID0gNDM7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFVpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRVaW50NjQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIERlZmF1bHRVaW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0VWludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0VWludDY0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0VWludDY0KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRVaW50NjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRVaW50NjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0VWludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0VWludDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFVpbnQ2NF8gPSA0NFVMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTaW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0U2ludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRGVmYXVsdFNpbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRTaW50MzI7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRTaW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRTaW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTaW50MzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTaW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0U2ludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ludDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFNpbnQzMl8gPSAtNDU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFNpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRTaW50NjQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgRGVmYXVsdFNpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRTaW50NjQ7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRTaW50NjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRTaW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ludDY0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U2ludDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdFNpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNpbnQ2NCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTaW50NjRfID0gNDY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEZpeGVkMzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0Rml4ZWQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBEZWZhdWx0Rml4ZWQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRGaXhlZDMyOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0Rml4ZWQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdEZpeGVkMzIodWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Rml4ZWQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEZpeGVkMzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0Rml4ZWQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEZpeGVkMzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0Rml4ZWQzMl8gPSA0NzsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Rml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRGaXhlZDY0OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBEZWZhdWx0Rml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRGaXhlZDY0OyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0Rml4ZWQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdEZpeGVkNjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEZpeGVkNjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRGaXhlZDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdEZpeGVkNjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGaXhlZDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEZpeGVkNjRfID0gNDg7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFNmaXhlZDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdFNmaXhlZDMyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRGVmYXVsdFNmaXhlZDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdFNmaXhlZDMyOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0U2ZpeGVkMzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRTZml4ZWQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNmaXhlZDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U2ZpeGVkMzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0U2ZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTZml4ZWQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTZml4ZWQzMl8gPSA0OTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U2ZpeGVkNjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0U2ZpeGVkNjQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgRGVmYXVsdFNmaXhlZDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdFNmaXhlZDY0OyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0U2ZpeGVkNjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRTZml4ZWQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTZml4ZWQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFNmaXhlZDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdFNmaXhlZDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ZpeGVkNjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U2ZpeGVkNjRfID0gLTUwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRGbG9hdDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgRGVmYXVsdEZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdEZsb2F0OyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0RmxvYXQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRGbG9hdChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0RmxvYXQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRGbG9hdF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRGbG9hdCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEZsb2F0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEZsb2F0XyA9IDUxLjVGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHREb3VibGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0RG91YmxlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBkb3VibGUgRGVmYXVsdERvdWJsZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHREb3VibGU7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHREb3VibGUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHREb3VibGUoZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHREb3VibGUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHREb3VibGVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0RG91YmxlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0RG91YmxlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdERvdWJsZV8gPSA1MjAwMEQ7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEJvb2wgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0Qm9vbDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgYm9vbCBEZWZhdWx0Qm9vbCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRCb29sOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0Qm9vbCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdEJvb2woYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Qm9vbCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEJvb2xfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0Qm9vbCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEJvb2wgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0Qm9vbF8gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTdHJpbmcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0U3RyaW5nOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRGVmYXVsdFN0cmluZyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRTdHJpbmc7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRTdHJpbmcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRTdHJpbmcoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U3RyaW5nID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U3RyaW5nXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdFN0cmluZygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFN0cmluZyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTdHJpbmdfID0gImhlbGxvIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Qnl0ZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0Qnl0ZXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIERlZmF1bHRCeXRlcyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRCeXRlczsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdEJ5dGVzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0Qnl0ZXMocGI6OkJ5dGVTdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRCeXRlcyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEJ5dGVzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdEJ5dGVzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Qnl0ZXMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0Qnl0ZXNfID0gcGI6OkJ5dGVTdHJpbmcuRnJvbUJhc2U2NCgiZDI5eWJHUT0iKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0TmVzdGVkRW51bSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdE5lc3RlZEVudW07IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bSBEZWZhdWx0TmVzdGVkRW51bSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHROZXN0ZWRFbnVtOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0TmVzdGVkRW51bSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdE5lc3RlZEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzTGl0ZS5UeXBlcy5OZXN0ZWRFbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHROZXN0ZWRFbnVtID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0TmVzdGVkRW51bV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHROZXN0ZWRFbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0TmVzdGVkRW51bSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHROZXN0ZWRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlc0xpdGUuVHlwZXMuTmVzdGVkRW51bS5CQVI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEZvcmVpZ25FbnVtIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0Rm9yZWlnbkVudW07IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtTGl0ZSBEZWZhdWx0Rm9yZWlnbkVudW0gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0Rm9yZWlnbkVudW07IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRGb3JlaWduRW51bSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdEZvcmVpZ25FbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtTGl0ZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Rm9yZWlnbkVudW0gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRGb3JlaWduRW51bV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRGb3JlaWduRW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEZvcmVpZ25FbnVtID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEZvcmVpZ25FbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFSOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRJbXBvcnRFbnVtIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0SW1wb3J0RW51bTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bUxpdGUgRGVmYXVsdEltcG9ydEVudW0gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0SW1wb3J0RW51bTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdEltcG9ydEVudW0odmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRJbXBvcnRFbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW1MaXRlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRJbXBvcnRFbnVtID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0SW1wb3J0RW51bV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRJbXBvcnRFbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0SW1wb3J0RW51bSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRJbXBvcnRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBUjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U3RyaW5nUGllY2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0U3RyaW5nUGllY2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBEZWZhdWx0U3RyaW5nUGllY2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0U3RyaW5nUGllY2U7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRTdHJpbmdQaWVjZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdFN0cmluZ1BpZWNlKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFN0cmluZ1BpZWNlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U3RyaW5nUGllY2VfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0U3RyaW5nUGllY2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTdHJpbmdQaWVjZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTdHJpbmdQaWVjZV8gPSAiYWJjIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Q29yZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRDb3JkOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRGVmYXVsdENvcmQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0Q29yZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdENvcmQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRDb3JkKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdENvcmQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRDb3JkXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdENvcmQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRDb3JkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdENvcmRfID0gIjEyMyI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RBbGxUeXBlc0xpdGUoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBGb3JlaWduTWVzc2FnZUxpdGUgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZUxpdGU8Rm9yZWlnbk1lc3NhZ2VMaXRlLCBGb3JlaWduTWVzc2FnZUxpdGUuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEZvcmVpZ25NZXNzYWdlTGl0ZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGb3JlaWduTWVzc2FnZUxpdGUgZGVmYXVsdEluc3RhbmNlID0gbmV3IEZvcmVpZ25NZXNzYWdlTGl0ZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZm9yZWlnbk1lc3NhZ2VMaXRlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJjIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2ZvcmVpZ25NZXNzYWdlTGl0ZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2VMaXRlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgRm9yZWlnbk1lc3NhZ2VMaXRlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZvcmVpZ25NZXNzYWdlTGl0ZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBDRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzQzsNCisgICAgcHJpdmF0ZSBpbnQgY187DQorICAgIHB1YmxpYyBib29sIEhhc0Mgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNDOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBDIHsNCisgICAgICBnZXQgeyByZXR1cm4gY187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2ZvcmVpZ25NZXNzYWdlTGl0ZUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0MpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzBdLCBDKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNDKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIEMpOw0KKyAgICAgIH0NCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICAjcmVnaW9uIExpdGUgcnVudGltZSBtZXRob2RzDQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7DQorICAgICAgaW50IGhhc2ggPSBHZXRUeXBlKCkuR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzQykgaGFzaCBePSBjXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIHJldHVybiBoYXNoOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikgew0KKyAgICAgIEZvcmVpZ25NZXNzYWdlTGl0ZSBvdGhlciA9IG9iaiBhcyBGb3JlaWduTWVzc2FnZUxpdGU7DQorICAgICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzQyAhPSBvdGhlci5oYXNDIHx8IChoYXNDICYmICFjXy5FcXVhbHMob3RoZXIuY18pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludFRvKGdsb2JhbDo6U3lzdGVtLklPLlRleHRXcml0ZXIgd3JpdGVyKSB7DQorICAgICAgUHJpbnRGaWVsZCgiYyIsIGhhc0MsIGNfLCB3cml0ZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2VMaXRlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvcmVpZ25NZXNzYWdlTGl0ZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZUxpdGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvcmVpZ25NZXNzYWdlTGl0ZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2VMaXRlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvcmVpZ25NZXNzYWdlTGl0ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZUxpdGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2VMaXRlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvcmVpZ25NZXNzYWdlTGl0ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZUxpdGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgRm9yZWlnbk1lc3NhZ2VMaXRlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKEZvcmVpZ25NZXNzYWdlTGl0ZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlckxpdGU8Rm9yZWlnbk1lc3NhZ2VMaXRlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihGb3JlaWduTWVzc2FnZUxpdGUgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBGb3JlaWduTWVzc2FnZUxpdGUgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgRm9yZWlnbk1lc3NhZ2VMaXRlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgRm9yZWlnbk1lc3NhZ2VMaXRlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgRm9yZWlnbk1lc3NhZ2VMaXRlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBGb3JlaWduTWVzc2FnZUxpdGUgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBGb3JlaWduTWVzc2FnZUxpdGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2VMaXRlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRm9yZWlnbk1lc3NhZ2VMaXRlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2VMaXRlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgRm9yZWlnbk1lc3NhZ2VMaXRlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEZvcmVpZ25NZXNzYWdlTGl0ZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEZvcmVpZ25NZXNzYWdlTGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlTGl0ZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNDKSB7DQorICAgICAgICAgIEMgPSBvdGhlci5DOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2ZvcmVpZ25NZXNzYWdlTGl0ZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9mb3JlaWduTWVzc2FnZUxpdGVGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0MgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5jXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0Mgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNDOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgQyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkM7IH0NCisgICAgICAgIHNldCB7IFNldEModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEMoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0MgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJDKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuY18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBGb3JlaWduTWVzc2FnZUxpdGUoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0UGFja2VkVHlwZXNMaXRlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2VMaXRlPFRlc3RQYWNrZWRUeXBlc0xpdGUsIFRlc3RQYWNrZWRUeXBlc0xpdGUuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RQYWNrZWRUeXBlc0xpdGUoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdFBhY2tlZFR5cGVzTGl0ZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFBhY2tlZFR5cGVzTGl0ZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFBhY2tlZFR5cGVzTGl0ZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAicGFja2VkX2Jvb2wiLCAicGFja2VkX2RvdWJsZSIsICJwYWNrZWRfZW51bSIsICJwYWNrZWRfZml4ZWQzMiIsICJwYWNrZWRfZml4ZWQ2NCIsICJwYWNrZWRfZmxvYXQiLCAicGFja2VkX2ludDMyIiwgInBhY2tlZF9pbnQ2NCIsICJwYWNrZWRfc2ZpeGVkMzIiLCAicGFja2VkX3NmaXhlZDY0IiwgInBhY2tlZF9zaW50MzIiLCAicGFja2VkX3NpbnQ2NCIsICJwYWNrZWRfdWludDMyIiwgInBhY2tlZF91aW50NjQiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFBhY2tlZFR5cGVzTGl0ZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4MTgsIDgxMCwgODI2LCA3NzAsIDc3OCwgODAyLCA3MjIsIDczMCwgNzg2LCA3OTQsIDc1NCwgNzYyLCA3MzgsIDc0NiB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlc0xpdGUgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UGFja2VkVHlwZXNMaXRlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RQYWNrZWRUeXBlc0xpdGUgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkSW50MzJGaWVsZE51bWJlciA9IDkwOw0KKyAgICBwcml2YXRlIGludCBwYWNrZWRJbnQzMk1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiBwYWNrZWRJbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFBhY2tlZEludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRJbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRJbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkSW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRQYWNrZWRJbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkSW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRJbnQ2NEZpZWxkTnVtYmVyID0gOTE7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZEludDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiBwYWNrZWRJbnQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gUGFja2VkSW50NjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZEludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZEludDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRJbnQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBHZXRQYWNrZWRJbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkSW50NjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRVaW50MzJGaWVsZE51bWJlciA9IDkyOw0KKyAgICBwcml2YXRlIGludCBwYWNrZWRVaW50MzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+IHBhY2tlZFVpbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVpbnQ+IFBhY2tlZFVpbnQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkVWludDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZFVpbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkVWludDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBHZXRQYWNrZWRVaW50MzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZFVpbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFVpbnQ2NEZpZWxkTnVtYmVyID0gOTM7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZFVpbnQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+IHBhY2tlZFVpbnQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1bG9uZz4gUGFja2VkVWludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRVaW50NjRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkVWludDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRVaW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBHZXRQYWNrZWRVaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZFVpbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFNpbnQzMkZpZWxkTnVtYmVyID0gOTQ7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZFNpbnQzMk1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiBwYWNrZWRTaW50MzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBQYWNrZWRTaW50MzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZFNpbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRTaW50MzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZFNpbnQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFBhY2tlZFNpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkU2ludDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkU2ludDY0RmllbGROdW1iZXIgPSA5NTsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkU2ludDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiBwYWNrZWRTaW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGxvbmc+IFBhY2tlZFNpbnQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkU2ludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZFNpbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkU2ludDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEdldFBhY2tlZFNpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkU2ludDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRml4ZWQzMkZpZWxkTnVtYmVyID0gOTY7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZEZpeGVkMzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+IHBhY2tlZEZpeGVkMzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1aW50PiBQYWNrZWRGaXhlZDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRGaXhlZDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZEZpeGVkMzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZEZpeGVkMzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IEdldFBhY2tlZEZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZEZpeGVkMzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRGaXhlZDY0RmllbGROdW1iZXIgPSA5NzsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkRml4ZWQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+IHBhY2tlZEZpeGVkNjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IFBhY2tlZEZpeGVkNjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZEZpeGVkNjRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkRml4ZWQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkRml4ZWQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIEdldFBhY2tlZEZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZEZpeGVkNjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTZml4ZWQzMkZpZWxkTnVtYmVyID0gOTg7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZFNmaXhlZDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IHBhY2tlZFNmaXhlZDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gUGFja2VkU2ZpeGVkMzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZFNmaXhlZDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZFNmaXhlZDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRTZml4ZWQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFBhY2tlZFNmaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRTZml4ZWQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFNmaXhlZDY0RmllbGROdW1iZXIgPSA5OTsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkU2ZpeGVkNjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+IHBhY2tlZFNmaXhlZDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBQYWNrZWRTZml4ZWQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkU2ZpeGVkNjRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkU2ZpeGVkNjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZFNmaXhlZDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEdldFBhY2tlZFNmaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRTZml4ZWQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEZsb2F0RmllbGROdW1iZXIgPSAxMDA7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZEZsb2F0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxmbG9hdD4gcGFja2VkRmxvYXRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGZsb2F0PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxmbG9hdD4gUGFja2VkRmxvYXRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZEZsb2F0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZEZsb2F0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRGbG9hdF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgR2V0UGFja2VkRmxvYXQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZEZsb2F0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRG91YmxlRmllbGROdW1iZXIgPSAxMDE7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZERvdWJsZU1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8ZG91YmxlPiBwYWNrZWREb3VibGVfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGRvdWJsZT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8ZG91YmxlPiBQYWNrZWREb3VibGVMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZERvdWJsZV8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWREb3VibGVDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZERvdWJsZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZG91YmxlIEdldFBhY2tlZERvdWJsZShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkRG91YmxlX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkQm9vbEZpZWxkTnVtYmVyID0gMTAyOw0KKyAgICBwcml2YXRlIGludCBwYWNrZWRCb29sTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxib29sPiBwYWNrZWRCb29sXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxib29sPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxib29sPiBQYWNrZWRCb29sTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRCb29sXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZEJvb2xDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZEJvb2xfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgR2V0UGFja2VkQm9vbChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkQm9vbF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEVudW1GaWVsZE51bWJlciA9IDEwMzsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkRW51bU1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlPiBwYWNrZWRFbnVtXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bUxpdGU+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtTGl0ZT4gUGFja2VkRW51bUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkRW51bV8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRFbnVtQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRFbnVtXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bUxpdGUgR2V0UGFja2VkRW51bShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkRW51bV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdFBhY2tlZFR5cGVzTGl0ZUZpZWxkTmFtZXM7DQorICAgICAgaWYgKHBhY2tlZEludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZEludDMyQXJyYXkoOTAsIGZpZWxkX25hbWVzWzZdLCBwYWNrZWRJbnQzMk1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZEludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRJbnQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRJbnQ2NEFycmF5KDkxLCBmaWVsZF9uYW1lc1s3XSwgcGFja2VkSW50NjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRJbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkVWludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZFVJbnQzMkFycmF5KDkyLCBmaWVsZF9uYW1lc1sxMl0sIHBhY2tlZFVpbnQzMk1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZFVpbnQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkVWludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZFVJbnQ2NEFycmF5KDkzLCBmaWVsZF9uYW1lc1sxM10sIHBhY2tlZFVpbnQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZFVpbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkU2ludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZFNJbnQzMkFycmF5KDk0LCBmaWVsZF9uYW1lc1sxMF0sIHBhY2tlZFNpbnQzMk1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZFNpbnQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkU2ludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZFNJbnQ2NEFycmF5KDk1LCBmaWVsZF9uYW1lc1sxMV0sIHBhY2tlZFNpbnQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZFNpbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkRml4ZWQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRGaXhlZDMyQXJyYXkoOTYsIGZpZWxkX25hbWVzWzNdLCBwYWNrZWRGaXhlZDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkRml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkRml4ZWQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRGaXhlZDY0QXJyYXkoOTcsIGZpZWxkX25hbWVzWzRdLCBwYWNrZWRGaXhlZDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkRml4ZWQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkU2ZpeGVkMzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkU0ZpeGVkMzJBcnJheSg5OCwgZmllbGRfbmFtZXNbOF0sIHBhY2tlZFNmaXhlZDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkU2ZpeGVkMzJfKTsNCisgICAgICB9DQorICAgICAgaWYgKHBhY2tlZFNmaXhlZDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZFNGaXhlZDY0QXJyYXkoOTksIGZpZWxkX25hbWVzWzldLCBwYWNrZWRTZml4ZWQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZFNmaXhlZDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRGbG9hdF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRGbG9hdEFycmF5KDEwMCwgZmllbGRfbmFtZXNbNV0sIHBhY2tlZEZsb2F0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkRmxvYXRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHBhY2tlZERvdWJsZV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWREb3VibGVBcnJheSgxMDEsIGZpZWxkX25hbWVzWzFdLCBwYWNrZWREb3VibGVNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWREb3VibGVfKTsNCisgICAgICB9DQorICAgICAgaWYgKHBhY2tlZEJvb2xfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkQm9vbEFycmF5KDEwMiwgZmllbGRfbmFtZXNbMF0sIHBhY2tlZEJvb2xNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRCb29sXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZEVudW1BcnJheSgxMDMsIGZpZWxkX25hbWVzWzJdLCBwYWNrZWRFbnVtTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkRW51bV8pOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIFBhY2tlZEludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRJbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZEludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAobG9uZyBlbGVtZW50IGluIFBhY2tlZEludDY0TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRJbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZEludDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAodWludCBlbGVtZW50IGluIFBhY2tlZFVpbnQzMkxpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50MzJTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZFVpbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZFVpbnQzMk1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHVsb25nIGVsZW1lbnQgaW4gUGFja2VkVWludDY0TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQ2NFNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkVWludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkVWludDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoaW50IGVsZW1lbnQgaW4gUGFja2VkU2ludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkU2ludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkU2ludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAobG9uZyBlbGVtZW50IGluIFBhY2tlZFNpbnQ2NExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50NjRTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZFNpbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZFNpbnQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHBhY2tlZEZpeGVkMzJfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRGaXhlZDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkRml4ZWQzMk1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHBhY2tlZEZpeGVkNjRfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRGaXhlZDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkRml4ZWQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHBhY2tlZFNmaXhlZDMyXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkU2ZpeGVkMzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRTZml4ZWQzMk1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHBhY2tlZFNmaXhlZDY0Xy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkU2ZpeGVkNjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRTZml4ZWQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHBhY2tlZEZsb2F0Xy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkRmxvYXRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRGbG9hdE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHBhY2tlZERvdWJsZV8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZERvdWJsZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZERvdWJsZU1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gMSAqIHBhY2tlZEJvb2xfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRCb29sXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkQm9vbE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGlmIChwYWNrZWRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlIGVsZW1lbnQgaW4gcGFja2VkRW51bV8pIHsNCisgICAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplTm9UYWcoKGludCkgZWxlbWVudCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgICAgc2l6ZSArPSAyOw0KKyAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlUmF3VmFyaW50MzJTaXplKCh1aW50KSBkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRFbnVtTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICAjcmVnaW9uIExpdGUgcnVudGltZSBtZXRob2RzDQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7DQorICAgICAgaW50IGhhc2ggPSBHZXRUeXBlKCkuR2V0SGFzaENvZGUoKTsNCisgICAgICBmb3JlYWNoKGludCBpIGluIHBhY2tlZEludDMyXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2gobG9uZyBpIGluIHBhY2tlZEludDY0XykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2godWludCBpIGluIHBhY2tlZFVpbnQzMl8pDQorICAgICAgICBoYXNoIF49IGkuR2V0SGFzaENvZGUoKTsNCisgICAgICBmb3JlYWNoKHVsb25nIGkgaW4gcGFja2VkVWludDY0XykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2goaW50IGkgaW4gcGFja2VkU2ludDMyXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2gobG9uZyBpIGluIHBhY2tlZFNpbnQ2NF8pDQorICAgICAgICBoYXNoIF49IGkuR2V0SGFzaENvZGUoKTsNCisgICAgICBmb3JlYWNoKHVpbnQgaSBpbiBwYWNrZWRGaXhlZDMyXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2godWxvbmcgaSBpbiBwYWNrZWRGaXhlZDY0XykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2goaW50IGkgaW4gcGFja2VkU2ZpeGVkMzJfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChsb25nIGkgaW4gcGFja2VkU2ZpeGVkNjRfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChmbG9hdCBpIGluIHBhY2tlZEZsb2F0XykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2goZG91YmxlIGkgaW4gcGFja2VkRG91YmxlXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2goYm9vbCBpIGluIHBhY2tlZEJvb2xfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgZm9yZWFjaChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bUxpdGUgaSBpbiBwYWNrZWRFbnVtXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIHJldHVybiBoYXNoOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikgew0KKyAgICAgIFRlc3RQYWNrZWRUeXBlc0xpdGUgb3RoZXIgPSBvYmogYXMgVGVzdFBhY2tlZFR5cGVzTGl0ZTsNCisgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHBhY2tlZEludDMyXy5Db3VudCAhPSBvdGhlci5wYWNrZWRJbnQzMl8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcGFja2VkSW50MzJfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXBhY2tlZEludDMyX1tpeF0uRXF1YWxzKG90aGVyLnBhY2tlZEludDMyX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocGFja2VkSW50NjRfLkNvdW50ICE9IG90aGVyLnBhY2tlZEludDY0Xy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCBwYWNrZWRJbnQ2NF8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcGFja2VkSW50NjRfW2l4XS5FcXVhbHMob3RoZXIucGFja2VkSW50NjRfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZihwYWNrZWRVaW50MzJfLkNvdW50ICE9IG90aGVyLnBhY2tlZFVpbnQzMl8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcGFja2VkVWludDMyXy5Db3VudDsgaXgrKykNCisgICAgICAgIGlmKCFwYWNrZWRVaW50MzJfW2l4XS5FcXVhbHMob3RoZXIucGFja2VkVWludDMyX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocGFja2VkVWludDY0Xy5Db3VudCAhPSBvdGhlci5wYWNrZWRVaW50NjRfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHBhY2tlZFVpbnQ2NF8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcGFja2VkVWludDY0X1tpeF0uRXF1YWxzKG90aGVyLnBhY2tlZFVpbnQ2NF9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHBhY2tlZFNpbnQzMl8uQ291bnQgIT0gb3RoZXIucGFja2VkU2ludDMyXy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCBwYWNrZWRTaW50MzJfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXBhY2tlZFNpbnQzMl9baXhdLkVxdWFscyhvdGhlci5wYWNrZWRTaW50MzJfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZihwYWNrZWRTaW50NjRfLkNvdW50ICE9IG90aGVyLnBhY2tlZFNpbnQ2NF8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcGFja2VkU2ludDY0Xy5Db3VudDsgaXgrKykNCisgICAgICAgIGlmKCFwYWNrZWRTaW50NjRfW2l4XS5FcXVhbHMob3RoZXIucGFja2VkU2ludDY0X1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocGFja2VkRml4ZWQzMl8uQ291bnQgIT0gb3RoZXIucGFja2VkRml4ZWQzMl8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcGFja2VkRml4ZWQzMl8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcGFja2VkRml4ZWQzMl9baXhdLkVxdWFscyhvdGhlci5wYWNrZWRGaXhlZDMyX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocGFja2VkRml4ZWQ2NF8uQ291bnQgIT0gb3RoZXIucGFja2VkRml4ZWQ2NF8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcGFja2VkRml4ZWQ2NF8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcGFja2VkRml4ZWQ2NF9baXhdLkVxdWFscyhvdGhlci5wYWNrZWRGaXhlZDY0X1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocGFja2VkU2ZpeGVkMzJfLkNvdW50ICE9IG90aGVyLnBhY2tlZFNmaXhlZDMyXy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCBwYWNrZWRTZml4ZWQzMl8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcGFja2VkU2ZpeGVkMzJfW2l4XS5FcXVhbHMob3RoZXIucGFja2VkU2ZpeGVkMzJfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZihwYWNrZWRTZml4ZWQ2NF8uQ291bnQgIT0gb3RoZXIucGFja2VkU2ZpeGVkNjRfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHBhY2tlZFNmaXhlZDY0Xy5Db3VudDsgaXgrKykNCisgICAgICAgIGlmKCFwYWNrZWRTZml4ZWQ2NF9baXhdLkVxdWFscyhvdGhlci5wYWNrZWRTZml4ZWQ2NF9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHBhY2tlZEZsb2F0Xy5Db3VudCAhPSBvdGhlci5wYWNrZWRGbG9hdF8uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcGFja2VkRmxvYXRfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXBhY2tlZEZsb2F0X1tpeF0uRXF1YWxzKG90aGVyLnBhY2tlZEZsb2F0X1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocGFja2VkRG91YmxlXy5Db3VudCAhPSBvdGhlci5wYWNrZWREb3VibGVfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHBhY2tlZERvdWJsZV8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcGFja2VkRG91YmxlX1tpeF0uRXF1YWxzKG90aGVyLnBhY2tlZERvdWJsZV9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHBhY2tlZEJvb2xfLkNvdW50ICE9IG90aGVyLnBhY2tlZEJvb2xfLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHBhY2tlZEJvb2xfLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXBhY2tlZEJvb2xfW2l4XS5FcXVhbHMob3RoZXIucGFja2VkQm9vbF9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmKHBhY2tlZEVudW1fLkNvdW50ICE9IG90aGVyLnBhY2tlZEVudW1fLkNvdW50KSByZXR1cm4gZmFsc2U7DQorICAgICAgZm9yKGludCBpeD0wOyBpeCA8IHBhY2tlZEVudW1fLkNvdW50OyBpeCsrKQ0KKyAgICAgICAgaWYoIXBhY2tlZEVudW1fW2l4XS5FcXVhbHMob3RoZXIucGFja2VkRW51bV9baXhdKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludFRvKGdsb2JhbDo6U3lzdGVtLklPLlRleHRXcml0ZXIgd3JpdGVyKSB7DQorICAgICAgUHJpbnRGaWVsZCgicGFja2VkX2ludDMyIiwgcGFja2VkSW50MzJfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoInBhY2tlZF9pbnQ2NCIsIHBhY2tlZEludDY0Xywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJwYWNrZWRfdWludDMyIiwgcGFja2VkVWludDMyXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJwYWNrZWRfdWludDY0IiwgcGFja2VkVWludDY0Xywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJwYWNrZWRfc2ludDMyIiwgcGFja2VkU2ludDMyXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJwYWNrZWRfc2ludDY0IiwgcGFja2VkU2ludDY0Xywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJwYWNrZWRfZml4ZWQzMiIsIHBhY2tlZEZpeGVkMzJfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoInBhY2tlZF9maXhlZDY0IiwgcGFja2VkRml4ZWQ2NF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgicGFja2VkX3NmaXhlZDMyIiwgcGFja2VkU2ZpeGVkMzJfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoInBhY2tlZF9zZml4ZWQ2NCIsIHBhY2tlZFNmaXhlZDY0Xywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJwYWNrZWRfZmxvYXQiLCBwYWNrZWRGbG9hdF8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgicGFja2VkX2RvdWJsZSIsIHBhY2tlZERvdWJsZV8sIHdyaXRlcik7DQorICAgICAgUHJpbnRGaWVsZCgicGFja2VkX2Jvb2wiLCBwYWNrZWRCb29sXywgd3JpdGVyKTsNCisgICAgICBQcmludEZpZWxkKCJwYWNrZWRfZW51bSIsIHBhY2tlZEVudW1fLCB3cml0ZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzTGl0ZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXNMaXRlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlc0xpdGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlc0xpdGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlc0xpdGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzTGl0ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXNMaXRlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlc0xpdGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzTGl0ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXNMaXRlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RQYWNrZWRUeXBlc0xpdGUgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHBhY2tlZEludDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRJbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkVWludDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRVaW50NjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZFNpbnQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkU2ludDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRGaXhlZDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRGaXhlZDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRTZml4ZWQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkU2ZpeGVkNjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZEZsb2F0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWREb3VibGVfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZEJvb2xfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZEVudW1fLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdFBhY2tlZFR5cGVzTGl0ZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlckxpdGU8VGVzdFBhY2tlZFR5cGVzTGl0ZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdFBhY2tlZFR5cGVzTGl0ZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RQYWNrZWRUeXBlc0xpdGUgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdFBhY2tlZFR5cGVzTGl0ZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RQYWNrZWRUeXBlc0xpdGUgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0UGFja2VkVHlwZXNMaXRlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UGFja2VkVHlwZXNMaXRlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFBhY2tlZFR5cGVzTGl0ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkVHlwZXNMaXRlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFBhY2tlZFR5cGVzTGl0ZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlTGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RQYWNrZWRUeXBlc0xpdGUpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdFBhY2tlZFR5cGVzTGl0ZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RQYWNrZWRUeXBlc0xpdGUgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkVHlwZXNMaXRlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZEludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQzMl8uQWRkKG90aGVyLnBhY2tlZEludDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkSW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZEludDY0Xy5BZGQob3RoZXIucGFja2VkSW50NjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWRVaW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQzMl8uQWRkKG90aGVyLnBhY2tlZFVpbnQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZFVpbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkVWludDY0Xy5BZGQob3RoZXIucGFja2VkVWludDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkU2ludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRTaW50MzJfLkFkZChvdGhlci5wYWNrZWRTaW50MzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWRTaW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQ2NF8uQWRkKG90aGVyLnBhY2tlZFNpbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZEZpeGVkMzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZEZpeGVkMzJfLkFkZChvdGhlci5wYWNrZWRGaXhlZDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkRml4ZWQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkRml4ZWQ2NF8uQWRkKG90aGVyLnBhY2tlZEZpeGVkNjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWRTZml4ZWQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkU2ZpeGVkMzJfLkFkZChvdGhlci5wYWNrZWRTZml4ZWQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZFNmaXhlZDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQ2NF8uQWRkKG90aGVyLnBhY2tlZFNmaXhlZDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkRmxvYXRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZEZsb2F0Xy5BZGQob3RoZXIucGFja2VkRmxvYXRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWREb3VibGVfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZERvdWJsZV8uQWRkKG90aGVyLnBhY2tlZERvdWJsZV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZEJvb2xfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZEJvb2xfLkFkZChvdGhlci5wYWNrZWRCb29sXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkRW51bV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkRW51bV8uQWRkKG90aGVyLnBhY2tlZEVudW1fKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0UGFja2VkVHlwZXNMaXRlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RQYWNrZWRUeXBlc0xpdGVGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzIyOg0KKyAgICAgICAgICAgIGNhc2UgNzIwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWRJbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzMwOg0KKyAgICAgICAgICAgIGNhc2UgNzI4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWRJbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzM4Og0KKyAgICAgICAgICAgIGNhc2UgNzM2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkVUludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkVWludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NDY6DQorICAgICAgICAgICAgY2FzZSA3NDQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRVSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWRVaW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc1NDoNCisgICAgICAgICAgICBjYXNlIDc1Mjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZFNpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzYyOg0KKyAgICAgICAgICAgIGNhc2UgNzYwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ludDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkU2ludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NzA6DQorICAgICAgICAgICAgY2FzZSA3NzM6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkRml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzc4Og0KKyAgICAgICAgICAgIGNhc2UgNzc3OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRml4ZWQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZEZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc4NjoNCisgICAgICAgICAgICBjYXNlIDc4OTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNGaXhlZDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkU2ZpeGVkMzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc5NDoNCisgICAgICAgICAgICBjYXNlIDc5Mzogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNGaXhlZDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkU2ZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgwMjoNCisgICAgICAgICAgICBjYXNlIDgwNTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEZsb2F0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkRmxvYXRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgxMDoNCisgICAgICAgICAgICBjYXNlIDgwOTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZERvdWJsZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZERvdWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODE4Og0KKyAgICAgICAgICAgIGNhc2UgODE2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkQm9vbEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZEJvb2xfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgyNjoNCisgICAgICAgICAgICBjYXNlIDgyNDogew0KKyAgICAgICAgICAgICAgc2NnOjpJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd25JdGVtczsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXk8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlPih0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWRFbnVtXywgb3V0IHVua25vd25JdGVtcyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBQYWNrZWRJbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkSW50MzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkSW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZEludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXRQYWNrZWRJbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkSW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRJbnQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkSW50MzIoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRJbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkSW50MzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBQYWNrZWRJbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkSW50NjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkSW50NjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZEludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0UGFja2VkSW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZEludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkSW50NjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEludDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRJbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkSW50NjQoc2NnOjpJRW51bWVyYWJsZTxsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkSW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkSW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWludD4gUGFja2VkVWludDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRVaW50MzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkVWludDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRVaW50MzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBHZXRQYWNrZWRVaW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZFVpbnQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZFVpbnQzMihpbnQgaW5kZXgsIHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkVWludDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRVaW50MzIodWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRVaW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRVaW50MzIoc2NnOjpJRW51bWVyYWJsZTx1aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkVWludDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZFVpbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkVWludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IFBhY2tlZFVpbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkVWludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZFVpbnQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkVWludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEdldFBhY2tlZFVpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkVWludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkVWludDY0KGludCBpbmRleCwgdWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkVWludDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRVaW50NjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkVWludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkVWludDY0KHNjZzo6SUVudW1lcmFibGU8dWxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRVaW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkVWludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRVaW50NjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IFBhY2tlZFNpbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkU2ludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZFNpbnQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkU2ludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXRQYWNrZWRTaW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZFNpbnQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZFNpbnQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTaW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZFNpbnQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkU2ludDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ludDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZFNpbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gUGFja2VkU2ludDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRTaW50NjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkU2ludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRTaW50NjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBHZXRQYWNrZWRTaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZFNpbnQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZFNpbnQ2NChpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ludDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRTaW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTaW50NjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRTaW50NjQoc2NnOjpJRW51bWVyYWJsZTxsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ludDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZFNpbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWludD4gUGFja2VkRml4ZWQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkRml4ZWQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRGaXhlZDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRGaXhlZDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgR2V0UGFja2VkRml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkRml4ZWQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZEZpeGVkMzIoaW50IGluZGV4LCB1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZpeGVkMzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZEZpeGVkMzIodWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGaXhlZDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkRml4ZWQzMihzY2c6OklFbnVtZXJhYmxlPHVpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGaXhlZDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZEZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZpeGVkMzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1bG9uZz4gUGFja2VkRml4ZWQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkRml4ZWQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRGaXhlZDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRGaXhlZDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEdldFBhY2tlZEZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZEZpeGVkNjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRGaXhlZDY0KGludCBpbmRleCwgdWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRml4ZWQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkRml4ZWQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGaXhlZDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkRml4ZWQ2NChzY2c6OklFbnVtZXJhYmxlPHVsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRml4ZWQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRGaXhlZDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGaXhlZDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBQYWNrZWRTZml4ZWQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkU2ZpeGVkMzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkU2ZpeGVkMzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZFNmaXhlZDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXRQYWNrZWRTZml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkU2ZpeGVkMzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRTZml4ZWQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkU2ZpeGVkMzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNmaXhlZDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkU2ZpeGVkMzIoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRTZml4ZWQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ZpeGVkMzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBQYWNrZWRTZml4ZWQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkU2ZpeGVkNjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkU2ZpeGVkNjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZFNmaXhlZDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0UGFja2VkU2ZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZFNmaXhlZDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkU2ZpeGVkNjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNmaXhlZDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRTZml4ZWQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNmaXhlZDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkU2ZpeGVkNjQoc2NnOjpJRW51bWVyYWJsZTxsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ZpeGVkNjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkU2ZpeGVkNjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNmaXhlZDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8ZmxvYXQ+IFBhY2tlZEZsb2F0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRGbG9hdF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRGbG9hdENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkRmxvYXRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgR2V0UGFja2VkRmxvYXQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZEZsb2F0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkRmxvYXQoaW50IGluZGV4LCBmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGbG9hdF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkRmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRmxvYXRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRGbG9hdChzY2c6OklFbnVtZXJhYmxlPGZsb2F0PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRmxvYXRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZsb2F0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8ZG91YmxlPiBQYWNrZWREb3VibGVMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZERvdWJsZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWREb3VibGVDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZERvdWJsZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBkb3VibGUgR2V0UGFja2VkRG91YmxlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWREb3VibGUoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWREb3VibGUoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRG91YmxlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWREb3VibGUoZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZERvdWJsZV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZERvdWJsZShzY2c6OklFbnVtZXJhYmxlPGRvdWJsZT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZERvdWJsZV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWREb3VibGUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZERvdWJsZV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGJvb2w+IFBhY2tlZEJvb2xMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZEJvb2xfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkQm9vbENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkQm9vbENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEdldFBhY2tlZEJvb2woaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZEJvb2woaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRCb29sKGludCBpbmRleCwgYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRCb29sX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRCb29sKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkQm9vbF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZEJvb2woc2NnOjpJRW51bWVyYWJsZTxib29sPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkQm9vbF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRCb29sKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRCb29sXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlPiBQYWNrZWRFbnVtTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRFbnVtXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZEVudW1Db3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZEVudW1Db3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlIEdldFBhY2tlZEVudW0oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZEVudW0oaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRFbnVtKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEVudW1fW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEVudW1fLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRFbnVtKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW1MaXRlPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRW51bV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRFbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRFbnVtXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0UGFja2VkVHlwZXNMaXRlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIDogcGI6OkV4dGVuZGFibGVNZXNzYWdlTGl0ZTxUZXN0QWxsRXh0ZW5zaW9uc0xpdGUsIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdEFsbEV4dGVuc2lvbnNMaXRlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdEFsbEV4dGVuc2lvbnNMaXRlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0QWxsRXh0ZW5zaW9uc0xpdGVGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdEFsbEV4dGVuc2lvbnNMaXRlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIUV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdEFsbEV4dGVuc2lvbnNMaXRlRmllbGROYW1lczsNCisgICAgICBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2VMaXRlPFRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXI+LkV4dGVuc2lvbldyaXRlciBleHRlbnNpb25Xcml0ZXIgPSBDcmVhdGVFeHRlbnNpb25Xcml0ZXIodGhpcyk7DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoNTM2ODcwOTEyLCBvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IEV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICAjcmVnaW9uIExpdGUgcnVudGltZSBtZXRob2RzDQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7DQorICAgICAgaW50IGhhc2ggPSBHZXRUeXBlKCkuR2V0SGFzaENvZGUoKTsNCisgICAgICBoYXNoIF49IGJhc2UuR2V0SGFzaENvZGUoKTsNCisgICAgICByZXR1cm4gaGFzaDsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopIHsNCisgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgb3RoZXIgPSBvYmogYXMgVGVzdEFsbEV4dGVuc2lvbnNMaXRlOw0KKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYgKCFiYXNlLkVxdWFscyhvdGhlcikpIHJldHVybiBmYWxzZTsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUHJpbnRUbyhnbG9iYWw6OlN5c3RlbS5JTy5UZXh0V3JpdGVyIHdyaXRlcikgew0KKyAgICAgIGJhc2UuUHJpbnRUbyh3cml0ZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6RXh0ZW5kYWJsZUJ1aWxkZXJMaXRlPFRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdEFsbEV4dGVuc2lvbnNMaXRlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RBbGxFeHRlbnNpb25zTGl0ZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlTGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0QWxsRXh0ZW5zaW9uc0xpdGUpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9uc0xpdGUuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgIHRoaXMuTWVyZ2VFeHRlbnNpb25GaWVsZHMob3RoZXIpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RBbGxFeHRlbnNpb25zTGl0ZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0QWxsRXh0ZW5zaW9uc0xpdGVGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnNMaXRlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlLCBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUgZGVmYXVsdEluc3RhbmNlID0gbmV3IE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX29wdGlvbmFsR3JvdXBFeHRlbnNpb25MaXRlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX29wdGlvbmFsR3JvdXBFeHRlbnNpb25MaXRlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEzNiB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICBwcml2YXRlIGludCBhXzsNCisgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0E7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfb3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGVGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxNywgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTcsIEEpOw0KKyAgICAgIH0NCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICAjcmVnaW9uIExpdGUgcnVudGltZSBtZXRob2RzDQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7DQorICAgICAgaW50IGhhc2ggPSBHZXRUeXBlKCkuR2V0SGFzaENvZGUoKTsNCisgICAgICBpZiAoaGFzQSkgaGFzaCBePSBhXy5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIHJldHVybiBoYXNoOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikgew0KKyAgICAgIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUgb3RoZXIgPSBvYmogYXMgT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZTsNCisgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNBICE9IG90aGVyLmhhc0EgfHwgKGhhc0EgJiYgIWFfLkVxdWFscyhvdGhlci5hXykpKSByZXR1cm4gZmFsc2U7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFByaW50VG8oZ2xvYmFsOjpTeXN0ZW0uSU8uVGV4dFdyaXRlciB3cml0ZXIpIHsNCisgICAgICBQcmludEZpZWxkKCJhIiwgaGFzQSwgYV8sIHdyaXRlcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyTGl0ZTxPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2VMaXRlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzQSkgew0KKyAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9vcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9vcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMzY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BOyB9DQorICAgICAgICBzZXQgeyBTZXRBKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRBKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0TGl0ZVByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZUxpdGU8UmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZSwgUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9yZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYSIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9yZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAzNzYgfTsNCisgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEFGaWVsZE51bWJlciA9IDQ3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzQTsNCisgICAgcHJpdmF0ZSBpbnQgYV87DQorICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNBOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBBIHsNCisgICAgICBnZXQgeyByZXR1cm4gYV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3JlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNDcsIGZpZWxkX25hbWVzWzBdLCBBKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDQ3LCBBKTsNCisgICAgICB9DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgI3JlZ2lvbiBMaXRlIHJ1bnRpbWUgbWV0aG9kcw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgew0KKyAgICAgIGludCBoYXNoID0gR2V0VHlwZSgpLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc0EpIGhhc2ggXj0gYV8uR2V0SGFzaENvZGUoKTsNCisgICAgICByZXR1cm4gaGFzaDsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopIHsNCisgICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlIG90aGVyID0gb2JqIGFzIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGU7DQorICAgICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzQSAhPSBvdGhlci5oYXNBIHx8IChoYXNBICYmICFhXy5FcXVhbHMob3RoZXIuYV8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludFRvKGdsb2JhbDo6U3lzdGVtLklPLlRleHRXcml0ZXIgd3JpdGVyKSB7DQorICAgICAgUHJpbnRGaWVsZCgiYSIsIGhhc0EsIGFfLCB3cml0ZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlckxpdGU8UmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlTGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0EpIHsNCisgICAgICAgICAgQSA9IG90aGVyLkE7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfcmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGVGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfcmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGVGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzc2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzQSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0E7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0QSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgOiBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2VMaXRlPFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSwgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGVGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmICghRXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGVGaWVsZE5hbWVzOw0KKyAgICAgIHBiOjpFeHRlbmRhYmxlTWVzc2FnZUxpdGU8VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLCBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUuQnVpbGRlcj4uRXh0ZW5zaW9uV3JpdGVyIGV4dGVuc2lvbldyaXRlciA9IENyZWF0ZUV4dGVuc2lvbldyaXRlcih0aGlzKTsNCisgICAgICBleHRlbnNpb25Xcml0ZXIuV3JpdGVVbnRpbCg1MzY4NzA5MTIsIG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHNpemUgKz0gRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgICNyZWdpb24gTGl0ZSBydW50aW1lIG1ldGhvZHMNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsNCisgICAgICBpbnQgaGFzaCA9IEdldFR5cGUoKS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGhhc2ggXj0gYmFzZS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIHJldHVybiBoYXNoOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikgew0KKyAgICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBvdGhlciA9IG9iaiBhcyBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGU7DQorICAgICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoIWJhc2UuRXF1YWxzKG90aGVyKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludFRvKGdsb2JhbDo6U3lzdGVtLklPLlRleHRXcml0ZXIgd3JpdGVyKSB7DQorICAgICAgYmFzZS5QcmludFRvKHdyaXRlcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpFeHRlbmRhYmxlQnVpbGRlckxpdGU8VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2VMaXRlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgdGhpcy5NZXJnZUV4dGVuc2lvbkZpZWxkcyhvdGhlcik7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxUZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZSwgVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdE5lc3RlZEV4dGVuc2lvbkxpdGVGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdE5lc3RlZEV4dGVuc2lvbkxpdGVGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOZXN0ZWRFeHRlbnNpb25GaWVsZE51bWJlciA9IDEyMzQ1Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25MaXRlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zTGl0ZSwgaW50PiBOZXN0ZWRFeHRlbnNpb247DQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZUZpZWxkTmFtZXM7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgICNyZWdpb24gTGl0ZSBydW50aW1lIG1ldGhvZHMNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsNCisgICAgICBpbnQgaGFzaCA9IEdldFR5cGUoKS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIHJldHVybiBoYXNoOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikgew0KKyAgICAgIFRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlIG90aGVyID0gb2JqIGFzIFRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlOw0KKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFByaW50VG8oZ2xvYmFsOjpTeXN0ZW0uSU8uVGV4dFdyaXRlciB3cml0ZXIpIHsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXJMaXRlPFRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2VMaXRlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3ROZXN0ZWRFeHRlbnNpb25MaXRlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3ROZXN0ZWRFeHRlbnNpb25MaXRlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RMaXRlUHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdERlcHJlY2F0ZWRMaXRlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2VMaXRlPFRlc3REZXByZWNhdGVkTGl0ZSwgVGVzdERlcHJlY2F0ZWRMaXRlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0RGVwcmVjYXRlZExpdGUoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdERlcHJlY2F0ZWRMaXRlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0RGVwcmVjYXRlZExpdGUoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3REZXByZWNhdGVkTGl0ZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiZGVwcmVjYXRlZF9maWVsZCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0RGVwcmVjYXRlZExpdGVGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REZXByZWNhdGVkTGl0ZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3REZXByZWNhdGVkTGl0ZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0RGVwcmVjYXRlZExpdGUgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVwcmVjYXRlZEZpZWxkRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVwcmVjYXRlZEZpZWxkOw0KKyAgICBwcml2YXRlIGludCBkZXByZWNhdGVkRmllbGRfOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIGJvb2wgSGFzRGVwcmVjYXRlZEZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVwcmVjYXRlZEZpZWxkOyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBpbnQgRGVwcmVjYXRlZEZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVwcmVjYXRlZEZpZWxkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdERlcHJlY2F0ZWRMaXRlRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzRGVwcmVjYXRlZEZpZWxkKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgRGVwcmVjYXRlZEZpZWxkKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNEZXByZWNhdGVkRmllbGQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgRGVwcmVjYXRlZEZpZWxkKTsNCisgICAgICB9DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgI3JlZ2lvbiBMaXRlIHJ1bnRpbWUgbWV0aG9kcw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgew0KKyAgICAgIGludCBoYXNoID0gR2V0VHlwZSgpLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc0RlcHJlY2F0ZWRGaWVsZCkgaGFzaCBePSBkZXByZWNhdGVkRmllbGRfLkdldEhhc2hDb2RlKCk7DQorICAgICAgcmV0dXJuIGhhc2g7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKSB7DQorICAgICAgVGVzdERlcHJlY2F0ZWRMaXRlIG90aGVyID0gb2JqIGFzIFRlc3REZXByZWNhdGVkTGl0ZTsNCisgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGlmIChoYXNEZXByZWNhdGVkRmllbGQgIT0gb3RoZXIuaGFzRGVwcmVjYXRlZEZpZWxkIHx8IChoYXNEZXByZWNhdGVkRmllbGQgJiYgIWRlcHJlY2F0ZWRGaWVsZF8uRXF1YWxzKG90aGVyLmRlcHJlY2F0ZWRGaWVsZF8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludFRvKGdsb2JhbDo6U3lzdGVtLklPLlRleHRXcml0ZXIgd3JpdGVyKSB7DQorICAgICAgUHJpbnRGaWVsZCgiZGVwcmVjYXRlZF9maWVsZCIsIGhhc0RlcHJlY2F0ZWRGaWVsZCwgZGVwcmVjYXRlZEZpZWxkXywgd3JpdGVyKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REZXByZWNhdGVkTGl0ZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZExpdGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRMaXRlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZExpdGUgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REZXByZWNhdGVkTGl0ZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZExpdGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRMaXRlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REZXByZWNhdGVkTGl0ZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZExpdGUgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRMaXRlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3REZXByZWNhdGVkTGl0ZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0RGVwcmVjYXRlZExpdGUgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXJMaXRlPFRlc3REZXByZWNhdGVkTGl0ZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdERlcHJlY2F0ZWRMaXRlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdERlcHJlY2F0ZWRMaXRlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3REZXByZWNhdGVkTGl0ZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3REZXByZWNhdGVkTGl0ZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3REZXByZWNhdGVkTGl0ZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdERlcHJlY2F0ZWRMaXRlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdERlcHJlY2F0ZWRMaXRlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REZXByZWNhdGVkTGl0ZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3REZXByZWNhdGVkTGl0ZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlTGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3REZXByZWNhdGVkTGl0ZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0RGVwcmVjYXRlZExpdGUpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0RGVwcmVjYXRlZExpdGUgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RGVwcmVjYXRlZExpdGUuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVwcmVjYXRlZEZpZWxkKSB7DQorICAgICAgICAgIERlcHJlY2F0ZWRGaWVsZCA9IG90aGVyLkRlcHJlY2F0ZWRGaWVsZDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0RGVwcmVjYXRlZExpdGVGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdERlcHJlY2F0ZWRMaXRlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZXByZWNhdGVkRmllbGQgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kZXByZWNhdGVkRmllbGRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVwcmVjYXRlZEZpZWxkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVwcmVjYXRlZEZpZWxkOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBpbnQgRGVwcmVjYXRlZEZpZWxkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVwcmVjYXRlZEZpZWxkOyB9DQorICAgICAgICBzZXQgeyBTZXREZXByZWNhdGVkRmllbGQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlcHJlY2F0ZWRGaWVsZChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVwcmVjYXRlZEZpZWxkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZXByZWNhdGVkRmllbGRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZXByZWNhdGVkRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlcHJlY2F0ZWRGaWVsZCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlcHJlY2F0ZWRGaWVsZF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0RGVwcmVjYXRlZExpdGUoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdExpdGVQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorfQ0KKw0KKyNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUNCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0UHJvdG9GaWxlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdFByb3RvRmlsZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDMxYzY3Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdFByb3RvRmlsZS5jcwpAQCAtMCwwICsxLDIxNjAyIEBACisvLyBHZW5lcmF0ZWQgYnkgUHJvdG9HZW4sIFZlcnNpb249Mi40LjEuNTU1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTU1ZjcxMjUyMzRiZWI1ODkuICBETyBOT1QgRURJVCENCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxDQorI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KKw0KK3VzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zIHsNCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBVbml0VGVzdFByb3RvRmlsZSB7DQorICANCisgICAgI3JlZ2lvbiBFeHRlbnNpb24gcmVnaXN0cmF0aW9uDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3RlckFsbEV4dGVuc2lvbnMocGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEludDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxVaW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFVpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTaW50NjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZpeGVkNjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRmxvYXRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbERvdWJsZUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsQm9vbEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxCeXRlc0V4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsR3JvdXBFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbENvcmRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEludDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkVWludDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRVaW50NjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFNpbnQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEZsb2F0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWREb3VibGVFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEJvb2xFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ0V4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkQnl0ZXNFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEdyb3VwRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRDb3JkRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEludDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEludDY0RXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFVpbnQzMkV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRVaW50NjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ludDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNpbnQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZpeGVkNjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0RmxvYXRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0RG91YmxlRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEJvb2xFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U3RyaW5nRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEJ5dGVzRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRDb3JkRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuTXlFeHRlbnNpb25TdHJpbmcpOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5NeUV4dGVuc2lvbkludCk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEludDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkSW50NjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRVaW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRVaW50NjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTaW50MzJFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRTaW50NjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGaXhlZDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRml4ZWQ2NEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ZpeGVkNjRFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGbG9hdEV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZERvdWJsZUV4dGVuc2lvbik7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEJvb2xFeHRlbnNpb24pOw0KKyAgICAgIHJlZ2lzdHJ5LkFkZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRFbnVtRXh0ZW5zaW9uKTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZEV4dGVuc2lvbi5UZXN0KTsNCisgICAgICByZWdpc3RyeS5BZGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLlNpbmdsZSk7DQorICAgICAgcmVnaXN0cnkuQWRkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5NdWx0aSk7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbnMNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGludD4gT3B0aW9uYWxJbnQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEludDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSAyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGxvbmc+IE9wdGlvbmFsSW50NjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxVaW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDM7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHVpbnQ+IE9wdGlvbmFsVWludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsVWludDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA0Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTx1bG9uZz4gT3B0aW9uYWxVaW50NjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTaW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8aW50PiBPcHRpb25hbFNpbnQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFNpbnQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxsb25nPiBPcHRpb25hbFNpbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEZpeGVkMzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDc7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHVpbnQ+IE9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEZpeGVkNjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDg7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHVsb25nPiBPcHRpb25hbEZpeGVkNjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gOTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxpbnQ+IE9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTA7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8bG9uZz4gT3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEZsb2F0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxMTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxmbG9hdD4gT3B0aW9uYWxGbG9hdEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbERvdWJsZUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8ZG91YmxlPiBPcHRpb25hbERvdWJsZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEJvb2xFeHRlbnNpb25GaWVsZE51bWJlciA9IDEzOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGJvb2w+IE9wdGlvbmFsQm9vbEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFN0cmluZ0V4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTQ7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c3RyaW5nPiBPcHRpb25hbFN0cmluZ0V4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEJ5dGVzRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxNTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxwYjo6Qnl0ZVN0cmluZz4gT3B0aW9uYWxCeXRlc0V4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEdyb3VwRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxNjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PcHRpb25hbEdyb3VwX2V4dGVuc2lvbj4gT3B0aW9uYWxHcm91cEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25GaWVsZE51bWJlciA9IDE4Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPiBPcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTk7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAyMDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlPiBPcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAyMTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bT4gT3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25GaWVsZE51bWJlciA9IDIyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiBPcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMjM7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4gT3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb25GaWVsZE51bWJlciA9IDI0Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHN0cmluZz4gT3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbENvcmRFeHRlbnNpb25GaWVsZE51bWJlciA9IDI1Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHN0cmluZz4gT3B0aW9uYWxDb3JkRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDMxOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8aW50Pj4gUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEludDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSAzMjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGxvbmc+PiBSZXBlYXRlZEludDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkVWludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAzMzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDx1aW50Pj4gUmVwZWF0ZWRVaW50MzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRVaW50NjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDM0Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHVsb25nPj4gUmVwZWF0ZWRVaW50NjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTaW50MzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDM1Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8aW50Pj4gUmVwZWF0ZWRTaW50MzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTaW50NjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDM2Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8bG9uZz4+IFJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMzc7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8dWludD4+IFJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDM4Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHVsb25nPj4gUmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDM5Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8aW50Pj4gUmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA0MDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGxvbmc+PiBSZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRmxvYXRFeHRlbnNpb25GaWVsZE51bWJlciA9IDQxOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8ZmxvYXQ+PiBSZXBlYXRlZEZsb2F0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA0MjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGRvdWJsZT4+IFJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkQm9vbEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNDM7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxib29sPj4gUmVwZWF0ZWRCb29sRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA0NDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PHN0cmluZz4+IFJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkQnl0ZXNFeHRlbnNpb25GaWVsZE51bWJlciA9IDQ1Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8cGI6OkJ5dGVTdHJpbmc+PiBSZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkR3JvdXBFeHRlbnNpb25GaWVsZE51bWJlciA9IDQ2Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVwZWF0ZWRHcm91cF9leHRlbnNpb24+PiBSZXBlYXRlZEdyb3VwRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNDg7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZT4+IFJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA0OTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPj4gUmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25GaWVsZE51bWJlciA9IDUwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZT4+IFJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25GaWVsZE51bWJlciA9IDUxOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+PiBSZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNTI7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4+IFJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA1MzsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0+PiBSZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNTQ7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxzdHJpbmc+PiBSZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkQ29yZEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNTU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxzdHJpbmc+PiBSZXBlYXRlZENvcmRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA2MTsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxpbnQ+IERlZmF1bHRJbnQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0SW50NjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDYyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGxvbmc+IERlZmF1bHRJbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0VWludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA2MzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8dWludD4gRGVmYXVsdFVpbnQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0VWludDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA2NDsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8dWxvbmc+IERlZmF1bHRVaW50NjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFNpbnQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNjU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8aW50PiBEZWZhdWx0U2ludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTaW50NjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDY2Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGxvbmc+IERlZmF1bHRTaW50NjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEZpeGVkMzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDY3Ow0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTx1aW50PiBEZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNjg7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHVsb25nPiBEZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDY5Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGludD4gRGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNzA7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8bG9uZz4gRGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRGbG9hdEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNzE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8ZmxvYXQ+IERlZmF1bHRGbG9hdEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0RG91YmxlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA3MjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxkb3VibGU+IERlZmF1bHREb3VibGVFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEJvb2xFeHRlbnNpb25GaWVsZE51bWJlciA9IDczOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGJvb2w+IERlZmF1bHRCb29sRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTdHJpbmdFeHRlbnNpb25GaWVsZE51bWJlciA9IDc0Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHN0cmluZz4gRGVmYXVsdFN0cmluZ0V4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0Qnl0ZXNFeHRlbnNpb25GaWVsZE51bWJlciA9IDc1Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHBiOjpCeXRlU3RyaW5nPiBEZWZhdWx0Qnl0ZXNFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25GaWVsZE51bWJlciA9IDgxOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtPiBEZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb25GaWVsZE51bWJlciA9IDgyOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiBEZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb25GaWVsZE51bWJlciA9IDgzOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0+IERlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gODQ7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c3RyaW5nPiBEZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdENvcmRFeHRlbnNpb25GaWVsZE51bWJlciA9IDg1Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHN0cmluZz4gRGVmYXVsdENvcmRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgTXlFeHRlbnNpb25TdHJpbmdGaWVsZE51bWJlciA9IDUwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHN0cmluZz4gTXlFeHRlbnNpb25TdHJpbmc7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgTXlFeHRlbnNpb25JbnRGaWVsZE51bWJlciA9IDU7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8aW50PiBNeUV4dGVuc2lvbkludDsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRJbnQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyID0gOTA7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxpbnQ+PiBQYWNrZWRJbnQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRJbnQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gOTE7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxsb25nPj4gUGFja2VkSW50NjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkVWludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5MjsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDx1aW50Pj4gUGFja2VkVWludDMyRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFVpbnQ2NEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gOTM7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8dWxvbmc+PiBQYWNrZWRVaW50NjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkU2ludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5NDsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGludD4+IFBhY2tlZFNpbnQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTaW50NjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDk1Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8bG9uZz4+IFBhY2tlZFNpbnQ2NEV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRGaXhlZDMyRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5NjsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDx1aW50Pj4gUGFja2VkRml4ZWQzMkV4dGVuc2lvbjsNCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRGaXhlZDY0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSA5NzsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDx1bG9uZz4+IFBhY2tlZEZpeGVkNjRFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkU2ZpeGVkMzJFeHRlbnNpb25GaWVsZE51bWJlciA9IDk4Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8aW50Pj4gUGFja2VkU2ZpeGVkMzJFeHRlbnNpb247DQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkU2ZpeGVkNjRFeHRlbnNpb25GaWVsZE51bWJlciA9IDk5Ow0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8bG9uZz4+IFBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEZsb2F0RXh0ZW5zaW9uRmllbGROdW1iZXIgPSAxMDA7DQorICAgIHB1YmxpYyBzdGF0aWMgcGI6OkdlbmVyYXRlZEV4dGVuc2lvbkJhc2U8c2NnOjpJTGlzdDxmbG9hdD4+IFBhY2tlZEZsb2F0RXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZERvdWJsZUV4dGVuc2lvbkZpZWxkTnVtYmVyID0gMTAxOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8ZG91YmxlPj4gUGFja2VkRG91YmxlRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEJvb2xFeHRlbnNpb25GaWVsZE51bWJlciA9IDEwMjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGJvb2w+PiBQYWNrZWRCb29sRXh0ZW5zaW9uOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEVudW1FeHRlbnNpb25GaWVsZE51bWJlciA9IDEwMzsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPj4gUGFja2VkRW51bUV4dGVuc2lvbjsNCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgI3JlZ2lvbiBTdGF0aWMgdmFyaWFibGVzDQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfT3B0aW9uYWxHcm91cF9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19SZXBlYXRlZEdyb3VwX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfUmVwZWF0ZWRHcm91cF9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REZXByZWNhdGVkRmllbGRzX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RGVwcmVjYXRlZEZpZWxkcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdERlcHJlY2F0ZWRGaWVsZHMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RGVwcmVjYXRlZEZpZWxkc19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0ZvcmVpZ25NZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb3JlaWduTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxFeHRlbnNpb25zX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PcHRpb25hbEdyb3VwX2V4dGVuc2lvbiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT3B0aW9uYWxHcm91cF9leHRlbnNpb24uQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1JlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVwZWF0ZWRHcm91cF9leHRlbnNpb24uQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRFeHRlbnNpb25fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRFeHRlbnNpb24sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRFeHRlbnNpb24uQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkRXh0ZW5zaW9uX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZF9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZEZvcmVpZ25fX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZEZvcmVpZ24sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZEZvcmVpZ24uQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVxdWlyZWRGb3JlaWduX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEZvcmVpZ25OZXN0ZWRfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RGb3JlaWduTmVzdGVkLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0Rm9yZWlnbk5lc3RlZC5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGb3JlaWduTmVzdGVkX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtcHR5TWVzc2FnZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZS5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbXB0eU1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlc19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZWFsbHlMYXJnZVRhZ051bWJlcl9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVjdXJzaXZlTWVzc2FnZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11dHVhbFJlY3Vyc2lvbkFfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQl9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11dHVhbFJlY3Vyc2lvbkJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlciwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX0Zvb19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvbywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvby5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9Gb29fX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfQmFyX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX0Jhcl9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfTmVzdGVkTWVzc2FnZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzX05lc3RlZE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Q2FtZWxDYXNlRmllbGROYW1lc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RDYW1lbENhc2VGaWVsZE5hbWVzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RmllbGRPcmRlcmluZ3NfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RGaWVsZE9yZGVyaW5ncywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZpZWxkT3JkZXJpbmdzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEZpZWxkT3JkZXJpbmdzX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFeHRyZW1lRGVmYXVsdFZhbHVlc19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NwYXJzZUVudW1NZXNzYWdlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGFyc2VFbnVtTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BhcnNlRW51bU1lc3NhZ2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9TcGFyc2VFbnVtTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09uZVN0cmluZ19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lU3RyaW5nLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVTdHJpbmcuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVTdHJpbmdfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVCeXRlc19fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lQnl0ZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9uZUJ5dGVzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT25lQnl0ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkVHlwZXNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRUeXBlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFBhY2tlZFR5cGVzX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFVucGFja2VkVHlwZXNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZFR5cGVzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRUeXBlcy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RVbnBhY2tlZFR5cGVzX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFBhY2tlZEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9ucy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRFeHRlbnNpb25zX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REeW5hbWljRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REeW5hbWljRXh0ZW5zaW9uc19EeW5hbWljTWVzc2FnZVR5cGVfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljTWVzc2FnZVR5cGUsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljTWVzc2FnZVR5cGUuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHluYW1pY0V4dGVuc2lvbnNfRHluYW1pY01lc3NhZ2VUeXBlX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNfX0Rlc2NyaXB0b3I7DQorICAgIGludGVybmFsIHN0YXRpYyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcy5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzX19GaWVsZEFjY2Vzc29yVGFibGU7DQorICAgIGludGVybmFsIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9vUmVxdWVzdF9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVxdWVzdCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVxdWVzdC5CdWlsZGVyPiBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0Zvb1JlcXVlc3RfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXNwb25zZV9fRGVzY3JpcHRvcjsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVzcG9uc2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvb1Jlc3BvbnNlLkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9vUmVzcG9uc2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsNCisgICAgaW50ZXJuYWwgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXF1ZXN0X19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXF1ZXN0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXF1ZXN0LkJ1aWxkZXI+IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQmFyUmVxdWVzdF9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0JhclJlc3BvbnNlX19EZXNjcmlwdG9yOw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXNwb25zZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQmFyUmVzcG9uc2UuQnVpbGRlcj4gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlOw0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gRGVzY3JpcHRvcg0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6RmlsZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyBwYmQ6OkZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3I7DQorICAgIA0KKyAgICBzdGF0aWMgVW5pdFRlc3RQcm90b0ZpbGUoKSB7DQorICAgICAgYnl0ZVtdIGRlc2NyaXB0b3JEYXRhID0gZ2xvYmFsOjpTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKA0KKyAgICAgICAgICBzdHJpbmcuQ29uY2F0KA0KKyAgICAgICAgICAgICJDaDVuYjI5bmJHVXZjSEp2ZEc5aWRXWXZkVzVwZEhSbGMzUXVjSEp2ZEc4U0VYQnliM1J2WW5WbVgzVnUiLCANCisgICAgICAgICAgICAiYVhSMFpYTjBHaVJuYjI5bmJHVXZjSEp2ZEc5aWRXWXZZM05vWVhKd1gyOXdkR2x2Ym5NdWNISnZkRzhhIiwgDQorICAgICAgICAgICAgIkpXZHZiMmRzWlM5d2NtOTBiMkoxWmk5MWJtbDBkR1Z6ZEY5cGJYQnZjblF1Y0hKdmRHOGl1eFVLREZSbCIsIA0KKyAgICAgICAgICAgICJjM1JCYkd4VWVYQmxjeElXQ2c1dmNIUnBiMjVoYkY5cGJuUXpNaGdCSUFFb0JSSVdDZzV2Y0hScGIyNWgiLCANCisgICAgICAgICAgICAiYkY5cGJuUTJOQmdDSUFFb0F4SVhDZzl2Y0hScGIyNWhiRjkxYVc1ME16SVlBeUFCS0EwU0Z3b1BiM0IwIiwgDQorICAgICAgICAgICAgImFXOXVZV3hmZFdsdWREWTBHQVFnQVNnRUVoY0tEMjl3ZEdsdmJtRnNYM05wYm5Rek1oZ0ZJQUVvRVJJWCIsIA0KKyAgICAgICAgICAgICJDZzl2Y0hScGIyNWhiRjl6YVc1ME5qUVlCaUFCS0JJU0dBb1FiM0IwYVc5dVlXeGZabWw0WldRek1oZ0giLCANCisgICAgICAgICAgICAiSUFFb0J4SVlDaEJ2Y0hScGIyNWhiRjltYVhobFpEWTBHQWdnQVNnR0Voa0tFVzl3ZEdsdmJtRnNYM05tIiwgDQorICAgICAgICAgICAgImFYaGxaRE15R0FrZ0FTZ1BFaGtLRVc5d2RHbHZibUZzWDNObWFYaGxaRFkwR0FvZ0FTZ1FFaFlLRG05dyIsIA0KKyAgICAgICAgICAgICJkR2x2Ym1Gc1gyWnNiMkYwR0FzZ0FTZ0NFaGNLRDI5d2RHbHZibUZzWDJSdmRXSnNaUmdNSUFFb0FSSVYiLCANCisgICAgICAgICAgICAiQ2cxdmNIUnBiMjVoYkY5aWIyOXNHQTBnQVNnSUVoY0tEMjl3ZEdsdmJtRnNYM04wY21sdVp4Z09JQUVvIiwgDQorICAgICAgICAgICAgIkNSSVdDZzV2Y0hScGIyNWhiRjlpZVhSbGN4Z1BJQUVvREJKRUNnMXZjSFJwYjI1aGJHZHliM1Z3R0JBZyIsIA0KKyAgICAgICAgICAgICJBU2dLTWkwdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkZSNWNHVnpMazl3ZEdsdmJtRnMiLCANCisgICAgICAgICAgICAiUjNKdmRYQVNUZ29YYjNCMGFXOXVZV3hmYm1WemRHVmtYMjFsYzNOaFoyVVlFaUFCS0FzeUxTNXdjbTkwIiwgDQorICAgICAgICAgICAgImIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNWSGx3WlhNdVRtVnpkR1ZrVFdWemMyRm5aUkpEQ2hodiIsIA0KKyAgICAgICAgICAgICJjSFJwYjI1aGJGOW1iM0psYVdkdVgyMWxjM05oWjJVWUV5QUJLQXN5SVM1d2NtOTBiMkoxWmw5MWJtbDAiLCANCisgICAgICAgICAgICAiZEdWemRDNUdiM0psYVdkdVRXVnpjMkZuWlJKSUNoZHZjSFJwYjI1aGJGOXBiWEJ2Y25SZmJXVnpjMkZuIiwgDQorICAgICAgICAgICAgIlpSZ1VJQUVvQ3pJbkxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMFgybHRjRzl5ZEM1SmJYQnZjblJOWlhOeiIsIA0KKyAgICAgICAgICAgICJZV2RsRWtnS0ZHOXdkR2x2Ym1Gc1gyNWxjM1JsWkY5bGJuVnRHQlVnQVNnT01pb3VjSEp2ZEc5aWRXWmYiLCANCisgICAgICAgICAgICAiZFc1cGRIUmxjM1F1VkdWemRFRnNiRlI1Y0dWekxrNWxjM1JsWkVWdWRXMFNQUW9WYjNCMGFXOXVZV3hmIiwgDQorICAgICAgICAgICAgIlptOXlaV2xuYmw5bGJuVnRHQllnQVNnT01oNHVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVSbTl5WldsbiIsIA0KKyAgICAgICAgICAgICJia1Z1ZFcwU1Fnb1ViM0IwYVc5dVlXeGZhVzF3YjNKMFgyVnVkVzBZRnlBQktBNHlKQzV3Y205MGIySjEiLCANCisgICAgICAgICAgICAiWmw5MWJtbDBkR1Z6ZEY5cGJYQnZjblF1U1cxd2IzSjBSVzUxYlJJaENoVnZjSFJwYjI1aGJGOXpkSEpwIiwgDQorICAgICAgICAgICAgImJtZGZjR2xsWTJVWUdDQUJLQWxDQWdnQ0Voa0tEVzl3ZEdsdmJtRnNYMk52Y21RWUdTQUJLQWxDQWdnQiIsIA0KKyAgICAgICAgICAgICJFaFlLRG5KbGNHVmhkR1ZrWDJsdWRETXlHQjhnQXlnRkVoWUtEbkpsY0dWaGRHVmtYMmx1ZERZMEdDQWciLCANCisgICAgICAgICAgICAiQXlnREVoY0tEM0psY0dWaGRHVmtYM1ZwYm5Rek1oZ2hJQU1vRFJJWENnOXlaWEJsWVhSbFpGOTFhVzUwIiwgDQorICAgICAgICAgICAgIk5qUVlJaUFES0FRU0Z3b1BjbVZ3WldGMFpXUmZjMmx1ZERNeUdDTWdBeWdSRWhjS0QzSmxjR1ZoZEdWayIsIA0KKyAgICAgICAgICAgICJYM05wYm5RMk5CZ2tJQU1vRWhJWUNoQnlaWEJsWVhSbFpGOW1hWGhsWkRNeUdDVWdBeWdIRWhnS0VISmwiLCANCisgICAgICAgICAgICAiY0dWaGRHVmtYMlpwZUdWa05qUVlKaUFES0FZU0dRb1JjbVZ3WldGMFpXUmZjMlpwZUdWa016SVlKeUFEIiwgDQorICAgICAgICAgICAgIktBOFNHUW9SY21Wd1pXRjBaV1JmYzJacGVHVmtOalFZS0NBREtCQVNGZ29PY21Wd1pXRjBaV1JmWm14diIsIA0KKyAgICAgICAgICAgICJZWFFZS1NBREtBSVNGd29QY21Wd1pXRjBaV1JmWkc5MVlteGxHQ29nQXlnQkVoVUtEWEpsY0dWaGRHVmsiLCANCisgICAgICAgICAgICAiWDJKdmIyd1lLeUFES0FnU0Z3b1BjbVZ3WldGMFpXUmZjM1J5YVc1bkdDd2dBeWdKRWhZS0RuSmxjR1ZoIiwgDQorICAgICAgICAgICAgImRHVmtYMko1ZEdWekdDMGdBeWdNRWtRS0RYSmxjR1ZoZEdWa1ozSnZkWEFZTGlBREtBb3lMUzV3Y205MCIsIA0KKyAgICAgICAgICAgICJiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBRV3hzVkhsd1pYTXVVbVZ3WldGMFpXUkhjbTkxY0JKT0NoZHkiLCANCisgICAgICAgICAgICAiWlhCbFlYUmxaRjl1WlhOMFpXUmZiV1Z6YzJGblpSZ3dJQU1vQ3pJdExuQnliM1J2WW5WbVgzVnVhWFIwIiwgDQorICAgICAgICAgICAgIlpYTjBMbFJsYzNSQmJHeFVlWEJsY3k1T1pYTjBaV1JOWlhOellXZGxFa01LR0hKbGNHVmhkR1ZrWDJadiIsIA0KKyAgICAgICAgICAgICJjbVZwWjI1ZmJXVnpjMkZuWlJneElBTW9DekloTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGtadmNtVnAiLCANCisgICAgICAgICAgICAiWjI1TlpYTnpZV2RsRWtnS0YzSmxjR1ZoZEdWa1gybHRjRzl5ZEY5dFpYTnpZV2RsR0RJZ0F5Z0xNaWN1IiwgDQorICAgICAgICAgICAgImNISnZkRzlpZFdaZmRXNXBkSFJsYzNSZmFXMXdiM0owTGtsdGNHOXlkRTFsYzNOaFoyVVNTQW9VY21WdyIsIA0KKyAgICAgICAgICAgICJaV0YwWldSZmJtVnpkR1ZrWDJWdWRXMFlNeUFES0E0eUtpNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVUiLCANCisgICAgICAgICAgICAiWlhOMFFXeHNWSGx3WlhNdVRtVnpkR1ZrUlc1MWJSSTlDaFZ5WlhCbFlYUmxaRjltYjNKbGFXZHVYMlZ1IiwgDQorICAgICAgICAgICAgImRXMFlOQ0FES0E0eUhpNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNUdiM0psYVdkdVJXNTFiUkpDQ2hSeSIsIA0KKyAgICAgICAgICAgICJaWEJsWVhSbFpGOXBiWEJ2Y25SZlpXNTFiUmcxSUFNb0RqSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjAiLCANCisgICAgICAgICAgICAiWDJsdGNHOXlkQzVKYlhCdmNuUkZiblZ0RWlFS0ZYSmxjR1ZoZEdWa1gzTjBjbWx1WjE5d2FXVmpaUmcyIiwgDQorICAgICAgICAgICAgIklBTW9DVUlDQ0FJU0dRb05jbVZ3WldGMFpXUmZZMjl5WkJnM0lBTW9DVUlDQ0FFU0dRb05aR1ZtWVhWcyIsIA0KKyAgICAgICAgICAgICJkRjlwYm5Rek1oZzlJQUVvQlRvQ05ERVNHUW9OWkdWbVlYVnNkRjlwYm5RMk5CZytJQUVvQXpvQ05ESVMiLCANCisgICAgICAgICAgICAiR2dvT1pHVm1ZWFZzZEY5MWFXNTBNeklZUHlBQktBMDZBalF6RWhvS0RtUmxabUYxYkhSZmRXbHVkRFkwIiwgDQorICAgICAgICAgICAgIkdFQWdBU2dFT2dJME5CSWJDZzVrWldaaGRXeDBYM05wYm5Rek1oaEJJQUVvRVRvRExUUTFFaG9LRG1SbCIsIA0KKyAgICAgICAgICAgICJabUYxYkhSZmMybHVkRFkwR0VJZ0FTZ1NPZ0kwTmhJYkNnOWtaV1poZFd4MFgyWnBlR1ZrTXpJWVF5QUIiLCANCisgICAgICAgICAgICAiS0FjNkFqUTNFaHNLRDJSbFptRjFiSFJmWm1sNFpXUTJOQmhFSUFFb0Jqb0NORGdTSEFvUVpHVm1ZWFZzIiwgDQorICAgICAgICAgICAgImRGOXpabWw0WldRek1oaEZJQUVvRHpvQ05Ea1NIUW9RWkdWbVlYVnNkRjl6Wm1sNFpXUTJOQmhHSUFFbyIsIA0KKyAgICAgICAgICAgICJFRG9ETFRVd0Voc0tEV1JsWm1GMWJIUmZabXh2WVhRWVJ5QUJLQUk2QkRVeExqVVNIUW9PWkdWbVlYVnMiLCANCisgICAgICAgICAgICAiZEY5a2IzVmliR1VZU0NBQktBRTZCVFV5TURBd0Vob0tER1JsWm1GMWJIUmZZbTl2YkJoSklBRW9DRG9FIiwgDQorICAgICAgICAgICAgImRISjFaUklkQ2c1a1pXWmhkV3gwWDNOMGNtbHVaeGhLSUFFb0NUb0ZhR1ZzYkc4U0hBb05aR1ZtWVhWcyIsIA0KKyAgICAgICAgICAgICJkRjlpZVhSbGN4aExJQUVvRERvRmQyOXliR1FTVEFvVFpHVm1ZWFZzZEY5dVpYTjBaV1JmWlc1MWJSaFIiLCANCisgICAgICAgICAgICAiSUFFb0RqSXFMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeFVlWEJsY3k1T1pYTjBaV1JGIiwgDQorICAgICAgICAgICAgImJuVnRPZ05DUVZJU1NRb1VaR1ZtWVhWc2RGOW1iM0psYVdkdVgyVnVkVzBZVWlBQktBNHlIaTV3Y205MCIsIA0KKyAgICAgICAgICAgICJiMkoxWmw5MWJtbDBkR1Z6ZEM1R2IzSmxhV2R1Ulc1MWJUb0xSazlTUlVsSFRsOUNRVklTVFFvVFpHVm0iLCANCisgICAgICAgICAgICAiWVhWc2RGOXBiWEJ2Y25SZlpXNTFiUmhUSUFFb0RqSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBYMmx0IiwgDQorICAgICAgICAgICAgImNHOXlkQzVKYlhCdmNuUkZiblZ0T2dwSlRWQlBVbFJmUWtGU0VpVUtGR1JsWm1GMWJIUmZjM1J5YVc1biIsIA0KKyAgICAgICAgICAgICJYM0JwWldObEdGUWdBU2dKT2dOaFltTkNBZ2dDRWgwS0RHUmxabUYxYkhSZlkyOXlaQmhWSUFFb0NUb0QiLCANCisgICAgICAgICAgICAiTVRJelFnSUlBUm9iQ2cxT1pYTjBaV1JOWlhOellXZGxFZ29LQW1KaUdBRWdBU2dGR2hvS0RVOXdkR2x2IiwgDQorICAgICAgICAgICAgImJtRnNSM0p2ZFhBU0NRb0JZUmdSSUFFb0JSb2FDZzFTWlhCbFlYUmxaRWR5YjNWd0Vna0tBV0VZTHlBQiIsIA0KKyAgICAgICAgICAgICJLQVVpSndvS1RtVnpkR1ZrUlc1MWJSSUhDZ05HVDA4UUFSSUhDZ05DUVZJUUFoSUhDZ05DUVZvUUF5STAiLCANCisgICAgICAgICAgICAiQ2hSVVpYTjBSR1Z3Y21WallYUmxaRVpwWld4a2N4SWNDaEJrWlhCeVpXTmhkR1ZrWDJsdWRETXlHQUVnIiwgDQorICAgICAgICAgICAgIkFTZ0ZRZ0lZQVNJYkNnNUdiM0psYVdkdVRXVnpjMkZuWlJJSkNnRmpHQUVnQVNnRkloMEtFVlJsYzNSQiIsIA0KKyAgICAgICAgICAgICJiR3hGZUhSbGJuTnBiMjV6S2dnSUFSQ0FnSUNBQWlJa0NoZFBjSFJwYjI1aGJFZHliM1Z3WDJWNGRHVnUiLCANCisgICAgICAgICAgICAiYzJsdmJoSUpDZ0ZoR0JFZ0FTZ0ZJaVFLRjFKbGNHVmhkR1ZrUjNKdmRYQmZaWGgwWlc1emFXOXVFZ2tLIiwgDQorICAgICAgICAgICAgIkFXRVlMeUFCS0FVaVVBb1RWR1Z6ZEU1bGMzUmxaRVY0ZEdWdWMybHZiakk1Q2dSMFpYTjBFaVF1Y0hKdiIsIA0KKyAgICAgICAgICAgICJkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWTZnY2dBU2dKT2dSMFpYTjAiLCANCisgICAgICAgICAgICAiSXRVRkNneFVaWE4wVW1WeGRXbHlaV1FTQ1FvQllSZ0JJQUlvQlJJT0NnWmtkVzF0ZVRJWUFpQUJLQVVTIiwgDQorICAgICAgICAgICAgIkNRb0JZaGdESUFJb0JSSU9DZ1prZFcxdGVUUVlCQ0FCS0FVU0Rnb0daSFZ0YlhrMUdBVWdBU2dGRWc0SyIsIA0KKyAgICAgICAgICAgICJCbVIxYlcxNU5oZ0dJQUVvQlJJT0NnWmtkVzF0ZVRjWUJ5QUJLQVVTRGdvR1pIVnRiWGs0R0FnZ0FTZ0YiLCANCisgICAgICAgICAgICAiRWc0S0JtUjFiVzE1T1JnSklBRW9CUklQQ2dka2RXMXRlVEV3R0FvZ0FTZ0ZFZzhLQjJSMWJXMTVNVEVZIiwgDQorICAgICAgICAgICAgIkN5QUJLQVVTRHdvSFpIVnRiWGt4TWhnTUlBRW9CUklQQ2dka2RXMXRlVEV6R0EwZ0FTZ0ZFZzhLQjJSMSIsIA0KKyAgICAgICAgICAgICJiVzE1TVRRWURpQUJLQVVTRHdvSFpIVnRiWGt4TlJnUElBRW9CUklQQ2dka2RXMXRlVEUyR0JBZ0FTZ0YiLCANCisgICAgICAgICAgICAiRWc4S0IyUjFiVzE1TVRjWUVTQUJLQVVTRHdvSFpIVnRiWGt4T0JnU0lBRW9CUklQQ2dka2RXMXRlVEU1IiwgDQorICAgICAgICAgICAgIkdCTWdBU2dGRWc4S0IyUjFiVzE1TWpBWUZDQUJLQVVTRHdvSFpIVnRiWGt5TVJnVklBRW9CUklQQ2dkayIsIA0KKyAgICAgICAgICAgICJkVzF0ZVRJeUdCWWdBU2dGRWc4S0IyUjFiVzE1TWpNWUZ5QUJLQVVTRHdvSFpIVnRiWGt5TkJnWUlBRW8iLCANCisgICAgICAgICAgICAiQlJJUENnZGtkVzF0ZVRJMUdCa2dBU2dGRWc4S0IyUjFiVzE1TWpZWUdpQUJLQVVTRHdvSFpIVnRiWGt5IiwgDQorICAgICAgICAgICAgIk54Z2JJQUVvQlJJUENnZGtkVzF0ZVRJNEdCd2dBU2dGRWc4S0IyUjFiVzE1TWprWUhTQUJLQVVTRHdvSCIsIA0KKyAgICAgICAgICAgICJaSFZ0Ylhrek1CZ2VJQUVvQlJJUENnZGtkVzF0ZVRNeEdCOGdBU2dGRWc4S0IyUjFiVzE1TXpJWUlDQUIiLCANCisgICAgICAgICAgICAiS0FVU0NRb0JZeGdoSUFJb0JUSldDZ1p6YVc1bmJHVVNKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVIiwgDQorICAgICAgICAgICAgIlpYTjBRV3hzUlhoMFpXNXphVzl1Y3hqb0J5QUJLQXN5SHk1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VSIsIA0KKyAgICAgICAgICAgICJaWE4wVW1WeGRXbHlaV1F5VlFvRmJYVnNkR2tTSkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjAiLCANCisgICAgICAgICAgICAiUVd4c1JYaDBaVzV6YVc5dWN4anBCeUFES0FzeUh5NXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wIiwgDQorICAgICAgICAgICAgIlVtVnhkV2x5WldRaW1nRUtFMVJsYzNSU1pYRjFhWEpsWkVadmNtVnBaMjRTT1FvUWIzQjBhVzl1WVd4ZiIsIA0KKyAgICAgICAgICAgICJiV1Z6YzJGblpSZ0JJQUVvQ3pJZkxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JTWlhGMWFYSmwiLCANCisgICAgICAgICAgICAiWkJJNUNoQnlaWEJsWVhSbFpGOXRaWE56WVdkbEdBSWdBeWdMTWg4dWNISnZkRzlpZFdaZmRXNXBkSFJsIiwgDQorICAgICAgICAgICAgImMzUXVWR1Z6ZEZKbGNYVnBjbVZrRWcwS0JXUjFiVzE1R0FNZ0FTZ0ZJbG9LRVZSbGMzUkdiM0psYVdkdSIsIA0KKyAgICAgICAgICAgICJUbVZ6ZEdWa0VrVUtEbVp2Y21WcFoyNWZibVZ6ZEdWa0dBRWdBU2dMTWkwdWNISnZkRzlpZFdaZmRXNXAiLCANCisgICAgICAgICAgICAiZEhSbGMzUXVWR1Z6ZEVGc2JGUjVjR1Z6TGs1bGMzUmxaRTFsYzNOaFoyVWlFZ29RVkdWemRFVnRjSFI1IiwgDQorICAgICAgICAgICAgIlRXVnpjMkZuWlNJcUNoNVVaWE4wUlcxd2RIbE5aWE56WVdkbFYybDBhRVY0ZEdWdWMybHZibk1xQ0FnQiIsIA0KKyAgICAgICAgICAgICJFSUNBZ0lBQ0lqY0tHMVJsYzNSTmRXeDBhWEJzWlVWNGRHVnVjMmx2YmxKaGJtZGxjeW9FQ0NvUUt5b0ciLCANCisgICAgICAgICAgICAiQ0s4Z0VKUWhLZ29JZ0lBRUVJQ0FnSUFDSWpRS0dGUmxjM1JTWldGc2JIbE1ZWEpuWlZSaFowNTFiV0psIiwgDQorICAgICAgICAgICAgImNoSUpDZ0ZoR0FFZ0FTZ0ZFZzBLQW1KaUdQLy8vMzhnQVNnRklsVUtGRlJsYzNSU1pXTjFjbk5wZG1WTiIsIA0KKyAgICAgICAgICAgICJaWE56WVdkbEVqSUtBV0VZQVNBQktBc3lKeTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFVtVmoiLCANCisgICAgICAgICAgICAiZFhKemFYWmxUV1Z6YzJGblpSSUpDZ0ZwR0FJZ0FTZ0ZJa3NLRkZSbGMzUk5kWFIxWVd4U1pXTjFjbk5wIiwgDQorICAgICAgICAgICAgImIyNUJFak1LQW1KaUdBRWdBU2dMTWljdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRTExZEhWaCIsIA0KKyAgICAgICAgICAgICJiRkpsWTNWeWMybHZia0lpWWdvVVZHVnpkRTExZEhWaGJGSmxZM1Z5YzJsdmJrSVNNZ29CWVJnQklBRW8iLCANCisgICAgICAgICAgICAiQ3pJbkxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JOZFhSMVlXeFNaV04xY25OcGIyNUJFaFlLIiwgDQorICAgICAgICAgICAgIkRtOXdkR2x2Ym1Gc1gybHVkRE15R0FJZ0FTZ0ZJck1CQ2hKVVpYTjBSSFZ3Um1sbGJHUk9kVzFpWlhJUyIsIA0KKyAgICAgICAgICAgICJDUW9CWVJnQklBRW9CUkkyQ2dObWIyOFlBaUFCS0FveUtTNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVUiLCANCisgICAgICAgICAgICAiWlhOMFJIVndSbWxsYkdST2RXMWlaWEl1Um05dkVqWUtBMkpoY2hnRElBRW9DaklwTG5CeWIzUnZZblZtIiwgDQorICAgICAgICAgICAgIlgzVnVhWFIwWlhOMExsUmxjM1JFZFhCR2FXVnNaRTUxYldKbGNpNUNZWElhRUFvRFJtOXZFZ2tLQVdFWSIsIA0KKyAgICAgICAgICAgICJBU0FCS0FVYUVBb0RRbUZ5RWdrS0FXRVlBU0FCS0FVaWdBSUtHRlJsYzNST1pYTjBaV1JOWlhOellXZGwiLCANCisgICAgICAgICAgICAiU0dGelFtbDBjeEphQ2hkdmNIUnBiMjVoYkY5dVpYTjBaV1JmYldWemMyRm5aUmdCSUFFb0N6STVMbkJ5IiwgDQorICAgICAgICAgICAgImIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUk9aWE4wWldSTlpYTnpZV2RsU0dGelFtbDBjeTVPWlhOMCIsIA0KKyAgICAgICAgICAgICJaV1JOWlhOellXZGxHb2NCQ2cxT1pYTjBaV1JOWlhOellXZGxFaVFLSEc1bGMzUmxaRzFsYzNOaFoyVmYiLCANCisgICAgICAgICAgICAiY21Wd1pXRjBaV1JmYVc1ME16SVlBU0FES0FVU1VBb2xibVZ6ZEdWa2JXVnpjMkZuWlY5eVpYQmxZWFJsIiwgDQorICAgICAgICAgICAgIlpGOW1iM0psYVdkdWJXVnpjMkZuWlJnQ0lBTW9DekloTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGtadiIsIA0KKyAgICAgICAgICAgICJjbVZwWjI1TlpYTnpZV2RsSXVVRENoZFVaWE4wUTJGdFpXeERZWE5sUm1sbGJHUk9ZVzFsY3hJV0NnNVEiLCANCisgICAgICAgICAgICAiY21sdGFYUnBkbVZHYVdWc1pCZ0JJQUVvQlJJVENndFRkSEpwYm1kR2FXVnNaQmdDSUFFb0NSSXhDZ2xGIiwgDQorICAgICAgICAgICAgImJuVnRSbWxsYkdRWUF5QUJLQTR5SGk1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1R2IzSmxhV2R1Ulc1MSIsIA0KKyAgICAgICAgICAgICJiUkkzQ2d4TlpYTnpZV2RsUm1sbGJHUVlCQ0FCS0FzeUlTNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNUciLCANCisgICAgICAgICAgICAiYjNKbGFXZHVUV1Z6YzJGblpSSWNDaEJUZEhKcGJtZFFhV1ZqWlVacFpXeGtHQVVnQVNnSlFnSUlBaElWIiwgDQorICAgICAgICAgICAgIkNnbERiM0prUm1sbGJHUVlCaUFCS0FsQ0FnZ0JFaDRLRmxKbGNHVmhkR1ZrVUhKcGJXbDBhWFpsUm1sbCIsIA0KKyAgICAgICAgICAgICJiR1FZQnlBREtBVVNHd29UVW1Wd1pXRjBaV1JUZEhKcGJtZEdhV1ZzWkJnSUlBTW9DUkk1Q2hGU1pYQmwiLCANCisgICAgICAgICAgICAiWVhSbFpFVnVkVzFHYVdWc1pCZ0pJQU1vRGpJZUxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExrWnZjbVZwIiwgDQorICAgICAgICAgICAgIloyNUZiblZ0RWo4S0ZGSmxjR1ZoZEdWa1RXVnpjMkZuWlVacFpXeGtHQW9nQXlnTE1pRXVjSEp2ZEc5aSIsIA0KKyAgICAgICAgICAgICJkV1pmZFc1cGRIUmxjM1F1Um05eVpXbG5iazFsYzNOaFoyVVNKQW9ZVW1Wd1pXRjBaV1JUZEhKcGJtZFEiLCANCisgICAgICAgICAgICAiYVdWalpVWnBaV3hrR0FzZ0F5Z0pRZ0lJQWhJZENoRlNaWEJsWVhSbFpFTnZjbVJHYVdWc1pCZ01JQU1vIiwgDQorICAgICAgICAgICAgIkNVSUNDQUVpVlFvU1ZHVnpkRVpwWld4a1QzSmtaWEpwYm1kekVoRUtDVzE1WDNOMGNtbHVaeGdMSUFFbyIsIA0KKyAgICAgICAgICAgICJDUklPQ2dadGVWOXBiblFZQVNBQktBTVNFQW9JYlhsZlpteHZZWFFZWlNBQktBSXFCQWdDRUFzcUJBZ00iLCANCisgICAgICAgICAgICAiRUdVaW93VUtHRlJsYzNSRmVIUnlaVzFsUkdWbVlYVnNkRlpoYkhWbGN4SS9DZzFsYzJOaGNHVmtYMko1IiwgDQorICAgICAgICAgICAgImRHVnpHQUVnQVNnTU9paGNNREF3WERBd01Wd3dNRGRjTURFd1hEQXhORnh1WEhKY2RGd3dNVE5jWEZ3biIsIA0KKyAgICAgICAgICAgICJYQ0pjTXpjMkVpQUtER3hoY21kbFgzVnBiblF6TWhnQ0lBRW9EVG9LTkRJNU5EazJOekk1TlJJcUNneHMiLCANCisgICAgICAgICAgICAiWVhKblpWOTFhVzUwTmpRWUF5QUJLQVE2RkRFNE5EUTJOelEwTURjek56QTVOVFV4TmpFMUVpQUtDM050IiwgDQorICAgICAgICAgICAgIllXeHNYMmx1ZERNeUdBUWdBU2dGT2dzdE1qRTBOelE0TXpZME54SXBDZ3R6YldGc2JGOXBiblEyTkJnRiIsIA0KKyAgICAgICAgICAgICJJQUVvQXpvVUxUa3lNak16TnpJd016WTROVFEzTnpVNE1EY1NHQW9MZFhSbU9GOXpkSEpwYm1jWUJpQUIiLCANCisgICAgICAgICAgICAiS0FrNkErR0l0QklWQ2dwNlpYSnZYMlpzYjJGMEdBY2dBU2dDT2dFd0VoUUtDVzl1WlY5bWJHOWhkQmdJIiwgDQorICAgICAgICAgICAgIklBRW9Bam9CTVJJWUNndHpiV0ZzYkY5bWJHOWhkQmdKSUFFb0Fqb0RNUzQxRWg0S0VtNWxaMkYwYVhabCIsIA0KKyAgICAgICAgICAgICJYMjl1WlY5bWJHOWhkQmdLSUFFb0Fqb0NMVEVTSEFvT2JtVm5ZWFJwZG1WZlpteHZZWFFZQ3lBQktBSTYiLCANCisgICAgICAgICAgICAiQkMweExqVVNHd29MYkdGeVoyVmZabXh2WVhRWURDQUJLQUk2QmpKbEt6QXdPQklsQ2hSemJXRnNiRjl1IiwgDQorICAgICAgICAgICAgIlpXZGhkR2wyWlY5bWJHOWhkQmdOSUFFb0Fqb0hMVGhsTFRBeU9CSVhDZ3BwYm1aZlpHOTFZbXhsR0E0ZyIsIA0KKyAgICAgICAgICAgICJBU2dCT2dOcGJtWVNIQW9PYm1WblgybHVabDlrYjNWaWJHVVlEeUFCS0FFNkJDMXBibVlTRndvS2JtRnUiLCANCisgICAgICAgICAgICAiWDJSdmRXSnNaUmdRSUFFb0FUb0RibUZ1RWhZS0NXbHVabDltYkc5aGRCZ1JJQUVvQWpvRGFXNW1FaHNLIiwgDQorICAgICAgICAgICAgIkRXNWxaMTlwYm1aZlpteHZZWFFZRWlBQktBSTZCQzFwYm1ZU0Znb0pibUZ1WDJac2IyRjBHQk1nQVNnQyIsIA0KKyAgICAgICAgICAgICJPZ051WVc0U0t3b01ZM0J3WDNSeWFXZHlZWEJvR0JRZ0FTZ0pPaFUvSUQ4Z1B6OGdQejhnUHo4L0lEOC8iLCANCisgICAgICAgICAgICAiTHlBL1B5MGlTd29SVTNCaGNuTmxSVzUxYlUxbGMzTmhaMlVTTmdvTGMzQmhjbk5sWDJWdWRXMFlBU0FCIiwgDQorICAgICAgICAgICAgIktBNHlJUzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFUzQmhjbk5sUlc1MWJTSVpDZ2xQYm1WVCIsIA0KKyAgICAgICAgICAgICJkSEpwYm1jU0RBb0VaR0YwWVJnQklBRW9DU0lZQ2doUGJtVkNlWFJsY3hJTUNnUmtZWFJoR0FFZ0FTZ00iLCANCisgICAgICAgICAgICAiSXFvRENnOVVaWE4wVUdGamEyVmtWSGx3WlhNU0dBb01jR0ZqYTJWa1gybHVkRE15R0ZvZ0F5Z0ZRZ0lRIiwgDQorICAgICAgICAgICAgIkFSSVlDZ3h3WVdOclpXUmZhVzUwTmpRWVd5QURLQU5DQWhBQkVoa0tEWEJoWTJ0bFpGOTFhVzUwTXpJWSIsIA0KKyAgICAgICAgICAgICJYQ0FES0ExQ0FoQUJFaGtLRFhCaFkydGxaRjkxYVc1ME5qUVlYU0FES0FSQ0FoQUJFaGtLRFhCaFkydGwiLCANCisgICAgICAgICAgICAiWkY5emFXNTBNeklZWGlBREtCRkNBaEFCRWhrS0RYQmhZMnRsWkY5emFXNTBOalFZWHlBREtCSkNBaEFCIiwgDQorICAgICAgICAgICAgIkVob0tEbkJoWTJ0bFpGOW1hWGhsWkRNeUdHQWdBeWdIUWdJUUFSSWFDZzV3WVdOclpXUmZabWw0WldRMiIsIA0KKyAgICAgICAgICAgICJOQmhoSUFNb0JrSUNFQUVTR3dvUGNHRmphMlZrWDNObWFYaGxaRE15R0dJZ0F5Z1BRZ0lRQVJJYkNnOXciLCANCisgICAgICAgICAgICAiWVdOclpXUmZjMlpwZUdWa05qUVlZeUFES0JCQ0FoQUJFaGdLREhCaFkydGxaRjltYkc5aGRCaGtJQU1vIiwgDQorICAgICAgICAgICAgIkFrSUNFQUVTR1FvTmNHRmphMlZrWDJSdmRXSnNaUmhsSUFNb0FVSUNFQUVTRndvTGNHRmphMlZrWDJKdiIsIA0KKyAgICAgICAgICAgICJiMndZWmlBREtBaENBaEFCRWpjS0MzQmhZMnRsWkY5bGJuVnRHR2NnQXlnT01oNHVjSEp2ZEc5aWRXWmYiLCANCisgICAgICAgICAgICAiZFc1cGRIUmxjM1F1Um05eVpXbG5ia1Z1ZFcxQ0FoQUJJc2dEQ2hGVVpYTjBWVzV3WVdOclpXUlVlWEJsIiwgDQorICAgICAgICAgICAgImN4SWFDZzUxYm5CaFkydGxaRjlwYm5Rek1oaGFJQU1vQlVJQ0VBQVNHZ29PZFc1d1lXTnJaV1JmYVc1MCIsIA0KKyAgICAgICAgICAgICJOalFZV3lBREtBTkNBaEFBRWhzS0QzVnVjR0ZqYTJWa1gzVnBiblF6TWhoY0lBTW9EVUlDRUFBU0d3b1AiLCANCisgICAgICAgICAgICAiZFc1d1lXTnJaV1JmZFdsdWREWTBHRjBnQXlnRVFnSVFBQkliQ2c5MWJuQmhZMnRsWkY5emFXNTBNeklZIiwgDQorICAgICAgICAgICAgIlhpQURLQkZDQWhBQUVoc0tEM1Z1Y0dGamEyVmtYM05wYm5RMk5CaGZJQU1vRWtJQ0VBQVNIQW9RZFc1dyIsIA0KKyAgICAgICAgICAgICJZV05yWldSZlptbDRaV1F6TWhoZ0lBTW9CMElDRUFBU0hBb1FkVzV3WVdOclpXUmZabWw0WldRMk5CaGgiLCANCisgICAgICAgICAgICAiSUFNb0JrSUNFQUFTSFFvUmRXNXdZV05yWldSZmMyWnBlR1ZrTXpJWVlpQURLQTlDQWhBQUVoMEtFWFZ1IiwgDQorICAgICAgICAgICAgImNHRmphMlZrWDNObWFYaGxaRFkwR0dNZ0F5Z1FRZ0lRQUJJYUNnNTFibkJoWTJ0bFpGOW1iRzloZEJoayIsIA0KKyAgICAgICAgICAgICJJQU1vQWtJQ0VBQVNHd29QZFc1d1lXTnJaV1JmWkc5MVlteGxHR1VnQXlnQlFnSVFBQklaQ2cxMWJuQmgiLCANCisgICAgICAgICAgICAiWTJ0bFpGOWliMjlzR0dZZ0F5Z0lRZ0lRQUJJNUNnMTFibkJoWTJ0bFpGOWxiblZ0R0djZ0F5Z09NaDR1IiwgDQorICAgICAgICAgICAgImNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVJtOXlaV2xuYmtWdWRXMUNBaEFBSWlBS0ZGUmxjM1JRWVdOciIsIA0KKyAgICAgICAgICAgICJaV1JGZUhSbGJuTnBiMjV6S2dnSUFSQ0FnSUNBQWlLWkJBb1ZWR1Z6ZEVSNWJtRnRhV05GZUhSbGJuTnAiLCANCisgICAgICAgICAgICAiYjI1ekVoa0tFSE5qWVd4aGNsOWxlSFJsYm5OcGIyNFkwQThnQVNnSEVqY0tEbVZ1ZFcxZlpYaDBaVzV6IiwgDQorICAgICAgICAgICAgImFXOXVHTkVQSUFFb0RqSWVMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMa1p2Y21WcFoyNUZiblZ0RWxrSyIsIA0KKyAgICAgICAgICAgICJGbVI1Ym1GdGFXTmZaVzUxYlY5bGVIUmxibk5wYjI0WTBnOGdBU2dPTWpndWNISnZkRzlpZFdaZmRXNXAiLCANCisgICAgICAgICAgICAiZEhSbGMzUXVWR1Z6ZEVSNWJtRnRhV05GZUhSbGJuTnBiMjV6TGtSNWJtRnRhV05GYm5WdFZIbHdaUkk5IiwgDQorICAgICAgICAgICAgIkNoRnRaWE56WVdkbFgyVjRkR1Z1YzJsdmJoalREeUFCS0FzeUlTNXdjbTkwYjJKMVpsOTFibWwwZEdWeiIsIA0KKyAgICAgICAgICAgICJkQzVHYjNKbGFXZHVUV1Z6YzJGblpSSmZDaGxrZVc1aGJXbGpYMjFsYzNOaFoyVmZaWGgwWlc1emFXOXUiLCANCisgICAgICAgICAgICAiR05RUElBRW9Dekk3TG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkVlVzVoYldsalJYaDBaVzV6IiwgDQorICAgICAgICAgICAgImFXOXVjeTVFZVc1aGJXbGpUV1Z6YzJGblpWUjVjR1VTR3dvU2NtVndaV0YwWldSZlpYaDBaVzV6YVc5dSIsIA0KKyAgICAgICAgICAgICJHTlVQSUFNb0NSSWRDaEJ3WVdOclpXUmZaWGgwWlc1emFXOXVHTllQSUFNb0VVSUNFQUVhTEFvU1JIbHUiLCANCisgICAgICAgICAgICAiWVcxcFkwMWxjM05oWjJWVWVYQmxFaFlLRFdSNWJtRnRhV05mWm1sbGJHUVl0QkFnQVNnRklrY0tEMFI1IiwgDQorICAgICAgICAgICAgImJtRnRhV05GYm5WdFZIbHdaUklRQ2d0RVdVNUJUVWxEWDBaUFR4Q1lFUklRQ2d0RVdVNUJUVWxEWDBKQiIsIA0KKyAgICAgICAgICAgICJVaENaRVJJUUNndEVXVTVCVFVsRFgwSkJXaENhRVNMQUFRb2pWR1Z6ZEZKbGNHVmhkR1ZrVTJOaGJHRnkiLCANCisgICAgICAgICAgICAiUkdsbVptVnlaVzUwVkdGblUybDZaWE1TR0FvUWNtVndaV0YwWldSZlptbDRaV1F6TWhnTUlBTW9CeElXIiwgDQorICAgICAgICAgICAgIkNnNXlaWEJsWVhSbFpGOXBiblF6TWhnTklBTW9CUklaQ2hCeVpYQmxZWFJsWkY5bWFYaGxaRFkwR1A0UCIsIA0KKyAgICAgICAgICAgICJJQU1vQmhJWENnNXlaWEJsWVhSbFpGOXBiblEyTkJqL0R5QURLQU1TR0FvT2NtVndaV0YwWldSZlpteHYiLCANCisgICAgICAgICAgICAiWVhRWS92OFBJQU1vQWhJWkNnOXlaWEJsWVhSbFpGOTFhVzUwTmpRWS8vOFBJQU1vQkNJTUNncEdiMjlTIiwgDQorICAgICAgICAgICAgIlpYRjFaWE4wSWcwS0MwWnZiMUpsYzNCdmJuTmxJZ3dLQ2tKaGNsSmxjWFZsYzNRaURRb0xRbUZ5VW1WeiIsIA0KKyAgICAgICAgICAgICJjRzl1YzJVcVFBb0xSbTl5WldsbmJrVnVkVzBTRHdvTFJrOVNSVWxIVGw5R1QwOFFCQklQQ2d0R1QxSkYiLCANCisgICAgICAgICAgICAiU1VkT1gwSkJVaEFGRWc4S0MwWlBVa1ZKUjA1ZlFrRmFFQVlxUndvVVZHVnpkRVZ1ZFcxWGFYUm9SSFZ3IiwgDQorICAgICAgICAgICAgIlZtRnNkV1VTQ0FvRVJrOVBNUkFCRWdnS0JFSkJVakVRQWhJSENnTkNRVm9RQXhJSUNnUkdUMDh5RUFFUyIsIA0KKyAgICAgICAgICAgICJDQW9FUWtGU01oQUNLb2tCQ2c1VVpYTjBVM0JoY25ObFJXNTFiUklNQ2doVFVFRlNVMFZmUVJCN0VnNEsiLCANCisgICAgICAgICAgICAiQ0ZOUVFWSlRSVjlDRUtibkF4SVBDZ2hUVUVGU1UwVmZReEN5c1lBR0VoVUtDRk5RUVZKVFJWOUVFUEgvIiwgDQorICAgICAgICAgICAgIi8vLy8vLy8vL3dFU0ZRb0lVMUJCVWxORlgwVVF0Tjc4Ly8vLy8vLy9BUklNQ2doVFVFRlNVMFZmUmhBQSIsIA0KKyAgICAgICAgICAgICJFZ3dLQ0ZOUVFWSlRSVjlIRUFJeW1RRUtDMVJsYzNSVFpYSjJhV05sRWtRS0EwWnZieElkTG5CeWIzUnYiLCANCisgICAgICAgICAgICAiWW5WbVgzVnVhWFIwWlhOMExrWnZiMUpsY1hWbGMzUWFIaTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVHIiwgDQorICAgICAgICAgICAgImIyOVNaWE53YjI1elpSSkVDZ05DWVhJU0hTNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNUNZWEpTWlhGMSIsIA0KKyAgICAgICAgICAgICJaWE4wR2g0dWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVFtRnlVbVZ6Y0c5dWMyVTZSZ29ZYjNCMGFXOXUiLCANCisgICAgICAgICAgICAiWVd4ZmFXNTBNekpmWlhoMFpXNXphVzl1RWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzIiwgDQorICAgICAgICAgICAgImJFVjRkR1Z1YzJsdmJuTVlBU0FCS0FVNlJnb1liM0IwYVc5dVlXeGZhVzUwTmpSZlpYaDBaVzV6YVc5dSIsIA0KKyAgICAgICAgICAgICJFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZQWlBQktBTTYiLCANCisgICAgICAgICAgICAiUndvWmIzQjBhVzl1WVd4ZmRXbHVkRE15WDJWNGRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbVgzVnVhWFIwIiwgDQorICAgICAgICAgICAgIlpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHQU1nQVNnTk9rY0tHVzl3ZEdsdmJtRnNYM1ZwYm5RMiIsIA0KKyAgICAgICAgICAgICJORjlsZUhSbGJuTnBiMjRTSkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMFpXNXoiLCANCisgICAgICAgICAgICAiYVc5dWN4Z0VJQUVvQkRwSENobHZjSFJwYjI1aGJGOXphVzUwTXpKZlpYaDBaVzV6YVc5dUVpUXVjSEp2IiwgDQorICAgICAgICAgICAgImRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZQlNBQktCRTZSd29aYjNCMCIsIA0KKyAgICAgICAgICAgICJhVzl1WVd4ZmMybHVkRFkwWDJWNGRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmwiLCANCisgICAgICAgICAgICAiYzNSQmJHeEZlSFJsYm5OcGIyNXpHQVlnQVNnU09rZ0tHbTl3ZEdsdmJtRnNYMlpwZUdWa016SmZaWGgwIiwgDQorICAgICAgICAgICAgIlpXNXphVzl1RWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWSIsIA0KKyAgICAgICAgICAgICJCeUFCS0FjNlNBb2FiM0IwYVc5dVlXeGZabWw0WldRMk5GOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjEiLCANCisgICAgICAgICAgICAiWmw5MWJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMFpXNXphVzl1Y3hnSUlBRW9CanBKQ2h0dmNIUnBiMjVoIiwgDQorICAgICAgICAgICAgImJGOXpabWw0WldRek1sOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMCIsIA0KKyAgICAgICAgICAgICJRV3hzUlhoMFpXNXphVzl1Y3hnSklBRW9EenBKQ2h0dmNIUnBiMjVoYkY5elptbDRaV1EyTkY5bGVIUmwiLCANCisgICAgICAgICAgICAiYm5OcGIyNFNKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1emFXOXVjeGdLIiwgDQorICAgICAgICAgICAgIklBRW9FRHBHQ2hodmNIUnBiMjVoYkY5bWJHOWhkRjlsZUhSbGJuTnBiMjRTSkM1d2NtOTBiMkoxWmw5MSIsIA0KKyAgICAgICAgICAgICJibWwwZEdWemRDNVVaWE4wUVd4c1JYaDBaVzV6YVc5dWN4Z0xJQUVvQWpwSENobHZjSFJwYjI1aGJGOWsiLCANCisgICAgICAgICAgICAiYjNWaWJHVmZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0IiwgDQorICAgICAgICAgICAgImRHVnVjMmx2Ym5NWURDQUJLQUU2UlFvWGIzQjBhVzl1WVd4ZlltOXZiRjlsZUhSbGJuTnBiMjRTSkM1dyIsIA0KKyAgICAgICAgICAgICJjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVd4c1JYaDBaVzV6YVc5dWN4Z05JQUVvQ0RwSENobHYiLCANCisgICAgICAgICAgICAiY0hScGIyNWhiRjl6ZEhKcGJtZGZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1IiwgDQorICAgICAgICAgICAgIlZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWURpQUJLQWs2UmdvWWIzQjBhVzl1WVd4ZllubDBaWE5mWlhoMCIsIA0KKyAgICAgICAgICAgICJaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVkiLCANCisgICAgICAgICAgICAiRHlBQktBdzZjUW9YYjNCMGFXOXVZV3huY205MWNGOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxIiwgDQorICAgICAgICAgICAgImJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMFpXNXphVzl1Y3hnUUlBRW9DaklxTG5CeWIzUnZZblZtWDNWdSIsIA0KKyAgICAgICAgICAgICJhWFIwWlhOMExrOXdkR2x2Ym1Gc1IzSnZkWEJmWlhoMFpXNXphVzl1T240S0lXOXdkR2x2Ym1Gc1gyNWwiLCANCisgICAgICAgICAgICAiYzNSbFpGOXRaWE56WVdkbFgyVjRkR1Z1YzJsdmJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsIiwgDQorICAgICAgICAgICAgImMzUkJiR3hGZUhSbGJuTnBiMjV6R0JJZ0FTZ0xNaTB1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWeiIsIA0KKyAgICAgICAgICAgICJkRUZzYkZSNWNHVnpMazVsYzNSbFpFMWxjM05oWjJVNmN3b2liM0IwYVc5dVlXeGZabTl5WldsbmJsOXQiLCANCisgICAgICAgICAgICAiWlhOellXZGxYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGIiwgDQorICAgICAgICAgICAgImVIUmxibk5wYjI1ekdCTWdBU2dMTWlFdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVJtOXlaV2xuYmsxbCIsIA0KKyAgICAgICAgICAgICJjM05oWjJVNmVBb2hiM0IwYVc5dVlXeGZhVzF3YjNKMFgyMWxjM05oWjJWZlpYaDBaVzV6YVc5dUVpUXUiLCANCisgICAgICAgICAgICAiY0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZRkNBQktBc3lKeTV3IiwgDQorICAgICAgICAgICAgImNtOTBiMkoxWmw5MWJtbDBkR1Z6ZEY5cGJYQnZjblF1U1cxd2IzSjBUV1Z6YzJGblpUcDRDaDV2Y0hScCIsIA0KKyAgICAgICAgICAgICJiMjVoYkY5dVpYTjBaV1JmWlc1MWJWOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxYm1sMGRHVnoiLCANCisgICAgICAgICAgICAiZEM1VVpYTjBRV3hzUlhoMFpXNXphVzl1Y3hnVklBRW9EaklxTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wIiwgDQorICAgICAgICAgICAgIkxsUmxjM1JCYkd4VWVYQmxjeTVPWlhOMFpXUkZiblZ0T20wS0gyOXdkR2x2Ym1Gc1gyWnZjbVZwWjI1ZiIsIA0KKyAgICAgICAgICAgICJaVzUxYlY5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVd4c1JYaDAiLCANCisgICAgICAgICAgICAiWlc1emFXOXVjeGdXSUFFb0RqSWVMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMa1p2Y21WcFoyNUZiblZ0IiwgDQorICAgICAgICAgICAgIk9uSUtIbTl3ZEdsdmJtRnNYMmx0Y0c5eWRGOWxiblZ0WDJWNGRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbSIsIA0KKyAgICAgICAgICAgICJYM1Z1YVhSMFpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHQmNnQVNnT01pUXVjSEp2ZEc5aWRXWmYiLCANCisgICAgICAgICAgICAiZFc1cGRIUmxjM1JmYVcxd2IzSjBMa2x0Y0c5eWRFVnVkVzA2VVFvZmIzQjBhVzl1WVd4ZmMzUnlhVzVuIiwgDQorICAgICAgICAgICAgIlgzQnBaV05sWDJWNGRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JCYkd4RiIsIA0KKyAgICAgICAgICAgICJlSFJsYm5OcGIyNXpHQmdnQVNnSlFnSUlBanBKQ2hkdmNIUnBiMjVoYkY5amIzSmtYMlY0ZEdWdWMybHYiLCANCisgICAgICAgICAgICAiYmhJa0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JCYkd4RmVIUmxibk5wYjI1ekdCa2dBU2dKIiwgDQorICAgICAgICAgICAgIlFnSUlBVHBHQ2hoeVpYQmxZWFJsWkY5cGJuUXpNbDlsZUhSbGJuTnBiMjRTSkM1d2NtOTBiMkoxWmw5MSIsIA0KKyAgICAgICAgICAgICJibWwwZEdWemRDNVVaWE4wUVd4c1JYaDBaVzV6YVc5dWN4Z2ZJQU1vQlRwR0NoaHlaWEJsWVhSbFpGOXAiLCANCisgICAgICAgICAgICAiYm5RMk5GOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNSWGgwIiwgDQorICAgICAgICAgICAgIlpXNXphVzl1Y3hnZ0lBTW9BenBIQ2hseVpYQmxZWFJsWkY5MWFXNTBNekpmWlhoMFpXNXphVzl1RWlRdSIsIA0KKyAgICAgICAgICAgICJjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlJU0FES0EwNlJ3b1oiLCANCisgICAgICAgICAgICAiY21Wd1pXRjBaV1JmZFdsdWREWTBYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wIiwgDQorICAgICAgICAgICAgIkxsUmxjM1JCYkd4RmVIUmxibk5wYjI1ekdDSWdBeWdFT2tjS0dYSmxjR1ZoZEdWa1gzTnBiblF6TWw5bCIsIA0KKyAgICAgICAgICAgICJlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1emFXOXUiLCANCisgICAgICAgICAgICAiY3hnaklBTW9FVHBIQ2hseVpYQmxZWFJsWkY5emFXNTBOalJmWlhoMFpXNXphVzl1RWlRdWNISnZkRzlpIiwgDQorICAgICAgICAgICAgImRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlKQ0FES0JJNlNBb2FjbVZ3WldGMCIsIA0KKyAgICAgICAgICAgICJaV1JmWm1sNFpXUXpNbDlsZUhSbGJuTnBiMjRTSkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjAiLCANCisgICAgICAgICAgICAiUVd4c1JYaDBaVzV6YVc5dWN4Z2xJQU1vQnpwSUNocHlaWEJsWVhSbFpGOW1hWGhsWkRZMFgyVjRkR1Z1IiwgDQorICAgICAgICAgICAgImMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6R0NZZyIsIA0KKyAgICAgICAgICAgICJBeWdHT2trS0czSmxjR1ZoZEdWa1gzTm1hWGhsWkRNeVgyVjRkR1Z1YzJsdmJoSWtMbkJ5YjNSdlluVm0iLCANCisgICAgICAgICAgICAiWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6R0NjZ0F5Z1BPa2tLRzNKbGNHVmhkR1ZrIiwgDQorICAgICAgICAgICAgIlgzTm1hWGhsWkRZMFgyVjRkR1Z1YzJsdmJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQiIsIA0KKyAgICAgICAgICAgICJiR3hGZUhSbGJuTnBiMjV6R0NnZ0F5Z1FPa1lLR0hKbGNHVmhkR1ZrWDJac2IyRjBYMlY0ZEdWdWMybHYiLCANCisgICAgICAgICAgICAiYmhJa0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JCYkd4RmVIUmxibk5wYjI1ekdDa2dBeWdDIiwgDQorICAgICAgICAgICAgIk9rY0tHWEpsY0dWaGRHVmtYMlJ2ZFdKc1pWOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxYm1sMCIsIA0KKyAgICAgICAgICAgICJkR1Z6ZEM1VVpYTjBRV3hzUlhoMFpXNXphVzl1Y3hncUlBTW9BVHBGQ2hkeVpYQmxZWFJsWkY5aWIyOXMiLCANCisgICAgICAgICAgICAiWDJWNGRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JCYkd4RmVIUmxibk5wIiwgDQorICAgICAgICAgICAgImIyNXpHQ3NnQXlnSU9rY0tHWEpsY0dWaGRHVmtYM04wY21sdVoxOWxlSFJsYm5OcGIyNFNKQzV3Y205MCIsIA0KKyAgICAgICAgICAgICJiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMFpXNXphVzl1Y3hnc0lBTW9DVHBHQ2hoeVpYQmwiLCANCisgICAgICAgICAgICAiWVhSbFpGOWllWFJsYzE5bGVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wIiwgDQorICAgICAgICAgICAgIlFXeHNSWGgwWlc1emFXOXVjeGd0SUFNb0REcHhDaGR5WlhCbFlYUmxaR2R5YjNWd1gyVjRkR1Z1YzJsdiIsIA0KKyAgICAgICAgICAgICJiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6R0M0Z0F5Z0siLCANCisgICAgICAgICAgICAiTWlvdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVVtVndaV0YwWldSSGNtOTFjRjlsZUhSbGJuTnBiMjQ2IiwgDQorICAgICAgICAgICAgImZnb2hjbVZ3WldGMFpXUmZibVZ6ZEdWa1gyMWxjM05oWjJWZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aSIsIA0KKyAgICAgICAgICAgICJkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZTUNBREtBc3lMUzV3Y205MGIySjEiLCANCisgICAgICAgICAgICAiWmw5MWJtbDBkR1Z6ZEM1VVpYTjBRV3hzVkhsd1pYTXVUbVZ6ZEdWa1RXVnpjMkZuWlRwekNpSnlaWEJsIiwgDQorICAgICAgICAgICAgIllYUmxaRjltYjNKbGFXZHVYMjFsYzNOaFoyVmZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cCIsIA0KKyAgICAgICAgICAgICJkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWU1TQURLQXN5SVM1d2NtOTBiMkoxWmw5MWJtbDAiLCANCisgICAgICAgICAgICAiZEdWemRDNUdiM0psYVdkdVRXVnpjMkZuWlRwNENpRnlaWEJsWVhSbFpGOXBiWEJ2Y25SZmJXVnpjMkZuIiwgDQorICAgICAgICAgICAgIlpWOWxlSFJsYm5OcGIyNFNKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNSWGgwWlc1eiIsIA0KKyAgICAgICAgICAgICJhVzl1Y3hneUlBTW9DekluTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wWDJsdGNHOXlkQzVKYlhCdmNuUk4iLCANCisgICAgICAgICAgICAiWlhOellXZGxPbmdLSG5KbGNHVmhkR1ZrWDI1bGMzUmxaRjlsYm5WdFgyVjRkR1Z1YzJsdmJoSWtMbkJ5IiwgDQorICAgICAgICAgICAgImIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6R0RNZ0F5Z09NaW91Y0hKdiIsIA0KKyAgICAgICAgICAgICJkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkZSNWNHVnpMazVsYzNSbFpFVnVkVzA2YlFvZmNtVnciLCANCisgICAgICAgICAgICAiWldGMFpXUmZabTl5WldsbmJsOWxiblZ0WDJWNGRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbVgzVnVhWFIwIiwgDQorICAgICAgICAgICAgIlpYTjBMbFJsYzNSQmJHeEZlSFJsYm5OcGIyNXpHRFFnQXlnT01oNHVjSEp2ZEc5aWRXWmZkVzVwZEhSbCIsIA0KKyAgICAgICAgICAgICJjM1F1Um05eVpXbG5ia1Z1ZFcwNmNnb2VjbVZ3WldGMFpXUmZhVzF3YjNKMFgyVnVkVzFmWlhoMFpXNXoiLCANCisgICAgICAgICAgICAiYVc5dUVpUXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlOU0FEIiwgDQorICAgICAgICAgICAgIktBNHlKQzV3Y205MGIySjFabDkxYm1sMGRHVnpkRjlwYlhCdmNuUXVTVzF3YjNKMFJXNTFiVHBSQ2g5eSIsIA0KKyAgICAgICAgICAgICJaWEJsWVhSbFpGOXpkSEpwYm1kZmNHbGxZMlZmWlhoMFpXNXphVzl1RWlRdWNISnZkRzlpZFdaZmRXNXAiLCANCisgICAgICAgICAgICAiZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlOaUFES0FsQ0FnZ0NPa2tLRjNKbGNHVmhkR1ZrIiwgDQorICAgICAgICAgICAgIlgyTnZjbVJmWlhoMFpXNXphVzl1RWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNCIsIA0KKyAgICAgICAgICAgICJkR1Z1YzJsdmJuTVlOeUFES0FsQ0FnZ0JPa2tLRjJSbFptRjFiSFJmYVc1ME16SmZaWGgwWlc1emFXOXUiLCANCisgICAgICAgICAgICAiRWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWVBTQUJLQVU2IiwgDQorICAgICAgICAgICAgIkFqUXhPa2tLRjJSbFptRjFiSFJmYVc1ME5qUmZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cCIsIA0KKyAgICAgICAgICAgICJkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWVBpQUJLQU02QWpReU9rb0tHR1JsWm1GMWJIUmYiLCANCisgICAgICAgICAgICAiZFdsdWRETXlYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGIiwgDQorICAgICAgICAgICAgImVIUmxibk5wYjI1ekdEOGdBU2dOT2dJME16cEtDaGhrWldaaGRXeDBYM1ZwYm5RMk5GOWxlSFJsYm5OcCIsIA0KKyAgICAgICAgICAgICJiMjRTSkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBRV3hzUlhoMFpXNXphVzl1Y3hoQUlBRW8iLCANCisgICAgICAgICAgICAiQkRvQ05EUTZTd29ZWkdWbVlYVnNkRjl6YVc1ME16SmZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmIiwgDQorICAgICAgICAgICAgImRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNGRHVnVjMmx2Ym5NWVFTQUJLQkU2QXkwME5UcEtDaGhrWldaaCIsIA0KKyAgICAgICAgICAgICJkV3gwWDNOcGJuUTJORjlsZUhSbGJuTnBiMjRTSkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjAiLCANCisgICAgICAgICAgICAiUVd4c1JYaDBaVzV6YVc5dWN4aENJQUVvRWpvQ05EWTZTd29aWkdWbVlYVnNkRjltYVhobFpETXlYMlY0IiwgDQorICAgICAgICAgICAgImRHVnVjMmx2YmhJa0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JCYkd4RmVIUmxibk5wYjI1eiIsIA0KKyAgICAgICAgICAgICJHRU1nQVNnSE9nSTBOenBMQ2hsa1pXWmhkV3gwWDJacGVHVmtOalJmWlhoMFpXNXphVzl1RWlRdWNISnYiLCANCisgICAgICAgICAgICAiZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdmJuTVlSQ0FCS0FZNkFqUTRPa3dLIiwgDQorICAgICAgICAgICAgIkdtUmxabUYxYkhSZmMyWnBlR1ZrTXpKZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmZkVzVwZEhSbCIsIA0KKyAgICAgICAgICAgICJjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZUlNBQktBODZBalE1T2swS0dtUmxabUYxYkhSZmMyWnAiLCANCisgICAgICAgICAgICAiZUdWa05qUmZaWGgwWlc1emFXOXVFaVF1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0IiwgDQorICAgICAgICAgICAgImRHVnVjMmx2Ym5NWVJpQUJLQkE2QXkwMU1EcExDaGRrWldaaGRXeDBYMlpzYjJGMFgyVjRkR1Z1YzJsdiIsIA0KKyAgICAgICAgICAgICJiaElrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6R0VjZ0FTZ0MiLCANCisgICAgICAgICAgICAiT2dRMU1TNDFPazBLR0dSbFptRjFiSFJmWkc5MVlteGxYMlY0ZEdWdWMybHZiaElrTG5CeWIzUnZZblZtIiwgDQorICAgICAgICAgICAgIlgzVnVhWFIwWlhOMExsUmxjM1JCYkd4RmVIUmxibk5wYjI1ekdFZ2dBU2dCT2dVMU1qQXdNRHBLQ2haayIsIA0KKyAgICAgICAgICAgICJaV1poZFd4MFgySnZiMnhmWlhoMFpXNXphVzl1RWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnoiLCANCisgICAgICAgICAgICAiZEVGc2JFVjRkR1Z1YzJsdmJuTVlTU0FCS0FnNkJIUnlkV1U2VFFvWVpHVm1ZWFZzZEY5emRISnBibWRmIiwgDQorICAgICAgICAgICAgIlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVGc2JFVjRkR1Z1YzJsdiIsIA0KKyAgICAgICAgICAgICJibk1ZU2lBQktBazZCV2hsYkd4dk9rd0tGMlJsWm1GMWJIUmZZbmwwWlhOZlpYaDBaVzV6YVc5dUVpUXUiLCANCisgICAgICAgICAgICAiY0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZU3lBQktBdzZCWGR2IiwgDQorICAgICAgICAgICAgImNteGtPbndLSFdSbFptRjFiSFJmYm1WemRHVmtYMlZ1ZFcxZlpYaDBaVzV6YVc5dUVpUXVjSEp2ZEc5aSIsIA0KKyAgICAgICAgICAgICJkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZVVNBQktBNHlLaTV3Y205MGIySjEiLCANCisgICAgICAgICAgICAiWmw5MWJtbDBkR1Z6ZEM1VVpYTjBRV3hzVkhsd1pYTXVUbVZ6ZEdWa1JXNTFiVG9EUWtGU09ua0tIbVJsIiwgDQorICAgICAgICAgICAgIlptRjFiSFJmWm05eVpXbG5ibDlsYm5WdFgyVjRkR1Z1YzJsdmJoSWtMbkJ5YjNSdlluVm1YM1Z1YVhSMCIsIA0KKyAgICAgICAgICAgICJaWE4wTGxSbGMzUkJiR3hGZUhSbGJuTnBiMjV6R0ZJZ0FTZ09NaDR1Y0hKdmRHOWlkV1pmZFc1cGRIUmwiLCANCisgICAgICAgICAgICAiYzNRdVJtOXlaV2xuYmtWdWRXMDZDMFpQVWtWSlIwNWZRa0ZTT24wS0hXUmxabUYxYkhSZmFXMXdiM0owIiwgDQorICAgICAgICAgICAgIlgyVnVkVzFmWlhoMFpXNXphVzl1RWlRdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZzYkVWNCIsIA0KKyAgICAgICAgICAgICJkR1Z1YzJsdmJuTVlVeUFCS0E0eUpDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRGOXBiWEJ2Y25RdVNXMXciLCANCisgICAgICAgICAgICAiYjNKMFJXNTFiVG9LU1UxUVQxSlVYMEpCVWpwVkNoNWtaV1poZFd4MFgzTjBjbWx1WjE5d2FXVmpaVjlsIiwgDQorICAgICAgICAgICAgImVIUmxibk5wYjI0U0pDNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVd4c1JYaDBaVzV6YVc5dSIsIA0KKyAgICAgICAgICAgICJjeGhVSUFFb0NUb0RZV0pqUWdJSUFqcE5DaFprWldaaGRXeDBYMk52Y21SZlpYaDBaVzV6YVc5dUVpUXUiLCANCisgICAgICAgICAgICAiY0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRVY0ZEdWdWMybHZibk1ZVlNBQktBazZBekV5IiwgDQorICAgICAgICAgICAgIk0wSUNDQUU2UWdvVGJYbGZaWGgwWlc1emFXOXVYM04wY21sdVp4SWxMbkJ5YjNSdlluVm1YM1Z1YVhSMCIsIA0KKyAgICAgICAgICAgICJaWE4wTGxSbGMzUkdhV1ZzWkU5eVpHVnlhVzVuY3hneUlBRW9DVG8vQ2hCdGVWOWxlSFJsYm5OcGIyNWYiLCANCisgICAgICAgICAgICAiYVc1MEVpVXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEVacFpXeGtUM0prWlhKcGJtZHpHQVVnIiwgDQorICAgICAgICAgICAgIkFTZ0ZPa3NLRm5CaFkydGxaRjlwYm5Rek1sOWxlSFJsYm5OcGIyNFNKeTV3Y205MGIySjFabDkxYm1sMCIsIA0KKyAgICAgICAgICAgICJkR1Z6ZEM1VVpYTjBVR0ZqYTJWa1JYaDBaVzV6YVc5dWN4aGFJQU1vQlVJQ0VBRTZTd29XY0dGamEyVmsiLCANCisgICAgICAgICAgICAiWDJsdWREWTBYMlY0ZEdWdWMybHZiaEluTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUlFZV05yIiwgDQorICAgICAgICAgICAgIlpXUkZlSFJsYm5OcGIyNXpHRnNnQXlnRFFnSVFBVHBNQ2hkd1lXTnJaV1JmZFdsdWRETXlYMlY0ZEdWdSIsIA0KKyAgICAgICAgICAgICJjMmx2YmhJbkxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JRWVdOclpXUkZlSFJsYm5OcGIyNXoiLCANCisgICAgICAgICAgICAiR0Z3Z0F5Z05RZ0lRQVRwTUNoZHdZV05yWldSZmRXbHVkRFkwWDJWNGRHVnVjMmx2YmhJbkxuQnliM1J2IiwgDQorICAgICAgICAgICAgIlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSUVlXTnJaV1JGZUhSbGJuTnBiMjV6R0YwZ0F5Z0VRZ0lRQVRwTSIsIA0KKyAgICAgICAgICAgICJDaGR3WVdOclpXUmZjMmx1ZERNeVgyVjRkR1Z1YzJsdmJoSW5MbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjAiLCANCisgICAgICAgICAgICAiTGxSbGMzUlFZV05yWldSRmVIUmxibk5wYjI1ekdGNGdBeWdSUWdJUUFUcE1DaGR3WVdOclpXUmZjMmx1IiwgDQorICAgICAgICAgICAgImREWTBYMlY0ZEdWdWMybHZiaEluTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUlFZV05yWldSRiIsIA0KKyAgICAgICAgICAgICJlSFJsYm5OcGIyNXpHRjhnQXlnU1FnSVFBVHBOQ2hod1lXTnJaV1JmWm1sNFpXUXpNbDlsZUhSbGJuTnAiLCANCisgICAgICAgICAgICAiYjI0U0p5NXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wVUdGamEyVmtSWGgwWlc1emFXOXVjeGhnIiwgDQorICAgICAgICAgICAgIklBTW9CMElDRUFFNlRRb1ljR0ZqYTJWa1gyWnBlR1ZrTmpSZlpYaDBaVzV6YVc5dUVpY3VjSEp2ZEc5aSIsIA0KKyAgICAgICAgICAgICJkV1pmZFc1cGRIUmxjM1F1VkdWemRGQmhZMnRsWkVWNGRHVnVjMmx2Ym5NWVlTQURLQVpDQWhBQk9rNEsiLCANCisgICAgICAgICAgICAiR1hCaFkydGxaRjl6Wm1sNFpXUXpNbDlsZUhSbGJuTnBiMjRTSnk1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6IiwgDQorICAgICAgICAgICAgImRDNVVaWE4wVUdGamEyVmtSWGgwWlc1emFXOXVjeGhpSUFNb0QwSUNFQUU2VGdvWmNHRmphMlZrWDNObSIsIA0KKyAgICAgICAgICAgICJhWGhsWkRZMFgyVjRkR1Z1YzJsdmJoSW5MbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSUVlXTnIiLCANCisgICAgICAgICAgICAiWldSRmVIUmxibk5wYjI1ekdHTWdBeWdRUWdJUUFUcExDaFp3WVdOclpXUmZabXh2WVhSZlpYaDBaVzV6IiwgDQorICAgICAgICAgICAgImFXOXVFaWN1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRGQmhZMnRsWkVWNGRHVnVjMmx2Ym5NWSIsIA0KKyAgICAgICAgICAgICJaQ0FES0FKQ0FoQUJPa3dLRjNCaFkydGxaRjlrYjNWaWJHVmZaWGgwWlc1emFXOXVFaWN1Y0hKdmRHOWkiLCANCisgICAgICAgICAgICAiZFdaZmRXNXBkSFJsYzNRdVZHVnpkRkJoWTJ0bFpFVjRkR1Z1YzJsdmJuTVlaU0FES0FGQ0FoQUJPa29LIiwgDQorICAgICAgICAgICAgIkZYQmhZMnRsWkY5aWIyOXNYMlY0ZEdWdWMybHZiaEluTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbCIsIA0KKyAgICAgICAgICAgICJjM1JRWVdOclpXUkZlSFJsYm5OcGIyNXpHR1lnQXlnSVFnSVFBVHBxQ2hWd1lXTnJaV1JmWlc1MWJWOWwiLCANCisgICAgICAgICAgICAiZUhSbGJuTnBiMjRTSnk1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBVR0ZqYTJWa1JYaDBaVzV6IiwgDQorICAgICAgICAgICAgImFXOXVjeGhuSUFNb0RqSWVMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMa1p2Y21WcFoyNUZiblZ0UWdJUSIsIA0KKyAgICAgICAgICAgICJBVUpUUWcxVmJtbDBkR1Z6ZEZCeWIzUnZTQUdBQVFHSUFRR1FBUUhDUGpZS0lVZHZiMmRzWlM1UWNtOTAiLCANCisgICAgICAgICAgImIyTnZiRUoxWm1abGNuTXVWR1Z6ZEZCeWIzUnZjeElSVlc1cGRGUmxjM1JRY205MGIwWnBiR1U9IikpOw0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgYXNzaWduZXIgPSBkZWxlZ2F0ZShwYmQ6OkZpbGVEZXNjcmlwdG9yIHJvb3QpIHsNCisgICAgICAgIGRlc2NyaXB0b3IgPSByb290Ow0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIk9wdGlvbmFsSW50MzIiLCAiT3B0aW9uYWxJbnQ2NCIsICJPcHRpb25hbFVpbnQzMiIsICJPcHRpb25hbFVpbnQ2NCIsICJPcHRpb25hbFNpbnQzMiIsICJPcHRpb25hbFNpbnQ2NCIsICJPcHRpb25hbEZpeGVkMzIiLCAiT3B0aW9uYWxGaXhlZDY0IiwgIk9wdGlvbmFsU2ZpeGVkMzIiLCAiT3B0aW9uYWxTZml4ZWQ2NCIsICJPcHRpb25hbEZsb2F0IiwgIk9wdGlvbmFsRG91YmxlIiwgIk9wdGlvbmFsQm9vbCIsICJPcHRpb25hbFN0cmluZyIsICJPcHRpb25hbEJ5dGVzIiwgIk9wdGlvbmFsR3JvdXAiLCAiT3B0aW9uYWxOZXN0ZWRNZXNzYWdlIiwgIk9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UiLCAiT3B0aW9uYWxJbXBvcnRNZXNzYWdlIiwgIk9wdGlvbmFsTmVzdGVkRW51bSIsICJPcHRpb25hbEZvcmVpZ25FbnVtIiwgIk9wdGlvbmFsSW1wb3J0RW51bSIsICJPcHRpb25hbFN0cmluZ1BpZWNlIiwgIk9wdGlvbmFsQ29yZCIsICJSZXBlYXRlZEludDMyIiwgIlJlcGVhdGVkSW50NjQiLCAiUmVwZWF0ZWRVaW50MzIiLCAiUmVwZWF0ZWRVaW50NjQiLCAiUmVwZWF0ZWRTaW50MzIiLCAiUmVwZWF0ZWRTaW50NjQiLCAiUmVwZWF0ZWRGaXhlZDMyIiwgIlJlcGVhdGVkRml4ZWQ2NCIsICJSZXBlYXRlZFNmaXhlZDMyIiwgIlJlcGVhdGVkU2ZpeGVkNjQiLCAiUmVwZWF0ZWRGbG9hdCIsICJSZXBlYXRlZERvdWJsZSIsICJSZXBlYXRlZEJvb2wiLCAiUmVwZWF0ZWRTdHJpbmciLCAiUmVwZWF0ZWRCeXRlcyIsICJSZXBlYXRlZEdyb3VwIiwgIlJlcGVhdGVkTmVzdGVkTWVzc2FnZSIsICJSZXBlYXRlZEZvcmVpZ25NZXNzYWdlIiwgIlJlcGVhdGVkSW1wb3J0TWVzc2FnZSIsICJSZXBlYXRlZE5lc3RlZEVudW0iLCAiUmVwZWF0ZWRGb3JlaWduRW51bSIsICJSZXBlYXRlZEltcG9ydEVudW0iLCAiUmVwZWF0ZWRTdHJpbmdQaWVjZSIsICJSZXBlYXRlZENvcmQiLCAiRGVmYXVsdEludDMyIiwgIkRlZmF1bHRJbnQ2NCIsICJEZWZhdWx0VWludDMyIiwgIkRlZmF1bHRVaW50NjQiLCAiRGVmYXVsdFNpbnQzMiIsICJEZWZhdWx0U2ludDY0IiwgIkRlZmF1bHRGaXhlZDMyIiwgIkRlZmF1bHRGaXhlZDY0IiwgIkRlZmF1bHRTZml4ZWQzMiIsICJEZWZhdWx0U2ZpeGVkNjQiLCAiRGVmYXVsdEZsb2F0IiwgIkRlZmF1bHREb3VibGUiLCAiRGVmYXVsdEJvb2wiLCAiRGVmYXVsdFN0cmluZyIsICJEZWZhdWx0Qnl0ZXMiLCAiRGVmYXVsdE5lc3RlZEVudW0iLCAiRGVmYXVsdEZvcmVpZ25FbnVtIiwgIkRlZmF1bHRJbXBvcnRFbnVtIiwgIkRlZmF1bHRTdHJpbmdQaWVjZSIsICJEZWZhdWx0Q29yZCIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZV9fRGVzY3JpcHRvciA9IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2VfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJCYiIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfT3B0aW9uYWxHcm91cF9fRGVzY3JpcHRvciA9IGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX19EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfT3B0aW9uYWxHcm91cF9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX09wdGlvbmFsR3JvdXBfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19SZXBlYXRlZEdyb3VwX19EZXNjcmlwdG9yID0gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfX0Rlc2NyaXB0b3IuTmVzdGVkVHlwZXNbMl07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19SZXBlYXRlZEdyb3VwX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfUmVwZWF0ZWRHcm91cF9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkEiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdERlcHJlY2F0ZWRGaWVsZHNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdERlcHJlY2F0ZWRGaWVsZHNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REZXByZWNhdGVkRmllbGRzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RGVwcmVjYXRlZEZpZWxkcy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REZXByZWNhdGVkRmllbGRzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRGVwcmVjYXRlZEludDMyIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0ZvcmVpZ25NZXNzYWdlX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMl07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0ZvcmVpZ25NZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb3JlaWduTWVzc2FnZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkMiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1szXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbEV4dGVuc2lvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxFeHRlbnNpb25zLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxFeHRlbnNpb25zX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT3B0aW9uYWxHcm91cF9leHRlbnNpb25fX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s0XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT3B0aW9uYWxHcm91cF9leHRlbnNpb25fX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PcHRpb25hbEdyb3VwX2V4dGVuc2lvbi5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzVdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVwZWF0ZWRHcm91cF9leHRlbnNpb24sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRFeHRlbnNpb25fX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s2XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZEV4dGVuc2lvbl9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZEV4dGVuc2lvbiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZEV4dGVuc2lvbi5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRFeHRlbnNpb25fX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZEV4dGVuc2lvbi5UZXN0ID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxzdHJpbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRFeHRlbnNpb24uRGVzY3JpcHRvci5FeHRlbnNpb25zWzBdKTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbN107DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZF9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVxdWlyZWRfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJBIiwgIkR1bW15MiIsICJCIiwgIkR1bW15NCIsICJEdW1teTUiLCAiRHVtbXk2IiwgIkR1bW15NyIsICJEdW1teTgiLCAiRHVtbXk5IiwgIkR1bW15MTAiLCAiRHVtbXkxMSIsICJEdW1teTEyIiwgIkR1bW15MTMiLCAiRHVtbXkxNCIsICJEdW1teTE1IiwgIkR1bW15MTYiLCAiRHVtbXkxNyIsICJEdW1teTE4IiwgIkR1bW15MTkiLCAiRHVtbXkyMCIsICJEdW1teTIxIiwgIkR1bW15MjIiLCAiRHVtbXkyMyIsICJEdW1teTI0IiwgIkR1bW15MjUiLCAiRHVtbXkyNiIsICJEdW1teTI3IiwgIkR1bW15MjgiLCAiRHVtbXkyOSIsICJEdW1teTMwIiwgIkR1bW15MzEiLCAiRHVtbXkzMiIsICJDIiwgfSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuU2luZ2xlID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLk11bHRpID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMV0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVxdWlyZWRGb3JlaWduX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbOF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZEZvcmVpZ25fX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZEZvcmVpZ24sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZEZvcmVpZ24uQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVxdWlyZWRGb3JlaWduX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiT3B0aW9uYWxNZXNzYWdlIiwgIlJlcGVhdGVkTWVzc2FnZSIsICJEdW1teSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Rm9yZWlnbk5lc3RlZF9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzldOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Rm9yZWlnbk5lc3RlZF9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZvcmVpZ25OZXN0ZWQsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RGb3JlaWduTmVzdGVkLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEZvcmVpZ25OZXN0ZWRfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJGb3JlaWduTmVzdGVkIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbXB0eU1lc3NhZ2VfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbXB0eU1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFbXB0eU1lc3NhZ2UsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFbXB0eU1lc3NhZ2UuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTFdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTJdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTNdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXJfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQSIsICJCYiIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVjdXJzaXZlTWVzc2FnZV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzE0XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVjdXJzaXZlTWVzc2FnZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZWN1cnNpdmVNZXNzYWdlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQSIsICJJIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25BX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTVdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11dHVhbFJlY3Vyc2lvbkFfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJCYiIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQl9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzE2XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11dHVhbFJlY3Vyc2lvbkJfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQi5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25CX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQSIsICJPcHRpb25hbEludDMyIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzE3XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkEiLCAiRm9vIiwgIkJhciIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfRm9vX19EZXNjcmlwdG9yID0gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfX0Rlc2NyaXB0b3IuTmVzdGVkVHlwZXNbMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9Gb29fX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28uQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfRm9vX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfQmFyX19EZXNjcmlwdG9yID0gaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfX0Rlc2NyaXB0b3IuTmVzdGVkVHlwZXNbMV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REdXBGaWVsZE51bWJlcl9CYXJfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfQmFyX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiQSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxOF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJPcHRpb25hbE5lc3RlZE1lc3NhZ2UiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzX05lc3RlZE1lc3NhZ2VfX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19fRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzX05lc3RlZE1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c19OZXN0ZWRNZXNzYWdlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzIiLCAiTmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2UiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxOV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0Q2FtZWxDYXNlRmllbGROYW1lcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Q2FtZWxDYXNlRmllbGROYW1lc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIlByaW1pdGl2ZUZpZWxkIiwgIlN0cmluZ0ZpZWxkIiwgIkVudW1GaWVsZCIsICJNZXNzYWdlRmllbGQiLCAiU3RyaW5nUGllY2VGaWVsZCIsICJDb3JkRmllbGQiLCAiUmVwZWF0ZWRQcmltaXRpdmVGaWVsZCIsICJSZXBlYXRlZFN0cmluZ0ZpZWxkIiwgIlJlcGVhdGVkRW51bUZpZWxkIiwgIlJlcGVhdGVkTWVzc2FnZUZpZWxkIiwgIlJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZCIsICJSZXBlYXRlZENvcmRGaWVsZCIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RmllbGRPcmRlcmluZ3NfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syMF07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RGaWVsZE9yZGVyaW5nc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZpZWxkT3JkZXJpbmdzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RmllbGRPcmRlcmluZ3MuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RmllbGRPcmRlcmluZ3NfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJNeVN0cmluZyIsICJNeUludCIsICJNeUZsb2F0IiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFeHRyZW1lRGVmYXVsdFZhbHVlc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzIxXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFeHRyZW1lRGVmYXVsdFZhbHVlc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIkVzY2FwZWRCeXRlcyIsICJMYXJnZVVpbnQzMiIsICJMYXJnZVVpbnQ2NCIsICJTbWFsbEludDMyIiwgIlNtYWxsSW50NjQiLCAiVXRmOFN0cmluZyIsICJaZXJvRmxvYXQiLCAiT25lRmxvYXQiLCAiU21hbGxGbG9hdCIsICJOZWdhdGl2ZU9uZUZsb2F0IiwgIk5lZ2F0aXZlRmxvYXQiLCAiTGFyZ2VGbG9hdCIsICJTbWFsbE5lZ2F0aXZlRmxvYXQiLCAiSW5mRG91YmxlIiwgIk5lZ0luZkRvdWJsZSIsICJOYW5Eb3VibGUiLCAiSW5mRmxvYXQiLCAiTmVnSW5mRmxvYXQiLCAiTmFuRmxvYXQiLCAiQ3BwVHJpZ3JhcGgiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfU3BhcnNlRW51bU1lc3NhZ2VfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syMl07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NwYXJzZUVudW1NZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TcGFyc2VFbnVtTWVzc2FnZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BhcnNlRW51bU1lc3NhZ2UuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9TcGFyc2VFbnVtTWVzc2FnZV9fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIlNwYXJzZUVudW0iLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT25lU3RyaW5nX19EZXNjcmlwdG9yID0gRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMjNdOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVTdHJpbmdfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9uZVN0cmluZywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lU3RyaW5nLkJ1aWxkZXI+KGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT25lU3RyaW5nX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRGF0YSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVCeXRlc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzI0XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT25lQnl0ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9uZUJ5dGVzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PbmVCeXRlcy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X09uZUJ5dGVzX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyAiRGF0YSIsIH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkVHlwZXNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syNV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRUeXBlc19fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZFR5cGVzLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkVHlwZXMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkVHlwZXNfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJQYWNrZWRJbnQzMiIsICJQYWNrZWRJbnQ2NCIsICJQYWNrZWRVaW50MzIiLCAiUGFja2VkVWludDY0IiwgIlBhY2tlZFNpbnQzMiIsICJQYWNrZWRTaW50NjQiLCAiUGFja2VkRml4ZWQzMiIsICJQYWNrZWRGaXhlZDY0IiwgIlBhY2tlZFNmaXhlZDMyIiwgIlBhY2tlZFNmaXhlZDY0IiwgIlBhY2tlZEZsb2F0IiwgIlBhY2tlZERvdWJsZSIsICJQYWNrZWRCb29sIiwgIlBhY2tlZEVudW0iLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFVucGFja2VkVHlwZXNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syNl07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RVbnBhY2tlZFR5cGVzX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0VW5wYWNrZWRUeXBlcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkVHlwZXMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0VW5wYWNrZWRUeXBlc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIlVucGFja2VkSW50MzIiLCAiVW5wYWNrZWRJbnQ2NCIsICJVbnBhY2tlZFVpbnQzMiIsICJVbnBhY2tlZFVpbnQ2NCIsICJVbnBhY2tlZFNpbnQzMiIsICJVbnBhY2tlZFNpbnQ2NCIsICJVbnBhY2tlZEZpeGVkMzIiLCAiVW5wYWNrZWRGaXhlZDY0IiwgIlVucGFja2VkU2ZpeGVkMzIiLCAiVW5wYWNrZWRTZml4ZWQ2NCIsICJVbnBhY2tlZEZsb2F0IiwgIlVucGFja2VkRG91YmxlIiwgIlVucGFja2VkQm9vbCIsICJVbnBhY2tlZEVudW0iLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFBhY2tlZEV4dGVuc2lvbnNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syN107DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RQYWNrZWRFeHRlbnNpb25zX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkRXh0ZW5zaW9ucywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkRXh0ZW5zaW9uc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REeW5hbWljRXh0ZW5zaW9uc19fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzI4XTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REeW5hbWljRXh0ZW5zaW9uc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIlNjYWxhckV4dGVuc2lvbiIsICJFbnVtRXh0ZW5zaW9uIiwgIkR5bmFtaWNFbnVtRXh0ZW5zaW9uIiwgIk1lc3NhZ2VFeHRlbnNpb24iLCAiRHluYW1pY01lc3NhZ2VFeHRlbnNpb24iLCAiUmVwZWF0ZWRFeHRlbnNpb24iLCAiUGFja2VkRXh0ZW5zaW9uIiwgfSk7DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REeW5hbWljRXh0ZW5zaW9uc19EeW5hbWljTWVzc2FnZVR5cGVfX0Rlc2NyaXB0b3IgPSBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REeW5hbWljRXh0ZW5zaW9uc19fRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX0R5bmFtaWNNZXNzYWdlVHlwZV9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REeW5hbWljRXh0ZW5zaW9uc19EeW5hbWljTWVzc2FnZVR5cGVfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7ICJEeW5hbWljRmllbGQiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNfX0Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syOV07DQorICAgICAgICBpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzX19GaWVsZEFjY2Vzc29yVGFibGUgPSANCisgICAgICAgICAgICBuZXcgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMuQnVpbGRlcj4oaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplc19fRGVzY3JpcHRvciwNCisgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgIlJlcGVhdGVkRml4ZWQzMiIsICJSZXBlYXRlZEludDMyIiwgIlJlcGVhdGVkRml4ZWQ2NCIsICJSZXBlYXRlZEludDY0IiwgIlJlcGVhdGVkRmxvYXQiLCAiUmVwZWF0ZWRVaW50NjQiLCB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9vUmVxdWVzdF9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzMwXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9vUmVxdWVzdF9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVxdWVzdCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVxdWVzdC5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0Zvb1JlcXVlc3RfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXNwb25zZV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzMxXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9vUmVzcG9uc2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvb1Jlc3BvbnNlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXNwb25zZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0Zvb1Jlc3BvbnNlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyB9KTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQmFyUmVxdWVzdF9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzMyXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQmFyUmVxdWVzdF9fRmllbGRBY2Nlc3NvclRhYmxlID0gDQorICAgICAgICAgICAgbmV3IHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQmFyUmVxdWVzdCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQmFyUmVxdWVzdC5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0JhclJlcXVlc3RfX0Rlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IH0pOw0KKyAgICAgICAgaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXNwb25zZV9fRGVzY3JpcHRvciA9IERlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzMzXTsNCisgICAgICAgIGludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQmFyUmVzcG9uc2VfX0ZpZWxkQWNjZXNzb3JUYWJsZSA9IA0KKyAgICAgICAgICAgIG5ldyBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlc3BvbnNlLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXNwb25zZS5CdWlsZGVyPihpbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0JhclJlc3BvbnNlX19EZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyB9KTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50MzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzBdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW50NjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1sxXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFVpbnQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248dWludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzJdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsVWludDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjx1bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzNdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFNpbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzVdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248dWludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzZdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248dWxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s4XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbOV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxGbG9hdEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248ZmxvYXQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1sxMF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxEb3VibGVFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGRvdWJsZT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzExXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEJvb2xFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGJvb2w+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1sxMl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxTdHJpbmdFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzEzXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEJ5dGVzRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxwYjo6Qnl0ZVN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzE0XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbEdyb3VwRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PcHRpb25hbEdyb3VwX2V4dGVuc2lvbj4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzE1XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTZdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTddKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzE4XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMTldKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMjBdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzIxXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5PcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxzdHJpbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syMl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuT3B0aW9uYWxDb3JkRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxzdHJpbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syM10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMjRdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW50NjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syNV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRVaW50MzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHVpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syNl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHVsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMjddKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syOF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTaW50NjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1syOV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjx1aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMzBdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248dWxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szMV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbMzJdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szM10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248ZmxvYXQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szNF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWREb3VibGVFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGRvdWJsZT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzM1XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEJvb2xFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGJvb2w+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1szNl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzM3XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxwYjo6Qnl0ZVN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzM4XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZEdyb3VwRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbj4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzM5XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNDBdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNDFdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzQyXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNDNdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNDRdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzQ1XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5SZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxzdHJpbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0Nl0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUmVwZWF0ZWRDb3JkRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxzdHJpbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0N10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEludDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s0OF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEludDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNDldKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRVaW50MzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHVpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s1MF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFVpbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248dWxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s1MV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdFNpbnQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNTJdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTaW50NjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s1M10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZpeGVkMzJFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHVpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s1NF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZpeGVkNjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHVsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNTVdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNTZdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzU3XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0RmxvYXRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGZsb2F0Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNThdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlZmF1bHREb3VibGVFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGRvdWJsZT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzU5XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Qm9vbEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Ym9vbD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzYwXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U3RyaW5nRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxzdHJpbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s2MV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEJ5dGVzRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxwYjo6Qnl0ZVN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzYyXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s2M10pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzY0XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzY1XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPHN0cmluZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzY2XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZWZhdWx0Q29yZEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRTaW5nbGVFeHRlbnNpb248c3RyaW5nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNjddKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLk15RXh0ZW5zaW9uU3RyaW5nID0gcGI6OkdlbmVyYXRlZFNpbmdsZUV4dGVuc2lvbjxzdHJpbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s2OF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuTXlFeHRlbnNpb25JbnQgPSBwYjo6R2VuZXJhdGVkU2luZ2xlRXh0ZW5zaW9uPGludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzY5XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRJbnQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNzBdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEludDY0RXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNzFdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFVpbnQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248dWludD4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzcyXSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRVaW50NjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHVsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNzNdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFNpbnQzMkV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNzRdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFNpbnQ2NEV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248bG9uZz4uQ3JlYXRlSW5zdGFuY2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvci5FeHRlbnNpb25zWzc1XSk7DQorICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5QYWNrZWRGaXhlZDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjx1aW50Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNzZdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEZpeGVkNjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPHVsb25nPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbNzddKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uID0gcGI6OkdlbmVyYXRlZFJlcGVhdEV4dGVuc2lvbjxpbnQ+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3OF0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkU2ZpeGVkNjRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGxvbmc+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s3OV0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRmxvYXRFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGZsb2F0Pi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbODBdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZERvdWJsZUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248ZG91YmxlPi5DcmVhdGVJbnN0YW5jZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLkV4dGVuc2lvbnNbODFdKTsNCisgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLlBhY2tlZEJvb2xFeHRlbnNpb24gPSBwYjo6R2VuZXJhdGVkUmVwZWF0RXh0ZW5zaW9uPGJvb2w+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s4Ml0pOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuUGFja2VkRW51bUV4dGVuc2lvbiA9IHBiOjpHZW5lcmF0ZWRSZXBlYXRFeHRlbnNpb248Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+LkNyZWF0ZUluc3RhbmNlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IuRXh0ZW5zaW9uc1s4M10pOw0KKyAgICAgICAgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkNyZWF0ZUluc3RhbmNlKCk7DQorICAgICAgICBSZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5SZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOw0KKyAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuUmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsNCisgICAgICAgIHJldHVybiByZWdpc3RyeTsNCisgICAgICB9Ow0KKyAgICAgIHBiZDo6RmlsZURlc2NyaXB0b3IuSW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKGRlc2NyaXB0b3JEYXRhLA0KKyAgICAgICAgICBuZXcgcGJkOjpGaWxlRGVzY3JpcHRvcltdIHsNCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3MuQ1NoYXJwT3B0aW9ucy5EZXNjcmlwdG9yLCANCisgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RJbXBvcnRQcm90b0ZpbGUuRGVzY3JpcHRvciwgDQorICAgICAgICAgIH0sIGFzc2lnbmVyKTsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgfQ0KKyAgI3JlZ2lvbiBFbnVtcw0KKyAgcHVibGljIGVudW0gRm9yZWlnbkVudW0gew0KKyAgICBGT1JFSUdOX0ZPTyA9IDQsDQorICAgIEZPUkVJR05fQkFSID0gNSwNCisgICAgRk9SRUlHTl9CQVogPSA2LA0KKyAgfQ0KKyAgDQorICBwdWJsaWMgZW51bSBUZXN0RW51bVdpdGhEdXBWYWx1ZSB7DQorICAgIEZPTzEgPSAxLA0KKyAgICBCQVIxID0gMiwNCisgICAgQkFaID0gMywNCisgICAgRk9PMiA9IDEsDQorICAgIEJBUjIgPSAyLA0KKyAgfQ0KKyAgDQorICBwdWJsaWMgZW51bSBUZXN0U3BhcnNlRW51bSB7DQorICAgIFNQQVJTRV9BID0gMTIzLA0KKyAgICBTUEFSU0VfQiA9IDYyMzc0LA0KKyAgICBTUEFSU0VfQyA9IDEyNTg5MjM0LA0KKyAgICBTUEFSU0VfRCA9IC0xNSwNCisgICAgU1BBUlNFX0UgPSAtNTM0NTIsDQorICAgIFNQQVJTRV9GID0gMCwNCisgICAgU1BBUlNFX0cgPSAyLA0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCisgICNyZWdpb24gTWVzc2FnZXMNCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdEFsbFR5cGVzIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RBbGxUeXBlcygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0QWxsVHlwZXMgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RBbGxUeXBlcygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdEFsbFR5cGVzRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJkZWZhdWx0X2Jvb2wiLCAiZGVmYXVsdF9ieXRlcyIsICJkZWZhdWx0X2NvcmQiLCAiZGVmYXVsdF9kb3VibGUiLCAiZGVmYXVsdF9maXhlZDMyIiwgImRlZmF1bHRfZml4ZWQ2NCIsICJkZWZhdWx0X2Zsb2F0IiwgImRlZmF1bHRfZm9yZWlnbl9lbnVtIiwgImRlZmF1bHRfaW1wb3J0X2VudW0iLCAiZGVmYXVsdF9pbnQzMiIsICJkZWZhdWx0X2ludDY0IiwgImRlZmF1bHRfbmVzdGVkX2VudW0iLCAiZGVmYXVsdF9zZml4ZWQzMiIsICJkZWZhdWx0X3NmaXhlZDY0IiwgImRlZmF1bHRfc2ludDMyIiwgImRlZmF1bHRfc2ludDY0IiwgImRlZmF1bHRfc3RyaW5nIiwgImRlZmF1bHRfc3RyaW5nX3BpZWNlIiwgImRlZmF1bHRfdWludDMyIiwgImRlZmF1bHRfdWludDY0IiwgIm9wdGlvbmFsX2Jvb2wiLCAib3B0aW9uYWxfYnl0ZXMiLCAib3B0aW9uYWxfY29yZCIsICJvcHRpb25hbF9kb3VibGUiLCAib3B0aW9uYWxfZml4ZWQzMiIsICJvcHRpb25hbF9maXhlZDY0IiwgIm9wdGlvbmFsX2Zsb2F0IiwgIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIsICJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiLCAib3B0aW9uYWxfaW1wb3J0X2VudW0iLCAib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiLCAib3B0aW9uYWxfaW50MzIiLCAib3B0aW9uYWxfaW50NjQiLCAib3B0aW9uYWxfbmVzdGVkX2VudW0iLCAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiLCAib3B0aW9uYWxfc2ZpeGVkMzIiLCAib3B0aW9uYWxfc2ZpeGVkNjQiLCAib3B0aW9uYWxfc2ludDMyIiwgIm9wdGlvbmFsX3NpbnQ2NCIsICJvcHRpb25hbF9zdHJpbmciLCAib3B0aW9uYWxfc3RyaW5nX3BpZWNlIiwgIm9wdGlvbmFsX3VpbnQzMiIsICJvcHRpb25hbF91aW50NjQiLCAib3B0aW9uYWxncm91cCIsICJyZXBlYXRlZF9ib29sIiwgInJlcGVhdGVkX2J5dGVzIiwgInJlcGVhdGVkX2NvcmQiLCAicmVwZWF0ZWRfZG91YmxlIiwgInJlcGVhdGVkX2ZpeGVkMzIiLCAicmVwZWF0ZWRfZml4ZWQ2NCIsICJyZXBlYXRlZF9mbG9hdCIsICJyZXBlYXRlZF9mb3JlaWduX2VudW0iLCAicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIiwgInJlcGVhdGVkX2ltcG9ydF9lbnVtIiwgInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiwgInJlcGVhdGVkX2ludDMyIiwgInJlcGVhdGVkX2ludDY0IiwgInJlcGVhdGVkX25lc3RlZF9lbnVtIiwgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiwgInJlcGVhdGVkX3NmaXhlZDMyIiwgInJlcGVhdGVkX3NmaXhlZDY0IiwgInJlcGVhdGVkX3NpbnQzMiIsICJyZXBlYXRlZF9zaW50NjQiLCAicmVwZWF0ZWRfc3RyaW5nIiwgInJlcGVhdGVkX3N0cmluZ19waWVjZSIsICJyZXBlYXRlZF91aW50MzIiLCAicmVwZWF0ZWRfdWludDY0IiwgInJlcGVhdGVkZ3JvdXAiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdEFsbFR5cGVzRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDU4NCwgNjAyLCA2ODIsIDU3NywgNTQxLCA1NDUsIDU3MywgNjU2LCA2NjQsIDQ4OCwgNDk2LCA2NDgsIDU1NywgNTYxLCA1MjAsIDUyOCwgNTk0LCA2NzQsIDUwNCwgNTEyLCAxMDQsIDEyMiwgMjAyLCA5NywgNjEsIDY1LCA5MywgMTc2LCAxNTQsIDE4NCwgMTYyLCA4LCAxNiwgMTY4LCAxNDYsIDc3LCA4MSwgNDAsIDQ4LCAxMTQsIDE5NCwgMjQsIDMyLCAxMzEsIDM0NCwgMzYyLCA0NDIsIDMzNywgMzAxLCAzMDUsIDMzMywgNDE2LCAzOTQsIDQyNCwgNDAyLCAyNDgsIDI1NiwgNDA4LCAzODYsIDMxNywgMzIxLCAyODAsIDI4OCwgMzU0LCA0MzQsIDI2NCwgMjcyLCAzNzEgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0QWxsVHlwZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEFsbFR5cGVzIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEFsbFR5cGVzX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgICNyZWdpb24gTmVzdGVkIHR5cGVzDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7DQorICAgICAgcHVibGljIGVudW0gTmVzdGVkRW51bSB7DQorICAgICAgICBGT08gPSAxLA0KKyAgICAgICAgQkFSID0gMiwNCisgICAgICAgIEJBWiA9IDMsDQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE5lc3RlZE1lc3NhZ2UgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxOZXN0ZWRNZXNzYWdlLCBOZXN0ZWRNZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgICAgIHByaXZhdGUgTmVzdGVkTWVzc2FnZSgpIHsgfQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTmVzdGVkTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgTmVzdGVkTWVzc2FnZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX25lc3RlZE1lc3NhZ2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImJiIiB9Ow0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9uZXN0ZWRNZXNzYWdlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDggfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBOZXN0ZWRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBOZXN0ZWRNZXNzYWdlIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxOZXN0ZWRNZXNzYWdlLCBOZXN0ZWRNZXNzYWdlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgQmJGaWVsZE51bWJlciA9IDE7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzQmI7DQorICAgICAgICBwcml2YXRlIGludCBiYl87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNCYiB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNCYjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIGludCBCYiB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBiYl87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfbmVzdGVkTWVzc2FnZUZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNCYikgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzBdLCBCYik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICAgIA0KKyAgICAgICAgICBzaXplID0gMDsNCisgICAgICAgICAgaWYgKGhhc0JiKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBCYik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpdmF0ZSBOZXN0ZWRNZXNzYWdlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihOZXN0ZWRNZXNzYWdlIHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8TmVzdGVkTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihOZXN0ZWRNZXNzYWdlIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgTmVzdGVkTWVzc2FnZSByZXN1bHQ7DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIE5lc3RlZE1lc3NhZ2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIE5lc3RlZE1lc3NhZ2Ugb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgTmVzdGVkTWVzc2FnZSgpOw0KKyAgICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBOZXN0ZWRNZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgTmVzdGVkTWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgaXMgTmVzdGVkTWVzc2FnZSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoTmVzdGVkTWVzc2FnZSkgb3RoZXIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShOZXN0ZWRNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzQmIpIHsNCisgICAgICAgICAgICAgIEJiID0gb3RoZXIuQmI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX25lc3RlZE1lc3NhZ2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgICAgIHRhZyA9IF9uZXN0ZWRNZXNzYWdlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNCYiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmJiXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0JiIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0JiOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBCYiB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5CYjsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEJiKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEJiKGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0JiID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuYmJfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJCYigpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNCYiA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5iYl8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgTmVzdGVkTWVzc2FnZSgpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgT3B0aW9uYWxHcm91cCA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPE9wdGlvbmFsR3JvdXAsIE9wdGlvbmFsR3JvdXAuQnVpbGRlcj4gew0KKyAgICAgICAgcHJpdmF0ZSBPcHRpb25hbEdyb3VwKCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPcHRpb25hbEdyb3VwIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBPcHRpb25hbEdyb3VwKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfb3B0aW9uYWxHcm91cEZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYSIgfTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfb3B0aW9uYWxHcm91cEZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMzYgfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBPcHRpb25hbEdyb3VwIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBPcHRpb25hbEdyb3VwIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfT3B0aW9uYWxHcm91cF9fRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxPcHRpb25hbEdyb3VwLCBPcHRpb25hbEdyb3VwLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsVHlwZXNfT3B0aW9uYWxHcm91cF9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTc7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzQTsNCisgICAgICAgIHByaXZhdGUgaW50IGFfOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBoYXNBOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gYV87IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfb3B0aW9uYWxHcm91cEZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTcsIGZpZWxkX25hbWVzWzBdLCBBKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgDQorICAgICAgICAgIHNpemUgPSAwOw0KKyAgICAgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTcsIEEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgICAgIHJldHVybiBzaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXAgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXAgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXAgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgT3B0aW9uYWxHcm91cCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoT3B0aW9uYWxHcm91cCBwcm90b3R5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPE9wdGlvbmFsR3JvdXAsIEJ1aWxkZXI+IHsNCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludGVybmFsIEJ1aWxkZXIoT3B0aW9uYWxHcm91cCBjbG9uZUZyb20pIHsNCisgICAgICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgICAgICBwcml2YXRlIE9wdGlvbmFsR3JvdXAgcmVzdWx0Ow0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBPcHRpb25hbEdyb3VwIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICBPcHRpb25hbEdyb3VwIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE9wdGlvbmFsR3JvdXAoKTsNCisgICAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgT3B0aW9uYWxHcm91cCBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5EZXNjcmlwdG9yOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBPcHRpb25hbEdyb3VwIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIE9wdGlvbmFsR3JvdXAgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGlzIE9wdGlvbmFsR3JvdXApIHsNCisgICAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKE9wdGlvbmFsR3JvdXApIG90aGVyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oT3B0aW9uYWxHcm91cCBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cC5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0EpIHsNCisgICAgICAgICAgICAgIEEgPSBvdGhlci5BOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9vcHRpb25hbEdyb3VwRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgICAgICB0YWcgPSBfb3B0aW9uYWxHcm91cEZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDEzNjogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYV8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0E7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQTsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShpbnQgdmFsdWUpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5hXyA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0YXRpYyBPcHRpb25hbEdyb3VwKCkgew0KKyAgICAgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBSZXBlYXRlZEdyb3VwIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8UmVwZWF0ZWRHcm91cCwgUmVwZWF0ZWRHcm91cC5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIFJlcGVhdGVkR3JvdXAoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJlcGVhdGVkR3JvdXAgZGVmYXVsdEluc3RhbmNlID0gbmV3IFJlcGVhdGVkR3JvdXAoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9yZXBlYXRlZEdyb3VwRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiB9Ow0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9yZXBlYXRlZEdyb3VwRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDM3NiB9Ow0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFJlcGVhdGVkR3JvdXAgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFJlcGVhdGVkR3JvdXAgVGhpc01lc3NhZ2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19SZXBlYXRlZEdyb3VwX19EZXNjcmlwdG9yOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFJlcGVhdGVkR3JvdXAsIFJlcGVhdGVkR3JvdXAuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxUeXBlc19SZXBlYXRlZEdyb3VwX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBBRmllbGROdW1iZXIgPSA0NzsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgYV87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0E7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9yZXBlYXRlZEdyb3VwRmllbGROYW1lczsNCisgICAgICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig0NywgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg0NywgQSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXAgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpdmF0ZSBSZXBlYXRlZEdyb3VwIE1ha2VSZWFkT25seSgpIHsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihSZXBlYXRlZEdyb3VwIHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8UmVwZWF0ZWRHcm91cCwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihSZXBlYXRlZEdyb3VwIGNsb25lRnJvbSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgICAgIHByaXZhdGUgUmVwZWF0ZWRHcm91cCByZXN1bHQ7DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIFJlcGVhdGVkR3JvdXAgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIFJlcGVhdGVkR3JvdXAgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUmVwZWF0ZWRHcm91cCgpOw0KKyAgICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBSZXBlYXRlZEdyb3VwIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwLkRlc2NyaXB0b3I7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIFJlcGVhdGVkR3JvdXAgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgaXMgUmVwZWF0ZWRHcm91cCkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoUmVwZWF0ZWRHcm91cCkgb3RoZXIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShSZXBlYXRlZEdyb3VwIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzQSkgew0KKyAgICAgICAgICAgICAgQSA9IG90aGVyLkE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3JlcGVhdGVkR3JvdXBGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgICAgIHRhZyA9IF9yZXBlYXRlZEdyb3VwRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMzc2OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5hXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BOyB9DQorICAgICAgICAgICAgc2V0IHsgU2V0QSh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRBKGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC5hXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQSgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LmFfID0gMDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIFJlcGVhdGVkR3JvdXAoKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxJbnQzMkZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsSW50MzI7DQorICAgIHByaXZhdGUgaW50IG9wdGlvbmFsSW50MzJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxJbnQzMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgT3B0aW9uYWxJbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsSW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxJbnQ2NEZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsSW50NjQ7DQorICAgIHByaXZhdGUgbG9uZyBvcHRpb25hbEludDY0XzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxJbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsSW50NjQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBPcHRpb25hbEludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxJbnQ2NF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFVpbnQzMkZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsVWludDMyOw0KKyAgICBwcml2YXRlIHVpbnQgb3B0aW9uYWxVaW50MzJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFVpbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsVWludDMyOyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IE9wdGlvbmFsVWludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxVaW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxVaW50NjRGaWVsZE51bWJlciA9IDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbFVpbnQ2NDsNCisgICAgcHJpdmF0ZSB1bG9uZyBvcHRpb25hbFVpbnQ2NF87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsVWludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxVaW50NjQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIE9wdGlvbmFsVWludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxVaW50NjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTaW50MzJGaWVsZE51bWJlciA9IDU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbFNpbnQzMjsNCisgICAgcHJpdmF0ZSBpbnQgb3B0aW9uYWxTaW50MzJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFNpbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsU2ludDMyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBPcHRpb25hbFNpbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU2ludDMyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU2ludDY0RmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxTaW50NjQ7DQorICAgIHByaXZhdGUgbG9uZyBvcHRpb25hbFNpbnQ2NF87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU2ludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxTaW50NjQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBPcHRpb25hbFNpbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU2ludDY0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRml4ZWQzMkZpZWxkTnVtYmVyID0gNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsRml4ZWQzMjsNCisgICAgcHJpdmF0ZSB1aW50IG9wdGlvbmFsRml4ZWQzMl87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRml4ZWQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsRml4ZWQzMjsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBPcHRpb25hbEZpeGVkMzIgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEZpeGVkMzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxGaXhlZDY0RmllbGROdW1iZXIgPSA4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxGaXhlZDY0Ow0KKyAgICBwcml2YXRlIHVsb25nIG9wdGlvbmFsRml4ZWQ2NF87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRml4ZWQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsRml4ZWQ2NDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgT3B0aW9uYWxGaXhlZDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxGaXhlZDY0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU2ZpeGVkMzJGaWVsZE51bWJlciA9IDk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbFNmaXhlZDMyOw0KKyAgICBwcml2YXRlIGludCBvcHRpb25hbFNmaXhlZDMyXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTZml4ZWQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsU2ZpeGVkMzI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IE9wdGlvbmFsU2ZpeGVkMzIgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFNmaXhlZDMyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU2ZpeGVkNjRGaWVsZE51bWJlciA9IDEwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxTZml4ZWQ2NDsNCisgICAgcHJpdmF0ZSBsb25nIG9wdGlvbmFsU2ZpeGVkNjRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFNmaXhlZDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxTZml4ZWQ2NDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIE9wdGlvbmFsU2ZpeGVkNjQgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFNmaXhlZDY0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRmxvYXRGaWVsZE51bWJlciA9IDExOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxGbG9hdDsNCisgICAgcHJpdmF0ZSBmbG9hdCBvcHRpb25hbEZsb2F0XzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgT3B0aW9uYWxGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsRmxvYXRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxEb3VibGVGaWVsZE51bWJlciA9IDEyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxEb3VibGU7DQorICAgIHByaXZhdGUgZG91YmxlIG9wdGlvbmFsRG91YmxlXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxEb3VibGUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbERvdWJsZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBkb3VibGUgT3B0aW9uYWxEb3VibGUgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbERvdWJsZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEJvb2xGaWVsZE51bWJlciA9IDEzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxCb29sOw0KKyAgICBwcml2YXRlIGJvb2wgb3B0aW9uYWxCb29sXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxCb29sIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxCb29sOyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgT3B0aW9uYWxCb29sIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxCb29sXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU3RyaW5nRmllbGROdW1iZXIgPSAxNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsU3RyaW5nOw0KKyAgICBwcml2YXRlIHN0cmluZyBvcHRpb25hbFN0cmluZ18gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTdHJpbmcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbFN0cmluZzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgT3B0aW9uYWxTdHJpbmcgew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFN0cmluZ187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEJ5dGVzRmllbGROdW1iZXIgPSAxNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsQnl0ZXM7DQorICAgIHByaXZhdGUgcGI6OkJ5dGVTdHJpbmcgb3B0aW9uYWxCeXRlc18gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxCeXRlcyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsQnl0ZXM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgT3B0aW9uYWxCeXRlcyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsQnl0ZXNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxHcm91cEZpZWxkTnVtYmVyID0gMTY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbEdyb3VwOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwIG9wdGlvbmFsR3JvdXBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEdyb3VwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxHcm91cDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuT3B0aW9uYWxHcm91cCBPcHRpb25hbEdyb3VwIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxHcm91cF8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxOZXN0ZWRNZXNzYWdlRmllbGROdW1iZXIgPSAxODsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSBvcHRpb25hbE5lc3RlZE1lc3NhZ2VfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2U7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgT3B0aW9uYWxOZXN0ZWRNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEZvcmVpZ25NZXNzYWdlRmllbGROdW1iZXIgPSAxOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2U7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2Ugb3B0aW9uYWxGb3JlaWduTWVzc2FnZV87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEZvcmVpZ25NZXNzYWdlXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEltcG9ydE1lc3NhZ2VGaWVsZE51bWJlciA9IDIwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2Ugb3B0aW9uYWxJbXBvcnRNZXNzYWdlXzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UgT3B0aW9uYWxJbXBvcnRNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxJbXBvcnRNZXNzYWdlXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsTmVzdGVkRW51bUZpZWxkTnVtYmVyID0gMjE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNPcHRpb25hbE5lc3RlZEVudW07DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gb3B0aW9uYWxOZXN0ZWRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZPTzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxOZXN0ZWRFbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxOZXN0ZWRFbnVtOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIE9wdGlvbmFsTmVzdGVkRW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsTmVzdGVkRW51bV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEZvcmVpZ25FbnVtRmllbGROdW1iZXIgPSAyMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsRm9yZWlnbkVudW07DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gb3B0aW9uYWxGb3JlaWduRW51bV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPTzsNCisgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGb3JlaWduRW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsRm9yZWlnbkVudW07IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gT3B0aW9uYWxGb3JlaWduRW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsRm9yZWlnbkVudW1fOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxJbXBvcnRFbnVtRmllbGROdW1iZXIgPSAyMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsSW1wb3J0RW51bTsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtIG9wdGlvbmFsSW1wb3J0RW51bV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtLklNUE9SVF9GT087DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW1wb3J0RW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsSW1wb3J0RW51bTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtIE9wdGlvbmFsSW1wb3J0RW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsSW1wb3J0RW51bV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFN0cmluZ1BpZWNlRmllbGROdW1iZXIgPSAyNDsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsU3RyaW5nUGllY2U7DQorICAgIHByaXZhdGUgc3RyaW5nIG9wdGlvbmFsU3RyaW5nUGllY2VfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU3RyaW5nUGllY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbFN0cmluZ1BpZWNlOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBPcHRpb25hbFN0cmluZ1BpZWNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxTdHJpbmdQaWVjZV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbENvcmRGaWVsZE51bWJlciA9IDI1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxDb3JkOw0KKyAgICBwcml2YXRlIHN0cmluZyBvcHRpb25hbENvcmRfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsQ29yZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsQ29yZDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgT3B0aW9uYWxDb3JkIHsNCisgICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxDb3JkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW50MzJGaWVsZE51bWJlciA9IDMxOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gcmVwZWF0ZWRJbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFJlcGVhdGVkSW50MzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkSW50MzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRJbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRJbnQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkSW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEludDY0RmllbGROdW1iZXIgPSAzMjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPiByZXBlYXRlZEludDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBSZXBlYXRlZEludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEludDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW50NjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkSW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRJbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRJbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkVWludDMyRmllbGROdW1iZXIgPSAzMzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PiByZXBlYXRlZFVpbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVpbnQ+IFJlcGVhdGVkVWludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFVpbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFVpbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRVaW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IEdldFJlcGVhdGVkVWludDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFVpbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkVWludDY0RmllbGROdW1iZXIgPSAzNDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4gcmVwZWF0ZWRVaW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IFJlcGVhdGVkVWludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFVpbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFVpbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRVaW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBHZXRSZXBlYXRlZFVpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRVaW50NjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNpbnQzMkZpZWxkTnVtYmVyID0gMzU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiByZXBlYXRlZFNpbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFJlcGVhdGVkU2ludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFNpbnQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFNpbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRTaW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRSZXBlYXRlZFNpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRTaW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNpbnQ2NEZpZWxkTnVtYmVyID0gMzY7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gcmVwZWF0ZWRTaW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGxvbmc+IFJlcGVhdGVkU2ludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFNpbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFNpbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRTaW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRTaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkU2ludDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRGaXhlZDMyRmllbGROdW1iZXIgPSAzNzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PiByZXBlYXRlZEZpeGVkMzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1aW50PiBSZXBlYXRlZEZpeGVkMzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkRml4ZWQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEZpeGVkMzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRml4ZWQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgR2V0UmVwZWF0ZWRGaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEZpeGVkMzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZpeGVkNjRGaWVsZE51bWJlciA9IDM4Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPiByZXBlYXRlZEZpeGVkNjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IFJlcGVhdGVkRml4ZWQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRGaXhlZDY0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRml4ZWQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGaXhlZDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgR2V0UmVwZWF0ZWRGaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEZpeGVkNjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNmaXhlZDMyRmllbGROdW1iZXIgPSAzOTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IHJlcGVhdGVkU2ZpeGVkMzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBSZXBlYXRlZFNmaXhlZDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFNmaXhlZDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ZpeGVkMzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU2ZpeGVkMzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRSZXBlYXRlZFNmaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFNmaXhlZDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTZml4ZWQ2NEZpZWxkTnVtYmVyID0gNDA7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gcmVwZWF0ZWRTZml4ZWQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gUmVwZWF0ZWRTZml4ZWQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRTZml4ZWQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFNmaXhlZDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFNmaXhlZDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEdldFJlcGVhdGVkU2ZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkU2ZpeGVkNjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZsb2F0RmllbGROdW1iZXIgPSA0MTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxmbG9hdD4gcmVwZWF0ZWRGbG9hdF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8ZmxvYXQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGZsb2F0PiBSZXBlYXRlZEZsb2F0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEZsb2F0Xyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRmxvYXRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRmxvYXRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IEdldFJlcGVhdGVkRmxvYXQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRmxvYXRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZERvdWJsZUZpZWxkTnVtYmVyID0gNDI7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8ZG91YmxlPiByZXBlYXRlZERvdWJsZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8ZG91YmxlPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxkb3VibGU+IFJlcGVhdGVkRG91YmxlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZERvdWJsZV8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZERvdWJsZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWREb3VibGVfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGRvdWJsZSBHZXRSZXBlYXRlZERvdWJsZShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWREb3VibGVfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEJvb2xGaWVsZE51bWJlciA9IDQzOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGJvb2w+IHJlcGVhdGVkQm9vbF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Ym9vbD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Ym9vbD4gUmVwZWF0ZWRCb29sTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEJvb2xfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRCb29sQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEJvb2xfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGJvb2wgR2V0UmVwZWF0ZWRCb29sKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEJvb2xfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFN0cmluZ0ZpZWxkTnVtYmVyID0gNDQ7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiByZXBlYXRlZFN0cmluZ18gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxzdHJpbmc+IFJlcGVhdGVkU3RyaW5nTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFN0cmluZ18pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFN0cmluZ0NvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRTdHJpbmdfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZFN0cmluZyhpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRTdHJpbmdfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEJ5dGVzRmllbGROdW1iZXIgPSA0NTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxwYjo6Qnl0ZVN0cmluZz4gcmVwZWF0ZWRCeXRlc18gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8cGI6OkJ5dGVTdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHBiOjpCeXRlU3RyaW5nPiBSZXBlYXRlZEJ5dGVzTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEJ5dGVzXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkQnl0ZXNDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkQnl0ZXNfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIEdldFJlcGVhdGVkQnl0ZXMoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkQnl0ZXNfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEdyb3VwRmllbGROdW1iZXIgPSA0NjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cD4gcmVwZWF0ZWRHcm91cF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXA+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwPiBSZXBlYXRlZEdyb3VwTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkR3JvdXBfOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEdyb3VwQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEdyb3VwXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cCBHZXRSZXBlYXRlZEdyb3VwKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEdyb3VwX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRmllbGROdW1iZXIgPSA0ODsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZT4gcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2U+IFJlcGVhdGVkTmVzdGVkTWVzc2FnZUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZE5lc3RlZE1lc3NhZ2VDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgR2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZvcmVpZ25NZXNzYWdlRmllbGROdW1iZXIgPSA0OTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gcmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPiBSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEZvcmVpZ25NZXNzYWdlQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBHZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEZvcmVpZ25NZXNzYWdlX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbXBvcnRNZXNzYWdlRmllbGROdW1iZXIgPSA1MDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlPiByZXBlYXRlZEltcG9ydE1lc3NhZ2VfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2U+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2U+IFJlcGVhdGVkSW1wb3J0TWVzc2FnZUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEltcG9ydE1lc3NhZ2VfOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEltcG9ydE1lc3NhZ2VDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZSBHZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkSW1wb3J0TWVzc2FnZV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkTmVzdGVkRW51bUZpZWxkTnVtYmVyID0gNTE7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+IHJlcGVhdGVkTmVzdGVkRW51bV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtPiBSZXBlYXRlZE5lc3RlZEVudW1MaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkTmVzdGVkRW51bV8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZE5lc3RlZEVudW1Db3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkTmVzdGVkRW51bV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gR2V0UmVwZWF0ZWROZXN0ZWRFbnVtKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZE5lc3RlZEVudW1fW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZvcmVpZ25FbnVtRmllbGROdW1iZXIgPSA1MjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gcmVwZWF0ZWRGb3JlaWduRW51bV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiBSZXBlYXRlZEZvcmVpZ25FbnVtTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEZvcmVpZ25FbnVtXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRm9yZWlnbkVudW1Db3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRm9yZWlnbkVudW1fLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEdldFJlcGVhdGVkRm9yZWlnbkVudW0oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRm9yZWlnbkVudW1fW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEltcG9ydEVudW1GaWVsZE51bWJlciA9IDUzOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0+IHJlcGVhdGVkSW1wb3J0RW51bV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4gUmVwZWF0ZWRJbXBvcnRFbnVtTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEltcG9ydEVudW1fKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRJbXBvcnRFbnVtQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEltcG9ydEVudW1fLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0gR2V0UmVwZWF0ZWRJbXBvcnRFbnVtKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEltcG9ydEVudW1fW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGROdW1iZXIgPSA1NDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+IHJlcGVhdGVkU3RyaW5nUGllY2VfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBSZXBlYXRlZFN0cmluZ1BpZWNlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFN0cmluZ1BpZWNlXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkU3RyaW5nUGllY2VDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU3RyaW5nUGllY2VfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZFN0cmluZ1BpZWNlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZFN0cmluZ1BpZWNlX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRDb3JkRmllbGROdW1iZXIgPSA1NTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+IHJlcGVhdGVkQ29yZF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxzdHJpbmc+IFJlcGVhdGVkQ29yZExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRDb3JkXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkQ29yZENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRDb3JkXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgR2V0UmVwZWF0ZWRDb3JkKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZENvcmRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0SW50MzJGaWVsZE51bWJlciA9IDYxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdEludDMyOw0KKyAgICBwcml2YXRlIGludCBkZWZhdWx0SW50MzJfID0gNDE7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRJbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRJbnQzMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRGVmYXVsdEludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEludDMyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRJbnQ2NEZpZWxkTnVtYmVyID0gNjI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0SW50NjQ7DQorICAgIHByaXZhdGUgbG9uZyBkZWZhdWx0SW50NjRfID0gNDJMOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0SW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0SW50NjQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBEZWZhdWx0SW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW50NjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFVpbnQzMkZpZWxkTnVtYmVyID0gNjM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0VWludDMyOw0KKyAgICBwcml2YXRlIHVpbnQgZGVmYXVsdFVpbnQzMl8gPSA0MzsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFVpbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRVaW50MzI7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgRGVmYXVsdFVpbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRVaW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFVpbnQ2NEZpZWxkTnVtYmVyID0gNjQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0VWludDY0Ow0KKyAgICBwcml2YXRlIHVsb25nIGRlZmF1bHRVaW50NjRfID0gNDRVTDsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFVpbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRVaW50NjQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIERlZmF1bHRVaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0VWludDY0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTaW50MzJGaWVsZE51bWJlciA9IDY1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdFNpbnQzMjsNCisgICAgcHJpdmF0ZSBpbnQgZGVmYXVsdFNpbnQzMl8gPSAtNDU7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTaW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0U2ludDMyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEZWZhdWx0U2ludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdFNpbnQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0U2ludDY0RmllbGROdW1iZXIgPSA2NjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRTaW50NjQ7DQorICAgIHByaXZhdGUgbG9uZyBkZWZhdWx0U2ludDY0XyA9IDQ2Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U2ludDY0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdFNpbnQ2NDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIERlZmF1bHRTaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0U2ludDY0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRGaXhlZDMyRmllbGROdW1iZXIgPSA2NzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRGaXhlZDMyOw0KKyAgICBwcml2YXRlIHVpbnQgZGVmYXVsdEZpeGVkMzJfID0gNDc7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRGaXhlZDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRGVmYXVsdEZpeGVkMzI7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgRGVmYXVsdEZpeGVkMzIgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0Rml4ZWQzMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0Rml4ZWQ2NEZpZWxkTnVtYmVyID0gNjg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0Rml4ZWQ2NDsNCisgICAgcHJpdmF0ZSB1bG9uZyBkZWZhdWx0Rml4ZWQ2NF8gPSA0ODsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEZpeGVkNjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0Rml4ZWQ2NDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgRGVmYXVsdEZpeGVkNjQgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0Rml4ZWQ2NF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0U2ZpeGVkMzJGaWVsZE51bWJlciA9IDY5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdFNmaXhlZDMyOw0KKyAgICBwcml2YXRlIGludCBkZWZhdWx0U2ZpeGVkMzJfID0gNDk7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTZml4ZWQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRTZml4ZWQzMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRGVmYXVsdFNmaXhlZDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdFNmaXhlZDMyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRTZml4ZWQ2NEZpZWxkTnVtYmVyID0gNzA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0U2ZpeGVkNjQ7DQorICAgIHByaXZhdGUgbG9uZyBkZWZhdWx0U2ZpeGVkNjRfID0gLTUwOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U2ZpeGVkNjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0U2ZpeGVkNjQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBEZWZhdWx0U2ZpeGVkNjQgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0U2ZpeGVkNjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdEZsb2F0RmllbGROdW1iZXIgPSA3MTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRGbG9hdDsNCisgICAgcHJpdmF0ZSBmbG9hdCBkZWZhdWx0RmxvYXRfID0gNTEuNUY7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRGbG9hdDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBEZWZhdWx0RmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0RmxvYXRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdERvdWJsZUZpZWxkTnVtYmVyID0gNzI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0RG91YmxlOw0KKyAgICBwcml2YXRlIGRvdWJsZSBkZWZhdWx0RG91YmxlXyA9IDUyMDAwRDsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdERvdWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHREb3VibGU7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZG91YmxlIERlZmF1bHREb3VibGUgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0RG91YmxlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRCb29sRmllbGROdW1iZXIgPSA3MzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRCb29sOw0KKyAgICBwcml2YXRlIGJvb2wgZGVmYXVsdEJvb2xfID0gdHJ1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEJvb2wgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0Qm9vbDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIERlZmF1bHRCb29sIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEJvb2xfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFN0cmluZ0ZpZWxkTnVtYmVyID0gNzQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0U3RyaW5nOw0KKyAgICBwcml2YXRlIHN0cmluZyBkZWZhdWx0U3RyaW5nXyA9ICJoZWxsbyI7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTdHJpbmcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0U3RyaW5nOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBEZWZhdWx0U3RyaW5nIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdFN0cmluZ187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0Qnl0ZXNGaWVsZE51bWJlciA9IDc1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdEJ5dGVzOw0KKyAgICBwcml2YXRlIHBiOjpCeXRlU3RyaW5nIGRlZmF1bHRCeXRlc18gPSAocGI6OkJ5dGVTdHJpbmcpIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yLkZpZWxkc1s2Ml0uRGVmYXVsdFZhbHVlOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Qnl0ZXMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0Qnl0ZXM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgRGVmYXVsdEJ5dGVzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEJ5dGVzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHROZXN0ZWRFbnVtRmllbGROdW1iZXIgPSA4MTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHROZXN0ZWRFbnVtOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIGRlZmF1bHROZXN0ZWRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkJBUjsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdE5lc3RlZEVudW0gew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0TmVzdGVkRW51bTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSBEZWZhdWx0TmVzdGVkRW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHROZXN0ZWRFbnVtXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRGb3JlaWduRW51bUZpZWxkTnVtYmVyID0gODI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZWZhdWx0Rm9yZWlnbkVudW07DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gZGVmYXVsdEZvcmVpZ25FbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtLkZPUkVJR05fQkFSOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Rm9yZWlnbkVudW0gew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0Rm9yZWlnbkVudW07IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gRGVmYXVsdEZvcmVpZ25FbnVtIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEZvcmVpZ25FbnVtXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRJbXBvcnRFbnVtRmllbGROdW1iZXIgPSA4MzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRJbXBvcnRFbnVtOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0gZGVmYXVsdEltcG9ydEVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bS5JTVBPUlRfQkFSOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0SW1wb3J0RW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRJbXBvcnRFbnVtOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0gRGVmYXVsdEltcG9ydEVudW0gew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW1wb3J0RW51bV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0U3RyaW5nUGllY2VGaWVsZE51bWJlciA9IDg0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGVmYXVsdFN0cmluZ1BpZWNlOw0KKyAgICBwcml2YXRlIHN0cmluZyBkZWZhdWx0U3RyaW5nUGllY2VfID0gImFiYyI7DQorICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTdHJpbmdQaWVjZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RlZmF1bHRTdHJpbmdQaWVjZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRGVmYXVsdFN0cmluZ1BpZWNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdFN0cmluZ1BpZWNlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRDb3JkRmllbGROdW1iZXIgPSA4NTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0RlZmF1bHRDb3JkOw0KKyAgICBwcml2YXRlIHN0cmluZyBkZWZhdWx0Q29yZF8gPSAiMTIzIjsNCisgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdENvcmQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZWZhdWx0Q29yZDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgRGVmYXVsdENvcmQgew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0Q29yZF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RBbGxUeXBlc0ZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW50MzIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzMxXSwgT3B0aW9uYWxJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEludDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NCgyLCBmaWVsZF9uYW1lc1szMl0sIE9wdGlvbmFsSW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxVaW50MzIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQzMigzLCBmaWVsZF9uYW1lc1s0MV0sIE9wdGlvbmFsVWludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsVWludDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50NjQoNCwgZmllbGRfbmFtZXNbNDJdLCBPcHRpb25hbFVpbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFNpbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ludDMyKDUsIGZpZWxkX25hbWVzWzM3XSwgT3B0aW9uYWxTaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTaW50NjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNJbnQ2NCg2LCBmaWVsZF9uYW1lc1szOF0sIE9wdGlvbmFsU2ludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRml4ZWQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQzMig3LCBmaWVsZF9uYW1lc1syNF0sIE9wdGlvbmFsRml4ZWQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZpeGVkNjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkNjQoOCwgZmllbGRfbmFtZXNbMjVdLCBPcHRpb25hbEZpeGVkNjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTZml4ZWQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ZpeGVkMzIoOSwgZmllbGRfbmFtZXNbMzVdLCBPcHRpb25hbFNmaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsU2ZpeGVkNjQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNGaXhlZDY0KDEwLCBmaWVsZF9uYW1lc1szNl0sIE9wdGlvbmFsU2ZpeGVkNjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxGbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoMTEsIGZpZWxkX25hbWVzWzI2XSwgT3B0aW9uYWxGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbERvdWJsZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRG91YmxlKDEyLCBmaWVsZF9uYW1lc1syM10sIE9wdGlvbmFsRG91YmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsQm9vbCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCgxMywgZmllbGRfbmFtZXNbMjBdLCBPcHRpb25hbEJvb2wpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTdHJpbmcpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygxNCwgZmllbGRfbmFtZXNbMzldLCBPcHRpb25hbFN0cmluZyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEJ5dGVzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCeXRlcygxNSwgZmllbGRfbmFtZXNbMjFdLCBPcHRpb25hbEJ5dGVzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsR3JvdXApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUdyb3VwKDE2LCBmaWVsZF9uYW1lc1s0M10sIE9wdGlvbmFsR3JvdXApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDE4LCBmaWVsZF9uYW1lc1szNF0sIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDE5LCBmaWVsZF9uYW1lc1syOF0sIE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDIwLCBmaWVsZF9uYW1lc1szMF0sIE9wdGlvbmFsSW1wb3J0TWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbE5lc3RlZEVudW0pIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW0oMjEsIGZpZWxkX25hbWVzWzMzXSwgKGludCkgT3B0aW9uYWxOZXN0ZWRFbnVtLCBPcHRpb25hbE5lc3RlZEVudW0pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxGb3JlaWduRW51bSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSgyMiwgZmllbGRfbmFtZXNbMjddLCAoaW50KSBPcHRpb25hbEZvcmVpZ25FbnVtLCBPcHRpb25hbEZvcmVpZ25FbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW1wb3J0RW51bSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSgyMywgZmllbGRfbmFtZXNbMjldLCAoaW50KSBPcHRpb25hbEltcG9ydEVudW0sIE9wdGlvbmFsSW1wb3J0RW51bSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFN0cmluZ1BpZWNlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMjQsIGZpZWxkX25hbWVzWzQwXSwgT3B0aW9uYWxTdHJpbmdQaWVjZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbENvcmQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygyNSwgZmllbGRfbmFtZXNbMjJdLCBPcHRpb25hbENvcmQpOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRJbnQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMkFycmF5KDMxLCBmaWVsZF9uYW1lc1s1NV0sIHJlcGVhdGVkSW50MzJfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkSW50NjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50NjRBcnJheSgzMiwgZmllbGRfbmFtZXNbNTZdLCByZXBlYXRlZEludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFVpbnQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50MzJBcnJheSgzMywgZmllbGRfbmFtZXNbNjVdLCByZXBlYXRlZFVpbnQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRVaW50NjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlVUludDY0QXJyYXkoMzQsIGZpZWxkX25hbWVzWzY2XSwgcmVwZWF0ZWRVaW50NjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkU2ludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNJbnQzMkFycmF5KDM1LCBmaWVsZF9uYW1lc1s2MV0sIHJlcGVhdGVkU2ludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFNpbnQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTSW50NjRBcnJheSgzNiwgZmllbGRfbmFtZXNbNjJdLCByZXBlYXRlZFNpbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRGaXhlZDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkMzJBcnJheSgzNywgZmllbGRfbmFtZXNbNDhdLCByZXBlYXRlZEZpeGVkMzJfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkRml4ZWQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDY0QXJyYXkoMzgsIGZpZWxkX25hbWVzWzQ5XSwgcmVwZWF0ZWRGaXhlZDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFNmaXhlZDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVNGaXhlZDMyQXJyYXkoMzksIGZpZWxkX25hbWVzWzU5XSwgcmVwZWF0ZWRTZml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRTZml4ZWQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQ2NEFycmF5KDQwLCBmaWVsZF9uYW1lc1s2MF0sIHJlcGVhdGVkU2ZpeGVkNjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkRmxvYXRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXRBcnJheSg0MSwgZmllbGRfbmFtZXNbNTBdLCByZXBlYXRlZEZsb2F0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZERvdWJsZV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGVBcnJheSg0MiwgZmllbGRfbmFtZXNbNDddLCByZXBlYXRlZERvdWJsZV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRCb29sXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2xBcnJheSg0MywgZmllbGRfbmFtZXNbNDRdLCByZXBlYXRlZEJvb2xfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkU3RyaW5nXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZ0FycmF5KDQ0LCBmaWVsZF9uYW1lc1s2M10sIHJlcGVhdGVkU3RyaW5nXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEJ5dGVzXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzQXJyYXkoNDUsIGZpZWxkX25hbWVzWzQ1XSwgcmVwZWF0ZWRCeXRlc18pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRHcm91cF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVHcm91cEFycmF5KDQ2LCBmaWVsZF9uYW1lc1s2N10sIHJlcGVhdGVkR3JvdXBfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlQXJyYXkoNDgsIGZpZWxkX25hbWVzWzU4XSwgcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSg0OSwgZmllbGRfbmFtZXNbNTJdLCByZXBlYXRlZEZvcmVpZ25NZXNzYWdlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEltcG9ydE1lc3NhZ2VfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDUwLCBmaWVsZF9uYW1lc1s1NF0sIHJlcGVhdGVkSW1wb3J0TWVzc2FnZV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWROZXN0ZWRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW1BcnJheSg1MSwgZmllbGRfbmFtZXNbNTddLCByZXBlYXRlZE5lc3RlZEVudW1fKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkRm9yZWlnbkVudW1fLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bUFycmF5KDUyLCBmaWVsZF9uYW1lc1s1MV0sIHJlcGVhdGVkRm9yZWlnbkVudW1fKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkSW1wb3J0RW51bV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtQXJyYXkoNTMsIGZpZWxkX25hbWVzWzUzXSwgcmVwZWF0ZWRJbXBvcnRFbnVtXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFN0cmluZ1BpZWNlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZ0FycmF5KDU0LCBmaWVsZF9uYW1lc1s2NF0sIHJlcGVhdGVkU3RyaW5nUGllY2VfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkQ29yZF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmdBcnJheSg1NSwgZmllbGRfbmFtZXNbNDZdLCByZXBlYXRlZENvcmRfKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRJbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNjEsIGZpZWxkX25hbWVzWzldLCBEZWZhdWx0SW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEludDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NCg2MiwgZmllbGRfbmFtZXNbMTBdLCBEZWZhdWx0SW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFVpbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlVUludDMyKDYzLCBmaWVsZF9uYW1lc1sxOF0sIERlZmF1bHRVaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFVpbnQ2NCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlVUludDY0KDY0LCBmaWVsZF9uYW1lc1sxOV0sIERlZmF1bHRVaW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFNpbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ludDMyKDY1LCBmaWVsZF9uYW1lc1sxNF0sIERlZmF1bHRTaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdFNpbnQ2NCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ludDY0KDY2LCBmaWVsZF9uYW1lc1sxNV0sIERlZmF1bHRTaW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdEZpeGVkMzIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkMzIoNjcsIGZpZWxkX25hbWVzWzRdLCBEZWZhdWx0Rml4ZWQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0Rml4ZWQ2NCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQ2NCg2OCwgZmllbGRfbmFtZXNbNV0sIERlZmF1bHRGaXhlZDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTZml4ZWQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ZpeGVkMzIoNjksIGZpZWxkX25hbWVzWzEyXSwgRGVmYXVsdFNmaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTZml4ZWQ2NCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ZpeGVkNjQoNzAsIGZpZWxkX25hbWVzWzEzXSwgRGVmYXVsdFNmaXhlZDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRGbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoNzEsIGZpZWxkX25hbWVzWzZdLCBEZWZhdWx0RmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdERvdWJsZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRG91YmxlKDcyLCBmaWVsZF9uYW1lc1szXSwgRGVmYXVsdERvdWJsZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0Qm9vbCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQm9vbCg3MywgZmllbGRfbmFtZXNbMF0sIERlZmF1bHRCb29sKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTdHJpbmcpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyg3NCwgZmllbGRfbmFtZXNbMTZdLCBEZWZhdWx0U3RyaW5nKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRCeXRlcykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlQnl0ZXMoNzUsIGZpZWxkX25hbWVzWzFdLCBEZWZhdWx0Qnl0ZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRGVmYXVsdE5lc3RlZEVudW0pIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW0oODEsIGZpZWxkX25hbWVzWzExXSwgKGludCkgRGVmYXVsdE5lc3RlZEVudW0sIERlZmF1bHROZXN0ZWRFbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRGb3JlaWduRW51bSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSg4MiwgZmllbGRfbmFtZXNbN10sIChpbnQpIERlZmF1bHRGb3JlaWduRW51bSwgRGVmYXVsdEZvcmVpZ25FbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRJbXBvcnRFbnVtKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKDgzLCBmaWVsZF9uYW1lc1s4XSwgKGludCkgRGVmYXVsdEltcG9ydEVudW0sIERlZmF1bHRJbXBvcnRFbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTdHJpbmdQaWVjZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDg0LCBmaWVsZF9uYW1lc1sxN10sIERlZmF1bHRTdHJpbmdQaWVjZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0Q29yZCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDg1LCBmaWVsZF9uYW1lc1syXSwgRGVmYXVsdENvcmQpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgT3B0aW9uYWxJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEludDY0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKDIsIE9wdGlvbmFsSW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxVaW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50MzJTaXplKDMsIE9wdGlvbmFsVWludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsVWludDY0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDY0U2l6ZSg0LCBPcHRpb25hbFVpbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbFNpbnQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQzMlNpemUoNSwgT3B0aW9uYWxTaW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTaW50NjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50NjRTaXplKDYsIE9wdGlvbmFsU2ludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRml4ZWQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZpeGVkMzJTaXplKDcsIE9wdGlvbmFsRml4ZWQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZpeGVkNjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGaXhlZDY0U2l6ZSg4LCBPcHRpb25hbEZpeGVkNjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTZml4ZWQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNGaXhlZDMyU2l6ZSg5LCBPcHRpb25hbFNmaXhlZDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsU2ZpeGVkNjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTRml4ZWQ2NFNpemUoMTAsIE9wdGlvbmFsU2ZpeGVkNjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxGbG9hdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSgxMSwgT3B0aW9uYWxGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbERvdWJsZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZURvdWJsZVNpemUoMTIsIE9wdGlvbmFsRG91YmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsQm9vbCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDEzLCBPcHRpb25hbEJvb2wpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxTdHJpbmcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDE0LCBPcHRpb25hbFN0cmluZyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEJ5dGVzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplKDE1LCBPcHRpb25hbEJ5dGVzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsR3JvdXApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVHcm91cFNpemUoMTYsIE9wdGlvbmFsR3JvdXApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMTgsIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMTksIE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMjAsIE9wdGlvbmFsSW1wb3J0TWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbE5lc3RlZEVudW0pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgyMSwgKGludCkgT3B0aW9uYWxOZXN0ZWRFbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsRm9yZWlnbkVudW0pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgyMiwgKGludCkgT3B0aW9uYWxGb3JlaWduRW51bSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPcHRpb25hbEltcG9ydEVudW0pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgyMywgKGludCkgT3B0aW9uYWxJbXBvcnRFbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsU3RyaW5nUGllY2UpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDI0LCBPcHRpb25hbFN0cmluZ1BpZWNlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsQ29yZCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMjUsIE9wdGlvbmFsQ29yZCk7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChpbnQgZWxlbWVudCBpbiBSZXBlYXRlZEludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkSW50MzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAobG9uZyBlbGVtZW50IGluIFJlcGVhdGVkSW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRJbnQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoICh1aW50IGVsZW1lbnQgaW4gUmVwZWF0ZWRVaW50MzJMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkVWludDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHVsb25nIGVsZW1lbnQgaW4gUmVwZWF0ZWRVaW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkVWludDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIFJlcGVhdGVkU2ludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZFNpbnQzMl8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChsb25nIGVsZW1lbnQgaW4gUmVwZWF0ZWRTaW50NjRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkU2ludDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHJlcGVhdGVkRml4ZWQzMl8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRGaXhlZDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHJlcGVhdGVkRml4ZWQ2NF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRGaXhlZDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHJlcGVhdGVkU2ZpeGVkMzJfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkU2ZpeGVkMzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA4ICogcmVwZWF0ZWRTZml4ZWQ2NF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRTZml4ZWQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDQgKiByZXBlYXRlZEZsb2F0Xy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZEZsb2F0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHJlcGVhdGVkRG91YmxlXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZERvdWJsZV8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDEgKiByZXBlYXRlZEJvb2xfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkQm9vbF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChzdHJpbmcgZWxlbWVudCBpbiBSZXBlYXRlZFN0cmluZ0xpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRTdHJpbmdfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAocGI6OkJ5dGVTdHJpbmcgZWxlbWVudCBpbiBSZXBlYXRlZEJ5dGVzTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJ5dGVzU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkQnl0ZXNfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cCBlbGVtZW50IGluIFJlcGVhdGVkR3JvdXBMaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlR3JvdXBTaXplKDQ2LCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgZWxlbWVudCBpbiBSZXBlYXRlZE5lc3RlZE1lc3NhZ2VMaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoNDgsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBlbGVtZW50IGluIFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoNDksIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlIGVsZW1lbnQgaW4gUmVwZWF0ZWRJbXBvcnRNZXNzYWdlTGlzdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDUwLCBlbGVtZW50KTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGlmIChyZXBlYXRlZE5lc3RlZEVudW1fLkNvdW50ID4gMCkgew0KKyAgICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSBlbGVtZW50IGluIHJlcGVhdGVkTmVzdGVkRW51bV8pIHsNCisgICAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplTm9UYWcoKGludCkgZWxlbWVudCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWROZXN0ZWRFbnVtXy5Db3VudDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGlmIChyZXBlYXRlZEZvcmVpZ25FbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gZWxlbWVudCBpbiByZXBlYXRlZEZvcmVpZ25FbnVtXykgew0KKyAgICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemVOb1RhZygoaW50KSBlbGVtZW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZEZvcmVpZ25FbnVtXy5Db3VudDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGlmIChyZXBlYXRlZEltcG9ydEVudW1fLkNvdW50ID4gMCkgew0KKyAgICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtIGVsZW1lbnQgaW4gcmVwZWF0ZWRJbXBvcnRFbnVtXykgew0KKyAgICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemVOb1RhZygoaW50KSBlbGVtZW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZEltcG9ydEVudW1fLkNvdW50Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGVsZW1lbnQgaW4gUmVwZWF0ZWRTdHJpbmdQaWVjZUxpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogcmVwZWF0ZWRTdHJpbmdQaWVjZV8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChzdHJpbmcgZWxlbWVudCBpbiBSZXBlYXRlZENvcmRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkQ29yZF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0SW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNjEsIERlZmF1bHRJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0SW50NjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUoNjIsIERlZmF1bHRJbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0VWludDMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDMyU2l6ZSg2MywgRGVmYXVsdFVpbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0VWludDY0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDY0U2l6ZSg2NCwgRGVmYXVsdFVpbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0U2ludDMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDMyU2l6ZSg2NSwgRGVmYXVsdFNpbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0U2ludDY0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDY0U2l6ZSg2NiwgRGVmYXVsdFNpbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0Rml4ZWQzMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZpeGVkMzJTaXplKDY3LCBEZWZhdWx0Rml4ZWQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0Rml4ZWQ2NCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZpeGVkNjRTaXplKDY4LCBEZWZhdWx0Rml4ZWQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0U2ZpeGVkMzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTRml4ZWQzMlNpemUoNjksIERlZmF1bHRTZml4ZWQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0U2ZpeGVkNjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTRml4ZWQ2NFNpemUoNzAsIERlZmF1bHRTZml4ZWQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0RmxvYXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoNzEsIERlZmF1bHRGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0RG91YmxlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRG91YmxlU2l6ZSg3MiwgRGVmYXVsdERvdWJsZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0Qm9vbCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJvb2xTaXplKDczLCBEZWZhdWx0Qm9vbCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0U3RyaW5nKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSg3NCwgRGVmYXVsdFN0cmluZyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0Qnl0ZXMpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCeXRlc1NpemUoNzUsIERlZmF1bHRCeXRlcyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0TmVzdGVkRW51bSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDgxLCAoaW50KSBEZWZhdWx0TmVzdGVkRW51bSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0Rm9yZWlnbkVudW0pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSg4MiwgKGludCkgRGVmYXVsdEZvcmVpZ25FbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRJbXBvcnRFbnVtKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoODMsIChpbnQpIERlZmF1bHRJbXBvcnRFbnVtKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0RlZmF1bHRTdHJpbmdQaWVjZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoODQsIERlZmF1bHRTdHJpbmdQaWVjZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEZWZhdWx0Q29yZCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoODUsIERlZmF1bHRDb3JkKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdEFsbFR5cGVzIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXBlYXRlZEludDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEludDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZFVpbnQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRVaW50NjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU2ludDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZFNpbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRGaXhlZDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEZpeGVkNjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU2ZpeGVkMzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU2ZpeGVkNjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkRmxvYXRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkRG91YmxlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEJvb2xfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU3RyaW5nXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEJ5dGVzXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEdyb3VwXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWROZXN0ZWRFbnVtXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEZvcmVpZ25FbnVtXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEltcG9ydEVudW1fLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU3RyaW5nUGllY2VfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkQ29yZF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0QWxsVHlwZXMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0QWxsVHlwZXMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0QWxsVHlwZXMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdEFsbFR5cGVzIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdEFsbFR5cGVzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdEFsbFR5cGVzKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0QWxsVHlwZXMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEFsbFR5cGVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RBbGxUeXBlcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdEFsbFR5cGVzKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RBbGxUeXBlcykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RBbGxUeXBlcyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEludDMyKSB7DQorICAgICAgICAgIE9wdGlvbmFsSW50MzIgPSBvdGhlci5PcHRpb25hbEludDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsSW50NjQpIHsNCisgICAgICAgICAgT3B0aW9uYWxJbnQ2NCA9IG90aGVyLk9wdGlvbmFsSW50NjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxVaW50MzIpIHsNCisgICAgICAgICAgT3B0aW9uYWxVaW50MzIgPSBvdGhlci5PcHRpb25hbFVpbnQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbFVpbnQ2NCkgew0KKyAgICAgICAgICBPcHRpb25hbFVpbnQ2NCA9IG90aGVyLk9wdGlvbmFsVWludDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsU2ludDMyKSB7DQorICAgICAgICAgIE9wdGlvbmFsU2ludDMyID0gb3RoZXIuT3B0aW9uYWxTaW50MzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxTaW50NjQpIHsNCisgICAgICAgICAgT3B0aW9uYWxTaW50NjQgPSBvdGhlci5PcHRpb25hbFNpbnQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEZpeGVkMzIpIHsNCisgICAgICAgICAgT3B0aW9uYWxGaXhlZDMyID0gb3RoZXIuT3B0aW9uYWxGaXhlZDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsRml4ZWQ2NCkgew0KKyAgICAgICAgICBPcHRpb25hbEZpeGVkNjQgPSBvdGhlci5PcHRpb25hbEZpeGVkNjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxTZml4ZWQzMikgew0KKyAgICAgICAgICBPcHRpb25hbFNmaXhlZDMyID0gb3RoZXIuT3B0aW9uYWxTZml4ZWQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbFNmaXhlZDY0KSB7DQorICAgICAgICAgIE9wdGlvbmFsU2ZpeGVkNjQgPSBvdGhlci5PcHRpb25hbFNmaXhlZDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsRmxvYXQpIHsNCisgICAgICAgICAgT3B0aW9uYWxGbG9hdCA9IG90aGVyLk9wdGlvbmFsRmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxEb3VibGUpIHsNCisgICAgICAgICAgT3B0aW9uYWxEb3VibGUgPSBvdGhlci5PcHRpb25hbERvdWJsZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEJvb2wpIHsNCisgICAgICAgICAgT3B0aW9uYWxCb29sID0gb3RoZXIuT3B0aW9uYWxCb29sOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsU3RyaW5nKSB7DQorICAgICAgICAgIE9wdGlvbmFsU3RyaW5nID0gb3RoZXIuT3B0aW9uYWxTdHJpbmc7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxCeXRlcykgew0KKyAgICAgICAgICBPcHRpb25hbEJ5dGVzID0gb3RoZXIuT3B0aW9uYWxCeXRlczsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEdyb3VwKSB7DQorICAgICAgICAgIE1lcmdlT3B0aW9uYWxHcm91cChvdGhlci5PcHRpb25hbEdyb3VwKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UpIHsNCisgICAgICAgICAgTWVyZ2VPcHRpb25hbE5lc3RlZE1lc3NhZ2Uob3RoZXIuT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKSB7DQorICAgICAgICAgIE1lcmdlT3B0aW9uYWxGb3JlaWduTWVzc2FnZShvdGhlci5PcHRpb25hbEZvcmVpZ25NZXNzYWdlKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UpIHsNCisgICAgICAgICAgTWVyZ2VPcHRpb25hbEltcG9ydE1lc3NhZ2Uob3RoZXIuT3B0aW9uYWxJbXBvcnRNZXNzYWdlKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbE5lc3RlZEVudW0pIHsNCisgICAgICAgICAgT3B0aW9uYWxOZXN0ZWRFbnVtID0gb3RoZXIuT3B0aW9uYWxOZXN0ZWRFbnVtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsRm9yZWlnbkVudW0pIHsNCisgICAgICAgICAgT3B0aW9uYWxGb3JlaWduRW51bSA9IG90aGVyLk9wdGlvbmFsRm9yZWlnbkVudW07DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzT3B0aW9uYWxJbXBvcnRFbnVtKSB7DQorICAgICAgICAgIE9wdGlvbmFsSW1wb3J0RW51bSA9IG90aGVyLk9wdGlvbmFsSW1wb3J0RW51bTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbFN0cmluZ1BpZWNlKSB7DQorICAgICAgICAgIE9wdGlvbmFsU3RyaW5nUGllY2UgPSBvdGhlci5PcHRpb25hbFN0cmluZ1BpZWNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsQ29yZCkgew0KKyAgICAgICAgICBPcHRpb25hbENvcmQgPSBvdGhlci5PcHRpb25hbENvcmQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRJbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQzMl8uQWRkKG90aGVyLnJlcGVhdGVkSW50MzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDY0Xy5BZGQob3RoZXIucmVwZWF0ZWRJbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkVWludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQzMl8uQWRkKG90aGVyLnJlcGVhdGVkVWludDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRVaW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDY0Xy5BZGQob3RoZXIucmVwZWF0ZWRVaW50NjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFNpbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRTaW50MzJfLkFkZChvdGhlci5yZXBlYXRlZFNpbnQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkU2ludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQ2NF8uQWRkKG90aGVyLnJlcGVhdGVkU2ludDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRGaXhlZDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkMzJfLkFkZChvdGhlci5yZXBlYXRlZEZpeGVkMzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEZpeGVkNjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQ2NF8uQWRkKG90aGVyLnJlcGVhdGVkRml4ZWQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkU2ZpeGVkMzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkMzJfLkFkZChvdGhlci5yZXBlYXRlZFNmaXhlZDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRTZml4ZWQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRTZml4ZWQ2NF8uQWRkKG90aGVyLnJlcGVhdGVkU2ZpeGVkNjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEZsb2F0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0Xy5BZGQob3RoZXIucmVwZWF0ZWRGbG9hdF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkRG91YmxlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZERvdWJsZV8uQWRkKG90aGVyLnJlcGVhdGVkRG91YmxlXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRCb29sXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJvb2xfLkFkZChvdGhlci5yZXBlYXRlZEJvb2xfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFN0cmluZ18uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdfLkFkZChvdGhlci5yZXBlYXRlZFN0cmluZ18pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkQnl0ZXNfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkQnl0ZXNfLkFkZChvdGhlci5yZXBlYXRlZEJ5dGVzXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRHcm91cF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRHcm91cF8uQWRkKG90aGVyLnJlcGVhdGVkR3JvdXBfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uQWRkKG90aGVyLnJlcGVhdGVkTmVzdGVkTWVzc2FnZV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkFkZChvdGhlci5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEltcG9ydE1lc3NhZ2VfLkFkZChvdGhlci5yZXBlYXRlZEltcG9ydE1lc3NhZ2VfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZE5lc3RlZEVudW1fLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkTmVzdGVkRW51bV8uQWRkKG90aGVyLnJlcGVhdGVkTmVzdGVkRW51bV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkRm9yZWlnbkVudW1fLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbkVudW1fLkFkZChvdGhlci5yZXBlYXRlZEZvcmVpZ25FbnVtXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRJbXBvcnRFbnVtXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEltcG9ydEVudW1fLkFkZChvdGhlci5yZXBlYXRlZEltcG9ydEVudW1fKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFN0cmluZ1BpZWNlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ1BpZWNlXy5BZGQob3RoZXIucmVwZWF0ZWRTdHJpbmdQaWVjZV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkQ29yZF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRDb3JkXy5BZGQob3RoZXIucmVwZWF0ZWRDb3JkXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdEludDMyKSB7DQorICAgICAgICAgIERlZmF1bHRJbnQzMiA9IG90aGVyLkRlZmF1bHRJbnQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0SW50NjQpIHsNCisgICAgICAgICAgRGVmYXVsdEludDY0ID0gb3RoZXIuRGVmYXVsdEludDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRVaW50MzIpIHsNCisgICAgICAgICAgRGVmYXVsdFVpbnQzMiA9IG90aGVyLkRlZmF1bHRVaW50MzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdFVpbnQ2NCkgew0KKyAgICAgICAgICBEZWZhdWx0VWludDY0ID0gb3RoZXIuRGVmYXVsdFVpbnQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0U2ludDMyKSB7DQorICAgICAgICAgIERlZmF1bHRTaW50MzIgPSBvdGhlci5EZWZhdWx0U2ludDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRTaW50NjQpIHsNCisgICAgICAgICAgRGVmYXVsdFNpbnQ2NCA9IG90aGVyLkRlZmF1bHRTaW50NjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdEZpeGVkMzIpIHsNCisgICAgICAgICAgRGVmYXVsdEZpeGVkMzIgPSBvdGhlci5EZWZhdWx0Rml4ZWQzMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0Rml4ZWQ2NCkgew0KKyAgICAgICAgICBEZWZhdWx0Rml4ZWQ2NCA9IG90aGVyLkRlZmF1bHRGaXhlZDY0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRTZml4ZWQzMikgew0KKyAgICAgICAgICBEZWZhdWx0U2ZpeGVkMzIgPSBvdGhlci5EZWZhdWx0U2ZpeGVkMzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdFNmaXhlZDY0KSB7DQorICAgICAgICAgIERlZmF1bHRTZml4ZWQ2NCA9IG90aGVyLkRlZmF1bHRTZml4ZWQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0RmxvYXQpIHsNCisgICAgICAgICAgRGVmYXVsdEZsb2F0ID0gb3RoZXIuRGVmYXVsdEZsb2F0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHREb3VibGUpIHsNCisgICAgICAgICAgRGVmYXVsdERvdWJsZSA9IG90aGVyLkRlZmF1bHREb3VibGU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdEJvb2wpIHsNCisgICAgICAgICAgRGVmYXVsdEJvb2wgPSBvdGhlci5EZWZhdWx0Qm9vbDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0U3RyaW5nKSB7DQorICAgICAgICAgIERlZmF1bHRTdHJpbmcgPSBvdGhlci5EZWZhdWx0U3RyaW5nOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRCeXRlcykgew0KKyAgICAgICAgICBEZWZhdWx0Qnl0ZXMgPSBvdGhlci5EZWZhdWx0Qnl0ZXM7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdE5lc3RlZEVudW0pIHsNCisgICAgICAgICAgRGVmYXVsdE5lc3RlZEVudW0gPSBvdGhlci5EZWZhdWx0TmVzdGVkRW51bTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0Rm9yZWlnbkVudW0pIHsNCisgICAgICAgICAgRGVmYXVsdEZvcmVpZ25FbnVtID0gb3RoZXIuRGVmYXVsdEZvcmVpZ25FbnVtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RlZmF1bHRJbXBvcnRFbnVtKSB7DQorICAgICAgICAgIERlZmF1bHRJbXBvcnRFbnVtID0gb3RoZXIuRGVmYXVsdEltcG9ydEVudW07DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRGVmYXVsdFN0cmluZ1BpZWNlKSB7DQorICAgICAgICAgIERlZmF1bHRTdHJpbmdQaWVjZSA9IG90aGVyLkRlZmF1bHRTdHJpbmdQaWVjZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEZWZhdWx0Q29yZCkgew0KKyAgICAgICAgICBEZWZhdWx0Q29yZCA9IG90aGVyLkRlZmF1bHRDb3JkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdEFsbFR5cGVzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RBbGxUeXBlc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbnQzMiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0Lm9wdGlvbmFsSW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbnQ2NCA9IGlucHV0LlJlYWRJbnQ2NChyZWYgcmVzdWx0Lm9wdGlvbmFsSW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxVaW50MzIgPSBpbnB1dC5SZWFkVUludDMyKHJlZiByZXN1bHQub3B0aW9uYWxVaW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxVaW50NjQgPSBpbnB1dC5SZWFkVUludDY0KHJlZiByZXN1bHQub3B0aW9uYWxVaW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTaW50MzIgPSBpbnB1dC5SZWFkU0ludDMyKHJlZiByZXN1bHQub3B0aW9uYWxTaW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQ4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTaW50NjQgPSBpbnB1dC5SZWFkU0ludDY0KHJlZiByZXN1bHQub3B0aW9uYWxTaW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDYxOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGaXhlZDMyID0gaW5wdXQuUmVhZEZpeGVkMzIocmVmIHJlc3VsdC5vcHRpb25hbEZpeGVkMzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY1OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGaXhlZDY0ID0gaW5wdXQuUmVhZEZpeGVkNjQocmVmIHJlc3VsdC5vcHRpb25hbEZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc3OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTZml4ZWQzMiA9IGlucHV0LlJlYWRTRml4ZWQzMihyZWYgcmVzdWx0Lm9wdGlvbmFsU2ZpeGVkMzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgxOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTZml4ZWQ2NCA9IGlucHV0LlJlYWRTRml4ZWQ2NChyZWYgcmVzdWx0Lm9wdGlvbmFsU2ZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDkzOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0Lm9wdGlvbmFsRmxvYXRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDk3OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxEb3VibGUgPSBpbnB1dC5SZWFkRG91YmxlKHJlZiByZXN1bHQub3B0aW9uYWxEb3VibGVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsQm9vbCA9IGlucHV0LlJlYWRCb29sKHJlZiByZXN1bHQub3B0aW9uYWxCb29sXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMTQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFN0cmluZyA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5vcHRpb25hbFN0cmluZ18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTIyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxCeXRlcyA9IGlucHV0LlJlYWRCeXRlcyhyZWYgcmVzdWx0Lm9wdGlvbmFsQnl0ZXNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEzMTogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbEdyb3VwKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKE9wdGlvbmFsR3JvdXApOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEdyb3VwKDE2LCBzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBPcHRpb25hbEdyb3VwID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE0Njogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNTQ6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShPcHRpb25hbEZvcmVpZ25NZXNzYWdlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTYyOiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oT3B0aW9uYWxJbXBvcnRNZXNzYWdlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIE9wdGlvbmFsSW1wb3J0TWVzc2FnZSA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjg6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5vcHRpb25hbE5lc3RlZEVudW1fLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkRW51bSA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoMjEsICh1bG9uZykoaW50KXVua25vd24pOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTc2OiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQub3B0aW9uYWxGb3JlaWduRW51bV8sIG91dCB1bmtub3duKSkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGb3JlaWduRW51bSA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoMjIsICh1bG9uZykoaW50KXVua25vd24pOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTg0OiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQub3B0aW9uYWxJbXBvcnRFbnVtXywgb3V0IHVua25vd24pKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEltcG9ydEVudW0gPSB0cnVlOw0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmKHVua25vd24gaXMgaW50KSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5NZXJnZVZhcmludEZpZWxkKDIzLCAodWxvbmcpKGludCl1bmtub3duKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE5NDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nUGllY2UgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQub3B0aW9uYWxTdHJpbmdQaWVjZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjAyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxDb3JkID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0Lm9wdGlvbmFsQ29yZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjUwOg0KKyAgICAgICAgICAgIGNhc2UgMjQ4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNTg6DQorICAgICAgICAgICAgY2FzZSAyNTY6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRJbnQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkSW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI2NjoNCisgICAgICAgICAgICBjYXNlIDI2NDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFVJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkVWludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNzQ6DQorICAgICAgICAgICAgY2FzZSAyNzI6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRVSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZFVpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjgyOg0KKyAgICAgICAgICAgIGNhc2UgMjgwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTaW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI5MDoNCisgICAgICAgICAgICBjYXNlIDI4ODogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNJbnQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkU2ludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyOTg6DQorICAgICAgICAgICAgY2FzZSAzMDE6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzMDY6DQorICAgICAgICAgICAgY2FzZSAzMDU6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGaXhlZDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzMTQ6DQorICAgICAgICAgICAgY2FzZSAzMTc6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTRml4ZWQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkMzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMyMjoNCisgICAgICAgICAgICBjYXNlIDMyMTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNGaXhlZDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTZml4ZWQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzMwOg0KKyAgICAgICAgICAgIGNhc2UgMzMzOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRmxvYXRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzMzg6DQorICAgICAgICAgICAgY2FzZSAzMzc6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWREb3VibGVBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZERvdWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzQ2Og0KKyAgICAgICAgICAgIGNhc2UgMzQ0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkQm9vbEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkQm9vbF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzU0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU3RyaW5nQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRTdHJpbmdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDM2Mjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEJ5dGVzQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRCeXRlc18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMzcxOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkR3JvdXBBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEdyb3VwXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAuRGVmYXVsdEluc3RhbmNlLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzODY6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzOTQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDAyOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkSW1wb3J0TWVzc2FnZV8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0MTA6DQorICAgICAgICAgICAgY2FzZSA0MDg6IHsNCisgICAgICAgICAgICAgIHNjZzo6SUNvbGxlY3Rpb248b2JqZWN0PiB1bmtub3duSXRlbXM7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRW51bUFycmF5PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtPih0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZE5lc3RlZEVudW1fLCBvdXQgdW5rbm93bkl0ZW1zKTsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duSXRlbXMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCByYXdWYWx1ZSBpbiB1bmtub3duSXRlbXMpDQorICAgICAgICAgICAgICAgICAgaWYgKHJhd1ZhbHVlIGlzIGludCkNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuTWVyZ2VWYXJpbnRGaWVsZCg1MSwgKHVsb25nKShpbnQpcmF3VmFsdWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDE4Og0KKyAgICAgICAgICAgIGNhc2UgNDE2OiB7DQorICAgICAgICAgICAgICBzY2c6OklDb2xsZWN0aW9uPG9iamVjdD4gdW5rbm93bkl0ZW1zOw0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEVudW1BcnJheTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4odGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRGb3JlaWduRW51bV8sIG91dCB1bmtub3duSXRlbXMpOw0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25JdGVtcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IHJhd1ZhbHVlIGluIHVua25vd25JdGVtcykNCisgICAgICAgICAgICAgICAgICBpZiAocmF3VmFsdWUgaXMgaW50KQ0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5NZXJnZVZhcmludEZpZWxkKDUyLCAodWxvbmcpKGludClyYXdWYWx1ZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0MjY6DQorICAgICAgICAgICAgY2FzZSA0MjQ6IHsNCisgICAgICAgICAgICAgIHNjZzo6SUNvbGxlY3Rpb248b2JqZWN0PiB1bmtub3duSXRlbXM7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRW51bUFycmF5PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0+KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkSW1wb3J0RW51bV8sIG91dCB1bmtub3duSXRlbXMpOw0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25JdGVtcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IHJhd1ZhbHVlIGluIHVua25vd25JdGVtcykNCisgICAgICAgICAgICAgICAgICBpZiAocmF3VmFsdWUgaXMgaW50KQ0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5NZXJnZVZhcmludEZpZWxkKDUzLCAodWxvbmcpKGludClyYXdWYWx1ZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0MzQ6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTdHJpbmdBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZFN0cmluZ1BpZWNlXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0NDI6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTdHJpbmdBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZENvcmRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDQ4ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRJbnQzMiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmRlZmF1bHRJbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDk2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEludDY0ID0gaW5wdXQuUmVhZEludDY0KHJlZiByZXN1bHQuZGVmYXVsdEludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1MDQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0VWludDMyID0gaW5wdXQuUmVhZFVJbnQzMihyZWYgcmVzdWx0LmRlZmF1bHRVaW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDUxMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRVaW50NjQgPSBpbnB1dC5SZWFkVUludDY0KHJlZiByZXN1bHQuZGVmYXVsdFVpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTIwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNpbnQzMiA9IGlucHV0LlJlYWRTSW50MzIocmVmIHJlc3VsdC5kZWZhdWx0U2ludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1Mjg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ludDY0ID0gaW5wdXQuUmVhZFNJbnQ2NChyZWYgcmVzdWx0LmRlZmF1bHRTaW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU0MTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGaXhlZDMyID0gaW5wdXQuUmVhZEZpeGVkMzIocmVmIHJlc3VsdC5kZWZhdWx0Rml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTQ1OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEZpeGVkNjQgPSBpbnB1dC5SZWFkRml4ZWQ2NChyZWYgcmVzdWx0LmRlZmF1bHRGaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1NTc6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ZpeGVkMzIgPSBpbnB1dC5SZWFkU0ZpeGVkMzIocmVmIHJlc3VsdC5kZWZhdWx0U2ZpeGVkMzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU2MTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTZml4ZWQ2NCA9IGlucHV0LlJlYWRTRml4ZWQ2NChyZWYgcmVzdWx0LmRlZmF1bHRTZml4ZWQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTczOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEZsb2F0ID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQuZGVmYXVsdEZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1Nzc6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0RG91YmxlID0gaW5wdXQuUmVhZERvdWJsZShyZWYgcmVzdWx0LmRlZmF1bHREb3VibGVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU4NDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRCb29sID0gaW5wdXQuUmVhZEJvb2wocmVmIHJlc3VsdC5kZWZhdWx0Qm9vbF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTk0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFN0cmluZyA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5kZWZhdWx0U3RyaW5nXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2MDI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Qnl0ZXMgPSBpbnB1dC5SZWFkQnl0ZXMocmVmIHJlc3VsdC5kZWZhdWx0Qnl0ZXNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY0ODogew0KKyAgICAgICAgICAgICAgb2JqZWN0IHVua25vd247DQorICAgICAgICAgICAgICBpZihpbnB1dC5SZWFkRW51bShyZWYgcmVzdWx0LmRlZmF1bHROZXN0ZWRFbnVtXywgb3V0IHVua25vd24pKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0TmVzdGVkRW51bSA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoODEsICh1bG9uZykoaW50KXVua25vd24pOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjU2OiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQuZGVmYXVsdEZvcmVpZ25FbnVtXywgb3V0IHVua25vd24pKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Rm9yZWlnbkVudW0gPSB0cnVlOw0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmKHVua25vd24gaXMgaW50KSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5NZXJnZVZhcmludEZpZWxkKDgyLCAodWxvbmcpKGludCl1bmtub3duKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY2NDogew0KKyAgICAgICAgICAgICAgb2JqZWN0IHVua25vd247DQorICAgICAgICAgICAgICBpZihpbnB1dC5SZWFkRW51bShyZWYgcmVzdWx0LmRlZmF1bHRJbXBvcnRFbnVtXywgb3V0IHVua25vd24pKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0SW1wb3J0RW51bSA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoODMsICh1bG9uZykoaW50KXVua25vd24pOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjc0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFN0cmluZ1BpZWNlID0gaW5wdXQuUmVhZFN0cmluZyhyZWYgcmVzdWx0LmRlZmF1bHRTdHJpbmdQaWVjZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjgyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGVmYXVsdENvcmQgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuZGVmYXVsdENvcmRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxJbnQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IE9wdGlvbmFsSW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEludDMyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEludDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEludDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxJbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbnQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW50MzJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxJbnQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBPcHRpb25hbEludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxJbnQ2NDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxJbnQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxJbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW50NjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW50NjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEludDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbnQ2NF8gPSAwTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFVpbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsVWludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1aW50IE9wdGlvbmFsVWludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxVaW50MzI7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsVWludDMyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbFVpbnQzMih1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsVWludDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFVpbnQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsVWludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFVpbnQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsVWludDMyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxVaW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbFVpbnQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgT3B0aW9uYWxVaW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbFVpbnQ2NDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxVaW50NjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsVWludDY0KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsVWludDY0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFVpbnQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsVWludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFVpbnQ2NCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsVWludDY0XyA9IDBVTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbFNpbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsU2ludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgT3B0aW9uYWxTaW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbFNpbnQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxTaW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsU2ludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNpbnQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTaW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbFNpbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTaW50MzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFNpbnQzMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU2ludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxTaW50NjQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgT3B0aW9uYWxTaW50NjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbFNpbnQ2NDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxTaW50NjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsU2ludDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTaW50NjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsU2ludDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxTaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU2ludDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTaW50NjRfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEZpeGVkMzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEZpeGVkMzI7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgT3B0aW9uYWxGaXhlZDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxGaXhlZDMyOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEZpeGVkMzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsRml4ZWQzMih1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRml4ZWQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxGaXhlZDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxGaXhlZDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZpeGVkMzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZpeGVkMzJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEZpeGVkNjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEZpeGVkNjQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIE9wdGlvbmFsRml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsRml4ZWQ2NDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxGaXhlZDY0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEZpeGVkNjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGaXhlZDY0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZpeGVkNjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEZpeGVkNjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRml4ZWQ2NCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRml4ZWQ2NF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU2ZpeGVkMzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbFNmaXhlZDMyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgT3B0aW9uYWxTZml4ZWQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsU2ZpeGVkMzI7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsU2ZpeGVkMzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsU2ZpeGVkMzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU2ZpeGVkMzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsU2ZpeGVkMzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbFNmaXhlZDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFNmaXhlZDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTZml4ZWQzMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsU2ZpeGVkNjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbFNmaXhlZDY0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIE9wdGlvbmFsU2ZpeGVkNjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbFNmaXhlZDY0OyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbFNmaXhlZDY0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbFNmaXhlZDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxTZml4ZWQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTZml4ZWQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsU2ZpeGVkNjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU2ZpeGVkNjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFNmaXhlZDY0XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IE9wdGlvbmFsRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEZsb2F0OyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRmxvYXQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZsb2F0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxGbG9hdF8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbERvdWJsZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsRG91YmxlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBkb3VibGUgT3B0aW9uYWxEb3VibGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbERvdWJsZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxEb3VibGUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsRG91YmxlKGRvdWJsZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbERvdWJsZSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxEb3VibGVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbERvdWJsZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxEb3VibGUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbERvdWJsZV8gPSAwRDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEJvb2wgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEJvb2w7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgT3B0aW9uYWxCb29sIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxCb29sOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEJvb2wodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsQm9vbChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsQm9vbCA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxCb29sXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxCb29sKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEJvb2wgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEJvb2xfID0gZmFsc2U7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTdHJpbmcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbFN0cmluZzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIE9wdGlvbmFsU3RyaW5nIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxTdHJpbmc7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsU3RyaW5nKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbFN0cmluZyhzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbFN0cmluZ18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsU3RyaW5nKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFN0cmluZyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsU3RyaW5nXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsQnl0ZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEJ5dGVzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBPcHRpb25hbEJ5dGVzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxCeXRlczsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxCeXRlcyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxCeXRlcyhwYjo6Qnl0ZVN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxCeXRlcyA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxCeXRlc18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck9wdGlvbmFsQnl0ZXMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsQnl0ZXMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEJ5dGVzXyA9IHBiOjpCeXRlU3RyaW5nLkVtcHR5Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsR3JvdXAgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsR3JvdXA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwIE9wdGlvbmFsR3JvdXAgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEdyb3VwOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEdyb3VwKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEdyb3VwKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEdyb3VwID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEdyb3VwXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsR3JvdXAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxHcm91cCA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxHcm91cF8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbmFsR3JvdXAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk9wdGlvbmFsR3JvdXAgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbEdyb3VwICYmDQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsR3JvdXBfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbEdyb3VwXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5PcHRpb25hbEdyb3VwLkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm9wdGlvbmFsR3JvdXBfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsR3JvdXBfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxHcm91cCA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEdyb3VwKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEdyb3VwID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxHcm91cF8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSBPcHRpb25hbE5lc3RlZE1lc3NhZ2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbE5lc3RlZE1lc3NhZ2U7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VPcHRpb25hbE5lc3RlZE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UgJiYNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm9wdGlvbmFsTmVzdGVkTWVzc2FnZV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbE5lc3RlZE1lc3NhZ2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2Ugew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEZvcmVpZ25NZXNzYWdlOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEZvcmVpZ25NZXNzYWdlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlICYmDQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbEZvcmVpZ25NZXNzYWdlXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlIE9wdGlvbmFsSW1wb3J0TWVzc2FnZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsSW1wb3J0TWVzc2FnZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxJbXBvcnRNZXNzYWdlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEltcG9ydE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEltcG9ydE1lc3NhZ2VfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxJbXBvcnRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEltcG9ydE1lc3NhZ2VfID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VPcHRpb25hbEltcG9ydE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbEltcG9ydE1lc3NhZ2VfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW1wb3J0TWVzc2FnZV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm9wdGlvbmFsSW1wb3J0TWVzc2FnZV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQub3B0aW9uYWxJbXBvcnRNZXNzYWdlXyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEltcG9ydE1lc3NhZ2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW1wb3J0TWVzc2FnZV8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsTmVzdGVkRW51bSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRFbnVtOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSBPcHRpb25hbE5lc3RlZEVudW0gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbE5lc3RlZEVudW07IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsTmVzdGVkRW51bSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxOZXN0ZWRFbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkRW51bSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRFbnVtXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT3B0aW9uYWxOZXN0ZWRFbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZEVudW0gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZEVudW1fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uRk9POw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsRm9yZWlnbkVudW0gew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsRm9yZWlnbkVudW07IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIE9wdGlvbmFsRm9yZWlnbkVudW0gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEZvcmVpZ25FbnVtOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbEZvcmVpZ25FbnVtKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbEZvcmVpZ25FbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsRm9yZWlnbkVudW0gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsRm9yZWlnbkVudW1fID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEZvcmVpZ25FbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEZvcmVpZ25FbnVtID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxGb3JlaWduRW51bV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPTzsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEltcG9ydEVudW0gew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsSW1wb3J0RW51bTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSBPcHRpb25hbEltcG9ydEVudW0gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbEltcG9ydEVudW07IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsSW1wb3J0RW51bSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxJbXBvcnRFbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxJbXBvcnRFbnVtID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbEltcG9ydEVudW1fID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEltcG9ydEVudW0oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW1wb3J0RW51bSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW1wb3J0RW51bV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtLklNUE9SVF9GT087DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzT3B0aW9uYWxTdHJpbmdQaWVjZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nUGllY2U7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBPcHRpb25hbFN0cmluZ1BpZWNlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxTdHJpbmdQaWVjZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0T3B0aW9uYWxTdHJpbmdQaWVjZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxTdHJpbmdQaWVjZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsU3RyaW5nUGllY2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsU3RyaW5nUGllY2VfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbFN0cmluZ1BpZWNlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbFN0cmluZ1BpZWNlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxTdHJpbmdQaWVjZV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbENvcmQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbENvcmQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBPcHRpb25hbENvcmQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbENvcmQ7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsQ29yZCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxDb3JkKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxDb3JkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbENvcmRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbENvcmQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsQ29yZCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsQ29yZF8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gUmVwZWF0ZWRJbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRJbnQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEludDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXRSZXBlYXRlZEludDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEludDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRJbnQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRJbnQzMihzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRJbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGxvbmc+IFJlcGVhdGVkSW50NjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkSW50NjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRJbnQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRJbnQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEdldFJlcGVhdGVkSW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkSW50NjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEludDY0KGludCBpbmRleCwgbG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEludDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkSW50NjQoc2NnOjpJRW51bWVyYWJsZTxsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWludD4gUmVwZWF0ZWRVaW50MzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkVWludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkVWludDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFVpbnQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1aW50IEdldFJlcGVhdGVkVWludDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZFVpbnQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkVWludDMyKGludCBpbmRleCwgdWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRVaW50MzIodWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkVWludDMyKHNjZzo6SUVudW1lcmFibGU8dWludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkVWludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVsb25nPiBSZXBlYXRlZFVpbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRVaW50NjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRVaW50NjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkVWludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEdldFJlcGVhdGVkVWludDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZFVpbnQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkVWludDY0KGludCBpbmRleCwgdWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50NjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkVWludDY0KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRVaW50NjQoc2NnOjpJRW51bWVyYWJsZTx1bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkVWludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gUmVwZWF0ZWRTaW50MzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkU2ludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ludDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFNpbnQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0UmVwZWF0ZWRTaW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkU2ludDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRTaW50MzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTaW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkU2ludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkU2ludDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTaW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRTaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gUmVwZWF0ZWRTaW50NjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkU2ludDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFNpbnQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEdldFJlcGVhdGVkU2ludDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZFNpbnQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkU2ludDY0KGludCBpbmRleCwgbG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRTaW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkU2ludDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ludDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkU2ludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNpbnQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVpbnQ+IFJlcGVhdGVkRml4ZWQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRGaXhlZDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRml4ZWQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRGaXhlZDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgR2V0UmVwZWF0ZWRGaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEZpeGVkMzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEZpeGVkMzIoaW50IGluZGV4LCB1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRGaXhlZDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRGaXhlZDMyKHNjZzo6SUVudW1lcmFibGU8dWludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVsb25nPiBSZXBlYXRlZEZpeGVkNjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkRml4ZWQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEZpeGVkNjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkRml4ZWQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBHZXRSZXBlYXRlZEZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRml4ZWQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkRml4ZWQ2NChpbnQgaW5kZXgsIHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRGaXhlZDY0KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkRml4ZWQ2NChzY2c6OklFbnVtZXJhYmxlPHVsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBSZXBlYXRlZFNmaXhlZDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFNmaXhlZDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU2ZpeGVkMzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkU2ZpeGVkMzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkU2ZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkU2ZpeGVkMzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZFNmaXhlZDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkMzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkU2ZpeGVkMzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkMzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZFNmaXhlZDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTZml4ZWQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZFNmaXhlZDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNmaXhlZDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gUmVwZWF0ZWRTZml4ZWQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRTZml4ZWQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZFNmaXhlZDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFNmaXhlZDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRTZml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRTZml4ZWQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkU2ZpeGVkNjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkNjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkU2ZpeGVkNjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNmaXhlZDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRTZml4ZWQ2NChzY2c6OklFbnVtZXJhYmxlPGxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFNmaXhlZDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkU2ZpeGVkNjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU2ZpeGVkNjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxmbG9hdD4gUmVwZWF0ZWRGbG9hdExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRGbG9hdF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEZsb2F0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEZsb2F0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEdldFJlcGVhdGVkRmxvYXQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRmxvYXQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEZsb2F0KGludCBpbmRleCwgZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGbG9hdF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRGbG9hdChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRGbG9hdChzY2c6OklFbnVtZXJhYmxlPGZsb2F0PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGbG9hdF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8ZG91YmxlPiBSZXBlYXRlZERvdWJsZUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWREb3VibGVfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWREb3VibGVDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkRG91YmxlQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGRvdWJsZSBHZXRSZXBlYXRlZERvdWJsZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWREb3VibGUoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZERvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZERvdWJsZV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWREb3VibGUoZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRG91YmxlXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWREb3VibGUoc2NnOjpJRW51bWVyYWJsZTxkb3VibGU+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZERvdWJsZV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZERvdWJsZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWREb3VibGVfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxib29sPiBSZXBlYXRlZEJvb2xMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkQm9vbF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEJvb2xDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkQm9vbENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIEdldFJlcGVhdGVkQm9vbChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRCb29sKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRCb29sKGludCBpbmRleCwgYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJvb2xfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkQm9vbChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQm9vbF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkQm9vbChzY2c6OklFbnVtZXJhYmxlPGJvb2w+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJvb2xfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRCb29sKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJvb2xfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxzdHJpbmc+IFJlcGVhdGVkU3RyaW5nTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFN0cmluZ187IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZFN0cmluZ0NvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRTdHJpbmdDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZFN0cmluZyhpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkU3RyaW5nKGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ19baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRTdHJpbmcoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ18uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkU3RyaW5nKHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRTdHJpbmcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8cGI6OkJ5dGVTdHJpbmc+IFJlcGVhdGVkQnl0ZXNMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkQnl0ZXNfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRCeXRlc0NvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRCeXRlc0NvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBHZXRSZXBlYXRlZEJ5dGVzKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEJ5dGVzKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRCeXRlcyhpbnQgaW5kZXgsIHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJ5dGVzX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEJ5dGVzKHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJ5dGVzXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRCeXRlcyhzY2c6OklFbnVtZXJhYmxlPHBiOjpCeXRlU3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRCeXRlc18uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEJ5dGVzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEJ5dGVzXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXA+IFJlcGVhdGVkR3JvdXBMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkR3JvdXBfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRHcm91cENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRHcm91cENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cCBHZXRSZXBlYXRlZEdyb3VwKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEdyb3VwKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRHcm91cChpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEdyb3VwX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEdyb3VwKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXAuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRHcm91cF9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRHcm91cChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuUmVwZWF0ZWRHcm91cCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRHcm91cF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEdyb3VwKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5SZXBlYXRlZEdyb3VwLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkR3JvdXBfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEdyb3VwKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLlJlcGVhdGVkR3JvdXA+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEdyb3VwXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkR3JvdXAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkR3JvdXBfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZT4gUmVwZWF0ZWROZXN0ZWRNZXNzYWdlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWROZXN0ZWRNZXNzYWdlQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZE5lc3RlZE1lc3NhZ2VDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgR2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRNZXNzYWdlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZE5lc3RlZE1lc3NhZ2Uoc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPiBSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgR2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZT4gUmVwZWF0ZWRJbXBvcnRNZXNzYWdlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEltcG9ydE1lc3NhZ2VfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRJbXBvcnRNZXNzYWdlQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEltcG9ydE1lc3NhZ2VDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZSBHZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkSW1wb3J0TWVzc2FnZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0TWVzc2FnZV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEltcG9ydE1lc3NhZ2VfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkSW1wb3J0TWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEltcG9ydE1lc3NhZ2VfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRJbXBvcnRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRJbXBvcnRNZXNzYWdlKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEltcG9ydE1lc3NhZ2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtPiBSZXBlYXRlZE5lc3RlZEVudW1MaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkTmVzdGVkRW51bV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZE5lc3RlZEVudW1Db3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkTmVzdGVkRW51bUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSBHZXRSZXBlYXRlZE5lc3RlZEVudW0oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkTmVzdGVkRW51bShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkTmVzdGVkRW51bShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTmVzdGVkRW51bV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWROZXN0ZWRFbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTmVzdGVkRW51bV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkTmVzdGVkRW51bShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRFbnVtXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkTmVzdGVkRW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWROZXN0ZWRFbnVtXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkRm9yZWlnbkVudW1fOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGb3JlaWduRW51bUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRGb3JlaWduRW51bUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBHZXRSZXBlYXRlZEZvcmVpZ25FbnVtKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEZvcmVpZ25FbnVtKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRGb3JlaWduRW51bShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbkVudW1fW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkRm9yZWlnbkVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduRW51bV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkRm9yZWlnbkVudW0oc2NnOjpJRW51bWVyYWJsZTxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRm9yZWlnbkVudW1fLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRGb3JlaWduRW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGb3JlaWduRW51bV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0+IFJlcGVhdGVkSW1wb3J0RW51bUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRJbXBvcnRFbnVtXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkSW1wb3J0RW51bUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRJbXBvcnRFbnVtQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0gR2V0UmVwZWF0ZWRJbXBvcnRFbnVtKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEltcG9ydEVudW0oaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEltcG9ydEVudW0oaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0RW51bV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRJbXBvcnRFbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkltcG9ydEVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbXBvcnRFbnVtXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRJbXBvcnRFbnVtKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0RW51bV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEltcG9ydEVudW0oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW1wb3J0RW51bV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gUmVwZWF0ZWRTdHJpbmdQaWVjZUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRTdHJpbmdQaWVjZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZFN0cmluZ1BpZWNlQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFN0cmluZ1BpZWNlQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZFN0cmluZ1BpZWNlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZFN0cmluZ1BpZWNlKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRTdHJpbmdQaWVjZShpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdQaWVjZV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRTdHJpbmdQaWVjZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZFN0cmluZ1BpZWNlKHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdQaWVjZV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZFN0cmluZ1BpZWNlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ1BpZWNlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBSZXBlYXRlZENvcmRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkQ29yZF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZENvcmRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkQ29yZENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgR2V0UmVwZWF0ZWRDb3JkKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZENvcmQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZENvcmQoaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQ29yZF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRDb3JkKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRDb3JkXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRDb3JkKHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRDb3JkXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkQ29yZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRDb3JkXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRJbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRJbnQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IERlZmF1bHRJbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRJbnQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdEludDMyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0SW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRJbnQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEludDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0SW50MzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0SW50MzJfID0gNDE7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdEludDY0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIERlZmF1bHRJbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRJbnQ2NDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdEludDY0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0SW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0SW50NjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRJbnQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRJbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEludDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEludDY0XyA9IDQyTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0VWludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdFVpbnQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBEZWZhdWx0VWludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdFVpbnQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdFVpbnQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdFVpbnQzMih1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRVaW50MzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRVaW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0VWludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0VWludDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFVpbnQzMl8gPSA0MzsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0VWludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdFVpbnQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgRGVmYXVsdFVpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRVaW50NjQ7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRVaW50NjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRVaW50NjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFVpbnQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFVpbnQ2NF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRVaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRVaW50NjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0VWludDY0XyA9IDQ0VUw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFNpbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRTaW50MzI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEZWZhdWx0U2ludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdFNpbnQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdFNpbnQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdFNpbnQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNpbnQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFNpbnQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRTaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTaW50MzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U2ludDMyXyA9IC00NTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U2ludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdFNpbnQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBEZWZhdWx0U2ludDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdFNpbnQ2NDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdFNpbnQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdFNpbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTaW50NjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTaW50NjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0U2ludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ludDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFNpbnQ2NF8gPSA0NjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Rml4ZWQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRGaXhlZDMyOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1aW50IERlZmF1bHRGaXhlZDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdEZpeGVkMzI7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRGaXhlZDMyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0Rml4ZWQzMih1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGaXhlZDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0Rml4ZWQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRGaXhlZDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Rml4ZWQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRGaXhlZDMyXyA9IDQ3Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRGaXhlZDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdEZpeGVkNjQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIERlZmF1bHRGaXhlZDY0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdEZpeGVkNjQ7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRGaXhlZDY0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0Rml4ZWQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Rml4ZWQ2NCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEZpeGVkNjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0Rml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEZpeGVkNjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0Rml4ZWQ2NF8gPSA0ODsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0U2ZpeGVkMzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0U2ZpeGVkMzI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEZWZhdWx0U2ZpeGVkMzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0U2ZpeGVkMzI7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRTZml4ZWQzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdFNmaXhlZDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U2ZpeGVkMzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTZml4ZWQzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRTZml4ZWQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNmaXhlZDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFNmaXhlZDMyXyA9IDQ5Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRTZml4ZWQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRTZml4ZWQ2NDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBEZWZhdWx0U2ZpeGVkNjQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0U2ZpeGVkNjQ7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRTZml4ZWQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdFNmaXhlZDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdFNmaXhlZDY0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U2ZpeGVkNjRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0U2ZpeGVkNjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTZml4ZWQ2NCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTZml4ZWQ2NF8gPSAtNTA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdEZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdEZsb2F0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBEZWZhdWx0RmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0RmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRGbG9hdCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdEZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEZsb2F0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdEZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0RmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0RmxvYXRfID0gNTEuNUY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdERvdWJsZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHREb3VibGU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGRvdWJsZSBEZWZhdWx0RG91YmxlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdERvdWJsZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdERvdWJsZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdERvdWJsZShkb3VibGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdERvdWJsZSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdERvdWJsZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHREb3VibGUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHREb3VibGUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0RG91YmxlXyA9IDUyMDAwRDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Qm9vbCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRCb29sOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBib29sIERlZmF1bHRCb29sIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdEJvb2w7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRCb29sKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0Qm9vbChib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRCb29sID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0Qm9vbF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRCb29sKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Qm9vbCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRCb29sXyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFN0cmluZyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRTdHJpbmc7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBEZWZhdWx0U3RyaW5nIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdFN0cmluZzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdFN0cmluZyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdFN0cmluZyhzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTdHJpbmcgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRTdHJpbmdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0U3RyaW5nKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U3RyaW5nID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFN0cmluZ18gPSAiaGVsbG8iOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRCeXRlcyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRCeXRlczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgRGVmYXVsdEJ5dGVzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdEJ5dGVzOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0Qnl0ZXModmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRCeXRlcyhwYjo6Qnl0ZVN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEJ5dGVzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0Qnl0ZXNfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0Qnl0ZXMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRCeXRlcyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRCeXRlc18gPSAocGI6OkJ5dGVTdHJpbmcpIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yLkZpZWxkc1s2Ml0uRGVmYXVsdFZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHROZXN0ZWRFbnVtIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0TmVzdGVkRW51bTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0gRGVmYXVsdE5lc3RlZEVudW0gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EZWZhdWx0TmVzdGVkRW51bTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVmYXVsdE5lc3RlZEVudW0odmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHROZXN0ZWRFbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHROZXN0ZWRFbnVtID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0TmVzdGVkRW51bV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHROZXN0ZWRFbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0TmVzdGVkRW51bSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHROZXN0ZWRFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkJBUjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEZWZhdWx0Rm9yZWlnbkVudW0gew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlZmF1bHRGb3JlaWduRW51bTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gRGVmYXVsdEZvcmVpZ25FbnVtIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdEZvcmVpZ25FbnVtOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0Rm9yZWlnbkVudW0odmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRGb3JlaWduRW51bShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Rm9yZWlnbkVudW0gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRGb3JlaWduRW51bV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRGb3JlaWduRW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEZvcmVpZ25FbnVtID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEZvcmVpZ25FbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtLkZPUkVJR05fQkFSOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlZmF1bHRJbXBvcnRFbnVtIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0SW1wb3J0RW51bTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSBEZWZhdWx0SW1wb3J0RW51bSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlZmF1bHRJbXBvcnRFbnVtOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0SW1wb3J0RW51bSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGVmYXVsdEltcG9ydEVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuSW1wb3J0RW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0SW1wb3J0RW51bSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdEltcG9ydEVudW1fID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEZWZhdWx0SW1wb3J0RW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGVmYXVsdEltcG9ydEVudW0gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0SW1wb3J0RW51bV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5JbXBvcnRFbnVtLklNUE9SVF9CQVI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdFN0cmluZ1BpZWNlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRGVmYXVsdFN0cmluZ1BpZWNlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgRGVmYXVsdFN0cmluZ1BpZWNlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdFN0cmluZ1BpZWNlOyB9DQorICAgICAgICBzZXQgeyBTZXREZWZhdWx0U3RyaW5nUGllY2UodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldERlZmF1bHRTdHJpbmdQaWVjZShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRTdHJpbmdQaWVjZSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVmYXVsdFN0cmluZ1BpZWNlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVmYXVsdFN0cmluZ1BpZWNlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0U3RyaW5nUGllY2UgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0U3RyaW5nUGllY2VfID0gImFiYyI7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGVmYXVsdENvcmQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEZWZhdWx0Q29yZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIERlZmF1bHRDb3JkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGVmYXVsdENvcmQ7IH0NCisgICAgICAgIHNldCB7IFNldERlZmF1bHRDb3JkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZWZhdWx0Q29yZChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlZmF1bHRDb3JkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kZWZhdWx0Q29yZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckRlZmF1bHRDb3JkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZWZhdWx0Q29yZCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRlZmF1bHRDb3JkXyA9ICIxMjMiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0QWxsVHlwZXMoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3REZXByZWNhdGVkRmllbGRzIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdERlcHJlY2F0ZWRGaWVsZHMsIFRlc3REZXByZWNhdGVkRmllbGRzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0RGVwcmVjYXRlZEZpZWxkcygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0RGVwcmVjYXRlZEZpZWxkcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdERlcHJlY2F0ZWRGaWVsZHMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3REZXByZWNhdGVkRmllbGRzRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJkZXByZWNhdGVkX2ludDMyIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3REZXByZWNhdGVkRmllbGRzRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDggfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3REZXByZWNhdGVkRmllbGRzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3REZXByZWNhdGVkRmllbGRzIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdERlcHJlY2F0ZWRGaWVsZHNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdERlcHJlY2F0ZWRGaWVsZHMsIFRlc3REZXByZWNhdGVkRmllbGRzLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REZXByZWNhdGVkRmllbGRzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEZXByZWNhdGVkSW50MzJGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEZXByZWNhdGVkSW50MzI7DQorICAgIHByaXZhdGUgaW50IGRlcHJlY2F0ZWRJbnQzMl87DQorICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgYm9vbCBIYXNEZXByZWNhdGVkSW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEZXByZWNhdGVkSW50MzI7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIGludCBEZXByZWNhdGVkSW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBkZXByZWNhdGVkSW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0RGVwcmVjYXRlZEZpZWxkc0ZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0RlcHJlY2F0ZWRJbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIERlcHJlY2F0ZWRJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzRGVwcmVjYXRlZEludDMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIERlcHJlY2F0ZWRJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REZXByZWNhdGVkRmllbGRzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REZXByZWNhdGVkRmllbGRzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REZXByZWNhdGVkRmllbGRzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RGVwcmVjYXRlZEZpZWxkcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdERlcHJlY2F0ZWRGaWVsZHMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdERlcHJlY2F0ZWRGaWVsZHMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdERlcHJlY2F0ZWRGaWVsZHMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3REZXByZWNhdGVkRmllbGRzIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdERlcHJlY2F0ZWRGaWVsZHMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdERlcHJlY2F0ZWRGaWVsZHMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0RGVwcmVjYXRlZEZpZWxkcyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3REZXByZWNhdGVkRmllbGRzKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0RGVwcmVjYXRlZEZpZWxkcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REZXByZWNhdGVkRmllbGRzLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3REZXByZWNhdGVkRmllbGRzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REZXByZWNhdGVkRmllbGRzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdERlcHJlY2F0ZWRGaWVsZHMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3REZXByZWNhdGVkRmllbGRzKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3REZXByZWNhdGVkRmllbGRzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdERlcHJlY2F0ZWRGaWVsZHMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RGVwcmVjYXRlZEZpZWxkcy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNEZXByZWNhdGVkSW50MzIpIHsNCisgICAgICAgICAgRGVwcmVjYXRlZEludDMyID0gb3RoZXIuRGVwcmVjYXRlZEludDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdERlcHJlY2F0ZWRGaWVsZHNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdERlcHJlY2F0ZWRGaWVsZHNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RlcHJlY2F0ZWRJbnQzMiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmRlcHJlY2F0ZWRJbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBib29sIEhhc0RlcHJlY2F0ZWRJbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RlcHJlY2F0ZWRJbnQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgaW50IERlcHJlY2F0ZWRJbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkRlcHJlY2F0ZWRJbnQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGVwcmVjYXRlZEludDMyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREZXByZWNhdGVkSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RlcHJlY2F0ZWRJbnQzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZGVwcmVjYXRlZEludDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGVwcmVjYXRlZEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEZXByZWNhdGVkSW50MzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kZXByZWNhdGVkSW50MzJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEZvcmVpZ25NZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8Rm9yZWlnbk1lc3NhZ2UsIEZvcmVpZ25NZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBGb3JlaWduTWVzc2FnZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGb3JlaWduTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgRm9yZWlnbk1lc3NhZ2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2ZvcmVpZ25NZXNzYWdlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJjIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2ZvcmVpZ25NZXNzYWdlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDggfTsNCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIEZvcmVpZ25NZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZvcmVpZ25NZXNzYWdlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9yZWlnbk1lc3NhZ2VfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8Rm9yZWlnbk1lc3NhZ2UsIEZvcmVpZ25NZXNzYWdlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0ZvcmVpZ25NZXNzYWdlX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBDRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzQzsNCisgICAgcHJpdmF0ZSBpbnQgY187DQorICAgIHB1YmxpYyBib29sIEhhc0Mgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNDOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBDIHsNCisgICAgICBnZXQgeyByZXR1cm4gY187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2ZvcmVpZ25NZXNzYWdlRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzQykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbMF0sIEMpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0MpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgQyk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvcmVpZ25NZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvcmVpZ25NZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvcmVpZ25NZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb3JlaWduTWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9yZWlnbk1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgRm9yZWlnbk1lc3NhZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoRm9yZWlnbk1lc3NhZ2UgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8Rm9yZWlnbk1lc3NhZ2UsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEZvcmVpZ25NZXNzYWdlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgRm9yZWlnbk1lc3NhZ2UgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgRm9yZWlnbk1lc3NhZ2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBGb3JlaWduTWVzc2FnZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEZvcmVpZ25NZXNzYWdlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBGb3JlaWduTWVzc2FnZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEZvcmVpZ25NZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRm9yZWlnbk1lc3NhZ2UgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEZvcmVpZ25NZXNzYWdlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEZvcmVpZ25NZXNzYWdlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRm9yZWlnbk1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNDKSB7DQorICAgICAgICAgIEMgPSBvdGhlci5DOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfZm9yZWlnbk1lc3NhZ2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfZm9yZWlnbk1lc3NhZ2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0MgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5jXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0M7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBDIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Qyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQyA9IHRydWU7DQorICAgICAgICByZXN1bHQuY18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0MgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5jXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIEZvcmVpZ25NZXNzYWdlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0QWxsRXh0ZW5zaW9ucyA6IHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxUZXN0QWxsRXh0ZW5zaW9ucywgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RBbGxFeHRlbnNpb25zKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RBbGxFeHRlbnNpb25zIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0QWxsRXh0ZW5zaW9ucygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdEFsbEV4dGVuc2lvbnNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdEFsbEV4dGVuc2lvbnNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0QWxsRXh0ZW5zaW9ucyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0QWxsRXh0ZW5zaW9ucyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RBbGxFeHRlbnNpb25zX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RBbGxFeHRlbnNpb25zLCBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0QWxsRXh0ZW5zaW9uc19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIUV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdEFsbEV4dGVuc2lvbnNGaWVsZE5hbWVzOw0KKyAgICAgIHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxUZXN0QWxsRXh0ZW5zaW9ucywgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlcj4uRXh0ZW5zaW9uV3JpdGVyIGV4dGVuc2lvbldyaXRlciA9IENyZWF0ZUV4dGVuc2lvbldyaXRlcih0aGlzKTsNCisgICAgICBleHRlbnNpb25Xcml0ZXIuV3JpdGVVbnRpbCg1MzY4NzA5MTIsIG91dHB1dCk7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHNpemUgKz0gRXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBbGxFeHRlbnNpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdEFsbEV4dGVuc2lvbnMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdEFsbEV4dGVuc2lvbnMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkV4dGVuZGFibGVCdWlsZGVyPFRlc3RBbGxFeHRlbnNpb25zLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0QWxsRXh0ZW5zaW9ucyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RBbGxFeHRlbnNpb25zIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RBbGxFeHRlbnNpb25zIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0QWxsRXh0ZW5zaW9ucygpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEFsbEV4dGVuc2lvbnMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9ucy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0QWxsRXh0ZW5zaW9ucyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsRXh0ZW5zaW9ucy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RBbGxFeHRlbnNpb25zIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0QWxsRXh0ZW5zaW9ucykgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0QWxsRXh0ZW5zaW9ucykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RBbGxFeHRlbnNpb25zIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbEV4dGVuc2lvbnMuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgIHRoaXMuTWVyZ2VFeHRlbnNpb25GaWVsZHMob3RoZXIpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdEFsbEV4dGVuc2lvbnNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdEFsbEV4dGVuc2lvbnNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiwgT3B0aW9uYWxHcm91cF9leHRlbnNpb24uQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbigpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfb3B0aW9uYWxHcm91cEV4dGVuc2lvbkZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYSIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9vcHRpb25hbEdyb3VwRXh0ZW5zaW9uRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEzNiB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiwgT3B0aW9uYWxHcm91cF9leHRlbnNpb24uQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT3B0aW9uYWxHcm91cF9leHRlbnNpb25fX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEFGaWVsZE51bWJlciA9IDE3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzQTsNCisgICAgcHJpdmF0ZSBpbnQgYV87DQorICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNBOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBBIHsNCisgICAgICBnZXQgeyByZXR1cm4gYV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX29wdGlvbmFsR3JvdXBFeHRlbnNpb25GaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxNywgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTcsIEEpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbigpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PcHRpb25hbEdyb3VwX2V4dGVuc2lvbi5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5PcHRpb25hbEdyb3VwX2V4dGVuc2lvbi5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbikgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChPcHRpb25hbEdyb3VwX2V4dGVuc2lvbikgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT3B0aW9uYWxHcm91cF9leHRlbnNpb24uRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzQSkgew0KKyAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX29wdGlvbmFsR3JvdXBFeHRlbnNpb25GaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfb3B0aW9uYWxHcm91cEV4dGVuc2lvbkZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMzY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuYV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbigpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiwgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24uQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbigpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfcmVwZWF0ZWRHcm91cEV4dGVuc2lvbkZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYSIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9yZXBlYXRlZEdyb3VwRXh0ZW5zaW9uRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDM3NiB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiwgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24uQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEFGaWVsZE51bWJlciA9IDQ3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzQTsNCisgICAgcHJpdmF0ZSBpbnQgYV87DQorICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNBOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBBIHsNCisgICAgICBnZXQgeyByZXR1cm4gYV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3JlcGVhdGVkR3JvdXBFeHRlbnNpb25GaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig0NywgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNDcsIEEpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbigpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbikgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbikgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVwZWF0ZWRHcm91cF9leHRlbnNpb24uRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzQSkgew0KKyAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3JlcGVhdGVkR3JvdXBFeHRlbnNpb25GaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfcmVwZWF0ZWRHcm91cEV4dGVuc2lvbkZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzNzY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgIHNldCB7IFNldEEodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuYV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbigpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdE5lc3RlZEV4dGVuc2lvbiA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3ROZXN0ZWRFeHRlbnNpb24sIFRlc3ROZXN0ZWRFeHRlbnNpb24uQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3ROZXN0ZWRFeHRlbnNpb24oKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdE5lc3RlZEV4dGVuc2lvbiBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdE5lc3RlZEV4dGVuc2lvbigpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdE5lc3RlZEV4dGVuc2lvbkZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0TmVzdGVkRXh0ZW5zaW9uRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb24gRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TmVzdGVkRXh0ZW5zaW9uIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3ROZXN0ZWRFeHRlbnNpb24gVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkRXh0ZW5zaW9uX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3ROZXN0ZWRFeHRlbnNpb24sIFRlc3ROZXN0ZWRFeHRlbnNpb24uQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZEV4dGVuc2lvbl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVGVzdEZpZWxkTnVtYmVyID0gMTAwMjsNCisgICAgcHVibGljIHN0YXRpYyBwYjo6R2VuZXJhdGVkRXh0ZW5zaW9uQmFzZTxzdHJpbmc+IFRlc3Q7DQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0TmVzdGVkRXh0ZW5zaW9uRmllbGROYW1lczsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkRXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb24gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb24gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbiBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkRXh0ZW5zaW9uIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRFeHRlbnNpb24gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkRXh0ZW5zaW9uIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3ROZXN0ZWRFeHRlbnNpb24gTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdE5lc3RlZEV4dGVuc2lvbiBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0TmVzdGVkRXh0ZW5zaW9uLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0TmVzdGVkRXh0ZW5zaW9uIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdE5lc3RlZEV4dGVuc2lvbiByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0TmVzdGVkRXh0ZW5zaW9uIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdE5lc3RlZEV4dGVuc2lvbiBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3ROZXN0ZWRFeHRlbnNpb24oKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3ROZXN0ZWRFeHRlbnNpb24gTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3ROZXN0ZWRFeHRlbnNpb24gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZEV4dGVuc2lvbi5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3ROZXN0ZWRFeHRlbnNpb24gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3ROZXN0ZWRFeHRlbnNpb24pIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdE5lc3RlZEV4dGVuc2lvbikgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3ROZXN0ZWRFeHRlbnNpb24gb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkRXh0ZW5zaW9uLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdE5lc3RlZEV4dGVuc2lvbkZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0TmVzdGVkRXh0ZW5zaW9uRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdE5lc3RlZEV4dGVuc2lvbigpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFJlcXVpcmVkIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdFJlcXVpcmVkLCBUZXN0UmVxdWlyZWQuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RSZXF1aXJlZCgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0UmVxdWlyZWQgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RSZXF1aXJlZCgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFJlcXVpcmVkRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiwgImIiLCAiYyIsICJkdW1teTEwIiwgImR1bW15MTEiLCAiZHVtbXkxMiIsICJkdW1teTEzIiwgImR1bW15MTQiLCAiZHVtbXkxNSIsICJkdW1teTE2IiwgImR1bW15MTciLCAiZHVtbXkxOCIsICJkdW1teTE5IiwgImR1bW15MiIsICJkdW1teTIwIiwgImR1bW15MjEiLCAiZHVtbXkyMiIsICJkdW1teTIzIiwgImR1bW15MjQiLCAiZHVtbXkyNSIsICJkdW1teTI2IiwgImR1bW15MjciLCAiZHVtbXkyOCIsICJkdW1teTI5IiwgImR1bW15MzAiLCAiZHVtbXkzMSIsICJkdW1teTMyIiwgImR1bW15NCIsICJkdW1teTUiLCAiZHVtbXk2IiwgImR1bW15NyIsICJkdW1teTgiLCAiZHVtbXk5IiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RSZXF1aXJlZEZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4LCAyNCwgMjY0LCA4MCwgODgsIDk2LCAxMDQsIDExMiwgMTIwLCAxMjgsIDEzNiwgMTQ0LCAxNTIsIDE2LCAxNjAsIDE2OCwgMTc2LCAxODQsIDE5MiwgMjAwLCAyMDgsIDIxNiwgMjI0LCAyMzIsIDI0MCwgMjQ4LCAyNTYsIDMyLCA0MCwgNDgsIDU2LCA2NCwgNzIgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWQgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVxdWlyZWQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFJlcXVpcmVkIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RSZXF1aXJlZCwgVGVzdFJlcXVpcmVkLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXF1aXJlZF9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgU2luZ2xlRmllbGROdW1iZXIgPSAxMDAwOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZD4gU2luZ2xlOw0KKyAgICBwdWJsaWMgY29uc3QgaW50IE11bHRpRmllbGROdW1iZXIgPSAxMDAxOw0KKyAgICBwdWJsaWMgc3RhdGljIHBiOjpHZW5lcmF0ZWRFeHRlbnNpb25CYXNlPHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkPj4gTXVsdGk7DQorICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0E7DQorICAgIHByaXZhdGUgaW50IGFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkyRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkyOw0KKyAgICBwcml2YXRlIGludCBkdW1teTJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15Ml87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBCRmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzQjsNCisgICAgcHJpdmF0ZSBpbnQgYl87DQorICAgIHB1YmxpYyBib29sIEhhc0Igew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNCOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBCIHsNCisgICAgICBnZXQgeyByZXR1cm4gYl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTRGaWVsZE51bWJlciA9IDQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTQ7DQorICAgIHByaXZhdGUgaW50IGR1bW15NF87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15NDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXk0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXk0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15NUZpZWxkTnVtYmVyID0gNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15NTsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXk1XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXk1IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXk1OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTUgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXk2RmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXk2Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTZfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTYgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTY7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15NiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15Nl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTdGaWVsZE51bWJlciA9IDc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTc7DQorICAgIHByaXZhdGUgaW50IGR1bW15N187DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15NyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15NzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXk3IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXk3XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15OEZpZWxkTnVtYmVyID0gODsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15ODsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXk4XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXk4IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXk4OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTggew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teThfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXk5RmllbGROdW1iZXIgPSA5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXk5Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTlfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTkgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15OSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15OV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTEwRmllbGROdW1iZXIgPSAxMDsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MTA7DQorICAgIHByaXZhdGUgaW50IGR1bW15MTBfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTEwIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkxMDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkxMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MTBfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkxMUZpZWxkTnVtYmVyID0gMTE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTExOw0KKyAgICBwcml2YXRlIGludCBkdW1teTExXzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MTE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MTEgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTExXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MTJGaWVsZE51bWJlciA9IDEyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkxMjsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkxMl87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MTIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTEyOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTEyIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkxMl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTEzRmllbGROdW1iZXIgPSAxMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MTM7DQorICAgIHByaXZhdGUgaW50IGR1bW15MTNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTEzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkxMzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkxMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MTNfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkxNEZpZWxkTnVtYmVyID0gMTQ7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTE0Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTE0XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxNCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MTQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MTQgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTE0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MTVGaWVsZE51bWJlciA9IDE1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkxNTsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkxNV87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MTUgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTE1OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTE1IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkxNV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTE2RmllbGROdW1iZXIgPSAxNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MTY7DQorICAgIHByaXZhdGUgaW50IGR1bW15MTZfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE2IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkxNjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkxNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MTZfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkxN0ZpZWxkTnVtYmVyID0gMTc7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTE3Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTE3XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxNyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MTc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MTcgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTE3XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MThGaWVsZE51bWJlciA9IDE4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkxODsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkxOF87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MTggew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTE4OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTE4IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkxOF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTE5RmllbGROdW1iZXIgPSAxOTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MTk7DQorICAgIHByaXZhdGUgaW50IGR1bW15MTlfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTE5IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkxOTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkxOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MTlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkyMEZpZWxkTnVtYmVyID0gMjA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTIwOw0KKyAgICBwcml2YXRlIGludCBkdW1teTIwXzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyMCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MjA7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MjAgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTIwXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MjFGaWVsZE51bWJlciA9IDIxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkyMTsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkyMV87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MjEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTIxOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTIxIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkyMV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTIyRmllbGROdW1iZXIgPSAyMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MjI7DQorICAgIHByaXZhdGUgaW50IGR1bW15MjJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkyMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkyMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MjJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkyM0ZpZWxkTnVtYmVyID0gMjM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTIzOw0KKyAgICBwcml2YXRlIGludCBkdW1teTIzXzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyMyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MjM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MjMgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTIzXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MjRGaWVsZE51bWJlciA9IDI0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkyNDsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkyNF87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTI0OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTI0IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkyNF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTI1RmllbGROdW1iZXIgPSAyNTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MjU7DQorICAgIHByaXZhdGUgaW50IGR1bW15MjVfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI1IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkyNTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkyNSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MjVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkyNkZpZWxkTnVtYmVyID0gMjY7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTI2Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTI2XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyNiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MjY7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MjYgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTI2XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MjdGaWVsZE51bWJlciA9IDI3Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkyNzsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkyN187DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15Mjcgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTI3OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTI3IHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkyN187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTI4RmllbGROdW1iZXIgPSAyODsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15Mjg7DQorICAgIHByaXZhdGUgaW50IGR1bW15MjhfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTI4IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkyODsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkyOCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MjhfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkyOUZpZWxkTnVtYmVyID0gMjk7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTI5Ow0KKyAgICBwcml2YXRlIGludCBkdW1teTI5XzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyOSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15Mjk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15Mjkgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTI5XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER1bW15MzBGaWVsZE51bWJlciA9IDMwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHVtbXkzMDsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXkzMF87DQorICAgIHB1YmxpYyBib29sIEhhc0R1bW15MzAgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEdW1teTMwOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teTMwIHsNCisgICAgICBnZXQgeyByZXR1cm4gZHVtbXkzMF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEdW1teTMxRmllbGROdW1iZXIgPSAzMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc0R1bW15MzE7DQorICAgIHByaXZhdGUgaW50IGR1bW15MzFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTMxIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHVtbXkzMTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgRHVtbXkzMSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15MzFfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXkzMkZpZWxkTnVtYmVyID0gMzI7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTMyOw0KKyAgICBwcml2YXRlIGludCBkdW1teTMyXzsNCisgICAgcHVibGljIGJvb2wgSGFzRHVtbXkzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15MzI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IER1bW15MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBkdW1teTMyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IENGaWVsZE51bWJlciA9IDMzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzQzsNCisgICAgcHJpdmF0ZSBpbnQgY187DQorICAgIHB1YmxpYyBib29sIEhhc0Mgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNDOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBDIHsNCisgICAgICBnZXQgeyByZXR1cm4gY187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmICghaGFzQSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgaWYgKCFoYXNCKSByZXR1cm4gZmFsc2U7DQorICAgICAgICBpZiAoIWhhc0MpIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RSZXF1aXJlZEZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzBdLCBBKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15Mikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMiwgZmllbGRfbmFtZXNbMTNdLCBEdW1teTIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMywgZmllbGRfbmFtZXNbMV0sIEIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXk0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig0LCBmaWVsZF9uYW1lc1syN10sIER1bW15NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTUpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDUsIGZpZWxkX25hbWVzWzI4XSwgRHVtbXk1KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15Nikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNiwgZmllbGRfbmFtZXNbMjldLCBEdW1teTYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXk3KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMig3LCBmaWVsZF9uYW1lc1szMF0sIER1bW15Nyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTgpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDgsIGZpZWxkX25hbWVzWzMxXSwgRHVtbXk4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15OSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoOSwgZmllbGRfbmFtZXNbMzJdLCBEdW1teTkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTAsIGZpZWxkX25hbWVzWzNdLCBEdW1teTEwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTEpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDExLCBmaWVsZF9uYW1lc1s0XSwgRHVtbXkxMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTEyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxMiwgZmllbGRfbmFtZXNbNV0sIER1bW15MTIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxMykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTMsIGZpZWxkX25hbWVzWzZdLCBEdW1teTEzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDE0LCBmaWVsZF9uYW1lc1s3XSwgRHVtbXkxNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTE1KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxNSwgZmllbGRfbmFtZXNbOF0sIER1bW15MTUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxNikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTYsIGZpZWxkX25hbWVzWzldLCBEdW1teTE2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTcpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDE3LCBmaWVsZF9uYW1lc1sxMF0sIER1bW15MTcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxOCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTgsIGZpZWxkX25hbWVzWzExXSwgRHVtbXkxOCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTE5KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxOSwgZmllbGRfbmFtZXNbMTJdLCBEdW1teTE5KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIwLCBmaWVsZF9uYW1lc1sxNF0sIER1bW15MjApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyMSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjEsIGZpZWxkX25hbWVzWzE1XSwgRHVtbXkyMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTIyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMiwgZmllbGRfbmFtZXNbMTZdLCBEdW1teTIyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDIzLCBmaWVsZF9uYW1lc1sxN10sIER1bW15MjMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyNCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjQsIGZpZWxkX25hbWVzWzE4XSwgRHVtbXkyNCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTI1KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyNSwgZmllbGRfbmFtZXNbMTldLCBEdW1teTI1KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjYpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDI2LCBmaWVsZF9uYW1lc1syMF0sIER1bW15MjYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyNykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMjcsIGZpZWxkX25hbWVzWzIxXSwgRHVtbXkyNyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTI4KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyOCwgZmllbGRfbmFtZXNbMjJdLCBEdW1teTI4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjkpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDI5LCBmaWVsZF9uYW1lc1syM10sIER1bW15MjkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkzMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMzAsIGZpZWxkX25hbWVzWzI0XSwgRHVtbXkzMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTMxKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigzMSwgZmllbGRfbmFtZXNbMjVdLCBEdW1teTMxKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MzIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDMyLCBmaWVsZF9uYW1lc1syNl0sIER1bW15MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMzMsIGZpZWxkX25hbWVzWzJdLCBDKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIEEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIsIER1bW15Mik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNCKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDMsIEIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXk0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDQsIER1bW15NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoNSwgRHVtbXk1KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15Nikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg2LCBEdW1teTYpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXk3KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDcsIER1bW15Nyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTgpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoOCwgRHVtbXk4KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15OSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSg5LCBEdW1teTkpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxMCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxMCwgRHVtbXkxMCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTExKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDExLCBEdW1teTExKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTIsIER1bW15MTIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxMykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxMywgRHVtbXkxMyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTE0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDE0LCBEdW1teTE0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTUsIER1bW15MTUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxNikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxNiwgRHVtbXkxNik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTE3KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDE3LCBEdW1teTE3KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MTgpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMTgsIER1bW15MTgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkxOSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxOSwgRHVtbXkxOSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTIwKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIwLCBEdW1teTIwKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjEpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjEsIER1bW15MjEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyMikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyMiwgRHVtbXkyMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTIzKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDIzLCBEdW1teTIzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjQsIER1bW15MjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyNSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyNSwgRHVtbXkyNSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTI2KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDI2LCBEdW1teTI2KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MjcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMjcsIER1bW15MjcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkyOCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyOCwgRHVtbXkyOCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTI5KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDI5LCBEdW1teTI5KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0R1bW15MzApIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMzAsIER1bW15MzApOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHVtbXkzMSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgzMSwgRHVtbXkzMSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teTMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDMyLCBEdW1teTMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0MpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMzMsIEMpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWQgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWQgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0UmVxdWlyZWQgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdFJlcXVpcmVkIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RSZXF1aXJlZCwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdFJlcXVpcmVkIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdFJlcXVpcmVkIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RSZXF1aXJlZCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RSZXF1aXJlZCBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RSZXF1aXJlZCgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFJlcXVpcmVkIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZXF1aXJlZCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVxdWlyZWQgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RSZXF1aXJlZCkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0UmVxdWlyZWQpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0UmVxdWlyZWQgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzQSkgew0KKyAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTIpIHsNCisgICAgICAgICAgRHVtbXkyID0gb3RoZXIuRHVtbXkyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0IpIHsNCisgICAgICAgICAgQiA9IG90aGVyLkI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXk0KSB7DQorICAgICAgICAgIER1bW15NCA9IG90aGVyLkR1bW15NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTUpIHsNCisgICAgICAgICAgRHVtbXk1ID0gb3RoZXIuRHVtbXk1Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15Nikgew0KKyAgICAgICAgICBEdW1teTYgPSBvdGhlci5EdW1teTY7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXk3KSB7DQorICAgICAgICAgIER1bW15NyA9IG90aGVyLkR1bW15NzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTgpIHsNCisgICAgICAgICAgRHVtbXk4ID0gb3RoZXIuRHVtbXk4Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15OSkgew0KKyAgICAgICAgICBEdW1teTkgPSBvdGhlci5EdW1teTk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkxMCkgew0KKyAgICAgICAgICBEdW1teTEwID0gb3RoZXIuRHVtbXkxMDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTExKSB7DQorICAgICAgICAgIER1bW15MTEgPSBvdGhlci5EdW1teTExOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MTIpIHsNCisgICAgICAgICAgRHVtbXkxMiA9IG90aGVyLkR1bW15MTI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkxMykgew0KKyAgICAgICAgICBEdW1teTEzID0gb3RoZXIuRHVtbXkxMzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTE0KSB7DQorICAgICAgICAgIER1bW15MTQgPSBvdGhlci5EdW1teTE0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MTUpIHsNCisgICAgICAgICAgRHVtbXkxNSA9IG90aGVyLkR1bW15MTU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkxNikgew0KKyAgICAgICAgICBEdW1teTE2ID0gb3RoZXIuRHVtbXkxNjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTE3KSB7DQorICAgICAgICAgIER1bW15MTcgPSBvdGhlci5EdW1teTE3Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MTgpIHsNCisgICAgICAgICAgRHVtbXkxOCA9IG90aGVyLkR1bW15MTg7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkxOSkgew0KKyAgICAgICAgICBEdW1teTE5ID0gb3RoZXIuRHVtbXkxOTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTIwKSB7DQorICAgICAgICAgIER1bW15MjAgPSBvdGhlci5EdW1teTIwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MjEpIHsNCisgICAgICAgICAgRHVtbXkyMSA9IG90aGVyLkR1bW15MjE7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkyMikgew0KKyAgICAgICAgICBEdW1teTIyID0gb3RoZXIuRHVtbXkyMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTIzKSB7DQorICAgICAgICAgIER1bW15MjMgPSBvdGhlci5EdW1teTIzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MjQpIHsNCisgICAgICAgICAgRHVtbXkyNCA9IG90aGVyLkR1bW15MjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkyNSkgew0KKyAgICAgICAgICBEdW1teTI1ID0gb3RoZXIuRHVtbXkyNTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTI2KSB7DQorICAgICAgICAgIER1bW15MjYgPSBvdGhlci5EdW1teTI2Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MjcpIHsNCisgICAgICAgICAgRHVtbXkyNyA9IG90aGVyLkR1bW15Mjc7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkyOCkgew0KKyAgICAgICAgICBEdW1teTI4ID0gb3RoZXIuRHVtbXkyODsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTI5KSB7DQorICAgICAgICAgIER1bW15MjkgPSBvdGhlci5EdW1teTI5Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0R1bW15MzApIHsNCisgICAgICAgICAgRHVtbXkzMCA9IG90aGVyLkR1bW15MzA7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkzMSkgew0KKyAgICAgICAgICBEdW1teTMxID0gb3RoZXIuRHVtbXkzMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEdW1teTMyKSB7DQorICAgICAgICAgIER1bW15MzIgPSBvdGhlci5EdW1teTMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0MpIHsNCisgICAgICAgICAgQyA9IG90aGVyLkM7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0UmVxdWlyZWRGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFJlcXVpcmVkRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTIgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzQiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDMyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXk0ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXk0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15NSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15NV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTYgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTZfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDU2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXk3ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXk3Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2NDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15OCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15OF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTkgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTlfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkxMCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MTBfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkxMSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MTFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDk2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkxMiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MTJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTMgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTEzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMTI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTE0ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkxNF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTIwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkxNSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MTVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEyODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTYgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTE2Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMzY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTE3ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkxN18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTQ0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkxOCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MThfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE1Mjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTkgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTE5Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTIwID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkyMF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkyMSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MjFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE3Njogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjIgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTIyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxODQ6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTIzID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkyM18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTkyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkyNCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDIwMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjUgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTI1Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTI2ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkyNl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjE2OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkyNyA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MjdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDIyNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjggPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTI4Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyMzI6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTI5ID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkyOV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkzMCA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmR1bW15MzBfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI0ODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0R1bW15MzEgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teTMxXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNEdW1teTMyID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuZHVtbXkzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjY0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzQyA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmNfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BOyB9DQorICAgICAgICBzZXQgeyBTZXRBKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRBKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEdW1teTI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTI7IH0NCisgICAgICAgIHNldCB7IFNldER1bW15Mih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15Ml8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZHVtbXkyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0I7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBCIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Qih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQiA9IHRydWU7DQorICAgICAgICByZXN1bHQuYl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0IgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5iXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXk0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXk0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRHVtbXk0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXk0OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldER1bW15NChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXk0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEdW1teTQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15NCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15NF8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0R1bW15NSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15NTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15NSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkR1bW15NTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXk1KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTUoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15NSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXk1XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXk1KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTVfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEdW1teTY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTYgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTY7IH0NCisgICAgICAgIHNldCB7IFNldER1bW15Nih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXk2KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTYgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15Nl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15NigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXk2ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZHVtbXk2XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXk3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXk3OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgRHVtbXk3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXk3OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teTcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldER1bW15NyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXk3ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTdfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEdW1teTcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15NyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15N18gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0R1bW15OCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15ODsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IER1bW15OCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkR1bW15ODsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXk4KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREdW1teTgoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15OCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXk4XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHVtbXk4KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teThfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEdW1teTkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNEdW1teTk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTkgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EdW1teTk7IH0NCisgICAgICAgIHNldCB7IFNldER1bW15OSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXk5KGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teTkgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15OV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15OSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXk5ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZHVtbXk5XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MTA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTEwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkxMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkxMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkxMChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxMCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkxMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MTAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTEwXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MTE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTExIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkxMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkxMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkxMShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkxMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MTEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTExXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MTI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTEyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkxMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkxMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkxMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkxMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MTIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTEyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MTM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTEzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkxMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkxMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkxMyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkxM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MTMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTEzXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MTQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTE0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkxNDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkxNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkxNChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxNCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkxNF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MTQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE0XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MTU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTE1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkxNTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkxNSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkxNShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxNSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkxNV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MTUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE1XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MTY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTE2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkxNjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkxNih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkxNihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxNiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkxNl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MTYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTYgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE2XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxNyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MTc7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTE3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkxNzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkxNyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkxNyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxNyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkxN18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MTcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTcgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE3XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MTg7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTE4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkxODsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkxOCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkxOChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxOCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkxOF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MTgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE4XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkxOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MTk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTE5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkxOTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkxOSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkxOShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkxOSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkxOV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MTkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MTkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTE5XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MjA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTIwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkyMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkyMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkyMChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyMCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkyMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MjAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTIwXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MjE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTIxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkyMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkyMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkyMShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkyMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MjEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTIxXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MjI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTIyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkyMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkyMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkyMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkyMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MjIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTIyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyMyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MjM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTIzIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkyMzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkyMyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkyMyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyMyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkyM18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MjMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTIzXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyNCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MjQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTI0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkyNDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkyNCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkyNChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyNCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkyNF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI0XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyNSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MjU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTI1IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkyNTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkyNSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkyNShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyNSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkyNV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MjUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI1XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyNiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MjY7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTI2IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkyNjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkyNih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkyNihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyNiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkyNl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MjYoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjYgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI2XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyNyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15Mjc7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTI3IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkyNzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkyNyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkyNyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyNyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkyN18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MjcoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjcgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI3XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyOCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15Mjg7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTI4IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkyODsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkyOCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkyOChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyOCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkyOF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MjgoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjggPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI4XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkyOSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15Mjk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTI5IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkyOTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkyOSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkyOShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkyOSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkyOV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MjkoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MjkgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTI5XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkzMCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MzA7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTMwIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkzMDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkzMCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkzMChpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkzMCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkzMF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MzAoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MzAgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTMwXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkzMSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MzE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTMxIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkzMTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkzMSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkzMShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkzMSA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkzMV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MzEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MzEgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTMxXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRHVtbXkzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R1bW15MzI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teTMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRHVtbXkzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHVtbXkzMih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHVtbXkzMiA9IHRydWU7DQorICAgICAgICByZXN1bHQuZHVtbXkzMl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15MzIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5kdW1teTMyXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0M7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBDIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQzsgfQ0KKyAgICAgICAgc2V0IHsgU2V0Qyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QyhpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQyA9IHRydWU7DQorICAgICAgICByZXN1bHQuY18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0MgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5jXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RSZXF1aXJlZCgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFJlcXVpcmVkRm9yZWlnbiA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RSZXF1aXJlZEZvcmVpZ24sIFRlc3RSZXF1aXJlZEZvcmVpZ24uQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RSZXF1aXJlZEZvcmVpZ24oKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdFJlcXVpcmVkRm9yZWlnbiBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFJlcXVpcmVkRm9yZWlnbigpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdFJlcXVpcmVkRm9yZWlnbkZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiZHVtbXkiLCAib3B0aW9uYWxfbWVzc2FnZSIsICJyZXBlYXRlZF9tZXNzYWdlIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RSZXF1aXJlZEZvcmVpZ25GaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMjQsIDEwLCAxOCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZEZvcmVpZ24gRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVxdWlyZWRGb3JlaWduIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RSZXF1aXJlZEZvcmVpZ24gVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVxdWlyZWRGb3JlaWduX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RSZXF1aXJlZEZvcmVpZ24sIFRlc3RSZXF1aXJlZEZvcmVpZ24uQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcXVpcmVkRm9yZWlnbl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxNZXNzYWdlRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxNZXNzYWdlOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCBvcHRpb25hbE1lc3NhZ2VfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbE1lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNPcHRpb25hbE1lc3NhZ2U7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkIE9wdGlvbmFsTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsTWVzc2FnZV8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkTWVzc2FnZUZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQ+IHJlcGVhdGVkTWVzc2FnZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQ+IFJlcGVhdGVkTWVzc2FnZUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZE1lc3NhZ2VfOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZE1lc3NhZ2VDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkTWVzc2FnZV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkIEdldFJlcGVhdGVkTWVzc2FnZShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRNZXNzYWdlX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgRHVtbXlGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEdW1teTsNCisgICAgcHJpdmF0ZSBpbnQgZHVtbXlfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEdW1teSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R1bW15OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBEdW1teSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR1bW15XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaWYgKEhhc09wdGlvbmFsTWVzc2FnZSkgew0KKyAgICAgICAgICBpZiAoIU9wdGlvbmFsTWVzc2FnZS5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQgZWxlbWVudCBpbiBSZXBlYXRlZE1lc3NhZ2VMaXN0KSB7DQorICAgICAgICAgIGlmICghZWxlbWVudC5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0UmVxdWlyZWRGb3JlaWduRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxNZXNzYWdlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDEsIGZpZWxkX25hbWVzWzFdLCBPcHRpb25hbE1lc3NhZ2UpOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRNZXNzYWdlXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSgyLCBmaWVsZF9uYW1lc1syXSwgcmVwZWF0ZWRNZXNzYWdlXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMywgZmllbGRfbmFtZXNbMF0sIER1bW15KTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNPcHRpb25hbE1lc3NhZ2UpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxLCBPcHRpb25hbE1lc3NhZ2UpOw0KKyAgICAgIH0NCisgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQgZWxlbWVudCBpbiBSZXBlYXRlZE1lc3NhZ2VMaXN0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMiwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEdW1teSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgzLCBEdW1teSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZEZvcmVpZ24gUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkRm9yZWlnbiBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRGb3JlaWduIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRGb3JlaWduIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRGb3JlaWduIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZEZvcmVpZ24gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkRm9yZWlnbiBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVxdWlyZWRGb3JlaWduIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXF1aXJlZEZvcmVpZ24gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcXVpcmVkRm9yZWlnbiBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0UmVxdWlyZWRGb3JlaWduIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXBlYXRlZE1lc3NhZ2VfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdFJlcXVpcmVkRm9yZWlnbiBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0UmVxdWlyZWRGb3JlaWduLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0UmVxdWlyZWRGb3JlaWduIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdFJlcXVpcmVkRm9yZWlnbiByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0UmVxdWlyZWRGb3JlaWduIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFJlcXVpcmVkRm9yZWlnbiBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RSZXF1aXJlZEZvcmVpZ24oKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RSZXF1aXJlZEZvcmVpZ24gTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWRGb3JlaWduLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZXF1aXJlZEZvcmVpZ24gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkRm9yZWlnbi5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZXF1aXJlZEZvcmVpZ24gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RSZXF1aXJlZEZvcmVpZ24pIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdFJlcXVpcmVkRm9yZWlnbikgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RSZXF1aXJlZEZvcmVpZ24gb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWRGb3JlaWduLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc09wdGlvbmFsTWVzc2FnZSkgew0KKyAgICAgICAgICBNZXJnZU9wdGlvbmFsTWVzc2FnZShvdGhlci5PcHRpb25hbE1lc3NhZ2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkTWVzc2FnZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlXy5BZGQob3RoZXIucmVwZWF0ZWRNZXNzYWdlXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHVtbXkpIHsNCisgICAgICAgICAgRHVtbXkgPSBvdGhlci5EdW1teTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RSZXF1aXJlZEZvcmVpZ25GaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFJlcXVpcmVkRm9yZWlnbkZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc09wdGlvbmFsTWVzc2FnZSkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShPcHRpb25hbE1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgT3B0aW9uYWxNZXNzYWdlID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkTWVzc2FnZV8sIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZC5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDI0OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRHVtbXkgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5kdW1teV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsTWVzc2FnZSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxNZXNzYWdlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQgT3B0aW9uYWxNZXNzYWdlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuT3B0aW9uYWxNZXNzYWdlOyB9DQorICAgICAgICBzZXQgeyBTZXRPcHRpb25hbE1lc3NhZ2UodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxNZXNzYWdlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbE1lc3NhZ2VfID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VPcHRpb25hbE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzT3B0aW9uYWxNZXNzYWdlICYmDQorICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTWVzc2FnZV8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbE1lc3NhZ2VfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm9wdGlvbmFsTWVzc2FnZV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQub3B0aW9uYWxNZXNzYWdlXyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbE1lc3NhZ2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTWVzc2FnZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTWVzc2FnZV8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkPiBSZXBlYXRlZE1lc3NhZ2VMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkTWVzc2FnZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZE1lc3NhZ2VDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkTWVzc2FnZUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQgR2V0UmVwZWF0ZWRNZXNzYWdlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZE1lc3NhZ2UoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZE1lc3NhZ2UoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTWVzc2FnZV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRNZXNzYWdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkTWVzc2FnZV9baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXF1aXJlZCB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkTWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVxdWlyZWQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRNZXNzYWdlKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlcXVpcmVkPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkTWVzc2FnZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0R1bW15IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHVtbXk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBEdW1teSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkR1bW15OyB9DQorICAgICAgICBzZXQgeyBTZXREdW1teSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RHVtbXkoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R1bW15ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kdW1teV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckR1bW15KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEdW1teSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmR1bW15XyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFRlc3RSZXF1aXJlZEZvcmVpZ24oKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RGb3JlaWduTmVzdGVkIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdEZvcmVpZ25OZXN0ZWQsIFRlc3RGb3JlaWduTmVzdGVkLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0Rm9yZWlnbk5lc3RlZCgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0Rm9yZWlnbk5lc3RlZCBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdEZvcmVpZ25OZXN0ZWQoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RGb3JlaWduTmVzdGVkRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJmb3JlaWduX25lc3RlZCIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0Rm9yZWlnbk5lc3RlZEZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEZvcmVpZ25OZXN0ZWQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdEZvcmVpZ25OZXN0ZWQgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Rm9yZWlnbk5lc3RlZF9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0Rm9yZWlnbk5lc3RlZCwgVGVzdEZvcmVpZ25OZXN0ZWQuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEZvcmVpZ25OZXN0ZWRfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZvcmVpZ25OZXN0ZWRGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNGb3JlaWduTmVzdGVkOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIGZvcmVpZ25OZXN0ZWRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNGb3JlaWduTmVzdGVkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRm9yZWlnbk5lc3RlZDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSBGb3JlaWduTmVzdGVkIHsNCisgICAgICBnZXQgeyByZXR1cm4gZm9yZWlnbk5lc3RlZF8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0Rm9yZWlnbk5lc3RlZEZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0ZvcmVpZ25OZXN0ZWQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMSwgZmllbGRfbmFtZXNbMF0sIEZvcmVpZ25OZXN0ZWQpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0ZvcmVpZ25OZXN0ZWQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxLCBGb3JlaWduTmVzdGVkKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZvcmVpZ25OZXN0ZWQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZvcmVpZ25OZXN0ZWQgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZvcmVpZ25OZXN0ZWQgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGb3JlaWduTmVzdGVkIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Rm9yZWlnbk5lc3RlZCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Rm9yZWlnbk5lc3RlZCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Rm9yZWlnbk5lc3RlZCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Rm9yZWlnbk5lc3RlZCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Rm9yZWlnbk5lc3RlZCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Rm9yZWlnbk5lc3RlZCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0Rm9yZWlnbk5lc3RlZCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0Rm9yZWlnbk5lc3RlZCBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0Rm9yZWlnbk5lc3RlZCwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdEZvcmVpZ25OZXN0ZWQgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0Rm9yZWlnbk5lc3RlZCByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0Rm9yZWlnbk5lc3RlZCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RGb3JlaWduTmVzdGVkIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdEZvcmVpZ25OZXN0ZWQoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RGb3JlaWduTmVzdGVkIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZvcmVpZ25OZXN0ZWQuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEZvcmVpZ25OZXN0ZWQgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZvcmVpZ25OZXN0ZWQuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0Rm9yZWlnbk5lc3RlZCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdEZvcmVpZ25OZXN0ZWQpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdEZvcmVpZ25OZXN0ZWQpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0Rm9yZWlnbk5lc3RlZCBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RGb3JlaWduTmVzdGVkLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0ZvcmVpZ25OZXN0ZWQpIHsNCisgICAgICAgICAgTWVyZ2VGb3JlaWduTmVzdGVkKG90aGVyLkZvcmVpZ25OZXN0ZWQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdEZvcmVpZ25OZXN0ZWRGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdEZvcmVpZ25OZXN0ZWRGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzRm9yZWlnbk5lc3RlZCkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShGb3JlaWduTmVzdGVkKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIEZvcmVpZ25OZXN0ZWQgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0ZvcmVpZ25OZXN0ZWQgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZvcmVpZ25OZXN0ZWQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIEZvcmVpZ25OZXN0ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Gb3JlaWduTmVzdGVkOyB9DQorICAgICAgICBzZXQgeyBTZXRGb3JlaWduTmVzdGVkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRGb3JlaWduTmVzdGVkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGb3JlaWduTmVzdGVkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5mb3JlaWduTmVzdGVkXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZvcmVpZ25OZXN0ZWQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRm9yZWlnbk5lc3RlZCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZm9yZWlnbk5lc3RlZF8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUZvcmVpZ25OZXN0ZWQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNGb3JlaWduTmVzdGVkICYmDQorICAgICAgICAgICAgcmVzdWx0LmZvcmVpZ25OZXN0ZWRfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5mb3JlaWduTmVzdGVkXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmZvcmVpZ25OZXN0ZWRfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0LmZvcmVpZ25OZXN0ZWRfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzRm9yZWlnbk5lc3RlZCA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJGb3JlaWduTmVzdGVkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGb3JlaWduTmVzdGVkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZm9yZWlnbk5lc3RlZF8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0Rm9yZWlnbk5lc3RlZCgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdEVtcHR5TWVzc2FnZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RFbXB0eU1lc3NhZ2UsIFRlc3RFbXB0eU1lc3NhZ2UuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RFbXB0eU1lc3NhZ2UoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdEVtcHR5TWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdEVtcHR5TWVzc2FnZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdEVtcHR5TWVzc2FnZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0RW1wdHlNZXNzYWdlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RW1wdHlNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RFbXB0eU1lc3NhZ2UgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RFbXB0eU1lc3NhZ2UsIFRlc3RFbXB0eU1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEVtcHR5TWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0RW1wdHlNZXNzYWdlRmllbGROYW1lczsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RFbXB0eU1lc3NhZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdEVtcHR5TWVzc2FnZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0RW1wdHlNZXNzYWdlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0RW1wdHlNZXNzYWdlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdEVtcHR5TWVzc2FnZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0RW1wdHlNZXNzYWdlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdEVtcHR5TWVzc2FnZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RFbXB0eU1lc3NhZ2UoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RFbXB0eU1lc3NhZ2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RFbXB0eU1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RFbXB0eU1lc3NhZ2UgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RFbXB0eU1lc3NhZ2UpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdEVtcHR5TWVzc2FnZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RFbXB0eU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RW1wdHlNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdEVtcHR5TWVzc2FnZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0RW1wdHlNZXNzYWdlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIDogcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucywgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMsIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaWYgKCFFeHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc0ZpZWxkTmFtZXM7DQorICAgICAgcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucywgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLkJ1aWxkZXI+LkV4dGVuc2lvbldyaXRlciBleHRlbnNpb25Xcml0ZXIgPSBDcmVhdGVFeHRlbnNpb25Xcml0ZXIodGhpcyk7DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoNTM2ODcwOTEyLCBvdXRwdXQpOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IEV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZTsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpFeHRlbmRhYmxlQnVpbGRlcjxUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICB0aGlzLk1lcmdlRXh0ZW5zaW9uRmllbGRzKG90aGVyKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyA6IHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMsIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcy5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLCBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmICghRXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNGaWVsZE5hbWVzOw0KKyAgICAgIHBiOjpFeHRlbmRhYmxlTWVzc2FnZTxUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMsIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcy5CdWlsZGVyPi5FeHRlbnNpb25Xcml0ZXIgZXh0ZW5zaW9uV3JpdGVyID0gQ3JlYXRlRXh0ZW5zaW9uV3JpdGVyKHRoaXMpOw0KKyAgICAgIGV4dGVuc2lvbldyaXRlci5Xcml0ZVVudGlsKDQzLCBvdXRwdXQpOw0KKyAgICAgIGV4dGVuc2lvbldyaXRlci5Xcml0ZVVudGlsKDQyNDQsIG91dHB1dCk7DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoNTM2ODcwOTEyLCBvdXRwdXQpOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IEV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZTsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpFeHRlbmRhYmxlQnVpbGRlcjxUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICB0aGlzLk1lcmdlRXh0ZW5zaW9uRmllbGRzKG90aGVyKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciwgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RSZWFsbHlMYXJnZVRhZ051bWJlckZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYSIsICJiYiIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXJGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgOCwgMjE0NzQ4MzY0MCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXJfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyLCBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBBRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzQTsNCisgICAgcHJpdmF0ZSBpbnQgYV87DQorICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNBOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBBIHsNCisgICAgICBnZXQgeyByZXR1cm4gYV87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBCYkZpZWxkTnVtYmVyID0gMjY4NDM1NDU1Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzQmI7DQorICAgIHByaXZhdGUgaW50IGJiXzsNCisgICAgcHVibGljIGJvb2wgSGFzQmIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNCYjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgQmIgew0KKyAgICAgIGdldCB7IHJldHVybiBiYl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RSZWFsbHlMYXJnZVRhZ051bWJlckZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzBdLCBBKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0JiKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyNjg0MzU0NTUsIGZpZWxkX25hbWVzWzFdLCBCYik7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBBKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0JiKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDI2ODQzNTQ1NSwgQmIpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlcigpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlcikgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAob3RoZXIuSGFzQSkgew0KKyAgICAgICAgICBBID0gb3RoZXIuQTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNCYikgew0KKyAgICAgICAgICBCYiA9IG90aGVyLkJiOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RSZWFsbHlMYXJnZVRhZ051bWJlckZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzQSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDIxNDc0ODM2NDA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNCYiA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmJiXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0E7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0QSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QShpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICByZXN1bHQuYV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQmIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNCYjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEJiIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQmI7IH0NCisgICAgICAgIHNldCB7IFNldEJiKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRCYihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmJiXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQmIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0JiID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuYmJfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0UmVjdXJzaXZlTWVzc2FnZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3RSZWN1cnNpdmVNZXNzYWdlLCBUZXN0UmVjdXJzaXZlTWVzc2FnZS5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3RSZWN1cnNpdmVNZXNzYWdlKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0UmVjdXJzaXZlTWVzc2FnZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiYSIsICJpIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RSZWN1cnNpdmVNZXNzYWdlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwLCAxNiB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWN1cnNpdmVNZXNzYWdlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UmVjdXJzaXZlTWVzc2FnZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0UmVjdXJzaXZlTWVzc2FnZSwgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlIGFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVjdXJzaXZlTWVzc2FnZSBBIHsNCisgICAgICBnZXQgeyByZXR1cm4gYV8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgSUZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0k7DQorICAgIHByaXZhdGUgaW50IGlfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNJIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzSTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgSSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGlfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0UmVjdXJzaXZlTWVzc2FnZUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMSwgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMiwgZmllbGRfbmFtZXNbMV0sIEkpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxLCBBKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0kpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMiwgSSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWN1cnNpdmVNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWN1cnNpdmVNZXNzYWdlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZWN1cnNpdmVNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdFJlY3Vyc2l2ZU1lc3NhZ2UsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RSZWN1cnNpdmVNZXNzYWdlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0UmVjdXJzaXZlTWVzc2FnZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RSZWN1cnNpdmVNZXNzYWdlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZWN1cnNpdmVNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RSZWN1cnNpdmVNZXNzYWdlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RSZWN1cnNpdmVNZXNzYWdlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdFJlY3Vyc2l2ZU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVjdXJzaXZlTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgIE1lcmdlQShvdGhlci5BKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNJKSB7DQorICAgICAgICAgIEkgPSBvdGhlci5JOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdFJlY3Vyc2l2ZU1lc3NhZ2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFJlY3Vyc2l2ZU1lc3NhZ2VGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzQSkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShBKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIEEgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNJID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuaV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0E7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlIEEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BOyB9DQorICAgICAgICBzZXQgeyBTZXRBKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRBKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICByZXN1bHQuYV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNBICYmDQorICAgICAgICAgICAgcmVzdWx0LmFfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5hXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmFfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuYV8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0kgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNJOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgSSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lkk7IH0NCisgICAgICAgIHNldCB7IFNldEkodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEkoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0kgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmlfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJJKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuaV8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdE11dHVhbFJlY3Vyc2lvbkEgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0TXV0dWFsUmVjdXJzaW9uQSwgVGVzdE11dHVhbFJlY3Vyc2lvbkEuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3RNdXR1YWxSZWN1cnNpb25BKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RNdXR1YWxSZWN1cnNpb25BIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0TXV0dWFsUmVjdXJzaW9uQSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdE11dHVhbFJlY3Vyc2lvbkFGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImJiIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RNdXR1YWxSZWN1cnNpb25BRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkEgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0TXV0dWFsUmVjdXJzaW9uQSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0TXV0dWFsUmVjdXJzaW9uQSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RNdXR1YWxSZWN1cnNpb25BX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RNdXR1YWxSZWN1cnNpb25BLCBUZXN0TXV0dWFsUmVjdXJzaW9uQS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQmJGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNCYjsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQiBiYl87DQorICAgIHB1YmxpYyBib29sIEhhc0JiIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQmI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIgQmIgew0KKyAgICAgIGdldCB7IHJldHVybiBiYl8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0TXV0dWFsUmVjdXJzaW9uQUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0JiKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDEsIGZpZWxkX25hbWVzWzBdLCBCYik7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzQmIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxLCBCYik7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdXR1YWxSZWN1cnNpb25BIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdXR1YWxSZWN1cnNpb25BIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdXR1YWxSZWN1cnNpb25BIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkEgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkEgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkEgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkEgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkEgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkEgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdE11dHVhbFJlY3Vyc2lvbkEgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdE11dHVhbFJlY3Vyc2lvbkEgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdE11dHVhbFJlY3Vyc2lvbkEsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RNdXR1YWxSZWN1cnNpb25BIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdE11dHVhbFJlY3Vyc2lvbkEgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdE11dHVhbFJlY3Vyc2lvbkEgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0TXV0dWFsUmVjdXJzaW9uQSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RNdXR1YWxSZWN1cnNpb25BKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0TXV0dWFsUmVjdXJzaW9uQSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RNdXR1YWxSZWN1cnNpb25BIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE11dHVhbFJlY3Vyc2lvbkEgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RNdXR1YWxSZWN1cnNpb25BKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RNdXR1YWxSZWN1cnNpb25BKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdE11dHVhbFJlY3Vyc2lvbkEgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNCYikgew0KKyAgICAgICAgICBNZXJnZUJiKG90aGVyLkJiKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RNdXR1YWxSZWN1cnNpb25BRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RNdXR1YWxSZWN1cnNpb25BRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQi5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQi5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc0JiKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKEJiKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIEJiID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNCYiB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQmI7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CIEJiIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQmI7IH0NCisgICAgICAgIHNldCB7IFNldEJiKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRCYihnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQiB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQmIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmJiXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEJiKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0JiID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5iYl8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUJiKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzQmIgJiYNCisgICAgICAgICAgICByZXN1bHQuYmJfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5iYl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQi5DcmVhdGVCdWlsZGVyKHJlc3VsdC5iYl8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuYmJfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzQmIgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQmIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0JiID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuYmJfID0gbnVsbDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkEoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RNdXR1YWxSZWN1cnNpb25CIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdE11dHVhbFJlY3Vyc2lvbkIsIFRlc3RNdXR1YWxSZWN1cnNpb25CLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0TXV0dWFsUmVjdXJzaW9uQigpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0TXV0dWFsUmVjdXJzaW9uQiBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdE11dHVhbFJlY3Vyc2lvbkIoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RNdXR1YWxSZWN1cnNpb25CRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiwgIm9wdGlvbmFsX2ludDMyIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RNdXR1YWxSZWN1cnNpb25CRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwLCAxNiB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdXR1YWxSZWN1cnNpb25CIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE11dHVhbFJlY3Vyc2lvbkIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdE11dHVhbFJlY3Vyc2lvbkIgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TXV0dWFsUmVjdXJzaW9uQl9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0TXV0dWFsUmVjdXJzaW9uQiwgVGVzdE11dHVhbFJlY3Vyc2lvbkIuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE11dHVhbFJlY3Vyc2lvbkJfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BIGFfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzQTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQSBBIHsNCisgICAgICBnZXQgeyByZXR1cm4gYV8gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxJbnQzMkZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc09wdGlvbmFsSW50MzI7DQorICAgIHByaXZhdGUgaW50IG9wdGlvbmFsSW50MzJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNPcHRpb25hbEludDMyIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT3B0aW9uYWxJbnQzMjsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgT3B0aW9uYWxJbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsSW50MzJfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0TXV0dWFsUmVjdXJzaW9uQkZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMSwgZmllbGRfbmFtZXNbMF0sIEEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzT3B0aW9uYWxJbnQzMikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMiwgZmllbGRfbmFtZXNbMV0sIE9wdGlvbmFsSW50MzIpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0EpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxLCBBKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09wdGlvbmFsSW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMiwgT3B0aW9uYWxJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdXR1YWxSZWN1cnNpb25CIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdXR1YWxSZWN1cnNpb25CIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNdXR1YWxSZWN1cnNpb25CIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQiBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdE11dHVhbFJlY3Vyc2lvbkIgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdE11dHVhbFJlY3Vyc2lvbkIgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdE11dHVhbFJlY3Vyc2lvbkIsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RNdXR1YWxSZWN1cnNpb25CIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdE11dHVhbFJlY3Vyc2lvbkIgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdE11dHVhbFJlY3Vyc2lvbkIgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0TXV0dWFsUmVjdXJzaW9uQiBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RNdXR1YWxSZWN1cnNpb25CKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0TXV0dWFsUmVjdXJzaW9uQiBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RNdXR1YWxSZWN1cnNpb25CIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE11dHVhbFJlY3Vyc2lvbkIgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RNdXR1YWxSZWN1cnNpb25CKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RNdXR1YWxSZWN1cnNpb25CKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdE11dHVhbFJlY3Vyc2lvbkIgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQi5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNBKSB7DQorICAgICAgICAgIE1lcmdlQShvdGhlci5BKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbEludDMyKSB7DQorICAgICAgICAgIE9wdGlvbmFsSW50MzIgPSBvdGhlci5PcHRpb25hbEludDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfdGVzdE11dHVhbFJlY3Vyc2lvbkJGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdE11dHVhbFJlY3Vyc2lvbkJGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzQSkgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShBKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIEEgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEludDMyID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQub3B0aW9uYWxJbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0Egew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0E7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BIEEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BOyB9DQorICAgICAgICBzZXQgeyBTZXRBKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRBKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICByZXN1bHQuYV8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUEoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNBICYmDQorICAgICAgICAgICAgcmVzdWx0LmFfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5hXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LmFfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuYV8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsSW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNPcHRpb25hbEludDMyOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgT3B0aW9uYWxJbnQzMiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9wdGlvbmFsSW50MzI7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsSW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE9wdGlvbmFsSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsSW50MzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsSW50MzJfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbEludDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub3B0aW9uYWxJbnQzMl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQigpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdER1cEZpZWxkTnVtYmVyIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdER1cEZpZWxkTnVtYmVyLCBUZXN0RHVwRmllbGROdW1iZXIuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFRlc3REdXBGaWVsZE51bWJlcigpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0RHVwRmllbGROdW1iZXIgZGVmYXVsdEluc3RhbmNlID0gbmV3IFRlc3REdXBGaWVsZE51bWJlcigpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfdGVzdER1cEZpZWxkTnVtYmVyRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJhIiwgImJhciIsICJmb28iIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdER1cEZpZWxkTnVtYmVyRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDgsIDI3LCAxOSB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REdXBGaWVsZE51bWJlciBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3REdXBGaWVsZE51bWJlciBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0RHVwRmllbGROdW1iZXIgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHVwRmllbGROdW1iZXJfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdER1cEZpZWxkTnVtYmVyLCBUZXN0RHVwRmllbGROdW1iZXIuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMNCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsNCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBGb28gOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxGb28sIEZvby5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIEZvbygpIHsgfQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRm9vIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBGb28oKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9mb29GaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImEiIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2Zvb0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4IH07DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvbyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBGb28gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZvbyBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX0Zvb19fRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxGb28sIEZvby5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX0Zvb19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgYV87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0E7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9mb29GaWVsZE5hbWVzOw0KKyAgICAgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzBdLCBBKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgDQorICAgICAgICAgIHNpemUgPSAwOw0KKyAgICAgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgQSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvbyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGb28gUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRm9vIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGb28gUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvbyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGb28gUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRm9vIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEZvbyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGb28gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRm9vIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIEZvbyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoRm9vIHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8Rm9vLCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKEZvbyBjbG9uZUZyb20pIHsNCisgICAgICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgICAgICBwcml2YXRlIEZvbyByZXN1bHQ7DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIEZvbyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgRm9vIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEZvbygpOw0KKyAgICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBGb28gTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvby5EZXNjcmlwdG9yOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBGb28gRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28uRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBGb28gQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGlzIEZvbykgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRm9vKSBvdGhlcik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEZvbyBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzQSkgew0KKyAgICAgICAgICAgICAgQSA9IG90aGVyLkE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2Zvb0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX2Zvb0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzQSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmFfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICANCisgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRBKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuYV8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgRm9vKCkgew0KKyAgICAgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCYXIgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxCYXIsIEJhci5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIEJhcigpIHsgfQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQmFyIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBCYXIoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9iYXJGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImEiIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2JhckZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4IH07DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJhciBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCYXIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJhciBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX0Jhcl9fRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxCYXIsIEJhci5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER1cEZpZWxkTnVtYmVyX0Jhcl9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgYV87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc0E7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBpbnQgQSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9iYXJGaWVsZE5hbWVzOw0KKyAgICAgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEsIGZpZWxkX25hbWVzWzBdLCBBKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgDQorICAgICAgICAgIHNpemUgPSAwOw0KKyAgICAgICAgICBpZiAoaGFzQSkgew0KKyAgICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoMSwgQSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJhciBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCYXIgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFyIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCYXIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJhciBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCYXIgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFyIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIEJhciBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCYXIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFyIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwcml2YXRlIEJhciBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoQmFyIHByb3RvdHlwZSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8QmFyLCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKEJhciBjbG9uZUZyb20pIHsNCisgICAgICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgICAgICBwcml2YXRlIEJhciByZXN1bHQ7DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIEJhciBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgQmFyIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEJhcigpOw0KKyAgICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCYXIgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhci5EZXNjcmlwdG9yOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCYXIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCYXIgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGlzIEJhcikgew0KKyAgICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoQmFyKSBvdGhlcik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEJhciBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzQSkgew0KKyAgICAgICAgICAgICAgQSA9IG90aGVyLkE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2JhckZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICAgICAgdGFnID0gX2JhckZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzQSA9IGlucHV0LlJlYWRJbnQzMihyZWYgcmVzdWx0LmFfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICANCisgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNBOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBBIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkE7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXRBKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEEoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzQSA9IHRydWU7DQorICAgICAgICAgICAgcmVzdWx0LmFfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJBKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0EgPSBmYWxzZTsNCisgICAgICAgICAgICByZXN1bHQuYV8gPSAwOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgQmFyKCkgew0KKyAgICAgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNBOw0KKyAgICBwcml2YXRlIGludCBhXzsNCisgICAgcHVibGljIGJvb2wgSGFzQSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0E7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgIGdldCB7IHJldHVybiBhXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEZvb0ZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0ZvbzsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vIGZvb187DQorICAgIHB1YmxpYyBib29sIEhhc0ZvbyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0ZvbzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vIEZvbyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGZvb18gPz8gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvby5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBCYXJGaWVsZE51bWJlciA9IDM7DQorICAgIHByaXZhdGUgYm9vbCBoYXNCYXI7DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhciBiYXJfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNCYXIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNCYXI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhciBCYXIgew0KKyAgICAgIGdldCB7IHJldHVybiBiYXJfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF90ZXN0RHVwRmllbGROdW1iZXJGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigxLCBmaWVsZF9uYW1lc1swXSwgQSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNGb28pIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUdyb3VwKDIsIGZpZWxkX25hbWVzWzJdLCBGb28pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQmFyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVHcm91cCgzLCBmaWVsZF9uYW1lc1sxXSwgQmFyKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNBKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDEsIEEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRm9vKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlR3JvdXBTaXplKDIsIEZvbyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNCYXIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVHcm91cFNpemUoMywgQmFyKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER1cEZpZWxkTnVtYmVyIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REdXBGaWVsZE51bWJlciBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHVwRmllbGROdW1iZXIgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REdXBGaWVsZE51bWJlciBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER1cEZpZWxkTnVtYmVyIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REdXBGaWVsZE51bWJlciBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHVwRmllbGROdW1iZXIgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER1cEZpZWxkTnVtYmVyIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REdXBGaWVsZE51bWJlciBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHVwRmllbGROdW1iZXIgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgVGVzdER1cEZpZWxkTnVtYmVyIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3REdXBGaWVsZE51bWJlciBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0RHVwRmllbGROdW1iZXIsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3REdXBGaWVsZE51bWJlciBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3REdXBGaWVsZE51bWJlciByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0RHVwRmllbGROdW1iZXIgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0RHVwRmllbGROdW1iZXIgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0RHVwRmllbGROdW1iZXIoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3REdXBGaWVsZE51bWJlciBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RHVwRmllbGROdW1iZXIgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdER1cEZpZWxkTnVtYmVyIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0RHVwRmllbGROdW1iZXIpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdER1cEZpZWxkTnVtYmVyKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdER1cEZpZWxkTnVtYmVyIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0EpIHsNCisgICAgICAgICAgQSA9IG90aGVyLkE7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRm9vKSB7DQorICAgICAgICAgIE1lcmdlRm9vKG90aGVyLkZvbyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzQmFyKSB7DQorICAgICAgICAgIE1lcmdlQmFyKG90aGVyLkJhcik7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0RHVwRmllbGROdW1iZXJGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdER1cEZpZWxkTnVtYmVyRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNBID0gaW5wdXQuUmVhZEludDMyKHJlZiByZXN1bHQuYV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTk6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28uQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvby5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc0Zvbykgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShGb28pOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEdyb3VwKDIsIHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIEZvbyA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNzogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhci5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzQmFyKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKEJhcik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkR3JvdXAoMywgc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgQmFyID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNBIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzQTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5BOyB9DQorICAgICAgICBzZXQgeyBTZXRBKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRBKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNBID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5hXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmFfID0gMDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNGb28gew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0ZvbzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvbyBGb28gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Gb287IH0NCisgICAgICAgIHNldCB7IFNldEZvbyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Rm9vKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZvbyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZm9vXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEZvbyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0ZvbyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZm9vXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlRm9vKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5Gb28gdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNGb28gJiYNCisgICAgICAgICAgICByZXN1bHQuZm9vXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuRm9vLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5mb29fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkZvby5DcmVhdGVCdWlsZGVyKHJlc3VsdC5mb29fKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0LmZvb18gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNGb28gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRm9vKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNGb28gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5mb29fID0gbnVsbDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNCYXIgew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0JhcjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhciBCYXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5CYXI7IH0NCisgICAgICAgIHNldCB7IFNldEJhcih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0QmFyKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0JhciA9IHRydWU7DQorICAgICAgICByZXN1bHQuYmFyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldEJhcihnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0JhciA9IHRydWU7DQorICAgICAgICByZXN1bHQuYmFyXyA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIE1lcmdlQmFyKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REdXBGaWVsZE51bWJlci5UeXBlcy5CYXIgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNCYXIgJiYNCisgICAgICAgICAgICByZXN1bHQuYmFyXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHVwRmllbGROdW1iZXIuVHlwZXMuQmFyLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5iYXJfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER1cEZpZWxkTnVtYmVyLlR5cGVzLkJhci5DcmVhdGVCdWlsZGVyKHJlc3VsdC5iYXJfKS5NZXJnZUZyb20odmFsdWUpLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0LmJhcl8gPSB2YWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdC5oYXNCYXIgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQmFyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNCYXIgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5iYXJfID0gbnVsbDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdER1cEZpZWxkTnVtYmVyKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMsIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLCBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMNCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsNCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBOZXN0ZWRNZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8TmVzdGVkTWVzc2FnZSwgTmVzdGVkTWVzc2FnZS5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIE5lc3RlZE1lc3NhZ2UoKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE5lc3RlZE1lc3NhZ2UgZGVmYXVsdEluc3RhbmNlID0gbmV3IE5lc3RlZE1lc3NhZ2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9uZXN0ZWRNZXNzYWdlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJuZXN0ZWRtZXNzYWdlX3JlcGVhdGVkX2ZvcmVpZ25tZXNzYWdlIiwgIm5lc3RlZG1lc3NhZ2VfcmVwZWF0ZWRfaW50MzIiIH07DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX25lc3RlZE1lc3NhZ2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTgsIDggfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBOZXN0ZWRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBOZXN0ZWRNZXNzYWdlIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfTmVzdGVkTWVzc2FnZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxOZXN0ZWRNZXNzYWdlLCBOZXN0ZWRNZXNzYWdlLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNfTmVzdGVkTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJGaWVsZE51bWJlciA9IDE7DQorICAgICAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gbmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJMaXN0IHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl8pOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyQ291bnQgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gbmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfLkNvdW50OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IEdldE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyKGludCBpbmRleCkgew0KKyAgICAgICAgICByZXR1cm4gbmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfW2luZGV4XTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZUZpZWxkTnVtYmVyID0gMjsNCisgICAgICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4oKTsNCisgICAgICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPiBOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZUxpc3Qgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gbmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlQ291bnQgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gbmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfLkNvdW50OyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgR2V0TmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2UoaW50IGluZGV4KSB7DQorICAgICAgICAgIHJldHVybiBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV9baW5kZXhdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9uZXN0ZWRNZXNzYWdlRmllbGROYW1lczsNCisgICAgICAgICAgaWYgKG5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMkFycmF5KDEsIGZpZWxkX25hbWVzWzFdLCBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl8pOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8uQ291bnQgPiAwKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZUFycmF5KDIsIGZpZWxkX25hbWVzWzBdLCBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8pOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyTGlzdCkgew0KKyAgICAgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgICAgICBzaXplICs9IDEgKiBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl8uQ291bnQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgZWxlbWVudCBpbiBOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZUxpc3QpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMiwgZWxlbWVudCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICAgICAgcmV0dXJuIHNpemU7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBOZXN0ZWRNZXNzYWdlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIE5lc3RlZE1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVzdGVkTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpdmF0ZSBOZXN0ZWRNZXNzYWdlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICAgICAgbmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICBuZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoTmVzdGVkTWVzc2FnZSBwcm90b3R5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPE5lc3RlZE1lc3NhZ2UsIEJ1aWxkZXI+IHsNCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludGVybmFsIEJ1aWxkZXIoTmVzdGVkTWVzc2FnZSBjbG9uZUZyb20pIHsNCisgICAgICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgICAgICBwcml2YXRlIE5lc3RlZE1lc3NhZ2UgcmVzdWx0Ow0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBOZXN0ZWRNZXNzYWdlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICBOZXN0ZWRNZXNzYWdlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE5lc3RlZE1lc3NhZ2UoKTsNCisgICAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgTmVzdGVkTWVzc2FnZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuVHlwZXMuTmVzdGVkTWVzc2FnZS5EZXNjcmlwdG9yOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBOZXN0ZWRNZXNzYWdlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuVHlwZXMuTmVzdGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIE5lc3RlZE1lc3NhZ2UgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGlzIE5lc3RlZE1lc3NhZ2UpIHsNCisgICAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKE5lc3RlZE1lc3NhZ2UpIG90aGVyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oTmVzdGVkTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuVHlwZXMuTmVzdGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgaWYgKG90aGVyLm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgICAgICByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfLkFkZChvdGhlci5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMl8pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAob3RoZXIubmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgICAgIHJlc3VsdC5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8uQWRkKG90aGVyLm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICAgICAgdWludCB0YWc7DQorICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX25lc3RlZE1lc3NhZ2VGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgICAgIHRhZyA9IF9uZXN0ZWRNZXNzYWdlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgMTA6DQorICAgICAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgICAgIGlucHV0LlJlYWRJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0Lm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyXyk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAxODogew0KKyAgICAgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICANCisgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyTGlzdCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkubmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGludCBOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRJbnQzMkNvdW50IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyQ291bnQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgaW50IEdldE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyKGludCBpbmRleCkgew0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuR2V0TmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzIoaW5kZXgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlTmVzdGVkbWVzc2FnZVJlcGVhdGVkSW50MzIoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEludDMyXy5DbGVhcigpOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPiBOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZUxpc3Qgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlXzsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgTmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VDb3VudCB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5OZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZUNvdW50OyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIEdldE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlKGludCBpbmRleCkgew0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuR2V0TmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2UoaW5kZXgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXROZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lm5lc3RlZG1lc3NhZ2VSZXBlYXRlZEZvcmVpZ25tZXNzYWdlX1tpbmRleF0gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBBZGROZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfLkFkZCh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkTmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQubmVzdGVkbWVzc2FnZVJlcGVhdGVkRm9yZWlnbm1lc3NhZ2VfLkFkZChidWlsZGVyRm9yVmFsdWUuQnVpbGQoKSk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPiB2YWx1ZXMpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8uQWRkKHZhbHVlcyk7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZSgpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5uZXN0ZWRtZXNzYWdlUmVwZWF0ZWRGb3JlaWdubWVzc2FnZV8uQ2xlYXIoKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIE5lc3RlZE1lc3NhZ2UoKSB7DQorICAgICAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxOZXN0ZWRNZXNzYWdlRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlIG9wdGlvbmFsTmVzdGVkTWVzc2FnZV87DQorICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuVHlwZXMuTmVzdGVkTWVzc2FnZSBPcHRpb25hbE5lc3RlZE1lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbE5lc3RlZE1lc3NhZ2VfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKDEsIGZpZWxkX25hbWVzWzBdLCBPcHRpb25hbE5lc3RlZE1lc3NhZ2UpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIE9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UpIHsNCisgICAgICAgICAgTWVyZ2VPcHRpb25hbE5lc3RlZE1lc3NhZ2Uob3RoZXIuT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3ROZXN0ZWRNZXNzYWdlSGFzQml0c0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHNGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKE9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBPcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuVHlwZXMuTmVzdGVkTWVzc2FnZSBPcHRpb25hbE5lc3RlZE1lc3NhZ2Ugew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5PcHRpb25hbE5lc3RlZE1lc3NhZ2U7IH0NCisgICAgICAgIHNldCB7IFNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VPcHRpb25hbE5lc3RlZE1lc3NhZ2UoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UgJiYNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMuVHlwZXMuTmVzdGVkTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0Lm9wdGlvbmFsTmVzdGVkTWVzc2FnZV8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJPcHRpb25hbE5lc3RlZE1lc3NhZ2UoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0TmVzdGVkTWVzc2FnZUhhc0JpdHMoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMsIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJDb3JkRmllbGQiLCAiRW51bUZpZWxkIiwgIk1lc3NhZ2VGaWVsZCIsICJQcmltaXRpdmVGaWVsZCIsICJSZXBlYXRlZENvcmRGaWVsZCIsICJSZXBlYXRlZEVudW1GaWVsZCIsICJSZXBlYXRlZE1lc3NhZ2VGaWVsZCIsICJSZXBlYXRlZFByaW1pdGl2ZUZpZWxkIiwgIlJlcGVhdGVkU3RyaW5nRmllbGQiLCAiUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkIiwgIlN0cmluZ0ZpZWxkIiwgIlN0cmluZ1BpZWNlRmllbGQiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdENhbWVsQ2FzZUZpZWxkTmFtZXNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgNTAsIDI0LCAzNCwgOCwgOTgsIDcyLCA4MiwgNTYsIDY2LCA5MCwgMTgsIDQyIH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzLCBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0Q2FtZWxDYXNlRmllbGROYW1lc19fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUHJpbWl0aXZlRmllbGRGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNQcmltaXRpdmVGaWVsZDsNCisgICAgcHJpdmF0ZSBpbnQgcHJpbWl0aXZlRmllbGRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNQcmltaXRpdmVGaWVsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1ByaW1pdGl2ZUZpZWxkOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQcmltaXRpdmVGaWVsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHByaW1pdGl2ZUZpZWxkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFN0cmluZ0ZpZWxkRmllbGROdW1iZXIgPSAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzU3RyaW5nRmllbGQ7DQorICAgIHByaXZhdGUgc3RyaW5nIHN0cmluZ0ZpZWxkXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNTdHJpbmdGaWVsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1N0cmluZ0ZpZWxkOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBTdHJpbmdGaWVsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHN0cmluZ0ZpZWxkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEVudW1GaWVsZEZpZWxkTnVtYmVyID0gMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0VudW1GaWVsZDsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBlbnVtRmllbGRfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0uRk9SRUlHTl9GT087DQorICAgIHB1YmxpYyBib29sIEhhc0VudW1GaWVsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0VudW1GaWVsZDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBFbnVtRmllbGQgew0KKyAgICAgIGdldCB7IHJldHVybiBlbnVtRmllbGRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTWVzc2FnZUZpZWxkRmllbGROdW1iZXIgPSA0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzTWVzc2FnZUZpZWxkOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIG1lc3NhZ2VGaWVsZF87DQorICAgIHB1YmxpYyBib29sIEhhc01lc3NhZ2VGaWVsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc01lc3NhZ2VGaWVsZDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBNZXNzYWdlRmllbGQgew0KKyAgICAgIGdldCB7IHJldHVybiBtZXNzYWdlRmllbGRfID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFN0cmluZ1BpZWNlRmllbGRGaWVsZE51bWJlciA9IDU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNTdHJpbmdQaWVjZUZpZWxkOw0KKyAgICBwcml2YXRlIHN0cmluZyBzdHJpbmdQaWVjZUZpZWxkXyA9ICIiOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNTdHJpbmdQaWVjZUZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzU3RyaW5nUGllY2VGaWVsZDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgU3RyaW5nUGllY2VGaWVsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHN0cmluZ1BpZWNlRmllbGRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQ29yZEZpZWxkRmllbGROdW1iZXIgPSA2Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzQ29yZEZpZWxkOw0KKyAgICBwcml2YXRlIHN0cmluZyBjb3JkRmllbGRfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc0NvcmRGaWVsZCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0NvcmRGaWVsZDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgQ29yZEZpZWxkIHsNCisgICAgICBnZXQgeyByZXR1cm4gY29yZEZpZWxkXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRGaWVsZE51bWJlciA9IDc7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiByZXBlYXRlZFByaW1pdGl2ZUZpZWxkXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gUmVwZWF0ZWRQcmltaXRpdmVGaWVsZExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgR2V0UmVwZWF0ZWRQcmltaXRpdmVGaWVsZChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRQcmltaXRpdmVGaWVsZF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU3RyaW5nRmllbGRGaWVsZE51bWJlciA9IDg7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8c3RyaW5nPiByZXBlYXRlZFN0cmluZ0ZpZWxkXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gUmVwZWF0ZWRTdHJpbmdGaWVsZExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRTdHJpbmdGaWVsZF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFN0cmluZ0ZpZWxkQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFN0cmluZ0ZpZWxkXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgR2V0UmVwZWF0ZWRTdHJpbmdGaWVsZChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRTdHJpbmdGaWVsZF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRW51bUZpZWxkRmllbGROdW1iZXIgPSA5Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiByZXBlYXRlZEVudW1GaWVsZF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiBSZXBlYXRlZEVudW1GaWVsZExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRFbnVtRmllbGRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRFbnVtRmllbGRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRW51bUZpZWxkXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBHZXRSZXBlYXRlZEVudW1GaWVsZChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRFbnVtRmllbGRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEZpZWxkTnVtYmVyID0gMTA7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IHJlcGVhdGVkTWVzc2FnZUZpZWxkXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IFJlcGVhdGVkTWVzc2FnZUZpZWxkTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkTWVzc2FnZUZpZWxkXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRNZXNzYWdlRmllbGRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkTWVzc2FnZUZpZWxkXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBHZXRSZXBlYXRlZE1lc3NhZ2VGaWVsZChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRNZXNzYWdlRmllbGRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRGaWVsZE51bWJlciA9IDExOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gcmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkQ29yZEZpZWxkRmllbGROdW1iZXIgPSAxMjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+IHJlcGVhdGVkQ29yZEZpZWxkXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gUmVwZWF0ZWRDb3JkRmllbGRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkQ29yZEZpZWxkXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkQ29yZEZpZWxkQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZENvcmRGaWVsZF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkQ29yZEZpZWxkKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZENvcmRGaWVsZF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdENhbWVsQ2FzZUZpZWxkTmFtZXNGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNQcmltaXRpdmVGaWVsZCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMSwgZmllbGRfbmFtZXNbM10sIFByaW1pdGl2ZUZpZWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1N0cmluZ0ZpZWxkKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoMiwgZmllbGRfbmFtZXNbMTBdLCBTdHJpbmdGaWVsZCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNFbnVtRmllbGQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW0oMywgZmllbGRfbmFtZXNbMV0sIChpbnQpIEVudW1GaWVsZCwgRW51bUZpZWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc01lc3NhZ2VGaWVsZCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZSg0LCBmaWVsZF9uYW1lc1syXSwgTWVzc2FnZUZpZWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1N0cmluZ1BpZWNlRmllbGQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyg1LCBmaWVsZF9uYW1lc1sxMV0sIFN0cmluZ1BpZWNlRmllbGQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQ29yZEZpZWxkKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoNiwgZmllbGRfbmFtZXNbMF0sIENvcmRGaWVsZCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyQXJyYXkoNywgZmllbGRfbmFtZXNbN10sIHJlcGVhdGVkUHJpbWl0aXZlRmllbGRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkU3RyaW5nRmllbGRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoOCwgZmllbGRfbmFtZXNbOF0sIHJlcGVhdGVkU3RyaW5nRmllbGRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkRW51bUZpZWxkXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW1BcnJheSg5LCBmaWVsZF9uYW1lc1s1XSwgcmVwZWF0ZWRFbnVtRmllbGRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkTWVzc2FnZUZpZWxkXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2VBcnJheSgxMCwgZmllbGRfbmFtZXNbNl0sIHJlcGVhdGVkTWVzc2FnZUZpZWxkXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoMTEsIGZpZWxkX25hbWVzWzldLCByZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkQ29yZEZpZWxkXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZ0FycmF5KDEyLCBmaWVsZF9uYW1lc1s0XSwgcmVwZWF0ZWRDb3JkRmllbGRfKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNQcmltaXRpdmVGaWVsZCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxLCBQcmltaXRpdmVGaWVsZCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNTdHJpbmdGaWVsZCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMiwgU3RyaW5nRmllbGQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRW51bUZpZWxkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoMywgKGludCkgRW51bUZpZWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc01lc3NhZ2VGaWVsZCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDQsIE1lc3NhZ2VGaWVsZCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNTdHJpbmdQaWVjZUZpZWxkKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSg1LCBTdHJpbmdQaWVjZUZpZWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0NvcmRGaWVsZCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoNiwgQ29yZEZpZWxkKTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAxICogcmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChzdHJpbmcgZWxlbWVudCBpbiBSZXBlYXRlZFN0cmluZ0ZpZWxkTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDEgKiByZXBlYXRlZFN0cmluZ0ZpZWxkXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGlmIChyZXBlYXRlZEVudW1GaWVsZF8uQ291bnQgPiAwKSB7DQorICAgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIGVsZW1lbnQgaW4gcmVwZWF0ZWRFbnVtRmllbGRfKSB7DQorICAgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZU5vVGFnKChpbnQpIGVsZW1lbnQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICAgIHNpemUgKz0gMSAqIHJlcGVhdGVkRW51bUZpZWxkXy5Db3VudDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgZWxlbWVudCBpbiBSZXBlYXRlZE1lc3NhZ2VGaWVsZExpc3QpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgxMCwgZWxlbWVudCk7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChzdHJpbmcgZWxlbWVudCBpbiBSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMSAqIHJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChzdHJpbmcgZWxlbWVudCBpbiBSZXBlYXRlZENvcmRGaWVsZExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAxICogcmVwZWF0ZWRDb3JkRmllbGRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZFN0cmluZ0ZpZWxkXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXBlYXRlZEVudW1GaWVsZF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRNZXNzYWdlRmllbGRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRDb3JkRmllbGRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RDYW1lbENhc2VGaWVsZE5hbWVzLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RDYW1lbENhc2VGaWVsZE5hbWVzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0Q2FtZWxDYXNlRmllbGROYW1lcy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNQcmltaXRpdmVGaWVsZCkgew0KKyAgICAgICAgICBQcmltaXRpdmVGaWVsZCA9IG90aGVyLlByaW1pdGl2ZUZpZWxkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1N0cmluZ0ZpZWxkKSB7DQorICAgICAgICAgIFN0cmluZ0ZpZWxkID0gb3RoZXIuU3RyaW5nRmllbGQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRW51bUZpZWxkKSB7DQorICAgICAgICAgIEVudW1GaWVsZCA9IG90aGVyLkVudW1GaWVsZDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNNZXNzYWdlRmllbGQpIHsNCisgICAgICAgICAgTWVyZ2VNZXNzYWdlRmllbGQob3RoZXIuTWVzc2FnZUZpZWxkKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNTdHJpbmdQaWVjZUZpZWxkKSB7DQorICAgICAgICAgIFN0cmluZ1BpZWNlRmllbGQgPSBvdGhlci5TdHJpbmdQaWVjZUZpZWxkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0NvcmRGaWVsZCkgew0KKyAgICAgICAgICBDb3JkRmllbGQgPSBvdGhlci5Db3JkRmllbGQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8uQWRkKG90aGVyLnJlcGVhdGVkUHJpbWl0aXZlRmllbGRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFN0cmluZ0ZpZWxkXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ0ZpZWxkXy5BZGQob3RoZXIucmVwZWF0ZWRTdHJpbmdGaWVsZF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkRW51bUZpZWxkXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEVudW1GaWVsZF8uQWRkKG90aGVyLnJlcGVhdGVkRW51bUZpZWxkXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRNZXNzYWdlRmllbGRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkTWVzc2FnZUZpZWxkXy5BZGQob3RoZXIucmVwZWF0ZWRNZXNzYWdlRmllbGRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8uQWRkKG90aGVyLnJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkQ29yZEZpZWxkXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZENvcmRGaWVsZF8uQWRkKG90aGVyLnJlcGVhdGVkQ29yZEZpZWxkXyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0Q2FtZWxDYXNlRmllbGROYW1lc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0Q2FtZWxDYXNlRmllbGROYW1lc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzUHJpbWl0aXZlRmllbGQgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5wcmltaXRpdmVGaWVsZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTg6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNTdHJpbmdGaWVsZCA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5zdHJpbmdGaWVsZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgICAgICAgIG9iamVjdCB1bmtub3duOw0KKyAgICAgICAgICAgICAgaWYoaW5wdXQuUmVhZEVudW0ocmVmIHJlc3VsdC5lbnVtRmllbGRfLCBvdXQgdW5rbm93bikpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc0VudW1GaWVsZCA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoMywgKHVsb25nKShpbnQpdW5rbm93bik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzNDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNNZXNzYWdlRmllbGQpIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oTWVzc2FnZUZpZWxkKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsNCisgICAgICAgICAgICAgIE1lc3NhZ2VGaWVsZCA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0Mjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1N0cmluZ1BpZWNlRmllbGQgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuc3RyaW5nUGllY2VGaWVsZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNTA6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNDb3JkRmllbGQgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuY29yZEZpZWxkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1ODoNCisgICAgICAgICAgICBjYXNlIDU2OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZFByaW1pdGl2ZUZpZWxkXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA2Njogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkU3RyaW5nRmllbGRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc0Og0KKyAgICAgICAgICAgIGNhc2UgNzI6IHsNCisgICAgICAgICAgICAgIHNjZzo6SUNvbGxlY3Rpb248b2JqZWN0PiB1bmtub3duSXRlbXM7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRW51bUFycmF5PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPih0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEVudW1GaWVsZF8sIG91dCB1bmtub3duSXRlbXMpOw0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25JdGVtcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IHJhd1ZhbHVlIGluIHVua25vd25JdGVtcykNCisgICAgICAgICAgICAgICAgICBpZiAocmF3VmFsdWUgaXMgaW50KQ0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5NZXJnZVZhcmludEZpZWxkKDksICh1bG9uZykoaW50KXJhd1ZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgyOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkTWVzc2FnZUZpZWxkXywgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlLCBleHRlbnNpb25SZWdpc3RyeSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA5MDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgOTg6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTdHJpbmdBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZENvcmRGaWVsZF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1ByaW1pdGl2ZUZpZWxkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzUHJpbWl0aXZlRmllbGQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQcmltaXRpdmVGaWVsZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlByaW1pdGl2ZUZpZWxkOyB9DQorICAgICAgICBzZXQgeyBTZXRQcmltaXRpdmVGaWVsZCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UHJpbWl0aXZlRmllbGQoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ByaW1pdGl2ZUZpZWxkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5wcmltaXRpdmVGaWVsZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclByaW1pdGl2ZUZpZWxkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNQcmltaXRpdmVGaWVsZCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnByaW1pdGl2ZUZpZWxkXyA9IDA7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzU3RyaW5nRmllbGQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNTdHJpbmdGaWVsZDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIFN0cmluZ0ZpZWxkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuU3RyaW5nRmllbGQ7IH0NCisgICAgICAgIHNldCB7IFNldFN0cmluZ0ZpZWxkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRTdHJpbmdGaWVsZChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1N0cmluZ0ZpZWxkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5zdHJpbmdGaWVsZF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclN0cmluZ0ZpZWxkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTdHJpbmdGaWVsZCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnN0cmluZ0ZpZWxkXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0VudW1GaWVsZCB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRW51bUZpZWxkOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBFbnVtRmllbGQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5FbnVtRmllbGQ7IH0NCisgICAgICAgIHNldCB7IFNldEVudW1GaWVsZCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RW51bUZpZWxkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0VudW1GaWVsZCA9IHRydWU7DQorICAgICAgICByZXN1bHQuZW51bUZpZWxkXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRW51bUZpZWxkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNFbnVtRmllbGQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5lbnVtRmllbGRfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0uRk9SRUlHTl9GT087DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTWVzc2FnZUZpZWxkIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNNZXNzYWdlRmllbGQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIE1lc3NhZ2VGaWVsZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk1lc3NhZ2VGaWVsZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TWVzc2FnZUZpZWxkKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRNZXNzYWdlRmllbGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc01lc3NhZ2VGaWVsZCA9IHRydWU7DQorICAgICAgICByZXN1bHQubWVzc2FnZUZpZWxkXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE1lc3NhZ2VGaWVsZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNZXNzYWdlRmllbGQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm1lc3NhZ2VGaWVsZF8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZU1lc3NhZ2VGaWVsZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBpZiAocmVzdWx0Lmhhc01lc3NhZ2VGaWVsZCAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5tZXNzYWdlRmllbGRfICE9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5tZXNzYWdlRmllbGRfID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcihyZXN1bHQubWVzc2FnZUZpZWxkXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5tZXNzYWdlRmllbGRfID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZUZpZWxkID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck1lc3NhZ2VGaWVsZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZUZpZWxkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubWVzc2FnZUZpZWxkXyA9IG51bGw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzU3RyaW5nUGllY2VGaWVsZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1N0cmluZ1BpZWNlRmllbGQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBTdHJpbmdQaWVjZUZpZWxkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuU3RyaW5nUGllY2VGaWVsZDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0U3RyaW5nUGllY2VGaWVsZCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0U3RyaW5nUGllY2VGaWVsZChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1N0cmluZ1BpZWNlRmllbGQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnN0cmluZ1BpZWNlRmllbGRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTdHJpbmdQaWVjZUZpZWxkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTdHJpbmdQaWVjZUZpZWxkID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuc3RyaW5nUGllY2VGaWVsZF8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNDb3JkRmllbGQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNDb3JkRmllbGQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBDb3JkRmllbGQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Db3JkRmllbGQ7IH0NCisgICAgICAgIHNldCB7IFNldENvcmRGaWVsZCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0Q29yZEZpZWxkKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzQ29yZEZpZWxkID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5jb3JkRmllbGRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJDb3JkRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0NvcmRGaWVsZCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmNvcmRGaWVsZF8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gUmVwZWF0ZWRQcmltaXRpdmVGaWVsZExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRQcmltaXRpdmVGaWVsZF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFByaW1pdGl2ZUZpZWxkQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXRSZXBlYXRlZFByaW1pdGl2ZUZpZWxkKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZFByaW1pdGl2ZUZpZWxkKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRQcmltaXRpdmVGaWVsZChpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFByaW1pdGl2ZUZpZWxkX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZFByaW1pdGl2ZUZpZWxkKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRQcmltaXRpdmVGaWVsZChzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkUHJpbWl0aXZlRmllbGRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRQcmltaXRpdmVGaWVsZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gUmVwZWF0ZWRTdHJpbmdGaWVsZExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRTdHJpbmdGaWVsZF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZFN0cmluZ0ZpZWxkQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZFN0cmluZ0ZpZWxkQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZFN0cmluZ0ZpZWxkKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZFN0cmluZ0ZpZWxkKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRTdHJpbmdGaWVsZChpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdGaWVsZF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRTdHJpbmdGaWVsZChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkU3RyaW5nRmllbGRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZFN0cmluZ0ZpZWxkKHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdGaWVsZF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZFN0cmluZ0ZpZWxkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ0ZpZWxkXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IFJlcGVhdGVkRW51bUZpZWxkTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZEVudW1GaWVsZF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEVudW1GaWVsZENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRFbnVtRmllbGRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gR2V0UmVwZWF0ZWRFbnVtRmllbGQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRW51bUZpZWxkKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRFbnVtRmllbGQoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEVudW1GaWVsZF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRFbnVtRmllbGQoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRFbnVtRmllbGRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZEVudW1GaWVsZChzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRFbnVtRmllbGRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRFbnVtRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRW51bUZpZWxkXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IFJlcGVhdGVkTWVzc2FnZUZpZWxkTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZE1lc3NhZ2VGaWVsZF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZE1lc3NhZ2VGaWVsZENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRNZXNzYWdlRmllbGRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgR2V0UmVwZWF0ZWRNZXNzYWdlRmllbGQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkTWVzc2FnZUZpZWxkKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRNZXNzYWdlRmllbGQoaW50IGluZGV4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlRmllbGRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkTWVzc2FnZUZpZWxkKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlRmllbGRfW2luZGV4XSA9IGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkTWVzc2FnZUZpZWxkKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VGaWVsZF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZE1lc3NhZ2VGaWVsZChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VGaWVsZF8uQWRkKGJ1aWxkZXJGb3JWYWx1ZS5CdWlsZCgpKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkTWVzc2FnZUZpZWxkKHNjZzo6SUVudW1lcmFibGU8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZE1lc3NhZ2VGaWVsZF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZE1lc3NhZ2VGaWVsZCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRNZXNzYWdlRmllbGRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxzdHJpbmc+IFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBHZXRSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZChpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGQoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGQoc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFN0cmluZ1BpZWNlRmllbGRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxzdHJpbmc+IFJlcGVhdGVkQ29yZEZpZWxkTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZENvcmRGaWVsZF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZENvcmRGaWVsZENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRDb3JkRmllbGRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEdldFJlcGVhdGVkQ29yZEZpZWxkKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZENvcmRGaWVsZChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkQ29yZEZpZWxkKGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZENvcmRGaWVsZF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRDb3JkRmllbGQoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZENvcmRGaWVsZF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkQ29yZEZpZWxkKHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRDb3JkRmllbGRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRDb3JkRmllbGQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkQ29yZEZpZWxkXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdEZpZWxkT3JkZXJpbmdzIDogcGI6OkV4dGVuZGFibGVNZXNzYWdlPFRlc3RGaWVsZE9yZGVyaW5ncywgVGVzdEZpZWxkT3JkZXJpbmdzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0RmllbGRPcmRlcmluZ3MoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdEZpZWxkT3JkZXJpbmdzIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0RmllbGRPcmRlcmluZ3MoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RGaWVsZE9yZGVyaW5nc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAibXlfZmxvYXQiLCAibXlfaW50IiwgIm15X3N0cmluZyIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF90ZXN0RmllbGRPcmRlcmluZ3NGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgODEzLCA4LCA5MCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGaWVsZE9yZGVyaW5ncyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RGaWVsZE9yZGVyaW5ncyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0RmllbGRPcmRlcmluZ3MgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RmllbGRPcmRlcmluZ3NfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdEZpZWxkT3JkZXJpbmdzLCBUZXN0RmllbGRPcmRlcmluZ3MuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEZpZWxkT3JkZXJpbmdzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBNeVN0cmluZ0ZpZWxkTnVtYmVyID0gMTE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNNeVN0cmluZzsNCisgICAgcHJpdmF0ZSBzdHJpbmcgbXlTdHJpbmdfID0gIiI7DQorICAgIHB1YmxpYyBib29sIEhhc015U3RyaW5nIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTXlTdHJpbmc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIE15U3RyaW5nIHsNCisgICAgICBnZXQgeyByZXR1cm4gbXlTdHJpbmdfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTXlJbnRGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNNeUludDsNCisgICAgcHJpdmF0ZSBsb25nIG15SW50XzsNCisgICAgcHVibGljIGJvb2wgSGFzTXlJbnQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNNeUludDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIE15SW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gbXlJbnRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTXlGbG9hdEZpZWxkTnVtYmVyID0gMTAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzTXlGbG9hdDsNCisgICAgcHJpdmF0ZSBmbG9hdCBteUZsb2F0XzsNCisgICAgcHVibGljIGJvb2wgSGFzTXlGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc015RmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgTXlGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG15RmxvYXRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpZiAoIUV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdEZpZWxkT3JkZXJpbmdzRmllbGROYW1lczsNCisgICAgICBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8VGVzdEZpZWxkT3JkZXJpbmdzLCBUZXN0RmllbGRPcmRlcmluZ3MuQnVpbGRlcj4uRXh0ZW5zaW9uV3JpdGVyIGV4dGVuc2lvbldyaXRlciA9IENyZWF0ZUV4dGVuc2lvbldyaXRlcih0aGlzKTsNCisgICAgICBpZiAoaGFzTXlJbnQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KDEsIGZpZWxkX25hbWVzWzFdLCBNeUludCk7DQorICAgICAgfQ0KKyAgICAgIGV4dGVuc2lvbldyaXRlci5Xcml0ZVVudGlsKDExLCBvdXRwdXQpOw0KKyAgICAgIGlmIChoYXNNeVN0cmluZykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDExLCBmaWVsZF9uYW1lc1syXSwgTXlTdHJpbmcpOw0KKyAgICAgIH0NCisgICAgICBleHRlbnNpb25Xcml0ZXIuV3JpdGVVbnRpbCgxMDEsIG91dHB1dCk7DQorICAgICAgaWYgKGhhc015RmxvYXQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDEwMSwgZmllbGRfbmFtZXNbMF0sIE15RmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc015U3RyaW5nKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxMSwgTXlTdHJpbmcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTXlJbnQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUoMSwgTXlJbnQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTXlGbG9hdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSgxMDEsIE15RmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBzaXplICs9IEV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZTsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RmllbGRPcmRlcmluZ3MgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZpZWxkT3JkZXJpbmdzIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGaWVsZE9yZGVyaW5ncyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZpZWxkT3JkZXJpbmdzIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RmllbGRPcmRlcmluZ3MgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZpZWxkT3JkZXJpbmdzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGaWVsZE9yZGVyaW5ncyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RmllbGRPcmRlcmluZ3MgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZpZWxkT3JkZXJpbmdzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RGaWVsZE9yZGVyaW5ncyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBUZXN0RmllbGRPcmRlcmluZ3MgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdEZpZWxkT3JkZXJpbmdzIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpFeHRlbmRhYmxlQnVpbGRlcjxUZXN0RmllbGRPcmRlcmluZ3MsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RGaWVsZE9yZGVyaW5ncyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFRlc3RGaWVsZE9yZGVyaW5ncyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0RmllbGRPcmRlcmluZ3MgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0RmllbGRPcmRlcmluZ3Mgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0RmllbGRPcmRlcmluZ3MoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RGaWVsZE9yZGVyaW5ncyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RGaWVsZE9yZGVyaW5ncy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0RmllbGRPcmRlcmluZ3MgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZpZWxkT3JkZXJpbmdzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEZpZWxkT3JkZXJpbmdzIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBUZXN0RmllbGRPcmRlcmluZ3MpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdEZpZWxkT3JkZXJpbmdzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdEZpZWxkT3JkZXJpbmdzIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEZpZWxkT3JkZXJpbmdzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc015U3RyaW5nKSB7DQorICAgICAgICAgIE15U3RyaW5nID0gb3RoZXIuTXlTdHJpbmc7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzTXlJbnQpIHsNCisgICAgICAgICAgTXlJbnQgPSBvdGhlci5NeUludDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNNeUZsb2F0KSB7DQorICAgICAgICAgIE15RmxvYXQgPSBvdGhlci5NeUZsb2F0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgICB0aGlzLk1lcmdlRXh0ZW5zaW9uRmllbGRzKG90aGVyKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RGaWVsZE9yZGVyaW5nc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF90ZXN0RmllbGRPcmRlcmluZ3NGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc015SW50ID0gaW5wdXQuUmVhZEludDY0KHJlZiByZXN1bHQubXlJbnRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDkwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTXlTdHJpbmcgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQubXlTdHJpbmdfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgxMzogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc015RmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5teUZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTXlTdHJpbmcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNNeVN0cmluZzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIE15U3RyaW5nIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTXlTdHJpbmc7IH0NCisgICAgICAgIHNldCB7IFNldE15U3RyaW5nKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRNeVN0cmluZyhzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc015U3RyaW5nID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5teVN0cmluZ18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck15U3RyaW5nKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNeVN0cmluZyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm15U3RyaW5nXyA9ICIiOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc015SW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTXlJbnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgTXlJbnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5NeUludDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TXlJbnQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE15SW50KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTXlJbnQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm15SW50XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTXlJbnQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc015SW50ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubXlJbnRfID0gMEw7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTXlGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc015RmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IE15RmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5NeUZsb2F0OyB9DQorICAgICAgICBzZXQgeyBTZXRNeUZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRNeUZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc015RmxvYXQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm15RmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJNeUZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNNeUZsb2F0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubXlGbG9hdF8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdEZpZWxkT3JkZXJpbmdzKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMsIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcy5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgImNwcF90cmlncmFwaCIsICJlc2NhcGVkX2J5dGVzIiwgImluZl9kb3VibGUiLCAiaW5mX2Zsb2F0IiwgImxhcmdlX2Zsb2F0IiwgImxhcmdlX3VpbnQzMiIsICJsYXJnZV91aW50NjQiLCAibmFuX2RvdWJsZSIsICJuYW5fZmxvYXQiLCAibmVnX2luZl9kb3VibGUiLCAibmVnX2luZl9mbG9hdCIsICJuZWdhdGl2ZV9mbG9hdCIsICJuZWdhdGl2ZV9vbmVfZmxvYXQiLCAib25lX2Zsb2F0IiwgInNtYWxsX2Zsb2F0IiwgInNtYWxsX2ludDMyIiwgInNtYWxsX2ludDY0IiwgInNtYWxsX25lZ2F0aXZlX2Zsb2F0IiwgInV0Zjhfc3RyaW5nIiwgInplcm9fZmxvYXQiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDE2MiwgMTAsIDExMywgMTQxLCAxMDEsIDE2LCAyNCwgMTI5LCAxNTcsIDEyMSwgMTQ5LCA5MywgODUsIDY5LCA3NywgMzIsIDQwLCAxMDksIDUwLCA2MSB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLCBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBFc2NhcGVkQnl0ZXNGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNFc2NhcGVkQnl0ZXM7DQorICAgIHByaXZhdGUgcGI6OkJ5dGVTdHJpbmcgZXNjYXBlZEJ5dGVzXyA9IChwYjo6Qnl0ZVN0cmluZykgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkRlc2NyaXB0b3IuRmllbGRzWzBdLkRlZmF1bHRWYWx1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzRXNjYXBlZEJ5dGVzIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRXNjYXBlZEJ5dGVzOyB9DQorICAgIH0NCisgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIEVzY2FwZWRCeXRlcyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGVzY2FwZWRCeXRlc187IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBMYXJnZVVpbnQzMkZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc0xhcmdlVWludDMyOw0KKyAgICBwcml2YXRlIHVpbnQgbGFyZ2VVaW50MzJfID0gNDI5NDk2NzI5NTsNCisgICAgcHVibGljIGJvb2wgSGFzTGFyZ2VVaW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNMYXJnZVVpbnQzMjsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBMYXJnZVVpbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGxhcmdlVWludDMyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IExhcmdlVWludDY0RmllbGROdW1iZXIgPSAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzTGFyZ2VVaW50NjQ7DQorICAgIHByaXZhdGUgdWxvbmcgbGFyZ2VVaW50NjRfID0gMTg0NDY3NDQwNzM3MDk1NTE2MTVVTDsNCisgICAgcHVibGljIGJvb2wgSGFzTGFyZ2VVaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNMYXJnZVVpbnQ2NDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgTGFyZ2VVaW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBsYXJnZVVpbnQ2NF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBTbWFsbEludDMyRmllbGROdW1iZXIgPSA0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzU21hbGxJbnQzMjsNCisgICAgcHJpdmF0ZSBpbnQgc21hbGxJbnQzMl8gPSAtMjE0NzQ4MzY0NzsNCisgICAgcHVibGljIGJvb2wgSGFzU21hbGxJbnQzMiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1NtYWxsSW50MzI7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFNtYWxsSW50MzIgew0KKyAgICAgIGdldCB7IHJldHVybiBzbWFsbEludDMyXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFNtYWxsSW50NjRGaWVsZE51bWJlciA9IDU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNTbWFsbEludDY0Ow0KKyAgICBwcml2YXRlIGxvbmcgc21hbGxJbnQ2NF8gPSAtOTIyMzM3MjAzNjg1NDc3NTgwN0w7DQorICAgIHB1YmxpYyBib29sIEhhc1NtYWxsSW50NjQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNTbWFsbEludDY0OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgU21hbGxJbnQ2NCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHNtYWxsSW50NjRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVXRmOFN0cmluZ0ZpZWxkTnVtYmVyID0gNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc1V0ZjhTdHJpbmc7DQorICAgIHByaXZhdGUgc3RyaW5nIHV0ZjhTdHJpbmdfID0gKHN0cmluZykgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkRlc2NyaXB0b3IuRmllbGRzWzVdLkRlZmF1bHRWYWx1ZTsNCisgICAgcHVibGljIGJvb2wgSGFzVXRmOFN0cmluZyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1V0ZjhTdHJpbmc7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIFV0ZjhTdHJpbmcgew0KKyAgICAgIGdldCB7IHJldHVybiB1dGY4U3RyaW5nXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFplcm9GbG9hdEZpZWxkTnVtYmVyID0gNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc1plcm9GbG9hdDsNCisgICAgcHJpdmF0ZSBmbG9hdCB6ZXJvRmxvYXRfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNaZXJvRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNaZXJvRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgWmVyb0Zsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gemVyb0Zsb2F0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE9uZUZsb2F0RmllbGROdW1iZXIgPSA4Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzT25lRmxvYXQ7DQorICAgIHByaXZhdGUgZmxvYXQgb25lRmxvYXRfID0gMUY7DQorICAgIHB1YmxpYyBib29sIEhhc09uZUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzT25lRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgT25lRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBvbmVGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBTbWFsbEZsb2F0RmllbGROdW1iZXIgPSA5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzU21hbGxGbG9hdDsNCisgICAgcHJpdmF0ZSBmbG9hdCBzbWFsbEZsb2F0XyA9IDEuNUY7DQorICAgIHB1YmxpYyBib29sIEhhc1NtYWxsRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNTbWFsbEZsb2F0OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IFNtYWxsRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBzbWFsbEZsb2F0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE5lZ2F0aXZlT25lRmxvYXRGaWVsZE51bWJlciA9IDEwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzTmVnYXRpdmVPbmVGbG9hdDsNCisgICAgcHJpdmF0ZSBmbG9hdCBuZWdhdGl2ZU9uZUZsb2F0XyA9IC0xRjsNCisgICAgcHVibGljIGJvb2wgSGFzTmVnYXRpdmVPbmVGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc05lZ2F0aXZlT25lRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgTmVnYXRpdmVPbmVGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG5lZ2F0aXZlT25lRmxvYXRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTmVnYXRpdmVGbG9hdEZpZWxkTnVtYmVyID0gMTE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOZWdhdGl2ZUZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IG5lZ2F0aXZlRmxvYXRfID0gLTEuNUY7DQorICAgIHB1YmxpYyBib29sIEhhc05lZ2F0aXZlRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNOZWdhdGl2ZUZsb2F0OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IE5lZ2F0aXZlRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBuZWdhdGl2ZUZsb2F0XzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IExhcmdlRmxvYXRGaWVsZE51bWJlciA9IDEyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzTGFyZ2VGbG9hdDsNCisgICAgcHJpdmF0ZSBmbG9hdCBsYXJnZUZsb2F0XyA9IDJFKzA4RjsNCisgICAgcHVibGljIGJvb2wgSGFzTGFyZ2VGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0xhcmdlRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgTGFyZ2VGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGxhcmdlRmxvYXRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgU21hbGxOZWdhdGl2ZUZsb2F0RmllbGROdW1iZXIgPSAxMzsNCisgICAgcHJpdmF0ZSBib29sIGhhc1NtYWxsTmVnYXRpdmVGbG9hdDsNCisgICAgcHJpdmF0ZSBmbG9hdCBzbWFsbE5lZ2F0aXZlRmxvYXRfID0gLThFLTI4RjsNCisgICAgcHVibGljIGJvb2wgSGFzU21hbGxOZWdhdGl2ZUZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzU21hbGxOZWdhdGl2ZUZsb2F0OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IFNtYWxsTmVnYXRpdmVGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHNtYWxsTmVnYXRpdmVGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBJbmZEb3VibGVGaWVsZE51bWJlciA9IDE0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzSW5mRG91YmxlOw0KKyAgICBwcml2YXRlIGRvdWJsZSBpbmZEb3VibGVfID0gZG91YmxlLlBvc2l0aXZlSW5maW5pdHk7DQorICAgIHB1YmxpYyBib29sIEhhc0luZkRvdWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0luZkRvdWJsZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBkb3VibGUgSW5mRG91YmxlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaW5mRG91YmxlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IE5lZ0luZkRvdWJsZUZpZWxkTnVtYmVyID0gMTU7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOZWdJbmZEb3VibGU7DQorICAgIHByaXZhdGUgZG91YmxlIG5lZ0luZkRvdWJsZV8gPSBkb3VibGUuTmVnYXRpdmVJbmZpbml0eTsNCisgICAgcHVibGljIGJvb2wgSGFzTmVnSW5mRG91YmxlIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzTmVnSW5mRG91YmxlOyB9DQorICAgIH0NCisgICAgcHVibGljIGRvdWJsZSBOZWdJbmZEb3VibGUgew0KKyAgICAgIGdldCB7IHJldHVybiBuZWdJbmZEb3VibGVfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTmFuRG91YmxlRmllbGROdW1iZXIgPSAxNjsNCisgICAgcHJpdmF0ZSBib29sIGhhc05hbkRvdWJsZTsNCisgICAgcHJpdmF0ZSBkb3VibGUgbmFuRG91YmxlXyA9IGRvdWJsZS5OYU47DQorICAgIHB1YmxpYyBib29sIEhhc05hbkRvdWJsZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc05hbkRvdWJsZTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBkb3VibGUgTmFuRG91YmxlIHsNCisgICAgICBnZXQgeyByZXR1cm4gbmFuRG91YmxlXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEluZkZsb2F0RmllbGROdW1iZXIgPSAxNzsNCisgICAgcHJpdmF0ZSBib29sIGhhc0luZkZsb2F0Ow0KKyAgICBwcml2YXRlIGZsb2F0IGluZkZsb2F0XyA9IGZsb2F0LlBvc2l0aXZlSW5maW5pdHk7DQorICAgIHB1YmxpYyBib29sIEhhc0luZkZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzSW5mRmxvYXQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgSW5mRmxvYXQgew0KKyAgICAgIGdldCB7IHJldHVybiBpbmZGbG9hdF87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBOZWdJbmZGbG9hdEZpZWxkTnVtYmVyID0gMTg7DQorICAgIHByaXZhdGUgYm9vbCBoYXNOZWdJbmZGbG9hdDsNCisgICAgcHJpdmF0ZSBmbG9hdCBuZWdJbmZGbG9hdF8gPSBmbG9hdC5OZWdhdGl2ZUluZmluaXR5Ow0KKyAgICBwdWJsaWMgYm9vbCBIYXNOZWdJbmZGbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc05lZ0luZkZsb2F0OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IE5lZ0luZkZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gbmVnSW5mRmxvYXRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgTmFuRmxvYXRGaWVsZE51bWJlciA9IDE5Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzTmFuRmxvYXQ7DQorICAgIHByaXZhdGUgZmxvYXQgbmFuRmxvYXRfID0gZmxvYXQuTmFOOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNOYW5GbG9hdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc05hbkZsb2F0OyB9DQorICAgIH0NCisgICAgcHVibGljIGZsb2F0IE5hbkZsb2F0IHsNCisgICAgICBnZXQgeyByZXR1cm4gbmFuRmxvYXRfOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgQ3BwVHJpZ3JhcGhGaWVsZE51bWJlciA9IDIwOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzQ3BwVHJpZ3JhcGg7DQorICAgIHByaXZhdGUgc3RyaW5nIGNwcFRyaWdyYXBoXyA9ICI/ID8gPz8gPz8gPz8/ID8/LyA/Py0iOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNDcHBUcmlncmFwaCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0NwcFRyaWdyYXBoOyB9DQorICAgIH0NCisgICAgcHVibGljIHN0cmluZyBDcHBUcmlncmFwaCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGNwcFRyaWdyYXBoXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzRXNjYXBlZEJ5dGVzKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCeXRlcygxLCBmaWVsZF9uYW1lc1sxXSwgRXNjYXBlZEJ5dGVzKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0xhcmdlVWludDMyKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50MzIoMiwgZmllbGRfbmFtZXNbNV0sIExhcmdlVWludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0xhcmdlVWludDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50NjQoMywgZmllbGRfbmFtZXNbNl0sIExhcmdlVWludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1NtYWxsSW50MzIpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDQsIGZpZWxkX25hbWVzWzE1XSwgU21hbGxJbnQzMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNTbWFsbEludDY0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NCg1LCBmaWVsZF9uYW1lc1sxNl0sIFNtYWxsSW50NjQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzVXRmOFN0cmluZykgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDYsIGZpZWxkX25hbWVzWzE4XSwgVXRmOFN0cmluZyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNaZXJvRmxvYXQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDcsIGZpZWxkX25hbWVzWzE5XSwgWmVyb0Zsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc09uZUZsb2F0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCg4LCBmaWVsZF9uYW1lc1sxM10sIE9uZUZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1NtYWxsRmxvYXQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDksIGZpZWxkX25hbWVzWzE0XSwgU21hbGxGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNOZWdhdGl2ZU9uZUZsb2F0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgxMCwgZmllbGRfbmFtZXNbMTJdLCBOZWdhdGl2ZU9uZUZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05lZ2F0aXZlRmxvYXQpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KDExLCBmaWVsZF9uYW1lc1sxMV0sIE5lZ2F0aXZlRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTGFyZ2VGbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoMTIsIGZpZWxkX25hbWVzWzRdLCBMYXJnZUZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1NtYWxsTmVnYXRpdmVGbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoMTMsIGZpZWxkX25hbWVzWzE3XSwgU21hbGxOZWdhdGl2ZUZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0luZkRvdWJsZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRG91YmxlKDE0LCBmaWVsZF9uYW1lc1syXSwgSW5mRG91YmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05lZ0luZkRvdWJsZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRG91YmxlKDE1LCBmaWVsZF9uYW1lc1s5XSwgTmVnSW5mRG91YmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05hbkRvdWJsZSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRG91YmxlKDE2LCBmaWVsZF9uYW1lc1s3XSwgTmFuRG91YmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0luZkZsb2F0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgxNywgZmllbGRfbmFtZXNbM10sIEluZkZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05lZ0luZkZsb2F0KSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdCgxOCwgZmllbGRfbmFtZXNbMTBdLCBOZWdJbmZGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNOYW5GbG9hdCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoMTksIGZpZWxkX25hbWVzWzhdLCBOYW5GbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNDcHBUcmlncmFwaCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDIwLCBmaWVsZF9uYW1lc1swXSwgQ3BwVHJpZ3JhcGgpOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc0VzY2FwZWRCeXRlcykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJ5dGVzU2l6ZSgxLCBFc2NhcGVkQnl0ZXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTGFyZ2VVaW50MzIpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50MzJTaXplKDIsIExhcmdlVWludDMyKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0xhcmdlVWludDY0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDY0U2l6ZSgzLCBMYXJnZVVpbnQ2NCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNTbWFsbEludDMyKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKDQsIFNtYWxsSW50MzIpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU21hbGxJbnQ2NCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZSg1LCBTbWFsbEludDY0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1V0ZjhTdHJpbmcpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDYsIFV0ZjhTdHJpbmcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzWmVyb0Zsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDcsIFplcm9GbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNPbmVGbG9hdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSg4LCBPbmVGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNTbWFsbEZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDksIFNtYWxsRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzTmVnYXRpdmVPbmVGbG9hdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSgxMCwgTmVnYXRpdmVPbmVGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNOZWdhdGl2ZUZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDExLCBOZWdhdGl2ZUZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc0xhcmdlRmxvYXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoMTIsIExhcmdlRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzU21hbGxOZWdhdGl2ZUZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDEzLCBTbWFsbE5lZ2F0aXZlRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSW5mRG91YmxlKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRG91YmxlU2l6ZSgxNCwgSW5mRG91YmxlKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05lZ0luZkRvdWJsZSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZURvdWJsZVNpemUoMTUsIE5lZ0luZkRvdWJsZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNOYW5Eb3VibGUpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVEb3VibGVTaXplKDE2LCBOYW5Eb3VibGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzSW5mRmxvYXQpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGbG9hdFNpemUoMTcsIEluZkZsb2F0KTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc05lZ0luZkZsb2F0KSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRmxvYXRTaXplKDE4LCBOZWdJbmZGbG9hdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNOYW5GbG9hdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSgxOSwgTmFuRmxvYXQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzQ3BwVHJpZ3JhcGgpIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKDIwLCBDcHBUcmlncmFwaCk7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNFc2NhcGVkQnl0ZXMpIHsNCisgICAgICAgICAgRXNjYXBlZEJ5dGVzID0gb3RoZXIuRXNjYXBlZEJ5dGVzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0xhcmdlVWludDMyKSB7DQorICAgICAgICAgIExhcmdlVWludDMyID0gb3RoZXIuTGFyZ2VVaW50MzI7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzTGFyZ2VVaW50NjQpIHsNCisgICAgICAgICAgTGFyZ2VVaW50NjQgPSBvdGhlci5MYXJnZVVpbnQ2NDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNTbWFsbEludDMyKSB7DQorICAgICAgICAgIFNtYWxsSW50MzIgPSBvdGhlci5TbWFsbEludDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc1NtYWxsSW50NjQpIHsNCisgICAgICAgICAgU21hbGxJbnQ2NCA9IG90aGVyLlNtYWxsSW50NjQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzVXRmOFN0cmluZykgew0KKyAgICAgICAgICBVdGY4U3RyaW5nID0gb3RoZXIuVXRmOFN0cmluZzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNaZXJvRmxvYXQpIHsNCisgICAgICAgICAgWmVyb0Zsb2F0ID0gb3RoZXIuWmVyb0Zsb2F0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc09uZUZsb2F0KSB7DQorICAgICAgICAgIE9uZUZsb2F0ID0gb3RoZXIuT25lRmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzU21hbGxGbG9hdCkgew0KKyAgICAgICAgICBTbWFsbEZsb2F0ID0gb3RoZXIuU21hbGxGbG9hdDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNOZWdhdGl2ZU9uZUZsb2F0KSB7DQorICAgICAgICAgIE5lZ2F0aXZlT25lRmxvYXQgPSBvdGhlci5OZWdhdGl2ZU9uZUZsb2F0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc05lZ2F0aXZlRmxvYXQpIHsNCisgICAgICAgICAgTmVnYXRpdmVGbG9hdCA9IG90aGVyLk5lZ2F0aXZlRmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzTGFyZ2VGbG9hdCkgew0KKyAgICAgICAgICBMYXJnZUZsb2F0ID0gb3RoZXIuTGFyZ2VGbG9hdDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNTbWFsbE5lZ2F0aXZlRmxvYXQpIHsNCisgICAgICAgICAgU21hbGxOZWdhdGl2ZUZsb2F0ID0gb3RoZXIuU21hbGxOZWdhdGl2ZUZsb2F0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0luZkRvdWJsZSkgew0KKyAgICAgICAgICBJbmZEb3VibGUgPSBvdGhlci5JbmZEb3VibGU7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzTmVnSW5mRG91YmxlKSB7DQorICAgICAgICAgIE5lZ0luZkRvdWJsZSA9IG90aGVyLk5lZ0luZkRvdWJsZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNOYW5Eb3VibGUpIHsNCisgICAgICAgICAgTmFuRG91YmxlID0gb3RoZXIuTmFuRG91YmxlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0luZkZsb2F0KSB7DQorICAgICAgICAgIEluZkZsb2F0ID0gb3RoZXIuSW5mRmxvYXQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzTmVnSW5mRmxvYXQpIHsNCisgICAgICAgICAgTmVnSW5mRmxvYXQgPSBvdGhlci5OZWdJbmZGbG9hdDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNOYW5GbG9hdCkgew0KKyAgICAgICAgICBOYW5GbG9hdCA9IG90aGVyLk5hbkZsb2F0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0NwcFRyaWdyYXBoKSB7DQorICAgICAgICAgIENwcFRyaWdyYXBoID0gb3RoZXIuQ3BwVHJpZ3JhcGg7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRXNjYXBlZEJ5dGVzID0gaW5wdXQuUmVhZEJ5dGVzKHJlZiByZXN1bHQuZXNjYXBlZEJ5dGVzXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0xhcmdlVWludDMyID0gaW5wdXQuUmVhZFVJbnQzMihyZWYgcmVzdWx0LmxhcmdlVWludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAyNDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0xhcmdlVWludDY0ID0gaW5wdXQuUmVhZFVJbnQ2NChyZWYgcmVzdWx0LmxhcmdlVWludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzMjogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1NtYWxsSW50MzIgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5zbWFsbEludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA0MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1NtYWxsSW50NjQgPSBpbnB1dC5SZWFkSW50NjQocmVmIHJlc3VsdC5zbWFsbEludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA1MDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1V0ZjhTdHJpbmcgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQudXRmOFN0cmluZ18pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNjE6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNaZXJvRmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC56ZXJvRmxvYXRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDY5OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzT25lRmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5vbmVGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzc6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNTbWFsbEZsb2F0ID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQuc21hbGxGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODU6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOZWdhdGl2ZU9uZUZsb2F0ID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQubmVnYXRpdmVPbmVGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgOTM6IHsNCisgICAgICAgICAgICAgIHJlc3VsdC5oYXNOZWdhdGl2ZUZsb2F0ID0gaW5wdXQuUmVhZEZsb2F0KHJlZiByZXN1bHQubmVnYXRpdmVGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTAxOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTGFyZ2VGbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0LmxhcmdlRmxvYXRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOTogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc1NtYWxsTmVnYXRpdmVGbG9hdCA9IGlucHV0LlJlYWRGbG9hdChyZWYgcmVzdWx0LnNtYWxsTmVnYXRpdmVGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTEzOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzSW5mRG91YmxlID0gaW5wdXQuUmVhZERvdWJsZShyZWYgcmVzdWx0LmluZkRvdWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTIxOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTmVnSW5mRG91YmxlID0gaW5wdXQuUmVhZERvdWJsZShyZWYgcmVzdWx0Lm5lZ0luZkRvdWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTI5OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTmFuRG91YmxlID0gaW5wdXQuUmVhZERvdWJsZShyZWYgcmVzdWx0Lm5hbkRvdWJsZV8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTQxOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzSW5mRmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5pbmZGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTQ5OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTmVnSW5mRmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5uZWdJbmZGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTU3OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzTmFuRmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQocmVmIHJlc3VsdC5uYW5GbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTYyOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzQ3BwVHJpZ3JhcGggPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQuY3BwVHJpZ3JhcGhfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNFc2NhcGVkQnl0ZXMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNFc2NhcGVkQnl0ZXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIEVzY2FwZWRCeXRlcyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkVzY2FwZWRCeXRlczsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RXNjYXBlZEJ5dGVzKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRFc2NhcGVkQnl0ZXMocGI6OkJ5dGVTdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0VzY2FwZWRCeXRlcyA9IHRydWU7DQorICAgICAgICByZXN1bHQuZXNjYXBlZEJ5dGVzXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRXNjYXBlZEJ5dGVzKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNFc2NhcGVkQnl0ZXMgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5lc2NhcGVkQnl0ZXNfID0gKHBiOjpCeXRlU3RyaW5nKSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuRGVzY3JpcHRvci5GaWVsZHNbMF0uRGVmYXVsdFZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0xhcmdlVWludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTGFyZ2VVaW50MzI7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgTGFyZ2VVaW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5MYXJnZVVpbnQzMjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TGFyZ2VVaW50MzIodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldExhcmdlVWludDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTGFyZ2VVaW50MzIgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmxhcmdlVWludDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTGFyZ2VVaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0xhcmdlVWludDMyID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubGFyZ2VVaW50MzJfID0gNDI5NDk2NzI5NTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNMYXJnZVVpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0xhcmdlVWludDY0OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBMYXJnZVVpbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkxhcmdlVWludDY0OyB9DQorICAgICAgICBzZXQgeyBTZXRMYXJnZVVpbnQ2NCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TGFyZ2VVaW50NjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTGFyZ2VVaW50NjQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmxhcmdlVWludDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTGFyZ2VVaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0xhcmdlVWludDY0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubGFyZ2VVaW50NjRfID0gMTg0NDY3NDQwNzM3MDk1NTE2MTVVTDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNTbWFsbEludDMyIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzU21hbGxJbnQzMjsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFNtYWxsSW50MzIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5TbWFsbEludDMyOyB9DQorICAgICAgICBzZXQgeyBTZXRTbWFsbEludDMyKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRTbWFsbEludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTbWFsbEludDMyID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5zbWFsbEludDMyXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyU21hbGxJbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU21hbGxJbnQzMiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnNtYWxsSW50MzJfID0gLTIxNDc0ODM2NDc7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzU21hbGxJbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1NtYWxsSW50NjQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgU21hbGxJbnQ2NCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlNtYWxsSW50NjQ7IH0NCisgICAgICAgIHNldCB7IFNldFNtYWxsSW50NjQodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFNtYWxsSW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTbWFsbEludDY0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5zbWFsbEludDY0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyU21hbGxJbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU21hbGxJbnQ2NCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnNtYWxsSW50NjRfID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDdMOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1V0ZjhTdHJpbmcgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNVdGY4U3RyaW5nOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgVXRmOFN0cmluZyB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlV0ZjhTdHJpbmc7IH0NCisgICAgICAgIHNldCB7IFNldFV0ZjhTdHJpbmcodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFV0ZjhTdHJpbmcoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNVdGY4U3RyaW5nID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC51dGY4U3RyaW5nXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVXRmOFN0cmluZygpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzVXRmOFN0cmluZyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnV0ZjhTdHJpbmdfID0gKHN0cmluZykgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzLkRlc2NyaXB0b3IuRmllbGRzWzVdLkRlZmF1bHRWYWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNaZXJvRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNaZXJvRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IFplcm9GbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Llplcm9GbG9hdDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0WmVyb0Zsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRaZXJvRmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzWmVyb0Zsb2F0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC56ZXJvRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJaZXJvRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1plcm9GbG9hdCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lnplcm9GbG9hdF8gPSAwRjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNPbmVGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc09uZUZsb2F0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBPbmVGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk9uZUZsb2F0OyB9DQorICAgICAgICBzZXQgeyBTZXRPbmVGbG9hdCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0T25lRmxvYXQoZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzT25lRmxvYXQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm9uZUZsb2F0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyT25lRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc09uZUZsb2F0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQub25lRmxvYXRfID0gMUY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzU21hbGxGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1NtYWxsRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IFNtYWxsRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5TbWFsbEZsb2F0OyB9DQorICAgICAgICBzZXQgeyBTZXRTbWFsbEZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRTbWFsbEZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1NtYWxsRmxvYXQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnNtYWxsRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTbWFsbEZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTbWFsbEZsb2F0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuc21hbGxGbG9hdF8gPSAxLjVGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc05lZ2F0aXZlT25lRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOZWdhdGl2ZU9uZUZsb2F0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBOZWdhdGl2ZU9uZUZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmVnYXRpdmVPbmVGbG9hdDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TmVnYXRpdmVPbmVGbG9hdCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TmVnYXRpdmVPbmVGbG9hdChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOZWdhdGl2ZU9uZUZsb2F0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5uZWdhdGl2ZU9uZUZsb2F0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTmVnYXRpdmVPbmVGbG9hdCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmVnYXRpdmVPbmVGbG9hdCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5lZ2F0aXZlT25lRmxvYXRfID0gLTFGOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc05lZ2F0aXZlRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOZWdhdGl2ZUZsb2F0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBOZWdhdGl2ZUZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmVnYXRpdmVGbG9hdDsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TmVnYXRpdmVGbG9hdCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TmVnYXRpdmVGbG9hdChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOZWdhdGl2ZUZsb2F0ID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5uZWdhdGl2ZUZsb2F0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTmVnYXRpdmVGbG9hdCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmVnYXRpdmVGbG9hdCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5lZ2F0aXZlRmxvYXRfID0gLTEuNUY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTGFyZ2VGbG9hdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0xhcmdlRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IExhcmdlRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5MYXJnZUZsb2F0OyB9DQorICAgICAgICBzZXQgeyBTZXRMYXJnZUZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRMYXJnZUZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0xhcmdlRmxvYXQgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmxhcmdlRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJMYXJnZUZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNMYXJnZUZsb2F0ID0gZmFsc2U7DQorICAgICAgICByZXN1bHQubGFyZ2VGbG9hdF8gPSAyRSswOEY7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzU21hbGxOZWdhdGl2ZUZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzU21hbGxOZWdhdGl2ZUZsb2F0OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBTbWFsbE5lZ2F0aXZlRmxvYXQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5TbWFsbE5lZ2F0aXZlRmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldFNtYWxsTmVnYXRpdmVGbG9hdCh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0U21hbGxOZWdhdGl2ZUZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1NtYWxsTmVnYXRpdmVGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQuc21hbGxOZWdhdGl2ZUZsb2F0XyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyU21hbGxOZWdhdGl2ZUZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNTbWFsbE5lZ2F0aXZlRmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5zbWFsbE5lZ2F0aXZlRmxvYXRfID0gLThFLTI4RjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNJbmZEb3VibGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNJbmZEb3VibGU7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGRvdWJsZSBJbmZEb3VibGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5JbmZEb3VibGU7IH0NCisgICAgICAgIHNldCB7IFNldEluZkRvdWJsZSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0SW5mRG91YmxlKGRvdWJsZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJbmZEb3VibGUgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmluZkRvdWJsZV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckluZkRvdWJsZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSW5mRG91YmxlID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuaW5mRG91YmxlXyA9IGRvdWJsZS5Qb3NpdGl2ZUluZmluaXR5Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc05lZ0luZkRvdWJsZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc05lZ0luZkRvdWJsZTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZG91YmxlIE5lZ0luZkRvdWJsZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk5lZ0luZkRvdWJsZTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TmVnSW5mRG91YmxlKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROZWdJbmZEb3VibGUoZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05lZ0luZkRvdWJsZSA9IHRydWU7DQorICAgICAgICByZXN1bHQubmVnSW5mRG91YmxlXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTmVnSW5mRG91YmxlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOZWdJbmZEb3VibGUgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5uZWdJbmZEb3VibGVfID0gZG91YmxlLk5lZ2F0aXZlSW5maW5pdHk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzTmFuRG91YmxlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTmFuRG91YmxlOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBkb3VibGUgTmFuRG91YmxlIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmFuRG91YmxlOyB9DQorICAgICAgICBzZXQgeyBTZXROYW5Eb3VibGUodmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5hbkRvdWJsZShkb3VibGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmFuRG91YmxlID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5uYW5Eb3VibGVfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOYW5Eb3VibGUoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc05hbkRvdWJsZSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm5hbkRvdWJsZV8gPSBkb3VibGUuTmFOOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0luZkZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzSW5mRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEluZkZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSW5mRmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldEluZkZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRJbmZGbG9hdChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNJbmZGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQuaW5mRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJJbmZGbG9hdCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzSW5mRmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5pbmZGbG9hdF8gPSBmbG9hdC5Qb3NpdGl2ZUluZmluaXR5Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc05lZ0luZkZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTmVnSW5mRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IE5lZ0luZkZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmVnSW5mRmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldE5lZ0luZkZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROZWdJbmZGbG9hdChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOZWdJbmZGbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQubmVnSW5mRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOZWdJbmZGbG9hdCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmVnSW5mRmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5uZWdJbmZGbG9hdF8gPSBmbG9hdC5OZWdhdGl2ZUluZmluaXR5Ow0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc05hbkZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzTmFuRmxvYXQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IE5hbkZsb2F0IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTmFuRmxvYXQ7IH0NCisgICAgICAgIHNldCB7IFNldE5hbkZsb2F0KHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXROYW5GbG9hdChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNOYW5GbG9hdCA9IHRydWU7DQorICAgICAgICByZXN1bHQubmFuRmxvYXRfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJOYW5GbG9hdCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTmFuRmxvYXQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5uYW5GbG9hdF8gPSBmbG9hdC5OYU47DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzQ3BwVHJpZ3JhcGggew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNDcHBUcmlncmFwaDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIENwcFRyaWdyYXBoIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQ3BwVHJpZ3JhcGg7IH0NCisgICAgICAgIHNldCB7IFNldENwcFRyaWdyYXBoKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRDcHBUcmlncmFwaChzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0NwcFRyaWdyYXBoID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5jcHBUcmlncmFwaF8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckNwcFRyaWdyYXBoKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNDcHBUcmlncmFwaCA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmNwcFRyaWdyYXBoXyA9ICI/ID8gPz8gPz8gPz8/ID8/LyA/Py0iOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFNwYXJzZUVudW1NZXNzYWdlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8U3BhcnNlRW51bU1lc3NhZ2UsIFNwYXJzZUVudW1NZXNzYWdlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBTcGFyc2VFbnVtTWVzc2FnZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTcGFyc2VFbnVtTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgU3BhcnNlRW51bU1lc3NhZ2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3NwYXJzZUVudW1NZXNzYWdlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJzcGFyc2VfZW51bSIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9zcGFyc2VFbnVtTWVzc2FnZUZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgU3BhcnNlRW51bU1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBTcGFyc2VFbnVtTWVzc2FnZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBTcGFyc2VFbnVtTWVzc2FnZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1NwYXJzZUVudW1NZXNzYWdlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPFNwYXJzZUVudW1NZXNzYWdlLCBTcGFyc2VFbnVtTWVzc2FnZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9TcGFyc2VFbnVtTWVzc2FnZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgU3BhcnNlRW51bUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBib29sIGhhc1NwYXJzZUVudW07DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFNwYXJzZUVudW0gc3BhcnNlRW51bV8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0U3BhcnNlRW51bS5TUEFSU0VfQTsNCisgICAgcHVibGljIGJvb2wgSGFzU3BhcnNlRW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc1NwYXJzZUVudW07IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFNwYXJzZUVudW0gU3BhcnNlRW51bSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHNwYXJzZUVudW1fOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9zcGFyc2VFbnVtTWVzc2FnZUZpZWxkTmFtZXM7DQorICAgICAgaWYgKGhhc1NwYXJzZUVudW0pIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUVudW0oMSwgZmllbGRfbmFtZXNbMF0sIChpbnQpIFNwYXJzZUVudW0sIFNwYXJzZUVudW0pOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgaWYgKGhhc1NwYXJzZUVudW0pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgxLCAoaW50KSBTcGFyc2VFbnVtKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BhcnNlRW51bU1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BhcnNlRW51bU1lc3NhZ2UgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU3BhcnNlRW51bU1lc3NhZ2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNwYXJzZUVudW1NZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBTcGFyc2VFbnVtTWVzc2FnZSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihTcGFyc2VFbnVtTWVzc2FnZSBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxTcGFyc2VFbnVtTWVzc2FnZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoU3BhcnNlRW51bU1lc3NhZ2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBTcGFyc2VFbnVtTWVzc2FnZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBTcGFyc2VFbnVtTWVzc2FnZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFNwYXJzZUVudW1NZXNzYWdlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgU3BhcnNlRW51bU1lc3NhZ2UoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNwYXJzZUVudW1NZXNzYWdlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BhcnNlRW51bU1lc3NhZ2UuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3BhcnNlRW51bU1lc3NhZ2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU3BhcnNlRW51bU1lc3NhZ2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTcGFyc2VFbnVtTWVzc2FnZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgU3BhcnNlRW51bU1lc3NhZ2UpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoU3BhcnNlRW51bU1lc3NhZ2UpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShTcGFyc2VFbnVtTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNwYXJzZUVudW1NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc1NwYXJzZUVudW0pIHsNCisgICAgICAgICAgU3BhcnNlRW51bSA9IG90aGVyLlNwYXJzZUVudW07DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9zcGFyc2VFbnVtTWVzc2FnZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9zcGFyc2VFbnVtTWVzc2FnZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4OiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQuc3BhcnNlRW51bV8sIG91dCB1bmtub3duKSkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQuaGFzU3BhcnNlRW51bSA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoMSwgKHVsb25nKShpbnQpdW5rbm93bik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzU3BhcnNlRW51bSB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzU3BhcnNlRW51bTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFNwYXJzZUVudW0gU3BhcnNlRW51bSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlNwYXJzZUVudW07IH0NCisgICAgICAgIHNldCB7IFNldFNwYXJzZUVudW0odmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFNwYXJzZUVudW0oZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFNwYXJzZUVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU3BhcnNlRW51bSA9IHRydWU7DQorICAgICAgICByZXN1bHQuc3BhcnNlRW51bV8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclNwYXJzZUVudW0oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1NwYXJzZUVudW0gPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdC5zcGFyc2VFbnVtXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RTcGFyc2VFbnVtLlNQQVJTRV9BOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBTcGFyc2VFbnVtTWVzc2FnZSgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgT25lU3RyaW5nIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8T25lU3RyaW5nLCBPbmVTdHJpbmcuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIE9uZVN0cmluZygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPbmVTdHJpbmcgZGVmYXVsdEluc3RhbmNlID0gbmV3IE9uZVN0cmluZygpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfb25lU3RyaW5nRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJkYXRhIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX29uZVN0cmluZ0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIE9uZVN0cmluZyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIE9uZVN0cmluZyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBPbmVTdHJpbmcgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVTdHJpbmdfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8T25lU3RyaW5nLCBPbmVTdHJpbmcuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT25lU3RyaW5nX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBEYXRhRmllbGROdW1iZXIgPSAxOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRGF0YTsNCisgICAgcHJpdmF0ZSBzdHJpbmcgZGF0YV8gPSAiIjsNCisgICAgcHVibGljIGJvb2wgSGFzRGF0YSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0RhdGE7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIERhdGEgew0KKyAgICAgIGdldCB7IHJldHVybiBkYXRhXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfb25lU3RyaW5nRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzRGF0YSkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzBdLCBEYXRhKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNEYXRhKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxLCBEYXRhKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lU3RyaW5nIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZVN0cmluZyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVTdHJpbmcgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZVN0cmluZyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lU3RyaW5nIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZVN0cmluZyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVTdHJpbmcgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lU3RyaW5nIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZVN0cmluZyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVTdHJpbmcgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgT25lU3RyaW5nIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKE9uZVN0cmluZyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxPbmVTdHJpbmcsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKE9uZVN0cmluZyBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIE9uZVN0cmluZyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBPbmVTdHJpbmcgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBPbmVTdHJpbmcgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBPbmVTdHJpbmcoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE9uZVN0cmluZyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9uZVN0cmluZy5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBPbmVTdHJpbmcgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lU3RyaW5nLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgT25lU3RyaW5nIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBPbmVTdHJpbmcpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoT25lU3RyaW5nKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oT25lU3RyaW5nIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lU3RyaW5nLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RhdGEpIHsNCisgICAgICAgICAgRGF0YSA9IG90aGVyLkRhdGE7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9vbmVTdHJpbmdGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfb25lU3RyaW5nRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzRGF0YSA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC5kYXRhXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGF0YSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RhdGE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBEYXRhIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuRGF0YTsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RGF0YSh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0RGF0YShzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0RhdGEgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmRhdGFfID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJEYXRhKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEYXRhID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZGF0YV8gPSAiIjsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgT25lU3RyaW5nKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBPbmVCeXRlcyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPE9uZUJ5dGVzLCBPbmVCeXRlcy5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgT25lQnl0ZXMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgT25lQnl0ZXMgZGVmYXVsdEluc3RhbmNlID0gbmV3IE9uZUJ5dGVzKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9vbmVCeXRlc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiZGF0YSIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9vbmVCeXRlc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxMCB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIE9uZUJ5dGVzIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgT25lQnl0ZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgT25lQnl0ZXMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9PbmVCeXRlc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxPbmVCeXRlcywgT25lQnl0ZXMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfT25lQnl0ZXNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IERhdGFGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNEYXRhOw0KKyAgICBwcml2YXRlIHBiOjpCeXRlU3RyaW5nIGRhdGFfID0gcGI6OkJ5dGVTdHJpbmcuRW1wdHk7DQorICAgIHB1YmxpYyBib29sIEhhc0RhdGEgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNEYXRhOyB9DQorICAgIH0NCisgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIERhdGEgew0KKyAgICAgIGdldCB7IHJldHVybiBkYXRhXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfb25lQnl0ZXNGaWVsZE5hbWVzOw0KKyAgICAgIGlmIChoYXNEYXRhKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVCeXRlcygxLCBmaWVsZF9uYW1lc1swXSwgRGF0YSk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBpZiAoaGFzRGF0YSkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJ5dGVzU2l6ZSgxLCBEYXRhKTsNCisgICAgICB9DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lQnl0ZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lQnl0ZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgT25lQnl0ZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIE9uZUJ5dGVzIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVCeXRlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVCeXRlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVCeXRlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVCeXRlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVCeXRlcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBPbmVCeXRlcyBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBPbmVCeXRlcyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihPbmVCeXRlcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxPbmVCeXRlcywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoT25lQnl0ZXMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBPbmVCeXRlcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBPbmVCeXRlcyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIE9uZUJ5dGVzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgT25lQnl0ZXMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIE9uZUJ5dGVzIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lQnl0ZXMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgT25lQnl0ZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuT25lQnl0ZXMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBPbmVCeXRlcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgT25lQnl0ZXMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoT25lQnl0ZXMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShPbmVCeXRlcyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLk9uZUJ5dGVzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLkhhc0RhdGEpIHsNCisgICAgICAgICAgRGF0YSA9IG90aGVyLkRhdGE7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9vbmVCeXRlc0ZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9vbmVCeXRlc0ZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgcmVzdWx0Lmhhc0RhdGEgPSBpbnB1dC5SZWFkQnl0ZXMocmVmIHJlc3VsdC5kYXRhXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIGJvb2wgSGFzRGF0YSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0RhdGE7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIERhdGEgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EYXRhOyB9DQorICAgICAgICBzZXQgeyBTZXREYXRhKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREYXRhKHBiOjpCeXRlU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNEYXRhID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5kYXRhXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRGF0YSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRGF0YSA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LmRhdGFfID0gcGI6OkJ5dGVTdHJpbmcuRW1wdHk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIE9uZUJ5dGVzKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0UGFja2VkVHlwZXMgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxUZXN0UGFja2VkVHlwZXMsIFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgVGVzdFBhY2tlZFR5cGVzKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRlc3RQYWNrZWRUeXBlcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFBhY2tlZFR5cGVzKCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF90ZXN0UGFja2VkVHlwZXNGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInBhY2tlZF9ib29sIiwgInBhY2tlZF9kb3VibGUiLCAicGFja2VkX2VudW0iLCAicGFja2VkX2ZpeGVkMzIiLCAicGFja2VkX2ZpeGVkNjQiLCAicGFja2VkX2Zsb2F0IiwgInBhY2tlZF9pbnQzMiIsICJwYWNrZWRfaW50NjQiLCAicGFja2VkX3NmaXhlZDMyIiwgInBhY2tlZF9zZml4ZWQ2NCIsICJwYWNrZWRfc2ludDMyIiwgInBhY2tlZF9zaW50NjQiLCAicGFja2VkX3VpbnQzMiIsICJwYWNrZWRfdWludDY0IiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RQYWNrZWRUeXBlc0ZpZWxkVGFncyA9IG5ldyB1aW50W10geyA4MTgsIDgxMCwgODI2LCA3NzAsIDc3OCwgODAyLCA3MjIsIDczMCwgNzg2LCA3OTQsIDc1NCwgNzYyLCA3MzgsIDc0NiB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlcyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RQYWNrZWRUeXBlcyBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UGFja2VkVHlwZXMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkVHlwZXNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdFBhY2tlZFR5cGVzLCBUZXN0UGFja2VkVHlwZXMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFBhY2tlZFR5cGVzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRJbnQzMkZpZWxkTnVtYmVyID0gOTA7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZEludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IHBhY2tlZEludDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gUGFja2VkSW50MzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZEludDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZEludDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRJbnQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFBhY2tlZEludDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRJbnQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEludDY0RmllbGROdW1iZXIgPSA5MTsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkSW50NjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+IHBhY2tlZEludDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBQYWNrZWRJbnQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkSW50NjRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkSW50NjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZEludDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEdldFBhY2tlZEludDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRJbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFVpbnQzMkZpZWxkTnVtYmVyID0gOTI7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZFVpbnQzMk1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4gcGFja2VkVWludDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWludD4gUGFja2VkVWludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRVaW50MzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkVWludDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRVaW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IEdldFBhY2tlZFVpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkVWludDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkVWludDY0RmllbGROdW1iZXIgPSA5MzsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkVWludDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4gcGFja2VkVWludDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVsb25nPiBQYWNrZWRVaW50NjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZFVpbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRVaW50NjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZFVpbnQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIEdldFBhY2tlZFVpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkVWludDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkU2ludDMyRmllbGROdW1iZXIgPSA5NDsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkU2ludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IHBhY2tlZFNpbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFBhY2tlZFNpbnQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkU2ludDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZFNpbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkU2ludDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgR2V0UGFja2VkU2ludDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRTaW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTaW50NjRGaWVsZE51bWJlciA9IDk1Ow0KKyAgICBwcml2YXRlIGludCBwYWNrZWRTaW50NjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+IHBhY2tlZFNpbnQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gUGFja2VkU2ludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRTaW50NjRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkU2ludDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRTaW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0UGFja2VkU2ludDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRTaW50NjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRGaXhlZDMyRmllbGROdW1iZXIgPSA5NjsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkRml4ZWQzMk1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4gcGFja2VkRml4ZWQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVpbnQ+IFBhY2tlZEZpeGVkMzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZEZpeGVkMzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkRml4ZWQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkRml4ZWQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgR2V0UGFja2VkRml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkRml4ZWQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEZpeGVkNjRGaWVsZE51bWJlciA9IDk3Ow0KKyAgICBwcml2YXRlIGludCBwYWNrZWRGaXhlZDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4gcGFja2VkRml4ZWQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1bG9uZz4gUGFja2VkRml4ZWQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkRml4ZWQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRGaXhlZDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRGaXhlZDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgR2V0UGFja2VkRml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkRml4ZWQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFNmaXhlZDMyRmllbGROdW1iZXIgPSA5ODsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkU2ZpeGVkMzJNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gcGFja2VkU2ZpeGVkMzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBQYWNrZWRTZml4ZWQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkU2ZpeGVkMzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkU2ZpeGVkMzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZFNmaXhlZDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgR2V0UGFja2VkU2ZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZFNmaXhlZDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkU2ZpeGVkNjRGaWVsZE51bWJlciA9IDk5Ow0KKyAgICBwcml2YXRlIGludCBwYWNrZWRTZml4ZWQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gcGFja2VkU2ZpeGVkNjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGxvbmc+IFBhY2tlZFNmaXhlZDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRTZml4ZWQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBQYWNrZWRTZml4ZWQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkU2ZpeGVkNjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGxvbmcgR2V0UGFja2VkU2ZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZFNmaXhlZDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRmxvYXRGaWVsZE51bWJlciA9IDEwMDsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkRmxvYXRNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGZsb2F0PiBwYWNrZWRGbG9hdF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8ZmxvYXQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGZsb2F0PiBQYWNrZWRGbG9hdExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkRmxvYXRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkRmxvYXRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZEZsb2F0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBHZXRQYWNrZWRGbG9hdChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcGFja2VkRmxvYXRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWREb3VibGVGaWVsZE51bWJlciA9IDEwMTsNCisgICAgcHJpdmF0ZSBpbnQgcGFja2VkRG91YmxlTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxkb3VibGU+IHBhY2tlZERvdWJsZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8ZG91YmxlPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxkb3VibGU+IFBhY2tlZERvdWJsZUxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocGFja2VkRG91YmxlXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZERvdWJsZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkRG91YmxlXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBkb3VibGUgR2V0UGFja2VkRG91YmxlKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWREb3VibGVfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRCb29sRmllbGROdW1iZXIgPSAxMDI7DQorICAgIHByaXZhdGUgaW50IHBhY2tlZEJvb2xNZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGJvb2w+IHBhY2tlZEJvb2xfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGJvb2w+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGJvb2w+IFBhY2tlZEJvb2xMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHBhY2tlZEJvb2xfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkQm9vbENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGFja2VkQm9vbF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbCBHZXRQYWNrZWRCb29sKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBwYWNrZWRCb29sX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRW51bUZpZWxkTnVtYmVyID0gMTAzOw0KKyAgICBwcml2YXRlIGludCBwYWNrZWRFbnVtTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gcGFja2VkRW51bV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiBQYWNrZWRFbnVtTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRFbnVtXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFBhY2tlZEVudW1Db3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZEVudW1fLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEdldFBhY2tlZEVudW0oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZEVudW1fW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RQYWNrZWRUeXBlc0ZpZWxkTmFtZXM7DQorICAgICAgaWYgKHBhY2tlZEludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZEludDMyQXJyYXkoOTAsIGZpZWxkX25hbWVzWzZdLCBwYWNrZWRJbnQzMk1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZEludDMyXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRJbnQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRJbnQ2NEFycmF5KDkxLCBmaWVsZF9uYW1lc1s3XSwgcGFja2VkSW50NjRNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRJbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkVWludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZFVJbnQzMkFycmF5KDkyLCBmaWVsZF9uYW1lc1sxMl0sIHBhY2tlZFVpbnQzMk1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZFVpbnQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkVWludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZFVJbnQ2NEFycmF5KDkzLCBmaWVsZF9uYW1lc1sxM10sIHBhY2tlZFVpbnQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZFVpbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkU2ludDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZFNJbnQzMkFycmF5KDk0LCBmaWVsZF9uYW1lc1sxMF0sIHBhY2tlZFNpbnQzMk1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZFNpbnQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkU2ludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZFNJbnQ2NEFycmF5KDk1LCBmaWVsZF9uYW1lc1sxMV0sIHBhY2tlZFNpbnQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZFNpbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkRml4ZWQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRGaXhlZDMyQXJyYXkoOTYsIGZpZWxkX25hbWVzWzNdLCBwYWNrZWRGaXhlZDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkRml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkRml4ZWQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRGaXhlZDY0QXJyYXkoOTcsIGZpZWxkX25hbWVzWzRdLCBwYWNrZWRGaXhlZDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkRml4ZWQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkU2ZpeGVkMzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkU0ZpeGVkMzJBcnJheSg5OCwgZmllbGRfbmFtZXNbOF0sIHBhY2tlZFNmaXhlZDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkU2ZpeGVkMzJfKTsNCisgICAgICB9DQorICAgICAgaWYgKHBhY2tlZFNmaXhlZDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZFNGaXhlZDY0QXJyYXkoOTksIGZpZWxkX25hbWVzWzldLCBwYWNrZWRTZml4ZWQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemUsIHBhY2tlZFNmaXhlZDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRGbG9hdF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWRGbG9hdEFycmF5KDEwMCwgZmllbGRfbmFtZXNbNV0sIHBhY2tlZEZsb2F0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkRmxvYXRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHBhY2tlZERvdWJsZV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVQYWNrZWREb3VibGVBcnJheSgxMDEsIGZpZWxkX25hbWVzWzFdLCBwYWNrZWREb3VibGVNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWREb3VibGVfKTsNCisgICAgICB9DQorICAgICAgaWYgKHBhY2tlZEJvb2xfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlUGFja2VkQm9vbEFycmF5KDEwMiwgZmllbGRfbmFtZXNbMF0sIHBhY2tlZEJvb2xNZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRCb29sXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwYWNrZWRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZEVudW1BcnJheSgxMDMsIGZpZWxkX25hbWVzWzJdLCBwYWNrZWRFbnVtTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSwgcGFja2VkRW51bV8pOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIFBhY2tlZEludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRJbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZEludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAobG9uZyBlbGVtZW50IGluIFBhY2tlZEludDY0TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRJbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZEludDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAodWludCBlbGVtZW50IGluIFBhY2tlZFVpbnQzMkxpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50MzJTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZFVpbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZFVpbnQzMk1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHVsb25nIGVsZW1lbnQgaW4gUGFja2VkVWludDY0TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQ2NFNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkVWludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkVWludDY0TWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoaW50IGVsZW1lbnQgaW4gUGFja2VkU2ludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkU2ludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkU2ludDMyTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAobG9uZyBlbGVtZW50IGluIFBhY2tlZFNpbnQ2NExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50NjRTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZFNpbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZFNpbnQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHBhY2tlZEZpeGVkMzJfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRGaXhlZDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkRml4ZWQzMk1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHBhY2tlZEZpeGVkNjRfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRGaXhlZDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkRml4ZWQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHBhY2tlZFNmaXhlZDMyXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkU2ZpeGVkMzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRTZml4ZWQzMk1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHBhY2tlZFNmaXhlZDY0Xy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkU2ZpeGVkNjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRTZml4ZWQ2NE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHBhY2tlZEZsb2F0Xy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBpZiAocGFja2VkRmxvYXRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRGbG9hdE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHBhY2tlZERvdWJsZV8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgaWYgKHBhY2tlZERvdWJsZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZERvdWJsZU1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gMSAqIHBhY2tlZEJvb2xfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRCb29sXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFja2VkQm9vbE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGlmIChwYWNrZWRFbnVtXy5Db3VudCA+IDApIHsNCisgICAgICAgICAgZm9yZWFjaCAoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gZWxlbWVudCBpbiBwYWNrZWRFbnVtXykgew0KKyAgICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemVOb1RhZygoaW50KSBlbGVtZW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICBzaXplICs9IDI7DQorICAgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVSYXdWYXJpbnQzMlNpemUoKHVpbnQpIGRhdGFTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhY2tlZEVudW1NZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlcyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlcyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZFR5cGVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RQYWNrZWRUeXBlcyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcGFja2VkSW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZEludDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRVaW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZFVpbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkU2ludDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRTaW50NjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZEZpeGVkMzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZEZpeGVkNjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZFNmaXhlZDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICBwYWNrZWRTZml4ZWQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkRmxvYXRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZERvdWJsZV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkQm9vbF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcGFja2VkRW51bV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0UGFja2VkVHlwZXMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdFBhY2tlZFR5cGVzLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0UGFja2VkVHlwZXMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0UGFja2VkVHlwZXMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdFBhY2tlZFR5cGVzIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdFBhY2tlZFR5cGVzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFBhY2tlZFR5cGVzKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UGFja2VkVHlwZXMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UGFja2VkVHlwZXMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFBhY2tlZFR5cGVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRUeXBlcy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RQYWNrZWRUeXBlcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFBhY2tlZFR5cGVzKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RQYWNrZWRUeXBlcykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3RQYWNrZWRUeXBlcyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRUeXBlcy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5wYWNrZWRJbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkSW50MzJfLkFkZChvdGhlci5wYWNrZWRJbnQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZEludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQ2NF8uQWRkKG90aGVyLnBhY2tlZEludDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkVWludDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRVaW50MzJfLkFkZChvdGhlci5wYWNrZWRVaW50MzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWRVaW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQ2NF8uQWRkKG90aGVyLnBhY2tlZFVpbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZFNpbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkU2ludDMyXy5BZGQob3RoZXIucGFja2VkU2ludDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkU2ludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRTaW50NjRfLkFkZChvdGhlci5wYWNrZWRTaW50NjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWRGaXhlZDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRGaXhlZDMyXy5BZGQob3RoZXIucGFja2VkRml4ZWQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZEZpeGVkNjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZEZpeGVkNjRfLkFkZChvdGhlci5wYWNrZWRGaXhlZDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkU2ZpeGVkMzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZFNmaXhlZDMyXy5BZGQob3RoZXIucGFja2VkU2ZpeGVkMzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWRTZml4ZWQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkU2ZpeGVkNjRfLkFkZChvdGhlci5wYWNrZWRTZml4ZWQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZEZsb2F0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRGbG9hdF8uQWRkKG90aGVyLnBhY2tlZEZsb2F0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucGFja2VkRG91YmxlXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWREb3VibGVfLkFkZChvdGhlci5wYWNrZWREb3VibGVfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5wYWNrZWRCb29sXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5wYWNrZWRCb29sXy5BZGQob3RoZXIucGFja2VkQm9vbF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZEVudW1fLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnBhY2tlZEVudW1fLkFkZChvdGhlci5wYWNrZWRFbnVtXyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0UGFja2VkVHlwZXNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdFBhY2tlZFR5cGVzRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDcyMjoNCisgICAgICAgICAgICBjYXNlIDcyMDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkSW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDczMDoNCisgICAgICAgICAgICBjYXNlIDcyODogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEludDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkSW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDczODoNCisgICAgICAgICAgICBjYXNlIDczNjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFVJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZFVpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzQ2Og0KKyAgICAgICAgICAgIGNhc2UgNzQ0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkVUludDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucGFja2VkVWludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NTQ6DQorICAgICAgICAgICAgY2FzZSA3NTI6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWRTaW50MzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc2MjoNCisgICAgICAgICAgICBjYXNlIDc2MDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNJbnQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZFNpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzcwOg0KKyAgICAgICAgICAgIGNhc2UgNzczOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRml4ZWQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZEZpeGVkMzJfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc3ODoNCisgICAgICAgICAgICBjYXNlIDc3Nzogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEZpeGVkNjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWRGaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3ODY6DQorICAgICAgICAgICAgY2FzZSA3ODk6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTRml4ZWQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZFNmaXhlZDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3OTQ6DQorICAgICAgICAgICAgY2FzZSA3OTM6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTRml4ZWQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZFNmaXhlZDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4MDI6DQorICAgICAgICAgICAgY2FzZSA4MDU6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGbG9hdEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZEZsb2F0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4MTA6DQorICAgICAgICAgICAgY2FzZSA4MDk6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWREb3VibGVBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWREb3VibGVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgxODoNCisgICAgICAgICAgICBjYXNlIDgxNjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEJvb2xBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWRCb29sXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA4MjY6DQorICAgICAgICAgICAgY2FzZSA4MjQ6IHsNCisgICAgICAgICAgICAgIHNjZzo6SUNvbGxlY3Rpb248b2JqZWN0PiB1bmtub3duSXRlbXM7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRW51bUFycmF5PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPih0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5wYWNrZWRFbnVtXywgb3V0IHVua25vd25JdGVtcyk7DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkl0ZW1zICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgcmF3VmFsdWUgaW4gdW5rbm93bkl0ZW1zKQ0KKyAgICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZSBpcyBpbnQpDQorICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoMTAzLCAodWxvbmcpKGludClyYXdWYWx1ZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IFBhY2tlZEludDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRJbnQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRJbnQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkSW50MzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFBhY2tlZEludDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRJbnQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZEludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEludDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRJbnQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkSW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRJbnQzMihzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEludDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGxvbmc+IFBhY2tlZEludDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRJbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRJbnQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkSW50NjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBHZXRQYWNrZWRJbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkSW50NjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRJbnQ2NChpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkSW50NjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZEludDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkSW50NjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRJbnQ2NChzY2c6OklFbnVtZXJhYmxlPGxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRJbnQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRJbnQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkSW50NjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1aW50PiBQYWNrZWRVaW50MzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZFVpbnQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRVaW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZFVpbnQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1aW50IEdldFBhY2tlZFVpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkVWludDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkVWludDMyKGludCBpbmRleCwgdWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRVaW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZFVpbnQzMih1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZFVpbnQzMihzY2c6OklFbnVtZXJhYmxlPHVpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRVaW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkVWludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRVaW50MzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1bG9uZz4gUGFja2VkVWludDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRVaW50NjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkVWludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRVaW50NjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgR2V0UGFja2VkVWludDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRVaW50NjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRVaW50NjQoaW50IGluZGV4LCB1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRVaW50NjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZFVpbnQ2NCh1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRVaW50NjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRVaW50NjQoc2NnOjpJRW51bWVyYWJsZTx1bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRVaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFVpbnQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gUGFja2VkU2ludDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRTaW50MzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUGFja2VkU2ludDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRTaW50MzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFBhY2tlZFNpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkU2ludDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkU2ludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkU2ludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTaW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRTaW50MzIoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTaW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkU2ludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTaW50MzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBQYWNrZWRTaW50NjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZFNpbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRTaW50NjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZFNpbnQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBsb25nIEdldFBhY2tlZFNpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkU2ludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkU2ludDY0KGludCBpbmRleCwgbG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTaW50NjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZFNpbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNpbnQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZFNpbnQ2NChzY2c6OklFbnVtZXJhYmxlPGxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTaW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkU2ludDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTaW50NjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1aW50PiBQYWNrZWRGaXhlZDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRGaXhlZDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZEZpeGVkMzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZEZpeGVkMzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBHZXRQYWNrZWRGaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRGaXhlZDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UGFja2VkRml4ZWQzMihpbnQgaW5kZXgsIHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRml4ZWQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkRml4ZWQzMih1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZpeGVkMzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRGaXhlZDMyKHNjZzo6SUVudW1lcmFibGU8dWludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZpeGVkMzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUGFja2VkRml4ZWQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRml4ZWQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVsb25nPiBQYWNrZWRGaXhlZDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRGaXhlZDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZEZpeGVkNjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlBhY2tlZEZpeGVkNjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgR2V0UGFja2VkRml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkRml4ZWQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZEZpeGVkNjQoaW50IGluZGV4LCB1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGaXhlZDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRGaXhlZDY0KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZpeGVkNjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRGaXhlZDY0KHNjZzo6SUVudW1lcmFibGU8dWxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGaXhlZDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZEZpeGVkNjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZpeGVkNjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IFBhY2tlZFNmaXhlZDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRTZml4ZWQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRTZml4ZWQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkU2ZpeGVkMzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFBhY2tlZFNmaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRQYWNrZWRTZml4ZWQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZFNmaXhlZDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNmaXhlZDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRTZml4ZWQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ZpeGVkMzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRTZml4ZWQzMihzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZFNmaXhlZDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZFNmaXhlZDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGxvbmc+IFBhY2tlZFNmaXhlZDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5wYWNrZWRTZml4ZWQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRTZml4ZWQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkU2ZpeGVkNjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBHZXRQYWNrZWRTZml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkU2ZpeGVkNjQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRTZml4ZWQ2NChpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ZpeGVkNjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZFNmaXhlZDY0KGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ZpeGVkNjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VQYWNrZWRTZml4ZWQ2NChzY2c6OklFbnVtZXJhYmxlPGxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRTZml4ZWQ2NF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRTZml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkU2ZpeGVkNjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxmbG9hdD4gUGFja2VkRmxvYXRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnBhY2tlZEZsb2F0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZEZsb2F0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRGbG9hdENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBmbG9hdCBHZXRQYWNrZWRGbG9hdChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkRmxvYXQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRGbG9hdChpbnQgaW5kZXgsIGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEZsb2F0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRQYWNrZWRGbG9hdChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGbG9hdF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVBhY2tlZEZsb2F0KHNjZzo6SUVudW1lcmFibGU8ZmxvYXQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRGbG9hdF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRGbG9hdCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRmxvYXRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxkb3VibGU+IFBhY2tlZERvdWJsZUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkRG91YmxlXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZERvdWJsZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkRG91YmxlQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGRvdWJsZSBHZXRQYWNrZWREb3VibGUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZERvdWJsZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZERvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWREb3VibGVfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZERvdWJsZShkb3VibGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRG91YmxlXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkRG91YmxlKHNjZzo6SUVudW1lcmFibGU8ZG91YmxlPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRG91YmxlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZERvdWJsZSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRG91YmxlXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8Ym9vbD4gUGFja2VkQm9vbExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkQm9vbF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRCb29sQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRCb29sQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgR2V0UGFja2VkQm9vbChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UGFja2VkQm9vbChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZEJvb2woaW50IGluZGV4LCBib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEJvb2xfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZEJvb2woYm9vbCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRCb29sXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkQm9vbChzY2c6OklFbnVtZXJhYmxlPGJvb2w+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRCb29sXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZEJvb2woKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnBhY2tlZEJvb2xfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gUGFja2VkRW51bUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkRW51bV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBQYWNrZWRFbnVtQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QYWNrZWRFbnVtQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEdldFBhY2tlZEVudW0oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZEVudW0oaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQYWNrZWRFbnVtKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRW51bV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUGFja2VkRW51bShnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRFbnVtXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkRW51bShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRW51bV8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQYWNrZWRFbnVtKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRFbnVtXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0UGFja2VkVHlwZXMoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RVbnBhY2tlZFR5cGVzIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdFVucGFja2VkVHlwZXMsIFRlc3RVbnBhY2tlZFR5cGVzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0VW5wYWNrZWRUeXBlcygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0VW5wYWNrZWRUeXBlcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFVucGFja2VkVHlwZXMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RVbnBhY2tlZFR5cGVzRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJ1bnBhY2tlZF9ib29sIiwgInVucGFja2VkX2RvdWJsZSIsICJ1bnBhY2tlZF9lbnVtIiwgInVucGFja2VkX2ZpeGVkMzIiLCAidW5wYWNrZWRfZml4ZWQ2NCIsICJ1bnBhY2tlZF9mbG9hdCIsICJ1bnBhY2tlZF9pbnQzMiIsICJ1bnBhY2tlZF9pbnQ2NCIsICJ1bnBhY2tlZF9zZml4ZWQzMiIsICJ1bnBhY2tlZF9zZml4ZWQ2NCIsICJ1bnBhY2tlZF9zaW50MzIiLCAidW5wYWNrZWRfc2ludDY0IiwgInVucGFja2VkX3VpbnQzMiIsICJ1bnBhY2tlZF91aW50NjQiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdFVucGFja2VkVHlwZXNGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgODE2LCA4MDksIDgyNCwgNzczLCA3NzcsIDgwNSwgNzIwLCA3MjgsIDc4OSwgNzkzLCA3NTIsIDc2MCwgNzM2LCA3NDQgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRUeXBlcyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RVbnBhY2tlZFR5cGVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RVbnBhY2tlZFR5cGVzIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFVucGFja2VkVHlwZXNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdFVucGFja2VkVHlwZXMsIFRlc3RVbnBhY2tlZFR5cGVzLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RVbnBhY2tlZFR5cGVzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEludDMyRmllbGROdW1iZXIgPSA5MDsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+IHVucGFja2VkSW50MzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBVbnBhY2tlZEludDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZEludDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkSW50MzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkSW50MzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRVbnBhY2tlZEludDMyKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZEludDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRJbnQ2NEZpZWxkTnVtYmVyID0gOTE7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gdW5wYWNrZWRJbnQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gVW5wYWNrZWRJbnQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRJbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZEludDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZEludDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEdldFVucGFja2VkSW50NjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVucGFja2VkSW50NjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFVpbnQzMkZpZWxkTnVtYmVyID0gOTI7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4gdW5wYWNrZWRVaW50MzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1aW50PiBVbnBhY2tlZFVpbnQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRVaW50MzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRVaW50MzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkVWludDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBHZXRVbnBhY2tlZFVpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRVaW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFVpbnQ2NEZpZWxkTnVtYmVyID0gOTM7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+IHVucGFja2VkVWludDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVsb25nPiBVbnBhY2tlZFVpbnQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRVaW50NjRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRVaW50NjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkVWludDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWxvbmcgR2V0VW5wYWNrZWRVaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVucGFja2VkVWludDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRTaW50MzJGaWVsZE51bWJlciA9IDk0Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gdW5wYWNrZWRTaW50MzJfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGludD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8aW50PiBVbnBhY2tlZFNpbnQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRTaW50MzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRTaW50MzJDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkU2ludDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgR2V0VW5wYWNrZWRTaW50MzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHVucGFja2VkU2ludDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRTaW50NjRGaWVsZE51bWJlciA9IDk1Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+IHVucGFja2VkU2ludDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxsb25nPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxsb25nPiBVbnBhY2tlZFNpbnQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRTaW50NjRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRTaW50NjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkU2ludDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEdldFVucGFja2VkU2ludDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZFNpbnQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkRml4ZWQzMkZpZWxkTnVtYmVyID0gOTY7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4gdW5wYWNrZWRGaXhlZDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1aW50PigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWludD4gVW5wYWNrZWRGaXhlZDMyTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZEZpeGVkMzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRGaXhlZDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZEZpeGVkMzJfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1aW50IEdldFVucGFja2VkRml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRGaXhlZDMyX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRGaXhlZDY0RmllbGROdW1iZXIgPSA5NzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4gdW5wYWNrZWRGaXhlZDY0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVsb25nPiBVbnBhY2tlZEZpeGVkNjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHVucGFja2VkRml4ZWQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZEZpeGVkNjRDb3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkRml4ZWQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVsb25nIEdldFVucGFja2VkRml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRGaXhlZDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRTZml4ZWQzMkZpZWxkTnVtYmVyID0gOTg7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PiB1bnBhY2tlZFNmaXhlZDMyXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gVW5wYWNrZWRTZml4ZWQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRTZml4ZWQzMl8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZFNmaXhlZDMyQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZFNmaXhlZDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgR2V0VW5wYWNrZWRTZml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRTZml4ZWQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkU2ZpeGVkNjRGaWVsZE51bWJlciA9IDk5Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+IHVucGFja2VkU2ZpeGVkNjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGxvbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGxvbmc+IFVucGFja2VkU2ZpeGVkNjRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHVucGFja2VkU2ZpeGVkNjRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRTZml4ZWQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRTZml4ZWQ2NF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgbG9uZyBHZXRVbnBhY2tlZFNmaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZFNmaXhlZDY0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRGbG9hdEZpZWxkTnVtYmVyID0gMTAwOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGZsb2F0PiB1bnBhY2tlZEZsb2F0XyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxmbG9hdD4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8ZmxvYXQ+IFVucGFja2VkRmxvYXRMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHVucGFja2VkRmxvYXRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRGbG9hdENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRGbG9hdF8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZmxvYXQgR2V0VW5wYWNrZWRGbG9hdChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRGbG9hdF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkRG91YmxlRmllbGROdW1iZXIgPSAxMDE7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8ZG91YmxlPiB1bnBhY2tlZERvdWJsZV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8ZG91YmxlPigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxkb3VibGU+IFVucGFja2VkRG91YmxlTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seSh1bnBhY2tlZERvdWJsZV8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZERvdWJsZUNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWREb3VibGVfLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGRvdWJsZSBHZXRVbnBhY2tlZERvdWJsZShpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWREb3VibGVfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEJvb2xGaWVsZE51bWJlciA9IDEwMjsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxib29sPiB1bnBhY2tlZEJvb2xfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGJvb2w+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGJvb2w+IFVucGFja2VkQm9vbExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkodW5wYWNrZWRCb29sXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFVucGFja2VkQm9vbENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRCb29sXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBib29sIEdldFVucGFja2VkQm9vbChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gdW5wYWNrZWRCb29sX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRFbnVtRmllbGROdW1iZXIgPSAxMDM7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IHVucGFja2VkRW51bV8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiBVbnBhY2tlZEVudW1MaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHVucGFja2VkRW51bV8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBVbnBhY2tlZEVudW1Db3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkRW51bV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gR2V0VW5wYWNrZWRFbnVtKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiB1bnBhY2tlZEVudW1fW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RVbnBhY2tlZFR5cGVzRmllbGROYW1lczsNCisgICAgICBpZiAodW5wYWNrZWRJbnQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMkFycmF5KDkwLCBmaWVsZF9uYW1lc1s2XSwgdW5wYWNrZWRJbnQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRJbnQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NEFycmF5KDkxLCBmaWVsZF9uYW1lc1s3XSwgdW5wYWNrZWRJbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRVaW50MzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlVUludDMyQXJyYXkoOTIsIGZpZWxkX25hbWVzWzEyXSwgdW5wYWNrZWRVaW50MzJfKTsNCisgICAgICB9DQorICAgICAgaWYgKHVucGFja2VkVWludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVVJbnQ2NEFycmF5KDkzLCBmaWVsZF9uYW1lc1sxM10sIHVucGFja2VkVWludDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1bnBhY2tlZFNpbnQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVTSW50MzJBcnJheSg5NCwgZmllbGRfbmFtZXNbMTBdLCB1bnBhY2tlZFNpbnQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRTaW50NjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ludDY0QXJyYXkoOTUsIGZpZWxkX25hbWVzWzExXSwgdW5wYWNrZWRTaW50NjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHVucGFja2VkRml4ZWQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDMyQXJyYXkoOTYsIGZpZWxkX25hbWVzWzNdLCB1bnBhY2tlZEZpeGVkMzJfKTsNCisgICAgICB9DQorICAgICAgaWYgKHVucGFja2VkRml4ZWQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDY0QXJyYXkoOTcsIGZpZWxkX25hbWVzWzRdLCB1bnBhY2tlZEZpeGVkNjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHVucGFja2VkU2ZpeGVkMzJfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ZpeGVkMzJBcnJheSg5OCwgZmllbGRfbmFtZXNbOF0sIHVucGFja2VkU2ZpeGVkMzJfKTsNCisgICAgICB9DQorICAgICAgaWYgKHVucGFja2VkU2ZpeGVkNjRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU0ZpeGVkNjRBcnJheSg5OSwgZmllbGRfbmFtZXNbOV0sIHVucGFja2VkU2ZpeGVkNjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHVucGFja2VkRmxvYXRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXRBcnJheSgxMDAsIGZpZWxkX25hbWVzWzVdLCB1bnBhY2tlZEZsb2F0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1bnBhY2tlZERvdWJsZV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGVBcnJheSgxMDEsIGZpZWxkX25hbWVzWzFdLCB1bnBhY2tlZERvdWJsZV8pOw0KKyAgICAgIH0NCisgICAgICBpZiAodW5wYWNrZWRCb29sXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUJvb2xBcnJheSgxMDIsIGZpZWxkX25hbWVzWzBdLCB1bnBhY2tlZEJvb2xfKTsNCisgICAgICB9DQorICAgICAgaWYgKHVucGFja2VkRW51bV8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVFbnVtQXJyYXkoMTAzLCBmaWVsZF9uYW1lc1syXSwgdW5wYWNrZWRFbnVtXyk7DQorICAgICAgfQ0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoaW50IGVsZW1lbnQgaW4gVW5wYWNrZWRJbnQzMkxpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZEludDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGxvbmcgZWxlbWVudCBpbiBVbnBhY2tlZEludDY0TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkSW50NjRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAodWludCBlbGVtZW50IGluIFVucGFja2VkVWludDMyTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZFVpbnQzMl8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoICh1bG9uZyBlbGVtZW50IGluIFVucGFja2VkVWludDY0TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQ2NFNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZFVpbnQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChpbnQgZWxlbWVudCBpbiBVbnBhY2tlZFNpbnQzMkxpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50MzJTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRTaW50MzJfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAobG9uZyBlbGVtZW50IGluIFVucGFja2VkU2ludDY0TGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQ2NFNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZFNpbnQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDQgKiB1bnBhY2tlZEZpeGVkMzJfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkRml4ZWQzMl8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDggKiB1bnBhY2tlZEZpeGVkNjRfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkRml4ZWQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDQgKiB1bnBhY2tlZFNmaXhlZDMyXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZFNmaXhlZDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gOCAqIHVucGFja2VkU2ZpeGVkNjRfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHVucGFja2VkU2ZpeGVkNjRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSA0ICogdW5wYWNrZWRGbG9hdF8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWRGbG9hdF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDggKiB1bnBhY2tlZERvdWJsZV8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAyICogdW5wYWNrZWREb3VibGVfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZGF0YVNpemUgPSAxICogdW5wYWNrZWRCb29sXy5Db3VudDsNCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZEJvb2xfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgaWYgKHVucGFja2VkRW51bV8uQ291bnQgPiAwKSB7DQorICAgICAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIGVsZW1lbnQgaW4gdW5wYWNrZWRFbnVtXykgew0KKyAgICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemVOb1RhZygoaW50KSBlbGVtZW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgICBzaXplICs9IDIgKiB1bnBhY2tlZEVudW1fLkNvdW50Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRUeXBlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRUeXBlcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRUeXBlcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFVucGFja2VkVHlwZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RVbnBhY2tlZFR5cGVzIE1ha2VSZWFkT25seSgpIHsNCisgICAgICB1bnBhY2tlZEludDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB1bnBhY2tlZEludDY0Xy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB1bnBhY2tlZFVpbnQzMl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRVaW50NjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkU2ludDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB1bnBhY2tlZFNpbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgdW5wYWNrZWRGaXhlZDMyXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB1bnBhY2tlZEZpeGVkNjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkU2ZpeGVkMzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkU2ZpeGVkNjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkRmxvYXRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkRG91YmxlXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB1bnBhY2tlZEJvb2xfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHVucGFja2VkRW51bV8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0VW5wYWNrZWRUeXBlcyBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxUZXN0VW5wYWNrZWRUeXBlcywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdFVucGFja2VkVHlwZXMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0VW5wYWNrZWRUeXBlcyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0VW5wYWNrZWRUeXBlcyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RVbnBhY2tlZFR5cGVzIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFVucGFja2VkVHlwZXMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RVbnBhY2tlZFR5cGVzIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkVHlwZXMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFVucGFja2VkVHlwZXMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFVucGFja2VkVHlwZXMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0VW5wYWNrZWRUeXBlcyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFVucGFja2VkVHlwZXMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdFVucGFja2VkVHlwZXMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0VW5wYWNrZWRUeXBlcyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZFR5cGVzLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkSW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVucGFja2VkSW50MzJfLkFkZChvdGhlci51bnBhY2tlZEludDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRJbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRJbnQ2NF8uQWRkKG90aGVyLnVucGFja2VkSW50NjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZFVpbnQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50MzJfLkFkZChvdGhlci51bnBhY2tlZFVpbnQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkVWludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZFVpbnQ2NF8uQWRkKG90aGVyLnVucGFja2VkVWludDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRTaW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVucGFja2VkU2ludDMyXy5BZGQob3RoZXIudW5wYWNrZWRTaW50MzJfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZFNpbnQ2NF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50NjRfLkFkZChvdGhlci51bnBhY2tlZFNpbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkRml4ZWQzMl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRGaXhlZDMyXy5BZGQob3RoZXIudW5wYWNrZWRGaXhlZDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRGaXhlZDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkNjRfLkFkZChvdGhlci51bnBhY2tlZEZpeGVkNjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZFNmaXhlZDMyXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZFNmaXhlZDMyXy5BZGQob3RoZXIudW5wYWNrZWRTZml4ZWQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkU2ZpeGVkNjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnVucGFja2VkU2ZpeGVkNjRfLkFkZChvdGhlci51bnBhY2tlZFNmaXhlZDY0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRGbG9hdF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRGbG9hdF8uQWRkKG90aGVyLnVucGFja2VkRmxvYXRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci51bnBhY2tlZERvdWJsZV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWREb3VibGVfLkFkZChvdGhlci51bnBhY2tlZERvdWJsZV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnVucGFja2VkQm9vbF8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQudW5wYWNrZWRCb29sXy5BZGQob3RoZXIudW5wYWNrZWRCb29sXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIudW5wYWNrZWRFbnVtXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC51bnBhY2tlZEVudW1fLkFkZChvdGhlci51bnBhY2tlZEVudW1fKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RVbnBhY2tlZFR5cGVzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RVbnBhY2tlZFR5cGVzRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDcyMjoNCisgICAgICAgICAgICBjYXNlIDcyMDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEludDMyQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRJbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzMwOg0KKyAgICAgICAgICAgIGNhc2UgNzI4OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZEludDY0Xyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3Mzg6DQorICAgICAgICAgICAgY2FzZSA3MzY6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRVSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZFVpbnQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzQ2Og0KKyAgICAgICAgICAgIGNhc2UgNzQ0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkVUludDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRVaW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDc1NDoNCisgICAgICAgICAgICBjYXNlIDc1Mjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkU2ludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3NjI6DQorICAgICAgICAgICAgY2FzZSA3NjA6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTSW50NjRBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZFNpbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzcwOg0KKyAgICAgICAgICAgIGNhc2UgNzczOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRml4ZWQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkRml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzc4Og0KKyAgICAgICAgICAgIGNhc2UgNzc3OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRml4ZWQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkRml4ZWQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgNzg2Og0KKyAgICAgICAgICAgIGNhc2UgNzg5OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU0ZpeGVkMzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZFNmaXhlZDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSA3OTQ6DQorICAgICAgICAgICAgY2FzZSA3OTM6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTRml4ZWQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkU2ZpeGVkNjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgwMjoNCisgICAgICAgICAgICBjYXNlIDgwNTogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEZsb2F0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWRGbG9hdF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgODEwOg0KKyAgICAgICAgICAgIGNhc2UgODA5OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRG91YmxlQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQudW5wYWNrZWREb3VibGVfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgxODoNCisgICAgICAgICAgICBjYXNlIDgxNjogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEJvb2xBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC51bnBhY2tlZEJvb2xfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDgyNjoNCisgICAgICAgICAgICBjYXNlIDgyNDogew0KKyAgICAgICAgICAgICAgc2NnOjpJQ29sbGVjdGlvbjxvYmplY3Q+IHVua25vd25JdGVtczsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtQXJyYXk8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnVucGFja2VkRW51bV8sIG91dCB1bmtub3duSXRlbXMpOw0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25JdGVtcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IHJhd1ZhbHVlIGluIHVua25vd25JdGVtcykNCisgICAgICAgICAgICAgICAgICBpZiAocmF3VmFsdWUgaXMgaW50KQ0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5NZXJnZVZhcmludEZpZWxkKDEwMywgKHVsb25nKShpbnQpcmF3VmFsdWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBVbnBhY2tlZEludDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZEludDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkSW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkSW50MzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IEdldFVucGFja2VkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkSW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZEludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkSW50MzJfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkSW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkSW50MzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZEludDMyKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRJbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZEludDMyKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gVW5wYWNrZWRJbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRJbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZEludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbnBhY2tlZEludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0VW5wYWNrZWRJbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRJbnQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkSW50NjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkSW50NjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFVucGFja2VkSW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRJbnQ2NChzY2c6OklFbnVtZXJhYmxlPGxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEludDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkSW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkSW50NjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDx1aW50PiBVbnBhY2tlZFVpbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRVaW50MzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRVaW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkVWludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgR2V0VW5wYWNrZWRVaW50MzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkVWludDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRVaW50MzIoaW50IGluZGV4LCB1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkVWludDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZFVpbnQzMih1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkVWludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRVaW50MzIoc2NnOjpJRW51bWVyYWJsZTx1aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRVaW50MzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkVWludDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IFVucGFja2VkVWludDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZFVpbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZFVpbnQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRVaW50NjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgR2V0VW5wYWNrZWRVaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkVWludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRVaW50NjQoaW50IGluZGV4LCB1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFVpbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRVaW50NjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50NjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZFVpbnQ2NChzY2c6OklFbnVtZXJhYmxlPHVsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRVaW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRVaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkVWludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8aW50PiBVbnBhY2tlZFNpbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRTaW50MzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRTaW50MzJDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkU2ludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXRVbnBhY2tlZFNpbnQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRTaW50MzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZFNpbnQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNpbnQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRTaW50MzIoaW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRTaW50MzIoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNpbnQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZFNpbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50MzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBVbnBhY2tlZFNpbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRTaW50NjRfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRTaW50NjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkU2ludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0VW5wYWNrZWRTaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkU2ludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRTaW50NjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ludDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZFNpbnQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRTaW50NjQoc2NnOjpJRW51bWVyYWJsZTxsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTaW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRTaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWludD4gVW5wYWNrZWRGaXhlZDMyTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZEZpeGVkMzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRGaXhlZDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5VbnBhY2tlZEZpeGVkMzJDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBHZXRVbnBhY2tlZEZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkRml4ZWQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkRml4ZWQzMihpbnQgaW5kZXgsIHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRGaXhlZDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZEZpeGVkMzIodWludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkMzJfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZEZpeGVkMzIoc2NnOjpJRW51bWVyYWJsZTx1aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRGaXhlZDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkRml4ZWQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRGaXhlZDMyXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IFVucGFja2VkRml4ZWQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRGaXhlZDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkRml4ZWQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRGaXhlZDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVsb25nIEdldFVucGFja2VkRml4ZWQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRGaXhlZDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRGaXhlZDY0KGludCBpbmRleCwgdWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRGaXhlZDY0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZEZpeGVkNjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRGaXhlZDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRGaXhlZDY0KHNjZzo6SUVudW1lcmFibGU8dWxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkNjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRGaXhlZDY0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZpeGVkNjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IFVucGFja2VkU2ZpeGVkMzJMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkU2ZpeGVkMzJfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgVW5wYWNrZWRTZml4ZWQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRTZml4ZWQzMkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgR2V0VW5wYWNrZWRTZml4ZWQzMihpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRTZml4ZWQzMihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkU2ZpeGVkMzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRTZml4ZWQzMihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQzMl8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkU2ZpeGVkMzIoc2NnOjpJRW51bWVyYWJsZTxpbnQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZFNmaXhlZDMyXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkU2ZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ZpeGVkMzJfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxsb25nPiBVbnBhY2tlZFNmaXhlZDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZFNmaXhlZDY0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkU2ZpeGVkNjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkU2ZpeGVkNjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgbG9uZyBHZXRVbnBhY2tlZFNmaXhlZDY0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZFNmaXhlZDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0VW5wYWNrZWRTZml4ZWQ2NChpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRTZml4ZWQ2NChsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ZpeGVkNjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZFNmaXhlZDY0KHNjZzo6SUVudW1lcmFibGU8bG9uZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkU2ZpeGVkNjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyVW5wYWNrZWRTZml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRTZml4ZWQ2NF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGZsb2F0PiBVbnBhY2tlZEZsb2F0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZEZsb2F0XzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkRmxvYXRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkRmxvYXRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZmxvYXQgR2V0VW5wYWNrZWRGbG9hdChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0VW5wYWNrZWRGbG9hdChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkRmxvYXQoaW50IGluZGV4LCBmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZsb2F0X1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZEZsb2F0KGZsb2F0IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRmxvYXRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZEZsb2F0KHNjZzo6SUVudW1lcmFibGU8ZmxvYXQ+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZEZsb2F0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkRmxvYXQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRmxvYXRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxkb3VibGU+IFVucGFja2VkRG91YmxlTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS51bnBhY2tlZERvdWJsZV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZERvdWJsZUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWREb3VibGVDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgZG91YmxlIEdldFVucGFja2VkRG91YmxlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZERvdWJsZShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkRG91YmxlKGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRG91YmxlX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRVbnBhY2tlZERvdWJsZShkb3VibGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWREb3VibGVfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VVbnBhY2tlZERvdWJsZShzY2c6OklFbnVtZXJhYmxlPGRvdWJsZT4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRG91YmxlXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkRG91YmxlKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC51bnBhY2tlZERvdWJsZV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGJvb2w+IFVucGFja2VkQm9vbExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkudW5wYWNrZWRCb29sXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFVucGFja2VkQm9vbENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuVW5wYWNrZWRCb29sQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGJvb2wgR2V0VW5wYWNrZWRCb29sKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRVbnBhY2tlZEJvb2woaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVbnBhY2tlZEJvb2woaW50IGluZGV4LCBib29sIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkQm9vbF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRCb29sKGJvb2wgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRCb29sXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlVW5wYWNrZWRCb29sKHNjZzo6SUVudW1lcmFibGU8Ym9vbD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkQm9vbF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVbnBhY2tlZEJvb2woKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkQm9vbF8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiBVbnBhY2tlZEVudW1MaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnVucGFja2VkRW51bV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBVbnBhY2tlZEVudW1Db3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVucGFja2VkRW51bUNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBHZXRVbnBhY2tlZEVudW0oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFVucGFja2VkRW51bShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFVucGFja2VkRW51bShpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRW51bV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkVW5wYWNrZWRFbnVtKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnVucGFja2VkRW51bV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVVucGFja2VkRW51bShzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRFbnVtXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclVucGFja2VkRW51bSgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQudW5wYWNrZWRFbnVtXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0VW5wYWNrZWRUeXBlcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFBhY2tlZEV4dGVuc2lvbnMgOiBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8VGVzdFBhY2tlZEV4dGVuc2lvbnMsIFRlc3RQYWNrZWRFeHRlbnNpb25zLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0UGFja2VkRXh0ZW5zaW9ucygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0UGFja2VkRXh0ZW5zaW9ucyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFBhY2tlZEV4dGVuc2lvbnMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RQYWNrZWRFeHRlbnNpb25zRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RQYWNrZWRFeHRlbnNpb25zRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFBhY2tlZEV4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVGVzdFBhY2tlZEV4dGVuc2lvbnMgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0UGFja2VkRXh0ZW5zaW9uc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0UGFja2VkRXh0ZW5zaW9ucywgVGVzdFBhY2tlZEV4dGVuc2lvbnMuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFBhY2tlZEV4dGVuc2lvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaWYgKCFFeHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RQYWNrZWRFeHRlbnNpb25zRmllbGROYW1lczsNCisgICAgICBwYjo6RXh0ZW5kYWJsZU1lc3NhZ2U8VGVzdFBhY2tlZEV4dGVuc2lvbnMsIFRlc3RQYWNrZWRFeHRlbnNpb25zLkJ1aWxkZXI+LkV4dGVuc2lvbldyaXRlciBleHRlbnNpb25Xcml0ZXIgPSBDcmVhdGVFeHRlbnNpb25Xcml0ZXIodGhpcyk7DQorICAgICAgZXh0ZW5zaW9uV3JpdGVyLldyaXRlVW50aWwoNTM2ODcwOTEyLCBvdXRwdXQpOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IEV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZTsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkRXh0ZW5zaW9ucyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RQYWNrZWRFeHRlbnNpb25zIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFRlc3RQYWNrZWRFeHRlbnNpb25zIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpFeHRlbmRhYmxlQnVpbGRlcjxUZXN0UGFja2VkRXh0ZW5zaW9ucywgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoVGVzdFBhY2tlZEV4dGVuc2lvbnMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0UGFja2VkRXh0ZW5zaW9ucyByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBUZXN0UGFja2VkRXh0ZW5zaW9ucyBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdFBhY2tlZEV4dGVuc2lvbnMoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RQYWNrZWRFeHRlbnNpb25zIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFBhY2tlZEV4dGVuc2lvbnMgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdFBhY2tlZEV4dGVuc2lvbnMuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBUZXN0UGFja2VkRXh0ZW5zaW9ucyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdFBhY2tlZEV4dGVuc2lvbnMpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoVGVzdFBhY2tlZEV4dGVuc2lvbnMpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShUZXN0UGFja2VkRXh0ZW5zaW9ucyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RQYWNrZWRFeHRlbnNpb25zLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICB0aGlzLk1lcmdlRXh0ZW5zaW9uRmllbGRzKG90aGVyKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RQYWNrZWRFeHRlbnNpb25zRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RQYWNrZWRFeHRlbnNpb25zRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3REeW5hbWljRXh0ZW5zaW9ucyA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPFRlc3REeW5hbWljRXh0ZW5zaW9ucywgVGVzdER5bmFtaWNFeHRlbnNpb25zLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0RHluYW1pY0V4dGVuc2lvbnMoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVGVzdER5bmFtaWNFeHRlbnNpb25zIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBUZXN0RHluYW1pY0V4dGVuc2lvbnMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3REeW5hbWljRXh0ZW5zaW9uc0ZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiZHluYW1pY19lbnVtX2V4dGVuc2lvbiIsICJkeW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uIiwgImVudW1fZXh0ZW5zaW9uIiwgIm1lc3NhZ2VfZXh0ZW5zaW9uIiwgInBhY2tlZF9leHRlbnNpb24iLCAicmVwZWF0ZWRfZXh0ZW5zaW9uIiwgInNjYWxhcl9leHRlbnNpb24iIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfdGVzdER5bmFtaWNFeHRlbnNpb25zRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDE2MDE2LCAxNjAzNCwgMTYwMDgsIDE2MDI2LCAxNjA1MCwgMTYwNDIsIDE2MDA1IH07DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER5bmFtaWNFeHRlbnNpb25zIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdER5bmFtaWNFeHRlbnNpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3REeW5hbWljRXh0ZW5zaW9uc19fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxUZXN0RHluYW1pY0V4dGVuc2lvbnMsIFRlc3REeW5hbWljRXh0ZW5zaW9ucy5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9UZXN0RHluYW1pY0V4dGVuc2lvbnNfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgew0KKyAgICAgIHB1YmxpYyBlbnVtIER5bmFtaWNFbnVtVHlwZSB7DQorICAgICAgICBEWU5BTUlDX0ZPTyA9IDIyMDAsDQorICAgICAgICBEWU5BTUlDX0JBUiA9IDIyMDEsDQorICAgICAgICBEWU5BTUlDX0JBWiA9IDIyMDIsDQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIER5bmFtaWNNZXNzYWdlVHlwZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPER5bmFtaWNNZXNzYWdlVHlwZSwgRHluYW1pY01lc3NhZ2VUeXBlLkJ1aWxkZXI+IHsNCisgICAgICAgIHByaXZhdGUgRHluYW1pY01lc3NhZ2VUeXBlKCkgeyB9DQorICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEeW5hbWljTWVzc2FnZVR5cGUgZGVmYXVsdEluc3RhbmNlID0gbmV3IER5bmFtaWNNZXNzYWdlVHlwZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2R5bmFtaWNNZXNzYWdlVHlwZUZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAiZHluYW1pY19maWVsZCIgfTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfZHluYW1pY01lc3NhZ2VUeXBlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDE2ODAwIH07DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlVHlwZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBEeW5hbWljTWVzc2FnZVR5cGUgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIER5bmFtaWNNZXNzYWdlVHlwZSBUaGlzTWVzc2FnZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX0R5bmFtaWNNZXNzYWdlVHlwZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxEeW5hbWljTWVzc2FnZVR5cGUsIER5bmFtaWNNZXNzYWdlVHlwZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdER5bmFtaWNFeHRlbnNpb25zX0R5bmFtaWNNZXNzYWdlVHlwZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRHluYW1pY0ZpZWxkRmllbGROdW1iZXIgPSAyMTAwOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIGhhc0R5bmFtaWNGaWVsZDsNCisgICAgICAgIHByaXZhdGUgaW50IGR5bmFtaWNGaWVsZF87DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNEeW5hbWljRmllbGQgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gaGFzRHluYW1pY0ZpZWxkOyB9DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgaW50IER5bmFtaWNGaWVsZCB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBkeW5hbWljRmllbGRfOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICBnZXQgew0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX2R5bmFtaWNNZXNzYWdlVHlwZUZpZWxkTmFtZXM7DQorICAgICAgICAgIGlmIChoYXNEeW5hbWljRmllbGQpIHsNCisgICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMigyMTAwLCBmaWVsZF9uYW1lc1swXSwgRHluYW1pY0ZpZWxkKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgICAgIGdldCB7DQorICAgICAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgICAgDQorICAgICAgICAgIHNpemUgPSAwOw0KKyAgICAgICAgICBpZiAoaGFzRHluYW1pY0ZpZWxkKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgyMTAwLCBEeW5hbWljRmllbGQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgICAgIHJldHVybiBzaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZVR5cGUgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2VUeXBlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlVHlwZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2VUeXBlIFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZVR5cGUgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2VUeXBlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlVHlwZSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZVR5cGUgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2VUeXBlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlVHlwZSBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpdmF0ZSBEeW5hbWljTWVzc2FnZVR5cGUgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKER5bmFtaWNNZXNzYWdlVHlwZSBwcm90b3R5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPER5bmFtaWNNZXNzYWdlVHlwZSwgQnVpbGRlcj4gew0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50ZXJuYWwgQnVpbGRlcihEeW5hbWljTWVzc2FnZVR5cGUgY2xvbmVGcm9tKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICAgICAgcHJpdmF0ZSBEeW5hbWljTWVzc2FnZVR5cGUgcmVzdWx0Ow0KKyAgICAgICAgICANCisgICAgICAgICAgcHJpdmF0ZSBEeW5hbWljTWVzc2FnZVR5cGUgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIER5bmFtaWNNZXNzYWdlVHlwZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBEeW5hbWljTWVzc2FnZVR5cGUoKTsNCisgICAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRHluYW1pY01lc3NhZ2VUeXBlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljTWVzc2FnZVR5cGUuRGVzY3JpcHRvcjsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRHluYW1pY01lc3NhZ2VUeXBlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRHluYW1pY01lc3NhZ2VUeXBlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciBpcyBEeW5hbWljTWVzc2FnZVR5cGUpIHsNCisgICAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKER5bmFtaWNNZXNzYWdlVHlwZSkgb3RoZXIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShEeW5hbWljTWVzc2FnZVR5cGUgb3RoZXIpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgaWYgKG90aGVyLkhhc0R5bmFtaWNGaWVsZCkgew0KKyAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0gb3RoZXIuRHluYW1pY0ZpZWxkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9keW5hbWljTWVzc2FnZVR5cGVGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgICAgIHRhZyA9IF9keW5hbWljTWVzc2FnZVR5cGVGaWVsZFRhZ3NbZmllbGRfb3JkaW5hbF07DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAxNjgwMDogew0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNEeW5hbWljRmllbGQgPSBpbnB1dC5SZWFkSW50MzIocmVmIHJlc3VsdC5keW5hbWljRmllbGRfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICANCisgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzRHluYW1pY0ZpZWxkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0R5bmFtaWNGaWVsZDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBpbnQgRHluYW1pY0ZpZWxkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkR5bmFtaWNGaWVsZDsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldER5bmFtaWNGaWVsZCh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXREeW5hbWljRmllbGQoaW50IHZhbHVlKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzRHluYW1pY0ZpZWxkID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQuZHluYW1pY0ZpZWxkXyA9IHZhbHVlOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHluYW1pY0ZpZWxkKCkgew0KKyAgICAgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICAgICAgcmVzdWx0Lmhhc0R5bmFtaWNGaWVsZCA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5keW5hbWljRmllbGRfID0gMDsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIER5bmFtaWNNZXNzYWdlVHlwZSgpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBTY2FsYXJFeHRlbnNpb25GaWVsZE51bWJlciA9IDIwMDA7DQorICAgIHByaXZhdGUgYm9vbCBoYXNTY2FsYXJFeHRlbnNpb247DQorICAgIHByaXZhdGUgdWludCBzY2FsYXJFeHRlbnNpb25fOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNTY2FsYXJFeHRlbnNpb24gew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNTY2FsYXJFeHRlbnNpb247IH0NCisgICAgfQ0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHVpbnQgU2NhbGFyRXh0ZW5zaW9uIHsNCisgICAgICBnZXQgeyByZXR1cm4gc2NhbGFyRXh0ZW5zaW9uXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IEVudW1FeHRlbnNpb25GaWVsZE51bWJlciA9IDIwMDE7DQorICAgIHByaXZhdGUgYm9vbCBoYXNFbnVtRXh0ZW5zaW9uOw0KKyAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIGVudW1FeHRlbnNpb25fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbkVudW0uRk9SRUlHTl9GT087DQorICAgIHB1YmxpYyBib29sIEhhc0VudW1FeHRlbnNpb24gew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNFbnVtRXh0ZW5zaW9uOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEVudW1FeHRlbnNpb24gew0KKyAgICAgIGdldCB7IHJldHVybiBlbnVtRXh0ZW5zaW9uXzsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER5bmFtaWNFbnVtRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAyMDAyOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHluYW1pY0VudW1FeHRlbnNpb247DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNFbnVtVHlwZSBkeW5hbWljRW51bUV4dGVuc2lvbl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY0VudW1UeXBlLkRZTkFNSUNfRk9POw0KKyAgICBwdWJsaWMgYm9vbCBIYXNEeW5hbWljRW51bUV4dGVuc2lvbiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc0R5bmFtaWNFbnVtRXh0ZW5zaW9uOyB9DQorICAgIH0NCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljRW51bVR5cGUgRHluYW1pY0VudW1FeHRlbnNpb24gew0KKyAgICAgIGdldCB7IHJldHVybiBkeW5hbWljRW51bUV4dGVuc2lvbl87IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBNZXNzYWdlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAyMDAzOw0KKyAgICBwcml2YXRlIGJvb2wgaGFzTWVzc2FnZUV4dGVuc2lvbjsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBtZXNzYWdlRXh0ZW5zaW9uXzsNCisgICAgcHVibGljIGJvb2wgSGFzTWVzc2FnZUV4dGVuc2lvbiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGhhc01lc3NhZ2VFeHRlbnNpb247IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UgTWVzc2FnZUV4dGVuc2lvbiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIG1lc3NhZ2VFeHRlbnNpb25fID8/IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IER5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAyMDA0Ow0KKyAgICBwcml2YXRlIGJvb2wgaGFzRHluYW1pY01lc3NhZ2VFeHRlbnNpb247DQorICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZSBkeW5hbWljTWVzc2FnZUV4dGVuc2lvbl87DQorICAgIHB1YmxpYyBib29sIEhhc0R5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uIHsNCisgICAgICBnZXQgeyByZXR1cm4gaGFzRHluYW1pY01lc3NhZ2VFeHRlbnNpb247IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZSBEeW5hbWljTWVzc2FnZUV4dGVuc2lvbiB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAyMDA1Ow0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4gcmVwZWF0ZWRFeHRlbnNpb25fID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHN0cmluZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8c3RyaW5nPiBSZXBlYXRlZEV4dGVuc2lvbkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRFeHRlbnNpb25fKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRFeHRlbnNpb25Db3VudCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRXh0ZW5zaW9uXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBzdHJpbmcgR2V0UmVwZWF0ZWRFeHRlbnNpb24oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRXh0ZW5zaW9uX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRXh0ZW5zaW9uRmllbGROdW1iZXIgPSAyMDA2Ow0KKyAgICBwcml2YXRlIGludCBwYWNrZWRFeHRlbnNpb25NZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gcGFja2VkRXh0ZW5zaW9uXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxpbnQ+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PGludD4gUGFja2VkRXh0ZW5zaW9uTGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShwYWNrZWRFeHRlbnNpb25fKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUGFja2VkRXh0ZW5zaW9uQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBwYWNrZWRFeHRlbnNpb25fLkNvdW50OyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBHZXRQYWNrZWRFeHRlbnNpb24oaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHBhY2tlZEV4dGVuc2lvbl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfdGVzdER5bmFtaWNFeHRlbnNpb25zRmllbGROYW1lczsNCisgICAgICBpZiAoaGFzU2NhbGFyRXh0ZW5zaW9uKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDMyKDIwMDAsIGZpZWxkX25hbWVzWzZdLCBTY2FsYXJFeHRlbnNpb24pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRW51bUV4dGVuc2lvbikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSgyMDAxLCBmaWVsZF9uYW1lc1syXSwgKGludCkgRW51bUV4dGVuc2lvbiwgRW51bUV4dGVuc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEeW5hbWljRW51bUV4dGVuc2lvbikgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRW51bSgyMDAyLCBmaWVsZF9uYW1lc1swXSwgKGludCkgRHluYW1pY0VudW1FeHRlbnNpb24sIER5bmFtaWNFbnVtRXh0ZW5zaW9uKTsNCisgICAgICB9DQorICAgICAgaWYgKGhhc01lc3NhZ2VFeHRlbnNpb24pIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMjAwMywgZmllbGRfbmFtZXNbM10sIE1lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHluYW1pY01lc3NhZ2VFeHRlbnNpb24pIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMjAwNCwgZmllbGRfbmFtZXNbMV0sIER5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkRXh0ZW5zaW9uXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZ0FycmF5KDIwMDUsIGZpZWxkX25hbWVzWzVdLCByZXBlYXRlZEV4dGVuc2lvbl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocGFja2VkRXh0ZW5zaW9uXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVBhY2tlZFNJbnQzMkFycmF5KDIwMDYsIGZpZWxkX25hbWVzWzRdLCBwYWNrZWRFeHRlbnNpb25NZW1vaXplZFNlcmlhbGl6ZWRTaXplLCBwYWNrZWRFeHRlbnNpb25fKTsNCisgICAgICB9DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGlmIChoYXNTY2FsYXJFeHRlbnNpb24pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVGaXhlZDMyU2l6ZSgyMDAwLCBTY2FsYXJFeHRlbnNpb24pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRW51bUV4dGVuc2lvbikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKDIwMDEsIChpbnQpIEVudW1FeHRlbnNpb24pOw0KKyAgICAgIH0NCisgICAgICBpZiAoaGFzRHluYW1pY0VudW1FeHRlbnNpb24pIHsNCisgICAgICAgIHNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgyMDAyLCAoaW50KSBEeW5hbWljRW51bUV4dGVuc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNNZXNzYWdlRXh0ZW5zaW9uKSB7DQorICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoMjAwMywgTWVzc2FnZUV4dGVuc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbikgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDIwMDQsIER5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIFJlcGVhdGVkRXh0ZW5zaW9uTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZEV4dGVuc2lvbl8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChpbnQgZWxlbWVudCBpbiBQYWNrZWRFeHRlbnNpb25MaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDMyU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIGlmIChwYWNrZWRFeHRlbnNpb25fLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBwYWNrZWRFeHRlbnNpb25NZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7DQorICAgICAgfQ0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHluYW1pY0V4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER5bmFtaWNFeHRlbnNpb25zIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHluYW1pY0V4dGVuc2lvbnMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHluYW1pY0V4dGVuc2lvbnMgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER5bmFtaWNFeHRlbnNpb25zIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0RHluYW1pY0V4dGVuc2lvbnMgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdER5bmFtaWNFeHRlbnNpb25zIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgcmVwZWF0ZWRFeHRlbnNpb25fLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHBhY2tlZEV4dGVuc2lvbl8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBUb0J1aWxkZXIoKSB7IHJldHVybiBDcmVhdGVCdWlsZGVyKHRoaXMpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcihUZXN0RHluYW1pY0V4dGVuc2lvbnMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdER5bmFtaWNFeHRlbnNpb25zLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihUZXN0RHluYW1pY0V4dGVuc2lvbnMgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBUZXN0RHluYW1pY0V4dGVuc2lvbnMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdER5bmFtaWNFeHRlbnNpb25zIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgVGVzdER5bmFtaWNFeHRlbnNpb25zIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgVGVzdER5bmFtaWNFeHRlbnNpb25zKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0RHluYW1pY0V4dGVuc2lvbnMgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuRGVzY3JpcHRvcjsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdER5bmFtaWNFeHRlbnNpb25zIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3REeW5hbWljRXh0ZW5zaW9ucyBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgaXMgVGVzdER5bmFtaWNFeHRlbnNpb25zKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3REeW5hbWljRXh0ZW5zaW9ucykgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFRlc3REeW5hbWljRXh0ZW5zaW9ucyBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyID09IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5IYXNTY2FsYXJFeHRlbnNpb24pIHsNCisgICAgICAgICAgU2NhbGFyRXh0ZW5zaW9uID0gb3RoZXIuU2NhbGFyRXh0ZW5zaW9uOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLkhhc0VudW1FeHRlbnNpb24pIHsNCisgICAgICAgICAgRW51bUV4dGVuc2lvbiA9IG90aGVyLkVudW1FeHRlbnNpb247DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzRHluYW1pY0VudW1FeHRlbnNpb24pIHsNCisgICAgICAgICAgRHluYW1pY0VudW1FeHRlbnNpb24gPSBvdGhlci5EeW5hbWljRW51bUV4dGVuc2lvbjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNNZXNzYWdlRXh0ZW5zaW9uKSB7DQorICAgICAgICAgIE1lcmdlTWVzc2FnZUV4dGVuc2lvbihvdGhlci5NZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5IYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbikgew0KKyAgICAgICAgICBNZXJnZUR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uKG90aGVyLkR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEV4dGVuc2lvbl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucmVwZWF0ZWRFeHRlbnNpb25fLkFkZChvdGhlci5yZXBlYXRlZEV4dGVuc2lvbl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnBhY2tlZEV4dGVuc2lvbl8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQucGFja2VkRXh0ZW5zaW9uXy5BZGQob3RoZXIucGFja2VkRXh0ZW5zaW9uXyk7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF90ZXN0RHluYW1pY0V4dGVuc2lvbnNGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfdGVzdER5bmFtaWNFeHRlbnNpb25zRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2MDA1OiB7DQorICAgICAgICAgICAgICByZXN1bHQuaGFzU2NhbGFyRXh0ZW5zaW9uID0gaW5wdXQuUmVhZEZpeGVkMzIocmVmIHJlc3VsdC5zY2FsYXJFeHRlbnNpb25fKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE2MDA4OiB7DQorICAgICAgICAgICAgICBvYmplY3QgdW5rbm93bjsNCisgICAgICAgICAgICAgIGlmKGlucHV0LlJlYWRFbnVtKHJlZiByZXN1bHQuZW51bUV4dGVuc2lvbl8sIG91dCB1bmtub3duKSkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQuaGFzRW51bUV4dGVuc2lvbiA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoMjAwMSwgKHVsb25nKShpbnQpdW5rbm93bik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjAxNjogew0KKyAgICAgICAgICAgICAgb2JqZWN0IHVua25vd247DQorICAgICAgICAgICAgICBpZihpbnB1dC5SZWFkRW51bShyZWYgcmVzdWx0LmR5bmFtaWNFbnVtRXh0ZW5zaW9uXywgb3V0IHVua25vd24pKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNEeW5hbWljRW51bUV4dGVuc2lvbiA9IHRydWU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYodW5rbm93biBpcyBpbnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLk1lcmdlVmFyaW50RmllbGQoMjAwMiwgKHVsb25nKShpbnQpdW5rbm93bik7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjAyNjogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuQ3JlYXRlQnVpbGRlcigpOw0KKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNNZXNzYWdlRXh0ZW5zaW9uKSB7DQorICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKE1lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgTWVzc2FnZUV4dGVuc2lvbiA9IHN1YkJ1aWxkZXIuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjAzNDogew0KKyAgICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLkNyZWF0ZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzRHluYW1pY01lc3NhZ2VFeHRlbnNpb24pIHsNCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oRHluYW1pY01lc3NhZ2VFeHRlbnNpb24pOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgRHluYW1pY01lc3NhZ2VFeHRlbnNpb24gPSBzdWJCdWlsZGVyLkJ1aWxkUGFydGlhbCgpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTYwNDI6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRTdHJpbmdBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEV4dGVuc2lvbl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTYwNTA6DQorICAgICAgICAgICAgY2FzZSAxNjA0ODogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFNJbnQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnBhY2tlZEV4dGVuc2lvbl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1NjYWxhckV4dGVuc2lvbiB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1NjYWxhckV4dGVuc2lvbjsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWludCBTY2FsYXJFeHRlbnNpb24gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5TY2FsYXJFeHRlbnNpb247IH0NCisgICAgICAgIHNldCB7IFNldFNjYWxhckV4dGVuc2lvbih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0U2NhbGFyRXh0ZW5zaW9uKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzU2NhbGFyRXh0ZW5zaW9uID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5zY2FsYXJFeHRlbnNpb25fID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJTY2FsYXJFeHRlbnNpb24oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1NjYWxhckV4dGVuc2lvbiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnNjYWxhckV4dGVuc2lvbl8gPSAwOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc0VudW1FeHRlbnNpb24gew0KKyAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc0VudW1FeHRlbnNpb247IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIEVudW1FeHRlbnNpb24gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5FbnVtRXh0ZW5zaW9uOyB9DQorICAgICAgICBzZXQgeyBTZXRFbnVtRXh0ZW5zaW9uKHZhbHVlKTsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRFbnVtRXh0ZW5zaW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0VudW1FeHRlbnNpb24gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmVudW1FeHRlbnNpb25fID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJFbnVtRXh0ZW5zaW9uKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNFbnVtRXh0ZW5zaW9uID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZW51bUV4dGVuc2lvbl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPTzsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEeW5hbWljRW51bUV4dGVuc2lvbiB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHluYW1pY0VudW1FeHRlbnNpb247IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljRW51bVR5cGUgRHluYW1pY0VudW1FeHRlbnNpb24gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EeW5hbWljRW51bUV4dGVuc2lvbjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHluYW1pY0VudW1FeHRlbnNpb24odmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldER5bmFtaWNFbnVtRXh0ZW5zaW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljRW51bVR5cGUgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzRHluYW1pY0VudW1FeHRlbnNpb24gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LmR5bmFtaWNFbnVtRXh0ZW5zaW9uXyA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHluYW1pY0VudW1FeHRlbnNpb24oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R5bmFtaWNFbnVtRXh0ZW5zaW9uID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZHluYW1pY0VudW1FeHRlbnNpb25fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNFbnVtVHlwZS5EWU5BTUlDX0ZPTzsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNNZXNzYWdlRXh0ZW5zaW9uIHsNCisgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNNZXNzYWdlRXh0ZW5zaW9uOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBNZXNzYWdlRXh0ZW5zaW9uIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuTWVzc2FnZUV4dGVuc2lvbjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0TWVzc2FnZUV4dGVuc2lvbih2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0TWVzc2FnZUV4dGVuc2lvbihnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZUV4dGVuc2lvbiA9IHRydWU7DQorICAgICAgICByZXN1bHQubWVzc2FnZUV4dGVuc2lvbl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRNZXNzYWdlRXh0ZW5zaW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc01lc3NhZ2VFeHRlbnNpb24gPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0Lm1lc3NhZ2VFeHRlbnNpb25fID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VNZXNzYWdlRXh0ZW5zaW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChyZXN1bHQuaGFzTWVzc2FnZUV4dGVuc2lvbiAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5tZXNzYWdlRXh0ZW5zaW9uXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQubWVzc2FnZUV4dGVuc2lvbl8gPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5DcmVhdGVCdWlsZGVyKHJlc3VsdC5tZXNzYWdlRXh0ZW5zaW9uXykuTWVyZ2VGcm9tKHZhbHVlKS5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdC5tZXNzYWdlRXh0ZW5zaW9uXyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc01lc3NhZ2VFeHRlbnNpb24gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyTWVzc2FnZUV4dGVuc2lvbigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzTWVzc2FnZUV4dGVuc2lvbiA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0Lm1lc3NhZ2VFeHRlbnNpb25fID0gbnVsbDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgYm9vbCBIYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbiB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzRHluYW1pY01lc3NhZ2VFeHRlbnNpb247IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljTWVzc2FnZVR5cGUgRHluYW1pY01lc3NhZ2VFeHRlbnNpb24gew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5EeW5hbWljTWVzc2FnZUV4dGVuc2lvbjsgfQ0KKyAgICAgICAgc2V0IHsgU2V0RHluYW1pY01lc3NhZ2VFeHRlbnNpb24odmFsdWUpOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldER5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljTWVzc2FnZVR5cGUgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5keW5hbWljTWVzc2FnZUV4dGVuc2lvbl8gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXREeW5hbWljTWVzc2FnZUV4dGVuc2lvbihnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0RHluYW1pY0V4dGVuc2lvbnMuVHlwZXMuRHluYW1pY01lc3NhZ2VUeXBlLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwoYnVpbGRlckZvclZhbHVlLCAiYnVpbGRlckZvclZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5keW5hbWljTWVzc2FnZUV4dGVuc2lvbl8gPSBidWlsZGVyRm9yVmFsdWUuQnVpbGQoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBNZXJnZUR5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3REeW5hbWljRXh0ZW5zaW9ucy5UeXBlcy5EeW5hbWljTWVzc2FnZVR5cGUgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNEeW5hbWljTWVzc2FnZUV4dGVuc2lvbiAmJg0KKyAgICAgICAgICAgIHJlc3VsdC5keW5hbWljTWVzc2FnZUV4dGVuc2lvbl8gIT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQuZHluYW1pY01lc3NhZ2VFeHRlbnNpb25fID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVGVzdER5bmFtaWNFeHRlbnNpb25zLlR5cGVzLkR5bmFtaWNNZXNzYWdlVHlwZS5DcmVhdGVCdWlsZGVyKHJlc3VsdC5keW5hbWljTWVzc2FnZUV4dGVuc2lvbl8pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuZHluYW1pY01lc3NhZ2VFeHRlbnNpb25fID0gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQuaGFzRHluYW1pY01lc3NhZ2VFeHRlbnNpb24gPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyRHluYW1pY01lc3NhZ2VFeHRlbnNpb24oKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc0R5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uID0gZmFsc2U7DQorICAgICAgICByZXN1bHQuZHluYW1pY01lc3NhZ2VFeHRlbnNpb25fID0gbnVsbDsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHN0cmluZz4gUmVwZWF0ZWRFeHRlbnNpb25MaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkRXh0ZW5zaW9uXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRXh0ZW5zaW9uQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEV4dGVuc2lvbkNvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBzdHJpbmcgR2V0UmVwZWF0ZWRFeHRlbnNpb24oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRXh0ZW5zaW9uKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRFeHRlbnNpb24oaW50IGluZGV4LCBzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRXh0ZW5zaW9uX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEV4dGVuc2lvbihzdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRXh0ZW5zaW9uXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRFeHRlbnNpb24oc2NnOjpJRW51bWVyYWJsZTxzdHJpbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEV4dGVuc2lvbl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEV4dGVuc2lvbigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRFeHRlbnNpb25fLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxpbnQ+IFBhY2tlZEV4dGVuc2lvbkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucGFja2VkRXh0ZW5zaW9uXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFBhY2tlZEV4dGVuc2lvbkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUGFja2VkRXh0ZW5zaW9uQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXRQYWNrZWRFeHRlbnNpb24oaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFBhY2tlZEV4dGVuc2lvbihpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFBhY2tlZEV4dGVuc2lvbihpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5wYWNrZWRFeHRlbnNpb25fW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFBhY2tlZEV4dGVuc2lvbihpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRXh0ZW5zaW9uXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUGFja2VkRXh0ZW5zaW9uKHNjZzo6SUVudW1lcmFibGU8aW50PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRXh0ZW5zaW9uXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclBhY2tlZEV4dGVuc2lvbigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucGFja2VkRXh0ZW5zaW9uXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0RHluYW1pY0V4dGVuc2lvbnMoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8VGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMsIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcygpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX3Rlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJyZXBlYXRlZF9maXhlZDMyIiwgInJlcGVhdGVkX2ZpeGVkNjQiLCAicmVwZWF0ZWRfZmxvYXQiLCAicmVwZWF0ZWRfaW50MzIiLCAicmVwZWF0ZWRfaW50NjQiLCAicmVwZWF0ZWRfdWludDY0IiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3Rlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwMSwgMTYzNjksIDIwOTcxNDEsIDEwNCwgMTYzNzYsIDIwOTcxNDQgfTsNCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXNfX0Rlc2NyaXB0b3I7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHBiOjpGaWVsZEFjY2Vzcy5GaWVsZEFjY2Vzc29yVGFibGU8VGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMsIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzLkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X1Rlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzX19GaWVsZEFjY2Vzc29yVGFibGU7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZpeGVkMzJGaWVsZE51bWJlciA9IDEyOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PHVpbnQ+IHJlcGVhdGVkRml4ZWQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWludD4oKTsNCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHVpbnQ+IFJlcGVhdGVkRml4ZWQzMkxpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRGaXhlZDMyXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IFJlcGVhdGVkRml4ZWQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGaXhlZDMyXy5Db3VudDsgfQ0KKyAgICB9DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgdWludCBHZXRSZXBlYXRlZEZpeGVkMzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRml4ZWQzMl9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW50MzJGaWVsZE51bWJlciA9IDEzOw0KKyAgICBwcml2YXRlIHBiYzo6UG9wc2ljbGVMaXN0PGludD4gcmVwZWF0ZWRJbnQzMl8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8aW50PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxpbnQ+IFJlcGVhdGVkSW50MzJMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KHJlcGVhdGVkSW50MzJfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRJbnQzMkNvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRJbnQzMl8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IEdldFJlcGVhdGVkSW50MzIoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkSW50MzJfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZpeGVkNjRGaWVsZE51bWJlciA9IDIwNDY7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+IHJlcGVhdGVkRml4ZWQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8dWxvbmc+KCk7DQorICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDx1bG9uZz4gUmVwZWF0ZWRGaXhlZDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZEZpeGVkNjRfKTsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVwZWF0ZWRGaXhlZDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEZpeGVkNjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBHZXRSZXBlYXRlZEZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkRml4ZWQ2NF9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW50NjRGaWVsZE51bWJlciA9IDIwNDc7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4gcmVwZWF0ZWRJbnQ2NF8gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8bG9uZz4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8bG9uZz4gUmVwZWF0ZWRJbnQ2NExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRJbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEludDY0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEludDY0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBsb25nIEdldFJlcGVhdGVkSW50NjQoaW50IGluZGV4KSB7DQorICAgICAgcmV0dXJuIHJlcGVhdGVkSW50NjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZsb2F0RmllbGROdW1iZXIgPSAyNjIxNDI7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8ZmxvYXQ+IHJlcGVhdGVkRmxvYXRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PGZsb2F0PigpOw0KKyAgICBwdWJsaWMgc2NnOjpJTGlzdDxmbG9hdD4gUmVwZWF0ZWRGbG9hdExpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiBwYmM6Okxpc3RzLkFzUmVhZE9ubHkocmVwZWF0ZWRGbG9hdF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZEZsb2F0Q291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEZsb2F0Xy5Db3VudDsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBmbG9hdCBHZXRSZXBlYXRlZEZsb2F0KGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXBlYXRlZEZsb2F0X1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRVaW50NjRGaWVsZE51bWJlciA9IDI2MjE0MzsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDx1bG9uZz4gcmVwZWF0ZWRVaW50NjRfID0gbmV3IHBiYzo6UG9wc2ljbGVMaXN0PHVsb25nPigpOw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgcHVibGljIHNjZzo6SUxpc3Q8dWxvbmc+IFJlcGVhdGVkVWludDY0TGlzdCB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHBiYzo6TGlzdHMuQXNSZWFkT25seShyZXBlYXRlZFVpbnQ2NF8pOyB9DQorICAgIH0NCisgICAgcHVibGljIGludCBSZXBlYXRlZFVpbnQ2NENvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRVaW50NjRfLkNvdW50OyB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIHB1YmxpYyB1bG9uZyBHZXRSZXBlYXRlZFVpbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICByZXR1cm4gcmVwZWF0ZWRVaW50NjRfW2luZGV4XTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Rlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzRmllbGROYW1lczsNCisgICAgICBpZiAocmVwZWF0ZWRGaXhlZDMyXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkMzJBcnJheSgxMiwgZmllbGRfbmFtZXNbMF0sIHJlcGVhdGVkRml4ZWQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRJbnQzMl8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMkFycmF5KDEzLCBmaWVsZF9uYW1lc1szXSwgcmVwZWF0ZWRJbnQzMl8pOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVwZWF0ZWRGaXhlZDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkNjRBcnJheSgyMDQ2LCBmaWVsZF9uYW1lc1sxXSwgcmVwZWF0ZWRGaXhlZDY0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZEludDY0Xy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZUludDY0QXJyYXkoMjA0NywgZmllbGRfbmFtZXNbNF0sIHJlcGVhdGVkSW50NjRfKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlcGVhdGVkRmxvYXRfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlRmxvYXRBcnJheSgyNjIxNDIsIGZpZWxkX25hbWVzWzJdLCByZXBlYXRlZEZsb2F0Xyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXBlYXRlZFVpbnQ2NF8uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVVSW50NjRBcnJheSgyNjIxNDMsIGZpZWxkX25hbWVzWzVdLCByZXBlYXRlZFVpbnQ2NF8pOw0KKyAgICAgIH0NCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHJlcGVhdGVkRml4ZWQzMl8uQ291bnQ7DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAxICogcmVwZWF0ZWRGaXhlZDMyXy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKGludCBlbGVtZW50IGluIFJlcGVhdGVkSW50MzJMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAxICogcmVwZWF0ZWRJbnQzMl8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBkYXRhU2l6ZSA9IDggKiByZXBlYXRlZEZpeGVkNjRfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMiAqIHJlcGVhdGVkRml4ZWQ2NF8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGludCBkYXRhU2l6ZSA9IDA7DQorICAgICAgICBmb3JlYWNoIChsb25nIGVsZW1lbnQgaW4gUmVwZWF0ZWRJbnQ2NExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDIgKiByZXBlYXRlZEludDY0Xy5Db3VudDsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGRhdGFTaXplID0gNCAqIHJlcGVhdGVkRmxvYXRfLkNvdW50Ow0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMyAqIHJlcGVhdGVkRmxvYXRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAodWxvbmcgZWxlbWVudCBpbiBSZXBlYXRlZFVpbnQ2NExpc3QpIHsNCisgICAgICAgICAgZGF0YVNpemUgKz0gcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50NjRTaXplTm9UYWcoZWxlbWVudCk7DQorICAgICAgICB9DQorICAgICAgICBzaXplICs9IGRhdGFTaXplOw0KKyAgICAgICAgc2l6ZSArPSAzICogcmVwZWF0ZWRVaW50NjRfLkNvdW50Ow0KKyAgICAgIH0NCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXBlYXRlZEZpeGVkMzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkSW50MzJfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJlcGVhdGVkRml4ZWQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRJbnQ2NF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRGbG9hdF8uTWFrZVJlYWRPbmx5KCk7DQorICAgICAgcmVwZWF0ZWRVaW50NjRfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8VGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5UZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcy5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEZpeGVkMzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQzMl8uQWRkKG90aGVyLnJlcGVhdGVkRml4ZWQzMl8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkSW50MzJfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50MzJfLkFkZChvdGhlci5yZXBlYXRlZEludDMyXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRGaXhlZDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZpeGVkNjRfLkFkZChvdGhlci5yZXBlYXRlZEZpeGVkNjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChvdGhlci5yZXBlYXRlZEludDY0Xy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDY0Xy5BZGQob3RoZXIucmVwZWF0ZWRJbnQ2NF8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG90aGVyLnJlcGVhdGVkRmxvYXRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkRmxvYXRfLkFkZChvdGhlci5yZXBlYXRlZEZsb2F0Xyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIucmVwZWF0ZWRVaW50NjRfLkNvdW50ICE9IDApIHsNCisgICAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDY0Xy5BZGQob3RoZXIucmVwZWF0ZWRVaW50NjRfKTsNCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3Rlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3Rlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDk4Og0KKyAgICAgICAgICAgIGNhc2UgMTAxOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRml4ZWQzMkFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkRml4ZWQzMl8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTA2Og0KKyAgICAgICAgICAgIGNhc2UgMTA0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkSW50MzJBcnJheSh0YWcsIGZpZWxkX25hbWUsIHJlc3VsdC5yZXBlYXRlZEludDMyXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxNjM3MDoNCisgICAgICAgICAgICBjYXNlIDE2MzY5OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkRml4ZWQ2NEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkRml4ZWQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMTYzNzg6DQorICAgICAgICAgICAgY2FzZSAxNjM3Njogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZEludDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRJbnQ2NF8pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgMjA5NzEzODoNCisgICAgICAgICAgICBjYXNlIDIwOTcxNDE6IHsNCisgICAgICAgICAgICAgIGlucHV0LlJlYWRGbG9hdEFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlcGVhdGVkRmxvYXRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDIwOTcxNDY6DQorICAgICAgICAgICAgY2FzZSAyMDk3MTQ0OiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkVUludDY0QXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQucmVwZWF0ZWRVaW50NjRfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVpbnQ+IFJlcGVhdGVkRml4ZWQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRGaXhlZDMyXzsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgaW50IFJlcGVhdGVkRml4ZWQzMkNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRGaXhlZDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIHVpbnQgR2V0UmVwZWF0ZWRGaXhlZDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEZpeGVkMzIoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEZpeGVkMzIoaW50IGluZGV4LCB1aW50IHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQzMl9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRGaXhlZDMyKHVpbnQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRGaXhlZDMyKHNjZzo6SUVudW1lcmFibGU8dWludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQzMl8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEZpeGVkMzIoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGludD4gUmVwZWF0ZWRJbnQzMkxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRJbnQzMl87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEludDMyQ291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEludDMyQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBHZXRSZXBlYXRlZEludDMyKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRSZXBlYXRlZEludDMyKGluZGV4KTsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRJbnQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDMyX1tpbmRleF0gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSZXBlYXRlZEludDMyKGludCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDMyXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRJbnQzMihzY2c6OklFbnVtZXJhYmxlPGludD4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50MzJfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRJbnQzMigpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRJbnQzMl8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PHVsb25nPiBSZXBlYXRlZEZpeGVkNjRMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlcGVhdGVkRml4ZWQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEZpeGVkNjRDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlJlcGVhdGVkRml4ZWQ2NENvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyB1bG9uZyBHZXRSZXBlYXRlZEZpeGVkNjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRml4ZWQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkRml4ZWQ2NChpbnQgaW5kZXgsIHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRGaXhlZDY0KHVsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkRml4ZWQ2NF8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZVJlcGVhdGVkRml4ZWQ2NChzY2c6OklFbnVtZXJhYmxlPHVsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkRml4ZWQ2NCgpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGaXhlZDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8bG9uZz4gUmVwZWF0ZWRJbnQ2NExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRJbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEludDY0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEludDY0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGxvbmcgR2V0UmVwZWF0ZWRJbnQ2NChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0UmVwZWF0ZWRJbnQ2NChpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldFJlcGVhdGVkSW50NjQoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50NjRfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlcGVhdGVkSW50NjQobG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDY0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRJbnQ2NChzY2c6OklFbnVtZXJhYmxlPGxvbmc+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEludDY0Xy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlcGVhdGVkSW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkSW50NjRfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxmbG9hdD4gUmVwZWF0ZWRGbG9hdExpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkucmVwZWF0ZWRGbG9hdF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZEZsb2F0Q291bnQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5SZXBlYXRlZEZsb2F0Q291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGZsb2F0IEdldFJlcGVhdGVkRmxvYXQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkRmxvYXQoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXBlYXRlZEZsb2F0KGludCBpbmRleCwgZmxvYXQgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGbG9hdF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRGbG9hdChmbG9hdCB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0Xy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVwZWF0ZWRGbG9hdChzY2c6OklFbnVtZXJhYmxlPGZsb2F0PiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRGbG9hdF8uQWRkKHZhbHVlcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJSZXBlYXRlZEZsb2F0KCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZEZsb2F0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQ0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8dWxvbmc+IFJlcGVhdGVkVWludDY0TGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5yZXBlYXRlZFVpbnQ2NF87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBSZXBlYXRlZFVpbnQ2NENvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVwZWF0ZWRVaW50NjRDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgICBwdWJsaWMgdWxvbmcgR2V0UmVwZWF0ZWRVaW50NjQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlcGVhdGVkVWludDY0KGluZGV4KTsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVwZWF0ZWRVaW50NjQoaW50IGluZGV4LCB1bG9uZyB2YWx1ZSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXBlYXRlZFVpbnQ2NF9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVwZWF0ZWRVaW50NjQodWxvbmcgdmFsdWUpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50NjRfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VSZXBlYXRlZFVpbnQ2NChzY2c6OklFbnVtZXJhYmxlPHVsb25nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVwZWF0ZWRVaW50NjRfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyUmVwZWF0ZWRVaW50NjQoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlcGVhdGVkVWludDY0Xy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcygpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRm9vUmVxdWVzdCA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlPEZvb1JlcXVlc3QsIEZvb1JlcXVlc3QuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEZvb1JlcXVlc3QoKSB7IH0NCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRm9vUmVxdWVzdCBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgRm9vUmVxdWVzdCgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZm9vUmVxdWVzdEZpZWxkTmFtZXMgPSBuZXcgc3RyaW5nW10geyAgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9mb29SZXF1ZXN0RmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1JlcXVlc3QgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBGb29SZXF1ZXN0IERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZvb1JlcXVlc3QgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXF1ZXN0X19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEZvb1JlcXVlc3QsIEZvb1JlcXVlc3QuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfRm9vUmVxdWVzdF9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9mb29SZXF1ZXN0RmllbGROYW1lczsNCisgICAgICBVbmtub3duRmllbGRzLldyaXRlVG8ob3V0cHV0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgc2l6ZSArPSBVbmtub3duRmllbGRzLlNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVxdWVzdCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXF1ZXN0IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1JlcXVlc3QgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1JlcXVlc3QgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1JlcXVlc3QgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVxdWVzdCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXF1ZXN0IFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1JlcXVlc3QgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVxdWVzdCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXF1ZXN0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIEZvb1JlcXVlc3QgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoRm9vUmVxdWVzdCBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlcjxGb29SZXF1ZXN0LCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihGb29SZXF1ZXN0IGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgRm9vUmVxdWVzdCByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBGb29SZXF1ZXN0IFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgRm9vUmVxdWVzdCBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEZvb1JlcXVlc3QoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEZvb1JlcXVlc3QgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0LkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEZvb1JlcXVlc3QgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuRm9vUmVxdWVzdC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEZvb1JlcXVlc3QgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEZvb1JlcXVlc3QpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoRm9vUmVxdWVzdCkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEZvb1JlcXVlc3Qgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0LkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdGhpcy5NZXJnZVVua25vd25GaWVsZHMob3RoZXIuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcGI6OlVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBudWxsOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfZm9vUmVxdWVzdEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9mb29SZXF1ZXN0RmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgRm9vUmVxdWVzdCgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICB9DQorICB9DQorICANCisgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRm9vUmVzcG9uc2UgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxGb29SZXNwb25zZSwgRm9vUmVzcG9uc2UuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIEZvb1Jlc3BvbnNlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZvb1Jlc3BvbnNlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBGb29SZXNwb25zZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfZm9vUmVzcG9uc2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfZm9vUmVzcG9uc2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgIH07DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVzcG9uc2UgRGVmYXVsdEluc3RhbmNlIHsNCisgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBGb29SZXNwb25zZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBGb29SZXNwb25zZSBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3Igew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0Zvb1Jlc3BvbnNlX19EZXNjcmlwdG9yOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBwYjo6RmllbGRBY2Nlc3MuRmllbGRBY2Nlc3NvclRhYmxlPEZvb1Jlc3BvbnNlLCBGb29SZXNwb25zZS5CdWlsZGVyPiBJbnRlcm5hbEZpZWxkQWNjZXNzb3JzIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9Gb29SZXNwb25zZV9fRmllbGRBY2Nlc3NvclRhYmxlOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9mb29SZXNwb25zZUZpZWxkTmFtZXM7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1Jlc3BvbnNlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1Jlc3BvbnNlIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEZvb1Jlc3BvbnNlIFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBGb29SZXNwb25zZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVzcG9uc2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVzcG9uc2UgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVzcG9uc2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVzcG9uc2UgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgRm9vUmVzcG9uc2UgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgRm9vUmVzcG9uc2UgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoRm9vUmVzcG9uc2UgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8Rm9vUmVzcG9uc2UsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKEZvb1Jlc3BvbnNlIGNsb25lRnJvbSkgew0KKyAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgYm9vbCByZXN1bHRJc1JlYWRPbmx5Ow0KKyAgICAgIHByaXZhdGUgRm9vUmVzcG9uc2UgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgRm9vUmVzcG9uc2UgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBGb29SZXNwb25zZSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgcmVzdWx0ID0gbmV3IEZvb1Jlc3BvbnNlKCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBGb29SZXNwb25zZSBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvckZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvb1Jlc3BvbnNlLkRlc2NyaXB0b3I7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEZvb1Jlc3BvbnNlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkZvb1Jlc3BvbnNlLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgRm9vUmVzcG9uc2UgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIEZvb1Jlc3BvbnNlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEZvb1Jlc3BvbnNlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oRm9vUmVzcG9uc2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Gb29SZXNwb25zZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2Zvb1Jlc3BvbnNlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX2Zvb1Jlc3BvbnNlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoICh0YWcpIHsNCisgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgIHRocm93IHBiOjpJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZFRhZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICBpZiAocGI6OldpcmVGb3JtYXQuSXNFbmRHcm91cFRhZyh0YWcpKSB7DQorICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0LkNyZWF0ZUJ1aWxkZXIodGhpcy5Vbmtub3duRmllbGRzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgIHRoaXMuVW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHMuQnVpbGQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICBzdGF0aWMgRm9vUmVzcG9uc2UoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJhclJlcXVlc3QgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZTxCYXJSZXF1ZXN0LCBCYXJSZXF1ZXN0LkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBCYXJSZXF1ZXN0KCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEJhclJlcXVlc3QgZGVmYXVsdEluc3RhbmNlID0gbmV3IEJhclJlcXVlc3QoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2JhclJlcXVlc3RGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfYmFyUmVxdWVzdEZpZWxkVGFncyA9IG5ldyB1aW50W10geyAgfTsNCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXF1ZXN0IERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQmFyUmVxdWVzdCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBvdmVycmlkZSBCYXJSZXF1ZXN0IFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHBiZDo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQmFyUmVxdWVzdF9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxCYXJSZXF1ZXN0LCBCYXJSZXF1ZXN0LkJ1aWxkZXI+IEludGVybmFsRmllbGRBY2Nlc3NvcnMgew0KKyAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5pbnRlcm5hbF9fc3RhdGljX3Byb3RvYnVmX3VuaXR0ZXN0X0JhclJlcXVlc3RfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfYmFyUmVxdWVzdEZpZWxkTmFtZXM7DQorICAgICAgVW5rbm93bkZpZWxkcy5Xcml0ZVRvKG91dHB1dCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIHNpemUgKz0gVW5rbm93bkZpZWxkcy5TZXJpYWxpemVkU2l6ZTsNCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlcXVlc3QgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVxdWVzdCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXF1ZXN0IFBhcnNlRnJvbShieXRlW10gZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXF1ZXN0IFBhcnNlRnJvbShieXRlW10gZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXF1ZXN0IFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlcXVlc3QgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVxdWVzdCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXF1ZXN0IFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlcXVlc3QgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVxdWVzdCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHJpdmF0ZSBCYXJSZXF1ZXN0IE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKEJhclJlcXVlc3QgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXI8QmFyUmVxdWVzdCwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoQmFyUmVxdWVzdCBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIEJhclJlcXVlc3QgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgQmFyUmVxdWVzdCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIEJhclJlcXVlc3Qgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBCYXJSZXF1ZXN0KCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCYXJSZXF1ZXN0IE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQmFyUmVxdWVzdC5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCYXJSZXF1ZXN0IERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLkJhclJlcXVlc3QuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCYXJSZXF1ZXN0IEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBCYXJSZXF1ZXN0KSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKEJhclJlcXVlc3QpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShCYXJSZXF1ZXN0IG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQmFyUmVxdWVzdC5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHRoaXMuTWVyZ2VVbmtub3duRmllbGRzKG90aGVyLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHBiOjpVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0gbnVsbDsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX2JhclJlcXVlc3RGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfYmFyUmVxdWVzdEZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgc3RhdGljIEJhclJlcXVlc3QoKSB7DQorICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFByb3RvRmlsZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJhclJlc3BvbnNlIDogcGI6OkdlbmVyYXRlZE1lc3NhZ2U8QmFyUmVzcG9uc2UsIEJhclJlc3BvbnNlLkJ1aWxkZXI+IHsNCisgICAgcHJpdmF0ZSBCYXJSZXNwb25zZSgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBCYXJSZXNwb25zZSBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQmFyUmVzcG9uc2UoKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gX2JhclJlc3BvbnNlRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX2JhclJlc3BvbnNlRmllbGRUYWdzID0gbmV3IHVpbnRbXSB7ICB9Ow0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlc3BvbnNlIERlZmF1bHRJbnN0YW5jZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQmFyUmVzcG9uc2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQmFyUmVzcG9uc2UgVGhpc01lc3NhZ2Ugew0KKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgcGJkOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsNCisgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuaW50ZXJuYWxfX3N0YXRpY19wcm90b2J1Zl91bml0dGVzdF9CYXJSZXNwb25zZV9fRGVzY3JpcHRvcjsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGI6OkZpZWxkQWNjZXNzLkZpZWxkQWNjZXNzb3JUYWJsZTxCYXJSZXNwb25zZSwgQmFyUmVzcG9uc2UuQnVpbGRlcj4gSW50ZXJuYWxGaWVsZEFjY2Vzc29ycyB7DQorICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UHJvdG9GaWxlLmludGVybmFsX19zdGF0aWNfcHJvdG9idWZfdW5pdHRlc3RfQmFyUmVzcG9uc2VfX0ZpZWxkQWNjZXNzb3JUYWJsZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfYmFyUmVzcG9uc2VGaWVsZE5hbWVzOw0KKyAgICAgIFVua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICBzaXplICs9IFVua25vd25GaWVsZHMuU2VyaWFsaXplZFNpemU7DQorICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgcmV0dXJuIHNpemU7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXNwb25zZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXNwb25zZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBCYXJSZXNwb25zZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgQmFyUmVzcG9uc2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlc3BvbnNlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlc3BvbnNlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlc3BvbnNlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlc3BvbnNlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlc3BvbnNlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIEJhclJlc3BvbnNlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIEJhclJlc3BvbnNlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKEJhclJlc3BvbnNlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyPEJhclJlc3BvbnNlLCBCdWlsZGVyPiB7DQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEJ1aWxkZXIgVGhpc0J1aWxkZXIgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgaW50ZXJuYWwgQnVpbGRlcihCYXJSZXNwb25zZSBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIEJhclJlc3BvbnNlIHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIEJhclJlc3BvbnNlIFByZXBhcmVCdWlsZGVyKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgQmFyUmVzcG9uc2Ugb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBCYXJSZXNwb25zZSgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQmFyUmVzcG9uc2UgTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCk7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xlYXIoKSB7DQorICAgICAgICByZXN1bHQgPSBEZWZhdWx0SW5zdGFuY2U7DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbG9uZSgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuTWVyZ2VGcm9tKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBwYmQ6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3JGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXNwb25zZS5EZXNjcmlwdG9yOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCYXJSZXNwb25zZSBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5CYXJSZXNwb25zZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJhclJlc3BvbnNlIEJ1aWxkUGFydGlhbCgpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBCYXJSZXNwb25zZSkgew0KKyAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKChCYXJSZXNwb25zZSkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKEJhclJlc3BvbnNlIG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuQmFyUmVzcG9uc2UuRGVmYXVsdEluc3RhbmNlKSByZXR1cm4gdGhpczsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICB0aGlzLk1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5Vbmtub3duRmllbGRzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICBwYjo6VW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcyA9IG51bGw7DQorICAgICAgICB1aW50IHRhZzsNCisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgd2hpbGUgKGlucHV0LlJlYWRUYWcob3V0IHRhZywgb3V0IGZpZWxkX25hbWUpKSB7DQorICAgICAgICAgIGlmKHRhZyA9PSAwICYmIGZpZWxkX25hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9iYXJSZXNwb25zZUZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9iYXJSZXNwb25zZUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGRzID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ3JlYXRlQnVpbGRlcih0aGlzLlVua25vd25GaWVsZHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgdGhpcy5Vbmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5CdWlsZCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzID0gcGI6OlVua25vd25GaWVsZFNldC5DcmVhdGVCdWlsZGVyKHRoaXMuVW5rbm93bkZpZWxkcyk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKHVua25vd25GaWVsZHMgIT0gbnVsbCkgew0KKyAgICAgICAgICB0aGlzLlVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLkJ1aWxkKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgIH0NCisgICAgc3RhdGljIEJhclJlc3BvbnNlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RQcm90b0ZpbGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgI2VuZHJlZ2lvbg0KKyAgDQorICAjcmVnaW9uIFNlcnZpY2VzDQorICAvKg0KKyAgKiBTZXJ2aWNlIGdlbmVyYXRpb24gaXMgbm93IGRpc2FibGVkIGJ5IGRlZmF1bHQsIHVzZSB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBlbmFibGU6DQorICAqIG9wdGlvbiAoZ29vZ2xlLnByb3RvYnVmLmNzaGFycF9maWxlX29wdGlvbnMpLnNlcnZpY2VfZ2VuZXJhdG9yX3R5cGUgPSBHRU5FUklDOw0KKyAgKi8NCisgICNlbmRyZWdpb24NCisgIA0KK30NCisNCisjZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdFJwY0ludGVyb3BMaXRlLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvVGVzdFByb3Rvcy9Vbml0VGVzdFJwY0ludGVyb3BMaXRlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OWZmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvc3JjL1Byb3RvY29sQnVmZmVyc0xpdGUuVGVzdC9UZXN0UHJvdG9zL1VuaXRUZXN0UnBjSW50ZXJvcExpdGUuY3MKQEAgLTAsMCArMSwxMzk1IEBACisvLyBHZW5lcmF0ZWQgYnkgUHJvdG9HZW4sIFZlcnNpb249Mi40LjEuNTU1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTU1ZjcxMjUyMzRiZWI1ODkuICBETyBOT1QgRURJVCENCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxDQorI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KKw0KK3VzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzOw0KK3VzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5Db2xsZWN0aW9uczsNCit1c2luZyBwYmQgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuRGVzY3JpcHRvcnM7DQordXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zIHsNCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBVbml0VGVzdFJwY0ludGVyb3BMaXRlIHsNCisgIA0KKyAgICAjcmVnaW9uIEV4dGVuc2lvbiByZWdpc3RyYXRpb24NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gU3RhdGljIHZhcmlhYmxlcw0KKyAgICAjZW5kcmVnaW9uDQorICAgICNyZWdpb24gRXh0ZW5zaW9ucw0KKyAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgb2JqZWN0IERlc2NyaXB0b3I7DQorICAgIHN0YXRpYyBVbml0VGVzdFJwY0ludGVyb3BMaXRlKCkgew0KKyAgICAgIERlc2NyaXB0b3IgPSBudWxsOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICB9DQorICAjcmVnaW9uIE1lc3NhZ2VzDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFNlYXJjaFJlcXVlc3QgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZUxpdGU8U2VhcmNoUmVxdWVzdCwgU2VhcmNoUmVxdWVzdC5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgU2VhcmNoUmVxdWVzdCgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTZWFyY2hSZXF1ZXN0IGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTZWFyY2hSZXF1ZXN0KCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9zZWFyY2hSZXF1ZXN0RmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJDcml0ZXJpYSIgfTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdWludFtdIF9zZWFyY2hSZXF1ZXN0RmllbGRUYWdzID0gbmV3IHVpbnRbXSB7IDEwIH07DQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVxdWVzdCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFNlYXJjaFJlcXVlc3QgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU2VhcmNoUmVxdWVzdCBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBDcml0ZXJpYUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+IGNyaXRlcmlhXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gQ3JpdGVyaWFMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KGNyaXRlcmlhXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IENyaXRlcmlhQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBjcml0ZXJpYV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEdldENyaXRlcmlhKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBjcml0ZXJpYV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVRvKHBiOjpJQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7DQorICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgc3RyaW5nW10gZmllbGRfbmFtZXMgPSBfc2VhcmNoUmVxdWVzdEZpZWxkTmFtZXM7DQorICAgICAgaWYgKGNyaXRlcmlhXy5Db3VudCA+IDApIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZ0FycmF5KDEsIGZpZWxkX25hbWVzWzBdLCBjcml0ZXJpYV8pOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOw0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICBnZXQgew0KKyAgICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgcmV0dXJuIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBpbnQgQ2FsY1NlcmlhbGl6ZWRTaXplKCkgew0KKyAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgDQorICAgICAgc2l6ZSA9IDA7DQorICAgICAgew0KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsNCisgICAgICAgIGZvcmVhY2ggKHN0cmluZyBlbGVtZW50IGluIENyaXRlcmlhTGlzdCkgew0KKyAgICAgICAgICBkYXRhU2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhlbGVtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUgKz0gZGF0YVNpemU7DQorICAgICAgICBzaXplICs9IDEgKiBjcml0ZXJpYV8uQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgICNyZWdpb24gTGl0ZSBydW50aW1lIG1ldGhvZHMNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsNCisgICAgICBpbnQgaGFzaCA9IEdldFR5cGUoKS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2goc3RyaW5nIGkgaW4gY3JpdGVyaWFfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgcmV0dXJuIGhhc2g7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKSB7DQorICAgICAgU2VhcmNoUmVxdWVzdCBvdGhlciA9IG9iaiBhcyBTZWFyY2hSZXF1ZXN0Ow0KKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYoY3JpdGVyaWFfLkNvdW50ICE9IG90aGVyLmNyaXRlcmlhXy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCBjcml0ZXJpYV8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighY3JpdGVyaWFfW2l4XS5FcXVhbHMob3RoZXIuY3JpdGVyaWFfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUHJpbnRUbyhnbG9iYWw6OlN5c3RlbS5JTy5UZXh0V3JpdGVyIHdyaXRlcikgew0KKyAgICAgIFByaW50RmllbGQoIkNyaXRlcmlhIiwgY3JpdGVyaWFfLCB3cml0ZXIpOw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVxdWVzdCBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZWFyY2hSZXF1ZXN0IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlcXVlc3QgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlcXVlc3QgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlcXVlc3QgUGFyc2VGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVxdWVzdCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZWFyY2hSZXF1ZXN0IFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlcXVlc3QgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVxdWVzdCBQYXJzZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZWFyY2hSZXF1ZXN0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFNlYXJjaFJlcXVlc3QgTWFrZVJlYWRPbmx5KCkgew0KKyAgICAgIGNyaXRlcmlhXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFNlYXJjaFJlcXVlc3QgcHJvdG90eXBlKSB7DQorICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCdWlsZGVyIDogcGI6OkdlbmVyYXRlZEJ1aWxkZXJMaXRlPFNlYXJjaFJlcXVlc3QsIEJ1aWxkZXI+IHsNCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgQnVpbGRlciBUaGlzQnVpbGRlciB7DQorICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBpbnRlcm5hbCBCdWlsZGVyKFNlYXJjaFJlcXVlc3QgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBTZWFyY2hSZXF1ZXN0IHJlc3VsdDsNCisgICAgICANCisgICAgICBwcml2YXRlIFNlYXJjaFJlcXVlc3QgUHJlcGFyZUJ1aWxkZXIoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICBTZWFyY2hSZXF1ZXN0IG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgU2VhcmNoUmVxdWVzdCgpOw0KKyAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgIE1lcmdlRnJvbShvcmlnaW5hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuSXNJbml0aWFsaXplZDsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU2VhcmNoUmVxdWVzdCBNZXNzYWdlQmVpbmdCdWlsdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDbGVhcigpIHsNCisgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsb25lKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHJlc3VsdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNlYXJjaFJlcXVlc3QgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVxdWVzdC5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIFNlYXJjaFJlcXVlc3QgQnVpbGRQYXJ0aWFsKCkgew0KKyAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5NYWtlUmVhZE9ubHkoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJTWVzc2FnZUxpdGUgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciBpcyBTZWFyY2hSZXF1ZXN0KSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFNlYXJjaFJlcXVlc3QpIG90aGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJhc2UuTWVyZ2VGcm9tKG90aGVyKTsNCisgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShTZWFyY2hSZXF1ZXN0IG90aGVyKSB7DQorICAgICAgICBpZiAob3RoZXIgPT0gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVxdWVzdC5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5jcml0ZXJpYV8uQ291bnQgIT0gMCkgew0KKyAgICAgICAgICByZXN1bHQuY3JpdGVyaWFfLkFkZChvdGhlci5jcml0ZXJpYV8pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3NlYXJjaFJlcXVlc3RGaWVsZE5hbWVzLCBmaWVsZF9uYW1lLCBnbG9iYWw6OlN5c3RlbS5TdHJpbmdDb21wYXJlci5PcmRpbmFsKTsNCisgICAgICAgICAgICBpZihmaWVsZF9vcmRpbmFsID49IDApDQorICAgICAgICAgICAgICB0YWcgPSBfc2VhcmNoUmVxdWVzdEZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgdGhyb3cgcGI6OkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5JbnZhbGlkVGFnKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgIGlmIChwYjo6V2lyZUZvcm1hdC5Jc0VuZEdyb3VwVGFnKHRhZykpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBQYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZywgZmllbGRfbmFtZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZFN0cmluZ0FycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LmNyaXRlcmlhXyk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBwYmM6OklQb3BzaWNsZUxpc3Q8c3RyaW5nPiBDcml0ZXJpYUxpc3Qgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIFByZXBhcmVCdWlsZGVyKCkuY3JpdGVyaWFfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgQ3JpdGVyaWFDb3VudCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LkNyaXRlcmlhQ291bnQ7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIHN0cmluZyBHZXRDcml0ZXJpYShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHQuR2V0Q3JpdGVyaWEoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRDcml0ZXJpYShpbnQgaW5kZXgsIHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuY3JpdGVyaWFfW2luZGV4XSA9IHZhbHVlOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZENyaXRlcmlhKHN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuY3JpdGVyaWFfLkFkZCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmFuZ2VDcml0ZXJpYShzY2c6OklFbnVtZXJhYmxlPHN0cmluZz4gdmFsdWVzKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmNyaXRlcmlhXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhckNyaXRlcmlhKCkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5jcml0ZXJpYV8uQ2xlYXIoKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBzdGF0aWMgU2VhcmNoUmVxdWVzdCgpIHsNCisgICAgICBvYmplY3QuUmVmZXJlbmNlRXF1YWxzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlVuaXRUZXN0UnBjSW50ZXJvcExpdGUuRGVzY3JpcHRvciwgbnVsbCk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBTZWFyY2hSZXNwb25zZSA6IHBiOjpHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxTZWFyY2hSZXNwb25zZSwgU2VhcmNoUmVzcG9uc2UuQnVpbGRlcj4gew0KKyAgICBwcml2YXRlIFNlYXJjaFJlc3BvbnNlKCkgeyB9DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNlYXJjaFJlc3BvbnNlIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBTZWFyY2hSZXNwb25zZSgpLk1ha2VSZWFkT25seSgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBfc2VhcmNoUmVzcG9uc2VGaWVsZE5hbWVzID0gbmV3IHN0cmluZ1tdIHsgInJlc3VsdHMiIH07DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfc2VhcmNoUmVzcG9uc2VGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAgfTsNCisgICAgcHVibGljIHN0YXRpYyBTZWFyY2hSZXNwb25zZSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFNlYXJjaFJlc3BvbnNlIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgIGdldCB7IHJldHVybiBEZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNlYXJjaFJlc3BvbnNlIFRoaXNNZXNzYWdlIHsNCisgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICB9DQorICAgIA0KKyAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcw0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgew0KKyAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFJlc3VsdEl0ZW0gOiBwYjo6R2VuZXJhdGVkTWVzc2FnZUxpdGU8UmVzdWx0SXRlbSwgUmVzdWx0SXRlbS5CdWlsZGVyPiB7DQorICAgICAgICBwcml2YXRlIFJlc3VsdEl0ZW0oKSB7IH0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJlc3VsdEl0ZW0gZGVmYXVsdEluc3RhbmNlID0gbmV3IFJlc3VsdEl0ZW0oKS5NYWtlUmVhZE9ubHkoKTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9yZXN1bHRJdGVtRmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJuYW1lIiwgInVybCIgfTsNCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBfcmVzdWx0SXRlbUZpZWxkVGFncyA9IG5ldyB1aW50W10geyAxOCwgMTAgfTsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0SXRlbSBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBSZXN1bHRJdGVtIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBSZXN1bHRJdGVtIFRoaXNNZXNzYWdlIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBVcmxGaWVsZE51bWJlciA9IDE7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzVXJsOw0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgdXJsXyA9ICIiOw0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzVXJsIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc1VybDsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0cmluZyBVcmwgew0KKyAgICAgICAgICBnZXQgeyByZXR1cm4gdXJsXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IE5hbWVGaWVsZE51bWJlciA9IDI7DQorICAgICAgICBwcml2YXRlIGJvb2wgaGFzTmFtZTsNCisgICAgICAgIHByaXZhdGUgc3RyaW5nIG5hbWVfID0gIiI7DQorICAgICAgICBwdWJsaWMgYm9vbCBIYXNOYW1lIHsNCisgICAgICAgICAgZ2V0IHsgcmV0dXJuIGhhc05hbWU7IH0NCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7DQorICAgICAgICAgIGdldCB7IHJldHVybiBuYW1lXzsgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpZiAoIWhhc1VybCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICAgICAgQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3Jlc3VsdEl0ZW1GaWVsZE5hbWVzOw0KKyAgICAgICAgICBpZiAoaGFzVXJsKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDEsIGZpZWxkX25hbWVzWzFdLCBVcmwpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNOYW1lKSB7DQorICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKDIsIGZpZWxkX25hbWVzWzBdLCBOYW1lKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFNlcmlhbGl6ZWRTaXplIHsNCisgICAgICAgICAgZ2V0IHsNCisgICAgICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgICAgICANCisgICAgICAgICAgc2l6ZSA9IDA7DQorICAgICAgICAgIGlmIChoYXNVcmwpIHsNCisgICAgICAgICAgICBzaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZSgxLCBVcmwpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChoYXNOYW1lKSB7DQorICAgICAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoMiwgTmFtZSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7DQorICAgICAgICAgIHJldHVybiBzaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgI3JlZ2lvbiBMaXRlIHJ1bnRpbWUgbWV0aG9kcw0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsNCisgICAgICAgICAgaW50IGhhc2ggPSBHZXRUeXBlKCkuR2V0SGFzaENvZGUoKTsNCisgICAgICAgICAgaWYgKGhhc1VybCkgaGFzaCBePSB1cmxfLkdldEhhc2hDb2RlKCk7DQorICAgICAgICAgIGlmIChoYXNOYW1lKSBoYXNoIF49IG5hbWVfLkdldEhhc2hDb2RlKCk7DQorICAgICAgICAgIHJldHVybiBoYXNoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikgew0KKyAgICAgICAgICBSZXN1bHRJdGVtIG90aGVyID0gb2JqIGFzIFJlc3VsdEl0ZW07DQorICAgICAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7DQorICAgICAgICAgIGlmIChoYXNVcmwgIT0gb3RoZXIuaGFzVXJsIHx8IChoYXNVcmwgJiYgIXVybF8uRXF1YWxzKG90aGVyLnVybF8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICBpZiAoaGFzTmFtZSAhPSBvdGhlci5oYXNOYW1lIHx8IChoYXNOYW1lICYmICFuYW1lXy5FcXVhbHMob3RoZXIubmFtZV8pKSkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUHJpbnRUbyhnbG9iYWw6OlN5c3RlbS5JTy5UZXh0V3JpdGVyIHdyaXRlcikgew0KKyAgICAgICAgICBQcmludEZpZWxkKCJ1cmwiLCBoYXNVcmwsIHVybF8sIHdyaXRlcik7DQorICAgICAgICAgIFByaW50RmllbGQoIm5hbWUiLCBoYXNOYW1lLCBuYW1lXywgd3JpdGVyKTsNCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXN1bHRJdGVtIFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlc3VsdEl0ZW0gUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0SXRlbSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0SXRlbSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0SXRlbSBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXN1bHRJdGVtIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlc3VsdEl0ZW0gUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0SXRlbSBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgcmV0dXJuIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5CdWlsZFBhcnNlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBSZXN1bHRJdGVtIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgICAgICB9DQorICAgICAgICBwdWJsaWMgc3RhdGljIFJlc3VsdEl0ZW0gUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHByaXZhdGUgUmVzdWx0SXRlbSBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENyZWF0ZUJ1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3IEJ1aWxkZXIoKTsgfQ0KKyAgICAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoUmVzdWx0SXRlbSBwcm90b3R5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3RvdHlwZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyTGl0ZTxSZXN1bHRJdGVtLCBCdWlsZGVyPiB7DQorICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpczsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKFJlc3VsdEl0ZW0gY2xvbmVGcm9tKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gY2xvbmVGcm9tOw0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICAgICAgcHJpdmF0ZSBSZXN1bHRJdGVtIHJlc3VsdDsNCisgICAgICAgICAgDQorICAgICAgICAgIHByaXZhdGUgUmVzdWx0SXRlbSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICAgICAgUmVzdWx0SXRlbSBvcmlnaW5hbCA9IHJlc3VsdDsNCisgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZXN1bHRJdGVtKCk7DQorICAgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gZmFsc2U7DQorICAgICAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0luaXRpYWxpemVkIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFJlc3VsdEl0ZW0gTWVzc2FnZUJlaW5nQnVpbHQgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IERlZmF1bHRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXN1bHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5NZXJnZUZyb20ocmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBSZXN1bHRJdGVtIERlZmF1bHRJbnN0YW5jZUZvclR5cGUgew0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtLkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmVzdWx0SXRlbSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdElzUmVhZE9ubHkpIHsNCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuTWFrZVJlYWRPbmx5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SU1lc3NhZ2VMaXRlIG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGlzIFJlc3VsdEl0ZW0pIHsNCisgICAgICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFJlc3VsdEl0ZW0pIG90aGVyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oUmVzdWx0SXRlbSBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtLkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICBpZiAob3RoZXIuSGFzVXJsKSB7DQorICAgICAgICAgICAgICBVcmwgPSBvdGhlci5Vcmw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChvdGhlci5IYXNOYW1lKSB7DQorICAgICAgICAgICAgICBOYW1lID0gb3RoZXIuTmFtZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgICAgICByZXR1cm4gTWVyZ2VGcm9tKGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkuRW1wdHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklDb2RlZElucHV0U3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lOw0KKyAgICAgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGludCBmaWVsZF9vcmRpbmFsID0gZ2xvYmFsOjpTeXN0ZW0uQXJyYXkuQmluYXJ5U2VhcmNoKF9yZXN1bHRJdGVtRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgICAgICB0YWcgPSBfcmVzdWx0SXRlbUZpZWxkVGFnc1tmaWVsZF9vcmRpbmFsXTsNCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBzd2l0Y2ggKHRhZykgew0KKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc1VybCA9IGlucHV0LlJlYWRTdHJpbmcocmVmIHJlc3VsdC51cmxfKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDE4OiB7DQorICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc05hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKHJlZiByZXN1bHQubmFtZV8pOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzVXJsIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lmhhc1VybDsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBzdHJpbmcgVXJsIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LlVybDsgfQ0KKyAgICAgICAgICAgIHNldCB7IFNldFVybCh2YWx1ZSk7IH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBTZXRVcmwoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNVcmwgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlc3VsdC51cmxfID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJVcmwoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzVXJsID0gZmFsc2U7DQorICAgICAgICAgICAgcmVzdWx0LnVybF8gPSAiIjsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgcHVibGljIGJvb2wgSGFzTmFtZSB7DQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5oYXNOYW1lOyB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsNCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Lk5hbWU7IH0NCisgICAgICAgICAgICBzZXQgeyBTZXROYW1lKHZhbHVlKTsgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIFNldE5hbWUoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgICAgIHJlc3VsdC5oYXNOYW1lID0gdHJ1ZTsNCisgICAgICAgICAgICByZXN1bHQubmFtZV8gPSB2YWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhck5hbWUoKSB7DQorICAgICAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgICAgICByZXN1bHQuaGFzTmFtZSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJlc3VsdC5uYW1lXyA9ICIiOw0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0aWMgUmVzdWx0SXRlbSgpIHsNCisgICAgICAgICAgb2JqZWN0LlJlZmVyZW5jZUVxdWFscyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5Vbml0VGVzdFJwY0ludGVyb3BMaXRlLkRlc2NyaXB0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFJlc3VsdHNGaWVsZE51bWJlciA9IDE7DQorICAgIHByaXZhdGUgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuVHlwZXMuUmVzdWx0SXRlbT4gcmVzdWx0c18gPSBuZXcgcGJjOjpQb3BzaWNsZUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuVHlwZXMuUmVzdWx0SXRlbT4oKTsNCisgICAgcHVibGljIHNjZzo6SUxpc3Q8Z2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuVHlwZXMuUmVzdWx0SXRlbT4gUmVzdWx0c0xpc3Qgew0KKyAgICAgIGdldCB7IHJldHVybiByZXN1bHRzXzsgfQ0KKyAgICB9DQorICAgIHB1YmxpYyBpbnQgUmVzdWx0c0NvdW50IHsNCisgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0c18uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuVHlwZXMuUmVzdWx0SXRlbSBHZXRSZXN1bHRzKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiByZXN1bHRzX1tpbmRleF07DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgIGdldCB7DQorICAgICAgICBmb3JlYWNoIChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtIGVsZW1lbnQgaW4gUmVzdWx0c0xpc3QpIHsNCisgICAgICAgICAgaWYgKCFlbGVtZW50LklzSW5pdGlhbGl6ZWQpIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVUbyhwYjo6SUNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgew0KKyAgICAgIENhbGNTZXJpYWxpemVkU2l6ZSgpOw0KKyAgICAgIHN0cmluZ1tdIGZpZWxkX25hbWVzID0gX3NlYXJjaFJlc3BvbnNlRmllbGROYW1lczsNCisgICAgICBpZiAocmVzdWx0c18uQ291bnQgPiAwKSB7DQorICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlQXJyYXkoMSwgZmllbGRfbmFtZXNbMF0sIHJlc3VsdHNfKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBTZXJpYWxpemVkU2l6ZSB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsNCisgICAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICAgIHJldHVybiBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IENhbGNTZXJpYWxpemVkU2l6ZSgpIHsNCisgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOw0KKyAgICAgIA0KKyAgICAgIHNpemUgPSAwOw0KKyAgICAgIGZvcmVhY2ggKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLlR5cGVzLlJlc3VsdEl0ZW0gZWxlbWVudCBpbiBSZXN1bHRzTGlzdCkgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDEsIGVsZW1lbnQpOw0KKyAgICAgIH0NCisgICAgICBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gc2l6ZTsNCisgICAgfQ0KKyAgICAjcmVnaW9uIExpdGUgcnVudGltZSBtZXRob2RzDQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7DQorICAgICAgaW50IGhhc2ggPSBHZXRUeXBlKCkuR2V0SGFzaENvZGUoKTsNCisgICAgICBmb3JlYWNoKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLlR5cGVzLlJlc3VsdEl0ZW0gaSBpbiByZXN1bHRzXykNCisgICAgICAgIGhhc2ggXj0gaS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIHJldHVybiBoYXNoOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikgew0KKyAgICAgIFNlYXJjaFJlc3BvbnNlIG90aGVyID0gb2JqIGFzIFNlYXJjaFJlc3BvbnNlOw0KKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYocmVzdWx0c18uQ291bnQgIT0gb3RoZXIucmVzdWx0c18uQ291bnQpIHJldHVybiBmYWxzZTsNCisgICAgICBmb3IoaW50IGl4PTA7IGl4IDwgcmVzdWx0c18uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighcmVzdWx0c19baXhdLkVxdWFscyhvdGhlci5yZXN1bHRzX1tpeF0pKSByZXR1cm4gZmFsc2U7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFByaW50VG8oZ2xvYmFsOjpTeXN0ZW0uSU8uVGV4dFdyaXRlciB3cml0ZXIpIHsNCisgICAgICBQcmludEZpZWxkKCJyZXN1bHRzIiwgcmVzdWx0c18sIHdyaXRlcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBTZWFyY2hSZXNwb25zZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZWFyY2hSZXNwb25zZSBQYXJzZUZyb20ocGI6OkJ5dGVTdHJpbmcgZGF0YSwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBTZWFyY2hSZXNwb25zZSBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgU2VhcmNoUmVzcG9uc2UgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlc3BvbnNlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlc3BvbnNlIFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlc3BvbnNlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlc3BvbnNlIFBhcnNlRGVsaW1pdGVkRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlc3BvbnNlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFNlYXJjaFJlc3BvbnNlIFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwcml2YXRlIFNlYXJjaFJlc3BvbnNlIE1ha2VSZWFkT25seSgpIHsNCisgICAgICByZXN1bHRzXy5NYWtlUmVhZE9ubHkoKTsNCisgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIFRvQnVpbGRlcigpIHsgcmV0dXJuIENyZWF0ZUJ1aWxkZXIodGhpcyk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXcgQnVpbGRlcigpOyB9DQorICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBDcmVhdGVCdWlsZGVyKFNlYXJjaFJlc3BvbnNlIHByb3RvdHlwZSkgew0KKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQnVpbGRlciA6IHBiOjpHZW5lcmF0ZWRCdWlsZGVyTGl0ZTxTZWFyY2hSZXNwb25zZSwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoU2VhcmNoUmVzcG9uc2UgY2xvbmVGcm9tKSB7DQorICAgICAgICByZXN1bHQgPSBjbG9uZUZyb207DQorICAgICAgICByZXN1bHRJc1JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBib29sIHJlc3VsdElzUmVhZE9ubHk7DQorICAgICAgcHJpdmF0ZSBTZWFyY2hSZXNwb25zZSByZXN1bHQ7DQorICAgICAgDQorICAgICAgcHJpdmF0ZSBTZWFyY2hSZXNwb25zZSBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFNlYXJjaFJlc3BvbnNlIG9yaWdpbmFsID0gcmVzdWx0Ow0KKyAgICAgICAgICByZXN1bHQgPSBuZXcgU2VhcmNoUmVzcG9uc2UoKTsNCisgICAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IGZhbHNlOw0KKyAgICAgICAgICBNZXJnZUZyb20ob3JpZ2luYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gcmVzdWx0LklzSW5pdGlhbGl6ZWQ7IH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFNlYXJjaFJlc3BvbnNlIE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgU2VhcmNoUmVzcG9uc2UgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuRGVmYXVsdEluc3RhbmNlOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBTZWFyY2hSZXNwb25zZSBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlTGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFNlYXJjaFJlc3BvbnNlKSB7DQorICAgICAgICAgIHJldHVybiBNZXJnZUZyb20oKFNlYXJjaFJlc3BvbnNlKSBvdGhlcik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiYXNlLk1lcmdlRnJvbShvdGhlcik7DQorICAgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20oU2VhcmNoUmVzcG9uc2Ugb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5EZWZhdWx0SW5zdGFuY2UpIHJldHVybiB0aGlzOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIGlmIChvdGhlci5yZXN1bHRzXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5yZXN1bHRzXy5BZGQob3RoZXIucmVzdWx0c18pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICAgIHJldHVybiBNZXJnZUZyb20oaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeS5FbXB0eSk7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIE1lcmdlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHVpbnQgdGFnOw0KKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWU7DQorICAgICAgICB3aGlsZSAoaW5wdXQuUmVhZFRhZyhvdXQgdGFnLCBvdXQgZmllbGRfbmFtZSkpIHsNCisgICAgICAgICAgaWYodGFnID09IDAgJiYgZmllbGRfbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaW50IGZpZWxkX29yZGluYWwgPSBnbG9iYWw6OlN5c3RlbS5BcnJheS5CaW5hcnlTZWFyY2goX3NlYXJjaFJlc3BvbnNlRmllbGROYW1lcywgZmllbGRfbmFtZSwgZ2xvYmFsOjpTeXN0ZW0uU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7DQorICAgICAgICAgICAgaWYoZmllbGRfb3JkaW5hbCA+PSAwKQ0KKyAgICAgICAgICAgICAgdGFnID0gX3NlYXJjaFJlc3BvbnNlRmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZUFycmF5KHRhZywgZmllbGRfbmFtZSwgcmVzdWx0LnJlc3VsdHNfLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtLkRlZmF1bHRJbnN0YW5jZSwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICANCisgICAgICBwdWJsaWMgcGJjOjpJUG9wc2ljbGVMaXN0PGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLlR5cGVzLlJlc3VsdEl0ZW0+IFJlc3VsdHNMaXN0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpLnJlc3VsdHNfOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBpbnQgUmVzdWx0c0NvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuUmVzdWx0c0NvdW50OyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtIEdldFJlc3VsdHMoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LkdldFJlc3VsdHMoaW5kZXgpOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRSZXN1bHRzKGludCBpbmRleCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuVHlwZXMuUmVzdWx0SXRlbSB2YWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHZhbHVlLCAidmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVzdWx0c19baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UmVzdWx0cyhpbnQgaW5kZXgsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLlR5cGVzLlJlc3VsdEl0ZW0uQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQucmVzdWx0c19baW5kZXhdID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkUmVzdWx0cyhnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5UeXBlcy5SZXN1bHRJdGVtIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXN1bHRzXy5BZGQodmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJlc3VsdHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuVHlwZXMuUmVzdWx0SXRlbS5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKGJ1aWxkZXJGb3JWYWx1ZSwgImJ1aWxkZXJGb3JWYWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXN1bHRzXy5BZGQoYnVpbGRlckZvclZhbHVlLkJ1aWxkKCkpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIEFkZFJhbmdlUmVzdWx0cyhzY2c6OklFbnVtZXJhYmxlPGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLlR5cGVzLlJlc3VsdEl0ZW0+IHZhbHVlcykgew0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5yZXN1bHRzXy5BZGQodmFsdWVzKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBDbGVhclJlc3VsdHMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LnJlc3VsdHNfLkNsZWFyKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgIH0NCisgICAgc3RhdGljIFNlYXJjaFJlc3BvbnNlKCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RScGNJbnRlcm9wTGl0ZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFJlZmluZVNlYXJjaFJlcXVlc3QgOiBwYjo6R2VuZXJhdGVkTWVzc2FnZUxpdGU8UmVmaW5lU2VhcmNoUmVxdWVzdCwgUmVmaW5lU2VhcmNoUmVxdWVzdC5CdWlsZGVyPiB7DQorICAgIHByaXZhdGUgUmVmaW5lU2VhcmNoUmVxdWVzdCgpIHsgfQ0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSZWZpbmVTZWFyY2hSZXF1ZXN0IGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBSZWZpbmVTZWFyY2hSZXF1ZXN0KCkuTWFrZVJlYWRPbmx5KCk7DQorICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIF9yZWZpbmVTZWFyY2hSZXF1ZXN0RmllbGROYW1lcyA9IG5ldyBzdHJpbmdbXSB7ICJDcml0ZXJpYSIsICJwcmV2aW91c19yZXN1bHRzIiB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB1aW50W10gX3JlZmluZVNlYXJjaFJlcXVlc3RGaWVsZFRhZ3MgPSBuZXcgdWludFtdIHsgMTAsIDE4IH07DQorICAgIHB1YmxpYyBzdGF0aWMgUmVmaW5lU2VhcmNoUmVxdWVzdCBEZWZhdWx0SW5zdGFuY2Ugew0KKyAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIFJlZmluZVNlYXJjaFJlcXVlc3QgRGVmYXVsdEluc3RhbmNlRm9yVHlwZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIERlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgUmVmaW5lU2VhcmNoUmVxdWVzdCBUaGlzTWVzc2FnZSB7DQorICAgICAgZ2V0IHsgcmV0dXJuIHRoaXM7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGNvbnN0IGludCBDcml0ZXJpYUZpZWxkTnVtYmVyID0gMTsNCisgICAgcHJpdmF0ZSBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+IGNyaXRlcmlhXyA9IG5ldyBwYmM6OlBvcHNpY2xlTGlzdDxzdHJpbmc+KCk7DQorICAgIHB1YmxpYyBzY2c6OklMaXN0PHN0cmluZz4gQ3JpdGVyaWFMaXN0IHsNCisgICAgICBnZXQgeyByZXR1cm4gcGJjOjpMaXN0cy5Bc1JlYWRPbmx5KGNyaXRlcmlhXyk7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IENyaXRlcmlhQ291bnQgew0KKyAgICAgIGdldCB7IHJldHVybiBjcml0ZXJpYV8uQ291bnQ7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgc3RyaW5nIEdldENyaXRlcmlhKGludCBpbmRleCkgew0KKyAgICAgIHJldHVybiBjcml0ZXJpYV9baW5kZXhdOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgY29uc3QgaW50IFByZXZpb3VzUmVzdWx0c0ZpZWxkTnVtYmVyID0gMjsNCisgICAgcHJpdmF0ZSBib29sIGhhc1ByZXZpb3VzUmVzdWx0czsNCisgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZSBwcmV2aW91c1Jlc3VsdHNfOw0KKyAgICBwdWJsaWMgYm9vbCBIYXNQcmV2aW91c1Jlc3VsdHMgew0KKyAgICAgIGdldCB7IHJldHVybiBoYXNQcmV2aW91c1Jlc3VsdHM7IH0NCisgICAgfQ0KKyAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UgUHJldmlvdXNSZXN1bHRzIHsNCisgICAgICBnZXQgeyByZXR1cm4gcHJldmlvdXNSZXN1bHRzXyA/PyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5EZWZhdWx0SW5zdGFuY2U7IH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNJbml0aWFsaXplZCB7DQorICAgICAgZ2V0IHsNCisgICAgICAgIGlmICghaGFzUHJldmlvdXNSZXN1bHRzKSByZXR1cm4gZmFsc2U7DQorICAgICAgICBpZiAoIVByZXZpb3VzUmVzdWx0cy5Jc0luaXRpYWxpemVkKSByZXR1cm4gZmFsc2U7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlVG8ocGI6OklDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsNCisgICAgICBDYWxjU2VyaWFsaXplZFNpemUoKTsNCisgICAgICBzdHJpbmdbXSBmaWVsZF9uYW1lcyA9IF9yZWZpbmVTZWFyY2hSZXF1ZXN0RmllbGROYW1lczsNCisgICAgICBpZiAoY3JpdGVyaWFfLkNvdW50ID4gMCkgew0KKyAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nQXJyYXkoMSwgZmllbGRfbmFtZXNbMF0sIGNyaXRlcmlhXyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChoYXNQcmV2aW91c1Jlc3VsdHMpIHsNCisgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoMiwgZmllbGRfbmFtZXNbMV0sIFByZXZpb3VzUmVzdWx0cyk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBtZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7DQorICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgU2VyaWFsaXplZFNpemUgew0KKyAgICAgIGdldCB7DQorICAgICAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2VyaWFsaXplZFNpemU7DQorICAgICAgICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7DQorICAgICAgICByZXR1cm4gQ2FsY1NlcmlhbGl6ZWRTaXplKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBDYWxjU2VyaWFsaXplZFNpemUoKSB7DQorICAgICAgaW50IHNpemUgPSBtZW1vaXplZFNlcmlhbGl6ZWRTaXplOw0KKyAgICAgIGlmIChzaXplICE9IC0xKSByZXR1cm4gc2l6ZTsNCisgICAgICANCisgICAgICBzaXplID0gMDsNCisgICAgICB7DQorICAgICAgICBpbnQgZGF0YVNpemUgPSAwOw0KKyAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGVsZW1lbnQgaW4gQ3JpdGVyaWFMaXN0KSB7DQorICAgICAgICAgIGRhdGFTaXplICs9IHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZU5vVGFnKGVsZW1lbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsNCisgICAgICAgIHNpemUgKz0gMSAqIGNyaXRlcmlhXy5Db3VudDsNCisgICAgICB9DQorICAgICAgaWYgKGhhc1ByZXZpb3VzUmVzdWx0cykgew0KKyAgICAgICAgc2l6ZSArPSBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKDIsIFByZXZpb3VzUmVzdWx0cyk7DQorICAgICAgfQ0KKyAgICAgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplOw0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorICAgICNyZWdpb24gTGl0ZSBydW50aW1lIG1ldGhvZHMNCisgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsNCisgICAgICBpbnQgaGFzaCA9IEdldFR5cGUoKS5HZXRIYXNoQ29kZSgpOw0KKyAgICAgIGZvcmVhY2goc3RyaW5nIGkgaW4gY3JpdGVyaWFfKQ0KKyAgICAgICAgaGFzaCBePSBpLkdldEhhc2hDb2RlKCk7DQorICAgICAgaWYgKGhhc1ByZXZpb3VzUmVzdWx0cykgaGFzaCBePSBwcmV2aW91c1Jlc3VsdHNfLkdldEhhc2hDb2RlKCk7DQorICAgICAgcmV0dXJuIGhhc2g7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKSB7DQorICAgICAgUmVmaW5lU2VhcmNoUmVxdWVzdCBvdGhlciA9IG9iaiBhcyBSZWZpbmVTZWFyY2hSZXF1ZXN0Ow0KKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7DQorICAgICAgaWYoY3JpdGVyaWFfLkNvdW50ICE9IG90aGVyLmNyaXRlcmlhXy5Db3VudCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZvcihpbnQgaXg9MDsgaXggPCBjcml0ZXJpYV8uQ291bnQ7IGl4KyspDQorICAgICAgICBpZighY3JpdGVyaWFfW2l4XS5FcXVhbHMob3RoZXIuY3JpdGVyaWFfW2l4XSkpIHJldHVybiBmYWxzZTsNCisgICAgICBpZiAoaGFzUHJldmlvdXNSZXN1bHRzICE9IG90aGVyLmhhc1ByZXZpb3VzUmVzdWx0cyB8fCAoaGFzUHJldmlvdXNSZXN1bHRzICYmICFwcmV2aW91c1Jlc3VsdHNfLkVxdWFscyhvdGhlci5wcmV2aW91c1Jlc3VsdHNfKSkpIHJldHVybiBmYWxzZTsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUHJpbnRUbyhnbG9iYWw6OlN5c3RlbS5JTy5UZXh0V3JpdGVyIHdyaXRlcikgew0KKyAgICAgIFByaW50RmllbGQoIkNyaXRlcmlhIiwgY3JpdGVyaWFfLCB3cml0ZXIpOw0KKyAgICAgIFByaW50RmllbGQoInByZXZpb3VzX3Jlc3VsdHMiLCBoYXNQcmV2aW91c1Jlc3VsdHMsIHByZXZpb3VzUmVzdWx0c18sIHdyaXRlcik7DQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBSZWZpbmVTZWFyY2hSZXF1ZXN0IFBhcnNlRnJvbShwYjo6Qnl0ZVN0cmluZyBkYXRhKSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShkYXRhKSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlZmluZVNlYXJjaFJlcXVlc3QgUGFyc2VGcm9tKHBiOjpCeXRlU3RyaW5nIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVmaW5lU2VhcmNoUmVxdWVzdCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGRhdGEpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVmaW5lU2VhcmNoUmVxdWVzdCBQYXJzZUZyb20oYnl0ZVtdIGRhdGEsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVmaW5lU2VhcmNoUmVxdWVzdCBQYXJzZUZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSZWZpbmVTZWFyY2hSZXF1ZXN0IFBhcnNlRnJvbShnbG9iYWw6OlN5c3RlbS5JTy5TdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgew0KKyAgICAgIHJldHVybiAoKEJ1aWxkZXIpIENyZWF0ZUJ1aWxkZXIoKS5NZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlZmluZVNlYXJjaFJlcXVlc3QgUGFyc2VEZWxpbWl0ZWRGcm9tKGdsb2JhbDo6U3lzdGVtLklPLlN0cmVhbSBpbnB1dCkgew0KKyAgICAgIHJldHVybiBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBzdGF0aWMgUmVmaW5lU2VhcmNoUmVxdWVzdCBQYXJzZURlbGltaXRlZEZyb20oZ2xvYmFsOjpTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBwYjo6RXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisgICAgICByZXR1cm4gQ3JlYXRlQnVpbGRlcigpLk1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLkJ1aWxkUGFyc2VkKCk7DQorICAgIH0NCisgICAgcHVibGljIHN0YXRpYyBSZWZpbmVTZWFyY2hSZXF1ZXN0IFBhcnNlRnJvbShwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsNCisgICAgICByZXR1cm4gKChCdWlsZGVyKSBDcmVhdGVCdWlsZGVyKCkuTWVyZ2VGcm9tKGlucHV0KSkuQnVpbGRQYXJzZWQoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgc3RhdGljIFJlZmluZVNlYXJjaFJlcXVlc3QgUGFyc2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgcmV0dXJuICgoQnVpbGRlcikgQ3JlYXRlQnVpbGRlcigpLk1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKS5CdWlsZFBhcnNlZCgpOw0KKyAgICB9DQorICAgIHByaXZhdGUgUmVmaW5lU2VhcmNoUmVxdWVzdCBNYWtlUmVhZE9ubHkoKSB7DQorICAgICAgY3JpdGVyaWFfLk1ha2VSZWFkT25seSgpOw0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgQ3JlYXRlQnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgVG9CdWlsZGVyKCkgeyByZXR1cm4gQ3JlYXRlQnVpbGRlcih0aGlzKTsgfQ0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBDcmVhdGVCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0NCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIENyZWF0ZUJ1aWxkZXIoUmVmaW5lU2VhcmNoUmVxdWVzdCBwcm90b3R5cGUpIHsNCisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlKTsNCisgICAgfQ0KKyAgICANCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ1aWxkZXIgOiBwYjo6R2VuZXJhdGVkQnVpbGRlckxpdGU8UmVmaW5lU2VhcmNoUmVxdWVzdCwgQnVpbGRlcj4gew0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBCdWlsZGVyIFRoaXNCdWlsZGVyIHsNCisgICAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGludGVybmFsIEJ1aWxkZXIoUmVmaW5lU2VhcmNoUmVxdWVzdCBjbG9uZUZyb20pIHsNCisgICAgICAgIHJlc3VsdCA9IGNsb25lRnJvbTsNCisgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwcml2YXRlIGJvb2wgcmVzdWx0SXNSZWFkT25seTsNCisgICAgICBwcml2YXRlIFJlZmluZVNlYXJjaFJlcXVlc3QgcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIHByaXZhdGUgUmVmaW5lU2VhcmNoUmVxdWVzdCBQcmVwYXJlQnVpbGRlcigpIHsNCisgICAgICAgIGlmIChyZXN1bHRJc1JlYWRPbmx5KSB7DQorICAgICAgICAgIFJlZmluZVNlYXJjaFJlcXVlc3Qgb3JpZ2luYWwgPSByZXN1bHQ7DQorICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZWZpbmVTZWFyY2hSZXF1ZXN0KCk7DQorICAgICAgICAgIHJlc3VsdElzUmVhZE9ubHkgPSBmYWxzZTsNCisgICAgICAgICAgTWVyZ2VGcm9tKG9yaWdpbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzSW5pdGlhbGl6ZWQgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5Jc0luaXRpYWxpemVkOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBSZWZpbmVTZWFyY2hSZXF1ZXN0IE1lc3NhZ2VCZWluZ0J1aWx0IHsNCisgICAgICAgIGdldCB7IHJldHVybiBQcmVwYXJlQnVpbGRlcigpOyB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBvdmVycmlkZSBCdWlsZGVyIENsZWFyKCkgew0KKyAgICAgICAgcmVzdWx0ID0gRGVmYXVsdEluc3RhbmNlOw0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgQ2xvbmUoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIocmVzdWx0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLk1lcmdlRnJvbShyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmVmaW5lU2VhcmNoUmVxdWVzdCBEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIHsNCisgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZWZpbmVTZWFyY2hSZXF1ZXN0LkRlZmF1bHRJbnN0YW5jZTsgfQ0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgUmVmaW5lU2VhcmNoUmVxdWVzdCBCdWlsZFBhcnRpYWwoKSB7DQorICAgICAgICBpZiAocmVzdWx0SXNSZWFkT25seSkgew0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0SXNSZWFkT25seSA9IHRydWU7DQorICAgICAgICByZXR1cm4gcmVzdWx0Lk1ha2VSZWFkT25seSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgb3ZlcnJpZGUgQnVpbGRlciBNZXJnZUZyb20ocGI6OklNZXNzYWdlTGl0ZSBvdGhlcikgew0KKyAgICAgICAgaWYgKG90aGVyIGlzIFJlZmluZVNlYXJjaFJlcXVlc3QpIHsNCisgICAgICAgICAgcmV0dXJuIE1lcmdlRnJvbSgoUmVmaW5lU2VhcmNoUmVxdWVzdCkgb3RoZXIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYmFzZS5NZXJnZUZyb20ob3RoZXIpOw0KKyAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKFJlZmluZVNlYXJjaFJlcXVlc3Qgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZWZpbmVTZWFyY2hSZXF1ZXN0LkRlZmF1bHRJbnN0YW5jZSkgcmV0dXJuIHRoaXM7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKG90aGVyLmNyaXRlcmlhXy5Db3VudCAhPSAwKSB7DQorICAgICAgICAgIHJlc3VsdC5jcml0ZXJpYV8uQWRkKG90aGVyLmNyaXRlcmlhXyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAob3RoZXIuSGFzUHJldmlvdXNSZXN1bHRzKSB7DQorICAgICAgICAgIE1lcmdlUHJldmlvdXNSZXN1bHRzKG90aGVyLlByZXZpb3VzUmVzdWx0cyk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgew0KKyAgICAgICAgcmV0dXJuIE1lcmdlRnJvbShpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5LkVtcHR5KTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIG92ZXJyaWRlIEJ1aWxkZXIgTWVyZ2VGcm9tKHBiOjpJQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgcGI6OkV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgdWludCB0YWc7DQorICAgICAgICBzdHJpbmcgZmllbGRfbmFtZTsNCisgICAgICAgIHdoaWxlIChpbnB1dC5SZWFkVGFnKG91dCB0YWcsIG91dCBmaWVsZF9uYW1lKSkgew0KKyAgICAgICAgICBpZih0YWcgPT0gMCAmJiBmaWVsZF9uYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBpbnQgZmllbGRfb3JkaW5hbCA9IGdsb2JhbDo6U3lzdGVtLkFycmF5LkJpbmFyeVNlYXJjaChfcmVmaW5lU2VhcmNoUmVxdWVzdEZpZWxkTmFtZXMsIGZpZWxkX25hbWUsIGdsb2JhbDo6U3lzdGVtLlN0cmluZ0NvbXBhcmVyLk9yZGluYWwpOw0KKyAgICAgICAgICAgIGlmKGZpZWxkX29yZGluYWwgPj0gMCkNCisgICAgICAgICAgICAgIHRhZyA9IF9yZWZpbmVTZWFyY2hSZXF1ZXN0RmllbGRUYWdzW2ZpZWxkX29yZGluYWxdOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgUGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcsIGZpZWxkX25hbWUpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgICB0aHJvdyBwYjo6SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgaWYgKHBiOjpXaXJlRm9ybWF0LklzRW5kR3JvdXBUYWcodGFnKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIFBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgdGFnLCBmaWVsZF9uYW1lKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICBpbnB1dC5SZWFkU3RyaW5nQXJyYXkodGFnLCBmaWVsZF9uYW1lLCByZXN1bHQuY3JpdGVyaWFfKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDE4OiB7DQorICAgICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5DcmVhdGVCdWlsZGVyKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc1ByZXZpb3VzUmVzdWx0cykgew0KKyAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShQcmV2aW91c1Jlc3VsdHMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOw0KKyAgICAgICAgICAgICAgUHJldmlvdXNSZXN1bHRzID0gc3ViQnVpbGRlci5CdWlsZFBhcnRpYWwoKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgDQorICAgICAgDQorICAgICAgcHVibGljIHBiYzo6SVBvcHNpY2xlTGlzdDxzdHJpbmc+IENyaXRlcmlhTGlzdCB7DQorICAgICAgICBnZXQgeyByZXR1cm4gUHJlcGFyZUJ1aWxkZXIoKS5jcml0ZXJpYV87IH0NCisgICAgICB9DQorICAgICAgcHVibGljIGludCBDcml0ZXJpYUNvdW50IHsNCisgICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuQ3JpdGVyaWFDb3VudDsgfQ0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgc3RyaW5nIEdldENyaXRlcmlhKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRDcml0ZXJpYShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIFNldENyaXRlcmlhKGludCBpbmRleCwgc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5jcml0ZXJpYV9baW5kZXhdID0gdmFsdWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQWRkQ3JpdGVyaWEoc3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5jcml0ZXJpYV8uQWRkKHZhbHVlKTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBBZGRSYW5nZUNyaXRlcmlhKHNjZzo6SUVudW1lcmFibGU8c3RyaW5nPiB2YWx1ZXMpIHsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuY3JpdGVyaWFfLkFkZCh2YWx1ZXMpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIENsZWFyQ3JpdGVyaWEoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0LmNyaXRlcmlhXy5DbGVhcigpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyBib29sIEhhc1ByZXZpb3VzUmVzdWx0cyB7DQorICAgICAgIGdldCB7IHJldHVybiByZXN1bHQuaGFzUHJldmlvdXNSZXN1bHRzOyB9DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZSBQcmV2aW91c1Jlc3VsdHMgew0KKyAgICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdC5QcmV2aW91c1Jlc3VsdHM7IH0NCisgICAgICAgIHNldCB7IFNldFByZXZpb3VzUmVzdWx0cyh2YWx1ZSk7IH0NCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgU2V0UHJldmlvdXNSZXN1bHRzKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlIHZhbHVlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodmFsdWUsICJ2YWx1ZSIpOw0KKyAgICAgICAgUHJlcGFyZUJ1aWxkZXIoKTsNCisgICAgICAgIHJlc3VsdC5oYXNQcmV2aW91c1Jlc3VsdHMgPSB0cnVlOw0KKyAgICAgICAgcmVzdWx0LnByZXZpb3VzUmVzdWx0c18gPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgQnVpbGRlciBTZXRQcmV2aW91c1Jlc3VsdHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbChidWlsZGVyRm9yVmFsdWUsICJidWlsZGVyRm9yVmFsdWUiKTsNCisgICAgICAgIFByZXBhcmVCdWlsZGVyKCk7DQorICAgICAgICByZXN1bHQuaGFzUHJldmlvdXNSZXN1bHRzID0gdHJ1ZTsNCisgICAgICAgIHJlc3VsdC5wcmV2aW91c1Jlc3VsdHNfID0gYnVpbGRlckZvclZhbHVlLkJ1aWxkKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgTWVyZ2VQcmV2aW91c1Jlc3VsdHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UgdmFsdWUpIHsNCisgICAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh2YWx1ZSwgInZhbHVlIik7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgaWYgKHJlc3VsdC5oYXNQcmV2aW91c1Jlc3VsdHMgJiYNCisgICAgICAgICAgICByZXN1bHQucHJldmlvdXNSZXN1bHRzXyAhPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5EZWZhdWx0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICByZXN1bHQucHJldmlvdXNSZXN1bHRzXyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLkNyZWF0ZUJ1aWxkZXIocmVzdWx0LnByZXZpb3VzUmVzdWx0c18pLk1lcmdlRnJvbSh2YWx1ZSkuQnVpbGRQYXJ0aWFsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQucHJldmlvdXNSZXN1bHRzXyA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0Lmhhc1ByZXZpb3VzUmVzdWx0cyA9IHRydWU7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgICB9DQorICAgICAgcHVibGljIEJ1aWxkZXIgQ2xlYXJQcmV2aW91c1Jlc3VsdHMoKSB7DQorICAgICAgICBQcmVwYXJlQnVpbGRlcigpOw0KKyAgICAgICAgcmVzdWx0Lmhhc1ByZXZpb3VzUmVzdWx0cyA9IGZhbHNlOw0KKyAgICAgICAgcmVzdWx0LnByZXZpb3VzUmVzdWx0c18gPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXRpYyBSZWZpbmVTZWFyY2hSZXF1ZXN0KCkgew0KKyAgICAgIG9iamVjdC5SZWZlcmVuY2VFcXVhbHMoZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuVW5pdFRlc3RScGNJbnRlcm9wTGl0ZS5EZXNjcmlwdG9yLCBudWxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICAjZW5kcmVnaW9uDQorICANCisgICNyZWdpb24gU2VydmljZXMNCisgIHB1YmxpYyBwYXJ0aWFsIGludGVyZmFjZSBJU2VhcmNoU2VydmljZSB7DQorICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlIFNlYXJjaChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpOw0KKyAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZSBSZWZpbmVTZWFyY2goZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVmaW5lU2VhcmNoUmVxdWVzdCByZWZpbmVTZWFyY2hSZXF1ZXN0KTsNCisgIH0NCisgIA0KKyAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQ0KKyAgcHVibGljIHBhcnRpYWwgY2xhc3MgU2VhcmNoU2VydmljZSA6IElTZWFyY2hTZXJ2aWNlLCBwYjo6SVJwY0Rpc3BhdGNoLCBnbG9iYWw6OlN5c3RlbS5JRGlzcG9zYWJsZSB7DQorICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBkaXNwb3NlOw0KKyAgICBwcml2YXRlIHJlYWRvbmx5IHBiOjpJUnBjRGlzcGF0Y2ggZGlzcGF0Y2g7DQorICAgIHB1YmxpYyBTZWFyY2hTZXJ2aWNlKHBiOjpJUnBjRGlzcGF0Y2ggZGlzcGF0Y2gpIDogdGhpcyhkaXNwYXRjaCwgdHJ1ZSkgew0KKyAgICB9DQorICAgIHB1YmxpYyBTZWFyY2hTZXJ2aWNlKHBiOjpJUnBjRGlzcGF0Y2ggZGlzcGF0Y2gsIGJvb2wgZGlzcG9zZSkgew0KKyAgICAgIHBiOjpUaHJvd0hlbHBlci5UaHJvd0lmTnVsbCh0aGlzLmRpc3BhdGNoID0gZGlzcGF0Y2gsICJkaXNwYXRjaCIpOw0KKyAgICAgIHRoaXMuZGlzcG9zZSA9IGRpc3Bvc2UgJiYgZGlzcGF0Y2ggaXMgZ2xvYmFsOjpTeXN0ZW0uSURpc3Bvc2FibGU7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKSB7DQorICAgICAgaWYgKGRpc3Bvc2UpICgoZ2xvYmFsOjpTeXN0ZW0uSURpc3Bvc2FibGUpZGlzcGF0Y2gpLkRpc3Bvc2UoKTsNCisgICAgfQ0KKyAgICANCisgICAgVE1lc3NhZ2UgcGI6OklScGNEaXNwYXRjaC5DYWxsTWV0aG9kPFRNZXNzYWdlLCBUQnVpbGRlcj4oc3RyaW5nIG1ldGhvZCwgcGI6OklNZXNzYWdlTGl0ZSByZXF1ZXN0LCBwYjo6SUJ1aWxkZXJMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gcmVzcG9uc2UpIHsNCisgICAgICByZXR1cm4gZGlzcGF0Y2guQ2FsbE1ldGhvZChtZXRob2QsIHJlcXVlc3QsIHJlc3BvbnNlKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlIFNlYXJjaChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpIHsNCisgICAgICAgcmV0dXJuIGRpc3BhdGNoLkNhbGxNZXRob2QoIlNlYXJjaCIsIHNlYXJjaFJlcXVlc3QsIGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlc3BvbnNlLkNyZWF0ZUJ1aWxkZXIoKSk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZSBSZWZpbmVTZWFyY2goZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVmaW5lU2VhcmNoUmVxdWVzdCByZWZpbmVTZWFyY2hSZXF1ZXN0KSB7DQorICAgICAgIHJldHVybiBkaXNwYXRjaC5DYWxsTWV0aG9kKCJSZWZpbmVTZWFyY2giLCByZWZpbmVTZWFyY2hSZXF1ZXN0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5TZWFyY2hSZXNwb25zZS5DcmVhdGVCdWlsZGVyKCkpOw0KKyAgICB9DQorICAgIA0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ0xTQ29tcGxpYW50KGZhbHNlKV0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0NCisgICAgcHVibGljIHBhcnRpYWwgY2xhc3MgRGlzcGF0Y2ggOiBwYjo6SVJwY0Rpc3BhdGNoLCBnbG9iYWw6OlN5c3RlbS5JRGlzcG9zYWJsZSB7DQorICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIGRpc3Bvc2U7DQorICAgICAgcHJpdmF0ZSByZWFkb25seSBJU2VhcmNoU2VydmljZSBpbXBsZW1lbnRhdGlvbjsNCisgICAgICBwdWJsaWMgRGlzcGF0Y2goSVNlYXJjaFNlcnZpY2UgaW1wbGVtZW50YXRpb24pIDogdGhpcyhpbXBsZW1lbnRhdGlvbiwgdHJ1ZSkgew0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgRGlzcGF0Y2goSVNlYXJjaFNlcnZpY2UgaW1wbGVtZW50YXRpb24sIGJvb2wgZGlzcG9zZSkgew0KKyAgICAgICAgcGI6OlRocm93SGVscGVyLlRocm93SWZOdWxsKHRoaXMuaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvbiwgImltcGxlbWVudGF0aW9uIik7DQorICAgICAgICB0aGlzLmRpc3Bvc2UgPSBkaXNwb3NlICYmIGltcGxlbWVudGF0aW9uIGlzIGdsb2JhbDo6U3lzdGVtLklEaXNwb3NhYmxlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkgew0KKyAgICAgICAgaWYgKGRpc3Bvc2UpICgoZ2xvYmFsOjpTeXN0ZW0uSURpc3Bvc2FibGUpaW1wbGVtZW50YXRpb24pLkRpc3Bvc2UoKTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcHVibGljIFRNZXNzYWdlIENhbGxNZXRob2Q8VE1lc3NhZ2UsIFRCdWlsZGVyPihzdHJpbmcgbWV0aG9kTmFtZSwgcGI6OklNZXNzYWdlTGl0ZSByZXF1ZXN0LCBwYjo6SUJ1aWxkZXJMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gcmVzcG9uc2UpDQorICAgICAgICB3aGVyZSBUTWVzc2FnZSA6IHBiOjpJTWVzc2FnZUxpdGU8VE1lc3NhZ2UsIFRCdWlsZGVyPg0KKyAgICAgICAgd2hlcmUgVEJ1aWxkZXIgOiBwYjo6SUJ1aWxkZXJMaXRlPFRNZXNzYWdlLCBUQnVpbGRlcj4gew0KKyAgICAgICAgc3dpdGNoKG1ldGhvZE5hbWUpIHsNCisgICAgICAgICAgY2FzZSAiU2VhcmNoIjogcmV0dXJuIHJlc3BvbnNlLk1lcmdlRnJvbShpbXBsZW1lbnRhdGlvbi5TZWFyY2goKGdsb2JhbDo6R29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zLlNlYXJjaFJlcXVlc3QpcmVxdWVzdCkpLkJ1aWxkKCk7DQorICAgICAgICAgIGNhc2UgIlJlZmluZVNlYXJjaCI6IHJldHVybiByZXNwb25zZS5NZXJnZUZyb20oaW1wbGVtZW50YXRpb24uUmVmaW5lU2VhcmNoKChnbG9iYWw6Okdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcy5SZWZpbmVTZWFyY2hSZXF1ZXN0KXJlcXVlc3QpKS5CdWlsZCgpOw0KKyAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBwYjo6VGhyb3dIZWxwZXIuQ3JlYXRlTWlzc2luZ01ldGhvZCh0eXBlb2YoSVNlYXJjaFNlcnZpY2UpLCBtZXRob2ROYW1lKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgW2dsb2JhbDo6U3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldDQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldDQorICAgIHB1YmxpYyBwYXJ0aWFsIGNsYXNzIFNlcnZlclN0dWIgOiBwYjo6SVJwY1NlcnZlclN0dWIsIGdsb2JhbDo6U3lzdGVtLklEaXNwb3NhYmxlIHsNCisgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgZGlzcG9zZTsNCisgICAgICBwcml2YXRlIHJlYWRvbmx5IHBiOjpJUnBjRGlzcGF0Y2ggaW1wbGVtZW50YXRpb247DQorICAgICAgcHVibGljIFNlcnZlclN0dWIoSVNlYXJjaFNlcnZpY2UgaW1wbGVtZW50YXRpb24pIDogdGhpcyhpbXBsZW1lbnRhdGlvbiwgdHJ1ZSkgew0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgU2VydmVyU3R1YihJU2VhcmNoU2VydmljZSBpbXBsZW1lbnRhdGlvbiwgYm9vbCBkaXNwb3NlKSA6IHRoaXMobmV3IERpc3BhdGNoKGltcGxlbWVudGF0aW9uLCBkaXNwb3NlKSwgZGlzcG9zZSkgew0KKyAgICAgIH0NCisgICAgICBwdWJsaWMgU2VydmVyU3R1YihwYjo6SVJwY0Rpc3BhdGNoIGltcGxlbWVudGF0aW9uKSA6IHRoaXMoaW1wbGVtZW50YXRpb24sIHRydWUpIHsNCisgICAgICB9DQorICAgICAgcHVibGljIFNlcnZlclN0dWIocGI6OklScGNEaXNwYXRjaCBpbXBsZW1lbnRhdGlvbiwgYm9vbCBkaXNwb3NlKSB7DQorICAgICAgICBwYjo6VGhyb3dIZWxwZXIuVGhyb3dJZk51bGwodGhpcy5pbXBsZW1lbnRhdGlvbiA9IGltcGxlbWVudGF0aW9uLCAiaW1wbGVtZW50YXRpb24iKTsNCisgICAgICAgIHRoaXMuZGlzcG9zZSA9IGRpc3Bvc2UgJiYgaW1wbGVtZW50YXRpb24gaXMgZ2xvYmFsOjpTeXN0ZW0uSURpc3Bvc2FibGU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKSB7DQorICAgICAgICBpZiAoZGlzcG9zZSkgKChnbG9iYWw6OlN5c3RlbS5JRGlzcG9zYWJsZSlpbXBsZW1lbnRhdGlvbikuRGlzcG9zZSgpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBwdWJsaWMgcGI6OklNZXNzYWdlTGl0ZSBDYWxsTWV0aG9kKHN0cmluZyBtZXRob2ROYW1lLCBwYjo6SUNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIHBiOjpFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgew0KKyAgICAgICAgc3dpdGNoKG1ldGhvZE5hbWUpIHsNCisgICAgICAgICAgY2FzZSAiU2VhcmNoIjogcmV0dXJuIGltcGxlbWVudGF0aW9uLkNhbGxNZXRob2QobWV0aG9kTmFtZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVxdWVzdC5QYXJzZUZyb20oaW5wdXQsIHJlZ2lzdHJ5KSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuQ3JlYXRlQnVpbGRlcigpKTsNCisgICAgICAgICAgY2FzZSAiUmVmaW5lU2VhcmNoIjogcmV0dXJuIGltcGxlbWVudGF0aW9uLkNhbGxNZXRob2QobWV0aG9kTmFtZSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuUmVmaW5lU2VhcmNoUmVxdWVzdC5QYXJzZUZyb20oaW5wdXQsIHJlZ2lzdHJ5KSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MuU2VhcmNoUmVzcG9uc2UuQ3JlYXRlQnVpbGRlcigpKTsNCisgICAgICAgICAgZGVmYXVsdDogdGhyb3cgcGI6OlRocm93SGVscGVyLkNyZWF0ZU1pc3NpbmdNZXRob2QodHlwZW9mKElTZWFyY2hTZXJ2aWNlKSwgbWV0aG9kTmFtZSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICAjZW5kcmVnaW9uDQorICANCit9DQorDQorI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQ0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Rlc3RVdGlsLmNzIGIvY3NoYXJwL3NyYy9Qcm90b2NvbEJ1ZmZlcnNMaXRlLlRlc3QvVGVzdFV0aWwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRjMDliOQotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvUHJvdG9jb2xCdWZmZXJzTGl0ZS5UZXN0L1Rlc3RVdGlsLmNzCkBAIC0wLDAgKzEsMzEgQEAKK++7v3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCit1c2luZyBTeXN0ZW0uVGV4dDsNCit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsNCisNCituYW1lc3BhY2UgR29vZ2xlLlByb3RvY29sQnVmZmVycw0KK3sNCisgICAgY2xhc3MgVGVzdFV0aWwNCisgICAgew0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgQXNzZXJ0Qnl0ZXNFcXVhbChieXRlW10gYSwgYnl0ZVtdIGIpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWw8b2JqZWN0PihhLCBiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGEuTGVuZ3RoLCBiLkxlbmd0aCwgIlRoZSBieXRlW10gaXMgbm90IG9mIHRoZSBleHBlY3RlZCBsZW5ndGguIik7DQorDQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5MZW5ndGg7IGkrKykNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFbaV0gIT0gYltpXSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYVtpXSwgYltpXSwgIkJ5dGVbXSBkaWZmZXJzIGF0IGluZGV4ICIgKyBpKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9jc2hhcnAvc3JjL1VzZVZTMjAwOC5iYXQgYi9jc2hhcnAvc3JjL1VzZVZTMjAwOC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmOTczOAotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC9zcmMvVXNlVlMyMDA4LmJhdApAQCAtMCwwICsxLDggQEAKK0BFQ0hPIE9GRg0KK1JFTSAtLS0tIENvbnZlcnRzIHRoZSBzb2x1dGlvbiB0byBWaXN1YWwgU3R1ZGlvIDIwMDggLS0tLQ0KK1BVU0hEICV+ZHAwDQorRUNITyBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMC4wMD4gVGVtcC5zbG4NCitFQ0hPICMgVmlzdWFsIFN0dWRpbyAyMDA4Pj4gVGVtcC5zbG4NCit0eXBlIFByb3RvY29sQnVmZmVycy5zbG4gfCBGSU5EIC9WICIgVmlzdWFsIFN0dWRpbyAiID4+IFRlbXAuc2xuDQorbW92ZSAvWSBUZW1wLnNsbiBQcm90b2NvbEJ1ZmZlcnMuc2xuDQorUE9QRA0KZGlmZiAtLWdpdCBhL2NzaGFycC9zcmMvVXNlVlMyMDEwLmJhdCBiL2NzaGFycC9zcmMvVXNlVlMyMDEwLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzZhMDhmCi0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3NyYy9Vc2VWUzIwMTAuYmF0CkBAIC0wLDAgKzEsOCBAQAorQEVDSE8gT0ZGDQorUkVNIC0tLS0gQ29udmVydHMgdGhlIHNvbHV0aW9uIHRvIFZpc3VhbCBTdHVkaW8gMjAxMCAtLS0tDQorUFVTSEQgJX5kcDANCitFQ0hPIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwPiBUZW1wLnNsbg0KK0VDSE8gIyBWaXN1YWwgU3R1ZGlvIDIwMTA+PiBUZW1wLnNsbg0KK3R5cGUgUHJvdG9jb2xCdWZmZXJzLnNsbiB8IEZJTkQgL1YgIiBWaXN1YWwgU3R1ZGlvICIgPj4gVGVtcC5zbG4NCittb3ZlIC9ZIFRlbXAuc2xuIFByb3RvY29sQnVmZmVycy5zbG4NCitQT1BEDQpkaWZmIC0tZ2l0IGEvY3NoYXJwL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlIGIvY3NoYXJwL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ODk4ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL3Rlc3RkYXRhL2dvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UgYi9jc2hhcnAvdGVzdGRhdGEvZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTI4ZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvY3NoYXJwL3Rlc3RkYXRhL2dvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY3NoYXJwL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGEudHh0IGIvY3NoYXJwL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZTI3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9jc2hhcnAvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQKQEAgLTAsMCArMSwxMTYgQEAKK29wdGlvbmFsX2ludDMyOiAxMDENCitvcHRpb25hbF9pbnQ2NDogMTAyDQorb3B0aW9uYWxfdWludDMyOiAxMDMNCitvcHRpb25hbF91aW50NjQ6IDEwNA0KK29wdGlvbmFsX3NpbnQzMjogMTA1DQorb3B0aW9uYWxfc2ludDY0OiAxMDYNCitvcHRpb25hbF9maXhlZDMyOiAxMDcNCitvcHRpb25hbF9maXhlZDY0OiAxMDgNCitvcHRpb25hbF9zZml4ZWQzMjogMTA5DQorb3B0aW9uYWxfc2ZpeGVkNjQ6IDExMA0KK29wdGlvbmFsX2Zsb2F0OiAxMTENCitvcHRpb25hbF9kb3VibGU6IDExMg0KK29wdGlvbmFsX2Jvb2w6IHRydWUNCitvcHRpb25hbF9zdHJpbmc6ICIxMTUiDQorb3B0aW9uYWxfYnl0ZXM6ICIxMTYiDQorT3B0aW9uYWxHcm91cCB7DQorICBhOiAxMTcNCit9DQorb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Ugew0KKyAgYmI6IDExOA0KK30NCitvcHRpb25hbF9mb3JlaWduX21lc3NhZ2Ugew0KKyAgYzogMTE5DQorfQ0KK29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIHsNCisgIGQ6IDEyMA0KK30NCitvcHRpb25hbF9uZXN0ZWRfZW51bTogQkFaDQorb3B0aW9uYWxfZm9yZWlnbl9lbnVtOiBGT1JFSUdOX0JBWg0KK29wdGlvbmFsX2ltcG9ydF9lbnVtOiBJTVBPUlRfQkFaDQorb3B0aW9uYWxfc3RyaW5nX3BpZWNlOiAiMTI0Ig0KK29wdGlvbmFsX2NvcmQ6ICIxMjUiDQorcmVwZWF0ZWRfaW50MzI6IDIwMQ0KK3JlcGVhdGVkX2ludDMyOiAzMDENCityZXBlYXRlZF9pbnQ2NDogMjAyDQorcmVwZWF0ZWRfaW50NjQ6IDMwMg0KK3JlcGVhdGVkX3VpbnQzMjogMjAzDQorcmVwZWF0ZWRfdWludDMyOiAzMDMNCityZXBlYXRlZF91aW50NjQ6IDIwNA0KK3JlcGVhdGVkX3VpbnQ2NDogMzA0DQorcmVwZWF0ZWRfc2ludDMyOiAyMDUNCityZXBlYXRlZF9zaW50MzI6IDMwNQ0KK3JlcGVhdGVkX3NpbnQ2NDogMjA2DQorcmVwZWF0ZWRfc2ludDY0OiAzMDYNCityZXBlYXRlZF9maXhlZDMyOiAyMDcNCityZXBlYXRlZF9maXhlZDMyOiAzMDcNCityZXBlYXRlZF9maXhlZDY0OiAyMDgNCityZXBlYXRlZF9maXhlZDY0OiAzMDgNCityZXBlYXRlZF9zZml4ZWQzMjogMjA5DQorcmVwZWF0ZWRfc2ZpeGVkMzI6IDMwOQ0KK3JlcGVhdGVkX3NmaXhlZDY0OiAyMTANCityZXBlYXRlZF9zZml4ZWQ2NDogMzEwDQorcmVwZWF0ZWRfZmxvYXQ6IDIxMQ0KK3JlcGVhdGVkX2Zsb2F0OiAzMTENCityZXBlYXRlZF9kb3VibGU6IDIxMg0KK3JlcGVhdGVkX2RvdWJsZTogMzEyDQorcmVwZWF0ZWRfYm9vbDogdHJ1ZQ0KK3JlcGVhdGVkX2Jvb2w6IGZhbHNlDQorcmVwZWF0ZWRfc3RyaW5nOiAiMjE1Ig0KK3JlcGVhdGVkX3N0cmluZzogIjMxNSINCityZXBlYXRlZF9ieXRlczogIjIxNiINCityZXBlYXRlZF9ieXRlczogIjMxNiINCitSZXBlYXRlZEdyb3VwIHsNCisgIGE6IDIxNw0KK30NCitSZXBlYXRlZEdyb3VwIHsNCisgIGE6IDMxNw0KK30NCityZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7DQorICBiYjogMjE4DQorfQ0KK3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsNCisgIGJiOiAzMTgNCit9DQorcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIHsNCisgIGM6IDIxOQ0KK30NCityZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Ugew0KKyAgYzogMzE5DQorfQ0KK3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIHsNCisgIGQ6IDIyMA0KK30NCityZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSB7DQorICBkOiAzMjANCit9DQorcmVwZWF0ZWRfbmVzdGVkX2VudW06IEJBUg0KK3JlcGVhdGVkX25lc3RlZF9lbnVtOiBCQVoNCityZXBlYXRlZF9mb3JlaWduX2VudW06IEZPUkVJR05fQkFSDQorcmVwZWF0ZWRfZm9yZWlnbl9lbnVtOiBGT1JFSUdOX0JBWg0KK3JlcGVhdGVkX2ltcG9ydF9lbnVtOiBJTVBPUlRfQkFSDQorcmVwZWF0ZWRfaW1wb3J0X2VudW06IElNUE9SVF9CQVoNCityZXBlYXRlZF9zdHJpbmdfcGllY2U6ICIyMjQiDQorcmVwZWF0ZWRfc3RyaW5nX3BpZWNlOiAiMzI0Ig0KK3JlcGVhdGVkX2NvcmQ6ICIyMjUiDQorcmVwZWF0ZWRfY29yZDogIjMyNSINCitkZWZhdWx0X2ludDMyOiA0MDENCitkZWZhdWx0X2ludDY0OiA0MDINCitkZWZhdWx0X3VpbnQzMjogNDAzDQorZGVmYXVsdF91aW50NjQ6IDQwNA0KK2RlZmF1bHRfc2ludDMyOiA0MDUNCitkZWZhdWx0X3NpbnQ2NDogNDA2DQorZGVmYXVsdF9maXhlZDMyOiA0MDcNCitkZWZhdWx0X2ZpeGVkNjQ6IDQwOA0KK2RlZmF1bHRfc2ZpeGVkMzI6IDQwOQ0KK2RlZmF1bHRfc2ZpeGVkNjQ6IDQxMA0KK2RlZmF1bHRfZmxvYXQ6IDQxMQ0KK2RlZmF1bHRfZG91YmxlOiA0MTINCitkZWZhdWx0X2Jvb2w6IGZhbHNlDQorZGVmYXVsdF9zdHJpbmc6ICI0MTUiDQorZGVmYXVsdF9ieXRlczogIjQxNiINCitkZWZhdWx0X25lc3RlZF9lbnVtOiBGT08NCitkZWZhdWx0X2ZvcmVpZ25fZW51bTogRk9SRUlHTl9GT08NCitkZWZhdWx0X2ltcG9ydF9lbnVtOiBJTVBPUlRfRk9PDQorZGVmYXVsdF9zdHJpbmdfcGllY2U6ICI0MjQiDQorZGVmYXVsdF9jb3JkOiAiNDI1Ig0KZGlmZiAtLWdpdCBhL2NzaGFycC90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGEudHh0IGIvY3NoYXJwL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZjMjgyYwotLS0gL2Rldi9udWxsCisrKyBiL2NzaGFycC90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGEudHh0CkBAIC0wLDAgKzEsMTE2IEBACitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXTogMTAxDQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbl06IDEwMg0KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uXTogMTAzDQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb25dOiAxMDQNCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl06IDEwNQ0KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uXTogMTA2DQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uXTogMTA3DQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uXTogMTA4DQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbl06IDEwOQ0KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb25dOiAxMTANCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uXTogMTExDQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb25dOiAxMTINCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfYm9vbF9leHRlbnNpb25dOiB0cnVlDQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25dOiAiMTE1Ig0KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9ieXRlc19leHRlbnNpb25dOiAiMTE2Ig0KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbGdyb3VwX2V4dGVuc2lvbl0gew0KKyAgYTogMTE3DQorfQ0KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dIHsNCisgIGJiOiAxMTgNCit9DQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25dIHsNCisgIGM6IDExOQ0KK30NCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uXSB7DQorICBkOiAxMjANCit9DQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl06IEJBWg0KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uXTogRk9SRUlHTl9CQVoNCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXTogSU1QT1JUX0JBWg0KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXTogIjEyNCINCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfY29yZF9leHRlbnNpb25dOiAiMTI1Ig0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dOiAyMDENCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXTogMzAxDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl06IDIwMg0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25dOiAzMDINCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl06IDIwMw0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uXTogMzAzDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25dOiAyMDQNCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl06IDMwNA0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uXTogMjA1DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25dOiAzMDUNCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl06IDIwNg0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uXTogMzA2DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXTogMjA3DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXTogMzA3DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uXTogMjA4DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uXTogMzA4DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl06IDIwOQ0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25dOiAzMDkNCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uXTogMjEwDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl06IDMxMA0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mbG9hdF9leHRlbnNpb25dOiAyMTENCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uXTogMzExDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25dOiAyMTINCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl06IDMxMg0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9ib29sX2V4dGVuc2lvbl06IHRydWUNCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfYm9vbF9leHRlbnNpb25dOiBmYWxzZQ0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uXTogIjIxNSINCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl06ICIzMTUiDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl06ICIyMTYiDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl06ICIzMTYiDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uXSB7DQorICBhOiAyMTcNCit9DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uXSB7DQorICBhOiAzMTcNCit9DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0gew0KKyAgYmI6IDIxOA0KK30NCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXSB7DQorICBiYjogMzE4DQorfQ0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uXSB7DQorICBjOiAyMTkNCit9DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25dIHsNCisgIGM6IDMxOQ0KK30NCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uXSB7DQorICBkOiAyMjANCit9DQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0gew0KKyAgZDogMzIwDQorfQ0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25dOiBCQVINCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXTogQkFaDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25dOiBGT1JFSUdOX0JBUg0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uXTogRk9SRUlHTl9CQVoNCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXTogSU1QT1JUX0JBUg0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25dOiBJTVBPUlRfQkFaDQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb25dOiAiMjI0Ig0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXTogIjMyNCINCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfY29yZF9leHRlbnNpb25dOiAiMjI1Ig0KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9jb3JkX2V4dGVuc2lvbl06ICIzMjUiDQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uXTogNDAxDQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uXTogNDAyDQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl06IDQwMw0KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3VpbnQ2NF9leHRlbnNpb25dOiA0MDQNCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uXTogNDA1DQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbl06IDQwNg0KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uXTogNDA3DQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25dOiA0MDgNCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb25dOiA0MDkNCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25dOiA0MTANCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9mbG9hdF9leHRlbnNpb25dOiA0MTENCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uXTogNDEyDQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfYm9vbF9leHRlbnNpb25dOiBmYWxzZQ0KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3N0cmluZ19leHRlbnNpb25dOiAiNDE1Ig0KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2J5dGVzX2V4dGVuc2lvbl06ICI0MTYiDQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXTogRk9PDQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl06IEZPUkVJR05fRk9PDQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXTogSU1QT1JUX0ZPTw0KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb25dOiAiNDI0Ig0KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2NvcmRfZXh0ZW5zaW9uXTogIjQyNSINCg==